Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 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 estrella⑂ 1 forkdesde abr 2026forkVer en GitHub ↗

hellcoderGIT/companion tiene un índice de salud de 57 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (86/100) y la más baja, Community & Adoption (24/100). Se actualizó por última vez hace 5 días. Una sola persona concentra la mayor parte del trabajo reciente.

57
global / 100
Moderado

Índice de salud del software

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

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

Perfil de puntuación

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

Titularidad

MoritzCuenta personal
1 seguidor3 repositorios públicosdesde ago 2013

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
npm@hellcoder/companion0.108.0317066hace 5 díasclaudeclaude-codeaiagentweb-uivibe-coding

Métricas por categoría

Vitalidad

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

86Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 5 días
11.8/36Cadencia de commits — 17/52 semanas con commits
18/18Volumen de commits — 582 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year582
human_commit_share0,69
days_since_last_push5
active_weeks_last_year17
Cómo se puntúa
27/27Publica versiones — 23 versiones publicadas
36/36Recencia de las versiones — última versión hace 5 días
27/27Cadencia de publicación — una versión cada ~3,4 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count23
latest_release_tagcompanion-v0.108.0
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases3,4
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

24Crítico · 18% del índice global
Cómo se puntúa
0/60Estrellas — 1 estrellas
0/25Forks — 1 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks1
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
0/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readmeno
has_licenseno
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
46.7/80Descargas mensuales — 3170 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packages@hellcoder/companion
dependents
ecosystemsnpm
total_downloads
monthly_downloads3170
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

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

58Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
4.3/22.5Distribución de commits — el principal contribuyente firma el 81% de los commits
13.5/13.5Amplitud de contribuyentes — 16 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 3 contributing companies or organizations -- score normalized to 10
Datos de entrada utilizados
bus_factor1
contributors_sampled16
top_contributor_share0,811
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
38.2/38.3Aceptación de PR — 63/63 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/17 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs63
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
2.2/25Alcance del propietario — 1 seguidores de hellcoderGIT
16.4/25Trayectoria — 3 repos públicos, cuenta de ~12 años
Datos de entrada utilizados
followers1
owner_typeUser
is_verified
owner_loginhellcoderGIT
public_repos3
account_age_days4712
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 5 días
20/20Historial de versiones — 66 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packages@hellcoder/companion
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

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

55Moderado · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 5 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-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
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentación

50Moderado
Cómo se puntúa
0/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://thecompanion.sh
0/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepagehttps://thecompanion.sh
has_readmeno
has_docs_dir
has_descriptionno

Seguridad

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

56Moderado · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
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.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
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 — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,5
Excluidos de la puntuación (sin datos o no aplicable): signed_releases. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
25/25Dependencias indirectas libres de avisos conocidos — ninguna dependencia indirecta tiene un aviso conocido
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories0
affected_packages0
assessed_packages89
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejó el cierre de dependencias en tiempo de ejecución de npm:@hellcoder/companion@0.108.0 —lo que arrastra la instalación del paquete publicado—: 89 paquetes. No se analiza la alcanzabilidad.

Preparación para IA

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

81Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 69 de 69 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes10.656
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — landing/tsconfig.json, platform/tsconfig.json, relay/tsconfig.json, web/tsconfig.json
10/10Entorno reproducible — Dockerfile
10/10Práctica demostrada con agentes — 52 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_filesMakefile
has_devcontainerno
has_linter_configno
typecheck_configslanding/tsconfig.json, platform/tsconfig.json, relay/tsconfig.json, web/tsconfig.json
agent_commit_share0,52
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
53.2/55Tamaños de archivo manejables — 17/522 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes234.876
source_files_sampled522
oversized_source_files17

Datos clave

1estrellas de GitHub
16contribuidores
582commits en los últimos 12 meses
5días desde el último push
23versiones publicadas
1factor bus
0issues abiertas
npmecosistemas de paquetes

Advertencias de recopilación de datos

  • 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

Más detalle

OpenSSF Scorecard 4.5 / 10
4.5agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-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
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 38
RegistroPaqueteRestricción de versiónManifiesto
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
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Avisos de dependencias 0

Instalar npm:@hellcoder/companion@0.108.0 arrastra 89 paquetes, directos y transitivos: 0 tienen avisos conocidos, de los cuales 0 son dependencias directas.

Ningún aviso conocido afecta a las dependencias evaluadas.

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

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

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

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

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