Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 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 estrellas⑂ 0 forksdesde ene 2025Ver en GitHub ↗

flori/ollama_chat tiene un índice de salud de 56 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (97/100) y la más baja, Community & Adoption (34/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

56
global / 100
Moderado

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

56
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

Florian FrankCuenta personal
136 seguidores124 repositorios públicosdesde jul 2008

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
RubyGemsollama_chat0.0.100-101hace 0 días

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

97Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
31.2/36Cadencia de commits — 45/52 semanas con commits
18/18Volumen de commits — 856 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year856
human_commit_share1
days_since_last_push0
active_weeks_last_year45
Cómo se puntúa
27/27Publica versiones — 99 versiones publicadas
36/36Recencia de las versiones — última versión hace 10 días
27/27Cadencia de publicación — una versión cada ~2,9 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count99
latest_release_tagv0.0.99
releases_from_tagsno
days_since_latest_release10
mean_days_between_releases2,9
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

34En riesgo · 18% del índice global
Cómo se puntúa
4.9/60Estrellas — 3 estrellas
0/25Forks — 0 forks
0/15Observadores — 1 observadores
Datos de entrada utilizados
forks0
stars3
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
47.2/80Descargas totales — 35.067 descargas históricas en rubygems
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesollama_chat
dependents
ecosystemsrubygems
total_downloads35.067
monthly_downloads
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

41En riesgo · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
0/38.3Aceptación de PR — sin PR decididos o sin datos
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues, Aceptación de PR. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
15.4/25Alcance del propietario — 136 seguidores de flori
25/25Trayectoria — 124 repos públicos, cuenta de ~18 años
Datos de entrada utilizados
followers136
owner_typeUser
is_verified
owner_loginflori
public_repos124
account_age_days6594
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en rubygems
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 101 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesollama_chat
ecosystemsrubygems
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

56Moderado · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 1 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

50Moderado
Cómo se puntúa
30/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readme
has_docs_dirno
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

49En riesgo · 16% del índice global
Cómo se puntúa
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 — sin datos
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.5Licencia — 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 — sin datos
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 — sin datos
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate4,9
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, packaging, signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

39En riesgo · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 90 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,9
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
0/11Configuración de lint / formato
0/11Verificación estática de tipos
10/10Entorno reproducible — Dockerfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfile
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
0/45Código verificable por tipos — Ruby sin configuración de verificación de tipos
55/55Tamaños de archivo manejables — 0/179 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageRuby
largest_source_bytes25.737
source_files_sampled179
oversized_source_files0

Datos clave

3estrellas de GitHub
1contribuidores
856commits en los últimos 12 meses
0días desde el último push
99versiones publicadas
1factor bus
0issues abiertas
RubyGemsecosistemas de paquetes

Advertencias de recopilación de datos

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

Más detalle

OpenSSF Scorecard 4.9 / 10
4.9agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).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
n/dCI-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
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
10Vulnerabilities0 existing vulnerabilities detected
Todas las dependencias 0

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 0 paquetes directos y 0 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

RegistroPaqueteVersiónRelación
Avisos de dependencias sin evaluar

El cotejo de avisos no pudo ejecutarse para este informe: No resolved dependencies to assess

Informe JSON sin procesar legible por máquina
{
  "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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasRubyGems.