Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-24 01:06 UTC

Protagonistss / fnva

Management environment Java、Maven、Claude Code

RustMIT★ 3 Sterne⑂ 0 Forksseit Nov. 2021Auf GitHub ansehen ↗

Protagonistss/fnva erreicht einen Gesundheitsindex von 59 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (80/100) ab, am schwächsten bei Community & Adoption (37/100). Zuletzt vor 5 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

59
gesamt / 100
Mittel

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

59
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

huangshanPersönliches Konto
10 Follower30 öffentliche Reposseit Mai 2018shinewing

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlichtTags
crates.iofnva0.0.9018055vor 5 Tagenenvironmentclijavaversion-managerllmcommand-line-utilitiesdevelopment-tools
npmfnva0.0.903.83389vor 5 Tagenenvironmentjavallmclitoolfnva

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

80Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 5 Tagen
9/36Commit-Rhythmus — 13/52 Wochen mit Commits
18/18Commit-Volumen — 327 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year327
human_commit_share0,99
days_since_last_push5
active_weeks_last_year13
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 86 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 5 Tagen
27/27Release-Rhythmus — ein Release etwa alle 1,9 Tage
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Verwendete Eingangsdaten
releases_count86
latest_release_tagv0.0.90
releases_from_tagsnein
days_since_latest_release5
mean_days_between_releases1,9

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

37Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
4.9/60Stars — 3 Stars
0/25Forks — 0 Forks
0/15Watcher — 1 Watcher
Verwendete Eingangsdaten
forks0
stars3
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
6.3/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templateja
Wie die Bewertung erfolgt
48/80Downloads pro Monat — 4.013 Downloads/Monat über crates, npm
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packagesfnva, fnva
dependents
ecosystemscrates, npm
total_downloads1.029
monthly_downloads4.013
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Abhängige in der Registry. Die verbleibenden Gewichte wurden renormalisiert.

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

56Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
1.4/13.5Breite der Beitragenden — 1 Beitragende
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
46.8/46.8Issue-Lösungsquote — 100 % der Issues geschlossen
32.6/38.3PR-Annahme — 23/27 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/6 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs23
open_issues0
closed_issues2
issue_closed_ratio1
closed_unmerged_prs4
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
7.5/25Reichweite des Inhabers — 10 Follower von Protagonistss
22.9/25Kontohistorie — 30 öffentliche Repos, Kontoalter ca. 8 Jahre
Verwendete Eingangsdaten
followers10
owner_typeUser
is_verified
owner_loginProtagonistss
public_repos30
account_age_days2.976
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 2 Paket(e) auf crates, npm
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 5 Tagen
20/20Versionshistorie — 89 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesfnva, fnva
ecosystemscrates, npm
any_deprecatednein
min_days_since_publish5

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

72Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 3 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
16/20OpenSSF Scorecard: CI-Tests — 5 out of 6 merged PRs checked by a CI test -- score normalized to 8
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein

Dokumentation

85Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
10/10Topics — 4 Topics
10/10Wiki
Verwendete Eingangsdaten
topicscc, env, java, maven
has_wikija
homepage
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

41Gefährdet · 16 % des Gesamtindex

Sicherheitslage

41Gefährdet
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2/2.5CI-Tests — 5 out of 6 merged PRs checked by a CI test -- score normalized to 8
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/6 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
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
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate4,1

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

74Gut · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — AGENTS.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 82 von 99 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,828
agent_instruction_filesAGENTS.md
agent_instruction_max_bytes5.768
Wie die Bewertung erfolgt
12.6/18Bootstrap mit einem Befehl — Cargo.toml (Toolchain-Konvention, kein Task-Runner)
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — Rust (statisch typisiert)
10/10Reproduzierbare Umgebung — lockfile
0/10Belegte Agentenpraxis — keine von Agenten verfassten Commits unter den letzten 100
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
1/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilespackage-lock.json
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configs
agent_commit_share0
toolchain_manifestsCargo.toml
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Rust (statisch typisiert)
55/55Handhabbare Dateigrößen — 0/75 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageRust
largest_source_bytes29.051
source_files_sampled75
oversized_source_files0

Eckdaten

3GitHub-Sterne
1Mitwirkende
327Commits, letzte 12 Monate
5Tage seit letztem Push
86Releases
1Bus-Faktor
0offene Issues
crates.io, npmPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Weitere Details

OpenSSF Scorecard 4.1 / 10
4.1Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-24 01:05 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
8CI-Tests5 out of 6 merged PRs checked by a CI test -- score normalized to 8
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/6 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
1Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 1
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
10Vulnerabilities0 existing vulnerabilities detected
Direkte Abhängigkeiten 18
RegistryPaketVersionsvorgabeManifest
crates.ioclap4.5Cargo.toml
crates.iotoml0.8Cargo.toml
crates.ioserde1.0Cargo.toml
crates.iodirs6.0Cargo.toml
crates.iowhich7.0Cargo.toml
crates.ioreqwest0.12Cargo.toml
crates.iotokio1.0Cargo.toml
crates.ioserde_json1.0Cargo.toml
crates.iohandlebars4.0Cargo.toml
crates.iourl2.5Cargo.toml
crates.iofutures-util0.3Cargo.toml
crates.ioindicatif0.17Cargo.toml
crates.iozip2Cargo.toml
crates.iochrono0.4Cargo.toml
crates.iothiserror2Cargo.toml
crates.iosha20.10.9Cargo.toml
crates.iohex0.4.3Cargo.toml
crates.ioasync-trait0.1.89Cargo.toml
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [
        "cc",
        "env",
        "java",
        "maven"
      ],
      "is_fork": false,
      "size_kb": 7513,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Rust": 342467,
        "Shell": 19865,
        "Handlebars": 18093,
        "JavaScript": 41145,
        "PowerShell": 4349
      },
      "pushed_at": "2026-07-18T17:51:25Z",
      "created_at": "2021-11-23T02:26:07Z",
      "owner_type": "User",
      "updated_at": "2026-07-18T16:16:07Z",
      "description": "Management environment Java、Maven、Claude Code",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Rust",
      "significant_languages": [
        "Rust"
      ]
    },
    "owner": {
      "blog": "https://protagonisths.com",
      "name": "huangshan",
      "type": "User",
      "login": "Protagonistss",
      "company": "shinewing",
      "location": "BeiJing",
      "followers": 10,
      "avatar_url": "https://avatars.githubusercontent.com/u/39770514?v=4",
      "created_at": "2018-05-30T14:27:36Z",
      "is_verified": null,
      "public_repos": 30,
      "account_age_days": 2976
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.0.90",
          "kind": "patch",
          "published_at": "2026-07-18T16:20:31Z"
        },
        {
          "tag": "v0.0.89",
          "kind": "patch",
          "published_at": "2026-07-13T05:33:26Z"
        },
        {
          "tag": "v0.0.88",
          "kind": "patch",
          "published_at": "2026-07-13T05:14:16Z"
        },
        {
          "tag": "v0.0.87",
          "kind": "patch",
          "published_at": "2026-07-13T03:27:00Z"
        },
        {
          "tag": "v0.0.86",
          "kind": "patch",
          "published_at": "2026-07-09T15:49:17Z"
        },
        {
          "tag": "v0.0.85",
          "kind": "patch",
          "published_at": "2026-07-09T13:46:26Z"
        },
        {
          "tag": "v0.0.84",
          "kind": "patch",
          "published_at": "2026-07-03T01:46:36Z"
        },
        {
          "tag": "v0.0.83",
          "kind": "patch",
          "published_at": "2026-07-03T00:18:31Z"
        },
        {
          "tag": "v0.0.82",
          "kind": "patch",
          "published_at": "2026-07-01T15:10:37Z"
        },
        {
          "tag": "v0.0.81",
          "kind": "patch",
          "published_at": "2026-07-01T12:03:23Z"
        },
        {
          "tag": "v0.0.80",
          "kind": "patch",
          "published_at": "2026-07-01T11:19:10Z"
        },
        {
          "tag": "v0.0.79",
          "kind": "patch",
          "published_at": "2026-07-01T10:30:50Z"
        },
        {
          "tag": "v0.0.78",
          "kind": "patch",
          "published_at": "2026-07-01T09:37:22Z"
        },
        {
          "tag": "v0.0.77",
          "kind": "patch",
          "published_at": "2026-07-01T09:16:37Z"
        },
        {
          "tag": "v0.0.76",
          "kind": "patch",
          "published_at": "2026-07-01T05:05:57Z"
        },
        {
          "tag": "v0.0.75",
          "kind": "patch",
          "published_at": "2026-06-30T15:37:33Z"
        },
        {
          "tag": "v0.0.74",
          "kind": "patch",
          "published_at": "2026-06-30T15:23:30Z"
        },
        {
          "tag": "v0.0.73",
          "kind": "patch",
          "published_at": "2026-06-30T15:03:28Z"
        },
        {
          "tag": "v0.0.72",
          "kind": "patch",
          "published_at": "2026-06-30T14:22:16Z"
        },
        {
          "tag": "v0.0.71",
          "kind": "patch",
          "published_at": "2026-06-30T09:10:57Z"
        },
        {
          "tag": "v0.0.70",
          "kind": "patch",
          "published_at": "2026-06-30T04:16:53Z"
        },
        {
          "tag": "v0.0.69",
          "kind": "patch",
          "published_at": "2026-04-21T10:37:22Z"
        },
        {
          "tag": "v0.0.68",
          "kind": "patch",
          "published_at": "2026-04-21T10:34:09Z"
        },
        {
          "tag": "v0.0.67",
          "kind": "patch",
          "published_at": "2026-04-21T10:20:59Z"
        },
        {
          "tag": "v0.0.66",
          "kind": "patch",
          "published_at": "2026-04-21T10:08:04Z"
        },
        {
          "tag": "v0.0.65",
          "kind": "patch",
          "published_at": "2026-04-21T09:40:00Z"
        },
        {
          "tag": "v0.0.64",
          "kind": "patch",
          "published_at": "2026-04-21T09:26:21Z"
        },
        {
          "tag": "v0.0.63",
          "kind": "patch",
          "published_at": "2026-04-21T08:58:36Z"
        },
        {
          "tag": "v0.0.62",
          "kind": "patch",
          "published_at": "2026-04-21T08:44:38Z"
        },
        {
          "tag": "v0.0.61",
          "kind": "patch",
          "published_at": "2026-04-21T08:05:35Z"
        },
        {
          "tag": "v0.0.60",
          "kind": "patch",
          "published_at": "2026-04-21T06:53:36Z"
        },
        {
          "tag": "v0.0.59",
          "kind": "patch",
          "published_at": "2026-04-21T05:38:11Z"
        },
        {
          "tag": "v0.0.58",
          "kind": "patch",
          "published_at": "2026-04-21T04:30:53Z"
        },
        {
          "tag": "v0.0.57",
          "kind": "patch",
          "published_at": "2026-04-21T03:54:13Z"
        },
        {
          "tag": "v0.0.56",
          "kind": "patch",
          "published_at": "2026-04-21T03:10:11Z"
        },
        {
          "tag": "v0.0.55",
          "kind": "patch",
          "published_at": "2026-04-19T10:37:55Z"
        },
        {
          "tag": "v0.0.54",
          "kind": "patch",
          "published_at": "2026-04-19T10:27:00Z"
        },
        {
          "tag": "v0.0.53",
          "kind": "patch",
          "published_at": "2026-04-19T06:10:16Z"
        },
        {
          "tag": "v0.0.52",
          "kind": "patch",
          "published_at": "2026-04-19T05:25:10Z"
        },
        {
          "tag": "v0.0.51",
          "kind": "patch",
          "published_at": "2026-04-19T05:16:44Z"
        },
        {
          "tag": "v0.0.50",
          "kind": "patch",
          "published_at": "2026-04-19T05:01:02Z"
        },
        {
          "tag": "v0.0.49",
          "kind": "patch",
          "published_at": "2026-04-19T04:48:05Z"
        },
        {
          "tag": "v0.0.48",
          "kind": "patch",
          "published_at": "2026-04-19T04:22:55Z"
        },
        {
          "tag": "v0.0.47",
          "kind": "patch",
          "published_at": "2026-04-14T09:45:50Z"
        },
        {
          "tag": "v0.0.46",
          "kind": "patch",
          "published_at": "2026-04-14T09:16:53Z"
        },
        {
          "tag": "v0.0.45",
          "kind": "patch",
          "published_at": "2026-04-14T09:00:55Z"
        },
        {
          "tag": "v0.0.44",
          "kind": "patch",
          "published_at": "2026-04-14T08:39:27Z"
        },
        {
          "tag": "v0.0.43",
          "kind": "patch",
          "published_at": "2026-04-14T06:20:56Z"
        },
        {
          "tag": "v0.0.42",
          "kind": "patch",
          "published_at": "2025-12-23T06:58:13Z"
        },
        {
          "tag": "v0.0.41",
          "kind": "patch",
          "published_at": "2025-12-23T06:36:02Z"
        },
        {
          "tag": "v0.0.40",
          "kind": "patch",
          "published_at": "2025-12-10T11:46:32Z"
        },
        {
          "tag": "v0.0.38",
          "kind": "patch",
          "published_at": "2025-12-10T05:31:50Z"
        },
        {
          "tag": "v0.0.37",
          "kind": "patch",
          "published_at": "2025-12-09T14:02:30Z"
        },
        {
          "tag": "v0.0.36",
          "kind": "patch",
          "published_at": "2025-11-25T10:02:17Z"
        },
        {
          "tag": "v0.0.35",
          "kind": "patch",
          "published_at": "2025-11-25T09:50:17Z"
        },
        {
          "tag": "v0.0.34",
          "kind": "patch",
          "published_at": "2025-11-25T09:31:26Z"
        },
        {
          "tag": "v0.0.30",
          "kind": "patch",
          "published_at": "2025-11-24T10:12:24Z"
        },
        {
          "tag": "v0.0.29",
          "kind": "patch",
          "published_at": "2025-11-24T09:55:10Z"
        },
        {
          "tag": "v0.0.28",
          "kind": "patch",
          "published_at": "2025-11-24T09:34:28Z"
        },
        {
          "tag": "v0.0.27",
          "kind": "patch",
          "published_at": "2025-11-24T09:11:58Z"
        },
        {
          "tag": "v0.0.26",
          "kind": "patch",
          "published_at": "2025-11-24T09:02:42Z"
        },
        {
          "tag": "v0.0.25",
          "kind": "patch",
          "published_at": "2025-11-24T08:44:08Z"
        },
        {
          "tag": "v0.0.24",
          "kind": "patch",
          "published_at": "2025-11-24T08:18:24Z"
        },
        {
          "tag": "v0.0.23",
          "kind": "patch",
          "published_at": "2025-11-24T08:06:42Z"
        },
        {
          "tag": "v0.0.22",
          "kind": "patch",
          "published_at": "2025-11-20T10:22:16Z"
        },
        {
          "tag": "v0.0.21",
          "kind": "patch",
          "published_at": "2025-11-20T09:50:05Z"
        },
        {
          "tag": "v0.0.20",
          "kind": "patch",
          "published_at": "2025-11-20T08:48:42Z"
        },
        {
          "tag": "v0.0.19",
          "kind": "patch",
          "published_at": "2025-11-20T05:37:25Z"
        },
        {
          "tag": "v0.0.18",
          "kind": "patch",
          "published_at": "2025-11-20T05:08:49Z"
        },
        {
          "tag": "v0.0.17",
          "kind": "patch",
          "published_at": "2025-11-19T09:53:56Z"
        },
        {
          "tag": "v0.0.16",
          "kind": "patch",
          "published_at": "2025-11-19T09:36:33Z"
        },
        {
          "tag": "v0.0.15",
          "kind": "patch",
          "published_at": "2025-11-19T09:21:54Z"
        },
        {
          "tag": "v0.0.14",
          "kind": "patch",
          "published_at": "2025-11-19T07:03:56Z"
        },
        {
          "tag": "v0.0.13",
          "kind": "patch",
          "published_at": "2025-11-19T06:47:10Z"
        },
        {
          "tag": "v0.0.12",
          "kind": "patch",
          "published_at": "2025-11-19T06:22:47Z"
        },
        {
          "tag": "v0.0.11",
          "kind": "patch",
          "published_at": "2025-11-19T05:58:08Z"
        },
        {
          "tag": "v0.0.10",
          "kind": "patch",
          "published_at": "2025-11-18T05:33:52Z"
        },
        {
          "tag": "v0.0.9",
          "kind": "patch",
          "published_at": "2025-11-10T11:12:02Z"
        },
        {
          "tag": "v0.0.8",
          "kind": "patch",
          "published_at": "2025-11-10T10:10:28Z"
        },
        {
          "tag": "v0.0.7",
          "kind": "patch",
          "published_at": "2025-11-10T08:39:17Z"
        },
        {
          "tag": "v0.0.6",
          "kind": "patch",
          "published_at": "2025-11-10T08:27:31Z"
        },
        {
          "tag": "v0.0.5",
          "kind": "patch",
          "published_at": "2025-11-06T09:57:11Z"
        },
        {
          "tag": "v0.0.4",
          "kind": "patch",
          "published_at": "2025-11-05T03:08:51Z"
        },
        {
          "tag": "v0.0.3",
          "kind": "patch",
          "published_at": "2025-11-05T02:36:59Z"
        },
        {
          "tag": "v0.0.2",
          "kind": "patch",
          "published_at": "2025-11-04T15:59:19Z"
        },
        {
          "tag": "v0.0.1",
          "kind": "patch",
          "published_at": "2025-11-04T14:53:00Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "a9062ef67ca4ae734eed3c4247a4dd7b7b24a83f",
          "body": "release: v0.0.90",
          "is_bot": false,
          "headline": "Merge pull request #29 from Protagonistss/dev",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-18T16:16:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b9aa41407111febc17cad20b8fcc78b87eb0c832",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.0.90",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-18T16:14:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd10bcf6e81e7bcd9585fe6eb80c27328f24368c",
          "body": "Adds 30 tests (47 -> 77 total) across previously uncovered layers:\n\n- extract_zip: normal unpack + zip-slip path-traversal rejection\n- cc/maven/java environment managers: add/remove/use_env/validation paths\n- session HistoryManager: record->save->reload, max capacity, env filter\n- paths migrate_layo\n[…]\nn/doctor\n\nAdds a shared testutil (FnvaHomeGuard) so all FNVA_HOME-dependent tests\nserialize on one global lock; switcher's private guard migrates to it.\nNew dev-deps: assert_cmd, predicates, httpmock.",
          "is_bot": false,
          "headline": "test: expand coverage to managers, persistence, network, and CLI",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-18T16:10:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8adbb9678e06e8e26006053ece521da16e25f416",
          "body": "Error model:\n- Remove dead ContextualError / ErrorContext / with_suggestions /\n  user_message (~150 lines) and the Box<ContextualError> return type.\n- Add AppError::Context{operation,cause} + root_cause(), and a\n  From<String> fallback. Migrate switcher, SafeMutex,\n  option_with_context, handlers an\n[…]\name + is_dir, also guards against zip-slip),\n  thiserror 1 -> 2, clap 4.4 -> 4.5, reqwest 0.11 -> 0.12,\n  dirs 5 -> 6, which 6 -> 7.\n\n47 tests pass (was 44); cargo fmt clean; clippy -D warnings clean.",
          "is_bot": false,
          "headline": "refactor(error): unify on AppError; bundle usability fixes and dep bumps",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-18T15:39:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e0cf19a9b8bd715b617e09aa4feb7cd87cf1cb52",
          "body": "Split the single lint-and-test job into a lint job (ubuntu) and a test\nmatrix spanning ubuntu/windows/macos, so platform-specific path and\nshell bugs (e.g. the prior normalize_path Windows bug) are caught in\nCI rather than after release.",
          "is_bot": false,
          "headline": "ci: run tests on windows and macos",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-18T15:38:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d680b26ebf4f4f6d06f5304761e36901558052a9",
          "body": "* docs(agents): sync structure with current src/scripts layout\n\n- environments: Java/LLM → Java/Maven/Claude Code(cc)\n- infrastructure: 补 scanner.rs / remote / tool_protocol / installer\n- 新增 error 模块说明\n- npm scripts 补 build:all / check-permissions / install-shell\n- 模板清单补 tool-source-protocol.md\n\n* f\n[…]\n Bump Cargo version to 0.0.88\n\n* Bump version to 0.0.89\n\n* ci(update-versions): open version registry PRs against dev\n\n---------\n\nCo-authored-by: Protagonistss <Protagonistss@users.noreply.github.com>",
          "is_bot": false,
          "headline": "ci(update-versions): route auto-generated PRs to dev (#28)",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-18T13:41:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "838e4784a5f7c830d1657d7dd16eaaa63d8e964f",
          "body": "Co-authored-by: Protagonistss <Protagonistss@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: update Java version registry (#27)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-18T04:50:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51f1086b3ed935c54ac0788bdb07c6f86dc7c620",
          "body": "Dev",
          "is_bot": false,
          "headline": "Merge pull request #26 from Protagonistss/dev",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-09T15:58:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "85e667b04186455ca15af02ba18aad617412e6e6",
          "body": null,
          "is_bot": false,
          "headline": "docs: add PR template and contribution/discussion guidelines",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-09T15:54:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83571adb8f1338f62fb27774cdac914720cd3128",
          "body": null,
          "is_bot": false,
          "headline": "style(cc): collapse format! into single line to satisfy rustfmt",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-09T15:49:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3fde3f176025c525e183b4a92c9f0e1a446c0bac",
          "body": null,
          "is_bot": false,
          "headline": "Bump version to 0.0.86",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-09T15:45:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99003e8ac1b7856ac255d64296ad0ee6d7a4e4c5",
          "body": "getLatestVersion returned the first non-prerelease release with ≥3 assets\nfrom /releases?per_page=5. GitHub sorts releases by created_at, not by\nversion, so for temurin17/temurin21 it picked older builds (17.0.18→17.0.9,\n21.0.10→21.0.9), causing the bot's PR #25 to downgrade two LTS versions.\n\nNow fetches per_page=30 and selects the max by a parsed version key\n(major.minor.patch+build, or 8uNNNbNN for Java 8). Candidates must still\nbe non-prerelease with ≥3 platform assets.",
          "is_bot": false,
          "headline": "fix(scripts): pick latest Java GA by version, not GitHub release order",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-09T15:30:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7cb60d6fe618151166c818da11bbe9de5158f3e5",
          "body": "Make `cc add` feedback consistent and surface a common footgun:\n\n- Render add success with a green ✓ via print::success instead of the\n  plain \"Successfully added ...\" line, matching the rest of the CLI.\n  Applies to java/maven/cc add (shared path); message shortened to\n  \"Added ...\" to avoid \"✓ Suc\n[…]\nn-authenticating CC env), and tag such envs with `⚠ no key` in\n  `cc list` via a new EnvItem.missing_key computed from config.\n\nNo secret material is printed or stored; ${...} references count as set.",
          "is_bot": false,
          "headline": "feat(cc): polish add output — ✓ success line and missing api-key warning",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-09T15:10:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "41dec0551ecf83493c70acbac4b76e310baea635",
          "body": null,
          "is_bot": false,
          "headline": "Bump version to 0.0.85",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-09T13:42:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee33335301fabd6ecee8dc0e3b9cfa13b48745c1",
          "body": "Claude Code speaks only the Anthropic protocol, so the provider\ntrait/factory/generic-fallback was a single-branch abstraction that only\nadded friction (and produced the broken `<provider>` placeholder in scan\noutput). Drop --provider from `cc add` and the config field; inline the\nconfig setup as se\n[…]\npply_anthropic_config.\n\nAlso fixes garbled scan Detail on Windows: HOME is unset there, so the old\n`path.replace(\"\", \"~\")` inserted \"~\" between every character. Now resolves\nhome via dirs::home_dir().",
          "is_bot": false,
          "headline": "refactor(cc): remove provider abstraction",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-09T13:41:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "98b05051447a16ced45af142fc3531361cd71e88",
          "body": "style(install): English messages in install/uninstall scripts",
          "is_bot": false,
          "headline": "Merge pull request #24 from Protagonistss/dev",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-03T04:28:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51d422b06477803c9cbad6a8bd37072e0945f6d6",
          "body": "Switch all user-facing echo/Write-Host messages in install.sh, install.ps1, uninstall.sh, uninstall.ps1 from Chinese to English for international users. Logic and >>> fnva >>> block markers unchanged.",
          "is_bot": false,
          "headline": "style(install): English messages in install/uninstall scripts",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-03T04:26:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d28c9ad8805ca1619402fea0de9ea558610c6c16",
          "body": "Bump version to 0.0.84",
          "is_bot": false,
          "headline": "Merge pull request #23 from Protagonistss/dev",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-03T01:42:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca03d18c8088a000ccffe24f185c4be8c58b9214",
          "body": null,
          "is_bot": false,
          "headline": "Bump version to 0.0.84",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-03T01:41:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc63c7797fd88bdc50608745d21d86bc360ca818",
          "body": "Dev",
          "is_bot": false,
          "headline": "Merge pull request #22 from Protagonistss/dev",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-03T01:40:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95bc5a67078cfc883e33cd9d6da10f6aa669ce92",
          "body": "- README: curl|sh one-liner (recommended) + npm + cargo + manual; notes that curl auto-configures PATH + shell integration.\n- install.sh / install.ps1: use # >>> fnva >>> / # <<< fnva <<< block markers for precise uninstall; install.ps1 now also wires $PROFILE.\n- new scripts/uninstall.sh / uninstall\n[…]\nlock from rc ($PROFILE for PowerShell), remove binary, keep ~/.fnva config by default.\n- README mentions uninstall one-liner.\nVerified: install -> uninstall cycle leaves .bashrc clean and binary gone.",
          "is_bot": false,
          "headline": "feat(install): README install docs, uninstall scripts, block markers",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-03T01:34:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7945b576307de84e3db644aae3bed03c34c3aeea",
          "body": "scripts/install.sh (Unix) and install.ps1 (Windows): download the platform zip from the latest GitHub Release, extract to ~/.fnva/bin (FNVA_INSTALL_DIR overrides), and auto-configure PATH + shell integration (eval fnva env) into the matching rc (~/.zshrc/~/.bashrc/~/.profile for bash/zsh, ~/.config/\n[…]\n/arm64 + win32-x64. rc edits are appends only — existing npm/cargo/nvm config is preserved. Verified: installs fnva 0.0.83 and produces a working PATH+eval block next to pre-existing cargo/nvm blocks.",
          "is_bot": false,
          "headline": "feat(install): add curl|sh one-liner install scripts (Unix + Windows)",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-03T01:30:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9cc226f68786dd03a9c2f7470188c30091e1992d",
          "body": "Reshape the scan path:\n- new infrastructure::scanner::scan_directory_roots: reusable 'iterate roots -> validate -> extract -> dedup' skeleton, replacing the loop baked into JavaScanner\n- new ScanHit type (core::presentation) with name/location/detail/import_cmd; EnvironmentManager::scan now returns \n[…]\ncan --path <dir> (repeatable) for ad-hoc scan locations\n\nVerified end-to-end: java/maven/cc scan + --path all discover (incl. fake\ndirs with bin/java or bin/mvn); Maven scan now finds system installs.",
          "is_bot": false,
          "headline": "feat(scan): unified scan skeleton, real Maven scan, --path, ScanHit",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-03T00:57:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9e2c7742d0befb21e1695eb49b661c583ffff744",
          "body": null,
          "is_bot": false,
          "headline": "Bump version to 0.0.83",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-03T00:14:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6bd24bd915ad5cfa0d7d5b40c4738d7ebc15fda4",
          "body": "ScriptFactory::detect_shell_type re-implemented shell detection (SHELL / PSModulePath / POSH_THEMES_PATH / PROMPT), duplicating shell::platform::detect_shell — and on Windows it defaulted to Bash (wrong; should be PowerShell). Delegate to detect_shell instead: removes the duplicate logic and fixes the Windows default. Full Platform/OsType merge is deliberately out of scope (Platform has 7 callers across download paths; risky).",
          "is_bot": false,
          "headline": "refactor(shell): unify shell detection, fix Windows default",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-03T00:11:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a62c6cc5d0564aac4d4d32bfa0a2e7809d4a4266",
          "body": "- remove OutputFormatter::{format_environments, format_error, format_success} (zero callers; format_environments Text branch was unimplemented {env:?} Debug printing) and the now-unused Serialize import. Only format_switch_result remains (used by handlers).\n- add config::DEFAULT_SONNET_MODEL const; replace the 4 scattered \"claude-sonnet-4-5\" literals (3 in cc environment_manager + 1 in default_cc_environments) with it.",
          "is_bot": false,
          "headline": "refactor: drop dead OutputFormatter methods, centralize default CC model",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-03T00:05:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d7ca21082271e57b64cbd01f379edea06a721ab",
          "body": "…at cli)\n\ncore (switcher/session) reverse-depended on cli via 7 sites: OutputFormat import, format_envs/format_history calls in list/history, and 5 best-effort warn calls. Move data models down and rendering up:\n\n- new core::presentation: OutputFormat, EnvItem, HistoryItem (single source, no re-expo\n[…]\nwarn to eprintln\n\ngrep -rn \"crate::cli\" src/core/ is now empty. List Json shape changes slightly ({environment_type, environments:[EnvItem]}) but is info-equivalent (current/default carried as flags).",
          "is_bot": false,
          "headline": "refactor(core): decouple core from cli (presentation models + render …",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-02T23:59:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d2ec4ce72b95a649a23fb0eb519eee1c617877e8",
          "body": "…e_path on Windows\n\n- remove download_to_bytes / download_to_bytes_with_options / download_to_bytes_internal + verify_sha256: pub API but no callers, and download_to_bytes reads the whole response into Vec<u8> (hundreds of MB for JDK/Maven archives) — a latent memory hazard. File downloads already u\n[…]\nre classify_error change cannot panic the process there.\n- normalize_path: drop to_lowercase() on the non-canonicalized branch, which corrupted Windows paths like C:\\Program Files -> c:\\program files.",
          "is_bot": false,
          "headline": "fix: drop dead download_to_bytes, remove unreachable!(), fix normaliz…",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-02T23:42:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "111b1fb1eb389b3411a7ab6ec60b7b919aa77b63",
          "body": "…rsion discovery\n\nJava (AdoptiumDiscovery) and Maven (MirrorDirectoryDiscovery) version discovery had identical HTTP retry loops (3x + 1s backoff) and identical {fetched_at, versions} JSON cache read/write + TTL logic. Extract fetch_with_retry(client, url) for the shared retry policy, and CacheEntry\n[…]\nn format). Each discovery now only keeps its own fetch body (multi-major for java, single-directory for maven) and parse logic; drops the per-file VersionCache structs and hand-written retry/cache-IO.",
          "is_bot": false,
          "headline": "refactor(tool_protocol): extract fetch_with_retry + CacheEntry for ve…",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-02T23:36:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b03c9122f5e5df97007ba47c471ec15b4ce46104",
          "body": "Java and Maven downloaders had near-identical list/find/get_download_url/download impls (only download cache file name differed). Extract a generic GenericDownloader<D: VersionDiscovery> that implements ToolDownloader once, with the file-name template injected as a closure at construction. JavaDownloader/MavenDownloader become type aliases over GenericDownloader with tool-specific new() constructors, so all call sites stay unchanged. Eliminates ~140 lines of duplicated async boilerplate.",
          "is_bot": false,
          "headline": "refactor(tool_protocol): extract GenericDownloader to dedupe java/maven",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-02T16:14:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26e9f708ddd4e194f771ef03ea766412aa8aa461",
          "body": "Migrate the EnvironmentManager trait's 11 methods from Result<_, String> to Result<_, AppError> so error types survive to the boundary:\n\n- app_error.rs: add not_found/validation/config_error/script_generation/from_string constructors (no From<String>, to keep types explicit)\n- java/maven/cc managers\n[…]\nw triggers for invalid java_home paths.\n\nInfrastructure-layer String errors (config/paths/download) and the handlers/main boundary signature (Result<_, String>) are intentionally left for a follow-up.",
          "is_bot": false,
          "headline": "refactor(error): unify EnvironmentManager trait errors to AppError",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-02T15:02:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c961e8928e225d8369e4eb8311ccd4b11b2be437",
          "body": "- paths.rs: honor FNVA_HOME env var (falls back to home dir) so tests can isolate fnva data into a temp dir without touching real ~/.fnva\n- switcher.rs: integration tests covering switch_environment not-found branch, the use_env error path (invalid JAVA_HOME), and list on empty config; serialized via a module mutex since FNVA_HOME is process-global\n- tempfile dev-dependency for temp dirs",
          "is_bot": false,
          "headline": "test: add switcher core path integration tests",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-02T14:15:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ff380fb5f2ebcb6c3f20855a48bb99fb1c185125",
          "body": "New ci.yml runs cargo fmt --check, clippy -D warnings, and test on every push to main/dev and on pull requests. Decoupled from build.yml (release-only) so quality is gated continuously.",
          "is_bot": false,
          "headline": "ci: add lint and test gate on push and pull request",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-02T13:39:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "caa351a73f5c923d391b6dce0b086301073a1acc",
          "body": "Replace 16 inline r#\"...\"# const literals with include_str!(\"templates/*.hbs\"), making the .hbs files the single source of truth at runtime. Each .hbs holds the exact runtime value of the former const, so behavior is unchanged (template rendering tests pass). script_strategy.rs shrinks 1204 -> 583 lines. Update AGENTS.md template workflow.",
          "is_bot": false,
          "headline": "refactor(shell): load templates via include_str! as single source",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-02T13:38:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e8e982b80af0452d81a32133d01cd9a6b8661b7",
          "body": "- shell/integration.rs (347 lines): unused duplicate script generator\n- JavaEnvironmentManager::{new_with_scan, scan_and_update, save_scanned_environment_to_config}: never called\n- EnvironmentSwitcher::{list_environments, switch_to_default_environment}: never called (handlers use the *_with_default variants)\n- remote/cache.rs CacheKeys: never used",
          "is_bot": false,
          "headline": "refactor: remove dead code across core and infrastructure",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-02T13:38:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "547e6f2dbbed0caa887c31eb6986bdbcf2a638ff",
          "body": "Replace hardcoded \"fnva/0.0.5\" with a const built from env!(\"CARGO_PKG_VERSION\") so the User-Agent stays in sync with releases.",
          "is_bot": false,
          "headline": "fix(remote): sync User-Agent version via CARGO_PKG_VERSION",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-02T13:38:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4713170c07727fb2dccf214a214565ff61278d4e",
          "body": null,
          "is_bot": false,
          "headline": "Bump version to 0.0.82",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-01T15:06:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1d0eef80d9f438d9cc5efd78bfc4ca75c6b018d",
          "body": "Pure formatting pass (cargo fmt) — no logic changes. Clears the\npre-existing fmt drift so the tree matches .rustfmt.toml.",
          "is_bot": false,
          "headline": "style: apply rustfmt across repo",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-01T15:03:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3df9cc45f7b72663f9e407fa67ccf9fbade30f0",
          "body": "scan_environments hardcoded `fnva cc add ... --base-url ... --auto` for\nevery env type, so Java/Maven scans suggested a wrong (and partly\nnon-existent) command. Build the suggestion per env_type instead:\n- Java/Maven -> `fnva <type> add --name <n> --home <path>`\n- CC         -> `fnva cc add --name <n> --provider <provider> --base-url <url>`\n  (--provider required but unknowable from a scan, left as placeholder;\n   dropped the phantom --auto flag)",
          "is_bot": false,
          "headline": "fix(scan): generate correct import command per environment type",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-01T15:00:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71f44175097887951939c95317374fea4560e41d",
          "body": null,
          "is_bot": false,
          "headline": "Bump version to 0.0.81",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-01T11:59:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "701ad5714f13fa7585d21bf7b6ec65ce9c0b4105",
          "body": null,
          "is_bot": false,
          "headline": "Optimize first-run shell integration setup wizard output",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-01T11:55:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e47cbd5ccf0430d12b9908add4ae377d2d54157e",
          "body": "Dev",
          "is_bot": false,
          "headline": "Merge pull request #21 from Protagonistss/dev",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-01T11:30:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ab0cb1ef4cdba7216ba769235211acf10981ab7",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.0.80",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-01T11:14:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f92ef6a09e875eacad3732b73bab22babb7144c",
          "body": "Claude Code CLI uses ~/.claude/settings.json on all platforms,\nincluding Windows (%USERPROFILE%\\.claude\\settings.json).\n%APPDATA%\\Claude\\ is used by Claude Desktop (different product).",
          "is_bot": false,
          "headline": "fix(cc): correct Windows path for Claude Code settings.json",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-01T11:13:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69417206dce6f956e6ba29c0867866a0aae67866",
          "body": "Support settings.json on all platforms:\n- Linux/macOS: ~/.claude/settings.json\n- macOS (additional): ~/Library/Application Support/Claude/settings.json\n- Windows: %APPDATA%/Claude/settings.json\n\nRefactor scan logic into claude_settings_candidates() helper.\nDe-duplicate across all candidates to avoid showing the same config twice.",
          "is_bot": false,
          "headline": "fix(cc): cross-platform Claude Code settings.json discovery",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-01T11:12:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3b98ba57374b80133172679a3586956ce7976d0",
          "body": "- Read ANTHROPIC_AUTH_TOKEN, BASE_URL, model fields from settings.json env block\n- Generate meaningful env name from base_url domain (e.g. bigmodel-cc)\n- Skip configs already managed in fnva config.toml (by name or url)\n- Improve scan output with Name/URL/Model/Source/Import hint fields\n- Retain original system env var detection as fallback",
          "is_bot": false,
          "headline": "feat(cc): scan ~/.claude/settings.json to discover local CC configs",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-01T11:10:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f0380fbde957c7ef22b013f0de397df1c2ff2e4",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.0.79",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-01T10:27:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac174d0afbdbc11e883ad5c792604155c5c44e9e",
          "body": null,
          "is_bot": false,
          "headline": "chore: remove compiled binaries in platforms from git tracking",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-01T10:25:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce86b38bf58477974a9d151c61400a5637e2d9ba",
          "body": "- Remove 'llm' references from bin/fnva.js\n- Rename templates/*_llm_switch.hbs to *_cc_switch.hbs\n- Remove handleNodeOnlyMode from bin/fnva.js as the fallback was incomplete\n- Remove Windows secondary parsing pipe (isSwitchCommand) and pass stdio: 'inherit' to unify cross-platform execution",
          "is_bot": false,
          "headline": "Refactor: remove legacy LLM code and Node fallback mode",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-01T10:23:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4e2dde83e03118b689ec0db7525ef1063d7c7aa",
          "body": "…config injection\n\n- Simplify all switch messages to one-line format (✓ Switched to <Type>: <Name>) matching the auto-restore hook\n- Remove multi-line outputs like JAVA_HOME and Anthropic Auth Token: [SET]\n- Fix bug where OPENAI_* variables were omitted from script_strategy.rs CC templates\n- Synchronize all .hbs templates with inline templates in script_strategy.rs",
          "is_bot": false,
          "headline": "Refactor environment switch messages to concise style and fix OpenAI …",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-01T10:10:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa03fe8a70ab285fbaf7a10442786dbe446e81db",
          "body": null,
          "is_bot": false,
          "headline": "feat: translate all user-facing prompts and errors to English",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-01T09:32:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf090945914de993b392fee652b17a5e38815a78",
          "body": null,
          "is_bot": false,
          "headline": "Bump version to 0.0.77 and optimize system",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-01T09:12:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "baab6c1e790596a7f78f6ef22ef40451ce6c7903",
          "body": "Dev",
          "is_bot": false,
          "headline": "Merge pull request #20 from Protagonistss/dev",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-01T05:09:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ee60b6adec310e1429f43321c38b4bdfa77e74d",
          "body": null,
          "is_bot": false,
          "headline": "Bump version to 0.0.76 and support per-environment Maven variables",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-07-01T05:02:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a534dc8bd68f68b0367aa984287bb1e6bc9d065",
          "body": "…ion feature",
          "is_bot": false,
          "headline": "Bump version to 0.0.75 for npm allow-scripts fix and first-run detect…",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T15:33:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5082d0e397bf394da750603de7adae2013f600f9",
          "body": "…chmod",
          "is_bot": false,
          "headline": "feat: Replace postinstall with interactive first-run setup & dynamic …",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T15:31:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd8fd502bdedcef7f7af4a7fff0edea21bcfffc4",
          "body": null,
          "is_bot": false,
          "headline": "Bump version to 0.0.74",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T15:19:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "097d3a93842ab66f82eb31867184af0276a5eed7",
          "body": null,
          "is_bot": false,
          "headline": "Polish shell templates with status checkmark design",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T15:17:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "00e9a1f565501af67d44bb3ac3bdfca686439d2e",
          "body": null,
          "is_bot": false,
          "headline": "Polish autoload restored message to include tool keys (e.g. java@21)",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T15:12:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "755006f3024cf17dcf328462adef2ec8a0e73132",
          "body": null,
          "is_bot": false,
          "headline": "Bump version to 0.0.73 and polish CLI output",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T14:57:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bfa506a2afbd4c7fbfbea6ff2ea8c97e46ab8ebe",
          "body": null,
          "is_bot": false,
          "headline": "Bump version to 0.0.72",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T14:18:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92d183cf876e4ed0a0d9f0301ab5c4029bc0c0d7",
          "body": null,
          "is_bot": false,
          "headline": "Fix double 'env' in shell integration installer and .hbs templates",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T14:16:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1a6298caff77f34bc92fd96ed2877518203ddcb",
          "body": null,
          "is_bot": false,
          "headline": "Bump version to 0.0.71",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T09:05:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0fee6cf84125837f07c2be9bbc7400abf946dc0",
          "body": "No logic changes; purely style/whitespace adjustments produced by\ncargo fmt (line wrapping, brace placement, import grouping).",
          "is_bot": false,
          "headline": "Apply rustfmt formatting across codebase",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T07:52:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11ccf328a426e2b61ce6e4ebd6385065ecc59e76",
          "body": "…s, default count\n\n- script_strategy: replace hardcoded API_TIMEOUT_MS=30000 with\n  {{config.api_timeout_ms}} in all 4 shell CC switch templates\n- environment_manager: use_env() preserves ${VAR} API key references\n  instead of resolving them to plaintext; reads api_timeout_ms from\n  CcEnvironment co\n[…]\nhot-cc / glmcc / anycc / kimicc presets that cluttered first-run output\n- config: translate default CC descriptions to English\n- handlers: give a friendly error with example when --base-url is omitted",
          "is_bot": false,
          "headline": "Fix CC env bugs: timeout hardcode, scan var, key exposure, model name…",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T07:51:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2a01370e5ab575b1ce533e9750f13b7f279e835c",
          "body": "- CC Add now goes through switcher.add_environment (was bypassing manager)\n- CC Scan command added (manager already had scan() impl)\n- Fix unused import warning (Java refresh)\n- Unify default model: claude-sonnet-4-5 everywhere\n\nCC command set: list scan use add remove default current",
          "is_bot": false,
          "headline": "refactor: CC command standardization",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T05:34:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd1723aff728712b90657a3f4e6ab588f7ec7fc8",
          "body": "Java + Maven now have identical command sets (11 each):\n  list use scan add remove ls-remote refresh install uninstall default current\n\nAdded:\n- fnva java refresh (was missing, AdoptiumDiscovery supports it)\n- fnva maven scan (scan system for Maven installations)\n- fnva maven add/remove (manual env management, aligns with Java/CC)\n\nCleaned up Java ls-remote:\n- Removed dead query_type param (always \"java\")\n- Removed dead repository param (never used)\n- Removed dead limit param (was _ ignored)",
          "is_bot": false,
          "headline": "feat: command symmetry (java refresh + maven scan/add/remove) + cleanup",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T05:09:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb20514a045ebbba99f3adaf83bc69376b583a67",
          "body": "- fnva env env -> fnva env (all docs, all shells)\n- fnva env shell-integration -> fnva env\n- Remove \"two env\" design notes\n- Add shell integration install instructions to READMEs\n- eval \"$(fnva env)\" pattern (fnm-style)",
          "is_bot": false,
          "headline": "docs: sync all docs and READMEs with current architecture",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T04:58:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a6c995168bf4f5b0fe479948db18b13d5b1097d",
          "body": "- Remove EnvCommands enum (env env/switch/list/current/shell-integration)\n- fnva env now directly generates shell integration script\n- Remove handle_env_command (95 lines deleted)\n- Update all template comments: fnva env env -> fnva env\n- Update integration.rs hints: fnva env shell-integration -> fnva env\n\nUsage: eval \"$(fnva env)\" (same as fnm env pattern)",
          "is_bot": false,
          "headline": "refactor: simplify env command to fnm-style (fnva env)",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T04:52:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6731e19fb0d58bd24157cd18aa2e4d8662f8726c",
          "body": "Dev",
          "is_bot": false,
          "headline": "Merge pull request #19 from Protagonistss/dev",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T04:37:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b333d1ea0469c58953b3aa98227ccbc6116a1928",
          "body": "… and TSP",
          "is_bot": false,
          "headline": "docs: update technical specifications and READMEs to align with Maven…",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T04:33:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "888f945a34d875f2679046a5e5b5a9837eaa55d3",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.0.70",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T04:11:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08b06feaa5b13a76895e859b9c1ebcb9164cf315",
          "body": "Dead code removed (-704 lines):\n- UnifiedJavaVersion struct (replaced by ResolvedVersion)\n- JavaDownloader trait (replaced by ToolDownloader)\n- DownloadSource struct (unused legacy)\n- pick_best_version / find_best_version (duplicated version selection)\n- JavaManager (legacy, replaced by JavaEnvironm\n[…]\n> --version (aligned with Maven)\n- Removed unused use_on_cd parameter from env env\n\nClippy fixes:\n- redundant closures -> direct function refs\n- sort_by -> sort_by_key\n- All 8 clippy warnings resolved",
          "is_bot": false,
          "headline": "refactor: dead code cleanup + command standardization + clippy fixes",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T03:57:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d9f588c15cab8ca7f8bab96bf949e6bfe8f32059",
          "body": "Each switch script now tracks FNVA_<TOOL>_BIN and removes the previous\npath from PATH before prepending the new one. Prevents PATH bloat from\nrepeated switching (jdk21/bin:jdk17/bin:jdk11/bin:...).\n\nApplied to all 8 templates: bash/fish/powershell/cmd x java/maven.",
          "is_bot": false,
          "headline": "fix: shell switch PATH clean (replace not accumulate)",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T03:29:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e7127c1007576b045d8372996270a770e3125c2",
          "body": "- Tool Source Protocol: 工具无关协议(ToolDescriptor/TemplateVars/\n  MirrorResolver/VersionDiscovery/ToolDownloader),Java/Maven 共用\n- Maven: 镜像目录动态发现 + 清华下载安装 + 环境切换 + CLI\n- Java: 清华 Adoptium 目录动态发现(AdoptiumDiscovery) + filename 解析\n  (major>=9 + jdk8) + 缓存 java_versions.json + 嵌入兜底\n- 移除 LLM(保留 Claude Code),\n[…]\n/Maven/Cc)\n- .fnva 重构: config/state/cache/packages 分组 + 自动迁移\n- 清理死代码: version_registry/template_downloader/version_manager/\n  hook/script_builder/EmbeddedRegistryDiscovery\n- Java 镜像去阿里云(只留清华 + github)",
          "is_bot": false,
          "headline": "feat: Tool Source Protocol + Maven/Java 动态版本管理 + CLI 标准化",
          "author_name": "Protagonistss",
          "author_login": "Protagonistss",
          "committed_at": "2026-06-30T03:03:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a2462a7f9d61abff336016767685fbc7a23c0f3d",
          "body": "docs: 全面修正过时文档,新增 shell 模板系统规格文档",
          "is_bot": false,
          "headline": "Merge pull request #16 from Protagonistss/dev",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-21T13:20:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4ed8cfdd5750cbe1fcc91aa1bafd4e3c665cf36",
          "body": "修正:\n- docs/user-guide/shell-integration.md: 重写,删除废弃的 FNVA_AUTO_MODE 代码,\n  改为 eval \"$(fnva env env --shell bash)\" 动态加载方式\n- docs/spec/shell-integration.md: autoload 示例更新为内联 eval 写法\n- docs/spec/shell-template-system.md: 更新 _FNVA_QUIET 生命周期图,\n  补充 v0.0.65-0.0.69 演进历史和 zsh 变量打印陷阱\n- docs/spec/environment-\n[…]\n量\n\n新增:\n- docs/spec/shell-template-system.md: Shell 模板系统技术规格\n- docs/spec/environment-switching-flow.md: 环境切换端到端流程规格\n- docs/spec/shell-integration.md: Shell 集成机制规格\n- docs/spec/troubleshooting.md: 故障排查手册",
          "is_bot": false,
          "headline": "docs: 全面修正过时文档,新增 shell 模板系统规格文档",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-21T12:57:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "659dc905a63421885080a49103e7b10c3c8f3730",
          "body": "Dev",
          "is_bot": false,
          "headline": "Merge pull request #15 from Protagonistss/dev",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-21T10:47:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62f1de78e0af49afab3d78b41ba8f5820ea07210",
          "body": "正确命令是 fnva env env --shell bash(两个 env),\n第一个 env 是顶级子命令,第二个 env 是 GenerateEnv 子命令。\n\n- Bash: eval \\$(fnva env env --shell bash)\n- Fish: fnva env env --shell fish | source\n- PowerShell: fnva env env --shell powershell | Out-String | Invoke-Expression\n- autoload 改用 eval \\$(command fnva ...) 内联写法\n- 版本升级 0.0.68 → 0.0.69",
          "is_bot": false,
          "headline": "fix(templates): 修正集成脚本注释中 fnva env env 命令缺少第二个 env",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-21T10:33:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b923f9af50236380b6b4e0c326710e92dbcda50a",
          "body": "zsh 会打印所有 var=\\$(command) 赋值语句,包括 temp_file 变量。\n改为 _FNVA_QUIET=1 eval \\$(command fnva ...) 内联写法,不创建任何\n中间变量,从根源消除 zsh 打印变量赋值的问题。\n\n- Bash/Zsh autoload: eval \\$(command fnva ...) >/dev/null 2>&1\n- Fish autoload: 保持 temp_file 方式(Fish 不支持 eval \\$() 语法)\n- 版本升级 0.0.67 → 0.0.68",
          "is_bot": false,
          "headline": "fix(autoload): 用 eval \\$(command) 内联写法彻底消除 zsh 变量打印",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-21T10:29:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fccbee6227f2a8e3b8f1eec3d4f3992c029f119d",
          "body": "zsh 在某些配置下会打印 env_script 变量赋值,eval 重定向无法阻止。\n改用与 wrapper 相同的 temp_file + source 方案,彻底避免变量赋值问题。\n\n- Bash/Zsh: command fnva > $_t; source $_t >/dev/null 2>&1\n- Fish: command fnva > $_t; source $_t >/dev/null 2>&1\n- 版本升级 0.0.66 → 0.0.67",
          "is_bot": false,
          "headline": "fix(autoload): 改用 temp_file + source 替代 eval,消除 zsh 变量打印",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-21T10:16:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab95c792048027058e37ce3991507cc6e0d0272a",
          "body": "zsh 在某些配置下会打印 env_script 变量赋值,仅靠 _FNVA_QUIET\n无法抑制。追加 >/dev/null 确保 autoload 完全静默。\n\n- Bash/Zsh: eval \"$env_script\" >/dev/null\n- Fish: eval \"$env_script\" >/dev/null\n- 版本升级 0.0.65 → 0.0.66",
          "is_bot": false,
          "headline": "fix(autoload): eval 重定向 stdout 到 /dev/null 彻底消除 zsh 变量打印噪音",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-21T10:03:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a28b21ba3663f2c0e65a8e8b2dfd24cb0e3a980",
          "body": "根本原因:_FNVA_QUIET=1 只在调用 fnva 生成脚本时生效,\n但 eval 执行脚本时变量已被清除,导致脚本中的 echo 语句照常输出。\n\n修复方案:\n- Bash: eval 前设置 _FNVA_QUIET=1,eval 后 unset\n- Fish: eval 前设置 _FNVA_QUIET=1,eval 后 set -e\n- PowerShell: 将 Remove-Item 移到 Invoke-Expression 之后\n- 版本升级 0.0.64 → 0.0.65",
          "is_bot": false,
          "headline": "fix(autoload): 修复 _FNVA_QUIET 在 eval 时已失效导致 autoload 输出噪音",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-21T09:35:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "390f57a4b572eed7457f5a092556b3d4b67c013b",
          "body": "- bash_integration.hbs: autoload 加 _FNVA_QUIET=1 + command fnva,wrapper 用 command fnva\n- bash_llm_switch.hbs: echo 输出包裹在 _FNVA_QUIET 检查中,去掉 emoji 统一风格\n- fish_integration.hbs: autoload 加 _FNVA_QUIET 环境变量,加 _restored 汇总输出\n- fish_java_switch.hbs: echo 输出包裹在 _FNVA_QUIET 检查中\n- fish_llm_switch.hbs: 同上,补齐 opus/sonnet/haiku model 变量支持\n- 版本升级 0.0.63 → 0.0.64",
          "is_bot": false,
          "headline": "fix(templates): 同步 Unix shell 模板与 Rust 内联模板,修复 Mac autoload 噪音输出",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-21T09:22:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "18e7b29a35a532c6ce020e973b50c8bf51f25a56",
          "body": "根本原因:\n- Node.js wrapper (fnva.js) 会拦截并简化二进制文件的输出\n- generateSimpleScript() 只生成了部分环境变量设置\n- 缺少 ANTHROPIC_BASE_URL 和 ANTHROPIC_DEFAULT_SONNET_MODEL\n\n修复方案:\n- 在 fnva.js 的 generateSimpleScript() 中添加对\n  ANTHROPIC_BASE_URL 和 ANTHROPIC_DEFAULT_SONNET_MODEL 的支持\n- 同时修复 PowerShell wrapper (fnva.ps1) 的输出处理逻辑\n\n影响范围:\n- npm 全局安装的用户\n- 所有通过 Node.js wrapper 调用 fnva 的场景",
          "is_bot": false,
          "headline": "fix(wrapper): 修复 npm 安装版本的环境变量输出不完整问题",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-21T08:54:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c4579ff6ee7291288f6a52d160d941803cc1d4a",
          "body": "根本原因:\n- CC 环境管理器在生成切换脚本时,config 对象中设置了 'sonnet_model'\n- 但所有 shell 模板期望的是 'default_model'\n- 导致模板条件 {{#if config.default_model}} 永远不满足\n- ANTHROPIC_DEFAULT_SONNET_MODEL 环境变量设置语句被跳过\n\n修复方案:\n- 在 CC 环境管理器中,添加 'default_model' 键,其值为 'sonnet_model'\n- 保持向后兼容,同时支持模板期望的变量名",
          "is_bot": false,
          "headline": "fix(cc): 修复切换 CC 环境时 ANTHROPIC_DEFAULT_SONNET_MODEL 未设置的问题",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-21T08:38:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04c05d481b9ee24b507f6e0ef5bdc2509f08ee7f",
          "body": "- Join fnva.cmd output with -join to convert string[] to single string\n- Fixes Invoke-Expression type mismatch in PowerShell 7",
          "is_bot": false,
          "headline": "fix: PowerShell autoload fnva.cmd output array to string conversion",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-21T08:01:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc6409ef57687e38f23a3eb79e07b66507a98288",
          "body": "- Prevents wrapper from intercepting autoload calls (which caused empty env_script)\n- Bash/Zsh: command fnva, Fish: command fnva, PowerShell: fnva.cmd",
          "is_bot": false,
          "headline": "fix: autoload uses command fnva to bypass shell wrapper function",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-21T06:48:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2dbf44df6ce796b8515c450b2907c97f33e6c2e3",
          "body": "- Add _FNVA_QUIET env var to suppress echo output during autoload\n- Autoload now shows only \"[fnva] restored: glmcc 17\" instead of full details\n- Manual `fnva java use` still shows detailed output\n- Apply quiet mode to all shell templates (Bash/Zsh/PowerShell/Fish)",
          "is_bot": false,
          "headline": "feat: silent autoload on terminal startup with one-line summary",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-21T05:33:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9bcfde034f78b793b782e60b0f081606b895a4b2",
          "body": "Dev",
          "is_bot": false,
          "headline": "Merge pull request #14 from Protagonistss/dev",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-21T05:02:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c1990acb6c4fa85ed1f9fcdab224cf2dfa13a3b",
          "body": "…ment\n\n- Replace fragile PATH reconstruction with safe prepend approach\n- Add java_home path validation before generating switch script\n- Provide actionable error messages when installation is missing or corrupted\n- Fix all shell templates (Bash/Zsh/PowerShell/Fish)",
          "is_bot": false,
          "headline": "fix: prevent PATH corruption on macOS zsh when switching Java environ…",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-21T04:25:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "599bf8c46f992e664abb47bd07f85a123a06b2fc",
          "body": "- 升级 Java 21 至 21.0.10+7,Java 17 至 17.0.18+8\n- 补全 Java 17 的 windows-x64 资源,所有版本对齐清华镜像\n- 修复 tar 解压目标目录不存在的问题\n- 修复 macOS JDK 安装后 find_installed_java 无法找到 Contents/Home 的问题",
          "is_bot": false,
          "headline": "chore(release): 升级版本至 0.0.57",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-21T03:48:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc8519381863ac400065c9ef159bcfbe92ae4d0c",
          "body": "- 更新 package.json 和 Cargo.toml 版本号从 0.0.55 到 0.0.56\n- 修复 Java 安装时 tar 解压目标版本目录不存在的 bug,提前创建版本目录",
          "is_bot": false,
          "headline": "chore(release): 升级版本至 0.0.56",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-21T03:05:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e424babf7720067bccd517941f9b6aaedd61b7a2",
          "body": "docs: modernize documentation and README files",
          "is_bot": false,
          "headline": "Merge pull request #13 from Protagonistss/dev",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-19T10:59:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adb0c56d5cb5cda8319f7663b9ba0e46c8728fcc",
          "body": null,
          "is_bot": false,
          "headline": "docs: modernize README files with new structure and navigation",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-19T10:55:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d385b4d04047edc548c5bf683a640f624e20ec0",
          "body": null,
          "is_bot": false,
          "headline": "docs: add roadmap and contributing guidelines",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-19T10:54:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab3ef2229aa17fe0669a96947cd79fffbf49d31b",
          "body": null,
          "is_bot": false,
          "headline": "docs: add core architecture design document",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-19T10:54:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7e0c7e6a7df252ab20cf0b164072d5559ed36a8",
          "body": null,
          "is_bot": false,
          "headline": "docs: restructure docs directory and move user guides",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-19T10:53:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f19027bc5f30e5acad148fe179320a2269796d70",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): bump version to 0.0.55",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-19T10:34:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ff9cfabf8ca07ca10b2239655c012d357417cf12",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): bump version to 0.0.54",
          "author_name": "huangshan",
          "author_login": "Protagonistss",
          "committed_at": "2026-04-19T10:23:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 86,
      "commits_last_year": 327,
      "latest_release_at": "2026-07-18T16:20:31Z",
      "latest_release_tag": "v0.0.90",
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 13,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 1.9
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 57,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "fnva",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "environment",
            "cli",
            "java",
            "version-manager",
            "llm",
            "command-line-utilities",
            "development-tools"
          ],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/fnva",
          "is_deprecated": false,
          "latest_version": "0.0.90",
          "repository_url": "https://github.com/Protagonistss/fnva",
          "versions_count": 55,
          "total_downloads": 1029,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 180,
          "first_published_at": "2025-12-03T09:34:40.818462Z",
          "latest_published_at": "2026-07-18T17:41:27.945356Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 5
        },
        {
          "name": "fnva",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "environment",
            "java",
            "llm",
            "cli",
            "tool",
            "fnva"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/fnva",
          "is_deprecated": false,
          "latest_version": "0.0.90",
          "repository_url": "https://github.com/Protagonistss/fnva",
          "versions_count": 89,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3833,
          "first_published_at": "2025-11-04T09:04:07.984000Z",
          "latest_published_at": "2026-07-18T16:20:36.223000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 3,
      "watchers": 1,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "Cargo.toml"
      ],
      "largest_source_bytes": 29051,
      "source_files_sampled": 75,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "AGENTS.md"
      ],
      "agent_instruction_max_bytes": 5768
    },
    "dependencies": {
      "manifests": [
        "Cargo.toml",
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "crates",
        "npm"
      ],
      "dependencies": [
        {
          "name": "clap",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "4.5"
        },
        {
          "name": "toml",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "serde",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "dirs",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "6.0"
        },
        {
          "name": "which",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "7.0"
        },
        {
          "name": "reqwest",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "tokio",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "serde_json",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "handlebars",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "4.0"
        },
        {
          "name": "url",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2.5"
        },
        {
          "name": "futures-util",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "indicatif",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.17"
        },
        {
          "name": "zip",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "chrono",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4"
        },
        {
          "name": "thiserror",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "sha2",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.10.9"
        },
        {
          "name": "hex",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4.3"
        },
        {
          "name": "async-trait",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1.89"
        }
      ],
      "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": 23,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 2,
        "closed_unmerged_prs": 4
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "Protagonistss",
          "commits": 326,
          "avatar_url": "https://avatars.githubusercontent.com/u/39770514?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "build.yml",
        "ci.yml",
        "update-versions.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 8,
            "reason": "5 out of 6 merged PRs checked by a CI test -- score normalized to 8",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/6 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 1,
            "reason": "dependency not pinned by hash detected -- score normalized to 1",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "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": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "a9062ef67ca4ae734eed3c4247a4dd7b7b24a83f",
        "ran_at": "2026-07-24T01:05:58Z",
        "aggregate_score": 4.1,
        "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-20T05:47:25Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-18T16:16:01Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/Protagonistss/fnva",
    "host": "github.com",
    "name": "fnva",
    "owner": "Protagonistss"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 59,
      "inputs": {
        "security": 41,
        "vitality": 80,
        "community": 37,
        "governance": 56,
        "engineering": 72
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 80,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 73,
            "inputs": {
              "commits_last_year": 327,
              "human_commit_share": 0.99,
              "days_since_last_push": 5,
              "active_weeks_last_year": 13
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "13/52 weeks with commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 13
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "327 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 327
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 86,
              "latest_release_tag": "v0.0.90",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 1.9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "86 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 86
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.9 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.9
                    }
                  }
                ],
                "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": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 5,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 5 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 37,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 5,
            "inputs": {
              "forks": 0,
              "stars": 3,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "3 stars",
                "points": 4.9,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "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": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "packages": [
                "fnva",
                "fnva"
              ],
              "dependents": null,
              "ecosystems": "crates, npm",
              "total_downloads": 1029,
              "monthly_downloads": 4013
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "4,013 downloads/month across crates, npm",
                "points": 48,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 4013,
                      "ecosystems": "crates, npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 56,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "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 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 79,
            "inputs": {
              "merged_prs": 23,
              "open_issues": 0,
              "closed_issues": 2,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 4
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.8,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "23/27 decided PRs merged",
                "points": 32.6,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 23,
                      "decided": 27
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/6 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 50,
            "inputs": {
              "followers": 10,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "Protagonistss",
              "public_repos": 30,
              "account_age_days": 2976
            },
            "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": "10 followers of Protagonistss",
                "points": 7.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 10,
                      "login": "Protagonistss"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "30 public repos, account ~8 yr old",
                "points": 22.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 30
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 8
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "fnva",
                "fnva"
              ],
              "ecosystems": "crates, npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "2 package(s) on crates, npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 2,
                      "ecosystems": "crates, npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "89 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 89
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 72,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 64,
            "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": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": "5 out of 6 merged PRs checked by a CI test -- score normalized to 8",
                "points": 16,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "topics": [
                "cc",
                "env",
                "java",
                "maven"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "4 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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": 41,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 41,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 4.1
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "5 out of 6 merged PRs checked by a CI test -- score normalized to 8",
                "points": 2,
                "status": "partial",
                "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 0/6 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow 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 1",
                "points": 0.5,
                "status": "partial",
                "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": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 74,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.828,
              "agent_instruction_files": [
                "AGENTS.md"
              ],
              "agent_instruction_max_bytes": 5768
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "82 of 99 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 82,
                      "sampled": 99
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Cargo.toml (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "Cargo.toml"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Rust (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "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 1",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Rust",
              "largest_source_bytes": 29051,
              "source_files_sampled": 75,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Rust (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/75 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 75,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-24T01:06:14.343836Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/p/Protagonistss/fnva.svg",
  "full_name": "Protagonistss/fnva",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte Statistikencrates.io, npm.