Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-23 15:36 UTC

flori / ollama_chat

A command-line interface (CLI) for interacting with an Ollama AI model

RubyMIT★ 3 Sterne⑂ 0 Forksseit Jan. 2025Auf GitHub ansehen ↗

flori/ollama_chat erreicht einen Gesundheitsindex von 56 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (97/100) ab, am schwächsten bei Community & Adoption (34/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

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

56
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

Florian FrankPersönliches Konto
136 Follower124 öffentliche Reposseit Juli 2008

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öffentlicht
RubyGemsollama_chat0.0.100-101vor 0 Tagen

Metriken nach Kategorie

Vitalität

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

97Exzellent · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
31.2/36Commit-Rhythmus — 45/52 Wochen mit Commits
18/18Commit-Volumen — 856 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_year856
human_commit_share1
days_since_last_push0
active_weeks_last_year45

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 99 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 10 Tagen
27/27Release-Rhythmus — ein Release etwa alle 2,9 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count99
latest_release_tagv0.0.99
releases_from_tagsnein
days_since_latest_release10
mean_days_between_releases2,9
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

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

34Gefä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
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein
Wie die Bewertung erfolgt
47.2/80Downloads gesamt — 35.067 Downloads insgesamt über rubygems
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packagesollama_chat
dependents
ecosystemsrubygems
total_downloads35.067
monthly_downloads
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?

41Gefährdet · 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
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
0/46.8Issue-Lösungsquote — keine Issues oder keine Daten
0/38.3PR-Annahme — keine entschiedenen Pull Requests oder keine Daten
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Issue-Lösungsquote, PR-Annahme. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
15.4/25Reichweite des Inhabers — 136 Follower von flori
25/25Kontohistorie — 124 öffentliche Repos, Kontoalter ca. 18 Jahre
Verwendete Eingangsdaten
followers136
owner_typeUser
is_verified
owner_loginflori
public_repos124
account_age_days6.594
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 — 1 Paket(e) auf rubygems
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 0 Tagen
20/20Versionshistorie — 101 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesollama_chat
ecosystemsrubygems
any_deprecatednein
min_days_since_publish0

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

56Mittel · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 1 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — keine Daten
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: CI-Tests. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
30/30README
0/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
0/10Topics
10/10Wiki
Verwendete Eingangsdaten
topics
has_wikija
homepage
has_readmeja
has_docs_dirnein
has_descriptionja

Sicherheit

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

49Gefährdet · 16 % des Gesamtindex

Sicherheitslage

49Gefä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
0/2.5CI-Tests — keine Daten
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
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
0/5Packaging — keine Daten
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — keine Daten
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate4,9
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): ci_tests, packaging, signed_releases. Die verbleibenden Gewichte wurden renormalisiert.

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.

39Gefährdet · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 90 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,9
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
0/11Statische Typprüfung
10/10Reproduzierbare Umgebung — Dockerfile
0/10Belegte Agentenpraxis — keine von Agenten verfassten Commits unter den letzten 100
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfiles
has_dockerfileja
typed_languagenein
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
0/45Typprüfbarer Code — Ruby ohne Typprüfungs-Konfiguration
55/55Handhabbare Dateigrößen — 0/179 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageRuby
largest_source_bytes25.737
source_files_sampled179
oversized_source_files0

Eckdaten

3GitHub-Sterne
1Mitwirkende
856Commits, letzte 12 Monate
0Tage seit letztem Push
99Releases
1Bus-Faktor
0offene Issues
RubyGemsPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

Weitere Details

OpenSSF Scorecard 4.9 / 10
4.9Gesamtwert

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-23 15:36 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
k. A.CI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
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
k. A.Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
10Vulnerabilities0 existing vulnerabilities detected
Alle Abhängigkeiten 0

Vollständig aufgelöster Abhängigkeitssatz aus dem GitHub-Abhängigkeitsgraphen: 0 direkte und 0 indirekte (transitive) Pakete. Die transitive Hülle ist vollständig, wenn das Repository eine Lockfile eincheckt.

RegistryPaketVersionBeziehung
Abhängigkeits-Advisories nicht bewertet

Der Advisory-Abgleich konnte für diesen Bericht nicht ausgeführt werden: No resolved dependencies to assess

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 2810,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "HTML": 28608,
        "Ruby": 844792,
        "Shell": 97,
        "PostScript": 90
      },
      "pushed_at": "2026-07-23T15:34:06Z",
      "created_at": "2025-01-29T16:32:46Z",
      "owner_type": "User",
      "updated_at": "2026-07-23T15:34:53Z",
      "description": "A command-line interface (CLI) for interacting with an Ollama AI model",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "Ruby",
      "significant_languages": [
        "Ruby"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Florian Frank",
      "type": "User",
      "login": "flori",
      "company": null,
      "location": "Berlin, Germany",
      "followers": 136,
      "avatar_url": "https://avatars.githubusercontent.com/u/15918?v=4",
      "created_at": "2008-07-03T14:17:21Z",
      "is_verified": null,
      "public_repos": 124,
      "account_age_days": 6594
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.0.99",
          "kind": "patch",
          "published_at": "2026-07-13T07:49:10Z"
        },
        {
          "tag": "v0.0.98",
          "kind": "patch",
          "published_at": "2026-07-09T07:33:46Z"
        },
        {
          "tag": "v0.0.97",
          "kind": "patch",
          "published_at": "2026-07-06T21:31:23Z"
        },
        {
          "tag": "v0.0.96",
          "kind": "patch",
          "published_at": "2026-07-03T07:32:16Z"
        },
        {
          "tag": "v0.0.95",
          "kind": "patch",
          "published_at": "2026-06-29T07:53:05Z"
        },
        {
          "tag": "v0.0.94",
          "kind": "patch",
          "published_at": "2026-06-22T08:03:31Z"
        },
        {
          "tag": "v0.0.93",
          "kind": "patch",
          "published_at": "2026-06-21T12:06:08Z"
        },
        {
          "tag": "v0.0.92",
          "kind": "patch",
          "published_at": "2026-06-19T17:52:34Z"
        },
        {
          "tag": "v0.0.91",
          "kind": "patch",
          "published_at": "2026-06-17T17:35:34Z"
        },
        {
          "tag": "v0.0.90",
          "kind": "patch",
          "published_at": "2026-06-17T10:03:36Z"
        },
        {
          "tag": "v0.0.89",
          "kind": "patch",
          "published_at": "2026-06-15T00:47:53Z"
        },
        {
          "tag": "v0.0.88",
          "kind": "patch",
          "published_at": "2026-06-03T10:45:12Z"
        },
        {
          "tag": "v0.0.87",
          "kind": "patch",
          "published_at": "2026-05-28T23:07:07Z"
        },
        {
          "tag": "v0.0.86",
          "kind": "patch",
          "published_at": "2026-04-02T08:53:33Z"
        },
        {
          "tag": "v0.0.85",
          "kind": "patch",
          "published_at": "2026-03-29T00:06:48Z"
        },
        {
          "tag": "v0.0.84",
          "kind": "patch",
          "published_at": "2026-03-26T10:10:41Z"
        },
        {
          "tag": "v0.0.83",
          "kind": "patch",
          "published_at": "2026-03-24T00:04:13Z"
        },
        {
          "tag": "v0.0.82",
          "kind": "patch",
          "published_at": "2026-03-21T22:07:25Z"
        },
        {
          "tag": "v0.0.81",
          "kind": "patch",
          "published_at": "2026-03-19T23:03:47Z"
        },
        {
          "tag": "v0.0.80",
          "kind": "patch",
          "published_at": "2026-03-19T01:16:02Z"
        },
        {
          "tag": "v0.0.79",
          "kind": "patch",
          "published_at": "2026-03-13T00:43:00Z"
        },
        {
          "tag": "v0.0.78",
          "kind": "patch",
          "published_at": "2026-03-11T08:41:33Z"
        },
        {
          "tag": "v0.0.77",
          "kind": "patch",
          "published_at": "2026-03-09T17:24:32Z"
        },
        {
          "tag": "v0.0.76",
          "kind": "patch",
          "published_at": "2026-03-09T10:26:44Z"
        },
        {
          "tag": "v0.0.75",
          "kind": "patch",
          "published_at": "2026-03-08T19:58:29Z"
        },
        {
          "tag": "v0.0.74",
          "kind": "patch",
          "published_at": "2026-03-06T09:59:33Z"
        },
        {
          "tag": "v0.0.73",
          "kind": "patch",
          "published_at": "2026-03-05T08:33:33Z"
        },
        {
          "tag": "v0.0.72",
          "kind": "patch",
          "published_at": "2026-03-04T12:07:52Z"
        },
        {
          "tag": "v0.0.71",
          "kind": "patch",
          "published_at": "2026-02-26T07:17:12Z"
        },
        {
          "tag": "v0.0.70",
          "kind": "patch",
          "published_at": "2026-02-23T19:52:25Z"
        },
        {
          "tag": "v0.0.69",
          "kind": "patch",
          "published_at": "2026-02-22T23:13:42Z"
        },
        {
          "tag": "v0.0.68",
          "kind": "patch",
          "published_at": "2026-02-19T09:17:51Z"
        },
        {
          "tag": "v0.0.67",
          "kind": "patch",
          "published_at": "2026-02-18T07:50:13Z"
        },
        {
          "tag": "v0.0.66",
          "kind": "patch",
          "published_at": "2026-02-16T06:22:53Z"
        },
        {
          "tag": "v0.0.65",
          "kind": "patch",
          "published_at": "2026-02-09T23:40:16Z"
        },
        {
          "tag": "v0.0.64",
          "kind": "patch",
          "published_at": "2026-02-09T15:39:34Z"
        },
        {
          "tag": "v0.0.63",
          "kind": "patch",
          "published_at": "2026-02-09T21:38:06Z"
        },
        {
          "tag": "v0.0.62",
          "kind": "patch",
          "published_at": "2026-02-07T01:13:14Z"
        },
        {
          "tag": "v0.0.61",
          "kind": "patch",
          "published_at": "2026-02-06T10:13:52Z"
        },
        {
          "tag": "v0.0.60",
          "kind": "patch",
          "published_at": "2026-02-05T23:34:28Z"
        },
        {
          "tag": "v0.0.59",
          "kind": "patch",
          "published_at": "2026-02-05T11:41:19Z"
        },
        {
          "tag": "v0.0.58",
          "kind": "patch",
          "published_at": "2026-02-02T09:32:55Z"
        },
        {
          "tag": "v0.0.57",
          "kind": "patch",
          "published_at": "2026-01-21T18:49:08Z"
        },
        {
          "tag": "v0.0.56",
          "kind": "patch",
          "published_at": "2026-01-17T11:18:48Z"
        },
        {
          "tag": "v0.0.55",
          "kind": "patch",
          "published_at": "2026-01-08T22:52:41Z"
        },
        {
          "tag": "v0.0.54",
          "kind": "patch",
          "published_at": "2026-01-08T19:12:48Z"
        },
        {
          "tag": "v0.0.53",
          "kind": "patch",
          "published_at": "2026-01-07T12:41:18Z"
        },
        {
          "tag": "v0.0.52",
          "kind": "patch",
          "published_at": "2026-01-06T10:18:50Z"
        },
        {
          "tag": "v0.0.51",
          "kind": "patch",
          "published_at": "2026-01-05T23:21:30Z"
        },
        {
          "tag": "v0.0.50",
          "kind": "patch",
          "published_at": "2026-01-03T13:01:56Z"
        },
        {
          "tag": "v0.0.49",
          "kind": "patch",
          "published_at": "2025-12-23T23:32:29Z"
        },
        {
          "tag": "v0.0.48",
          "kind": "patch",
          "published_at": "2025-12-23T02:16:57Z"
        },
        {
          "tag": "v0.0.47",
          "kind": "patch",
          "published_at": "2025-12-23T00:52:23Z"
        },
        {
          "tag": "v0.0.46",
          "kind": "patch",
          "published_at": "2025-12-20T01:29:43Z"
        },
        {
          "tag": "v0.0.45",
          "kind": "patch",
          "published_at": "2025-12-10T09:25:22Z"
        },
        {
          "tag": "v0.0.44",
          "kind": "patch",
          "published_at": "2025-12-10T00:28:40Z"
        },
        {
          "tag": "v0.0.43",
          "kind": "patch",
          "published_at": "2025-12-09T12:32:43Z"
        },
        {
          "tag": "v0.0.42",
          "kind": "patch",
          "published_at": "2025-12-03T20:36:28Z"
        },
        {
          "tag": "v0.0.41",
          "kind": "patch",
          "published_at": "2025-11-20T12:56:28Z"
        },
        {
          "tag": "v0.0.40",
          "kind": "patch",
          "published_at": "2025-11-20T10:01:12Z"
        },
        {
          "tag": "v0.0.39",
          "kind": "patch",
          "published_at": "2025-11-14T04:23:41Z"
        },
        {
          "tag": "v0.0.38",
          "kind": "patch",
          "published_at": "2025-11-11T18:46:47Z"
        },
        {
          "tag": "v0.0.37",
          "kind": "patch",
          "published_at": "2025-10-31T02:16:38Z"
        },
        {
          "tag": "v0.0.36",
          "kind": "patch",
          "published_at": "2025-10-10T23:15:56Z"
        },
        {
          "tag": "v0.0.35",
          "kind": "patch",
          "published_at": "2025-09-18T20:18:17Z"
        },
        {
          "tag": "v0.0.34",
          "kind": "patch",
          "published_at": "2025-09-17T01:02:17Z"
        },
        {
          "tag": "v0.0.33",
          "kind": "patch",
          "published_at": "2025-09-15T19:04:02Z"
        },
        {
          "tag": "v0.0.32",
          "kind": "patch",
          "published_at": "2025-09-15T17:26:16Z"
        },
        {
          "tag": "v0.0.31",
          "kind": "patch",
          "published_at": "2025-09-15T16:04:55Z"
        },
        {
          "tag": "v0.0.30",
          "kind": "patch",
          "published_at": "2025-09-11T08:10:04Z"
        },
        {
          "tag": "v0.0.29",
          "kind": "patch",
          "published_at": "2025-09-07T23:37:29Z"
        },
        {
          "tag": "v0.0.28",
          "kind": "patch",
          "published_at": "2025-09-07T22:28:38Z"
        },
        {
          "tag": "v0.0.27",
          "kind": "patch",
          "published_at": "2025-09-04T23:49:22Z"
        },
        {
          "tag": "v0.0.26",
          "kind": "patch",
          "published_at": "2025-08-27T00:46:18Z"
        },
        {
          "tag": "v0.0.25",
          "kind": "patch",
          "published_at": "2025-08-18T19:03:22Z"
        },
        {
          "tag": "v0.0.24",
          "kind": "patch",
          "published_at": "2025-08-17T00:11:14Z"
        },
        {
          "tag": "v0.0.23",
          "kind": "patch",
          "published_at": "2025-08-17T00:07:44Z"
        },
        {
          "tag": "v0.0.22",
          "kind": "patch",
          "published_at": "2025-08-13T12:37:16Z"
        },
        {
          "tag": "v0.0.21",
          "kind": "patch",
          "published_at": "2025-08-11T11:15:10Z"
        },
        {
          "tag": "v0.0.20",
          "kind": "patch",
          "published_at": "2025-08-11T00:08:13Z"
        },
        {
          "tag": "v0.0.19",
          "kind": "patch",
          "published_at": "2025-08-10T22:49:08Z"
        },
        {
          "tag": "v0.0.18",
          "kind": "patch",
          "published_at": "2025-07-31T12:16:27Z"
        },
        {
          "tag": "v0.0.17",
          "kind": "patch",
          "published_at": "2025-09-07T22:29:35Z"
        },
        {
          "tag": "v0.0.16",
          "kind": "patch",
          "published_at": "2025-09-07T22:29:53Z"
        },
        {
          "tag": "v0.0.15",
          "kind": "patch",
          "published_at": "2025-09-07T22:30:09Z"
        },
        {
          "tag": "v0.0.14",
          "kind": "patch",
          "published_at": "2025-09-07T22:30:27Z"
        },
        {
          "tag": "v0.0.13",
          "kind": "patch",
          "published_at": "2025-09-07T22:30:39Z"
        },
        {
          "tag": "v0.0.12",
          "kind": "patch",
          "published_at": "2025-09-07T22:30:52Z"
        },
        {
          "tag": "v0.0.11",
          "kind": "patch",
          "published_at": "2025-09-07T22:31:07Z"
        },
        {
          "tag": "v0.0.10",
          "kind": "patch",
          "published_at": "2025-09-07T22:31:22Z"
        },
        {
          "tag": "v0.0.9",
          "kind": "patch",
          "published_at": "2025-09-07T22:31:39Z"
        },
        {
          "tag": "v0.0.8",
          "kind": "patch",
          "published_at": "2025-09-07T22:31:50Z"
        },
        {
          "tag": "v0.0.7",
          "kind": "patch",
          "published_at": "2025-09-07T22:32:19Z"
        },
        {
          "tag": "v0.0.6",
          "kind": "patch",
          "published_at": "2025-09-07T22:32:37Z"
        },
        {
          "tag": "v0.0.5",
          "kind": "patch",
          "published_at": "2025-09-07T22:32:51Z"
        },
        {
          "tag": "v0.0.4",
          "kind": "patch",
          "published_at": "2025-09-07T22:33:24Z"
        },
        {
          "tag": "v0.0.3",
          "kind": "patch",
          "published_at": "2025-09-07T22:33:42Z"
        },
        {
          "tag": "v0.0.2",
          "kind": "patch",
          "published_at": "2025-09-07T22:33:54Z"
        },
        {
          "tag": "v0.0.1",
          "kind": "patch",
          "published_at": "2025-09-07T22:34:08Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "736849a7f6279def2631f038e5a2d3acf051b355",
          "body": null,
          "is_bot": false,
          "headline": "Add to changes",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-23T14:03:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "789e6e17d5e8b1f6d887cf90ddbcb13a237759eb",
          "body": "- Created `lib/ollama_chat/uuid_v7.rb` providing\n  `OllamaChat::UUIDV7.generate`, which uses native\n  `SecureRandom.uuid_v7` for Ruby **3.3**+ and a custom RFC 9562\n  compliant implementation for older versions.\n- Required `ollama_chat/uuid_v7` in `lib/ollama_chat.rb`.\n- Updated `OllamaChat::Chat#in\n[…]\npec/ollama_chat/follow_chat_spec.rb`,\n  `spec/ollama_chat/message_list_spec.rb`, and\n  `spec/ollama_chat/session_management_spec.rb` to utilize the new\n  `OllamaChat::UUIDV7.generate` method in tests.",
          "is_bot": false,
          "headline": "Implement UUID v7 compatibility shim",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-23T14:03:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "88b9fcb573b7b9090a4ae7fd7aa89d20f1edbc84",
          "body": "- Updated `embed_source` in `lib/ollama_chat/source_fetching.rb` to map\n  `inputs` and prepend the `source` identifier to each chunk before\n  persistence.\n- Added a new test case to `spec/ollama_chat/source_fetching_spec.rb`\n  verifying that embedded chunks correctly include the source metadata\n  for improved retrieval precision.",
          "is_bot": false,
          "headline": "Prepend source metadata to document embeddings",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-23T14:03:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cdafacc3842d9ac814b3c3e36c7da4c28df68984",
          "body": "- Added `epub_read` to `lib/ollama_chat/parsing.rb` to extract text from\n  EPUB files using `pandoc`.\n- Updated `parse_source` in `lib/ollama_chat/parsing.rb` to handle the\n  `application/epub+zip` MIME type.\n- Optimized `ps_read` in `lib/ollama_chat/parsing.rb` by replacing the\n  manual read loop w\n[…]\nt.\n- Updated `spec/ollama_chat/parsing_spec.rb` to include EPUB parsing\n  tests and update the asset list.\n- Adjusted the expected file count in\n  `spec/ollama_chat/tools/directory_structure_spec.rb`.",
          "is_bot": false,
          "headline": "Implement EPUB support and optimize PS reading",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-23T14:03:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f36852523117c05934396bfe543d89451f4dbff2",
          "body": "- Implemented JSON formatter in `OllamaChat::Logging` to serialize log\n  entries as JSON objects.\n- Added `data:` keyword argument to `log` method for passing structured\n  context.\n- Updated all tool error logs to include tool name and relevant\n  parameters in `data:`.\n- Refactored core logging call\n[…]\n data payloads.\n- Improved exception logging by capturing backtraces separately in the\n  `data:` payload.\n- Updated `follow_chat.rb` to log tool execution details, reasons, and\n  results structurally.",
          "is_bot": false,
          "headline": "Add structured JSON logging with data payloads",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-23T14:03:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6497d881a142a8eb9e848e68e6ea47d374cb598d",
          "body": "- Added `base64url` alphabet support to `generate_password`, mapping to\n  `Tins::Token::BASE64_URL_FILENAME_SAFE_ALPHABET`.\n- Updated `alphabet_type` parameter description in `generate_password`\n  to include `base64url`.\n- Added critical security guidance to `generate_password` description to\n  prev\n[…]\ng `eval_ruby` with `rand` or `SecureRandom` for\n  secrets.\n- Updated `eval_ruby` description to discourage its use for generating\n  secure passwords or secrets, directing users to `generate_password`.",
          "is_bot": false,
          "headline": "Add base64url alphabet and tool security warnings",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-23T14:03:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1467ac9308706bbc11ea802a1c970d1d7037ac97",
          "body": "- Updated `help` strings for `copy`, `paste`, `config`,\n  `document_policy`, `toggle`, `favourite`, `model`, `system`, `think`,\n  `context_format`, `tools`, `voice`, `session`, `list`, `last`, `drop`,\n  `clear`, `links`, `regenerate`, `prompt`, `suggest`,\n  `change_response`, `conversation`, `collec\n[…]\nlike `(undo)` to `drop` and `(alias for /clear\n  links)` to `links`.\n- Updated `input` command options to use a multi-line heredoc format.\n- Removed `context_spook` mention from `context_format` help.",
          "is_bot": false,
          "headline": "Refactor command help with emojis and concise format",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-23T14:03:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8afb5eb2820a2e4a2cecafe6f268d3fc4496e628",
          "body": "- Add `OllamaChatQuitError` class to signal graceful shutdown of the\n  application\n- Refactor `/quit` command and `Chat#handle_input` to use\n  exception-based control flow via `OllamaChatQuitError`\n- Add `[QUIT-APP]` option to session chooser after deletion to allow\n  immediate exit\n- Update `choose_session` to support `exit_app` flag and return\n  `:quit_app`\n- Update specs to verify new error handling for `/quit` command\n- Add YARD documentation for `OllamaChatQuitError` and `quit_app` method",
          "is_bot": false,
          "headline": "Refactor application exit flow and add session quit option",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-23T14:03:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "173e0c1da3f157092b71350a962931e899c5ac56",
          "body": "- Refactor `PromptHandling` and management modules to support dynamic\n  `context` parameters, defaulting to `'prompt'`\n- Restructure `default_config.yml` to nest prompts under `prompt:`,\n  `suggest:`, and `system:` contexts\n- Simplify `/system` command to `change` and delegate CRUD operations to\n  `\n[…]\n refactoring plan to reflect the new context\n  architecture\n- Add `-f` force flag to `/prompt delete` for bypassing confirmations\n- Purge orphaned CRUD and helper methods from `SystemPromptManagement`",
          "is_bot": false,
          "headline": "Unify prompt management and refactor CLI commands",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-23T14:03:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0dc60f328e3416bbc0b0c595f6c249f09a91e292",
          "body": "- Refactor `PromptHandling` to use a unified `context:` keyword argument\n  for `prompt`, `each_prompt`, `delete_prompt`, `store_prompt`, and\n  `write_prompt` methods.\n- Remove redundant `system_prompt`, `store_system_prompt`,\n  `delete_system_prompt`, and `each_system_prompt` methods.\n- Update `SystemPromptManagement` and `MessageList` to use the new\n  `prompt` API with `context: 'system_prompt'`.\n- Adjust `message_list_spec` mocks to align with the updated `prompt`\n  signature.",
          "is_bot": false,
          "headline": "Consolidate prompt API using context keyword argument",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-23T14:03:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c0ab01a95a744666be26fff603aa0cfb24818af",
          "body": "- Update `extract_range` in `ReadFile` to return total line count\n  alongside content when line numbers are requested.\n- Include `line_count` in the JSON response hash from the `read_file`\n  tool execution.\n- Add test expectations for `line_count` across `read_file_spec` to\n  verify correct values or `nil`.",
          "is_bot": false,
          "headline": "Add line count to read_file tool response",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-23T14:03:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fbc214ed8b58b3c2834e94d044e616e4d7311a4b",
          "body": "- Add `mtime` and `line_count` parameters to `patch_file` tool\n  definition.\n- Implement freshness verification in `execute` to ensure file state\n  matches the latest read.\n- Update `read_file` to return `mtime` formatted with `iso8601(0)` for\n  consistency.\n- Adjust specs to pass required arguments and update token generation\n  bits to **128**.",
          "is_bot": false,
          "headline": "Add patch file freshness check to prevent stale context",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-23T14:03:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ead1256c6103aea69701f1303ba69a941a482e6d",
          "body": "- Replace `content_unchanged` with `patch_feedback` in\n  `lib/ollama_chat/tools/patch_file.rb` to capture specific user reasons\n  for patch rejection.\n- Update `OllamaChat::Tools::PatchFile#execute` to return a detailed\n  rejection message using the captured feedback.\n- Modify `OllamaChat::Tools::PatchFile#apply_patch` to prompt the user\n  for feedback via `chat.ask?` when a file remains unchanged after a\n  diff session.\n- Clean up whitespace in `spec/ollama_chat/tools/patch_file_spec.rb`.",
          "is_bot": false,
          "headline": "Improve `patch_file` feedback loop",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-23T14:03:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "472ff88f3c1c5d481c4625de1dae272a3bc92967",
          "body": "- Update `ollama-ruby` to **1.23** and `tins` to **1.54** in `Rakefile`.\n- Refactor `OllamaChat::Tools::PatchFile` to support targeted line-range\n  replacements via a new `edits` parameter, replacing full-content\n  updates.\n- Implement the `apply_edits` method with reverse-order application and\n  ov\n[…]\n shift\n  toward coordinate-based patching.\n- Rewrite tests in `spec/ollama_chat/tools/patch_file_spec.rb` to verify\n  precision patching, range boundaries, and error handling for\n  overlapping blocks.",
          "is_bot": false,
          "headline": "Refactor patch_file tool for coordinate patching",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-23T14:03:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0bdbfc5d8d939f015dbdf75faaeb38cf3db7df30",
          "body": "- Add `initialize_group_uuid` method with YARD documentation in\n  `lib/ollama_chat/message.rb`\n- Implement safety guard for `group_time` when `group_uuid` is `nil` in\n  `lib/ollama_chat/message.rb`\n- Use `.initialize_group_uuid` during system message creation in\n  `lib/ollama_chat/message_list.rb`\n- Simplify `group_uuid` assignment via `.initialize_group_uuid` in\n  `lib/ollama_chat/session_management.rb`",
          "is_bot": false,
          "headline": "Refactor `group_uuid` initialization logic",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-20T20:46:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3755dda1735bc665ca681c940d91bb1a238579e5",
          "body": "- Add tests to `spec/ollama_chat/session_management_spec.rb` covering\n  `#previous_session`, `#choose_session`, and `#preferred_session`.\n- Verify message and link persistence via `#store_messages_in_session`,\n  `#store_links_in_session`, and `#load_links_from_session`.\n- Test session lifecycle meth\n[…]\n`#change_session`.\n- Add specs for utility and display methods such as `#list_sessions`,\n  `#show_session`, `#derive_session_name`, `#summarize_session`, and\n  `#determine_valid_new_name_for_session`.",
          "is_bot": false,
          "headline": "Add comprehensive specs for session management",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-20T18:41:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b5c96c4082264f55ab5bed3a40479f7d67a213e4",
          "body": "- Refactor `lib/ollama_chat/follow_chat.rb` to use a named capture group\n  in the regex for detecting and extracting namespaced tool calls.\n- Replace the usage of `File.basename` by leveraging Ruby's automatic\n  local variable assignment via the `new_name` capture group.",
          "is_bot": false,
          "headline": "Simplify namespaced tool call resolution",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-19T23:18:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa9e8f624c174c87f581108ca9c9c2e84b393f8a",
          "body": "- Added `mtime` using ISO8601 format to the success return hash of\n  `OllamaChat::Tools::ReadFile#execute` in\n  `lib/ollama_chat/tools/read_file.rb`.\n- Updated multiple test cases in\n  `spec/ollama_chat/tools/read_file_spec.rb` to validate the presence\n  and format of the `mtime` field.",
          "is_bot": false,
          "headline": "Add file modification time to `ReadFile` response",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-19T21:53:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6ed674de9a8f5d9c54e65ddbc539b71b7ee71bff",
          "body": "- Updated `spec/ollama_chat/tools/write_file_spec.rb` to use randomly\n  generated filenames via `Tins::Token` instead of static paths.\n- Refactored test cases for overwrite and append modes to utilize the\n  new dynamic `test_write_file` variable, preventing potential file\n  collisions.",
          "is_bot": false,
          "headline": "Use dynamic filenames in `write_file` specs",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-19T21:49:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "384b4a5a437fa82aa59714c973c0ec335a602081",
          "body": "- Updated `lib/ollama_chat/tools/copy_to_clipboard.rb` to remove the\n  last reply fallback from the `text` parameter description.\n- Refactored `lib/ollama_chat/tools/paste_into_editor.rb` to make `text`\n  a required parameter and removed logic for using the last assistant\n  response.\n- Removed obsolete test cases in\n  `spec/ollama_chat/tools/paste_into_editor_spec.rb` that verified\n  behavior without explicit text.",
          "is_bot": false,
          "headline": "Remove implicit fallback to last response in tools",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-19T21:15:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d501fe625d8006c04958f4a960100d2b9d7de448",
          "body": "- Introduced `reconfigure_model_options` in\n  `lib/ollama_chat/model_handling.rb`.\n- Extracted logic for managing default and session model options from\n  `use_model`.\n- Updated `use_model` to trigger `reconfigure_model_options` when the\n  current model changes.",
          "is_bot": false,
          "headline": "Refactor model option reconfiguration",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-19T21:07:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6d6565764b6b156725c3471d2169a1085e41e6ba",
          "body": "- Introduce `call_ollama_chat` in `lib/ollama_chat/chat.rb` to\n  centralize logging of request arguments.\n- Replace direct calls to `ollama.chat` with the new `call_ollama_chat`\n  wrapper.",
          "is_bot": false,
          "headline": "Add logging wrapper for Ollama chat requests",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-19T19:38:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "76edde4d4aad5992dd0e66a427bc7a3d7fe5c2a7",
          "body": "- Introduce `group_uuid` in `OllamaChat::Message` and update `as_json`\n  for persistence.\n- Add `each_group` to `OllamaChat::MessageList` and refactor `drop` to\n  use UUID-based exchanges instead of role sequences.\n- Implement `repair_group_uuids` in `OllamaChat::SessionManagement` to\n  retroactivel\n[…]\ngement_spec.rb` to verify structural\n  migration and UUID propagation logic.\n- Update `spec/ollama_chat/message_list_spec.rb` and\n  `spec/ollama_chat/follow_chat_spec.rb` to support group identifiers.",
          "is_bot": false,
          "headline": "Implement conversation grouping via group_uuid",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-19T02:29:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "21ec1c01c7c8900db692f06ebff69ad36fe0b019",
          "body": "- Added test for extracting a line range with `start_line`, `end_line`,\n  and `line_numbers` in `spec/ollama_chat/tools/read_file_spec.rb`\n- Uses `example.csv` asset containing John Doe, Jane Smith, and other\n  sample records",
          "is_bot": false,
          "headline": "Support `read_file` with range and line numbers",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-17T11:46:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3240860abde9565d42cf6521ad4a7925a032b5fa",
          "body": "- Updated `lib/ollama_chat/model_handling.rb` to defensively handle\n  `JSON.load` results.\n- Added `.full? || {}` fallback to prevent `nil` or empty hash\n  propagation in `edit_session_model_options`.\n- Ensures `model_options` is always a clean `Hash` before calling\n  `session.update`.",
          "is_bot": false,
          "headline": "Add full? check to JSON.load in model handling",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-17T11:01:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d9aac92fe8406e61218486779340c0d2ab68a16",
          "body": "- Added `line_numbers` boolean parameter to the `read_file` tool\n  definition in `lib/ollama_chat/tools/read_file.rb`.\n- Updated `OllamaChat::Tools::ReadFile#execute` to extract and return\n  the `line_numbers` argument.\n- Refactored `OllamaChat::Tools::ReadFile#extract_range` to remove\n  recursion a\n[…]\nixing based on the `line_numbers`\n  flag.\n- Updated `spec/ollama_chat/tools/read_file_spec.rb` by adding\n  `line_numbers` to mock arguments and introducing tests for prefixed\n  and raw content output.",
          "is_bot": false,
          "headline": "Add line numbering to read_file tool",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-17T11:01:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "56ccc6a02dce093dd282e3be4b6b8f4aa17b21ac",
          "body": "- Implement `chat.log(:error, e)` in the `rescue` blocks of all 33 tools\n  within `lib/ollama_chat/tools/`.\n- Update `OllamaChat::Tools::GemPathLookup#lookup_gem_path` and its\n  corresponding YARD documentation to accept a `chat` instance for\n  logging.\n- Standardize the capture of the `chat` object\n[…]\n `opts[:chat]` at the\n  beginning of all `execute` methods.\n- Update tool specifications in `spec/ollama_chat/tools/` to inject a\n  `chat` instance into `execute` calls, ensuring test suite stability.",
          "is_bot": false,
          "headline": "Add error logging to all tool execute methods",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-17T11:01:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2d05b1d44827403028f372a45a6bebc0f71ae2a4",
          "body": "- Implement source selection menu (`[CLIPBOARD]`, `[FILES]`,\n  `[EMPTY/MANUAL]`) in `add_persona` within\n  `lib/ollama_chat/personae_management.rb`.\n- Implement source selection menu (`[CLIPBOARD]`, `[FILES]`,\n  `[EMPTY/MANUAL]`) in `add_new_prompt` within\n  `lib/ollama_chat/prompt_management.rb`.\n-\n[…]\n_management.rb`.\n- Standardize naming validation by delegating to\n  `determine_valid_new_name_for_persona`,\n  `determine_valid_new_name_for_prompt`, and\n  `determine_valid_new_name_for_system_prompt`.",
          "is_bot": false,
          "headline": "Standardize creation workflow for prompts and personae",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-15T22:52:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "47b5d6792adb696d38de921422a9bece88baefea",
          "body": "- Users now see the `ollama_chat` version **VERSION**, connected server\n  version, and server URL immediately upon starting a session.\n- Extracted the welcome message logic into a new `print_welcome` method\n  in `OllamaChat::Information` for better reusability.\n- Updated `OllamaChat::Chat` to call `print_welcome` during the startup\n  sequence.",
          "is_bot": false,
          "headline": "Add a welcome message to the chat initialization",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-15T00:13:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bab02ed3c93637224ae2c9b4a1ca26f73d62e293",
          "body": "- Remove the call to `info_session` in `OllamaChat::Chat#initialize`,\n  reducing unnecessary console noise during startup.",
          "is_bot": false,
          "headline": "Remove session info output during initialization",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-15T00:13:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a45264b742d8fd0ae202efc4c0d705ca91919bee",
          "body": "- Updated the project version from **0.0.99** to **0.0.100** in\n  `VERSION`, `lib/ollama_chat/version.rb`, and `ollama_chat.gemspec`.",
          "is_bot": false,
          "headline": "Bump version to **0.0.100**",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-14T17:49:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd55c080989e53a2bdd131b1a911e459b8f9cdb7",
          "body": "- Update `-m` flag help text in `lib/ollama_chat/information.rb`.\n- Add `git_sha` and `git_sha_short` retrieval logic in\n  `lib/ollama_chat/information.rb`.\n- Include current SHA details in the prompt template within\n  `lib/ollama_chat/ollama_chat_config/default_config.yml`.",
          "is_bot": false,
          "headline": "Add git SHA to session info and prompts",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-14T09:52:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5f45cd137045fd7a73faabdc2c6ebd8e3f4bd86",
          "body": null,
          "is_bot": false,
          "headline": "Add to changes",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-13T07:48:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c54425ced4c4df6eac20c5004fccdd9792b78892",
          "body": "- Update `VERSION` and `OllamaChat::VERSION` to **0.0.99**.\n- Update the `ollama_chat.gemspec` file to reflect version **0.0.99**.",
          "is_bot": false,
          "headline": "Bump version to **0.0.99**",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-13T07:46:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6768e8190a418764af02969172033dc6a698c157",
          "body": "- Update regexes for `/system`, `/session`, `/prompt`, `/conversation`,\n  `/character`, `/input`, `/pipe`, and `/output` in\n  `lib/ollama_chat/commands.rb` to prevent positional arguments from\n  starting with a hyphen.\n- Enhance the warning message in `lib/ollama_chat/message_list.rb` by\n  adding explicit suggestions for `/drop` and `/regenerate`.",
          "is_bot": false,
          "headline": "Prevent leading hyphens in command args and refine UX",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-12T21:22:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f5e5761fcf5903ab6018feec2adf15c093baa67",
          "body": "- In `lib/ollama_chat/chat.rb`, updated the `generate` method to capture\n  output in `content` and added conditional logging that emits a `:warn`\n  level log if the result is empty, otherwise an `:info` level log.\n- In `lib/ollama_chat/prompt_management.rb`, introduced `.full? or\n  return` guard clauses for `edit_text('')` and `generate(prompt:\n  full_prompt)` to ensure processing only continues with non-empty\n  strings.",
          "is_bot": false,
          "headline": "Improve LLM generation logging and prompt guards",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-11T18:23:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e9959353a2ee86e7ef6bada884f5d30910c29bcd",
          "body": "- Update `lib/ollama_chat/personae_management.rb` to use keyword\n  argument shorthand in `set_default_persona_name` and `load_personae`.\n- Apply shorthand for the `default` parameter in\n  `lib/ollama_chat/prompt_management.rb` within the `choose_prompt`\n  method.\n- Use shorthand for `argv` when inst\n[…]\n/tools/execute_ri_spec.rb` to use shorthand\n  for the `topic` parameter.\n- Apply keyword argument shorthand for the `url` parameter across\n  multiple tests in `spec/ollama_chat/tools/get_url_spec.rb`.",
          "is_bot": false,
          "headline": "Use Ruby shorthand for keyword arguments",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-11T14:44:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "65348cbb2949fe7b2001b242992a0832e4c0e167",
          "body": "- Update `OllamaChat::Tools::CopyToClipboard` to mark the `text`\n  parameter as required in its function definition.\n- Modify the `execute` method in\n  `lib/ollama_chat/tools/copy_to_clipboard.rb` to raise a\n  `OllamaChat::ToolFunctionArgumentError` when `text` is not provided.\n- Simplify the succes\n[…]\nonly\n  specific text can now be copied.\n- Update `spec/ollama_chat/tools/copy_to_clipboard_spec.rb` to test for\n  the new argument error and ensure all functional tests provide a valid\n  `text` value.",
          "is_bot": false,
          "headline": "Make `text` required for `copy_to_clipboard` tool",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-11T14:44:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "feb6d20091ed0526362d4ec8c94759f92bdf1dfc",
          "body": "- Refactor `suggest_coding` in `default_config.yml` to adopt a Senior\n  Software Architect and Technical Auditor persona, requiring 8\n  categorized professional engineering prompts.\n- Refactor `suggest_roleplaying` in `default_config.yml` to adopt a\n  Narrative Consultant and Game Master's Assistant persona, requiring 9\n  diverse action archetypes including dice rolls.",
          "is_bot": false,
          "headline": "Overhaul coding and roleplay suggestion prompts",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-09T18:47:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea8f5b88e4baa6957b26078a5249e27c8d8d34f0",
          "body": null,
          "is_bot": false,
          "headline": "Add to changes",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-09T07:32:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a0501f66e2ecdb3de3381661d1f109cba8e4684",
          "body": "- Update version to **0.0.98** in `VERSION`\n- Update `VERSION` constant to **0.0.98** in `lib/ollama_chat/version.rb`\n- Update version to **0.0.98** in `ollama_chat.gemspec`",
          "is_bot": false,
          "headline": "Bump version to 0.0.98",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-09T07:25:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0905324b0728bd46537df7f2c96ac3a70a2595eb",
          "body": "- Update `lib/ollama_chat/commands.rb` to assign the result of\n  `suggest_prompts` to `self.prefill_prompt`\n- Enable storage of prefilled prompts in history for later reuse and\n  modification",
          "is_bot": false,
          "headline": "Persist suggested prompt as prefill state",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-08T23:16:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2db37f2f52876d163b3ef4ba8bcf9a98616cfc8d",
          "body": "- Implement `prefill_prompt` getter and setter in\n  `lib/ollama_chat/chat.rb`.\n- Add YARD documentation for the `prefill_prompt` interface in\n  `lib/ollama_chat/chat.rb`.\n- Update call sites to use `self.prefill_prompt` instead of\n  `@prefill_prompt` in `lib/ollama_chat/chat.rb`,\n  `lib/ollama_chat/commands.rb`, and\n  `lib/ollama_chat/personae_management.rb`.",
          "is_bot": false,
          "headline": "Encapsulate prefill prompt access and documentation",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-08T22:58:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b543db95f3ebf6e4eee7d65a8ea7130704f7bf0e",
          "body": "- Wrap `info` subcommand output in `use_pager` within\n  `lib/ollama_chat/commands.rb`.\n- Add confirmation message to the `import` subcommand in\n  `lib/ollama_chat/commands.rb`.",
          "is_bot": false,
          "headline": "Improve info command paging and import feedback",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-08T07:07:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "025a47b5a5f9b360f2b138575ce40fd52bebe21a",
          "body": "- Update the description of the `directory_structure` tool in\n  `lib/ollama_chat/tools/directory_structure.rb` to warn about token\n  usage and the exponential growth of nodes relative to the `max_depth`\n  parameter.",
          "is_bot": false,
          "headline": "Refine `directory_structure` tool description",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-07T17:16:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4feb965fa4fe3ea5fcf27ae3d64edcb24a9f96cf",
          "body": null,
          "is_bot": false,
          "headline": "Add to changes",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-06T21:18:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4cf494ebae3adb52d2368104ccb1210216b2026",
          "body": "- Update version number from **0.0.96** to **0.0.97** in `VERSION`,\n  `lib/ollama_chat/version.rb`, and `ollama_chat.gemspec`.\n- Add\n  `lib/ollama_chat/database/migrations/005_add_context_format_to_sessions.rb`\n  to the list of files and documentation sources in\n  `ollama_chat.gemspec`.",
          "is_bot": false,
          "headline": "Bump version to **0.0.97**",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-06T21:09:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf272a2405750e13177ef8de12970ccd188ad9d8",
          "body": "- Add `/context_format` command in `lib/ollama_chat/commands.rb`.\n- Introduce migration `005_add_context_format_to_sessions.rb` to add\n  `context_format` column to the `sessions` table.\n- Update `OllamaChat::Database::Models::Session` with presence\n  validations for session attributes and initializa\n[…]\nt#execute` to use the session's selected\n  format instead of static configuration.\n- Add `validates_presence :profile` to the `validate` method in\n  `lib/ollama_chat/database/models/model_options.rb`.",
          "is_bot": false,
          "headline": "Make context format a session-specific state",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-06T20:55:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6c89af20573490a7ccffd78be018d794dd74dcda",
          "body": "- Added `copy` subcommand to the `/persona` command in\n  `lib/ollama_chat/commands.rb`, updating its regex, completion list,\n  and help text.\n- Implemented logic in `lib/ollama_chat/commands.rb` to call\n  `select_persona_path(no_prefill: true)` when using the `copy`\n  subcommand.\n- Updated `select_p\n[…]\no_prefill`\n  keyword argument and added corresponding YARD documentation.\n- Refined `@prefill_prompt` assignment logic in\n  `lib/ollama_chat/personae_management.rb` to respect the `no_prefill`\n  flag.",
          "is_bot": false,
          "headline": "Add `/persona copy` command and refine path selection",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-06T18:09:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9dbd2ae94017eb77ad959e491eadb6194bac3ded",
          "body": "- Update the `embed` prompt template in\n  `lib/ollama_chat/ollama_chat_config/default_config.yml` to include\n  `%{source}` for better clarity.\n- Modify `#embed` in `lib/ollama_chat/source_fetching.rb` to pass the\n  `source` variable into the prompt interpolation hash.\n- Add calls to `disable_content\n[…]\nchat/commands.rb` to\n  prevent accidental recursive imports of system status messages.\n- Update the test expectation for the embed confirmation message in\n  `spec/ollama_chat/source_fetching_spec.rb`.",
          "is_bot": false,
          "headline": "Refine embedding notifications and import logic",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-05T23:47:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "79213a53a4b89f99a81c5782b105d7f585c98ae0",
          "body": "- Significantly expand `README.md` with detailed guides for `/input` and\n  a new \"Power User Features\" section covering `/character`, `/prompt\n  suggest`, `/model` profiles, and `/session summarize`.\n- Fix typo in `lib/ollama_chat/information.rb` help text, correcting\n  flag `-s` to `-l`.\n- Ensure character name is cast to string in\n  `lib/ollama_chat/parsing.rb` for improved type consistency.",
          "is_bot": false,
          "headline": "Expand documentation and refine command logic",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-05T23:01:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6be8613d3ffb94cf48eb7bb11ea531a250e6bead",
          "body": "- Update `OllamaChat::Chat#generate` to utilize `ollama.chat`, return a\n  string directly, and accept an optional `system` prompt.\n- Implement `OllamaChat::SystemPromptManagement#raw_system_prompt` for\n  resolving active system prompts.\n- Enhance `OllamaChat::PromptManagement#suggest_prompts` with a\n[…]\ne`.\n- Sync mocks in\n  `spec/ollama_chat/tools/retrieve_document_snippets_spec.rb` with the\n  new API return type.\n- Add YARD documentation for `generate`, `suggest_prompts`, and\n  `raw_system_prompt`.",
          "is_bot": false,
          "headline": "Refactor generation API to use structured chat",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-04T16:29:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "63bafbf9dff76cc4b88958ea5dbb76ac843b91c8",
          "body": null,
          "is_bot": false,
          "headline": "Add to changes",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-03T07:29:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68160bf9bd8d675545e91bd2c4542601281f9bb1",
          "body": "- Updated the project version from **0.0.95** to **0.0.96** across\n  `VERSION`, `lib/ollama_chat/version.rb`, and `ollama_chat.gemspec`.",
          "is_bot": false,
          "headline": "Bump version to **0.0.96**",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-03T07:24:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b0668a889318ec844c7e9200e55e248cd6eaf2a",
          "body": "- Improve compatibility by replacing the new `it` parameter with `_1`\n  in the `tools` method within `lib/ollama_chat/tool_calling.rb`.",
          "is_bot": false,
          "headline": "Update Ruby syntax for tool filtering",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-03T00:46:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08a9f923da137459495e1616a0941c62157d89b7",
          "body": "- Refactor `lib/ollama_chat/database/models/prompt.rb` to use shorthand\n  syntax in `.where`.\n- Update `lib/ollama_chat/follow_chat.rb` to pass `chat:` during tool\n  execution.\n- Use shorthand hash syntax for prompt interpolation in\n  `lib/ollama_chat/source_fetching.rb`.\n- Apply shorthand syntax to\n[…]\n`,\n  `StateSelector`, and `Switches`) to utilize shorthand hash syntax for\n  object initialization and method calls.\n- Update various tool specs to use the `chat:` shorthand when calling\n  `.execute`.",
          "is_bot": false,
          "headline": "Apply Ruby shorthand hash syntax across project",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-03T00:37:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "220647aa34306996584453bb1e6801af29682419",
          "body": "- Update `lib/ollama_chat/ollama_chat_config/default_config.yml` to\n  include a `reroll` configuration option for the `roll_dice` tool.\n- Refactor `execute` in `lib/ollama_chat/tools/roll_dice.rb` to\n  implement a reroll loop based on the new configuration setting using\n  `chat.confirm?`.\n- Extract \n[…]\nm `execute` into\n  a separate private method `perform_roll` in\n  `lib/ollama_chat/tools/roll_dice.rb`.\n- Add YARD documentation for the `perform_roll` method in\n  `lib/ollama_chat/tools/roll_dice.rb`.",
          "is_bot": false,
          "headline": "Add reroll capability to dice roll tool",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-02T23:51:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9a8be26e3e96ae8106f0345ce079a34a2429c83e",
          "body": "- Update `setup_session` in `lib/ollama_chat/session_management.rb` to\n  pass `offer_new_session: true` to `choose_session`.\n- Enable `offer_new_session: true` when choosing a session after\n  deletion prompts in `lib/ollama_chat/session_management.rb`.\n- Call `.save` on the `chosen_session` object to ensure persistence.",
          "is_bot": false,
          "headline": "Allow offering new sessions during selection",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-02T21:07:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d93092a78b4960902749f731c106c3ab11561f3",
          "body": "- Update `lib/ollama_chat/tools/get_time.rb` to include a human-readable\n  summary `message` featuring a time-of-day greeting, formatted time,\n  and weekday.\n- Update `spec/ollama_chat/tools/get_time_spec.rb` to validate the new\n  `message` using `Time.dummy` for deterministic testing.",
          "is_bot": false,
          "headline": "Improve messaging for GetTime tool",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-02T15:54:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5331b44b529cdee4878825f2bb57e3f99224d3d9",
          "body": "- Update `lib/ollama_chat/tools/get_current_weather.rb` to include a\n  human-readable summary `message` incorporating current temperature,\n  conditions, and the daily forecast.\n- Update `spec/ollama_chat/tools/get_current_weather_spec.rb` to\n  validate the new `message` format.",
          "is_bot": false,
          "headline": "Improve messaging for GetCurrentWeather tool",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-02T02:48:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba14b2417b0f1a36c628cc738e2844a408ece5f9",
          "body": "- Update `lib/ollama_chat/tools/read_file.rb` to include a\n  human-readable summary `message` featuring formatted bytes and tokens\n  via `OllamaChat::TokenEstimator`.\n- Refactor `lib/ollama_chat/tools/write_file.rb` to utilize\n  `OllamaChat::TokenEstimator` for the output `message`, replacing\n  manu\n[…]\ntains the formatted byte and token counts.\n- Update `spec/ollama_chat/tools/write_file_spec.rb` to verify that the\n  `message` reflects the amount of data written in both overwrite and\n  append modes.",
          "is_bot": false,
          "headline": "Improve messaging for ReadFile and WriteFile tools",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-02T02:48:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "29a3369243f9b9940ce0f3303a495b624497abe0",
          "body": "- Implement `import_persona_from_json` in\n  `lib/ollama_chat/personae_management.rb` to streamline imports by\n  removing temporary file dependency.\n- Update `convert_json_character_to_markdown` to replace `{{char}}`\n  placeholders with the actual character name.\n- Enhance `personalize_character_prof\n[…]\nr.decode_character` to\n  return a tuple of the decoded string and parsed JSON data.\n- Update `lib/ollama_chat/commands.rb` to utilize the new\n  `import_persona_from_json` method for character imports.",
          "is_bot": false,
          "headline": "Improve character importing and personalization",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-02T01:56:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6e742339c17b5805f7ec677ffe193f7cefc49313",
          "body": "- Add a human-readable summary `message` to the output of\n  `OllamaChat::Tools::GeneratePassword#execute`.\n- Update `spec/ollama_chat/tools/generate_password_spec.rb` to validate\n  these messages, covering various alphabet types and argument errors.",
          "is_bot": false,
          "headline": "Improve messaging for GeneratePassword tool",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-07-01T01:09:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b991ba96a073171bf132bf20d14807e9fefa870",
          "body": "- Add a human-readable summary `message` to the output of\n  `OllamaChat::Tools::RetrieveDocumentSnippets#execute`, providing\n  counts and collection details.\n- Update `spec/ollama_chat/tools/retrieve_document_snippets_spec.rb` to\n  validate these messages and add a test case for empty results.\n- Refine mock expectations in tests for `collection` access using\n  `at_least(:once)`.",
          "is_bot": false,
          "headline": "Improve messaging for RetrieveDocumentSnippets tool",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-30T23:36:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40a3e1f0978f1caf187ff96171d5506f962977b9",
          "body": "- Add a human-readable summary `message` to the output of\n  `OllamaChat::Tools::ExecuteGrep#execute`.\n- Implement logic to distinguish between cases where matches were found\n  and when the result was blank.\n- Include the new `message` key in the returned JSON response for\n  `lib/ollama_chat/tools/execute_grep.rb`.\n- Update `spec/ollama_chat/tools/execute_grep_spec.rb` to validate these\n  messages using flexible regex matching.",
          "is_bot": false,
          "headline": "Improve messaging for ExecuteGrep tool",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-30T22:52:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b02b0d023bf9ebbf27af6b58246a88760246e56",
          "body": "- Improve user experience in `OllamaChat::Tools::RunTests#execute` by\n  adding human-readable summary messages with emojis based on test\n  results.\n- Refactor execution logic to remove reliance on the global `$?`\n  variable, instead explicitly returning a success flag from\n  `execute_test_command`.\n- Update YARD documentation for the `tool` method in\n  `OllamaChat::Tools::RunTests`.\n- Ensure return payload of `execute` includes the new `message` and that\n  `path` is cast to a string.",
          "is_bot": false,
          "headline": "Enhance `run_tests` tool messaging and robustness",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-30T22:26:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f303aa271ea6e0c16417df0dffc2433b383dfc5",
          "body": "- Added a human-readable summary `message` to the output in\n  `lib/ollama_chat/tools/compute_bmi.rb`.\n- Simplified BMI calculation by removing redundant parentheses in\n  `lib/ollama_chat/tools/compute_bmi.rb`.\n- Refactored result hash in `lib/ollama_chat/tools/compute_bmi.rb` to\n  use shorthand syntax for `bmi`, `category`, `units`, and `message`.\n- Updated test expectations in\n  `spec/ollama_chat/tools/compute_bmi_spec.rb` to use regex matching for\n  the `message` field.",
          "is_bot": false,
          "headline": "Enhance ComputeBMI messaging and clean up code",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-30T19:37:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6479dcee0d6ee2beec9204e7e4fcfa4dab22c774",
          "body": "- Bump `context_spook` version from **1.5** to **1.6** in `Rakefile` and\n  `ollama_chat.gemspec`.\n- Leverage new token estimation capabilities to provide more accurate\n  context sizing within the application.",
          "is_bot": false,
          "headline": "Update context_spook dependency to v1.6.0",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-30T10:42:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e3ae6215c772dd1c533c9114b53c76ee12f237f",
          "body": "- Relocate `TokenEstimator` from `Utils` to a primary domain module for\n  better discoverability.\n- Introduce the `Estimate` struct to bundle raw values with formatting\n  methods (`bytes_formatted`, `tokens_formatted`).\n- Implement `OllamaChat::TokenEstimator::Crude` as the underlying\n  estimation e\n[…]\ncleaner, more expressive calls.\n- Improve YARD documentation across the new components with proper type\n  hinting and descriptions.\n- Add a comprehensive test suite covering core logic and edge cases.",
          "is_bot": false,
          "headline": "Refactor token estimation logic and documentation",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-30T10:37:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6f82a7b9f01e5c12bb2424d3cae397c506b42ae2",
          "body": "- Update the `message` string in `OllamaChat::Tools::RollDice#execute`\n  within `lib/ollama_chat/tools/roll_dice.rb` to include the roll bounds\n  (`min`...`max`).\n- Synchronize expected output strings in\n  `spec/ollama_chat/tools/roll_dice_spec.rb` to match the updated\n  message format.",
          "is_bot": false,
          "headline": "Improve roll_dice message by adding result range",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-30T10:09:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf978dbb52669ab5e5d08065ea772e3dcae547d5",
          "body": "- Calculate `min` and `max` bounds within\n  `OllamaChat::Tools::RollDice#execute`.\n- Include `min` and `max` values in the JSON response returned by\n  `lib/ollama_chat/tools/roll_dice.rb`.",
          "is_bot": false,
          "headline": "Add min and max bounds to roll_dice tool output",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-30T00:59:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a7bda79badb6d8daa718a72eb0606d9428898a3",
          "body": "- Refactor `OllamaChat::Tools::RollDice` to use Ruby's shorthand hash\n  syntax for the `total` variable, improving code maintainability.",
          "is_bot": false,
          "headline": "Simplify roll dice tool response syntax",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-30T00:50:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e9b1038efa00747b98837562f44c3442aeff96b",
          "body": null,
          "is_bot": false,
          "headline": "Add to changes",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-29T07:50:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e68c052fbc5e901f9d77c35a011791de34dcbd66",
          "body": "- Updated the project version from **0.0.94** to **0.0.95** across\n  `VERSION`, `lib/ollama_chat/version.rb`, and `ollama_chat.gemspec`.\n- Renamed `lib/ollama_chat/utils/png_character_extractor.rb` to\n  `lib/ollama_chat/utils/png_metadata_extractor.rb`.\n- Added a new utility file `lib/ollama_chat/utils/utf8_converter.rb`.\n- Added a new test asset `spec/assets/miyu.png`.",
          "is_bot": false,
          "headline": "Bump version to **0.0.95**",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-29T07:46:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39e689e2e9d405b3ef08eed8819108d8580fa6e6",
          "body": "… display timeout\n\n- Increase `result_display_timeout` for the `roll_dice` tool in\n  `lib/ollama_chat/ollama_chat_config/default_config.yml`.\n- Add a human-readable `message` to the JSON output of the `roll_dice`\n  tool in `lib/ollama_chat/tools/roll_dice.rb`, which includes detailed\n  roll informat\n[…]\n total.\n- Update tests in `spec/ollama_chat/tools/roll_dice_spec.rb` to verify\n  the new `message` field across different dice roll scenarios and\n  improve error handling assertions by using `.error`.",
          "is_bot": false,
          "headline": "Enhance `roll_dice` tool with descriptive output and increased result…",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-28T22:36:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "313d81187270c9874c351ad572ccaa9fbf0a283c",
          "body": "- Implement\n  `OllamaChat::Utils::PNGMetadataExtractor#parse_a1111_parameters` to\n  parse Stable Diffusion WebUI parameters into a structured hash.\n- Update `OllamaChat::Parsing#parse_png` to extract and display\n  \"Generation Settings\" from the `parameters` metadata key.\n- Remove redundant convenien\n[…]\n/png_metadata_extractor_spec.rb` to use\n  `extract_all` for prompt and workflow verification.\n- Add test case for empty metadata scenarios in\n  `spec/ollama_chat/utils/png_metadata_extractor_spec.rb`.",
          "is_bot": false,
          "headline": "Support Automatic1111 PNG metadata and prune API",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-27T21:31:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ff1f1875328030fd36bca61b38d94b982d2604fb",
          "body": "- Implement `OllamaChat::Utils::PNGMetadataExtractor` to support\n  characters, prompts, and workflows in `tEXt` chunks.\n- Introduce `OllamaChat::Utils::UTF8Converter` for safe UTF-8 encoding\n  handling across the system.\n- Remove obsolete `OllamaChat::Utils::PNGCharacterExtractor`.\n- Introduce `pars\n[…]\n\n  `spec/ollama_chat/utils/png_metadata_extractor_spec.rb`.\n- Update `spec/ollama_chat/parsing_spec.rb` and\n  `spec/ollama_chat/tools/directory_structure_spec.rb` to reflect assets\n  and file changes.",
          "is_bot": false,
          "headline": "Refactor PNG metadata extraction and unify parsing",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-27T21:11:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0b110148d8241ba81c499ba52971dc791c8fbde5",
          "body": "- Improve `lib/ollama_chat/tools/compute_bmi.rb` maintainability by\n  removing the unnecessary `json` library dependency.",
          "is_bot": false,
          "headline": "Remove unused json requirement from compute_bmi",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-27T16:18:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6882e3d121e52af41a90932769a875ce85535bfd",
          "body": "- Added `io.rewind` in an `ensure` block within\n  `OllamaChat::Utils::PNGCharacterExtractor` to ensure the input stream\n  is reset, preventing potential read errors in subsequent operations.",
          "is_bot": false,
          "headline": "Ensure PNG character extractor resets IO stream",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-27T15:50:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17779956a3fae9877703199d05135376a7279a13",
          "body": "- Add descriptive YARD documentation for `module OllamaChat::Commands`\n  in `lib/ollama_chat/commands.rb`, detailing its role as a central\n  repository for slash commands and the functional categories it manages\n  via `OllamaChat::CommandConcern`.",
          "is_bot": false,
          "headline": "Add YARD documentation to OllamaChat::Commands",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-26T22:15:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88b1ee21bd8e1a2f41753e00b4f0f3ff30077b2e",
          "body": "- Overhaul help text for `/model`, `/system`, `/tools`, `/session`,\n  `/prompt`, and `/persona` to provide structured descriptions of\n  subcommands, options, and specialized behaviors.\n- Refactor help strings for `/conversation` and `/info` into heredocs\n  for better formatting and readability.\n- Up\n[…]\n `/favourite`, `/list`, `/last`, `/regenerate`,\n  and `/collection` to improve clarity, grammar, and layout.\n- Standardize the use of \"personae\" across command help texts and\n  internal documentation.",
          "is_bot": false,
          "headline": "Improve command help texts in `commands.rb`",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-26T20:33:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f9dba5f666fc106c432255e79fd8b89e79e65e98",
          "body": "- Update `help` strings in `lib/ollama_chat/commands.rb` to use squiggly\n  heredocs (`<<~EOT`) for improved readability.\n- Apply formatted help text to several commands, including `/toggle`,\n  `/favourite`, `/model`, `/system`, `/tools`, `/session`, `/pts`,\n  `/prompt`, `/collection`, `/persona`, `/character`, `/input`, and\n  `/help`.",
          "is_bot": false,
          "headline": "Refactor command help messages for better formatting",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-25T09:25:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3de36ed40b6bb2a41c8630a4d802359445d12507",
          "body": "- Filter out directories in `OllamaChat::InputContent#all_file_set`\n  using `.select(&:file?)`.\n- Convert the resulting array of expanded paths to a `Set` via `.to_set`\n  within `lib/ollama_chat/input_content.rb`.",
          "is_bot": false,
          "headline": "Ensure `all_file_set` returns only files as a set",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-25T02:52:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e87027de1adf71c051676a57854664a0564063e5",
          "body": "- Remove `OLLAMA_CHAT_TOOLS_PATCH_TOOL` documentation from `README.md`\n- Delete `PATCH_TOOL` definition in `lib/ollama_chat/oc.rb`",
          "is_bot": false,
          "headline": "Remove patch tool configuration",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-24T10:51:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe86951b3862139d2fa6f6afb437adb34fd15d99",
          "body": "- Replace `getconf _NPROCESSORS_ONLN` with `nproc` in `.all_images.yml`\n  to determine the number of parallel jobs for `bundle install`,\n  improving compatibility across different environments.",
          "is_bot": false,
          "headline": "Improve dependency installation efficiency in CI",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-24T10:45:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1b3a9c4213b0c1b2e5ab51a6818732a0a20030c",
          "body": "- Update the description for the **Knowledge** category in `README.md`\n  to distinguish between surgical semantic search via\n  `retrieve_document_snippets` and full structural retrieval via\n  `file_context`, including a warning regarding LLM context window\n  limits.",
          "is_bot": false,
          "headline": "Refine Knowledge tool descriptions in README.md",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-23T18:58:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0313e3fd72ef04131ba51304d8f312a20c5890d6",
          "body": "- Add missing tools `delete_file`, `move_file`, `eval_ruby`, `get_ghr`,\n  and `get_jira_issue` to the available tools table in `README.md`.\n- Include `file_context` in the **Knowledge** category in `README.md`.\n- Update the description for the **Knowledge** category in `README.md`\n  to reflect both vector search and structured project context\n  retrieval.",
          "is_bot": false,
          "headline": "Update tool descriptions and list in README.md",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-22T21:12:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a5b25ee30009d1fbffef4d7d274bfff2e3adad4",
          "body": "- Update `lib/ollama_chat/session_management.rb` to use `.blank?`\n  instead of `.nil?` when validating the session name to prevent crashes\n  on empty strings.\n- Remove redundant `@return [ nil ]` tags in\n  `lib/ollama_chat/information.rb` and\n  `lib/ollama_chat/session_management.rb`.",
          "is_bot": false,
          "headline": "Refine documentation and session name validation",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-22T17:15:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7d5bd780346babfa3eae6bc41fcddcabf3ddef1",
          "body": null,
          "is_bot": false,
          "headline": "Add to changes",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-22T08:00:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c32dfb05c82fb970756ff2f71096dba2ef4c151b",
          "body": "- Update the project version from **0.0.93** to **0.0.94** across\n  `VERSION`, `lib/ollama_chat/version.rb`, and `ollama_chat.gemspec`.\n- Add `LICENSE` to the list of files included in the `ollama_chat` gem\n  specification.\n- Include `spec/ollama_chat/tool_calling_spec.rb` in both the `s.files`\n  and `s.test_files` lists within `ollama_chat.gemspec`.",
          "is_bot": false,
          "headline": "Bump version to **0.0.94**",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-22T07:59:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bee016f21f7d7d4fed59161dcc320de6b2fdd016",
          "body": "- Use `tools_support` reader instead of `@tools_support` in\n  `lib/ollama_chat/tool_calling.rb`.\n- Ensure allowed paths are indexed by string keys using `.to_s` in\n  `lib/ollama_chat/tool_calling.rb`.\n- Add `spec/ollama_chat/tool_calling_spec.rb` to provide comprehensive\n  test coverage for the tool calling module.",
          "is_bot": false,
          "headline": "Improve tool calling and add comprehensive specs",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-22T02:04:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d18c0dbd31f71a9a4df977508457ee09062cf47",
          "body": "- Update interactive prompt in `lib/ollama_chat/web_searching.rb` to\n  `'Which links of knowledge shall we sever? %s'`.\n- Add `%s` format specifier to prompts in\n  `lib/ollama_chat/rag_handling.rb` and\n  `lib/ollama_chat/state_selectors.rb`.\n- Update usage examples in `lib/ollama_chat/utils/chooser.rb` to include\n  the `%s` specifier.\n- Synchronize prompt expectations in\n  `spec/ollama_chat/state_selectors_spec.rb`.",
          "is_bot": false,
          "headline": "Sync search feedback prompts across modules",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-21T23:39:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe47a159f609ae27e43b89e24a4b7fe104e21bc0",
          "body": "- Update `README.md` to link to MIT `./LICENSE` instead of just\n  mentioning it.",
          "is_bot": false,
          "headline": "Link to MIT License in README",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-21T12:20:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54170f976212123cad5664a4229702c982a28e34",
          "body": null,
          "is_bot": false,
          "headline": "Create LICENSE file",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-21T12:19:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc347d09a60e281ed8d11090785ef902ace9a5f3",
          "body": null,
          "is_bot": false,
          "headline": "Add to changes",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-21T12:05:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "73f83dc94d50fe5dffa57817334c575096d2f214",
          "body": "- Update version in `VERSION` to **0.0.93**.\n- Update `OllamaChat::VERSION` in `lib/ollama_chat/version.rb` to **0.0.93**.\n- Bump version in `ollama_chat.gemspec` to **0.0.93**.",
          "is_bot": false,
          "headline": "Bump version to **0.0.93**",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-21T12:04:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1640dfc7c2672ce8cfc6d83a587950ac97bba457",
          "body": " - Add `%s` format specifier to interactive prompts in\n   `lib/ollama_chat/commands.rb`.\n - Update prompt strings for favourites management in\n   `lib/ollama_chat/favourites_management.rb`.\n - Update the file import selector prompt in\n   `lib/ollama_chat/input_content.rb`.\n - Enhance model and profi\n[…]\nlling.rb`.\n - Sync expectations in `spec/ollama_chat/input_content_spec.rb` with\n   the updated prompt format.\n - Update the chat session selector prompt in\n   `lib/ollama_chat/session_management.rb`.",
          "is_bot": false,
          "headline": " Add search feedback to interactive chooser prompts",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-21T12:02:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "022ba575121f121acae5486f6adff2acb5cdf814",
          "body": "- Update `ollama-ruby` version constraint to `~> 1.22` in `Rakefile`.\n- Bump `ollama-ruby` runtime dependency to `~> 1.22` in `ollama_chat.gemspec`.",
          "is_bot": false,
          "headline": "Update `ollama-ruby` dependency to **1.22.0**",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-21T00:00:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f553729a39535e5c7af80522e20a591c84e4841",
          "body": null,
          "is_bot": false,
          "headline": "Add to changes",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-19T17:38:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a4271ccf3c571a39280b75d222210e0014e079e9",
          "body": "- Update the `ollama_chat` gem version to **0.0.92** across `VERSION`,\n  `lib/ollama_chat/version.rb`, and `ollama_chat.gemspec`.",
          "is_bot": false,
          "headline": "Bump version to **0.0.92**",
          "author_name": "Florian Frank",
          "author_login": "flori",
          "committed_at": "2026-06-19T17:38:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 99,
      "commits_last_year": 856,
      "latest_release_at": "2026-07-13T07:49:10Z",
      "latest_release_tag": "v0.0.99",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 45,
      "days_since_latest_release": 10,
      "mean_days_between_releases": 2.9
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "ollama_chat",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "rubygems",
          "matches_repo": true,
          "registry_url": "https://rubygems.org/gems/ollama_chat",
          "is_deprecated": false,
          "latest_version": "0.0.100",
          "repository_url": "https://github.com/flori/ollama_chat",
          "versions_count": 101,
          "total_downloads": 35067,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2025-01-29T16:36:11.169000Z",
          "latest_published_at": "2026-07-23T15:34:19.634000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "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": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 25737,
      "source_files_sampled": 179,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "Gemfile"
      ],
      "advisories": {
        "error": "No resolved dependencies to assess",
        "scope": "repository_graph",
        "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": [
        "rubygems"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [],
        "collected": true,
        "truncated": false,
        "total_count": 0,
        "direct_count": 0,
        "indirect_count": 0
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "flori",
          "commits": 1009,
          "avatar_url": "https://avatars.githubusercontent.com/u/15918?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "static.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "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": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 10,
            "reason": "GitHub workflow tokens follow principle of least privilege",
            "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": "736849a7f6279def2631f038e5a2d3acf051b355",
        "ran_at": "2026-07-23T15:36:37Z",
        "aggregate_score": 4.9,
        "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-23T15:35:53Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/flori/ollama_chat",
    "host": "github.com",
    "name": "ollama_chat",
    "owner": "flori"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 56,
      "inputs": {
        "security": 49,
        "vitality": 97,
        "community": 34,
        "governance": 41,
        "engineering": 56
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 97,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 95,
            "inputs": {
              "commits_last_year": 856,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 45
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "45/52 weeks with commits",
                "points": 31.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 45
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "856 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 856
                    }
                  }
                ],
                "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": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 99,
              "latest_release_tag": "v0.0.99",
              "releases_from_tags": false,
              "days_since_latest_release": 10,
              "mean_days_between_releases": 2.9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "99 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 99
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 10 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 10
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~2.9 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 2.9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "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": 34,
        "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": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "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": 59,
            "inputs": {
              "packages": [
                "ollama_chat"
              ],
              "dependents": null,
              "ecosystems": "rubygems",
              "total_downloads": 35067,
              "monthly_downloads": null
            },
            "components": [
              {
                "key": "total_downloads",
                "name": "Total downloads",
                "detail": "35,067 downloads all-time across rubygems",
                "points": 47.2,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_total",
                    "params": {
                      "count": 35067,
                      "ecosystems": "rubygems"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 41,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 16,
            "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 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "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": 63,
            "inputs": {
              "followers": 136,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "flori",
              "public_repos": 124,
              "account_age_days": 6594
            },
            "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": "136 followers of flori",
                "points": 15.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 136,
                      "login": "flori"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "124 public repos, account ~18 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 124
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 18
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "ollama_chat"
              ],
              "ecosystems": "rubygems",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on rubygems",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "rubygems"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "101 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 101
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 56,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "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": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 49,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 49,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 4.9
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "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 not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "GitHub workflow tokens follow principle of least privilege",
                "points": 7.5,
                "status": "met",
                "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": 4
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "at_risk",
        "name": "AI Readiness",
        "value": 39,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.9,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "90 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 90,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 32,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "Ruby",
              "largest_source_bytes": 25737,
              "source_files_sampled": 179,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Ruby without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Ruby"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/179 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 179,
                      "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"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T15:36:42.653396Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/f/flori/ollama_chat.svg",
  "full_name": "flori/ollama_chat",
  "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 StatistikenRubyGems.