Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 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 зірки⑂ 0 форківз січ. 2025 р.Переглянути на GitHub ↗

flori/ollama_chat має індекс здоров’я 56 зі 100, що відповідає смузі «Помірний». Найвищий показник — Vitality (97/100), найнижчий — Community & Adoption (34/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

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

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

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

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

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

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

Власність

Florian FrankОсобистий обліковий запис
136 підписників124 публічні репозиторіїз лип. 2008 р.

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

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
RubyGemsollama_chat0.0.100-1010 днів тому

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

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

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

97Відмінний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
31.2/36Ритм комітів — 45/52 тижнів із комітами
18/18Обсяг комітів — 856 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year856
human_commit_share1
days_since_last_push0
active_weeks_last_year45
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 99 релізів
36/36Свіжість релізів — останній реліз 10 дн. тому
27/27Ритм релізів — реліз кожні ~2,9 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count99
latest_release_tagv0.0.99
releases_from_tagsні
days_since_latest_release10
mean_days_between_releases2,9
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

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

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

34У зоні ризику · 18% загального індексу
Як обчислюється оцінка
4.9/60Зірки — 3 зірок
0/25Форки — 0 форків
0/15Спостерігачі — 1 спостерігачів
Використані вхідні дані
forks0
stars3
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingні
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні
Як обчислюється оцінка
47.2/80Сумарні завантаження — 35 067 завантажень за весь час у rubygems
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
packagesollama_chat
dependents
ecosystemsrubygems
total_downloads35 067
monthly_downloads
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

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

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

41У зоні ризику · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0/22.5Розподіл комітів — головний контриб’ютор — автор 100% комітів
1.4/13.5Широта контриб’юторів — 1 контриб’юторів
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Використані вхідні дані
bus_factor1
contributors_sampled1
top_contributor_share1
Як обчислюється оцінка
0/46.8Вирішення issue — немає issue або даних
0/38.3Прийняття PR — немає вирішених pull request-ів або даних
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Виключено з оцінювання (немає даних або не застосовно): Вирішення issue, Прийняття PR. Залишкові ваги перенормовано.
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
15.4/25Охоплення власника — 136 підписників у flori
25/25Послужний список — 124 публічних репозиторіїв, вік облікового запису ~18 р.
Використані вхідні дані
followers136
owner_typeUser
is_verified
owner_loginflori
public_repos124
account_age_days6 594
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у rubygems
35/35Свіжість публікацій — остання публікація 0 дн. тому
20/20Історія версій — 101 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesollama_chat
ecosystemsrubygems
any_deprecatedні
min_days_since_publish0

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

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

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

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

50Помірний
Як обчислюється оцінка
30/30README
0/25Каталог документації
0/15Сайт документації / домашня сторінка
10/10Опис репозиторію
0/10Теми
10/10Wiki
Використані вхідні дані
topics
has_wikiтак
homepage
has_readmeтак
has_docs_dirні
has_descriptionтак

Безпека

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

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

Стан безпеки

49У зоні ризику
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — немає даних
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
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.5Ліцензія — 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 — немає даних
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 — немає даних
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate4,9
Виключено з оцінювання (немає даних або не застосовно): ci_tests, packaging, signed_releases. Залишкові ваги перенормовано.

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

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

39У зоні ризику · 0% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 90 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,9
agent_instruction_files
agent_instruction_max_bytes
Як обчислюється оцінка
0/18Розгортання однією командою
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
0/11Статична перевірка типів
10/10Відтворюване середовище — Dockerfile
0/10Підтверджена практика роботи з агентами — серед останніх 100 комітів немає створених агентом
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfiles
has_dockerfileтак
typed_languageні
bootstrap_files
has_devcontainerні
has_linter_configні
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Як обчислюється оцінка
0/45Типізований код — Ruby без конфігурації перевірки типів
55/55Керовані розміри файлів — 0/179 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageRuby
largest_source_bytes25 737
source_files_sampled179
oversized_source_files0

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

3зірок GitHub
1контриб'юторів
856комітів за останні 12 місяців
0днів від останнього пушу
99релізів
1бас-фактор
0відкритих issue
RubyGemsпакетних екосистем

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

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

Докладніше

OpenSSF Scorecard 4.9 / 10
4.9сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).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
н/д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
н/д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
н/дSigned-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
10Vulnerabilities0 existing vulnerabilities detected
Усі залежності 0

Повний розв'язаний набір залежностей із графа залежностей GitHub: 0 прямих і 0 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

РеєстрПакетВерсіяЗв'язок
Сповіщення про залежності не оцінено

Звірка сповіщень не відбулася для цього звіту: No resolved dependencies to assess

Звіт у форматі JSON машиночитний
{
  "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"
}

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

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

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