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

Kewton / CommandMate

Issue-driven AI development IDE for Claude Code and Codex CLI. Run multiple issues in parallel and keep work moving from desktop or mobile.

TypeScriptMIT★ 38 estrellas⑂ 4 forksdesde nov 2025Ver en GitHub ↗

Kewton/CommandMate tiene un índice de salud de 69 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (92/100) y la más baja, Security (45/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

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

69
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

KewtonCuenta personal
2 seguidores43 repositorios públicosdesde mar 2015

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
npmcommandmate0.11.4390984hace 2 díasclaude-codecodex-cligemini-cliagent-clicli-orchestrationai-codinggit-worktreecoding-agentsession-managertmuxclideveloper-tools

Métricas por categoría

Vitalidad

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

92Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
22.2/36Cadencia de commits — 32/52 semanas con commits
18/18Volumen de commits — 1751 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year1751
human_commit_share1
days_since_last_push0
active_weeks_last_year32
Cómo se puntúa
27/27Publica versiones — 88 versiones publicadas
36/36Recencia de las versiones — última versión hace 2 días
27/27Cadencia de publicación — una versión cada ~0,4 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count88
latest_release_tagv0.11.4
releases_from_tagsno
days_since_latest_release2
mean_days_between_releases0,4
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

59Moderado · 18% del índice global
Cómo se puntúa
25.4/60Estrellas — 38 estrellas
4/25Forks — 4 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks4
stars38
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
18/18Guía CONTRIBUTING
13.5/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conduct
has_pull_request_template
Cómo se puntúa
47.9/80Descargas mensuales — 3909 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagescommandmate
dependents
ecosystemsnpm
total_downloads
monthly_downloads3909
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?

55Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
45/46.8Resolución de issues — 96% de issues cerradas
37.3/38.3Aceptación de PR — 799/819 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/23 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs799
open_issues24
closed_issues617
issue_closed_ratio0,963
closed_unmerged_prs20
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
3.4/25Alcance del propietario — 2 seguidores de Kewton
24/25Trayectoria — 43 repos públicos, cuenta de ~11 años
Datos de entrada utilizados
followers2
owner_typeUser
is_verified
owner_loginKewton
public_repos43
account_age_days4154
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 2 días
20/20Historial de versiones — 84 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagescommandmate
ecosystemsnpm
any_deprecatedno
min_days_since_publish2

Calidad de Ingeniería

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

90Excelente · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 3 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — .eslintrc.json
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 23 out of 23 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno

Documentación

100Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://www.npmjs.com/package/commandmate
10/10Descripción del repositorio
10/10Topics — 14 topics
10/10Wiki
Datos de entrada utilizados
topicsclaude-code, developer-tools, git-worktree, terminal, tmux, commandmate, ai-coding, codex-cli, mobile-development, session-manager, autonomous-coding, claude-mobile, vibe-coding, web-ui
has_wiki
homepagehttps://www.npmjs.com/package/commandmate
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?

45En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — sin datos
2.5/2.5CI-Tests — 23 out of 23 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/23 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
1/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
4.5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 57 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4,5
Excluidos de la puntuación (sin datos o no aplicable): branch_protection, signed_releases. 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.

73Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 99 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,99
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes17.804
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato — .eslintrc.json
11/11Verificación estática de tipos — tsconfig.json
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 70 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
2/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
Datos de entrada utilizados
has_nixno
has_tests
lockfilespackage-lock.json
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configstsconfig.json
agent_commit_share0,7
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
54.8/55Tamaños de archivo manejables — 6/1422 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes127.698
source_files_sampled1422
oversized_source_files6
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

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

Advertencias de recopilación de datos

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:commandmate@0.11.4; advisories assessed against the repository dependency graph instead

Más detalle

Historial de estrellas y forks 38 ★ / 4 ⇿
38Estrellas
4Forks
35Versiones

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

01020304038432026-022026-042026-05
Mayor 0Menor 3Parche 32
OpenSSF Scorecard 4.5 / 10
4.5agregado

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

10Binary-Artifactsno binaries found in the repo
n/dBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests23 out of 23 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/23 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
2Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 2
0SASTSAST tool is not run on all commits -- score normalized to 0
9Security-Policysecurity policy file detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities57 existing vulnerabilities detected
Dependencias directas 50
RegistroPaqueteRestricción de versiónManifiesto
npm@dnd-kit/core^6.3.1package.json
npm@dnd-kit/sortable^10.0.0package.json
npm@dnd-kit/utilities^3.2.2package.json
npm@marp-team/marp-core^4.3.0package.json
npm@radix-ui/react-checkbox^1.3.7package.json
npm@radix-ui/react-dropdown-menu^2.1.20package.json
npm@radix-ui/react-radio-group^1.4.3package.json
npm@radix-ui/react-select^2.3.3package.json
npm@radix-ui/react-switch^1.3.3package.json
npm@radix-ui/react-tabs^1.1.17package.json
npm@radix-ui/react-tooltip^1.2.12package.json
npm@tanstack/react-virtual^3.13.26package.json
npmansi-to-html^0.7.2package.json
npmbetter-sqlite3^12.4.1package.json
npmclass-variance-authority^0.7.1package.json
npmclsx^2.1.1package.json
npmcmdk^1.1.1package.json
npmcommander^14.0.2package.json
npmcroner^10.0.1package.json
npmdate-fns^4.1.0package.json
npmdotenv^17.2.3package.json
npmgeist^1.7.2package.json
npmgithub-slugger^2.0.0package.json
npmgray-matter^4.0.3package.json
npmhttp-proxy^1.18.1package.json
npmisomorphic-dompurify^2.35.0package.json
npmjsdom^28.1.0package.json
npmlucide-react^0.554.0package.json
npmmermaid^11.12.2package.json
npmnext^15.5.20package.json
npmnext-intl^4.8.2package.json
npmnext-themes^0.4.6package.json
npmpostcss^8.5.6package.json
npmreact^19.2.7package.json
npmreact-dom^19.2.7package.json
npmreact-markdown^10.1.0package.json
npmreact-qr-code^2.0.18package.json
npmrehype-highlight^7.0.2package.json
npmrehype-raw^7.0.0package.json
npmrehype-sanitize^6.0.0package.json
npmrehype-slug^6.0.0package.json
npmremark-gfm^4.0.1package.json
npmsafe-regex2^5.0.0package.json
npmtailwind-merge^3.6.0package.json
npmuuid^13.0.0package.json
npmweb-push^3.6.7package.json
npmws^8.18.3package.json
npmxterm^5.3.0package.json
npmxterm-addon-fit^0.8.0package.json
npmxterm-addon-web-links^0.9.0package.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": [
        "claude-code",
        "developer-tools",
        "git-worktree",
        "terminal",
        "tmux",
        "commandmate",
        "ai-coding",
        "codex-cli",
        "mobile-development",
        "session-manager",
        "autonomous-coding",
        "claude-mobile",
        "vibe-coding",
        "web-ui"
      ],
      "is_fork": false,
      "size_kb": 127864,
      "has_wiki": true,
      "homepage": "https://www.npmjs.com/package/commandmate",
      "languages": {
        "CSS": 39205,
        "HTML": 17189,
        "Shell": 58883,
        "JavaScript": 32793,
        "TypeScript": 10647301
      },
      "pushed_at": "2026-07-22T00:44:08Z",
      "created_at": "2025-11-16T14:18:16Z",
      "owner_type": "User",
      "updated_at": "2026-07-20T00:33:58Z",
      "description": "Issue-driven AI development IDE for Claude Code and Codex CLI. Run multiple issues in parallel and keep work moving from desktop or mobile.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "User",
      "login": "Kewton",
      "company": null,
      "location": null,
      "followers": 2,
      "avatar_url": "https://avatars.githubusercontent.com/u/11370858?v=4",
      "created_at": "2015-03-08T01:59:38Z",
      "is_verified": null,
      "public_repos": 43,
      "account_age_days": 4154
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.11.4",
          "kind": "patch",
          "published_at": "2026-07-20T00:38:18Z"
        },
        {
          "tag": "v0.11.3",
          "kind": "patch",
          "published_at": "2026-07-19T15:26:19Z"
        },
        {
          "tag": "v0.11.2",
          "kind": "patch",
          "published_at": "2026-07-19T04:24:19Z"
        },
        {
          "tag": "v0.11.1",
          "kind": "patch",
          "published_at": "2026-07-18T16:31:06Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-07-18T06:39:16Z"
        },
        {
          "tag": "v0.10.4",
          "kind": "patch",
          "published_at": "2026-07-18T01:47:03Z"
        },
        {
          "tag": "v0.10.3",
          "kind": "patch",
          "published_at": "2026-07-17T07:47:18Z"
        },
        {
          "tag": "v0.10.2",
          "kind": "patch",
          "published_at": "2026-07-17T05:56:51Z"
        },
        {
          "tag": "v0.10.1",
          "kind": "patch",
          "published_at": "2026-07-17T01:01:12Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-07-16T14:13:05Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-07-15T08:50:59Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-15T01:46:19Z"
        },
        {
          "tag": "v0.8.4",
          "kind": "patch",
          "published_at": "2026-07-10T09:28:12Z"
        },
        {
          "tag": "v0.8.3",
          "kind": "patch",
          "published_at": "2026-07-08T16:08:13Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2026-07-06T05:05:26Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-07-05T10:09:42Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-07-03T10:44:41Z"
        },
        {
          "tag": "v0.7.5",
          "kind": "patch",
          "published_at": "2026-06-30T07:26:14Z"
        },
        {
          "tag": "v0.7.4",
          "kind": "patch",
          "published_at": "2026-06-25T15:09:43Z"
        },
        {
          "tag": "v0.7.3",
          "kind": "patch",
          "published_at": "2026-06-23T00:42:01Z"
        },
        {
          "tag": "v0.7.2",
          "kind": "patch",
          "published_at": "2026-06-21T14:47:41Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-06-20T14:25:06Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-06-17T06:44:35Z"
        },
        {
          "tag": "v0.6.4",
          "kind": "patch",
          "published_at": "2026-06-10T04:47:43Z"
        },
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2026-06-05T03:34:43Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-06-04T07:48:56Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-06-03T00:54:10Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-06-02T00:01:08Z"
        },
        {
          "tag": "v0.5.8",
          "kind": "patch",
          "published_at": "2026-05-27T15:24:56Z"
        },
        {
          "tag": "v0.5.7",
          "kind": "patch",
          "published_at": "2026-05-11T02:00:05Z"
        },
        {
          "tag": "v0.5.6",
          "kind": "patch",
          "published_at": "2026-04-27T14:57:49Z"
        },
        {
          "tag": "v0.5.5",
          "kind": "patch",
          "published_at": "2026-04-16T15:29:46Z"
        },
        {
          "tag": "v0.5.4",
          "kind": "patch",
          "published_at": "2026-04-12T14:26:57Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2026-04-05T13:26:49Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2026-04-04T07:30:56Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-04-02T06:50:21Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-04-01T15:53:27Z"
        },
        {
          "tag": "v0.4.16",
          "kind": "patch",
          "published_at": "2026-03-31T22:57:37Z"
        },
        {
          "tag": "v0.4.15",
          "kind": "patch",
          "published_at": "2026-03-31T01:41:46Z"
        },
        {
          "tag": "v0.4.14",
          "kind": "patch",
          "published_at": "2026-03-29T01:36:17Z"
        },
        {
          "tag": "v0.4.13",
          "kind": "patch",
          "published_at": "2026-03-27T16:27:14Z"
        },
        {
          "tag": "v0.4.12",
          "kind": "patch",
          "published_at": "2026-03-24T07:02:12Z"
        },
        {
          "tag": "v0.4.11",
          "kind": "patch",
          "published_at": "2026-03-21T03:14:39Z"
        },
        {
          "tag": "v0.4.10",
          "kind": "patch",
          "published_at": "2026-03-18T16:17:51Z"
        },
        {
          "tag": "v0.4.9",
          "kind": "patch",
          "published_at": "2026-03-16T13:36:51Z"
        },
        {
          "tag": "v0.4.8",
          "kind": "patch",
          "published_at": "2026-03-14T02:08:56Z"
        },
        {
          "tag": "v0.4.7",
          "kind": "patch",
          "published_at": "2026-03-13T04:17:54Z"
        },
        {
          "tag": "v0.4.6",
          "kind": "patch",
          "published_at": "2026-03-11T09:37:08Z"
        },
        {
          "tag": "v0.4.5",
          "kind": "patch",
          "published_at": "2026-03-10T14:40:21Z"
        },
        {
          "tag": "v0.4.4",
          "kind": "patch",
          "published_at": "2026-03-09T22:09:35Z"
        },
        {
          "tag": "v0.4.3",
          "kind": "patch",
          "published_at": "2026-03-08T14:46:45Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2026-03-08T14:14:28Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-03-06T02:12:59Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-03-04T23:42:16Z"
        },
        {
          "tag": "v0.3.6",
          "kind": "patch",
          "published_at": "2026-03-03T03:38:27Z"
        },
        {
          "tag": "v0.3.5",
          "kind": "patch",
          "published_at": "2026-03-01T12:55:24Z"
        },
        {
          "tag": "v0.3.4",
          "kind": "patch",
          "published_at": "2026-02-28T02:52:56Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2026-02-26T12:25:46Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2026-02-24T13:42:57Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-02-23T03:07:57Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-02-22T15:05:05Z"
        },
        {
          "tag": "v0.2.13",
          "kind": "patch",
          "published_at": "2026-02-20T13:42:05Z"
        },
        {
          "tag": "v0.2.12",
          "kind": "patch",
          "published_at": "2026-02-20T04:25:39Z"
        },
        {
          "tag": "v0.2.11",
          "kind": "patch",
          "published_at": "2026-02-19T03:51:17Z"
        },
        {
          "tag": "v0.2.10",
          "kind": "patch",
          "published_at": "2026-02-17T05:01:25Z"
        },
        {
          "tag": "v0.2.9",
          "kind": "patch",
          "published_at": "2026-02-15T05:10:24Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2026-02-14T14:55:20Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-02-14T11:00:30Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2026-02-14T02:00:27Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2026-02-14T00:16:21Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-02-13T14:10:30Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-02-12T15:23:30Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-02-10T08:54:12Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-02-09T23:00:18Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-02-08T08:24:27Z"
        },
        {
          "tag": "v0.1.12",
          "kind": "patch",
          "published_at": "2026-02-04T07:00:11Z"
        },
        {
          "tag": "v0.1.11",
          "kind": "patch",
          "published_at": "2026-02-03T16:39:26Z"
        },
        {
          "tag": "v0.1.10",
          "kind": "patch",
          "published_at": "2026-02-02T06:20:18Z"
        },
        {
          "tag": "v0.1.9",
          "kind": "patch",
          "published_at": "2026-02-02T02:29:30Z"
        },
        {
          "tag": "v0.1.8",
          "kind": "patch",
          "published_at": "2026-02-02T01:57:40Z"
        },
        {
          "tag": "v0.1.7",
          "kind": "patch",
          "published_at": "2026-02-01T23:38:17Z"
        },
        {
          "tag": "v0.1.6",
          "kind": "patch",
          "published_at": "2026-02-01T15:35:34Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2026-01-31T17:19:00Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2026-01-31T17:08:51Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-01-31T16:57:36Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-01-31T16:12:04Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-01-31T15:56:04Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-01-30T01:23:40Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "ad1579473c98b0b9268c0be2f68b10726f9fa1ec",
          "body": "Refs #1410",
          "is_bot": false,
          "headline": "release: v0.11.4 (#1412)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-20T00:33:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0364d0530274f6ef3f8fc3ed5d2c43fcf4780b69",
          "body": "* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filenam\n[…]\n鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/種別設定/VAPID公開鍵の認証必須API(グローバルmiddleware配下)\n- Service Worker に push/notificationclick ハンドラ(該当worktreeへdeep link・…",
          "is_bot": false,
          "headline": "release: v0.11.3 (#1409)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-19T15:15:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5bc7f3353535d7ba773e13801bff1f3fddc548b3",
          "body": "* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filenam\n[…]\n鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/種別設定/VAPID公開鍵の認証必須API(グローバルmiddleware配下)\n- Service Worker に push/notificationclick ハンドラ(該当worktreeへdeep link・…",
          "is_bot": false,
          "headline": "release: v0.11.2 (#1406)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-19T04:23:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e74c4a0e085538c86d1ada3b8885b7e9e6810343",
          "body": "* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filenam\n[…]\n鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/種別設定/VAPID公開鍵の認証必須API(グローバルmiddleware配下)\n- Service Worker に push/notificationclick ハンドラ(該当worktreeへdeep link・…",
          "is_bot": false,
          "headline": "release: v0.11.1 (#1403)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-18T16:29:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b8331343387ffa8e2da4663b3234dc9ca553d41d",
          "body": "npx 起動サーバの GUI アップデート対応(#1394 fix + #1395 feat)をまとめた minor リリース。詳細は PR #1398 / CHANGELOG 参照。",
          "is_bot": false,
          "headline": "release: v0.11.0 (#1398)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-18T06:38:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f7d6c993219c56e16b2ece11fe3049c96e83115",
          "body": "* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filenam\n[…]\n鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/種別設定/VAPID公開鍵の認証必須API(グローバルmiddleware配下)\n- Service Worker に push/notificationclick ハンドラ(該当worktreeへdeep link・…",
          "is_bot": false,
          "headline": "release: v0.10.4 (#1393)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-18T01:45:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8fa53e2a9c7ece9711518c56a1b82f17332f2df3",
          "body": "* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filenam\n[…]\n鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/種別設定/VAPID公開鍵の認証必須API(グローバルmiddleware配下)\n- Service Worker に push/notificationclick ハンドラ(該当worktreeへdeep link・…",
          "is_bot": false,
          "headline": "release: v0.10.3 (#1336)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-17T07:46:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6b33fa354256d9c0b150f3d224ccca870493c6de",
          "body": "* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filenam\n[…]\n鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/種別設定/VAPID公開鍵の認証必須API(グローバルmiddleware配下)\n- Service Worker に push/notificationclick ハンドラ(該当worktreeへdeep link・…",
          "is_bot": false,
          "headline": "release: v0.10.2 (#1333)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-17T05:55:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7edcb567ec1a85c4201604eb05fa00f30f20f9fa",
          "body": "* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filenam\n[…]\n鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/種別設定/VAPID公開鍵の認証必須API(グローバルmiddleware配下)\n- Service Worker に push/notificationclick ハンドラ(該当worktreeへdeep link・…",
          "is_bot": false,
          "headline": "release: v0.10.1 (#1325)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-17T00:58:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e568c655c9922d16ffec847bc0a74adacce1961f",
          "body": "* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filenam\n[…]\n鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/種別設定/VAPID公開鍵の認証必須API(グローバルmiddleware配下)\n- Service Worker に push/notificationclick ハンドラ(該当worktreeへdeep link・…",
          "is_bot": false,
          "headline": "release: v0.10.0 (#1314)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-16T14:10:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ebbbed5f05171868d50d59e3dbad579db7fabc6e",
          "body": "chore: release v0.9.1",
          "is_bot": false,
          "headline": "release: v0.9.1 (#1202)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-15T08:50:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5847d674eeea3642c476681a2f756bd2c2dc95d1",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.9.1",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-15T08:39:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ecf027ec6812d8c250ad65c25b006019034542a",
          "body": "… E2EのCI組込み #1180 / ちらつき解消 #1184) (#1191)\n\n* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Con\n[…]\nns テーブル(migration v41)と CRUD モジュールを追加\n- VAPID/web-push 送信層: 種別フィルタ・デバウンス・410自動削除、機密(endpoint/秘密鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/種別設定/VAPID公開鍵の…",
          "is_bot": false,
          "headline": "release: develop の受け入れ済み変更を main へ反映(Next15/React19/Tailwind4 #1129 /…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-15T07:50:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ec7d4c90e31aaaa77b1835f80133e244490c63ef",
          "body": "chore: release v0.9.0",
          "is_bot": false,
          "headline": "release: v0.9.0 (#1176)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-15T01:45:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c186222b9c2a133321aeccfa6d875cbe41794a34",
          "body": "The filter chips render unconditionally before the fetch resolves — only\nthe list below them is gated on isLoading — so waiting on their existence\npassed at count 0 and the count assertions raced fetch -> json -> setState\n-> re-render. React schedules that re-render through the Scheduler\n(MessageCha\n[…]\n 10ms reproduces the exact CI\nfailure (\"expected 'In Review0' to match /2/\") against the old form and\npasses 7/7 against this one.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(review): wait on data, not markup, in filter count badge test",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-15T01:37:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2fca15b8ffee75944c25895e992ef9eb4ccf8c1e",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.9.0",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-15T01:00:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86583cce27ad804588e1a80f1a4d07ba822dff8a",
          "body": "…ターミナル・tmux安定化 / 履歴CASCADE削除修正 #1153) (#1175)\n\n* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream +\n[…]\nsh_subscriptions テーブル(migration v41)と CRUD モジュールを追加\n- VAPID/web-push 送信層: 種別フィルタ・デバウンス・410自動削除、機密(endpoint/秘密鍵)は非ログ\n- プロンプト検出/セッション完了時に response-checker からファンアウト(検出ロジックは不変・fire-and-forget)\n- 購読登録/解除/…",
          "is_bot": false,
          "headline": "release: develop の受け入れ済み変更を main へ反映(UI/UXモダナイゼーション #1110 Phase1-5 / …",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-15T00:49:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eb9a89c05a9aeaf8420f430f435b946d240bb366",
          "body": "…61 / integration復旧 #1102 / bug #1104) (#1106)\n\n* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream \n[…]\nplicate name テストを un-skip(#1104 で修正済み)\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: develop の受け入れ済み変更を main へ反映(UIモダン化2段階 #1041-1082 / 生UI移行 #10…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-13T14:10:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2bfbfab15ce5ca3864a829b029a4f5f7f10dacd4",
          "body": "release: v0.8.4",
          "is_bot": false,
          "headline": "Merge pull request #1039 from Kewton/release/v0.8.4",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-10T09:27:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffeed4455bae4096c135ccb82181a6f8f087aef7",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.4",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-10T09:20:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b9ba440cd9528698b5fceb8ad3a4e85b12e7bcd",
          "body": "… 詳細・編集 / #1036 コピー) (#1038)\n\n* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposit\n[…]\nト3件追加\n- migration/DB/API 変更なし(UIのみ)\n\nCloses #1036\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: develop の受け入れ済み変更を main へ反映(ブランチ単位ToDo強化: #1032 3状態化 / #1034…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-10T09:00:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "707cbc1f93b96c6a305a21e6512013c4e9d9b67b",
          "body": "release: v0.8.3",
          "is_bot": false,
          "headline": "Merge pull request #1031 from Kewton/release/v0.8.3",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-08T16:07:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d42bd0b258fff98e5caf467ddd1646742eaf8e5f",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.3",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-08T15:59:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f8aec2e931bb0a131b7b024261d078929381dbc",
          "body": "* feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024) (#1025)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filenam\n[…]\n (2引数アサート vs 3引数呼び出し)で本修正と無関係(CI の test:unit 対象外)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: develop の受け入れ済み変更を main へ反映(#1028 Timer送信のHistory記録) (#1030)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-08T15:38:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "62c591a0b237273fbcb5f15fc4afa71dade7f396",
          "body": "release: v0.8.2",
          "is_bot": false,
          "headline": "Merge pull request #1027 from Kewton/release/v0.8.2",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-06T05:04:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d64818583ae84afa4f49a441cb2793a98055625",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.2",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-06T04:57:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "02bb34f3183076597418b249ac0a826b7b7fae56",
          "body": "… (#1025) (#1026)\n\nスマホ版のファイルビューア(FileViewer, Issue #438 でモバイル専用化)から\n任意種別のファイルをダウンロードできるようにする。\n\n- B(サーバ): files/[...path] GET に download 分岐を追加し、生バイトを\n  Content-Type: application/octet-stream + Content-Disposition: attachment で返却。\n  filename は src/lib/http の content-disposition ヘルパーで RFC 準拠にサニタイズ\n  (A\n[…]\nスト新規29本(download API のヘッダ/パス検証/filename、content-disposition\n  ヘルパー、FileViewer ボタン)\n- C(独立ページのPDF分岐/DLリンク)は範囲外(モバイル動線が独立ページを使わないため)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024)…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-06T04:46:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "81b344ee0e3374727000a264fda06b8f05f4c102",
          "body": "release: v0.8.1(ブランチ単位ToDo #1015 / Codex選択ウィンドウ #1017 / Historyヘッダー固定 #1019)",
          "is_bot": false,
          "headline": "Merge pull request #1023 from Kewton/release/v0.8.1",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-05T10:08:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f54421a0d7e98219e621d570a7dd6e009001e8f",
          "body": "- feat(worktree): ブランチ単位のToDoリスト (#1015)\n- fix(terminal): Codexのページャ/選択状態で選択ウィンドウ表示 (#1017)\n- fix(history): Message Historyヘッダー固定・スクロール限定 (#1019)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): v0.8.1",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-05T08:20:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f18a102f8ccb3c4ede4d4e10b79924634abef0f1",
          "body": "History パネルが「ペイン全体が単一スクロールコンテナ + sticky ヘッダー」構造の\nため、メッセージがヘッダーの背後を通過して違和感があった。固定ヘッダー行 +\n独立スクロール領域のレイアウトに変更する。\n\n- HistoryPane: 最外層を非スクロール(flex-col overflow-hidden)化し、ヘッダー/検索\n  バーを flex-shrink-0(sticky/top-0/top-12/z-10 撤去)、メッセージを新設の内側\n  スクロール div(flex-1 min-h-0 overflow-y-auto overflow-x-hidden)に配置。\n\n[…]\nダー/検索バーはスクロール領域の外、メッセージは中)\n- HistoryPane は PC(TerminalSplitPaneContent)/モバイル(WorktreeDetailMobile)\n  共用のため両方のレンダーテストで検証(リグレッションなし)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(history): Message Historyヘッダーを固定しスクロールをヘッダー下に限定 (#1019) (#1021)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-05T05:36:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3b2f3bd580cc5237a5b0baff2f772f2c057ac3e8",
          "body": "History パネルが「ペイン全体が単一スクロールコンテナ + sticky ヘッダー」構造の\nため、メッセージがヘッダーの背後を通過して違和感があった。固定ヘッダー行 +\n独立スクロール領域のレイアウトに変更する。\n\n- HistoryPane: 最外層を非スクロール(flex-col overflow-hidden)化し、ヘッダー/検索\n  バーを flex-shrink-0(sticky/top-0/top-12/z-10 撤去)、メッセージを新設の内側\n  スクロール div(flex-1 min-h-0 overflow-y-auto overflow-x-hidden)に配置。\n\n[…]\nダー/検索バーはスクロール領域の外、メッセージは中)\n- HistoryPane は PC(TerminalSplitPaneContent)/モバイル(WorktreeDetailMobile)\n  共用のため両方のレンダーテストで検証(リグレッションなし)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(history): Message Historyヘッダーを固定しスクロールをヘッダー下に限定 (#1019) (#1020)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-05T05:15:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "42033ab71a6541e4180859993b16cb08f0e58bc8",
          "body": "…(#1018)\n\nCodex CLI がページャ/edit-previous モードのとき、選択ウィンドウ(NavigationButtons)が\n表示されず、読み取り専用ターミナルから操作・脱出できない問題を修正。複数インスタンス\n(codex-2/codex-3)がページャに滞留した際に顕在化していた。\n\n- A(検出): CODEX_PAGER_FOOTER_PATTERN 追加、status-detector にステータスバー非依存の\n  ページャ検出分岐(reason=CODEX_PAGER, SELECTION_LIST_REASONS入り)。/model 等の\n  \"press\n[…]\n/\n  tmux-navigation / NavigationButtons / TerminalEscapeHatch / TerminalSplitPaneContent\n- B(上部インスタンスタブ↔分割セレクタ連動)は本PR対象外(別Issue推奨)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(terminal): Codexのページャ/選択状態で選択ウィンドウ(NavigationButtons)を表示 (#1017) …",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-05T01:20:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "56f47fe37fd47fee44710d38a42ea3e4e97aa8dc",
          "body": "ブランチ(worktree)単位で管理できるチェックボックス式ToDoリストを追加。\nPC版はアクティビティバー、スマホ版はTools(NotesAndLogsPane)から利用でき、\nPC/スマホで共通の TodoPane コンポーネントを共有する。\n\n- DB: worktree_todos テーブル(migration v37, worktree_id FK, ON DELETE CASCADE)\n  + worktree-todo-db(CRUD)。CURRENT_SCHEMA_VERSION 36→37\n- API: /api/worktrees/[id]/todos(GET/POS\n[…]\nb ラベル(parity テスト付き)\n- 既存のリポジトリ単位ToDo(repository_todos)とは独立して併存\n- テスト新規6本(DB / API / TodoPane / migration v37 / i18n parity / 既存追随)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(worktree): ブランチ単位のToDoリスト(PC=アクティビティバー / スマホ=Tools)(#1015) (#1016)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-04T08:16:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "90c4b77a6b054110aa903c046a83adc3704d7f3d",
          "body": null,
          "is_bot": false,
          "headline": "chore: merge release v0.8.0 to develop",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-03T10:44:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0cb49a9de296166260865df074f5f6c6ba3bf679",
          "body": "release: v0.8.0",
          "is_bot": false,
          "headline": "Merge pull request #1013 from Kewton/release/v0.8.0",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-03T10:44:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d5f2d4bcb4388d5bb1d6caa60e8aec14c3b8e31",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.0",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-03T10:37:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e000567f8b4f850452ef38a64faf3e1c08a5d75d",
          "body": "…rkdown TOC 他) (#1012)\n\n* feat(files): toggleable file-tree metadata columns + hover tooltip (#969) (#972)\n\nPreviously each file row always rendered size and a relative birthtime\ninline, crowding the file name. This makes the inline metadata columns\n(size / created / modified) individually toggleabl\n[…]\nスの fireResize(500) -> fireResize(400)(新しきい値480未満)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: develop の受け入れ済み変更を main へ反映(Antigravity対応 / CLIマルチセッション / Ma…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-03T10:03:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ced6c934bfd4971f389a4fbab942d2bb86a151d2",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main' into develop",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-03T09:52:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0d80d60577359b4cc0f21dbe7f6a4c7d4b23ce1",
          "body": "worktree詳細ページのインラインプレビューペインは既定の複数パネルレイアウトで\n約551px幅となり、従来のTOC表示しきい値640pxでは目次サイドバーが常に自動非表示に\nなっていた。しきい値を480pxへ下げ、サイドバーをw-56→w-48に縮小して本文の可読幅を\n確保することで、全画面化しなくても詳細ページのインラインプレビューで目次を表示できる\nようにする。\n\n- TOC_SIDEBAR_MIN_WIDTH_PX: 640 -> 480\n- TOCサイドバー幅: w-56(224px) -> w-48(192px)\n- テスト: 狭幅ケースの fireResize(500) -> fireResize(400)(新しきい値480未満)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ui): インラインMarkdownプレビューのTOC表示しきい値を480pxに調整 (#1009) (#1011)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-02T08:04:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f6b22f637eb282e627919db62135892bcd2c3a0d",
          "body": "MarkdownPreview に rehype-slug を rehype-sanitize 後段で適用して見出しへ\nプレーンな id を付与し、MarkdownToc に root prop を追加してプレビュー\nペイン内のスクロールコンテナを基準にスクロールスパイできるようにした。\nMarkdownEditor のプレビューペインに ResizeObserver でコンテナ幅を判定\nする TOC サイドバー+トグルを追加し、表示状態は #1007 と同じ\nlocalStorage キー(commandmate:md-toc-visible)で共有する。\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ui): worktree詳細ページのインラインMarkdownプレビューにサイドTOCを追加 (#1009) (#1010)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-02T07:48:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a1750ff116b641042c6dd2f5aa450ec58b394b56",
          "body": "独立ファイルビューワーページ (src/app/worktrees/[id]/files/[...path]/page.tsx)\nのマークダウン表示にサイド TOC(目次)を PC 幅限定で追加する。\n\n- rehype-slug@^6 / github-slugger@^2 を導入し、見出しに id を付与\n- extractToc 純粋関数 (src/lib/markdown-toc.ts): ATX 見出しを抽出し\n  github-slugger で rehype-slug と完全一致する id を生成\n  (フェンス/インデントコード除外・ATX 制約・重複 suffix 対応、se\n[…]\n追加: extractToc(rehype-slug 実パイプラインとの id 一致検証含む)/\n  MarkdownToc(jsdom + IntersectionObserver/scrollIntoView モック)/ toc.* i18n parity\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ui): PC版マークダウンビューワーにサイドTOC(目次)を追加 (#1007) (#1008)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-02T05:15:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9b9acc5a9c2742f78be9327f9216911ff5e57ddf",
          "body": "同一ブランチ名(develop等)が複数リポジトリに存在する環境で、worktree ID\nの前方一致により特定リポジトリの worktree を一意に絞り込めるようにする。\n既存の --branch フィルタと独立した AND 条件として適用可能。\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): ls --id <prefix> で worktree ID 前方一致フィルタを追加 (#1005) (#1006)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-02T04:13:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "108c1926f0105ccacb33c043847a5edb7554ddb5",
          "body": "worktrees テーブルに branch カラムを追加し、sync 時に実ブランチ名を\n保存・API/型で伝播する方針A を採用。ls --branch フィルタを name\n直接参照から (wt.branch ?? wt.name) の前方一致へ変更する。\n\n- v36 マイグレーション追加 (ALTER TABLE worktrees ADD COLUMN branch)\n  - migrations/index.ts へ登録、CURRENT_SCHEMA_VERSION 35→36\n- Worktree / WorktreeItem 型に branch?: string を追加\n  \n[…]\nィルタを branch 優先・name フォールバックに変更(後方互換)\n- テスト追加: v36 冪等/無損失、worktree-db round-trip、API branch 返却、\n  ls --branch (branch != name) フィルタ\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): ls --branch を実ブランチ名で絞り込む (#1003) (#1004)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-02T03:13:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4ec5645ddcf841e0456f3a2f3cd34d4a76a90d17",
          "body": "- commandmate instances サブコマンドで roster + 稼働状況を一覧・add/remove/alias/kill 操作可能に\n- send --instance --register でアドホックセッションを roster に自動登録\n- ApiClient に PATCH サポートを追加、agentInstances を型定義(ls --json 含む)\n- 埋め込みdocs/user-guideにマルチセッション節を追加、--instance のヘルプにID規約例を追記",
          "is_bot": false,
          "headline": "feat(cli): 1エージェント複数セッションのCLI管理・ドキュメント整備 (#1000) (#1002)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-01T16:36:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af945d4dee03adc3296642bc903353904a36c2f5",
          "body": "…) (#1001)\n\nAuto-Yes never answered agy's \"Do you want to proceed?\" permission menu:\nthe poller ran (poller:started x4) but sent nothing (response-sent x0).\nTwo gaps, both fixed:\n\n1. Detection: buildDetectPromptOptions('antigravity') returned undefined\n   (requireDefaultIndicator=true). agy highligh\n[…]\nr => \"1\"; sendPromptAnswer uses cursor nav (Enter / Down+Enter)\nfor antigravity. Other tools' detection and sending are unchanged.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(auto-yes): respond to Antigravity permission-approval menus (#999…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-01T16:15:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0cd6d7e55114013cd9455243a426fe619763634f",
          "body": "…ermission-approval menu (#997) (#998)\n\nRelax ANTIGRAVITY_SELECTION_LIST_PATTERN (Option A) so the \"↑/↓ Navigate\"\nfooter alone is sufficient, dropping the \"enter Select\" requirement from #995.\nThe agy \"Do you want to proceed?\" permission-approval menu footer is\n\"↑/↓ Navigate · tab Amend · ctrl+g … ·\n[…]\ntion tests for the permission menu at\nboth the pattern and status-detector layers, including the thinking-priority\nordering guard.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(detection): broaden Antigravity selection-list pattern to cover p…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-01T11:29:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ced3b923875bfb64d68110b609021c5fd3c27705",
          "body": "* feat(files): toggleable file-tree metadata columns + hover tooltip (#969) (#972)\n\nPreviously each file row always rendered size and a relative birthtime\ninline, crowding the file name. This makes the inline metadata columns\n(size / created / modified) individually toggleable and persisted, and\nadd\n[…]\n the pattern and the thinking-collision ordering.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): Antigravity CLI(agy)対応(Phase A/B/C)を main へ反映 (#994)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-01T06:45:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1d3ff44ee458971be9ceeffbde1c675adc113512",
          "body": "…ttons show (#995) (#996)\n\nagy's \"Switch Model\" (and other) selection TUIs render an \"esc to cancel\"\nfooter that ANTIGRAVITY_THINKING_PATTERN also matches, so the selection\nscreen was misreported as running/thinking and NavigationButtons never\nappeared — leaving ↑↓/Enter model selection unreachable.\n[…]\nrroring the Copilot (0) / Codex (0.8) early-detection ordering.\n\nUnit tests cover the pattern and the thinking-collision ordering.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(detection): detect Antigravity selection-list TUI so NavigationBu…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-01T05:55:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6c1f2c0cde1e59033128acd2c60f064117caa455",
          "body": "… C, #990) (#992)\n\nIntegrate Antigravity (`agy -p`) into all non-interactive execution paths,\nmirroring the existing claude/codex handling.\n\nAssistant Chat (non-interactive):\n- AssistantChatPanel: add antigravity to ASSISTANT_ALLOWED_TOOLS\n- tool-capabilities: add antigravity to NON_INTERACTIVE_TOOL\n[…]\n tool-capabilities, executor, report --tool, review-config,\nstandard-commands. Updated docs/module-reference.md. All 4 gates pass.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): add Antigravity (agy) non-interactive integration (Phase…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-01T02:31:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "252d16db151472f07c53c490a663f958b83f7c4d",
          "body": "…989) (#993)\n\nAdds Auto-Yes (--dangerously-skip-permissions) and --model support for the\nAntigravity (agy) CLI tool introduced in Phase A (#988), bringing it to\nfeature parity with other agents.\n\n- schedule-config/cmate-parser/cmate-validator: antigravity permission\n  handling for the CMATE.md sched\n[…]\n_AGENTS 5->6, antigravity added\n  to DEFAULT_SELECTED_AGENTS\n- CLI help text updated across send/respond/capture/auto-yes commands\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): add Antigravity Auto-Yes and model selection (Phase B, #…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-07-01T02:30:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "074e36d60b205b5a8cc2e9b685ba53c2ee331272",
          "body": "Register the Antigravity `agy` CLI (v1.0.14) as a selectable agent.\n\n- types/index/manager: add 'antigravity' to CLI_TOOL_IDS, the\n  'Antigravity' display name, and register AntigravityTool.\n- cli-tools/antigravity.ts: new AntigravityTool. agy is an INLINE TUI\n  (scrollback retained, Codex-style — n\n[…]\n from source. Scope is Phase A (MVP) only: permission flags,\nmodel selection, and non-interactive `agy -p` are tracked separately.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): add Antigravity (agy) CLI support (Phase A, #988) (#991)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-30T16:12:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "abb6216d093fd160d5ab76a8677816cc71644e3e",
          "body": null,
          "is_bot": false,
          "headline": "chore: merge release v0.7.5 to develop",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-30T07:26:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "74c8bc1cc21b7a036cde6e9bca32e2b72fd2e1fa",
          "body": "release: v0.7.5",
          "is_bot": false,
          "headline": "Merge pull request #986 from Kewton/release/v0.7.5",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-30T07:25:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "033e1f905b88a3df3696e8028f68af1f63ee727c",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.5",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-30T07:17:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a32bab6e83564a829d92032a89f2c902bd13cc68",
          "body": "* feat(files): toggleable file-tree metadata columns + hover tooltip (#969) (#972)\n\nPreviously each file row always rendered size and a relative birthtime\ninline, crowding the file name. This makes the inline metadata columns\n(size / created / modified) individually toggleable and persisted, and\nadd\n[…]\nnd mermaid diagrams stay button-free.\n\nFixes #983\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: v0.7.4以降のUI改善・不具合修正を main へ反映 (#985)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-30T07:10:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c5975a6e7e019d874405ef9a395fc43b881218a7",
          "body": "…de (#984)\n\nreact-markdown v10 no longer passes an `inline` prop to the `code`\ncomponent, so MermaidCodeBlock's inline check was always undefined. Every\ninline code span fell through to CodeBlockWithCopy, gaining a copy button\nand being forced onto its own line via the `as=\"span\"` block class.\n\nMove\n[…]\no line\nbreak, fenced blocks (with and without a language) get a working button,\nand mermaid diagrams stay button-free.\n\nFixes #983\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(markdown): attach code copy button at pre renderer, not inline co…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-29T14:06:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "247d9e4425e0c4f823b9ba54422ab764421a0146",
          "body": "…982)\n\nAdds a copy-to-clipboard button to each non-mermaid code block in the\nmarkdown file preview render paths (PC + mobile).\n\n- Extract CopyButton into src/components/common/CopyButton.tsx, reused\n  by AssistantMessageList (behavior unchanged) and the new wrapper.\n- Add CodeBlockWithCopy that wrap\n[…]\nsanitize cannot drop it.\n- Add unit tests for CopyButton, CodeBlockWithCopy/extractCodeText, and\n  MermaidCodeBlock copy behavior.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(markdown): add copy button to file-preview code blocks (#981) (#…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-29T12:20:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fcebd67b3b4e4d8a2ed9c37bc779d999e20e7e4e",
          "body": "…t/Equal widths/History/Files order (#977) (#980)\n\nRemove the `ml-auto` on the +Split button (which split the action bar into\nleft/right groups) and reorder the JSX so all buttons read left-to-right:\n+Split → -Split → Equal widths → History → Files. PC-only change\n(TerminalSplitContainer is rendered\n[…]\nes are unaffected. Button behavior, enabled/disabled conditions, and aria\nstate are unchanged. Adds order-verification unit tests.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(terminal): left-align PC terminal header buttons in +Split/-Spli…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-29T09:57:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "823e0c9d59c35702dd8b74827f748bcda574f0d5",
          "body": "…r overlap (#976) (#979)\n\nWhen the sidebar is narrowed, the header's heading + action button group\n(ViewModeToggle / SortSelector / SyncButton / Repositories) overflowed\nhorizontally and overlapped the adjacent ActivityBar because the row was\nflex-nowrap with the default overflow:visible.\n\n- Sidebar\n[…]\nown.\n- tests: add 3 cases asserting flex-wrap on the header row and actions\n  group, and min-w-0/truncate on the Branches heading.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(sidebar): wrap header buttons on narrow width to avoid ActivityBa…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-29T09:57:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e6275707196c1300a9f4d8881856ac9455bf8463",
          "body": "…5) (#978)\n\nMerge the two independent file-row tooltips into a single styled bubble.\nPreviously a native `title` metadata tooltip (#969) and the custom name\nTruncationTooltip (#859) appeared separately, with different delays\n(~0.5-1s native vs 200ms custom) and styling.\n\n- TruncationTooltip: add opt\n[…]\nance criterion).\n- Sidebar usage is unaffected (the new prop is optional/additive).\n- Tests updated for the unified hover tooltip.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(files): unify file-tree tooltips into one (metadata + name) (#97…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-29T09:57:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "320335a0413cb2f383ac7294b400ed85d98174d5",
          "body": "…p (#971) (#974)\n\nEliminate the sidebar's horizontal scrollbar caused by long repository\nnames overflowing the group header. Make the group header a min-w-0 flex\ncontainer so the existing truncate takes effect, wrap the repository name\nin TruncationTooltip to show the full name on hover only when cl\n[…]\nden to the branch list as a\nsafeguard, and constrain the DnD sortable wrapper with w-full min-w-0 to\nprevent overflow during drag.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(sidebar): remove horizontal scrollbar via truncate + hover toolti…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-29T00:51:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b24041630d7336867912927e4720b0e8ae857b02",
          "body": "worktree 詳細画面の 4 つのドラッグ可能な仕切り(PaneResizer)が太く・濃く\n見える問題を解消する。共通コンポーネント 1 ファイルの修正で全境界に反映。\n\n- 線色を bg-gray-700 から bg-gray-200 dark:bg-gray-700 へ変更し、固定パネル\n  枠線と同色の控えめな 1px 線にする\n- ホバー時の線幅拡大(hover:w-2 / hover:h-2)を削除。常時 1px を維持し、\n  ホバー/フォーカス時のみアクセント色(cyan-500)を表示\n- darkMode: 'class' では base の dark:bg-gray-\n[…]\ncus:ring-offset-white dark:...gray-900)\n- ドラッグ中のみ線幅拡大 + accent をライブフィードバックとして維持\n\nPaneResizer の単体テストに VS Code 風細線の挙動を固定する 6 ケースを追加。\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ui): make PaneResizer dividers VS Code-style thin (#970) (#973)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-29T00:51:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a6604986e533aae0ab2d7bc76d119b939889bd26",
          "body": "…969) (#972)\n\nPreviously each file row always rendered size and a relative birthtime\ninline, crowding the file name. This makes the inline metadata columns\n(size / created / modified) individually toggleable and persisted, and\nadds a formatted, locale-aware hover tooltip so timestamps stay\naccessibl\n[…]\nrings (parity)\n- tests: mtime backend, hook persistence/sync, TreeNode conditional\n  render + tooltip, FileTreeView toolbar toggle\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(files): toggleable file-tree metadata columns + hover tooltip (#…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-29T00:51:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5cfb088940f56064651009de053dcab5cbdcce64",
          "body": null,
          "is_bot": false,
          "headline": "chore: merge release v0.7.4 to develop",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-25T15:09:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53eedd41e4b0696de5c5ba1fd9b8ad594ac9328d",
          "body": "release: v0.7.4",
          "is_bot": false,
          "headline": "release: v0.7.4 (#968)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-25T15:09:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "621681f948e99439ee7b3bf47b5fd4bd3e9ebbec",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: release v0.7.4",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-25T15:01:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ad18e577d75bae7cade2b448f3b89768bf8de446",
          "body": "4 perf quick-wins to reduce sidebar-click -> detail render latency:\n\n1. WorktreeSelectionContext: stale-while-revalidate. SELECT_WORKTREE seeds the\n   detail pane from the already-loaded list cache and only shows the loading\n   state on a cache miss; getById() overwrites with fresh detail in backgro\n[…]\n  instead of after it; session detection still chains off listSessions().\n4. tmux-capture-cache: extend CACHE_TTL_MS 3000 -> 5000.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(worktree): speed up sidebar click to detail view (#965) (#967)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-25T14:11:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "36e77825e9532b47d8bf454754948aa6b9be51ac",
          "body": "Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(worktree): hide mobile agent tab header scrollbar (#964) (#966)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-25T14:06:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6862709b40ac938882ee8b4f09c0c3b5d250b54e",
          "body": "…tool (#960) (#963)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(worktree): resolve mobile agent status per instance, not per CLI …",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-24T15:01:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6a8f104b20151376ff9260eebd82c4a0351e84f8",
          "body": "Auto-Yes stayed enabled for one extra polling tick after the countdown\nreached 00:00 because expiry used a strict `>` (now > expiresAt) while the\ndisplay clamps to 0 at now === expiresAt.\n\n- auto-yes-state: isAutoYesExpired now uses `>=` so the state expires at the\n  exact instant the countdown show\n[…]\ne and component tests for the zero-countdown UI behaviour;\n  correct the prior exact-expiry assertion that encoded the off-by-one.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(auto-yes): disable exactly when countdown reaches zero (#959) (#962)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-24T14:53:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "438efe399b4e5fcb3fce1bebbaaf0661715cbc11",
          "body": "…#958) (#961)\n\nMobile header now pins the Auto Yes toggle on the left and the search +\nEnd (kill session) buttons on the right, with the agent instance tabs in\na horizontally scrollable middle region. Previously the right cluster\nheld both the tabs and the End button without overflow handling, so 3+\n[…]\nr-thin\n- Each tab button gets flex-shrink-0 whitespace-nowrap\n- Search + End buttons split into a right-pinned flex-shrink-0 group\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(worktree): make mobile agent tab header horizontally scrollable (…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-24T14:49:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f9823c9655e0edfd70a47e3b741bb9dc95169530",
          "body": "…56) (#957)\n\nセッションクローズ確認ダイアログ(ヘッダーの「✕ End」)のタイトルが、\nインスタンスに付与したエイリアス(別名)ではなく CLI ツール名(Claude/Codex)\nを表示していた問題を修正。\n\n- 新規 getActiveInstanceLabel() を追加(cli-tools/types.ts)。activeInstanceId に\n  一致するインスタンスを getInstanceLabel でエイリアス優先解決し、見つからない/\n  stale 時は CLI 表示名へフォールバック。\n- WorktreeDetailRefactored.tsx の c\n[…]\nbel に差し替え。\n  タブ表示(getInstanceLabel 使用)との不整合を解消。\n- エイリアス未設定時はフォールバックにより従来挙動を維持(後方互換)。\n- ロケール文言は {tool} プレースホルダのみで変更不要。\n\nCloses #956\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(worktree): show instance alias in kill-session confirm dialog (#9…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-24T01:05:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ed028ff031e7c324544b7e5fdd76fc007fc02c71",
          "body": null,
          "is_bot": false,
          "headline": "chore: merge release v0.7.3 to develop",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-23T00:41:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efb7f9ca5b890f7210c1d8810800827c86497ea5",
          "body": "release: v0.7.3",
          "is_bot": false,
          "headline": "release: v0.7.3 (#955)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-23T00:41:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d439eae3b0280fd67aebef92d7053d84cc75920c",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.3",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-23T00:33:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4023bb1f576fd2c81b6f94ff2021ee13a8577a22",
          "body": "…rkspace/.playwright-mcp (#954)\n\n* fix(terminal-pane): clear residual PC terminal output after agent close + add ended placeholder (#843)\n\nIssue #842.\n\nA. Polling guard fix (root cause): useTerminalPanePolling cleared output only\n   when it had content or the session was running, so the \"empty + sto\n[…]\n残る bloat とパスリークは許容(将来厳密化が必要なら別途 filter-repo を検討)。\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: propagate repo cleanup (#953) to main — untrack dev-reports/wo…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-22T15:14:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "32d36e3aa046e23f08f582b68ff211a798d2519a",
          "body": "…-mcp & sanitize test fixtures (#953)\n\nリポジトリ肥大化(追跡 8,481 ファイル中 7,136=84% が dev-reports/ の AI エージェント\n自動生成ログ)と、ログに焼き込まれた絶対パス(contributor のローカルユーザー名)への対応。\n\n- git rm -r --cached で dev-reports / workspace / .playwright-mcp を追跡解除(計 7,169 件)。\n  ローカルの実ファイルは保持(machine output は手元には残す)。\n- .gitignore に /dev-rep\n[…]\nxample)。検証ロジック(パス折り返し判定)は不変。\n\n履歴の書き換えは行わない(force-push なし・既存クローン/fork に無影響)。\n過去履歴に残る bloat とパスリークは許容(将来厳密化が必要なら別途 filter-repo を検討)。\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(repo): untrack auto-generated dev-reports/workspace/.playwright…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-22T14:55:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8f4667f323dba7e846e0d4aaaa775a08af6c282b",
          "body": "…946 + Timer モーダル化 #945 + メモ並び替え #944 + Timer codex 送信修正 #947) (#952)\n\n* fix(terminal-pane): clear residual PC terminal output after agent close + add ended placeholder (#843)\n\nIssue #842.\n\nA. Polling guard fix (root cause): useTerminalPanePolling cleared output only\n   when it had content or the se\n[…]\nnstanceId 伝播・no_session 時非送信・失敗時 failed)を検証するよう更新\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: develop → main (Timer/Schedule インスタンス選択 #942 + サイドバーアイコン拡大 #…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-22T14:34:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3a1730ec9afdcb25950fb8cc59b0fda9666b346d",
          "body": "…irmation (#947) (#951)\n\nTimer 発火処理が tmux に直接 sendKeys(text+Enter 一括) を投入していたため、\ncodex の TUI がテキスト確定前に Enter を受け取り、メッセージが入力欄に\n残ったまま送信されない不具合があった。\n\n恒久対策として executeTimer の送信を cliTool.sendMessage(worktreeId,\nmessage, instanceId) に委譲。手動送信と完全に同じコードパス(CLIツール\nごとのテキスト/Enter 分離・待機)を通るため、claude/codex/gemini す\n[…]\nsionName 解決を除去\n- tests/unit/lib/timer-manager.test.ts: 送信委譲(sendMessage 呼び出し・\n  instanceId 伝播・no_session 時非送信・失敗時 failed)を検証するよう更新\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(timer): delegate Timer send to cliTool.sendMessage for Enter conf…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-22T02:18:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "81f2cebc4ecbc301902ef3474f1e9c2fab081dbe",
          "body": "- PATCH /api/worktrees/[id]/memos: validate + reorder memo positions\n- new src/lib/memo-reorder-validator.ts: pure validation (count/dup/foreign-id)\n- memoApi.reorder() client method\n- MemoCard ↑↓ move buttons (disabled at ends, backward-compat props)\n- MemoPane handleMove with optimistic update + rollback, disabled during search\n- i18n memoMoveUp/memoMoveDown (en/ja)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memo): add ↑↓ reorder buttons to Activity Bar Notes (#944) (#950)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-22T01:49:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2c2671d828ad404aeb8d04192f881d3fec9ef763",
          "body": "…alog (#945) (#949)\n\nReplace the always-visible inline Timer form with a \"+ Create Timer\" empty-state\nCTA / \"+ New Timer\" button that opens a modal dialog (PC=Modal, mobile=FullScreenModal),\nmirroring the Schedule UX. Extract formatDelayLabel into timers/timer-format.ts shared\nby pane and dialog. Li\n[…]\nistory/load-more are preserved and\npublic props are unchanged so callers (WorktreeDetailDesktop / NotesAndLogsPane) need no edits.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(timer): switch Timer input to \"+ Create Timer\" button + modal di…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-22T01:42:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f6bc868c2e4b24a6dec53362b4cf18c4ed039cb4",
          "body": "…ity (#946) (#948)\n\nIntroduce a shared HEADER_ICON_CLASS ('w-4 h-4') for the five sidebar\nheader action icons (view-mode toggle, sort, sort-direction, sync,\nRepositories link), bumping them from 12px to 16px. SortSelectorBase\ngains an optional iconClassName prop (defaults to 'w-3 h-3') so other\nconsumers such as the Sessions page keep the original size.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(sidebar): enlarge top-row header action icons for better visibil…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-22T01:35:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9488a58ef61151dea15711981086b61dccacd09a",
          "body": "…ances\n\nfeat(timer): select registered agent instances in Timer and Schedule (#942)",
          "is_bot": false,
          "headline": "Merge pull request #943 from Kewton/fix/942-timer-schedule-agent-inst…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-22T00:13:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b681482a5282bb55e977a74eecb486745bb9973",
          "body": "…(#942)\n\nTimer (#534) and Schedule (#824-827) predate the AgentInstance system\n(#869), so their agent selectors were bound to the static CLI_TOOL_IDS list\nand could not target instances registered in the Agents panel.\n\nTimer — full instance support:\n- v35 migration adds a nullable timer_messages.ins\n[…]\nthreaded through WorktreeDetailDesktop (desktop) and\nNotesAndLogsPane (mobile) into TimerPane/ExecutionLogPane/ScheduleEditDialog.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(timer): select registered agent instances in Timer and Schedule …",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-21T16:23:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "58194c82933bad4ccca92397d52a7fc46f3e1a1b",
          "body": null,
          "is_bot": false,
          "headline": "chore: merge release v0.7.2 to develop",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-21T14:47:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac499383feccdc5b264dd87ecf76833233e65713",
          "body": "release: v0.7.2",
          "is_bot": false,
          "headline": "release: v0.7.2 (#941)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-21T14:46:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4caf5c6c9e125df9314648fee48239b31c88555d",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.2",
          "author_name": "kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-21T14:39:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce2d9b5b9259666a42b4e362eb11e80d7a741042",
          "body": "…3 + ドキュメント整備 #924-929) (#940)\n\n* fix(terminal-pane): clear residual PC terminal output after agent close + add ended placeholder (#843)\n\nIssue #842.\n\nA. Polling guard fix (root cause): useTerminalPanePolling cleared output only\n   when it had content or the session was running, so the \"empty + stop\n[…]\nt tests for the new hooks and the context/layout.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: develop → main (PC表示サイズ #915/#919 + god-module リファクタ #920-92…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-21T08:16:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "82643596c39901860bcd8ab1bdb7e55e0438d505",
          "body": "…ls + layout (#922) (#939)\n\nSplit the ~3.1k-line src/components/worktree/GitPane.tsx into a thin\ncoordinator that wires focused custom hooks (logic) to memo'd panel\ncomponents (presentation) via a shared layout — a behavior-preserving\nrefactor with the 112 existing GitPane tests as the safety net.\n\n\n[…]\nrnal props, data-testids, and runtime behavior are unchanged.\n- Added focused unit tests for the new hooks and the context/layout.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(worktree): decompose GitPane god-component into hooks + pane…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T17:10:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "118d7d8c75af556ffdffbeafa669b67a08e2c962",
          "body": "…#928) (#938)\n\nIssue #928: コード構造ドキュメントが現行 src/ 構成から乖離していた問題を解消。\n\n- CLAUDE.md ディレクトリツリーに欠落していた主要ディレクトリを追記:\n  app/{chat,login,proxy,worktrees}、cli/docs、components/{auth,error,\n  external-apps,repository,ui}、lib/{assistant,browser-compat,external-apps,\n  proxy}+lib/ws-server.ts/logger.ts(brief overview\n[…]\nib/assistant 非インタラクティブ実行群、lib/external-apps、lib/proxy、\n  app/{chat,login,proxy} ルート。\n- CLAUDE.md は 16,632 bytes で 35,000 byte 上限内。\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: sync CLAUDE.md tree and module-reference.md with current src/ (…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T16:41:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3295209bc291f68156fbcd67a3bc46c4d398ea88",
          "body": "…921) (#937)\n\nDecompose the 2327-line src/lib/git/git-utils.ts (37 exports) into\nsingle-concern modules, keeping git-utils.ts as a backward-compatible\nre-export barrel so all callers via the barrel are unchanged.\n\nNew modules (no circular dependencies):\n- git-errors.ts     typed error classes + hand\n[…]\nriginal cases are preserved verbatim across 11 per-module files.\n\nGates: lint / tsc --noEmit / test:unit (7900) / build all green.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(git): split git-utils god-module into per-concern modules (#…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T16:32:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "138f38ea2330214957f410e9b3b684513b087b66",
          "body": "… Phase 1) (#936)\n\n低リスク・無結合の3関心事を useWorktreeDetailController から独立サブフックへ抽出\n(純構造リファクタ・振る舞い不変):\n\n- useHistoryFilters: historySubTab / showArchived / historyUserOnly /\n  historyDisplayLimit + localStorage 同期\n- useDiffViewerState: diffContent / diffFilePath + open/close(mobile は no-op)\n- useVisibilityRe\n[…]\nisplayLimitRef)は\npolling 関心(Phase 2/3 で対応)として controller に残置。本体は 1671→1514 行に縮小。\n各サブフックに focused unit test を追加(18 ケース)。\n\nRefs #923\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(worktree): useWorktreeDetailController god-hook をサブフックへ分解(P2…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T16:26:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d9785e04adfe6a37b47484821c84f12cfc8f1fca",
          "body": "…#920) (#935)\n\nWorktreeDetailHeader.tsx had no render path — the real PC worktree\ndetail top bar is DesktopHeader in WorktreeDetailSubComponents.tsx.\nOnly its own unit test referenced it (test-backed dead code).\n\n- Delete src/components/worktree/WorktreeDetailHeader.tsx\n- Delete tests/unit/component\n[…]\neader.test.tsx\n\nVerified zero remaining references repo-wide (barrel index.ts never\nexported it). No behavior change.\n\nCloses #920\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(worktree): remove dead-code WorktreeDetailHeader component (…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T16:23:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c9b8f3b5b0762d958e2545f4bafb440feea4ef94",
          "body": "…927) (#934)\n\n- report コマンド(generate/show/list)を cli-operations-guide.md(日英)に追記\n- start の不足フラグ(--issue/--auto-port/--auth/--auth-expire/--https/--cert/--key/--allow-http/--allowed-ips/--trust-proxy)を cli-setup-guide.md(日英)に追記\n- stop の --issue、status の --issue/--all を追記\n- CLAUDE.md の CLIコマンド節に report を追加(詳細はガイドへ集約、35KB制限内)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add report command and start/stop/status flags to CLI guides (#…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T16:19:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "52a314c3266d58a47ecffde2c8a6a11145fcdc30",
          "body": "…ty (#929) (#933)\n\nCreate docs/en/ counterparts for the 6 documents that previously had no\nEnglish version, closing the multilingual structure-parity gap (#929):\n\n- security-guide.md / security-identifiers.md (already English; add header)\n- user-guide/wsl2-setup.md (translate remaining JP comments/p\n[…]\n.\n\nAlso add reciprocal [English] / [日本語版] language-switch links to every\nJA↔EN pair, matching the existing translation convention.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(i18n): add English translations to achieve docs/ ↔ docs/en/ pari…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T16:19:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d622853934ea0677a14a43e5e2563f9e868431ec",
          "body": "… (#932)\n\nimplementation-history.md(JA/EN)の破損した design-policy リンクを修正。\n\n- #469: リンク先を実在ファイル issue-469-file-auto-update-design-policy.md に修正\n- #588 / #379 / #294 / #138: dev-reports/design/ に対応設計書が存在しないためリンク解除(`-` 化)\n- JA/EN 両ファイルで相対リンクが全て解決することを確認(破損リンク 0 件)\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: fix broken design-policy links in implementation-history (#926)…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T16:19:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9c566427d472d9062f87db50cc3b3abcb95d9d56",
          "body": "docs/architecture.md の環境変数表記を旧プレフィックス MCBD_ から\n実コード(src/lib/env.ts)の正である CM_* に統一。\n\n- CM_BIND / CM_PORT / CM_ROOT_DIR / CM_DB_PATH / CM_LOG_LEVEL へ統一\n- レガシー MCBD_* fallback の注記を Configuration 節に追加\n  (ENV_MAPPING / getEnvWithFallback による後方互換を明示)\n- src/lib/env.ts の変数名と最終突合済み\n\nCloses #925\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(architecture): 環境変数表記を MCBD_ から CM_ に統一 (#925) (#931)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T16:19:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c5144e71ef57b0f7ba540ed0ec7d22536ad10618",
          "body": "… (#930)\n\n.claude/commands/ 配下のスラッシュコマンド定義に残存していた旧リポジトリ名\nKewton/MyCodeBranchDesk(gh --repo 引数)を正しい Kewton/CommandMate に一括置換。\nGitHub のリネームリダイレクト依存を解消し、コマンド実行の信頼性・可読性を改善。\n\n対象 5 ファイル / 計22箇所:\n- .claude/commands/pr-merge-pipeline.md (8)\n- .claude/commands/uat-fix-loop.md (5)\n- .claude/commands/orchestra\n[…]\n.md (4)\n- .claude/commands/cause-analysis.md (3)\n- .claude/commands/current-situation.md (2)\n\n移行ガイド等の意図的な MyCodeBranchDesk 参照は対象外。\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: 旧リポジトリ名 Kewton/MyCodeBranchDesk を Kewton/CommandMate に修正 (#924)…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T16:19:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d46d65b356670d5887871754c1da8925e5da1356",
          "body": "… localize labels (#919)\n\nIssue #915 added the PC display-size selector to the global Header, but two\nfollow-up problems remained:\n\n- #917: /worktrees/[id] suppresses the global Header (useLayoutConfig\n  showGlobalNav:false), so the selector was unreachable on the worktree detail\n  page. Surface it \n[…]\nsktopHeader renders the selector and that option\nlabels come from the i18n dictionary (not raw Japanese).\n\nCloses #917\nCloses #918\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(display): show PC display-size selector on worktree detail page +…",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T15:20:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ec264659eef59ac086f8113dab477d4e62fd2d58",
          "body": "案A(rem カスケード)で PC 専用の表示サイズ切替を実装。\n\n- usePcDisplaySize: localStorage(mcbd-pc-display-size, 既定=medium, 検証付き)で\n  サイズを永続化。サイズ係数表・ターミナルfontSize・rootフォントサイズをメタ定義。\n- PcDisplaySizeContext/Provider: 単一の真実源。PC(!isMobile)時のみ\n  <html data-pc-size> を付与して rem カスケードを適用。モバイル/アンマウント時は除去。\n- globals.css: html[data-pc-s\n[…]\n。変更時は term.options.fontSize 更新+fit()で\n  再フィット(再接続なし)。terminal ページが選択サイズに応じた値を配線。\n\nモバイル(<768px)では非適用(従来通り)。ユニット/型/lint/build 全Pass。\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(display): PC版に表示サイズ切替(大/中/小/極小)を追加(既定=中・remカスケード)(#915) (#916)",
          "author_name": "Kewton",
          "author_login": "Kewton",
          "committed_at": "2026-06-20T14:51:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 88,
      "commits_last_year": 1751,
      "latest_release_at": "2026-07-20T00:38:18Z",
      "latest_release_tag": "v0.11.4",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 32,
      "days_since_latest_release": 2,
      "mean_days_between_releases": 0.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 100,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "commandmate",
          "exists": true,
          "license": null,
          "keywords": [
            "claude-code",
            "codex-cli",
            "gemini-cli",
            "agent-cli",
            "cli-orchestration",
            "ai-coding",
            "git-worktree",
            "coding-agent",
            "session-manager",
            "tmux",
            "cli",
            "developer-tools"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/commandmate",
          "is_deprecated": false,
          "latest_version": "0.11.4",
          "repository_url": "https://github.com/Kewton/CommandMate",
          "versions_count": 84,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3909,
          "first_published_at": "2026-01-31T15:11:13.139000Z",
          "latest_published_at": "2026-07-20T00:49:25.025000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 2
        }
      ]
    },
    "popularity": {
      "forks": 4,
      "stars": 38,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-02-19",
            "count": 1
          },
          {
            "date": "2026-02-21",
            "count": 1
          },
          {
            "date": "2026-03-11",
            "count": 1
          },
          {
            "date": "2026-05-06",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 4,
        "total_forks": 4
      },
      "star_history": {
        "days": [
          {
            "date": "2026-02-19",
            "count": 1
          },
          {
            "date": "2026-02-21",
            "count": 1
          },
          {
            "date": "2026-02-22",
            "count": 1
          },
          {
            "date": "2026-03-02",
            "count": 1
          },
          {
            "date": "2026-03-07",
            "count": 1
          },
          {
            "date": "2026-03-11",
            "count": 3
          },
          {
            "date": "2026-03-12",
            "count": 1
          },
          {
            "date": "2026-03-13",
            "count": 2
          },
          {
            "date": "2026-03-14",
            "count": 1
          },
          {
            "date": "2026-03-16",
            "count": 1
          },
          {
            "date": "2026-03-17",
            "count": 1
          },
          {
            "date": "2026-03-18",
            "count": 3
          },
          {
            "date": "2026-03-19",
            "count": 2
          },
          {
            "date": "2026-03-21",
            "count": 1
          },
          {
            "date": "2026-03-22",
            "count": 1
          },
          {
            "date": "2026-03-23",
            "count": 1
          },
          {
            "date": "2026-03-25",
            "count": 2
          },
          {
            "date": "2026-03-30",
            "count": 1
          },
          {
            "date": "2026-03-31",
            "count": 1
          },
          {
            "date": "2026-04-04",
            "count": 2
          },
          {
            "date": "2026-04-12",
            "count": 1
          },
          {
            "date": "2026-04-16",
            "count": 1
          },
          {
            "date": "2026-04-29",
            "count": 1
          },
          {
            "date": "2026-05-02",
            "count": 1
          },
          {
            "date": "2026-05-05",
            "count": 1
          },
          {
            "date": "2026-05-06",
            "count": 1
          },
          {
            "date": "2026-05-13",
            "count": 1
          },
          {
            "date": "2026-05-19",
            "count": 1
          },
          {
            "date": "2026-05-21",
            "count": 1
          },
          {
            "date": "2026-05-25",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 38,
        "total_stars": 38
      },
      "open_issues_and_prs": 24
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 127698,
      "source_files_sampled": 1422,
      "oversized_source_files": 6,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 17804
    },
    "dependencies": {
      "manifests": [
        "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": "@dnd-kit/core",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.3.1"
        },
        {
          "name": "@dnd-kit/sortable",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.0.0"
        },
        {
          "name": "@dnd-kit/utilities",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.2.2"
        },
        {
          "name": "@marp-team/marp-core",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.3.0"
        },
        {
          "name": "@radix-ui/react-checkbox",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.3.7"
        },
        {
          "name": "@radix-ui/react-dropdown-menu",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.20"
        },
        {
          "name": "@radix-ui/react-radio-group",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.4.3"
        },
        {
          "name": "@radix-ui/react-select",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.3.3"
        },
        {
          "name": "@radix-ui/react-switch",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.3.3"
        },
        {
          "name": "@radix-ui/react-tabs",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.17"
        },
        {
          "name": "@radix-ui/react-tooltip",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.2.12"
        },
        {
          "name": "@tanstack/react-virtual",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.13.26"
        },
        {
          "name": "ansi-to-html",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.7.2"
        },
        {
          "name": "better-sqlite3",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^12.4.1"
        },
        {
          "name": "class-variance-authority",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.7.1"
        },
        {
          "name": "clsx",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.1"
        },
        {
          "name": "cmdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.1"
        },
        {
          "name": "commander",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^14.0.2"
        },
        {
          "name": "croner",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.0.1"
        },
        {
          "name": "date-fns",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.0"
        },
        {
          "name": "dotenv",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^17.2.3"
        },
        {
          "name": "geist",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.7.2"
        },
        {
          "name": "github-slugger",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.0"
        },
        {
          "name": "gray-matter",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.3"
        },
        {
          "name": "http-proxy",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.18.1"
        },
        {
          "name": "isomorphic-dompurify",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.35.0"
        },
        {
          "name": "jsdom",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^28.1.0"
        },
        {
          "name": "lucide-react",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.554.0"
        },
        {
          "name": "mermaid",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.12.2"
        },
        {
          "name": "next",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^15.5.20"
        },
        {
          "name": "next-intl",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.8.2"
        },
        {
          "name": "next-themes",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.4.6"
        },
        {
          "name": "postcss",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.5.6"
        },
        {
          "name": "react",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.7"
        },
        {
          "name": "react-dom",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.7"
        },
        {
          "name": "react-markdown",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.1.0"
        },
        {
          "name": "react-qr-code",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.18"
        },
        {
          "name": "rehype-highlight",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.2"
        },
        {
          "name": "rehype-raw",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.0"
        },
        {
          "name": "rehype-sanitize",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.0"
        },
        {
          "name": "rehype-slug",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.0"
        },
        {
          "name": "remark-gfm",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.1"
        },
        {
          "name": "safe-regex2",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.0.0"
        },
        {
          "name": "tailwind-merge",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.6.0"
        },
        {
          "name": "uuid",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^13.0.0"
        },
        {
          "name": "web-push",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.6.7"
        },
        {
          "name": "ws",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.18.3"
        },
        {
          "name": "xterm",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.3.0"
        },
        {
          "name": "xterm-addon-fit",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.8.0"
        },
        {
          "name": "xterm-addon-web-links",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.9.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 799,
        "open_issues": 24,
        "closed_ratio": 0.963,
        "closed_issues": 617,
        "closed_unmerged_prs": 20
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "Kewton",
          "commits": 1751,
          "avatar_url": "https://avatars.githubusercontent.com/u/11370858?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci-pr.yml",
        "pages.yml",
        "publish.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".eslintrc.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": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "23 out of 23 merged PRs checked by a CI test -- score normalized to 10",
            "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/23 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": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 2,
            "reason": "dependency not pinned by hash detected -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 9,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "57 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "ad1579473c98b0b9268c0be2f68b10726f9fa1ec",
        "ran_at": "2026-07-22T04:41:31Z",
        "aggregate_score": 4.5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-20T00:49:29Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-22T00:44:07Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 1227,
          "created_at": "2026-07-15T16:08:36Z",
          "last_comment_at": "2026-07-21T02:11:13Z",
          "last_comment_author": "Kewton"
        },
        {
          "number": 1242,
          "created_at": "2026-07-15T16:11:31Z",
          "last_comment_at": "2026-07-20T15:28:11Z",
          "last_comment_author": "Kewton"
        },
        {
          "number": 1243,
          "created_at": "2026-07-15T16:11:52Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1244,
          "created_at": "2026-07-15T16:12:02Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1245,
          "created_at": "2026-07-15T16:12:12Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1246,
          "created_at": "2026-07-15T16:12:22Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1247,
          "created_at": "2026-07-15T16:12:27Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1248,
          "created_at": "2026-07-15T16:12:37Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1249,
          "created_at": "2026-07-15T16:12:47Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1250,
          "created_at": "2026-07-15T16:13:03Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1251,
          "created_at": "2026-07-15T16:13:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1252,
          "created_at": "2026-07-15T16:13:15Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1253,
          "created_at": "2026-07-15T16:13:23Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1254,
          "created_at": "2026-07-15T16:13:31Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1255,
          "created_at": "2026-07-15T16:13:38Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1256,
          "created_at": "2026-07-15T16:13:43Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1257,
          "created_at": "2026-07-15T16:13:49Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1258,
          "created_at": "2026-07-15T16:14:03Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1259,
          "created_at": "2026-07-15T16:14:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1260,
          "created_at": "2026-07-15T16:14:14Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/Kewton/CommandMate",
    "host": "github.com",
    "name": "CommandMate",
    "owner": "Kewton"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 69,
      "inputs": {
        "security": 45,
        "vitality": 92,
        "community": 59,
        "governance": 55,
        "engineering": 90
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 92,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 86,
            "inputs": {
              "commits_last_year": 1751,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 32
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "32/52 weeks with commits",
                "points": 22.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 32
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1751 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1751
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 88,
              "latest_release_tag": "v0.11.4",
              "releases_from_tags": false,
              "days_since_latest_release": 2,
              "mean_days_between_releases": 0.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "88 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 88
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 2 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 2,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 2 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 59,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 29,
            "inputs": {
              "forks": 4,
              "stars": 38,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "38 stars",
                "points": 25.4,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 38
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "4 forks",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": true
            },
            "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": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "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": 6.3,
                "status": "met",
                "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": 60,
            "inputs": {
              "packages": [
                "commandmate"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 3909
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,909 downloads/month across npm",
                "points": 47.9,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3909,
                      "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": 55,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "merged_prs": 799,
              "open_issues": 24,
              "closed_issues": 617,
              "issue_closed_ratio": 0.963,
              "closed_unmerged_prs": 20
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "96% of issues closed",
                "points": 45,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 96
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "799/819 decided PRs merged",
                "points": 37.3,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 799,
                      "decided": 819
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/23 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 47,
            "inputs": {
              "followers": 2,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "Kewton",
              "public_repos": 43,
              "account_age_days": 4154
            },
            "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": "2 followers of Kewton",
                "points": 3.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 2,
                      "login": "Kewton"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "43 public repos, account ~11 yr old",
                "points": 24,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 43
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "commandmate"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 2
            },
            "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 2 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "84 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 84
                    }
                  }
                ],
                "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": "excellent",
        "name": "Engineering Quality",
        "value": 90,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": ".eslintrc.json",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".eslintrc.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": "23 out of 23 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "claude-code",
                "developer-tools",
                "git-worktree",
                "terminal",
                "tmux",
                "commandmate",
                "ai-coding",
                "codex-cli",
                "mobile-development",
                "session-manager",
                "autonomous-coding",
                "claude-mobile",
                "vibe-coding",
                "web-ui"
              ],
              "has_wiki": true,
              "homepage": "https://www.npmjs.com/package/commandmate",
              "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": "https://www.npmjs.com/package/commandmate",
                "points": 15,
                "status": "met",
                "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": "14 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 45,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 45,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.5
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "23 out of 23 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/23 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 dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 4.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "57 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "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": 73,
        "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": 0.99,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 17804
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "99 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 66,
            "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": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0.7,
              "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": ".eslintrc.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".eslintrc.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "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": "70 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 70,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 127698,
              "source_files_sampled": 1422,
              "oversized_source_files": 6
            },
            "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": "6/1422 source files over 60KB",
                "points": 54.8,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 1422,
                      "oversized": 6
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:commandmate@0.11.4; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T04:41:52.672692Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/k/Kewton/CommandMate.svg",
  "full_name": "Kewton/CommandMate",
  "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.