Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-23 21:57 UTC

Arose-Niazi / claude-remote-controller

TypeScriptMIT★ 0 estrellas⑂ 0 forksdesde abr 2026Ver en GitHub ↗

Arose-Niazi/claude-remote-controller tiene un índice de salud de 35 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es AI Readiness (49/100) y la más baja, Engineering Quality (13/100). Se actualizó por última vez hace 5 días. Una sola persona concentra la mayor parte del trabajo reciente.

35
global / 100
En riesgo

Í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.

35
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

Arose NiaziCuenta personal
54 seguidores81 repositorios públicosdesde feb 2015@Vedocit

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
npmcli-remote-agent1.0.16256716hace 5 días

Métricas por categoría

Vitalidad

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

42En riesgo · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 5 días
4.8/36Cadencia de commits — 7/52 semanas con commits
18/18Volumen de commits — 107 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_year107
human_commit_share1
days_since_last_push5
active_weeks_last_year7
Cómo se puntúa
0/27Publica versiones — sin versiones publicadas
0/36Recencia de las versiones — sin versiones
0/27Cadencia de publicación — sin versiones
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count0
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?

32En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 0 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
45.5/80Descargas mensuales — 2567 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagescli-remote-agent
dependents
ecosystemsnpm
total_downloads
monthly_downloads2567
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

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

41En riesgo · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 4 contributing companies or organizations
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
0/38.3Aceptación de PR — sin PR decididos o sin datos
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues, Aceptación de PR. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
12.5/25Alcance del propietario — 54 seguidores de Arose-Niazi
25/25Trayectoria — 81 repos públicos, cuenta de ~11 años
Datos de entrada utilizados
followers54
owner_typeUser
is_verified
owner_loginArose-Niazi
public_repos81
account_age_days4163
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 — 16 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagescli-remote-agent
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

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

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

Documentación

30En riesgo
Cómo se puntúa
30/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
0/10Descripción del repositorio
0/10Topics
0/10Wiki
Datos de entrada utilizados
topics
has_wikino
homepage
has_readme
has_docs_dirno
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?

45En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — sin datos
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 4 contributing companies or organizations
0/10Dangerous-Workflow — sin datos
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — sin datos
2.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 5
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — sin datos
0/7.5Vulnerabilities — 21 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated13
scorecard_versionv5.5.0
checks_inconclusive5
scorecard_aggregate3,1
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, dangerous_workflow, packaging, signed_releases, token_permissions. 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_packages39
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:cli-remote-agent@1.0.16 —lo que arrastra la instalación del paquete publicado—: 39 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.

49En riesgo · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 83 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,83
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
0/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — packages/agent/tsconfig.json, packages/server/tsconfig.json, packages/shared/tsconfig.json, packages/web/tsconfig.json
10/10Entorno reproducible — Dockerfile, lockfile
10/10Práctica demostrada con agentes — 90 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
5/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 5
Datos de entrada utilizados
has_nixno
has_testsno
lockfilespackage-lock.json
has_dockerfile
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configspackages/agent/tsconfig.json, packages/server/tsconfig.json, packages/shared/tsconfig.json, packages/web/tsconfig.json
agent_commit_share0,9
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
55/55Tamaños de archivo manejables — 0/81 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes46.821
source_files_sampled81
oversized_source_files0

Datos clave

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

Advertencias de recopilación de datos

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

OpenSSF Scorecard 3.1 / 10
3.1agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-23 21:57 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
10Contributorsproject has 4 contributing companies or organizations
n/dDangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
n/dPackagingpackaging workflow not detected
5Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 5
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
n/dToken-PermissionsNo tokens found
0Vulnerabilities21 existing vulnerabilities detected
Dependencias directas 20
RegistroPaqueteRestricción de versiónManifiesto
npmnode-pty^1.1.0packages/agent/package.json
npmpino^9.6.0packages/agent/package.json
npmpino-pretty^13.0.0packages/agent/package.json
npmsocket.io-client^4.8.0packages/agent/package.json
npm@crc/shared*packages/server/package.json
npmexpress^4.21.0packages/server/package.json
npmsocket.io^4.8.0packages/server/package.json
npmpino^9.6.0packages/server/package.json
npmpino-pretty^13.0.0packages/server/package.json
npmuuid^11.1.0packages/server/package.json
npmweb-push^3.6.7packages/server/package.json
npm@crc/shared*packages/web/package.json
npm@xterm/xterm^5.5.0packages/web/package.json
npm@xterm/addon-fit^0.10.0packages/web/package.json
npm@xterm/addon-webgl^0.18.0packages/web/package.json
npmreact^18.3.0packages/web/package.json
npmreact-dom^18.3.0packages/web/package.json
npmreact-router-dom^7.1.0packages/web/package.json
npmsocket.io-client^4.8.0packages/web/package.json
npmzustand^5.0.0packages/web/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:cli-remote-agent@1.0.16 arrastra 39 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": false,
      "size_kb": 478,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "CSS": 1071,
        "HTML": 1053,
        "Dockerfile": 1277,
        "JavaScript": 23735,
        "TypeScript": 382327
      },
      "pushed_at": "2026-07-18T14:21:18Z",
      "created_at": "2026-04-04T13:15:18Z",
      "owner_type": "User",
      "updated_at": "2026-07-18T14:21:42Z",
      "description": null,
      "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": "Arose Niazi",
      "type": "User",
      "login": "Arose-Niazi",
      "company": "@Vedocit ",
      "location": "Pakistan",
      "followers": 54,
      "avatar_url": "https://avatars.githubusercontent.com/u/11246188?v=4",
      "created_at": "2015-02-28T15:24:11Z",
      "is_verified": null,
      "public_repos": 81,
      "account_age_days": 4163
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [],
      "recent_commits": [
        {
          "oid": "65f6ac234c48947d25ca0c15f41466d0056caf55",
          "body": "Document the full feature set — terminals with disconnect-persistence, tmux\nmirror (shared sessions + scroll + Claude enrichment), Claude Code\nintegration (resume/new/live chat/prompt buttons/file links), push\nnotifications, VPN control, file explorer/transfer, multi-user isolation,\nand agent niceti\n[…]\ne-instance, --version). npm README\nalso gains a commands table, config/VPN/env reference. Version-only bump to\npush the refreshed README to npm.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: comprehensive feature docs in repo + npm READMEs (agent v1.0.16)",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-18T14:21:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "740f09f29e42a2ac81e677ce15d8e6e6e0c86ff2",
          "body": "No easy way to see the installed version without digging into node_modules.\ncli.ts now handles -v/--version (reads the package's own package.json at\nruntime) and shows the version + a command list in --help.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add 'crc-agent --version' / -v (and version in --help) (agent v1.0.15)",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-16T01:38:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ee97529b85240f779abd09488e9c17ebbbb2208d",
          "body": "A remote-control agent is unreachable if the Mac idle-sleeps and drops the\nnetwork. The agent now runs 'caffeinate -i -w <pid>' on macOS: prevents\nIDLE system sleep only, so the display can still sleep, closing the lid or\nan explicit sleep still sleeps the machine, and locking the screen keeps it\nrunning. Tied to the agent PID so macOS releases it automatically on exit\n(even crash/kill). CRC_ALLOW_SLEEP=1 opts out.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Keep the Mac awake while the agent runs (agent v1.0.14)",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-16T01:28:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "20e3f763bb24cd7f5284d3995cbc5e07a65bec7d",
          "body": "…croll)\n\nA downward terminal drag at the top triggered the browser's pull-to-refresh,\nreloading the page. Set overscroll-behavior:none + overflow:hidden on the\nroot, and touch-action:none on the tmux-mirror content area so the drag is\nhandled by our scroll-forwarding instead of the browser.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Disable mobile pull-to-refresh / overscroll (was reloading mid drag-s…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-15T23:53:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8146fb443bbd4cd1ad3e7655f5f5ec041b31dcd1",
          "body": "… copy-mode\n\nThe mirror runs a full-screen app (Claude Code) on the alt-screen, so tmux\nhas zero scrollback and copy-mode had nothing to scroll (~15 lines of the\nlive screen). Claude manages its own conversation scroll and responds to\nmouse-wheel events. Now wheel/touch/buttons forward SGR wheel seq\n[…]\nem to Claude, which scrolls its own view\n— exactly like the desktop terminal. Web-only: rides the existing\nTERMINAL_INPUT path, no agent change.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "tmux mirror scroll: forward mouse-wheel to the app (Claude), not tmux…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-15T23:45:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f45bb3e5234f7d580660d0030aa38982e0f4ecd6",
          "body": "Buttons felt clunky and desktop wheel/PC-reattach didn't scroll at all.\nNow: mouse wheel and touch-drag both drive tmux scroll (line-based via\nsend-keys -N -X scroll-up/down, coalesced+throttled so a flick is one\ncommand, not a burst). Detection also requests SESSION_LIST so a mirror\nreattached on PC (no ?tmux= in the URL) is recognized by its 'tmux: '\nsession name. The ⬆/⬇ buttons stay as a fallback.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "tmux mirror: natural wheel + touch-drag scrolling (agent v1.0.13)",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-15T23:29:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b18b7d607f4d57ad9dd9003e671f09eddf1f43a1",
          "body": "…nd pane')\n\nThe =name exact-session prefix is only valid for session targets\n(kill-session); copy-mode/send-keys/display-message take a target-PANE\nwhere =name fails. Server-side scroll_position now accumulates correctly\n(11/22/33/... per halfpage-up). Also only enter copy-mode when not\nalready in it, so repeated scroll-up doesn't reset to the bottom.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "tmux scroll: use plain session name for pane targets (fixes 'can't fi…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-15T23:19:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3081ccb0225c3a362eb8dbd96ad0b0e9f6cf28f3",
          "body": "tmux's alternate screen bypasses xterm's own scrollback, so there was no\nway to scroll a mirrored session's history on mobile. Add ⬆/⬇ scroll\nbuttons (shown for tmux mirrors) that drive tmux copy-mode from the agent\nCLI (copy-mode + send-keys -X halfpage-up/down) — deterministic and\ncross-platform, \n[…]\neel quirks.\nScrolling down to the bottom auto-exits copy-mode, and typing while\nscrolled up exits copy-mode first so keystrokes reach the shell.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "tmux mirror: scroll controls via copy-mode (agent v1.0.11)",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-15T23:13:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a411b2aab8b12d0269bfa32eeb6f793ce559a871",
          "body": "…0.10)\n\nRoot cause of 'randomly loaded a different chat': the conversation view\nresolved 'the newest transcript in the project', which is a DIFFERENT\nactive Claude's chat when another Claude runs in the same project.\n\nFix: Claude Code stamps its session_id into every OSC 777 notify event\n(session_st\n[…]\nand lsof both proved\nunreliable for a fresh Claude; --session-id is ignored by interactive\nlaunch. The OSC session_start is the reliable signal.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Reliable Claude session identity via OSC 777 session_start (agent v1.…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-15T04:08:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "427ea20c9155b7f6c89d168762cfec19b04ea4eb",
          "body": "….0.8)\n\nRoot cause of 'messages never send': two agent processes were running as\nthe same agentId (a 9-day-old orphan shadowing a freshly-updated agent).\nThe server routes terminal I/O to whichever socket registered last, so a\nweb-opened terminal's input landed on the wrong process and reached no\nCl\n[…]\nWeb: 15s safety valve disarms the new-chat 'skip pre-existing session'\n  guard if it never latches, so the view can't get stuck with no session.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Prevent duplicate agents + harden new-chat session latching (agent v1…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-15T03:36:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d3ace024be4ab363ed028627af61fb346a30dd81",
          "body": "…hat on new launch\n\nTwo coupled bugs in the Claude conversation flow:\n\n1. Submit: handleComposeSend wrote 'text\\r' in one PTY burst. Claude Code\n   2.x's paste heuristic folds an Enter arriving in the same burst as the\n   text into the input as a newline instead of submitting — so the prompt\n   sat \n[…]\nhem, latching only\n   onto the session this launch creates. Clock-skew safe (compares ids), with\n   a 5s fallback if the baseline never arrives.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix compose-bar send to Claude: submit reliably + don't show an old c…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-15T03:11:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d861c10fa4e8a53d3253ab1f6bf2ed063a3e7db0",
          "body": "npm strips the execute bit off node-pty's bundled spawn-helper on\ninstall, and node-pty never restores it, so pty.fork() fails with\n'posix_spawnp failed' and NO terminal (plain or tmux) can spawn. Our\nRaycast script chmod'd it, but a friend running crc-agent directly had\nnothing to. The agent now ch\n[…]\nd spawn-helper (and clears\nmacOS quarantine) at startup, before any PTY spawn. Verified by\nstripping the bit and confirming startup restores it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Self-heal node-pty spawn-helper execute bit on startup (agent v1.0.7)",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-15T02:51:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f92bc49dc3eab2f05b31518c932dc3ffe098b25a",
          "body": "…0.6)\n\nListing tmux sessions used the agent's inherited PATH (execFile 'tmux'),\nbut attaching went through 'zsh -l -c' whose login-only PATH misses tmux\nwhen a user sets PATH in ~/.zshrc rather than ~/.zprofile. Result: the\nsession listed with a Mirror button, but tapping it spawned a dead pane\n(bla\n[…]\no a 'cd … && exec claude' launch still finds claude).\nIf tmux truly isn't installed, the pane now prints an install hint\ninstead of going blank.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix tmux mirror on Macs with tmux off the login-shell PATH (agent v1.…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-15T02:31:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a715359af6ad71ba6405404af58f58e0e4324a62",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove stray test screenshot",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-15T02:07:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "572341a612bf92de6452b57bba38ae35be15d459",
          "body": "…rollment\n\nbuildEnrollToken (and the dialog's displayed URL) concatenated\n'wss' + '//' + host — no colon — so agents enrolled through the web UI\nconnect-looped on a malformed serverUrl with only 'websocket error' to\ngo on. First real friend onboarding hit it immediately.\n\nAlso hardens crc-agent-setu\n[…]\ne historical 'wss//' shape) and validated before the config is\nwritten, so a bad token now fails loudly at setup instead of silently\nat connect.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix enroll token URL: 'wss//' missing colon broke every web-dialog en…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-15T02:06:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "992f01a1ebbe5628f66271d625a15f3bcf8a21ef",
          "body": "…+ New' in the tmux list\n\ntmux -A always resumes the session with the same name, so a single\nhardcoded 'claude' session couldn't cover working on several projects\nat once. Each Claude project group now has a 'tmux' button that starts\n(or attaches) a session named after the project folder, running Claude\nin that folder; the inline tmux section gets a '+ New' prompt for\nad-hoc named sessions.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Per-project tmux sessions: 'tmux' button on Claude project groups + '…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-15T01:42:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7991a5cf73ffee3168db5bf33de09dae23b9184e",
          "body": "tmux sessions outlive their Warp tab by design, so a stale one kept\nshowing as mirrorable with no way to end it from the phone. New\nTMUX_KILL round-trip: web (inline row + Warp overlay, with confirm)\n-> server relay (owner-guarded, same rpc tracking as TMUX_LIST) ->\nagent runs tmux kill-session -t =<name> (exact-match, no prefix\nsurprises). Result removes the row optimistically and re-fetches;\nfailures surface as a toast.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add tmux session Kill from the web UI (agent v1.0.4)",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-06T01:20:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7206e7e0d76637315b1ab5330d97c8cd0ef62a65",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Sync package-lock for agent 1.0.3",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-06T01:09:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "11aadb8d192298bf6fcf2092a7f8bb39ea408a60",
          "body": "The agent enriches TMUX_LIST results with each session's working directory\nand, when a Claude Code instance runs inside it, the live chat name (the\nauto-generated /rename-able title) and status from ~/.claude/sessions/\n<pid>.json. Claude PIDs are matched to tmux sessions by walking process\nancestry \n[…]\n\non tmux rows (inline list and Warp overlay), and tmux-mirror session cards\ninherit the same metadata by joining on their 'tmux: <name>' target.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Show cwd + live Claude chat name on tmux session rows (agent v1.0.3)",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-06T01:08:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0b93146c7b8c2bb5f93464dbd081499fcc3cd2ee",
          "body": "Tmux sessions on the agent machine now render directly on the\n/sessions/:agentId screen (tap to mirror), so the Warp overlay isn't\nneeded to find them. The list refreshes on mount and on window focus,\nsorted by last activity; the section hides when there are none. Tmux\nmirrors are also named 'tmux: <target>' at create time so they're\nidentifiable in the list instead of the generic 'Session N'.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Show tmux sessions inline in the session list",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-06T00:54:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5c7a49f10d8bc436b1919e447a6d0e90125b2bd6",
          "body": "…ngth\n\nA word-wrapped row can end within a couple cells of the terminal width,\nwhich the old length>=cols-1 heuristic misread as a mid-token hard break,\ngluing the wrap boundary ('keeperwithout'). A hard break provably occupies\nthe row's last column; word wrap leaves it blank where the space collapsed.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Mirror: detect hard token breaks by last-column occupancy, not row le…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-06T00:29:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "67b26f9dc686a5971de537ec645a3ac24e1a31fa",
          "body": "On phone-width terminals Claude Code 2.1.x truncates the status hint, so the\nfull string 'esc to interrupt' never renders (it shows '…cycle) · esc …').\nThat silently broke buffer-based working detection — and with it the input\nmirror's Claude gate and the buffer-driven finished notification. Working\n[…]\npinner\nverb, and a new detectClaudeChrome() recognizes idle Claude UI so the mirror\nworks right after attaching, before Claude has run anything.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix Claude working/chrome detection on narrow panes (Claude Code 2.1.x)",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-06T00:22:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4f912c0138ace7bb8044e1be711c865145492384",
          "body": "ESC-interrupt restores the interrupted message into Claude Code's own input\nline, and up/down cycle its history — but the compose bar knew nothing about\nit, so the restored text was invisible to the bar and sending new text would\nappend to it. Now the bar mirrors the \"❯ …\" composer line.\n\nDesign (se\n[…]\nen\ntokens like URLs without inserting spaces, cuts the caret row at the caret to\nexclude placeholder text, and handles the boxed composer style.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Mirror Claude's TUI input line into the compose bar after ESC/arrow keys",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-06T00:05:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "de01b23a8135f7aeb180109d6e36fdb16a49b256",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Sync package-lock for agent v1.0.2 bin/version bump",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-05T23:26:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3ca1ede490b7ae20bf9011ef0fac5a60d4c50250",
          "body": "…agent v1.0.2)\n\nThe crc-agent bin pointed straight at index.js, which ignores argv — so the\ndocumented 'crc-agent setup --token …' (including the web UI Add-agent snippet)\nprinted the circular 'No agent configured. Run: crc-agent setup' instead of\nenrolling. crc-agent now goes through cli.ts, which routes 'setup' to the\nenrollment flow, handles --help, and otherwise starts the agent.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix 'crc-agent setup' subcommand: dispatch via new cli.ts bin entry (…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-05T23:25:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2fc2122ef467ed57cb32c7413c0cf9241cf14f0d",
          "body": "A completion notification deep-links with the Stop hook's reported cwd, but Claude\nstores the transcript under the dir where the session STARTED. If the user cd's into\na subdir during the session, encode(cwd) points to a nonexistent project dir and the\nviewer showed 'No conversation found'. Since the deep-link carries the unique session\nid, fall back to locating <sessionId>.jsonl across all project dirs.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix transcript deep-link when cwd drifts mid-session (agent v1.0.1)",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-05T22:35:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7ee3e32e3fecd4bdb5df853cc1293ef044434fb5",
          "body": "Avoids implying official Anthropic affiliation for a public package; the agent is\na general remote pty/file/notification host (Claude Code is one integration).\nUpdates the web 'Add agent' install command and all docs to match.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Rename npm package: claude-remote-agent -> cli-remote-agent",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-05T12:06:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7ad211d1d4c453be2b0428d4c0a85aee977a6dad",
          "body": "…oduction\n\nA weak TOKEN_SECRET lets anyone forge login tokens (including admin), so the\nproduction startup guard now validates secret strength (length >= 32, not a known\nplaceholder) instead of merely checking the vars are defined.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Security: reject weak/placeholder TOKEN_SECRET & ADMIN_PASSWORD in pr…",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-05T11:19:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e27358baed243b28799d16e6fee2b69e3a260d6c",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Genericize personal path in code comment example",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-05T11:05:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ef3b1a41805c78f0f3c45c401b0c5aa5fab73185",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add root README (self-host, multi-user, trust model)",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-05T10:42:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1287428f695a7b042068f790834be0cd50539b57",
          "body": "Web:\n- Username+password login (LoginPage + authStore); currentUser/isAdmin.\n- AgentsManager modal: enroll agents (POST /api/agents/enroll) with a\n  one-time copyable \"npm i -g claude-remote-agent && crc-agent setup\n  --token ...\" snippet; list/delete enrolled agents.\n- UsersManager (admin): create/\n[…]\nprereqs; root LICENSE (MIT).\n\nAll four packages build clean (server unchanged for the Dockerfile contract;\nagent builds via tsup).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Phase 3-4: web accounts/enrollment UI + publish-ready agent package",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-05T10:24:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a1da79c385222756e474a03e03c527a88ee80514",
          "body": "…er-verify)\n\nServer is now strictly multi-user: each user sees/controls only their own\nagents.\n- Agents authenticate via agents-store -> ownerUserId (on socket.data);\n  clients via resolveTokenUser -> userId, joined to a 'user:<id>' room.\n- assertOwnsAgent() guards ALL 18 client->agent handlers (ses\n[…]\nd mis-route);\n  token revocation requires a matching tokenVersion.\n\nAdversarial opus review: all control paths correctly isolated.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Phase 2: per-user isolation (assertOwnsAgent, per-user rooms, RPC own…",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-05T10:12:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "816bdb17925ab5a025a84c88fed964238531d626",
          "body": "- JSON persistence (store.ts) under DATA_DIR; scrypt hashing (hash.ts) —\n  zero new dependencies.\n- users.ts: user records (scrypt password hash, role, tokenVersion for\n  revocation), CRUD, login verify, resolveTokenUser (enforces tokenVersion\n  + maps legacy sub-less admin tokens to the seeded admi\n[…]\nin seed, backward-compat login, legacy-agent adoption, friend\nenrollment, and per-user agent isolation all pass a functional test.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Phase 1: accounts + persistence + auth backend (multi-user foundation)",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-05T09:52:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "35bb58660c9f6362599c2fb67a16c0334e4a512f",
          "body": "- Untrack .claude/settings.local.json and PLAN.md (leaked prod IPs, SSH\n  targets, agent secrets, deploy webhook secret) — kept local, gitignored.\n- Sanitize .env.example to placeholders; document new optional env vars\n  (ALLOWED_ORIGINS, TOKEN_TTL_DAYS) and add the VAPID_* lines.\n- Neutralize the p\n[…]\naked values are still in git history — they will be scrubbed\n(git filter-repo) and rotated in the final phase before going public.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Phase 0: remove committed secrets, sanitize example, harden ignores",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-05T09:45:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ec08d4fa758aa6d736db416737d8cbf082da8b1b",
          "body": "The Stop hook read the transcript synchronously, before Claude finished\nwriting the final assistant message, so the notification showed the\nPREVIOUS response. Read the last assistant text ~600ms after the hook\n(matching the old bash sleep), so the latest reply is captured.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix stale notification response: read transcript after flush delay",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-04T17:49:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a42ca83190a45404c0508f7f0d5ad263374b050b",
          "body": "… header\n\n- ConversationView now supports tapping file paths to download them (via\n  onFileDownload), resolving relative paths against the project dir with\n  resolveFilePath; download cards via FileNotifications.\n- SessionManager header was overflowing on phones: stack the title row and\n  put the action buttons in a horizontally-scrollable row so nothing spills\n  off-screen; truncate the agent name.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Transcript view: file downloads (rel + abs paths); fix mobile session…",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-04T17:38:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ea30308d8bb8c1805800810f6229596493960851",
          "body": "- Only the Stop hook notifies now (\"Claude finished\"); the redundant\n  Notification \"waiting\"/permission alerts are removed (installer also\n  cleans up previously-installed Notification/SubagentStop hooks).\n- The notification title carries the project folder, and the body carries\n  Claude's last res\n[…]\n flex-column parent to get height; wrap it correctly. Also\n  keep \"loading\" until data or a timeout, and handle empty transcripts.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "One completion alert with folder + result; fix empty transcript view",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-04T17:27:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e9162485c45fb9418b1f0b4f83dd256b035a9e42",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Log project/session on received Claude hooks (deep-link diagnostics)",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-04T17:06:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8cb3933193d94b80af9843c0f913cc67a15aef4e",
          "body": "…ript\n\n- Suppress \"Claude needs permission\" notifications. Claude Code fires the\n  Notification hook for permission even when it auto-resolves (allow rules\n  / bypass), so they're noisy and not reliably actionable — keep only Stop\n  (\"finished\") and the genuine idle \"waiting for input\".\n- Tapping a \n[…]\nion_id -> the push URL\n  deep-links to /conversation/:agentId, which reads the JSONL via the\n  agent and renders it with ChatView.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Notifications: drop auto-resolved permission alerts; tap opens transc…",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-04T17:02:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "12e397f0b10fa39dc9b4ff0b02f543b59afad981",
          "body": "Android renders the notification badge (status-bar icon) as a flat\nmonochrome silhouette, so the full-color icon showed as a white block.\nAdd a transparent white \">_\" badge (badge-96.png) and use it as the\n`badge` in the SW push handler and the foreground notification path.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Use a monochrome notification badge for the status bar",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-04T16:54:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e8944af80a312428ddf9cd18850dc1eaa4ac040b",
          "body": "The plugin-based install never actually fired: Claude Code only loads\nplugins from a registered marketplace, and our installer faked the\ninstalled_plugins.json entry without registering a 'crc' marketplace, so\nthe hooks were dead on every platform (this is why real completions never\nnotified).\n\n- In\n[…]\nard that only accepted {event} and silently dropped\n  native {hook_event_name} payloads (returned 204 but never forwarded).\n\nVerified: native Stop/Notification POSTs are received and mapped correctly.",
          "is_bot": false,
          "headline": "Fix Claude notify hooks: use settings.json, accept native hook payload",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-04T16:49:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "532c44e2d86272dcc782303b76255e35511b3f02",
          "body": "Windows was over-guarded. With Git for Windows installed, Claude Code\nruns command hooks via Git Bash, and the loopback control endpoint is\njust Node HTTP, so both work on Windows:\n- Install the Claude notify plugin on all platforms (hooks fire via Git\n  Bash on Windows; jq/curl enrich + POST as usu\n[…]\nssues), and PtySession takes a\n{file,args} launch spec so it can spawn wsl.exe directly (or a login\nshell running tmux elsewhere).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Enable agent notifications + tmux mirror on Windows",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-04T16:02:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3825933771ffb4013519b45952b00a4b7d754c55",
          "body": "Push notifications (works when the app is closed/locked):\n- Server: web-push/VAPID, persisted subscription store, sendPush, and\n  /api/push (vapid key + subscribe/unsubscribe) routes.\n- Web: service worker push + notificationclick handlers (suppressed when a\n  window is focused so it doesn't double \n[…]\n TmuxPanel lists sessions and mirrors one; \"Start shared Claude\"; the\n  PC stays attached to the same session for full continuity.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Web Push, Warp/Claude hook notifications, and shared tmux mirror",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-07-04T15:44:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4ef47106cb05d79ebf591346c3a2dafe3def501a",
          "body": "Replaces the noisy/unreliable notification triggers with a coherent,\ncross-platform policy:\n\n- Completion is now detected from Claude Code's own \"esc to interrupt\"\n  working line in the terminal (detectClaudeWorking) — fires \"Claude\n  finished\" when it disappears (3s debounce). Works in raw AND chat\n[…]\nOnly buzz the OS / play sound / flash the title when the tab isn't\n  visible+focused — always show a quiet in-app toast otherwise.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Redesign notifications: reliable completion, far less noise",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-06-30T21:23:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "232fb28e81e33b142ff75ef86d046ee2401a771e",
          "body": "Structural redesigns:\n- RPC correlation: client now generates a requestId; the server routes\n  one-shot results (files list/download, agent exec) only to the\n  requesting client instead of broadcasting. Adds FILES_DOWNLOAD_ERROR;\n  result payloads carry agentId. Fixes cross-client contamination.\n- R\n[…]\nHTML\nescaped exactly once; removed iOS-crashing regex lookbehind; PWA icons +\nmanifest; RPC result filtering by requestId/agentId.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix 48 audited bugs across server, agent, and web",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-06-30T20:48:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "91f49a69e079ff89f0c3e0674b35c09e65485680",
          "body": "Multiple notification paths (OSC 777 hooks, JSONL idle detection, prompt\ndetection, bell) were racing against each other because the JSONL polling\nkept resetting claudeNotifiedRef when new messages arrived. Added a\ntime-based cooldown (lastNotifyTimeRef) — after any notification fires,\nall paths are blocked for 10 seconds regardless of source.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix duplicate notifications with 10-second global cooldown",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-22T00:25:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c07389d9e8b989da08f7d96212fc7c31f3d15c4f",
          "body": "new Notification() is blocked by mobile browsers when the tab is in the\nbackground. ServiceWorkerRegistration.showNotification() works even when\nthe app is backgrounded. Adds a minimal service worker, PWA manifest, and\napple-mobile-web-app meta tags so notifications work on both Android and\niOS (when added to home screen).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add service worker for background notifications on mobile",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-22T00:09:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "992c5f5052bedfc19afc4219642887e250ddb139",
          "body": "…_COMMAND\n\nThe DEBUG trap fires before every simple command including those inside\nPROMPT_COMMAND, which was resetting the timer before we could check it.\nNow we compute elapsed time in the trap itself (stored in __crc_elapsed)\nand only read it in PROMPT_COMMAND. Also adds __crc_armed guard to skip\nthe first prompt, and a version file to force init file regeneration.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix shell integration: compute elapsed time in DEBUG trap, not PROMPT…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-21T23:46:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e762acef5b2595b8bb5a58ec90eaf2e4b92e2b46",
          "body": "Inject PROMPT_COMMAND (bash) and precmd/preexec hooks (zsh) via custom\nrcfiles so any command taking >= 3 seconds sends a BEL character through\nthe PTY. The web client bell detection catches it and fires a browser\nnotification. Reduces bell throttle from 5s to 2s for sequential commands.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add shell integration for command completion notifications",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-21T23:37:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a06952edbbaa963858654f20c56fa8afaaf3e69c",
          "body": "…nd fallback detection\n\nInstall a Claude Code plugin on agent startup that hooks into Stop, Notification,\nPermissionRequest, UserPromptSubmit, and PostToolUse lifecycle events, emitting\nOSC 777 escape sequences through the PTY. The web client parses these in xterm.js\nfor instant, precise notificatio\n[…]\nssion exit. Bell toggle in the header controls all notification channels\n(browser notification, in-app toast, sound, title flash).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add browser notifications for task completion via Claude Code hooks a…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-21T23:28:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "616e0f0f191ceabe6aa6f8d5d125951698e303e2",
          "body": "…e sessions remain intact",
          "is_bot": false,
          "headline": "Implement stale socket eviction for agent connections to ensure activ…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-11T01:44:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db02e9b1617084c3eeaf02c7f0110cf897fab86b",
          "body": "… shell quoting issues",
          "is_bot": false,
          "headline": "Fix osascript timeout handling by passing separate arguments to avoid…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-11T01:35:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e45b40a3271b52dab64bf11cd6a8f689572a3035",
          "body": null,
          "is_bot": false,
          "headline": "Add Tunnelblick support for macOS VPN configurations",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-11T01:31:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "192c2f028e0516aad6b73d6fa308c18ed7db5623",
          "body": null,
          "is_bot": false,
          "headline": "Remove unnecessary \"peer\" property from package-lock.json entries",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-10T09:05:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c22a9fa70839ce1018fb2d624eeb2d5cd91887fc",
          "body": "…o-bottom\n\nReplaces the JSONL-heuristic prompt banner (which fired on any \"?\" or word\nlike \"plan\" / \"proceed\") with live detection from the xterm buffer. The new\ndetector only fires when Claude Code's actual numbered-option menu is on\nscreen, reads the option labels from the TTY, and navigates via a\n[…]\nnfo-level summary of removed / kept\nfiles each cycle, so it's possible to verify from logs that cleanup is\nactually running.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\nEOF\n)",
          "is_bot": false,
          "headline": "Detect real Claude Code prompts, add file download links and scroll-t…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-10T09:04:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "61112dd538d0549ed3ff31e8e0dc70b7ab07cfa9",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Disable VPN feature on Windows (requires admin to manage services)",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-09T20:41:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "343d8397dc257948b41b5f1d4917fb6470e77a97",
          "body": "WireGuard tunnel services require admin privileges. The agent now uses\nStart-Process -Verb RunAs to run wireguard.exe commands elevated, which\ntriggers a UAC prompt on the local machine. Also sets service to Manual\nstartup to prevent auto-start on boot.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix WireGuard on Windows: use elevated PowerShell for connect/disconnect",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-09T20:18:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e8e98b772ea8279233c674b4d422a72de2b0d6ec",
          "body": "- Disconnect: use wireguard.exe /uninstalltunnelservice instead of\n  Stop-Service (which requires admin privileges)\n- Connect: set service to Manual startup after install to prevent\n  auto-start on boot\n- Add verification after disconnect to confirm service is stopped\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix WireGuard disconnect on Windows and prevent auto-start",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-09T20:12:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "efede6170f0e2dc462853bb95ec912828bdea980",
          "body": "The banner now detects multiple types of waiting states:\n- tool_use: permission prompts (Allow/Deny/Always buttons)\n- assistant questions: plan confirmations, yes/no questions, selections\n  (Yes/No/Enter/Esc buttons)\n\nDetection uses last message type + content pattern matching.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Smarter input prompt banner: detect plans, questions, and confirmations",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-09T18:16:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "08c29ea04685c763aa480bb448ffb74670564503",
          "body": "When Claude's last message is a tool_use (waiting for permission), show a\nyellow banner with Allow/Deny/Always buttons directly in the chat view.\nUsers no longer need to switch to TTY mode to approve tool use.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add permission prompt banner in compose mode",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-09T18:08:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dd4de056a7489e242f618cc5cd781687f8dcc2d6",
          "body": "Previous approaches (bracketed paste, chunked writes) still failed.\nSend each line individually with delays, using raw newline between lines\nand carriage return to submit. No escape sequences.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Try line-by-line sending without bracketed paste for multi-line messages",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-09T14:06:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4a62756a7bb306af35f322238e70ba304be8bf16",
          "body": "… breaks\n\nTwo issues prevented large (10-15 line) messages from reaching Claude:\n1. Writing entire message to PTY at once overflows macOS PTY buffer (~1024 bytes)\n2. Using \\n for line breaks in paste - terminals use \\r, not \\n, in raw mode\n\nFix: chunk writes into 256-byte pieces with 10ms delays, and convert \\n to \\r\ninside bracketed paste sequences. Submit \\r sent separately after paste ends.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix multi-line messages not reaching Claude: chunked writes + \\r line…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-09T14:00:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "207c8b2bee1bd411ea4c957dd5b4afd364e33d76",
          "body": "The pendingSent clearing logic only matched on user messages in the JSONL.\nIf a message got garbled (e.g. multi-line without bracketed paste), the\nuser message never appeared in the JSONL and \"sending...\" stayed forever.\n\nTwo fixes:\n- Clear all pending when assistant messages arrive (Claude responding\n  means it received the input)\n- 30-second timeout fallback to clear stale pending messages\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix pendingSent stuck forever: clear on assistant response + 30s timeout",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-09T13:42:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "de7146a642aaf841f82434169bac25b48312b138",
          "body": "Multi-line compose messages had their newlines interpreted as individual\nEnter presses by the terminal, so only the first line was submitted to\nClaude CLI. Wrapping in bracketed paste escape sequences (ESC[200~/201~)\nensures the terminal treats the entire block as a single pasted input.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix multi-line messages stuck in sending: wrap in bracketed paste",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-09T13:31:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "77be728c0670ed9754c82a627015e8d3d12e8bdb",
          "body": "…N.stringify\n\nJSON.stringify doubles backslashes in paths (D:\\Projects → D:\\\\Projects in cmd param).\nThe extracted path needs unescaping before sending to agent for JSONL lookup.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix Windows conversation lookup: unescape double backslashes from JSO…",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-08T20:33:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "889abe8207bff3891014ef2daa373d626419a01d",
          "body": null,
          "is_bot": false,
          "headline": "Trigger redeploy",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-08T20:19:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8e9d6f4464850df3159bd831c1dbceb964bc8e7c",
          "body": "- Replace && with ; in Claude session commands (PowerShell doesn't support &&)\n- Fix MobileKeyboard hidden behind iOS virtual keyboard (100vh → 100dvh)\n- Switch extra key buttons from onPointerDown to onClick for reliable mobile taps\n- Fix projectName to handle Windows backslash paths\n- Update cmd regex to match ; separator\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix Windows PowerShell compat and mobile extra keys",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-08T20:10:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "77148fa75348f5d3d692c5f85bdf934bcb1f5432",
          "body": "…s with registry commands for startup management",
          "is_bot": false,
          "headline": "Refactor service installation and uninstallation: replace node-window…",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-07T16:22:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71ce571f408a8ff322feb273ad7216be8fbb771d",
          "body": "…nctions",
          "is_bot": false,
          "headline": "Refactor project path handling: add encoding and directory finding fu…",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-07T15:50:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec598f87199032368220b4b9bc8601f0e192b7bd",
          "body": null,
          "is_bot": false,
          "headline": "Add service installation and uninstallation scripts for CRC Agent",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-07T15:43:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d65d42c185b065e98304361a3e170b7ed0951deb",
          "body": "…ession\n\nWhen resuming via --resume <id>, the Claude session ID is extracted from\nthe command and passed to CLAUDE_CONV_READ so it reads that specific\nJSONL file instead of the latest one in the project directory.\n\nFor new sessions (no --resume), the session ID is discovered from the\nfirst CLAUDE_CO\n[…]\nnd Claude session ID are persisted in localStorage\nkeyed by terminal session ID, so reattaching restores the correct\nconversation.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix chat view mixing sessions: track Claude session ID per terminal s…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-07T01:23:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2ffb73d546280fa6e32a89585428bb61e0593475",
          "body": "When a Claude session starts via ?cmd=, the project path is saved to\nlocalStorage keyed by terminal sessionId. When reattaching to the same\nsession later (no ?cmd= param), the path is restored from localStorage,\nso the chat view activates automatically.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Persist Claude project path per session in localStorage",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T22:19:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a8da753026b33d8833ae3885dbc40845566f6403",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix inline markdown (backtick code, bold) inside table cells",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T22:10:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "306f35eb9a0cf4c19c9dc6b98e0f403283c2a60c",
          "body": "Detects pipe-delimited table rows, accumulates them, renders as proper\nHTML tables with:\n- Header row with bg-surface-overlay background\n- Body cells with border-bottom dividers\n- Horizontal scrolling for wide tables\n- 'MATCH' values highlighted in green\n- Whitespace-nowrap to prevent cell wrapping\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add markdown table rendering in ChatView",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T22:01:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "33a8ce84b6fb2c4c4fe7b20ba62ad18392575318",
          "body": "New system reads Claude Code's structured JSONL session files and renders\nthem as a proper chat interface:\n\nAgent: claude-conversation.ts reads JSONL files, extracts user messages,\nassistant text, tool_use (name + input summary), tool_result (truncated).\nSupports incremental reading via afterLine of\n[…]\nde.\nSent commands appear as pending bubbles until JSONL confirms them.\nFalls back to terminal view when no conversation is active.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add live chat view from Claude JSONL conversations",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T21:47:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "279debe54acbb184540a2768e621b9e2646f4686",
          "body": "The chat bubble approach fundamentally breaks for Claude Code's TUI output —\ncursor positioning, in-place updates, line clearing, and box-drawing chars\ncan't survive ANSI stripping. Characters split across lines, spaces eaten,\ntables destroyed.\n\nNew approach: terminal always visible for output (xter\n[…]\ns (vim, interactive programs)\n- Terminal refits when switching between modes\n- ChatView.tsx kept but unused (can be deleted later)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Revert chat view: use xterm.js for output, compose bar for input",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T21:36:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ba56503207bfd2a5eaf4278de149a0da08b5a966",
          "body": "…ude Code parsing\n\nMajor fixes:\n- Streaming output now APPENDS to the last received message instead of\n  creating a new bubble per chunk. Only creates a new received message\n  after a user sends something. This eliminates the flood of tiny messages.\n- Comprehensive ANSI stripping: OSC sequences, CSI\n[…]\nd history\n- Received bubbles now full-width for better readability\n- Throttled re-renders (150ms) for smooth streaming performance\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix chat view: streaming updates last message, better ANSI strip, Cla…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T21:20:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "51c986f649f6eadebe4803baf36275e22565cec9",
          "body": "… compose mode\n\nNew ChatView component replaces the terminal screen in compose mode:\n- Sent commands displayed as right-aligned accent bubbles (like iMessage)\n- Terminal output displayed as left-aligned bubbles with ANSI stripped\n- Error detection: lines with error/fatal/exception get red-tinted bub\n[…]\nmounted but invisible in compose mode (preserves PTY state)\n- TTY mode shows raw xterm.js as before\n- Empty state with prompt icon\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add chat view: message bubbles with markdown, replace raw terminal in…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T20:56:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aa22dc065c490caeb9d8b4dda919bf2c18914b59",
          "body": "- Send \\r (carriage return) instead of \\n (line feed) — PTY expects CR\n  for Enter key. This was causing text to add a newline instead of executing.\n- Touch-blocking overlay over terminal in compose mode — tapping the\n  terminal output area focuses the compose input instead of triggering\n  the soft \n[…]\nith send arrow button,\n  auto-focus, subtle hint text below for raw send and shift+enter.\n- Fixed initial auto-cmd to also use \\r.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix compose input: use \\r for Enter, block terminal touch, chat-style UI",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T20:26:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a8af1b9fba5d05395aed7089acba36ce8a2ce4f0",
          "body": "- Default mode: xterm.js renders output only (disableStdin), no soft keyboard\n  pops up when tapping terminal. All input goes through the compose textarea.\n- Compose textarea: type/paste text, Enter sends with newline, Shift+Enter\n  for multi-line, Raw button sends without newline. Auto-grows for mu\n[…]\neyboard bar always visible for Ctrl+C/Z, arrows, ESC, TAB\n- Blurs terminal textarea when exiting raw mode to dismiss soft keyboard\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Hybrid terminal: compose-first input with optional raw TTY mode",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T20:03:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2e7478064625931dea30f254c7cb986cd31add7d",
          "body": "Text input bar between download notifications and mobile keyboard.\nType or paste text locally, then:\n- 'Send' button or Enter key sends text + newline (like typing a command)\n- 'Raw' button sends text without newline (for pasting into editors, etc.)\nInput stays focused after send for rapid follow-up.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add compose input bar for typing/pasting text before sending",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T19:00:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c72a950327fcc17b76c5db7b672d86135165a948",
          "body": "- Custom Tailwind color system: surface (warm grays), accent (terracotta\n  #d4714e), claude (purple #9b7ddb), warm text hierarchy\n- Inter font via Google Fonts\n- Rounded-2xl cards, backdrop-blur modals, subtle borders\n- xterm theme updated: warm background, terracotta cursor, purple magenta\n- Custom\n[…]\nards\n- Consistent badge design: tiny uppercase tracking-wider\n- All 14 components themed consistently\n- Renamed to 'Claude Remote'\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Redesign UI with Claude-centric warm dark theme",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T15:40:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "692edbcb631947664fee58d0d03f908dcfa6e8b3",
          "body": "When user taps 'Claude' in file explorer for a directory without .claude/,\nshows a permission mode picker (Bypass/Default/Plan). Creates\n.claude/settings.json with chosen mode + effortLevel: 'high' via\nAGENT_EXEC, then starts Claude.\n\nDirectories that already have .claude/ skip straight to launching Claude.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Auto-create .claude/settings.json when starting Claude in new project",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T15:31:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8c546aa7ef05fd1f51e88a1a9f0dcdfc89d44ea5",
          "body": "- New 'Browse' button on SessionManager opens file explorer as full overlay\n- File explorer gains 'Claude' button to start fresh session in any directory\n- File explorer detects .git directories and shows 'Pull' button for git repos\n- New AGENT_EXEC protocol event for one-shot commands (git pull run\n[…]\nows inline feedback (output/error) with auto-dismiss\n- File explorer onStartClaude callback navigates to terminal with ?cmd= param\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add standalone file browser with 'Start Claude' and 'Git Pull' buttons",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T15:13:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "50f01e74098dd084df7e26c9e6e71aa315e85aa6",
          "body": "- New ClaudeSessions panel accessible via purple 'Claude' button on SessionManager\n- Scans ~/.claude/projects/ for session JSONL files, extracts metadata\n  (first message, timestamp, model, message count, git branch)\n- Sessions grouped by project with search/filter\n- 'Resume' button opens terminal a\n[…]\nto-write initial command via ?cmd= URL param on TerminalView\n- Uses cwd from session metadata for accurate project path resolution\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Claude Sessions browser: view and resume past conversations",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T14:59:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fec53705f91e2eb1a65f2ebaeed494a09f6ae065",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove temporary debug logging for terminal control chars",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T01:27:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a363d2b87b674f2a9c5ac145a4aee59a09a5004e",
          "body": "The Vite/esbuild minifier constant-folds String.fromCharCode(3) into the\nliteral \"\\x03\", then strips it to \"\" during minification. C0 control\ncharacters below 0x1B are silently removed from string literals.\n\nFix: store charCode as a number in the key definition and call\nString.fromCharCode(k.charCode) at click time via runtime property\naccess, which the minifier cannot fold away.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix Ctrl+C and Ctrl+Z buttons: minifier was stripping control chars",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T01:23:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8061a5a573f0d77733a2ba80d97c35c35901c9cf",
          "body": "Logs hex of control chars on both server (TERMINAL_INPUT relay) and agent\n(writeToSession) to diagnose why Ctrl+C/Z from mobile keyboard are not\nreaching the PTY.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add temporary debug logging for terminal control characters",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T01:16:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ab5ee135fc20d245fdbf3240e8dd5c9e2d88328d",
          "body": "- Add left padding (pl-2) to terminal container so first character isn't clipped\n- Lift Ctrl/Alt toggle state from MobileKeyboard to TerminalView so modifiers\n  apply to soft keyboard input via xterm.js onData (previously only worked for\n  keys sent through MobileKeyboard's sendKey\n- Rewrite macOS V\n[…]\neName field to VpnProfileConfig for macOS network service names\n- Azure VPN now works on macOS via scutil + cached AAD token\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\nEOF\n)",
          "is_bot": false,
          "headline": "Fix terminal padding, Ctrl/Alt modifiers, and macOS VPN scutil support",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T00:45:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9bd7deff9a232be95051515235c0c1a1bbc1b3a8",
          "body": "…dd serviceName for VPN profiles, and implement scutil commands for connection management",
          "is_bot": false,
          "headline": "Update PLAN.md and VPN manager for macOS support: complete Phase 5, a…",
          "author_name": "Muhammad Arose",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-06T00:08:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19a8f83419d38f8129aecf0f57b37d206b95d781",
          "body": "… cmdlets\n\n- OpenVPN: auto-install ovpnconnector service, kill GUI app before\n  connecting (conflicts with headless connector)\n- WireGuard: use Start-Service/Stop-Service instead of net start/stop\n  (avoids $ escaping issues across shells)\n- Both tested and confirmed working headlessly on Windows\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix VPN manager: auto-install ovpnconnector, kill GUI, use PowerShell…",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-05T13:39:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d2db60ac7bf1f3e4fa37d91d1db07537fa8ccb44",
          "body": "Azure P2S with AAD auth requires interactive sign-in — can't be\nfully headless. Now imports XML config via azurevpn -i, then opens\nthe Azure VPN app. OpenVPN and WireGuard remain fully headless.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Handle Azure VPN XML config: import + open app for AAD auth",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-05T13:22:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c3b3f03d749cdae3fb268fbc1278c3e2f04977d9",
          "body": "All VPN types now work fully headlessly without GUI interaction:\n- WireGuard: .conf files in ~/.crc-agent/vpn/, uses wireguard.exe\n  /installtunnelservice + net start/stop\n- OpenVPN: .ovpn files via ovpnconnector.exe set-config + start/stop\n- Azure VPN: export P2S config as .ovpn from Azure Portal, \n[…]\nn)\n\nConfig simplified: each profile just needs id, name, type, and\nconfigFile (path to .conf/.ovpn relative to ~/.crc-agent/vpn/).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Rewrite VPN manager to use config files for headless control",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-05T00:33:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fc0351774102ccd1c95ab3cc9f8375c9057e00b5",
          "body": "Azure VPN Client doesn't support ms-azurevpn: URI or headless CLI\nconnect — it requires GUI for Azure AD authentication. Now opens\nthe app directly so user can tap Connect/Disconnect. Info messages\nshown in blue instead of red in VPN panel.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix Azure VPN: open app instead of unsupported URI scheme",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-05T00:28:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9697eec3d7f2b5ecda9e6fbb46f04973de022530",
          "body": "…r status\n\n- Azure VPN: uses ms-azurevpn:connect/disconnect URI scheme (works\n  with UWP app, rasdial doesn't)\n- All commands use powershell.exe as shell on Windows for proper\n  cmdlet support (Get-Service, Start-Process, etc.)\n- WireGuard: falls back to wireguard.exe /installtunnelservice if\n  net \n[…]\nprofiles for status\n- Azure status: checks Get-NetAdapter for active VPN adapters\n- Updated config with aadds-vnet connection name\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix VPN manager: Azure uses ms-azurevpn: URI, PowerShell shell, bette…",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-05T00:17:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0974c234a46f6ec364f30c95c9a0390c7c5c0727",
          "body": "- VPN panel accessible from session manager via \"VPN\" button\n- Agent vpn-manager.ts: platform-specific connect/disconnect/status\n  for WireGuard (net start/wg-quick), OpenVPN (--connect-shortcut),\n  and Azure VPN (rasdial)\n- Agent config supports vpn.profiles[] with per-type settings\n- Server relays\n[…]\nfiles with live status, connect/disconnect\n  buttons, error display, loading states\n- Shared types: VpnType, VpnStatus, VpnProfile\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add VPN remote control (Phase 5)",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-04T23:56:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7a3a819c3dd5f91da3bc46babaaa4349732c202b",
          "body": "FileExplorer now syncs to initialPath when heartbeat arrives with\nthe real homeDir, unless user has already manually navigated.\nPrevents random fallback to os.homedir().\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix file explorer homeDir race condition",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-04T23:50:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "24480db416c540d371bdfa9d3910cc398a33a5b8",
          "body": "At 14px on a phone screen, only ~48 columns fit, causing PowerShell\nls output to drop file names. 11px gives ~70-80 cols on most phones.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Reduce terminal font to 11px on mobile for ~80 column width",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-04T23:47:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c829dd5b93a747bbaa5412204fef333ffc27353f",
          "body": "- File explorer is now a full-screen overlay on mobile, side panel\n  on desktop (md+). Terminal always gets full width for proper cols.\n- Toolbar compressed to single line with smaller buttons (text-xs)\n- Renamed buttons: Upload→Up, folder emoji→Files\n- Fixed homeDir race: falls back to rootPaths[0] if heartbeat pending\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix mobile layout: full-screen file explorer, compact toolbar",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-04T23:44:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c047ac04a798aa94b87b7e20571d9c92825d3da3",
          "body": "Clipboard icon next to each folder copies full path for cd.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add copy-path button for folders in file explorer",
          "author_name": "Arose Niazi",
          "author_login": "Arose-Niazi",
          "committed_at": "2026-04-04T23:35:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 0,
      "commits_last_year": 107,
      "latest_release_at": null,
      "latest_release_tag": null,
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 7,
      "days_since_latest_release": null,
      "mean_days_between_releases": null
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 28,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "cli-remote-agent",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/cli-remote-agent",
          "is_deprecated": false,
          "latest_version": "1.0.16",
          "repository_url": "https://github.com/Arose-Niazi/claude-remote-controller",
          "versions_count": 16,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2567,
          "first_published_at": "2026-07-05T12:06:31.124000Z",
          "latest_published_at": "2026-07-18T14:21:21.682000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "packages/agent/tsconfig.json",
        "packages/server/tsconfig.json",
        "packages/shared/tsconfig.json",
        "packages/web/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 46821,
      "source_files_sampled": 81,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "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": 39,
        "malicious_count": 0,
        "assessed_package": "npm:cli-remote-agent@1.0.16",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "node-pty",
          "manifest": "packages/agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.0"
        },
        {
          "name": "pino",
          "manifest": "packages/agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.6.0"
        },
        {
          "name": "pino-pretty",
          "manifest": "packages/agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "^13.0.0"
        },
        {
          "name": "socket.io-client",
          "manifest": "packages/agent/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.8.0"
        },
        {
          "name": "@crc/shared",
          "manifest": "packages/server/package.json",
          "ecosystem": "npm",
          "version_constraint": "*"
        },
        {
          "name": "express",
          "manifest": "packages/server/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.21.0"
        },
        {
          "name": "socket.io",
          "manifest": "packages/server/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.8.0"
        },
        {
          "name": "pino",
          "manifest": "packages/server/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.6.0"
        },
        {
          "name": "pino-pretty",
          "manifest": "packages/server/package.json",
          "ecosystem": "npm",
          "version_constraint": "^13.0.0"
        },
        {
          "name": "uuid",
          "manifest": "packages/server/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.1.0"
        },
        {
          "name": "web-push",
          "manifest": "packages/server/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.6.7"
        },
        {
          "name": "@crc/shared",
          "manifest": "packages/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "*"
        },
        {
          "name": "@xterm/xterm",
          "manifest": "packages/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.5.0"
        },
        {
          "name": "@xterm/addon-fit",
          "manifest": "packages/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.10.0"
        },
        {
          "name": "@xterm/addon-webgl",
          "manifest": "packages/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.18.0"
        },
        {
          "name": "react",
          "manifest": "packages/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^18.3.0"
        },
        {
          "name": "react-dom",
          "manifest": "packages/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^18.3.0"
        },
        {
          "name": "react-router-dom",
          "manifest": "packages/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.1.0"
        },
        {
          "name": "socket.io-client",
          "manifest": "packages/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.8.0"
        },
        {
          "name": "zustand",
          "manifest": "packages/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.0.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": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "Arose-Niazi",
          "commits": 107,
          "avatar_url": "https://avatars.githubusercontent.com/u/11246188?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": false,
      "ci_workflows": [],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 4 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 5,
            "reason": "dependency not pinned by hash detected -- score normalized to 5",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "21 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "65f6ac234c48947d25ca0c15f41466d0056caf55",
        "ran_at": "2026-07-23T21:57:02Z",
        "aggregate_score": 3.1,
        "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-18T14:21:19Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/Arose-Niazi/claude-remote-controller",
    "host": "github.com",
    "name": "claude-remote-controller",
    "owner": "Arose-Niazi"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 35,
      "inputs": {
        "security": 45,
        "vitality": 42,
        "community": 32,
        "governance": 41,
        "engineering": 13
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "at_risk",
        "name": "Vitality",
        "value": 42,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 69,
            "inputs": {
              "commits_last_year": 107,
              "human_commit_share": 1,
              "days_since_last_push": 5,
              "active_weeks_last_year": 7
            },
            "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": "7/52 weeks with commits",
                "points": 4.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "107 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 107
                    }
                  }
                ],
                "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": "critical",
            "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": 1,
            "inputs": {
              "releases_count": 0
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "no releases published",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_releases_published",
                    "params": {}
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "no releases",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_releases",
                    "params": {}
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "no releases",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_releases",
                    "params": {}
                  }
                ],
                "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": "at_risk",
        "name": "Community & Adoption",
        "value": 32,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 57,
            "inputs": {
              "packages": [
                "cli-remote-agent"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 2567
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,567 downloads/month across npm",
                "points": 45.5,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2567,
                      "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": "at_risk",
        "name": "Sustainability & Governance",
        "value": 41,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 4 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 59,
            "inputs": {
              "followers": 54,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "Arose-Niazi",
              "public_repos": 81,
              "account_age_days": 4163
            },
            "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": "54 followers of Arose-Niazi",
                "points": 12.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 54,
                      "login": "Arose-Niazi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "81 public repos, account ~11 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 81
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "cli-remote-agent"
              ],
              "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": "16 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 16
                    }
                  }
                ],
                "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": "critical",
        "name": "Engineering Quality",
        "value": 13,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "critical",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "has_ci": false,
              "has_tests": false,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "at_risk",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 30,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 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": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 45,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "dangerous_workflow",
                    "packaging",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 31,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 13,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 5,
              "scorecard_aggregate": 3.1
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 4 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 5",
                "points": 2.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "21 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "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:cli-remote-agent@1.0.16 runtime dependency closure — what installing the published package pulls in — 39 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:cli-remote-agent@1.0.16",
                  "assessed": 39
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 39,
              "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": 39,
              "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": 3
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "at_risk",
        "name": "AI Readiness",
        "value": 49,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.83,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "83 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 83,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "has_nix": false,
              "has_tests": false,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "packages/agent/tsconfig.json",
                "packages/server/tsconfig.json",
                "packages/shared/tsconfig.json",
                "packages/web/tsconfig.json"
              ],
              "agent_commit_share": 0.9,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": "packages/agent/tsconfig.json, packages/server/tsconfig.json, packages/shared/tsconfig.json, packages/web/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "packages/agent/tsconfig.json, packages/server/tsconfig.json, packages/shared/tsconfig.json, packages/web/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "90 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 90,
                      "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 5",
                "points": 5,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 46821,
              "source_files_sampled": 81,
              "oversized_source_files": 0
            },
            "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": "0/81 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 81,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T21:57:06.780969Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/Arose-Niazi/claude-remote-controller.svg",
  "full_name": "Arose-Niazi/claude-remote-controller",
  "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.