Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 1.13.0 · 2026-07-25 05:16 UTC

hellcoderGIT / companion

Web & Mobile UI for Claude Code & Codex . Launch sessions, stream responses, approve tools. All from your browser / mobile

TypeScriptMIT★ 1 зірка⑂ 1 форкз квіт. 2026 р.форкПереглянути на GitHub ↗

hellcoderGIT/companion має індекс здоров’я 57 зі 100, що відповідає смузі «Помірний». Найвищий показник — Vitality (86/100), найнижчий — Community & Adoption (24/100). Останнє оновлення було 5 днів тому. Більшість нещодавньої роботи виконує один учасник.

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

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

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

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

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

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

Власність

MoritzОсобистий обліковий запис
1 підписник3 публічні репозиторіїз серп. 2013 р.

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

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

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікаціяТеги
npm@hellcoder/companion0.108.03 170665 днів томуclaudeclaude-codeaiagentweb-uivibe-coding

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

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

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

86Відмінний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 5 дн. тому
11.8/36Ритм комітів — 17/52 тижнів із комітами
18/18Обсяг комітів — 582 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year582
human_commit_share0,69
days_since_last_push5
active_weeks_last_year17
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 23 релізів
36/36Свіжість релізів — останній реліз 5 дн. тому
27/27Ритм релізів — реліз кожні ~3,4 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count23
latest_release_tagcompanion-v0.108.0
releases_from_tagsні
days_since_latest_release5
mean_days_between_releases3,4
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

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

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

24Критичний · 18% загального індексу
Як обчислюється оцінка
0/60Зірки — 1 зірок
0/25Форки — 1 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks1
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
0/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeні
has_licenseні
has_contributingні
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні
Як обчислюється оцінка
46.7/80Щомісячні завантаження — 3 170 завантажень/місяць у npm
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
packages@hellcoder/companion
dependents
ecosystemsnpm
total_downloads
monthly_downloads3 170
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

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

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

58Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
4.3/22.5Розподіл комітів — головний контриб’ютор — автор 81% комітів
13.5/13.5Широта контриб’юторів — 16 контриб’юторів
10/10OpenSSF Scorecard: Contributors — project has 3 contributing companies or organizations -- score normalized to 10
Використані вхідні дані
bus_factor1
contributors_sampled16
top_contributor_share0,811
Як обчислюється оцінка
0/46.8Вирішення issue — немає issue або даних
38.2/38.3Прийняття PR — злито 63/63 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/17 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs63
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Виключено з оцінювання (немає даних або не застосовно): Вирішення issue. Залишкові ваги перенормовано.

Власність та опіка

36У зоні ризику
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
2.2/25Охоплення власника — 1 підписників у hellcoderGIT
16.4/25Послужний список — 3 публічних репозиторіїв, вік облікового запису ~12 р.
Використані вхідні дані
followers1
owner_typeUser
is_verified
owner_loginhellcoderGIT
public_repos3
account_age_days4 712
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

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

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у npm
35/35Свіжість публікацій — остання публікація 5 дн. тому
20/20Історія версій — 66 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packages@hellcoder/companion
ecosystemsnpm
any_deprecatedні
min_days_since_publish5

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

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

55Помірний · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 5 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-commit-хуки
0/6.4.editorconfig
10/20OpenSSF Scorecard: CI-Tests — 16 out of 28 merged PRs checked by a CI test -- score normalized to 5
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні

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

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

Безпека

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

56Помірний · 16% загального індексу

Стан безпеки

45У зоні ризику
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
1.2/2.5CI-Tests — 16 out of 28 merged PRs checked by a CI test -- score normalized to 5
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/17 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 3 contributing companies or organizations -- score normalized to 10
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — немає даних
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,5
Виключено з оцінювання (немає даних або не застосовно): signed_releases. Залишкові ваги перенормовано.
Як обчислюється оцінка
35/35Прямі залежності без відомих сповіщень — жодна пряма залежність не має відомих сповіщень
25/25Непрямі залежності без відомих сповіщень — жодна непряма залежність не має відомих сповіщень
0/40Немає задавнених сповіщень — жодне сповіщення не має дати публікації
Використані вхідні дані
sourceosv
advisories0
affected_packages0
assessed_packages89
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Виключено з оцінювання (немає даних або не застосовно): Немає задавнених сповіщень. Залишкові ваги перенормовано. Звірено з runtime-замиканням залежностей npm:@hellcoder/companion@0.108.0 — тим, що тягне за собою встановлення опублікованого пакета, — 89 пакетів. Досяжність не аналізується.

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

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

81Добрий · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — AGENTS.md, CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 69 з 69 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes10 656
Як обчислюється оцінка
18/18Розгортання однією командою — Makefile
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — landing/tsconfig.json, platform/tsconfig.json, relay/tsconfig.json, web/tsconfig.json
10/10Відтворюване середовище — Dockerfile
10/10Підтверджена практика роботи з агентами — 52 з останніх 100 комітів створено агентом або з його зазначенням
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfiles
has_dockerfileтак
typed_languageтак
bootstrap_filesMakefile
has_devcontainerні
has_linter_configні
typecheck_configslanding/tsconfig.json, platform/tsconfig.json, relay/tsconfig.json, web/tsconfig.json
agent_commit_share0,52
toolchain_manifests
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — TypeScript (статично типізована)
53.2/55Керовані розміри файлів — 17/522 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageTypeScript
largest_source_bytes234 876
source_files_sampled522
oversized_source_files17

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

1зірок GitHub
16контриб'юторів
582комітів за останні 12 місяців
5днів від останнього пушу
23релізів
1бас-фактор
0відкритих issue
npmпакетних екосистем

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

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

Докладніше

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

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-25 05:15 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
5CI-Tests16 out of 28 merged PRs checked by a CI test -- score normalized to 5
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/17 approved changesets -- score normalized to 0
10Contributorsproject has 3 contributing companies or organizations -- score normalized to 10
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Прямі залежності 38
РеєстрПакетОбмеження версіїМаніфест
npmreact^19.0.0landing/package.json
npmreact-dom^19.0.0landing/package.json
npmthe-companion^0.2.2package.json
npmbetter-auth^1.4.0platform/package.json
npmclass-variance-authority^0.7.1platform/package.json
npmclsx^2.1.1platform/package.json
npmdrizzle-orm^0.39.0platform/package.json
npmhono^4.7.0platform/package.json
npmlucide-react^0.575.0platform/package.json
npmdrizzle-kit^0.30.0platform/package.json
npmpostgres^3.4.8platform/package.json
npmreact^19.0.0platform/package.json
npmreact-dom^19.0.0platform/package.json
npmresend^6.9.4platform/package.json
npmstripe^17.0.0platform/package.json
npmtailwind-merge^3.5.0platform/package.json
npm@codemirror/lang-cpp^6.0.3web/package.json
npm@codemirror/lang-css^6.3.1web/package.json
npm@codemirror/lang-html^6.4.11web/package.json
npm@codemirror/lang-java^6.0.2web/package.json
npm@codemirror/lang-javascript6.2.4web/package.json
npm@codemirror/lang-json^6.0.2web/package.json
npm@codemirror/lang-markdown^6.5.0web/package.json
npm@codemirror/lang-python^6.2.1web/package.json
npm@codemirror/lang-rust^6.0.2web/package.json
npm@codemirror/lang-sql^6.10.0web/package.json
npm@codemirror/lang-xml^6.1.0web/package.json
npm@codemirror/lang-yaml^6.1.2web/package.json
npm@codemirror/view6.39.15web/package.json
npm@uiw/react-codemirror4.25.4web/package.json
npmaxe-core^4.11.1web/package.json
npmcroner^10.0.1web/package.json
npmdiff^8.0.3web/package.json
npmfzf^0.5.2web/package.json
npmhono^4.7.0web/package.json
npmposthog-js^1.347.2web/package.json
npmqrcode^1.5.4web/package.json
npmws^8.19.0web/package.json
Усі залежності не зібрано

Не вдалося зібрати розв'язаний набір залежностей для цього звіту: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Сповіщення про залежності 0

Встановлення npm:@hellcoder/companion@0.108.0 тягне 89 пакетів, прямих і транзитивних: 0 мають відомі сповіщення, з них 0 — прямі залежності.

Жодне відоме сповіщення не стосується оцінених залежностей.

Сповіщення означає, що версія, записана в графі залежностей, потрапляє в уражений діапазон. Досяжність не аналізується, а граф містить піниї розробки й тестування — знахідка може стосуватися інструментів, а не поставленого коду.

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": true,
      "size_kb": 10081,
      "has_wiki": true,
      "homepage": "https://thecompanion.sh",
      "languages": {
        "CSS": 23037,
        "HTML": 2753,
        "Shell": 16770,
        "Makefile": 373,
        "Dockerfile": 1356,
        "JavaScript": 6576,
        "TypeScript": 6785665
      },
      "pushed_at": "2026-07-19T08:09:08Z",
      "created_at": "2026-04-20T02:03:48Z",
      "owner_type": "User",
      "updated_at": "2026-07-19T08:09:12Z",
      "description": "Web & Mobile UI for Claude Code & Codex . Launch sessions, stream responses, approve tools.  All from your browser / mobile",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Moritz",
      "type": "User",
      "login": "hellcoderGIT",
      "company": null,
      "location": null,
      "followers": 1,
      "avatar_url": "https://avatars.githubusercontent.com/u/5343954?v=4",
      "created_at": "2013-08-30T03:47:36Z",
      "is_verified": null,
      "public_repos": 3,
      "account_age_days": 4712
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "companion-v0.108.0",
          "kind": "other",
          "published_at": "2026-07-19T07:57:46Z"
        },
        {
          "tag": "companion-v0.107.0",
          "kind": "other",
          "published_at": "2026-07-08T07:56:14Z"
        },
        {
          "tag": "companion-v0.106.0",
          "kind": "other",
          "published_at": "2026-07-06T09:40:27Z"
        },
        {
          "tag": "companion-v0.105.3",
          "kind": "other",
          "published_at": "2026-07-02T06:15:33Z"
        },
        {
          "tag": "companion-v0.105.2",
          "kind": "other",
          "published_at": "2026-07-01T00:33:38Z"
        },
        {
          "tag": "companion-v0.105.1",
          "kind": "other",
          "published_at": "2026-06-26T05:26:57Z"
        },
        {
          "tag": "companion-v0.105.0",
          "kind": "other",
          "published_at": "2026-06-23T08:00:11Z"
        },
        {
          "tag": "companion-v0.104.3",
          "kind": "other",
          "published_at": "2026-06-19T10:40:43Z"
        },
        {
          "tag": "companion-v0.104.2",
          "kind": "other",
          "published_at": "2026-06-19T09:56:02Z"
        },
        {
          "tag": "companion-v0.104.1",
          "kind": "other",
          "published_at": "2026-06-18T07:35:46Z"
        },
        {
          "tag": "companion-v0.104.0",
          "kind": "other",
          "published_at": "2026-06-18T04:00:54Z"
        },
        {
          "tag": "companion-v0.103.0",
          "kind": "other",
          "published_at": "2026-06-18T03:25:29Z"
        },
        {
          "tag": "companion-v0.102.1",
          "kind": "other",
          "published_at": "2026-06-17T04:17:19Z"
        },
        {
          "tag": "companion-v0.102.0",
          "kind": "other",
          "published_at": "2026-06-16T09:24:18Z"
        },
        {
          "tag": "companion-v0.101.2",
          "kind": "other",
          "published_at": "2026-06-15T01:51:10Z"
        },
        {
          "tag": "companion-v0.101.1",
          "kind": "other",
          "published_at": "2026-06-13T08:26:58Z"
        },
        {
          "tag": "companion-v0.101.0",
          "kind": "other",
          "published_at": "2026-06-12T00:53:44Z"
        },
        {
          "tag": "companion-v0.100.0",
          "kind": "other",
          "published_at": "2026-06-11T05:52:05Z"
        },
        {
          "tag": "companion-v0.99.1",
          "kind": "other",
          "published_at": "2026-05-26T07:06:12Z"
        },
        {
          "tag": "companion-v0.99.0",
          "kind": "other",
          "published_at": "2026-05-15T07:15:21Z"
        },
        {
          "tag": "companion-v0.98.0",
          "kind": "other",
          "published_at": "2026-05-15T05:44:11Z"
        },
        {
          "tag": "companion-v0.97.0",
          "kind": "other",
          "published_at": "2026-04-20T03:34:37Z"
        },
        {
          "tag": "companion-v0.96.0",
          "kind": "other",
          "published_at": "2026-04-20T02:56:35Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "9a11f0fa3b506ab9c0c107965c681417fd4d8d3b",
          "body": "… path\n\nnpm@latest resolved to npm 12, which requires Node >= 22 and broke the\nTrusted Publishing upgrade step on the Node 20 runner. Also allows manually\ndispatching a publish when release-please has already tagged the release.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci(publish): pin npm@11 and Node 22; add workflow_dispatch re-publish…",
          "author_name": "MoeClaudeUI",
          "author_login": null,
          "committed_at": "2026-07-19T08:09:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e8c410a40457bcf492f9cd0a22a843ccc637b09e",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.108.0 (#63)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-19T07:57:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f983b4dccd45419cd6711bee368531c17c0622b4",
          "body": "…(#62)\n\n* feat(dashboard): add project dashboard with nightly AI session summaries\n\nAdds an opt-in project dashboard that shows where every session stands:\n- Nightly summarizer job (croner) summarizes each Claude session transcript\n  changed since the last run via the Anthropic API (Haiku 4.5 by def\n[…]\ne CLI availability instead.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dashboard): project dashboard with nightly AI session summaries …",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-07-19T04:06:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9f18d7bc7ba5c8932e2615a3f0fc4ddc611158f9",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.107.0 (#61)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-08T07:56:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b270e2fb13d2c29e51a425c7853e5348c92554d",
          "body": "Add `claude-sonnet-5` (Claude 5-family Sonnet) as a selectable Claude\nmodel and remove the now-superseded Sonnet 4.6 entry. Update the model\npicker tests (backends, ModelSwitcher, HomePage) accordingly.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(models): add Sonnet 5 to Claude model picker (#60)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-07-08T07:55:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1601ff9886e41e7e2ad395c251ace6643007eb10",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.106.0 (#59)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-06T09:40:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "903b01f92e6b8a537e652c737ea1b6eb97625602",
          "body": "…ch (#58)\n\nThe proactive keepalive auto-relaunches a CLI process that exits with no\nbrowser attached, to keep long-running sessions (agents, cron) alive. Add a\nglobal setting (proactiveKeepaliveEnabled, default on) so operators can turn\nit off and let dead sessions stay dead while experimenting.\n\nsc\n[…]\nnager, the settings REST route (with boolean validation),\nand a toggle in Settings → General.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(settings): add kill-switch to disable proactive keepalive relaun…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-07-06T09:39:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "86a5a7315f6baace1812efeb88e622577a355a1b",
          "body": "Scheduled agents used process liveness (isAlive) as the overlap guard, but\nthe stdio CLI stays alive after a turn until the session is archived — so\nisAlive was permanently true and every subsequent scheduled run was skipped\nuntil someone manually archived the open session.\n\nAdd a per-agent restartM\n[…]\nkip\" preserves the old wait-if-open\nbehavior. Manual/forced runs still bypass the skip guard.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agents): terminate leftover session before scheduled runs (#57)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-07-06T09:38:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "50e8ea3f8601a1b3c1541662dd5dc265d9d47606",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.105.3 (#56)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-02T06:15:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e81f5cca3bd51243856a516e06d982f0a437409a",
          "body": "… (#55)\n\nNon-image uploads to a Claude session are supposed to be written to\n<cwd>/.companion-uploads/ and referenced by relative path so Claude reads\nthem from disk with its Read tool. PDFs were exempt: they were inlined as\nbase64 `document` blocks and handed to Claude directly. That pushes the who\n[…]\nery other non-image file. Only images inline now,\nwhich matches the Codex adapter's behavior.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(claude-adapter): stage PDFs to disk instead of inlining to Claude…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-07-02T06:14:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b9a7e0f53b200430a161347ed784586345814d24",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.105.2 (#54)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-01T00:33:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "464c71f0511afccc385b25a2bdd342ccf90ab906",
          "body": "…ean turn-end (#53)\n\nWhen the Claude CLI's stdout EOFs right after a turn-ending `result`, the\nprocess is shutting down cleanly but can take longer than the 2s grace to\nflush teardown (MCP servers, etc.) and exit code-0. The adapter was\nSIGTERM-ing it during that window, converting a code-0 exit int\n[…]\ncovery. The result grace stays\nbounded so a teardown deadlock after a result is still killed.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(claude-adapter): stop relaunch churn from premature SIGTERM on cl…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-07-01T00:29:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "88c45ae6528fb2b79c3129c3d1aed73d9a54a831",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.105.1 (#51)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-26T05:26:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "191e34274de2d2f801b61833d61509409d9ccc21",
          "body": "…#52)\n\n* fix(codex): fetch model list live from app-server, drop stale cache\n\nRecent Codex releases (0.142.x, GPT-5.5) no longer write\n~/.codex/models_cache.json and serve their model catalog over the\napp-server `model/list` RPC instead. The companion's model picker read\nthe now-missing cache file, \n[…]\n to satisfy the 80% gate.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(codex): fetch model list live from app-server, drop stale cache (…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-26T05:26:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "10d7236f3c5818e486a5d690e8ebf07b25d50043",
          "body": "Up to ~10 minutes of silence is normal for long-running agents (builds,\nlarge web fetches, subagents), so warning at 7 minutes fired too eagerly.\nRaise ACTIVITY_STALLED_MS from 7 to 15 minutes and add a regression test\nasserting 10 minutes still reads as \"quiet\" rather than \"may be stuck\".\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(feed): raise \"may be stuck\" warning to 15min (#50)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-24T13:51:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2b64152d87fccc086f2694179c28dec398120769",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.105.0 (#49)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-23T08:00:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "280fa4c64d7c214f4e2998e381cb07c6b4e42ae0",
          "body": "Add an effort dropdown next to the model selector so a session can be\nlaunched at a specific reasoning effort (Low / Medium / High / xHigh /\nMax), mapped to the Claude Code CLI's --effort flag. The default option\npasses no flag, so the model keeps its own built-in default effort.\n\n- Claude-only: Cod\n[…]\nionStream -> CreateSessionRequest -> launcher,\n  which adds `--effort <level>` only when non-empty and preserves it\n  across --resume relaunch.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(home): add reasoning-effort selector to the new-session screen",
          "author_name": "MoeClaudeUI",
          "author_login": null,
          "committed_at": "2026-06-22T03:02:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d720c0a8e1beb90855c8775303e0e6801864b2a4",
          "body": "Replay an in-flight user turn after a --resume relaunch so a CLI death\nmid-turn no longer leaves the session waiting forever; detect auth\nfailures and skip auto-relaunch (which only loops back into the same\nexpired credentials) in favour of a re-login affordance; and re-queue\nmessages that hit a dyi\n[…]\nead pipe.\n- Surface an auth failure as a single re-login banner (drop the duplicate\n  auth_status bubble that stacked the same guidance twice).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): recover sessions that hang after CLI death or auth failure",
          "author_name": "MoeClaudeUI",
          "author_login": null,
          "committed_at": "2026-06-22T03:02:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2961437fea9a65bccdfccb162ccf9c2fc4c5b8d3",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.104.3 (#47)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-19T10:40:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0143a8187bc115b7a92143d80db46d6e94e77582",
          "body": "…#46)\n\nThe stdio adapter killed any CLI whose stdout EOF'd while the process was\nstill alive. But the CLI routinely closes stdout a beat *before* it exits\ncleanly (e.g. right after a `result`), so this converted a code-0 exit into a\nSIGTERM (143) and forced a needless --resume relaunch — churning he\n[…]\n wedged processes (e.g. stopped emitting after a 429)\nwhile no longer clobbering clean exits.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(adapter): grace period before killing a CLI whose stdout closed (…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-19T10:39:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "484509dc6b195d07c4bc2376b060f79e360e9f27",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.104.2 (#45)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-19T09:55:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "edae64b586427e80a921003e854c759f4bb84d08",
          "body": "…(#44)\n\n* fix(session): cap auto-relaunch with a rolling window to stop invisible crash loops\n\nThe per-attempt budget (MAX_AUTO_RELAUNCHES) only catches *fast* re-crashes.\nA session that crashes every minute or two stays connected just long enough\n(> HEALTHY_UPTIME_MS) for scheduleHealthyReset to wi\n[…]\n and the Playground mock.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: stop invisible CLI relaunch loops and delay stuck warning to 7m …",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-19T09:49:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2ec188a248a5505938e4ebb318c455730d83d184",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.104.1 (#43)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-18T07:35:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8af18671e5190c3693a865bb0e55f31e30b93f26",
          "body": "…uck-session diagnostics (#42)\n\nWhen a turn is interrupted mid-stream (CLI crash/relaunch/disconnect/reconnect),\nthe client cleared sessionStatus and the composer spinner but left the in-flight\nisStreaming draft message in the feed. With no \"Generating\" bar (gated on\nsessionStatus === \"running\") and\n[…]\nices in the chat, and\nstructured logs (browser + Companion server) for the next error search.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(session): clear orphaned streaming draft on interruption + add st…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-18T07:09:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d39343037dea48a8eecc617ad8e63c4a14fba348",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.104.0 (#40)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-18T04:00:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c84217ad0173229d4e450f7904510e89640a9ca",
          "body": "Surfaces host memory usage so an approaching out-of-memory condition is\nvisible at a glance (we hit OOM on another server and it was hard to spot).\n\n- New GET /api/system/memory endpoint. On Linux it reads /proc/meminfo and\n  uses MemAvailable (accounts for reclaimable cache → real OOM headroom),\n  \n[…]\nored red >80% / amber >50%). Polls once a\n  minute — cheap and slow-moving. Backend-agnostic.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(panel): add server memory usage meter to the side panel (#41)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-18T04:00:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0e79d7f104e55a6626284000599eb57a42a6a4fb",
          "body": "… (#39)\n\nReplaces the auto-derived initials with the intended behaviour:\n\n- The session prefix is the user's own initials, typed by them. Placeholder\n  is \"e.g. MA\" (no longer \"billing\"); it is not derived from the name.\n- \"Your name\" stays first-name only (placeholder \"e.g. Moritz\").\n- When no pref\n[…]\nthe auto-generated name, so\n  the session is named \"{prefix}_{topic}\" (e.g. \"MA_InvoicePdf\").\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(home): refine session naming — typed prefix, name fallback, topic…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-18T03:49:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b2e038144e51ba8e77e29fb5e645e9cc2c2ef9f2",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.103.0 (#37)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-18T03:25:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c76442a4d0cd169ff865ee4062242dea21e2e2f1",
          "body": "…topic (#38)\n\nTwo small new-session naming improvements:\n\n- The session prefix now defaults to the user's initials (e.g. \"Moritz\n  Aschoff\" -> \"MA\") instead of the \"billing\" example placeholder. When no\n  prefix is explicitly set, the initials are used so sessions are tagged\n  with who created them.\n[…]\nrefix}_{topic}\" (e.g. \"MA_InvoicePdf\"). Empty topic falls back to the\n  existing random name.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(home): default session prefix to user initials and add optional …",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-18T03:24:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6929c50f45c7507060a71f5928a8a6dde5dcb189",
          "body": "…#36)\n\nThe working indicator was gated solely on sessionStatus === \"running\",\nwhich only flipped reliably after a full assistant message or a\nsession_phase event — neither covers the initial pre-first-token wait or\nevery streaming flow. As a result the indicator was often missing, and\nthere was no w\n[…]\ndex (both emit tool_progress + message flow).\nAdds Playground states and tests for all tiers.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(session): make \"Generating\" indicator reliable and stall-aware (…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-18T03:03:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "47cd6bc1b049628c5d34bb8d5fd7c9e1c2887f1a",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.102.1 (#35)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-17T04:17:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c720db6ea3a1e21fac695bc9f1517fbffb81faad",
          "body": "…m image (#34)\n\nThe sandbox/container feature relied on the upstream, no-longer-maintained\ndocker.io/stangirard/the-companion image (run privileged). To avoid pulling or\nrunning an unmaintained image, sandbox support is now DISABLED by default behind\na feature flag. The code is kept intact so we can\n[…]\n\" notice (no pulls).\n\nRe-enable with COMPANION_SANDBOX_ENABLED=1 + VITE_SANDBOX_ENABLED=true.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(sandbox): disable sandbox behind a flag; stop using the upstrea…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-17T04:15:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "62b14e82a03ec7131a0b6b2777e6c77043bc4a92",
          "body": "… name saved (#33)\n\nThe Context panel (where identity is normally edited) only exists inside an\nopen session, so a fresh browser had no way to set a name. Surface the\nname/prefix inputs on the new-conversation screen when no name is saved yet,\nand make the name mandatory in that case. Once a name is\n[…]\nen hides the inputs again and reuses the saved value (still editable from\nthe Context panel).\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(session): show identity inputs on new-conversation screen when no…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-17T04:13:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1b57e0b7694864da3f5ed9a2812e37e71c664340",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.102.0 (#31)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-16T09:24:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dcfb68fb85fd9614d8778bfccfb7d2ad3cf0cf7e",
          "body": "…ptional (#32)\n\nThe name/prefix rarely change, so the prominent new-session form was the\nwrong home for them. Move the inputs into the Context panel (TaskPanel) as\na new \"Identity\" section, and stop requiring a name to start a session.\n\n- New IdentitySection in TaskPanel with name + prefix inputs, p\n[…]\nsage, prefix applied to the session name) when present.\n- Both fields are now fully optional.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(session): move identity inputs to Context panel, make name o…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-16T09:22:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7025b263ce8e6d038861b8793cffc5565955c0ca",
          "body": "…r (#30)\n\nRequire a name before creating a session and allow an optional session\nprefix. The name is injected into the initial message as \"[Name]: ...\"\nso the agent knows who it's talking to, and the prefix is applied to the\ngenerated session name as \"{prefix}_{Generated Name}\".\n\n- userName threads \n[…]\nult) and \"No user data\" options; only shown once\n  sessions carrying a user name have loaded.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(session): add user identity, name prefix, and sidebar user filte…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-15T08:52:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9d828d9bba5f4b34f16f11679187595c087bc0af",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.101.2 (#29)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-15T01:50:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ecc9d071844d43f522b8d8e25d3033411a75f969",
          "body": "The CLI's AskUserQuestion handler looks each answer up by the question's\nfull text, but the UI keyed the answers object by question index (\"0\").\nThe lookup missed, so the CLI returned an empty result (\"User has answered\nyour questions: .\") and the model never saw the choice — it just guessed.\n\nMap i\n[…]\n keys before sending. This was\ntransport-independent (broken under both --sdk-url and stdio).\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(permission): key AskUserQuestion answers by question text (#28)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-15T01:49:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "485e510a709556174dd154fc2b6766633aff8318",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.101.1 (#27)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-13T08:26:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58af44d2634d2edb981144fab48a200f970be022",
          "body": "…me (#26)\n\nGate the auto-relaunch crash budget on real uptime instead of spawn success, so a session whose CLI keeps dying right after --resume stops looping after MAX_AUTO_RELAUNCHES and surfaces a clear in-chat message. Adds regression tests.",
          "is_bot": false,
          "headline": "fix(orchestrator): stop infinite crash-relaunch loop on poisoned resu…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-13T08:25:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "caa3049520c42c34c878de0b68418dcbc476714d",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.101.0 (#25)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-12T00:53:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "915ae6b7ae2186886e620e59f5903ecbc69a6228",
          "body": "Adds an Export button in the session header (TopBar) with a dropdown offering:\n- Download as HTML — self-contained file with images embedded inline as data:\n  URIs (thinking blocks collapsible, tool calls + results rendered).\n- Download as Text — plain transcript; images become\n  `[image: <type>, ~N\n[…]\nname),\nExportMenu (render + axe + interactions + error path), api.exportSession.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(session): add session export to HTML or text (#24)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-12T00:52:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "62f315f0a11f63944d02650687ce0fd7bc562e9c",
          "body": "The Claude stdio (stream-json) adapter flipped `stdioConnected = false` on\ntransport loss but never fired its disconnect callback — unlike the WebSocket\npath (`detachWebSocket`) and the CodexAdapter (`proc.exited` →\n`cleanupAndDisconnect`). As a result the bridge kept believing the backend was\nattac\n[…]\nats on `cli_disconnected` so the spinner\n  stops and the reconnect banner shows.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(claude): recover stuck stdio sessions when the transport dies (#23)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-12T00:52:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fc6fbdf05eee9e79ba35521b196ebded9654968e",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.100.0 (#20)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-11T05:51:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3590f0e7005877cba89e234bf2bf6efc1edcec1f",
          "body": "After the stdio stream-json migration the companion no longer uses --sdk-url,\nso the 2.1.121/2.1.170 lockdowns can't affect sessions. The ClaudeCompatBanner\nwas still firing on any 2.1.121+ binary (\"rejects local --sdk-url — sessions\nwill fail until you pin or patch\"), which is now false and mislead\n[…]\naude-patcher,\nclaude-tls, cli-ingress-server, and the legacy --sdk-url WS path).\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(claude): remove obsolete --sdk-url compatibility banner (#22)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-11T05:50:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8008b9f4250f252691ee6985044d30b6c1cd8ee2",
          "body": "…l (#21)\n\n* feat(claude): drive Claude over stdio stream-json instead of --sdk-url\n\nThe `--sdk-url` WebSocket bridge is built on an undocumented, internal\nRemote-Control flag that Anthropic progressively locked down: 2.1.121 added a\nhostname allowlist (localhost rejected) and 2.1.170 made worker-reg\n[…]\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(claude): drive Claude over stdio stream-json instead of --sdk-ur…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-11T05:32:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5d5d2f34f620fee60fec674cd799666f1e065388",
          "body": "… list (#19)\n\n- claude-opus-4-8 becomes the new default (replaces 4.7 at the top of CLAUDE_MODELS)\n- claude-fable-5 added with ★ icon to mark the new Mythos-class tier; not the default since its safeguards route ~5% of sessions back to Opus 4.8\n- Updated the affected default-model assertions in back\n[…]\ndel ID claude-opus-4-8).\"\n  claude-fable-5  → \"I'm Claude Fable 5 (model ID claude-fable-5).\"\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(models): add Opus 4.8 and Fable 5 (Mythos-class) to Claude model…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-06-10T10:55:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3449f1bf46268d3992e1f35c38eb454c8aa492f0",
          "body": "Replaces the long-lived NPM_PUBLISH_TOKEN secret with GitHub OIDC.\nThe runner mints a short-lived id-token that npm verifies against the\ntrusted-publisher config registered on @hellcoder/companion. No more\ntoken rotation, no EOTP failures from 2FA-protected publish tokens.\n\n- Adds permissions: id-to\n[…]\nww.npmjs.com/package/@hellcoder/companion/access\n(done out-of-band before this PR is merged).\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: switch npm publish to Trusted Publishing (OIDC) (#18)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-05-26T07:19:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a5ca89224ca884f8e6ee4e232e23c1884792702d",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.99.1 (#17)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-26T07:06:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bea346e2118abe8f1494f33ef9a5c2426d60fe29",
          "body": "…rade (#16)\n\n* fix(session-store): default to ~/.companion/sessions, never /tmp\n\n0.99.0 switched the default session directory to $TMPDIR/vibe-sessions,\nwhich on most Linux hosts is /tmp — wiped on every reboot and not\ndiscoverable to anyone with an existing ~/.companion/ corpus.\n\nDefaults to join(C\n[…]\na separate justification.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: restore ~/.companion/sessions default and drop root bypass downg…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-05-26T07:05:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "07cba316a3b0f48bc1fd1bedd20224d7b2218038",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.99.0 (#14)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-15T07:14:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6294bbe0f1cae2a059528dfa5d19e331483fe899",
          "body": "…nk resolution (#15)\n\nThree follow-ups to feat(claude-compat) (#13):\n\n1. detectPatched now streams the full binary instead of slicing the first\n   32 MiB. In observed Claude 2.1.142 builds the marker sits at ~166 MB\n   and ~217 MB out of 232 MB, so the previous head-of-file slice always\n   reported \n[…]\n FALSE in 378 ms\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(claude-compat): detect patched binary anywhere in file, fix symli…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-05-15T07:08:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "15d15e5fed0bf4f843fff71c433cccc2ff657ce3",
          "body": "…m UI (#13)\n\nClaude Code CLI 2.1.121 (~2026-04-27) added a static hostname allowlist to\n--sdk-url that rejects every non-Anthropic host (validator YR4, set KU5).\nStock 2.1.121+ binaries make every spawned companion session exit immediately\nwith \"host 127.0.0.1 is not an approved Anthropic endpoint\" \n[…]\nal dependencies.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(claude-compat): detect 2.1.121+ lockdown and offer pin/patch fro…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-05-15T06:40:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8e92f12d324d2c82673c7a94c2f8e42af8e051ef",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release companion 0.98.0 (#8)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-15T05:44:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8cac0884aff7cfd982370feb2e21e82bbae54ed3",
          "body": "…off bridge mode (#655) (#12)\n\nClaude Code v1.2.1+ rejects the literal hostname \"localhost\" in --sdk-url\nas a cross-site WebSocket hijacking hardening measure, breaking spawned\nCLI sessions. This change:\n\n* Switches the non-containerized branch in spawnCLI to ws://127.0.0.1\n  to bypass the string-ma\n[…]\nh settings-manager, settings-routes, api.ts and a new row\nin the General tab of SettingsPage.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli-launcher): use 127.0.0.1 in --sdk-url; add optional JSON-hand…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-05-15T04:22:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0f40433288e7e3628a5312e76e430d574837fe51",
          "body": "…or queued messages (#11)\n\nNon-image attachments are staged to <cwd>/.companion-uploads/ so the model\ncan Read them. This relied on sessionCwd being populated from system_init,\nbut system_init only arrives after the CLI WebSocket connects. User\nmessages sent before that point (very common: the bridg\n[…]\nually written to\n  disk under <cwd>/.companion-uploads/ when cwd is provided at construction.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(attachments): pass cwd at adapter construction so staging works f…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-05-10T14:29:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bc75eae8002b5180ba545484bb45dd8929b8b8c7",
          "body": "CI's jscpd@latest reports a higher duplication score than locally\n(1.6% vs 1.28% on the same SHA), so:\n\n- Extract IconToolbarButton + SaveAsPromptIcon and shared\n  openSavePromptModal helper, eliminating the remaining mobile/desktop\n  duplication of the Save-as-prompt and Attach-file buttons\n- Pin j\n[…]\nplication from 1.6% (CI failure) to 1.2% locally and removes\nall flagged Composer.tsx clones.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(composer): extract more shared toolbar buttons; pin jscpd (#10)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-05-10T11:20:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a28c1043ae5905bd84fa006e36881092e7ad6716",
          "body": "…DRY guard (#9)\n\nThe mobile and desktop toolbar layouts each duplicated the mode-toggle\nand send/stop buttons, pushing the jscpd duplication score over the\n1.5% threshold (CI was failing at 1.69%). Extracting these into small\nhelper components drops the score to 1.28% with no behavior change.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(composer): extract ModeToggleButton/SendOrStopButton to fix …",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-05-10T11:09:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8b1140ec099e1e05a1418feabbf328558b52753f",
          "body": "Replaces the image-only upload flow with a generic attachment pipeline\nso users can drag-drop, paste, or pick any file. Images and PDFs are\nembedded inline as Claude content blocks; everything else is staged\nto <cwd>/.companion-uploads/ so Claude's Read tool can access it.\n\nAdds server-side validati\n[…]\nze (25MB/file, 100MB/message) and\nbase64 well-formedness, since clients can lie about either.\n\nCo-authored-by: MoeClaudeUI <hellcoder@gmail.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(attachments): support uploading any file type, not just images (#7)",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-05-10T10:54:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6e9b64e21124aaaf088023471e4e3cbb14214af7",
          "body": "docs(moritz): add server-migration runbook",
          "is_bot": false,
          "headline": "Merge pull request #6 from hellcoderGIT/docs/moritz-edition-migration",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-04-20T06:08:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ebdafcae7abf7c605204824fe098f5bf19cf01b",
          "body": "Operational runbook for cutting an existing the-companion install over to\n@hellcoder/companion without losing ~/.companion state. Self-contained so\nit can be handed verbatim to an agent on a target server.\n\nLives at the top of docs/ rather than inside the Mintlify nav tree\n(docs.json) because it's internal ops guidance, not user-facing product\ndocs — Mintlify ignores stray .md files not listed in docs.json.",
          "is_bot": false,
          "headline": "docs(moritz): add server-migration runbook",
          "author_name": "MoeClaudeUI",
          "author_login": null,
          "committed_at": "2026-04-20T06:08:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "684fe6013c1c6cee3ae8ebba79d47f7f3fc6b24a",
          "body": "…n--components--companion\n\nchore(main): release companion 0.97.0",
          "is_bot": false,
          "headline": "Merge pull request #5 from hellcoderGIT/release-please--branches--mai…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-04-20T03:34:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef014d3bfec256a3c8fff6f3463496d16cb44c7b",
          "body": null,
          "is_bot": true,
          "headline": "chore(main): release companion 0.97.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-04-20T03:32:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "00d0601a8a53ed77f65459084de064fa9eeb48a7",
          "body": "feat(ui): copy-to-clipboard button on code and tool-output blocks",
          "is_bot": false,
          "headline": "Merge pull request #4 from hellcoderGIT/feat/copy-code-button",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-04-20T03:32:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c38495df6ddbc158b970973737f008b398ba83a",
          "body": "Addresses a long-standing selection-reset problem: when the assistant or a\ntool is streaming, React swaps the <pre> subtree on each new token, which\nwipes any text selection the user had made. The workaround was to pause or\nscroll to stop streaming before copying — awkward. A dedicated copy button\ns\n[…]\npyButton.test.tsx (7 cases covering render/click/success/\nfail/aria/axe) and three new assertions in MessageBubble.test.tsx that\nverify the button appears on each surface. Full suite 4952 / 4952 pass.",
          "is_bot": false,
          "headline": "feat(ui): add copy-to-clipboard button on code and tool-output blocks",
          "author_name": "MoeClaudeUI",
          "author_login": null,
          "committed_at": "2026-04-20T03:31:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ab2759cba6ee58cdde44415056b94275f610588e",
          "body": "…n--components--companion\n\nchore(main): release companion 0.96.0",
          "is_bot": false,
          "headline": "Merge pull request #2 from hellcoderGIT/release-please--branches--mai…",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-04-20T02:56:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26b3d44a9476042e59d17bf5d74dcded5b0c786c",
          "body": null,
          "is_bot": true,
          "headline": "chore(main): release companion 0.96.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-04-20T02:56:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ccc9c0d6c1f0d526d5ca1134241cd2656d2ad637",
          "body": "feat(models): add Claude Opus 4.7 and Codex GPT-5.3 xHigh/Max",
          "is_bot": false,
          "headline": "Merge pull request #3 from hellcoderGIT/feat/opus-4-7-and-xhigh-max",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-04-20T02:54:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5aa41ea2b4483986b601b478f0e4c212aea5d1b9",
          "body": "Add the newest Anthropic and OpenAI reasoning tiers as selectable models:\n\n- CLAUDE_MODELS: insert claude-opus-4-7 (\"Opus 4.7\") at the top so it\n  becomes the default for new Claude sessions. 4.6, Sonnet 4.6 and\n  Haiku 4.5 remain available.\n- CODEX_MODELS: insert gpt-5.3-codex-max (\"GPT-5.3 Max\") a\n[…]\n-7.\n- ModelSwitcher.test.tsx: the lone /Opus/ regex now matches two options\n  (4.7 and 4.6), so tests that needed a single match are tightened to\n  /Opus 4\\.6/ or /Opus 4\\.7/.\n\n4942 / 4942 tests pass.",
          "is_bot": false,
          "headline": "feat(models): add Claude Opus 4.7 and Codex GPT-5.3 xHigh/Max variants",
          "author_name": "MoeClaudeUI",
          "author_login": null,
          "committed_at": "2026-04-20T02:54:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e1a11e4617419190e9ecfdf4cd01174a4caa9c5a",
          "body": "feat(fork): Moritz Edition branding + own npm release channel",
          "is_bot": false,
          "headline": "Merge pull request #1 from hellcoderGIT/feat/moritz-edition",
          "author_name": "Moritz",
          "author_login": "hellcoderGIT",
          "committed_at": "2026-04-20T02:28:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db54769c042a35327aa2c8848785d1c6316cbff4",
          "body": "The existing publish.yml and preview.yml pushed docker images to\nstangirard/the-companion on Docker Hub — that's upstream's registry, not\nours, and we have no credentials for it. The auto-updater in the app only\npolls npm, so npm publishing is the only piece of the release pipeline\nthis fork actuall\n[…]\ner\n- delete docker.yml and docker-server.yml (standalone image builders; we\n  can add our own under ghcr.io/hellcoderGIT later if we want)\n\nPrereq: NPM_PUBLISH_TOKEN repo secret is already configured.",
          "is_bot": false,
          "headline": "ci: drop upstream Docker Hub publishing, keep npm release pipeline",
          "author_name": "MoeClaudeUI",
          "author_login": null,
          "committed_at": "2026-04-20T02:25:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "46627a6e2d4e32b775780b0180a4f614e08fd715",
          "body": "Make the fork visually distinguishable from upstream so we can tell at a\nglance which build is running. Adds a small \"Moritz Edition\" pill next to\nthe \"The Companion\" wordmark on the home page and an \"ME\" pill on the\nsidebar, both using the existing cc-primary brand color. Also updates the\n<title>, \n[…]\nile-web-app-title meta, and PWA manifest name.\n\nExisting component tests still assert on \"The Companion\" text and alt\nattribute; both are preserved, so all 154 HomePage/Sidebar tests continue\nto pass.",
          "is_bot": false,
          "headline": "feat(ui): add Moritz Edition badge to wordmark",
          "author_name": "MoeClaudeUI",
          "author_login": null,
          "committed_at": "2026-04-20T02:25:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b1cd299dc767814fe5be1a5222a5dff1171c2480",
          "body": "…updater\n\nSwitch the npm package name from the-companion to @hellcoder/companion so our\nfork can publish its own releases without colliding with upstream. The update\nchecker now polls the scoped package on npm, and the in-app Update & restart\nbutton installs from our package. Bin names (the-companio\n[…]\n-routes.ts: bun install -g uses the new name\n- release-please-config.json: package-name updated to match\n- tests updated accordingly (55 tests passing in the two touched files,\n  4939 passing overall)",
          "is_bot": false,
          "headline": "feat(fork): rename package to @hellcoder/companion and retarget auto-…",
          "author_name": "MoeClaudeUI",
          "author_login": null,
          "committed_at": "2026-04-20T02:25:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "52883144858f62d6f9b418c00432279f28d119d4",
          "body": "## Summary\n- expand the saved prompt editor into a wider split-layout workspace\n- give the content editor substantially more room for long prompt\nauthoring\n- improve scope and storage sections so metadata stays readable while\nediting\n\n## Why\n- the previous inline form was too cramped for longer reus\n[…]\npre-commit hook: cd web && bun run typecheck && bun run test --\n--coverage\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(prompts): expand prompt editor workspace (#640)",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-04-02T18:39:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4c9dbab91094d0d83a04c79681e6e153d7f17652",
          "body": "… (#639)\n\n## Summary\n- When the CLI exits plan mode autonomously (after ExitPlanMode tool\napproval), it reports the new `permissionMode` in its `system.status`\nmessage\n- The server was updating internal state but **never broadcasting** a\n`session_update` to connected browsers\n- This left the browser\n[…]\nunchanged (avoids\nunnecessary chatter)\n- Typecheck passes (`tsc --noEmit`)\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ws-bridge): broadcast permissionMode changes from CLI to browsers…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-04-02T06:06:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "abdfb4bc7e096e810bde30b3cac844ceb2d8f469",
          "body": "…nd tasks (#638)\n\n## Summary\n- Adds a floating **ActivityTray** component (pill + expandable panel)\nthat shows background agent status and task progress within a session\n- Detects `Agent` tool_use with `run_in_background: true` in the\nWebSocket stream and tracks lifecycle in the store\n- First step t\n[…]\naxe a11y\n- All 4936 existing tests continue to pass\n\n## Review provenance\n- Implemented by AI agent (Claude Opus 4.6)\n- Human review: pending\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ui): add ActivityTray floating component for background agents a…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-04-01T18:29:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e0c242dd1b0c94ff5ddbf3f8e7e706ce6d5cd506",
          "body": "…otocol drift warnings (#637)\n\n## Summary\n- Handle 10 previously unhandled Codex JSON-RPC notification methods\nthat were triggering false \"protocol drift\" warnings in the UI\n- Bare `\"error\"` notifications (transient stream disconnections like\n\"Reconnecting... 2/5\") are now handled gracefully — logge\n[…]\n\n- All 4915 tests pass, typecheck clean\n\n## Review provenance\n- Investigated and implemented by AI agent (Claude Opus 4.6)\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(codex): handle unhandled Codex notification methods to prevent pr…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-04-01T16:37:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a0d4e5263820fefc2bb6beaf6aeb1903052b568d",
          "body": "…active keepalive (#635)",
          "is_bot": false,
          "headline": "fix(keepalive): add Codex disconnect debounce and enable headless pro…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-04-01T15:42:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2341a06b0a442d7a2989faf2ba248a0fc60da9a",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.95.0](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.94.0...the-companion-v0.95.0)\n(2026-04-01)\n\n\n### Features\n\n* **keepalive:** proactive CLI relaunch when frontend is disconnected\n([#634](https://github.com/The-Vibe\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release the-companion 0.95.0 (#633)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-04-01T15:27:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a0e7c599c1700ca750fee2b6ad93f8aed362e99",
          "body": "… (#634)\n\n## Summary\n- CLI processes (Claude Code & Codex) now auto-relaunch on crash even\nwithout a browser connected\n- Ensures headless sessions (agents, cron jobs) stay alive with\nexponential backoff (3s/6s/12s)\n- Intentional kills (idle-kill, delete, archive) are excluded via\ntracking set\n- Also\n[…]\norchestrator tests pass (5 new)\n- Typecheck passes\n- Pre-commit hooks pass\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(keepalive): proactive CLI relaunch when frontend is disconnected…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-04-01T14:50:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9b5e67535233acb987f60348a7f3d90d6f76f83c",
          "body": "## Summary\n- remove the workbench terminal entry and terminal route\n- simplify session chrome by removing editor, browser, terminal, and\nprocesses surfaces\n- drop the unused `editorTabEnabled` setting from the client and server\ncontracts\n\n## Why\n- the session UI had multiple dead or redundant surfac\n[…]\nts\nserver/routes.test.ts`\n\n## Screenshot\n- to be added after local capture\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(workbench): remove terminal and session extras (#632)",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-04-01T08:31:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b176624dff1c422bb4ec7521dc4ae13ac9fbd807",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.94.0](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.93.0...the-companion-v0.94.0)\n(2026-03-27)\n\n\n### Features\n\n* **settings:** add provider token configuration for Claude Code and\nCodex ([#623](https://github.com/The\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release the-companion 0.94.0 (#624)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-03-30T14:39:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a5559854b55b9605a0203a1ac07a998696487ddf",
          "body": "…Codex (#623)\n\n## Summary\n- Adds a new **Providers** section to the Settings page between\nNotifications and Anthropic\n- Users can configure/update their **Claude Code OAuth token** (from\n`claude setup-token`) and **OpenAI API key** (for Codex) without\nre-running onboarding\n- Masked input fields with\n[…]\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Codex Agent <codex-agent@users.noreply.github.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(settings): add provider token configuration for Claude Code and …",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-27T19:48:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "75a6cc982da1f53a9236db01f0d22915758f1598",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.93.0](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.92.5...the-companion-v0.93.0)\n(2026-03-27)\n\n\n### Features\n\n* **claude:** support channels protocol updates\n([#613](https://github.com/The-Vibe-Company/companion/iss\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release the-companion 0.93.0 (#611)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-03-27T15:12:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "177af4be321411dad1c1fe3683fd805e6beaa06c",
          "body": "## Summary\n- The sidebar poll updates `sdkSessions` from the server every 5s but\nnever prunes the client-side `sessions` Map\n- Since the sidebar renders from `UNION(sessions.keys(), sdkSessions)`,\nserver-deleted sessions persist as ghost entries until hard refresh\n- After `setSdkSessions(list)`, now\n[…]\nbar tests pass\n\n## Review provenance\n- Root cause identified and fix implemented by AI agent (dev-debug\nworkflow)\n- Human review: no\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(sidebar): reconcile client sessions with server on poll (#621)",
          "author_name": "Edwin Hu",
          "author_login": "edwinhu",
          "committed_at": "2026-03-27T15:07:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6f6d411cc4e7cb7d16216f179212ef7ea44e4a40",
          "body": "…ing, and diagnostics (#617)\n\n## Summary\n- Adds a hidden Recording Hub feature gated behind\n`COMPANION_RECORDING_HUB=1`\n- Enables secure upload/import of JSONL protocol recordings into a\ncurated store (`~/.companion/hub/`)\n- Implements `ReplayAdapter` (IBackendAdapter) to replay recorded\nsessions as\n[…]\n tests pass\n- Full suite passes (4855 tests, 188 files)\n- Typecheck passes\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(recording-hub): add hidden recording hub for replay, compat test…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-24T10:34:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c2f2b55118cb576532746cbde87eab4de4b87001",
          "body": "… (#615)\n\n## Summary\n- Add first-launch onboarding wizard that guides users through\nconfiguring Claude Code (OAuth token via `claude setup-token`) and Codex\n(OpenAI API key)\n- Tokens are persisted in `~/.companion/settings.json` and auto-injected\ninto sessions as `CLAUDE_CODE_OAUTH_TOKEN` / `OPENAI_\n[…]\no\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Codex Agent <codex-agent@users.noreply.github.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(onboarding): add provider setup wizard for Claude Code and Codex…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-24T08:53:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5baccb13ba0b87d2dfcaa9e0241951ca9febc684",
          "body": "## Summary\n- add support for new Claude channels/protocol message types in the\nbackend adapter and shared session types\n- surface new streamlined text, tool summary, and prompt suggestion\nevents in the frontend store and websocket client\n- document the protocol updates and refresh playground/tests f\n[…]\n run test` (launched in container; long-running suite)\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Codex Agent <codex-agent@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(claude): support channels protocol updates (#613)",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-21T18:58:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "08e495b3ac06323d1113a43328682deedeac373d",
          "body": null,
          "is_bot": false,
          "headline": "fix(linear): log webhook acceptance and rejection (#612)",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-19T12:13:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c256360d6db3846e4110f1232c047ef16f939906",
          "body": "<!-- CURSOR_AGENT_PR_BODY_BEGIN -->\nThis pull request contains changes generated by a Cursor Cloud Agent\n<!-- CURSOR_AGENT_PR_BODY_END -->\n\n<div><a\nhref=\"https://cursor.com/agents/bc-7b5be7ef-d331-472b-ba4d-b80ec1a2c5eb\"><picture><source\nmedia=\"(prefers-color-scheme: dark)\"\nsrcset=\"https://cursor.co\n[…]\nom/assets/images/open-in-cursor-dark.png\"></picture></a>&nbsp;</div>\n\n---------\n\nCo-authored-by: Cursor Agent <cursoragent@cursor.com>\nCo-authored-by: Stan Girard <StanGirard@users.noreply.github.com>",
          "is_bot": false,
          "headline": "refactor: Code redundancy reduction (#610)",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-18T20:56:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b67650f91c2ba8c8473d9cbd4d5777bde1999acb",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.92.5](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.92.4...the-companion-v0.92.5)\n(2026-03-18)\n\n\n### Code Refactoring\n\n* **linear:** separate OAuth Apps from Tickets integration\n([#607](https://github.com/The-Vibe-Co\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release the-companion 0.92.5 (#609)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-03-18T20:54:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6710519081bcbde1c785c34075b9a56c5b52d898",
          "body": "## Summary\n- Separates the Linear integration into two distinct concepts: **Linear\nTickets** (API-key connections for issue viewing/searching) and **Linear\nOAuth Apps** (standalone OAuth connections for agent @mention triggers)\n- Introduces a new `LinearOAuthConnection` entity stored in\n`~/.companio\n[…]\n provenance\n- Implemented by AI agent (Claude)\n- Human review: no\n\n---------\n\nCo-authored-by: Codex Agent <codex-agent@users.noreply.github.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(linear): separate OAuth Apps from Tickets integration (#607)",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-18T19:56:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b57488329e07c39b11c0cbd4c43ed6dea50730a3",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.92.4](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.92.3...the-companion-v0.92.4)\n(2026-03-18)\n\n\n### Bug Fixes\n\n* **claude-adapter:** re-apply user echo drop fix reverted by\n[#589](https://github.com/The-Vibe-Company\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release the-companion 0.92.4 (#606)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-03-18T11:08:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ee653928150ce7877d2baf79230dafbc5c9e3f84",
          "body": "## Summary\n- Re-apply the user echo drop fix from #592 that was inadvertently\nreverted by #589's merge resolution\n- Silently drop all CLI `user` echo messages (both string and\ntool_result arrays) — they're redundant since tool results already\narrive in assistant message content blocks\n\n## Why\nPR #59\n[…]\nhoes are silently dropped\n- 61/61 adapter tests pass\n- Typecheck clean\n\n## Review provenance\n- Investigated & implemented by AI agent\n- Human review: no\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(claude-adapter): re-apply user echo drop fix reverted by #589 (#605)",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-18T11:06:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0c2335e52b1983d1263e188923f97c656b5791ce",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.92.3](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.92.2...the-companion-v0.92.3)\n(2026-03-18)\n\n\n### Bug Fixes\n\n* **docker:** preserve containers on idle-kill and increase default\ntimeout to 24h\n([#602](https://githu\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release the-companion 0.92.3 (#603)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-03-18T10:12:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7f5eab2924686b3cbfebf1abf94951a361a13d13",
          "body": "…meout to 24h (#602)\n\n## Summary\n- Idle-kill no longer destroys Docker containers — only kills the CLI\nprocess, so containers survive and can be restarted on relaunch\n- Default idle timeout increased from 20 minutes to 24 hours\n(`COMPANION_IDLE_KILL_MINUTES` env var still works for override)\n- Expli\n[…]\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Codex Agent <codex-agent@users.noreply.github.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(docker): preserve containers on idle-kill and increase default ti…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-18T10:11:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "24ef8ac28e2adace6eec240bdcbe36f6a6b35fea",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.92.2](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.92.1...the-companion-v0.92.2)\n(2026-03-18)\n\n\n### Bug Fixes\n\n* **orchestrator:** prevent PID recycling from blocking Docker session\nrelaunch\n([#589](https://github.c\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release the-companion 0.92.2 (#601)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-03-18T09:57:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5e76c50051f70efa0bd827b3ae252e48d3afa0d1",
          "body": "… relaunch (#589)",
          "is_bot": false,
          "headline": "fix(orchestrator): prevent PID recycling from blocking Docker session…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-18T07:10:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5f0a9284950d13dd2f869d62de17c4d0b22d526",
          "body": ":robot: I have created a release *beep* *boop*\n---\n\n\n##\n[0.92.1](https://github.com/The-Vibe-Company/companion/compare/the-companion-v0.92.0...the-companion-v0.92.1)\n(2026-03-17)\n\n\n### Bug Fixes\n\n* **ui:** redesign chat blocks inline and fix streaming message\nduplication\n([#597](https://github.com/T\n[…]\nogleapis/release-please). See\n[documentation](https://github.com/googleapis/release-please#release-please).\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release the-companion 0.92.1 (#600)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-03-18T06:12:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6735a9a6482c650c36ffb280448a00148f1c8b12",
          "body": "…ation (#597)\n\n## Summary\n- Redesign chat tool blocks (ThinkingBlock, EditBlock, BashBlock,\nBashResultBlock) from card-based to inline rendering — no cards, no\nscroll, \"show more\" for long content\n- Fix streaming message duplication caused by CLI sending incremental\n`assistant` messages (one per con\n[…]\nlive session\n- Verified no React duplicate key warnings in browser console\n\n## Review provenance\n- Implemented by AI agent\n- Human review: no\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ui): redesign chat blocks inline and fix streaming message duplic…",
          "author_name": "Stan Girard",
          "author_login": "StanGirard",
          "committed_at": "2026-03-17T21:21:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 23,
      "commits_last_year": 582,
      "latest_release_at": "2026-07-19T07:57:46Z",
      "latest_release_tag": "companion-v0.108.0",
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 17,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 3.4
    },
    "community": {
      "has_readme": false,
      "has_license": false,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": null,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@hellcoder/companion",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "claude",
            "claude-code",
            "ai",
            "agent",
            "web-ui",
            "vibe-coding"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@hellcoder/companion",
          "is_deprecated": false,
          "latest_version": "0.108.0",
          "repository_url": "https://github.com/hellcoderGIT/companion",
          "versions_count": 66,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3170,
          "first_published_at": "2026-04-20T02:57:10.337000Z",
          "latest_published_at": "2026-07-19T08:09:59.755000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 1,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-07-08",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "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": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "landing/tsconfig.json",
        "platform/tsconfig.json",
        "relay/tsconfig.json",
        "web/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 234876,
      "source_files_sampled": 522,
      "oversized_source_files": 17,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 10656
    },
    "dependencies": {
      "manifests": [
        "landing/package.json",
        "package.json",
        "platform/package.json",
        "relay/package.json",
        "web/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 89,
        "malicious_count": 0,
        "assessed_package": "npm:@hellcoder/companion@0.108.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "react",
          "manifest": "landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.0.0"
        },
        {
          "name": "react-dom",
          "manifest": "landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.0.0"
        },
        {
          "name": "the-companion",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.2.2"
        },
        {
          "name": "better-auth",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.4.0"
        },
        {
          "name": "class-variance-authority",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.7.1"
        },
        {
          "name": "clsx",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.1"
        },
        {
          "name": "drizzle-orm",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.39.0"
        },
        {
          "name": "hono",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.7.0"
        },
        {
          "name": "lucide-react",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.575.0"
        },
        {
          "name": "drizzle-kit",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.30.0"
        },
        {
          "name": "postgres",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.4.8"
        },
        {
          "name": "react",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.0.0"
        },
        {
          "name": "react-dom",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.0.0"
        },
        {
          "name": "resend",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.9.4"
        },
        {
          "name": "stripe",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^17.0.0"
        },
        {
          "name": "tailwind-merge",
          "manifest": "platform/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.5.0"
        },
        {
          "name": "@codemirror/lang-cpp",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.3"
        },
        {
          "name": "@codemirror/lang-css",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.3.1"
        },
        {
          "name": "@codemirror/lang-html",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.4.11"
        },
        {
          "name": "@codemirror/lang-java",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.2"
        },
        {
          "name": "@codemirror/lang-javascript",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "6.2.4"
        },
        {
          "name": "@codemirror/lang-json",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.2"
        },
        {
          "name": "@codemirror/lang-markdown",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.5.0"
        },
        {
          "name": "@codemirror/lang-python",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.2.1"
        },
        {
          "name": "@codemirror/lang-rust",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.2"
        },
        {
          "name": "@codemirror/lang-sql",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.10.0"
        },
        {
          "name": "@codemirror/lang-xml",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.1.0"
        },
        {
          "name": "@codemirror/lang-yaml",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.1.2"
        },
        {
          "name": "@codemirror/view",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "6.39.15"
        },
        {
          "name": "@uiw/react-codemirror",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "4.25.4"
        },
        {
          "name": "axe-core",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.11.1"
        },
        {
          "name": "croner",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.0.1"
        },
        {
          "name": "diff",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.0.3"
        },
        {
          "name": "fzf",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.5.2"
        },
        {
          "name": "hono",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.7.0"
        },
        {
          "name": "posthog-js",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.347.2"
        },
        {
          "name": "qrcode",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.5.4"
        },
        {
          "name": "ws",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.19.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 63,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "StanGirard",
          "commits": 309,
          "avatar_url": "https://avatars.githubusercontent.com/u/19614572?v=4"
        },
        {
          "type": "User",
          "login": "hellcoderGIT",
          "commits": 41,
          "avatar_url": "https://avatars.githubusercontent.com/u/5343954?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        },
        {
          "type": "User",
          "login": "edwinhu",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/174409?v=4"
        },
        {
          "type": "User",
          "login": "binhnguyenduc",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/37066217?v=4"
        },
        {
          "type": "User",
          "login": "freezscholte",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/52416805?v=4"
        },
        {
          "type": "User",
          "login": "Ziltosh",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/7701420?v=4"
        },
        {
          "type": "User",
          "login": "sondh5",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/22186548?v=4"
        },
        {
          "type": "User",
          "login": "Codex-Agent",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/214169644?v=4"
        },
        {
          "type": "User",
          "login": "educamosonline",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/9588621?v=4"
        }
      ],
      "contributors_sampled": 16,
      "top_contributor_share": 0.811
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "a11y.yml",
        "ci.yml",
        "coverage-gate.yml",
        "preview.yml",
        "publish.yml"
      ],
      "has_docs_dir": true,
      "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": 5,
            "reason": "16 out of 28 merged PRs checked by a CI test -- score normalized to 5",
            "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/17 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 3 contributing companies or organizations -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 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": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "9a11f0fa3b506ab9c0c107965c681417fd4d8d3b",
        "ran_at": "2026-07-25T05:15:44Z",
        "aggregate_score": 4.5,
        "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-19T08:10:04Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-19T07:57:35Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/hellcoderGIT/companion",
    "host": "github.com",
    "name": "companion",
    "owner": "hellcoderGIT"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 56,
        "vitality": 86,
        "community": 24,
        "governance": 58,
        "engineering": 55
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "commits_last_year": 582,
              "human_commit_share": 0.69,
              "days_since_last_push": 5,
              "active_weeks_last_year": 17
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "17/52 weeks with commits",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 17
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "582 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 582
                    }
                  }
                ],
                "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": 23,
              "latest_release_tag": "companion-v0.108.0",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 3.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "23 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 23
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~3.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 3.4
                    }
                  }
                ],
                "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": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 1,
              "stars": 1,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "critical",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": false,
              "has_license": false,
              "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": 0,
                "status": "missed",
                "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": 58,
            "inputs": {
              "packages": [
                "@hellcoder/companion"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 3170
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,170 downloads/month across npm",
                "points": 46.7,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3170,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 58,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 37,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 16,
              "top_contributor_share": 0.811
            },
            "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 81% of commits",
                "points": 4.3,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 81
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "16 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 16
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 63,
              "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": "63/63 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 63,
                      "decided": 63
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/17 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "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": 36,
            "inputs": {
              "followers": 1,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "hellcoderGIT",
              "public_repos": 3,
              "account_age_days": 4712
            },
            "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": "1 followers of hellcoderGIT",
                "points": 2.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1,
                      "login": "hellcoderGIT"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "3 public repos, account ~12 yr old",
                "points": 16.4,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 3
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 12
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@hellcoder/companion"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "66 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 66
                    }
                  }
                ],
                "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": 55,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 58,
            "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": "5 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "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": "16 out of 28 merged PRs checked by a CI test -- score normalized to 5",
                "points": 10,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": "https://thecompanion.sh",
              "has_readme": false,
              "has_docs_dir": true,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://thecompanion.sh",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": "moderate",
        "name": "Security",
        "value": 56,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 45,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.5
            },
            "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": "16 out of 28 merged PRs checked by a CI test -- score normalized to 5",
                "points": 1.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/17 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:@hellcoder/companion@0.108.0 runtime dependency closure — what installing the published package pulls in — 89 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:@hellcoder/companion@0.108.0",
                  "assessed": 89
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 89,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 89,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "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": "good",
        "name": "AI Readiness",
        "value": 81,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 10656
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "69 of 69 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 69,
                      "sampled": 69
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "landing/tsconfig.json",
                "platform/tsconfig.json",
                "relay/tsconfig.json",
                "web/tsconfig.json"
              ],
              "agent_commit_share": 0.52,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "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": "landing/tsconfig.json, platform/tsconfig.json, relay/tsconfig.json, web/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "landing/tsconfig.json, platform/tsconfig.json, relay/tsconfig.json, web/tsconfig.json"
                    }
                  }
                ],
                "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": "52 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 52,
                      "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": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 234876,
              "source_files_sampled": 522,
              "oversized_source_files": 17
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "17/522 source files over 60KB",
                "points": 53.2,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 522,
                      "oversized": 17
                    }
                  }
                ],
                "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",
    "Community profile unavailable",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-25T05:16:06.936471Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/h/hellcoderGIT/companion.svg",
  "full_name": "hellcoderGIT/companion",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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