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