Registro público
Informe de salud del softwareesquema 0.26.0 · métricas 1.13.0 · 2026-07-22 15:11 UTC

ysxdyt-001 / claude-capture

Capture and inspect Claude Code ↔ Anthropic HTTP traffic via mitmproxy, with a built-in viewer UI

TypeScript · JavaScript · CSSMIT★ 2 estrellas⑂ 0 forksdesde jul 2026Ver en GitHub ↗

ysxdyt-001/claude-capture tiene un índice de salud de 52 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es AI Readiness (81/100) y la más baja, Security (26/100). Se actualizó por última vez hace 7 días.

52
global / 100
Moderado

Índice de salud del software

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

52
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

ysxdyt-001Cuenta personal
0 seguidores1 repositorio públicodesde jul 2026

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
npmclaude-capture1.0.0297318hace 5 díasclaudeclaude-codemitmproxyanthropiccapturedebugproxyinspector

Métricas por categoría

Vitalidad

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

69Moderado · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 7 días
2.1/36Cadencia de commits — 3/52 semanas con commits
18/18Volumen de commits — 138 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year138
human_commit_share1
days_since_last_push7
active_weeks_last_year3
Cómo se puntúa
16.2/27Publica versiones — 5 etiquetas de versión (sin releases de GitHub)
36/36Recencia de las versiones — última versión hace 11 días
27/27Cadencia de publicación — una versión cada ~1,2 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count5
latest_release_tagv0.8.1
releases_from_tags
days_since_latest_release11
mean_days_between_releases1,2
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 — 2 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars2
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
46.3/80Descargas mensuales — 2973 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesclaude-capture
dependents
ecosystemsnpm
total_downloads
monthly_downloads2973
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?

61Moderado · 24% del índice global
Cómo se puntúa
46.8/46.8Resolución de issues — 100% de issues cerradas
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_issues1
issue_closed_ratio1
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): 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
0/25Alcance del propietario — 0 seguidores de ysxdyt-001
2.3/25Trayectoria — 1 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers0
owner_typeUser
is_verified
owner_loginysxdyt-001
public_repos1
account_age_days16
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 — 18 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesclaude-capture
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

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

60Moderado · 20% del índice global
Cómo se puntúa
0/24Flujos de trabajo de CI
24/24Pruebas presentes
16/16Configuración de linter — biome.json
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_cino
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

Seguridad

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

26Crítico · 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
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
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
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — sin datos
0/5Pinned-Dependencies — sin datos
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
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate2,6
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Los pesos restantes se han renormalizado.

Preparación para IA

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

81Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 100 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes6886
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato — biome.json
11/11Verificación estática de tipos — web/tsconfig.json
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 87 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — sin datos
Datos de entrada utilizados
has_nixno
has_tests
lockfilespackage-lock.json
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configsweb/tsconfig.json
agent_commit_share0,87
toolchain_manifests
dependency_bot_commit_share0
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Pinned-Dependencies. Los pesos restantes se han renormalizado.
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
55/55Tamaños de archivo manejables — 0/36 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes24.939
source_files_sampled36
oversized_source_files0

Datos clave

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

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • Contributor list unavailable
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:claude-capture@1.0.0; advisories assessed against the repository dependency graph instead

Más detalle

OpenSSF Scorecard 2.6 / 10
2.6agregado

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-22 15:11 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
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
n/dDangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
n/dPackagingpackaging workflow not detected
n/dPinned-Dependenciesno dependencies found
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
n/dToken-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 2
RegistroPaqueteRestricción de versiónManifiesto
npmreact^18.3.1web/package.json
npmreact-dom^18.3.1web/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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 423,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "CSS": 35801,
        "HTML": 663,
        "Python": 7330,
        "JavaScript": 45368,
        "TypeScript": 111212
      },
      "pushed_at": "2026-07-15T13:29:18Z",
      "created_at": "2026-07-06T14:17:56Z",
      "owner_type": "User",
      "updated_at": "2026-07-15T13:30:50Z",
      "description": "Capture and inspect Claude Code ↔ Anthropic HTTP traffic via mitmproxy, with a built-in viewer UI",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "JavaScript",
        "CSS"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "User",
      "login": "ysxdyt-001",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/300509869?v=4",
      "created_at": "2026-07-06T14:16:00Z",
      "is_verified": null,
      "public_repos": 1,
      "account_age_days": 16
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-07-11T13:51:59Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-07-11T13:42:44Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2026-07-07T13:55:12Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-07-07T13:46:56Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-07-06T16:31:42Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "6ae0c964175c5374ef5262d884ce69dc5827e79e",
          "body": "Feature release: OpenAI-spec capture support in the viewer. Boundary\nnormalization layer translates /chat/completions and /completions captures\ninto the existing Anthropic-shape internal model at /api/file load time.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 0.10.0",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-15T13:29:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "204f3e7116c6d5f7bb9fcfbcfb9b81d7d3e9323a",
          "body": "OpenAI-spec capture support in the viewer: boundary normalization translates\n/chat/completions and /completions captures into the existing Anthropic-shape\ninternal model at /api/file load time, so all tabs render correctly with no\naddon or orchestrator changes.",
          "is_bot": false,
          "headline": "Merge branch 'feat/openai-completions-support'",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-15T13:28:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5ec71bbfb439b022c87b1dab6619b74e9347d5c",
          "body": "…date spec file list\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(web): post-review cleanups — drop dead var, fix stale jsdoc, up…",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-15T13:06:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f7e97d1e3c16a736a0575472214b826f3d292d89",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): branch ConversationTab SSE rebuild on _format",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-15T12:59:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b7227e640b5f05d9d85f3015725adfb963d36b1d",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): branch ResponseTab SSE rebuild on _format",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-15T12:58:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3f9b8f2aa9a2bba5a76dbfb2ada813fbd3e20d99",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): label OpenAI SSE chunks honestly in SseTimeline",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-15T12:58:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f341213251004e4d4068f9af65a49531b51bb27f",
          "body": null,
          "is_bot": false,
          "headline": "feat(web): normalize OpenAI captures in fetchFile",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-15T12:54:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "689f73cec00de47a210c4da663b9683eee04fec6",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): normalizeOpenAICapture ties request + response translation",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-15T12:51:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f89cdefb49ea450e56f3dea8e42f288519c9e53e",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): rebuild assistant blocks from OpenAI SSE chunks",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-15T12:50:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "83e22935713c79f1fce577bf3caf1736a38efa37",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): translate OpenAI request body to Anthropic-shape",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-15T12:50:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "280543304b894c780b29d8840a334f46a12399f7",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): add openai.ts with detectFormat shape sniffer",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-15T12:47:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c971aa418adaaad196887b0a4909d86609668c20",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): add _format marker to Capture type for protocol sniffing",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-15T12:47:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b7c6cf7ffe2e68b0240cb49fed16b2fe35734f0f",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 0.9.3",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-15T12:22:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "46b833a80297309d2536892abe0832ca6970012b",
          "body": "…evated atmosphere\n\nAdd a layered shadow system and radius tokens for consistent depth;\nenrich body background with a subtle vignette; polish sidebar, toolbar,\ntab bar (animated sage underline), file items, cards, scrollbars, empty\nstate, and resize handle; add focus-visible rings for accessibility.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style(web): refine visual polish — layered shadows, animated tabs, el…",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-15T12:14:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1125fe7ce23912a66b54792f965cd1c93595134b",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 0.9.2",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-15T11:57:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0bf2c716304a59c11207bfff2b39dbd3063be1f3",
          "body": "…llapse callbacks\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): make Layer B actually lazy — defer smartRender to MessageCo…",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-14T15:56:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "46d7070e4406211e92a81ff272e97526161325de",
          "body": "…ender)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(web): route large Message bodies through MessageCollapse (lazy r…",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-14T15:45:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9897bb46c2c4796cc77ea35a856020c96ea988bd",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): add MessageCollapse component with lazy full-render",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-14T15:42:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6e8a9389ecfc1f671fdf57b96412349967f3acfd",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(web): raise ToolResult collapse threshold to 8KB/100 lines",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-14T15:39:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "21ce18474dc579bc7ca5953cd41d7e37aa1e0022",
          "body": "Co-Authored-By: Claude Opus 5.2 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(web): memoize Message bodyBlocks HTML by content identity",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-14T15:37:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a655518690c425c4270db126a00add5cf9c9f5b2",
          "body": null,
          "is_bot": false,
          "headline": "perf(web): React.memo Message/ToolPair/ToolResult to skip poll rerenders",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-14T15:33:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8590f8d49f42deb7248e154e8ad2b2d0c1e7b50d",
          "body": "…cies\n\nCo-Authored-By: Claude Opus 5.2 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): inline messages derivation to satisfy useExhaustiveDependen…",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-14T15:30:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8894462970bafe78e3cd40c27f1454af37d331ef",
          "body": null,
          "is_bot": false,
          "headline": "perf(web): memoize conversation timeline + item list",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-14T15:28:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1cab05237098107a5048f63e7c64ed9a9a32bb1d",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(web): skip JSON.parse in looksLikeJSON for non-{[ input",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-14T15:26:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "39620d8272461ad32fa13c5067c1480c434497b7",
          "body": "Bite-sized task plan covering memoization (Tasks 1-5) and lazy\nMessageCollapse integration (Tasks 6-7). Each task ends with build +\nlint + manual smoke check; no test framework in this project.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: viewer perf implementation plan (7 tasks)",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-14T15:15:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "70e6c39bd78339d58ea1a1a3c5613f1410fd5338",
          "body": "Spec for fixing viewer lag on large captures. Two layers: memoize\nderived timeline and HTML output to kill rerender cost, and default-\ncollapse large messages with a lazy-expand preview to kill first-paint\ncost. No new runtime dependencies.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: viewer perf design (memoization + progressive disclosure)",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-14T15:11:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5ef5e302cfd56238bd80ba8d072a7f8b21b11a4b",
          "body": "Reads version from package.json via fs.readFileSync (avoiding the\nassert → with import-attribute churn across Node 20.x).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): support --version / -v flag",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-13T16:00:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cc3c24421065e1394780d5856cf9e031ebadff9d",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 0.9.0",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-13T15:40:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3feaf3a9ff312fc9d13191c057b3333356bf3dff",
          "body": "- cap captures at 500 by default (--max-captures <n>); addon prunes\n  oldest on every write and at load so the viewer stays snappy\n- render AskUserQuestion options as horizontal chip cards instead of\n  vertical numbered rows\n- cap Write tool input height with in-place scroll\n- drop \"Claude Code\" / \"traffic archive\" sidebar header text\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: capture count cap + viewer refinements",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-13T15:40:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cfde43c82d45616e13c4e27019d0fb2b3ecbf1a5",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 0.8.1",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T13:51:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f10c911d86d0ae7ac45da297b51527533f0419e7",
          "body": "Fixes esbuild vulnerability (GHSA-67mh-4wv8-2f99). Build verified clean.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(web): upgrade vite 5 → 8 + plugin-react 4 → 6",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T13:51:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6bb56e3fded871f4fbbed5bd091eb19ffa54517d",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 0.8.0",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T13:42:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b8b075424756c32da570c2886388759e3e664713",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): show full date in timestamps (YYYY-MM-DD HH:mm:ss)",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T13:39:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3cc54738734ad92d034ff01e7e16672fe2488414",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): restore file size in flat request rows",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T13:37:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c8536f398f0fd9331352334e0906af4f3c405881",
          "body": "message_delta carries the full usage (both input and output), while\nmessage_start reports input_tokens as 0 for the glm proxy.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(server): read input_tokens from message_delta SSE event",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T13:34:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b5cde6c9144d77d4381e78a1ba061ab8c7d64612",
          "body": "Remove all tree structure (sessions, conversations, nesting, dividers).\nSidebar is now a flat virtualized list of requests in time order, each\nrow showing: colored tag dot + preview + status + tokens + time.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(web): flatten sidebar to simple request list",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T13:30:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e36fd3d9d4a1ae91a6377519e732ddca30d9c15a",
          "body": "- Level 1: session header with start time\n- Level 2: context headers (main/subagent as siblings, subagents\n  ordered right after their parent with ↳ branch marker)\n- Level 3: request leaves showing #N + status + input→output tokens\n- Leaves represent HTTP requests (POST /messages), not tool calls\n- \n[…]\nore 4+ level nesting)\n- Adds extractTokenUsage to server for input/output token counts\n- CSS for context labels, request numbers, token display\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: restructure sidebar to 3-level tree (session → context → requests)",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T13:23:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ba875c663b6b354784f05597511ee1dd515842e5",
          "body": "…ancestry",
          "is_bot": false,
          "headline": "feat(web): render compression dividers + auto-expand nested subagent …",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T12:51:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "365a2782987ae210713b2dd3bd0aedc6a669be7a",
          "body": "…ession dividers\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): nest subagent conversations under parent turn + emit compr…",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T12:47:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fc4f87abec84f161e25ae0916c029161c4cf7ea2",
          "body": "…e idempotency\n\nTwo cache-mutation bugs found in review:\n\n1. __messages deletion broke linkSubagents on subsequent polls: the\n   deletion loop in the /api/files handler removed __messages from\n   cached items, so the next poll's linkSubagents could not collect\n   fingerprints from main-agent capture\n[…]\nult as a\n   non-enumerable, immutable __originalKind; filter on that instead.\n\nVerification: 48 linked / 1 unlinked / 0 compressed (unchanged).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(server): non-enumerable __messages + __originalKind for cache-saf…",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T12:40:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c06f7736e84cda2b0437f4b1e951df5096406112",
          "body": "…daries\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(server): link subagents to parent turn + detect compression boun…",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T12:35:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "14d88e139998601f6e23f6623601d9ed86f1e18f",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: implementation plan for context-layer classification",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T12:22:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "34711225b732fba593cd38f83937ee2548b94fc8",
          "body": "…+ compression detection)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: design spec for context-layer classification (subagent nesting …",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T12:18:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a9675f36a2c1306dd6966200415d213ac3f72ded",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): render sidebar as session → conversation → turns tree",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T10:18:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "607797d8c93f72b94270b800bacf15937258a122",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): group captures into conversations in the sidebar tree",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T06:34:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2a9558e3658282107e5e4881338698690987006a",
          "body": "…review",
          "is_bot": false,
          "headline": "feat(server): classify captures as anchor/continuation + kind-aware p…",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T06:18:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3f11f307cdd28d48f941b057e16c2751491a5e3",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: implementation plan for sidebar conversation grouping",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T06:12:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6ecf3159bda7afe488352695c40975c84d3a4104",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: design spec for sidebar conversation grouping",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T06:08:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ce431a27a4755262cd1addf92092453c40ab6395",
          "body": "Replaces the inline pill (visually conflicted with the HTTP status badge)\nwith a colored left-edge stripe that's scannable peripherally, plus a\nplain-text tag label in the meta row whose color echoes the stripe.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style(web): redesign tag as left-edge stripe + meta-row label",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T05:31:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8f0612ce8665f45a551c3ec1f892d831f6ae3a23",
          "body": null,
          "is_bot": false,
          "headline": "feat(web): tag subagent/explore/utility rows in the sidebar",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T03:51:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c36583940171be5795c0419e0398fd94298af9bf",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(server): classify captures as main/subagent/explore/utility",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T03:42:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8bdd7f89e9809a90771adf6cd8a14ddafedbfa99",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: implementation plan for subagent sidebar tagging",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T03:24:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ed21a6fe3069c2617f8697d5adfb252414770671",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: design spec for subagent request tagging in sidebar",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T03:22:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "72efc5cb25278700cc014e5cf87799d64812d6af",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.7.0",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-11T00:38:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "614d28cea829567f02b8fe3f5e0f4c1acf23ee6a",
          "body": null,
          "is_bot": false,
          "headline": "fix(web): add accessible group label to conversation filter chips",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T17:32:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da53cf10a3a4ce088879ffbdd511a06e8baa67b0",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): scope conversation header accent change to its own tab",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T17:25:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "25709b84c47d918c685e8ff8cd8b88dde675d395",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style(web): conversation filter chips + header layout",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T17:21:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c70e7603fd0bb6c7ffe173fa001ceec442257cf9",
          "body": null,
          "is_bot": false,
          "headline": "feat(web): add conversation filter chips (system/user/assistant/tool)",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T17:18:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8bbfec88eaa4c88abd5f21b3ec742017430d867e",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: implementation plan for conversation filter mode",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T17:15:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b035244063dc40c5413f54ba6f0d7fb24a3fc11b",
          "body": "Multi-select toggle chips (system/user/assistant/tool) inline with the\nConversation section header; all on by default, persists across capture\nbrowsing within a session.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: spec for conversation filter mode",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T17:11:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "123ab12c5600e592582c037b943342ecfa3310cf",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.6.0",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T16:51:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b47b42ace48aeda39e3da4a85b9652675a79e86",
          "body": "Consume the single space following ; when breaking, so the next row\nstarts at the same column as the first instead of being shifted right\nby one.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): align shell command rows after semicolons",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T16:47:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8bac656b27ddc288c61f7beab700547ffcced584",
          "body": "Add a dependency-free code highlighter (comments, strings, numbers,\nkeywords; comment style per language family) and route Read tool\nresults through it via a file_path→lang lookup, stripping the line-\nnumber prefix into a left gutter. Non-code files fall back to the\nexisting markdown rendering.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): syntax-highlight Read tool results by file extension",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T16:42:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "81d6053863ff637354bc674685245a5fb8d8b5be",
          "body": "Drop italic serif display styling; thinking now uses the default UI\nfont at body size, keeping only the dim color and left rail as a cue.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style(web): use normal font for assistant thinking blocks",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T16:36:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "48915283a3e73884452546e97cebddb8c09b1535",
          "body": "Swap escapeHtml → smartRender for thinking blocks so headings, lists,\ncode spans, and emphasis in the model's reasoning render formatted\ninstead of as plain escaped text.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): render assistant thinking blocks as markdown",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T16:34:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "83f6b68aac12dcb99451796e7dcf2c672812eab6",
          "body": "Keep pipelines (|), &&, and || on one line; only ; separates commands\nonto their own rows.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): only break shell commands after semicolons",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T16:31:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d3f818b76558e752156dc693407a57c5cd979b5f",
          "body": "Insert a line break after chain operators (;, &&, ||, |) in the shell\nhighlighter so each segment of a compound command renders on its own\nrow instead of one long line.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): break compound shell commands across rows",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T16:28:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4f166646e8ad5ede046435a518e3309363d39f9f",
          "body": "Long/multiline non-allowlisted strings (e.g. Edit.new_string) were\nJSON.stringify'd, which escapes real newlines into literal \"\\n\". Escape\nthe raw value instead so it renders with actual line breaks in the\nexisting <pre class=\"j-block\">.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): preserve real newlines in long tool-input string fields",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T16:23:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ee667d7176a3782a2bd57d57f6c3f8dc9c5a6f27",
          "body": "Add a dependency-free shell highlighter (comments, strings, operators,\nkeywords, $variables) and route command/script/cmd/shell fields through\nit via SHELL_FIELDS, ahead of the markdown and JSON branches. Preserves\nreal newlines instead of JSON-escaping the command into one line.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): shell syntax highlighting for Bash command fields",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T16:17:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ca328df2ed1883986e5a60c84e13c2a030e8c22f",
          "body": "When req.system is an array of {type:\"text\"} blocks, extract each\nblock's .text and join, so SystemMessage renders the markdown rather\nthan escaping the whole array as a JSON string.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): render system prompt as markdown instead of JSON dump",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T16:12:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "96d47f9b06eddac46f8903d71f069f79d2d83d0f",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style(web): field-row layout for structured tool inputs",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T15:59:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6294bbd08ddec3c55c8912ef44590897b681aad7",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(web): reuse renderToolInput for orphan tool_use blocks",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T15:54:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b2807606d5876b5ca9c544bd6531f1aff1ad130b",
          "body": null,
          "is_bot": false,
          "headline": "feat(web): render tool-pair input as structured fields with markdown",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T15:50:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a0deb64983430dc67b321e806c025a7e2a71a7e",
          "body": null,
          "is_bot": false,
          "headline": "feat(web): add toolInput renderer with markdown allowlist",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T15:47:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f227bad34b901cfbd1d3ac7a765cd46f5d9e8ce8",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: implementation plan for tool input markdown rendering",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T14:41:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "275bc856fd2132d0e18bbd29af4c738f141cc10d",
          "body": "Render allowlisted prose fields (description, preview, subject, etc.)\ninside tool inputs as markdown instead of escaped JSON dumps.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: spec for tool input markdown rendering",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T14:07:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "adea51c1ca021edee860566d87ae97ba263ae32c",
          "body": "New since 0.4.2:\n- Session-scoped captures (recursive addon + server scan)\n- Session tree sidebar with collapsible grouping\n- Resizable sidebar (240-600px, persisted)\n- Tree virtualization (@tanstack/react-virtual)\n- Sidebar perf cache (module-level mtime cache; ~65x faster polls)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 0.5.0",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T11:34:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4aeba6ebee54e955ca6c18eaaf4460a29b6890eb",
          "body": "Performance optimization layered on top of Round 1 (tree virtualization\n+ resizable sidebar):\n\n- Server: module-level per-file mtime+size cache in listCaptures;\n  cache hits return the SAME ListItem reference and skip read+parse.\n  Steady-state /api/files drops from \"parse all 314MB\" to \"stat 973\n  \n[…]\n\n- Client: leaf TreeNode wrapper cache + useCallback on toggle/onSelect\n  so TreeNodeRow's memo() actually skips re-renders for unchanged rows.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge branch 'tree-virtualization' (Round 2: perf cache)",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T11:30:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e4dd71f2976133b9178a99ca10dcecb7e0fc3722",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(web): useCallback + stable leaf TreeNode refs for memoized rows",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T11:17:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8478526f834bdd790984aef157c4692682d47473",
          "body": "Add a module-level Map<fullPath, {mtime, size, item}> cache so that\ncache hits skip the read+parse cycle and return the same ListItem\nobject reference. This eliminates ~99% of the per-poll cost for\nunchanged captures (325ms → 5ms for 278 files). The same-reference\nproperty is required for downstream React memoization (Task 2).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(server): cache listCaptures by mtime+size, reuse ListItem refs",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T11:13:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "50f8ac24f132bd40acf54ccd7769e1990fad28d0",
          "body": "Two tasks: (1) server-side module-level mtime cache in lib/server.mjs\nreturning same ListItem refs on hits; (2) client-side useCallback +\nleaf TreeNode cache so memoized TreeNodeRows skip re-render.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: implementation plan for sidebar perf cache",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T11:08:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0551c1ba9b2a98326283e2d8f651da40374915d5",
          "body": "Server-side per-file mtime cache (eliminates the 314MB-per-poll JSON\nparsing) + client-side memoization (useCallback on toggle/onSelect,\nstable leaf TreeNode identity) so the virtualizer stops re-rendering\nunchanged rows on every 3s poll.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: design spec for sidebar perf cache",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T11:04:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c198251d0d67b467401bf01b0b72de90a41d13a2",
          "body": "Three coordinated sidebar features:\n- Depth-aware tree renderer (TreeNode model with buildTree/flattenVisible)\n- @tanstack/react-virtual for 1000+ capture directories, with dynamic\n  row measurement via measureElement\n- Drag-resize handle with localStorage persistence (240-600 px bounds)\n\nPlus two p\n[…]\nnks visibleRows\n- Removed CSS conflicts (slideIn animation + session-header sticky) that\n  fought the virtualizer's inline absolute positioning\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge branch 'tree-virtualization'",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T10:44:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bd065bf73948ca5a1a7727bba3384576757f6bdd",
          "body": "…sure\n\nResizeObserver fires asynchronously after poll refreshes and collapse\ntoggles; by the time measureElement calls getItemKey, visibleRows may\nhave shrunk and the original index is out of bounds. Mirror visibleRows\ninto a ref so the closure reads the latest array, and guard the access\nas a belt-and-suspenders fallback (`__gap_N` key).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): guard getItemKey against stale visibleRows during async mea…",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-10T10:42:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b81615d911b997f56898a289c01a6ad07fbbf6b4",
          "body": "…on, session sticky)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): remove CSS conflicts with virtualized rows (slideIn animati…",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-08T20:31:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "743eb5591b4aa951ee19b275b5a2d1fd9cd063d5",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): resizable sidebar with localStorage persistence",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-08T16:12:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2d5a79b922f7eeeba0acd0fc07a22e34662dedaa",
          "body": "…res int)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): use numeric vRow.index for data-index (measureElement requi…",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-08T16:10:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "09577f2ea8494cfe5cedc9c5f1f1a28a5b4bd0c9",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): virtualized tree renderer with depth-aware indentation",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-08T15:31:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1e2e441be6220a3f1f5c2843039e18996c4c13dc",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(web): replace SessionGroup with depth-aware TreeNode model",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-08T15:25:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "15cf17d417b7192b446f9edae4bfa98d415a9e0a",
          "body": "Three tasks: (1) depth-aware TreeNode model with buildTree/flattenVisible;\n(2) virtualized renderer via @tanstack/react-virtual with depth-aware indent;\n(3) SidebarResizeHandle + App.tsx state + localStorage persistence.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: implementation plan for tree virtualization + resizable sidebar",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-08T15:21:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "caa548f9a2c9cfcc70c32d5f49146496bbf75257",
          "body": "Three coordinated sidebar improvements:\n- Depth-aware tree renderer (two-level today, depth-prop API for future)\n- @tanstack/react-virtual for 1000+ capture directories\n- Drag-resize handle with localStorage persistence (240-600 px bounds)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: design spec for tree virtualization + resizable sidebar",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-08T15:17:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d98bece42c1fb3e5074ed5b25e1c383b26efa2ab",
          "body": "Mirror the on-disk structure: session directory name (UUID or\nsession-YYYYMMDD-HHMMSS-PID) is now the primary label, with capture\ncount in brackets. Drops the time/preview composite — user can expand\nto see contents.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): session header shows dirname + count",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-08T15:07:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ed33e1c9384fd8f8b3c3dca06c2d72e8d1045f31",
          "body": "Add two-level session tree grouping to the viewer sidebar. Newest session\nauto-expanded on data arrival; others collapsed. Header shows relative\ntime + capture count + opening-message preview. Server unchanged —\ngrouping is a pure client-side transform of the existing /api/files\nresponse.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge branch 'session-tree-sidebar'",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-08T14:57:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a613e9042a7dd60cb1b3ad4d132e355da1b723e5",
          "body": "…-render)\n\nThe original mount-only useEffect ran before /api/files resolved, so\ngroups was empty and nothing got collapsed. Switched to a useRef guard\nthat fires once when data first becomes non-empty.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): collapse to newest session once data arrives (init-on-first…",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-08T14:51:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2ea16587d1a36507441e064b59c8e8a0d2af147c",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): session tree sidebar with collapsible grouping",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-08T14:46:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "645bd50a843d862b1d64e5a16fc20e0b1b068714",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): add groupSessions helper + relativeTime/truncatePreview",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-08T14:42:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "685fb5061588b5ef6a20566fc7d02b4bed604c6f",
          "body": "Two tasks: (1) pure helpers (groupSessions + format additions);\n(2) ConversationList rewrite + session-header CSS. Server unchanged.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: implementation plan for session tree sidebar",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-08T14:31:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2ff89b4e9005f120c6571458ef5feaac4f1587fa",
          "body": "Two-level tree grouped by session-id (client-side only, server unchanged).\nNewest session expanded on load; others collapsed. Header shows relative\ntime + capture count + opening-message preview.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: design spec for session tree sidebar",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-08T14:28:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "847388442e4da70fc92d7d0c345473a27c8af115",
          "body": "- addon.py: write captures to per-session subdirectories keyed by\n  X-Claude-Code-Session-Id (with process-level fallback dir for\n  headerless requests). Sanitized to filename-safe chars. Also expand\n  target paths to include OpenAI /chat/completions and /completions\n  alongside Anthropic /messages.\n[…]\nurfaces session-scoped captures. /api/file\n  now accepts subdirectory paths but still rejects path traversal via\n  path.resolve + prefix check.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(capture): session-scoped captures + OpenAI endpoint support",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-08T14:17:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a199fba4b6c434fd95a5926fe65d9334106eec2f",
          "body": "Migrate viewer UI from 1821-line vanilla-JS monolith (public/index.html)\nto React + Vite + TypeScript app under web/, built to dist/ and served\nby lib/server.mjs.\n\n16 commits, side-by-side migration with ship-when-ready parity gate.\nOld monolith deleted; viewer now renders from dist/.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge branch 'react-frontend-migration'",
          "author_name": "artf",
          "author_login": null,
          "committed_at": "2026-07-08T14:14:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 5,
      "commits_last_year": 138,
      "latest_release_at": "2026-07-11T13:51:59Z",
      "latest_release_tag": "v0.8.1",
      "releases_from_tags": true,
      "days_since_last_push": 7,
      "active_weeks_last_year": 3,
      "days_since_latest_release": 11,
      "mean_days_between_releases": 1.2
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "claude-capture",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "claude",
            "claude-code",
            "mitmproxy",
            "anthropic",
            "capture",
            "debug",
            "proxy",
            "inspector"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/claude-capture",
          "is_deprecated": false,
          "latest_version": "1.0.0",
          "repository_url": "https://github.com/ysxdyt-001/claude-capture",
          "versions_count": 18,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2973,
          "first_published_at": "2026-07-06T14:44:24.659000Z",
          "latest_published_at": "2026-07-17T13:23:50.889000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 2,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "web/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 24939,
      "source_files_sampled": 36,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 6886
    },
    "dependencies": {
      "manifests": [
        "package.json",
        "web/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "react",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^18.3.1"
        },
        {
          "name": "react-dom",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^18.3.1"
        }
      ],
      "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": 1,
        "closed_issues": 1,
        "closed_unmerged_prs": 0
      },
      "bus_factor": null,
      "bot_contributors": 0,
      "top_contributors": [],
      "contributors_sampled": null,
      "top_contributor_share": null
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": true,
      "linter_configs": [
        "biome.json"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "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": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "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": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "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": null,
            "reason": "no dependencies found",
            "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": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "6ae0c964175c5374ef5262d884ce69dc5827e79e",
        "ran_at": "2026-07-22T15:11:08Z",
        "aggregate_score": 2.6,
        "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": null,
      "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/ysxdyt-001/claude-capture",
    "host": "github.com",
    "name": "claude-capture",
    "owner": "ysxdyt-001"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 52,
      "inputs": {
        "security": 26,
        "vitality": 69,
        "community": 32,
        "governance": 61,
        "engineering": 60
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 69,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "commits_last_year": 138,
              "human_commit_share": 1,
              "days_since_last_push": 7,
              "active_weeks_last_year": 3
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 7 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "3/52 weeks with commits",
                "points": 2.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "138 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 138
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "releases_count": 5,
              "latest_release_tag": "v0.8.1",
              "releases_from_tags": true,
              "days_since_latest_release": 11,
              "mean_days_between_releases": 1.2
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "5 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 11 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 11
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.2 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.2
                    }
                  }
                ],
                "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": 2,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "2 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": 58,
            "inputs": {
              "packages": [
                "claude-capture"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 2973
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,973 downloads/month across npm",
                "points": 46.3,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2973,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 61,
        "weight": 0.24,
        "metrics": [
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 76,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 1,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.8,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "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": "critical",
            "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": 15,
            "inputs": {
              "followers": 0,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "ysxdyt-001",
              "public_repos": 1,
              "account_age_days": 16
            },
            "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": "0 followers of ysxdyt-001",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "ysxdyt-001"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "1 public repos, account ~0 yr old",
                "points": 2.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 1
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "claude-capture"
              ],
              "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": "18 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 18
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 60,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 50,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "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": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "biome.json",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "biome.json"
                    }
                  }
                ],
                "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": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 26,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 26,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 2.6
            },
            "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 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "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": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 81,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 6886
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 71,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "web/tsconfig.json"
              ],
              "agent_commit_share": 0.87,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": "biome.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "biome.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "web/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "web/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "87 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 87,
                      "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": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": 24939,
              "source_files_sampled": 36,
              "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/36 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 36,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "Contributor list unavailable",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:claude-capture@1.0.0; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T15:11:12.672449Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/y/ysxdyt-001/claude-capture.svg",
  "full_name": "ysxdyt-001/claude-capture",
  "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.26.0 — metodología completa · wiki de métricas.

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