Registro público
Informe de salud del softwareesquema 0.30.0 · métricas 2.3.1 · 2026-08-03 13:44 UTC

jongio / grut

A terminal file explorer with full Git and GitHub integration, AI chat, and reactive panels that stay in sync as you navigate.

GoMIT★ 41 estrellas⑂ 2 forksdesde mar 2026Ver en GitHub ↗
TipoHerramienta de línea de comandosBibliotecaInterfaz de terminalcómo se determina

jongio/grut tiene un índice de salud de 88 sobre 100, lo que lo sitúa en la banda Excelente. Su puntuación más alta es Engineering Quality (94/100) y la más baja, Community & Adoption (57/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

88
global / 100
Excelente

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala estandarizada de 1 a 100. El resultado global parte de su media ponderada, calibrada contra la distribución del registro público para que las bandas tengan significado percentil; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe un límite «En riesgo» de 34.

88
Excepcional93-100El nivel más alto del registro (≈ el 5% superior); cumple prácticamente todos los criterios evaluados
Excelente80-92Sólido en todos los frentes; carencias menores
Bueno65-79Saludable; carencias limitadas y manejables
Moderado50-64Aceptable con carencias notables; se recomienda revisión
Débil35-49Debilidades sustanciales en varias áreas
En riesgo20-34Debilidades significativas; su adopción exige cautela
Crítico1-19Problemas 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.

El resultado global ponderado 74 se calibra a 88 en la escala publicada del índice (calibración del registro 2026-08-02).

Titularidad

Jon GallantCuenta personal
376 seguidores56 repositorios públicosdesde ago 2012Microsoft

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/jongio/grutv0.7.1-23hace 9 días
npmwebapunta a otro repositorio; no se puntúa0.0.254.4283hace 4931 días

Métricas por categoría

Vitalidad

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

85Excelente · 21% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
12.5/36Cadencia de commits — 18/52 semanas con commits
18/18Volumen de commits — 438 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_year438
human_commit_share0,8
days_since_last_push0
active_weeks_last_year18
Cómo se puntúa
27/27Publica versiones — 18 versiones publicadas
36/36Recencia de las versiones — última versión hace 9 días
27/27Cadencia de publicación — una versión cada ~7,4 días
8/10OpenSSF Scorecard: Signed-Releases — 5 out of the last 5 releases have a total of 5 signed artifacts.
Datos de entrada utilizados
releases_count18
latest_release_tagv0.7.1
releases_from_tagsno
days_since_latest_release9
mean_days_between_releases7,4

Comunidad y Adopción

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

57Moderado · 17% del índice global
Cómo se puntúa
26/60Estrellas — 41 estrellas
0/25Forks — 2 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks2
stars41
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
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
readme_badges6
has_contributing
has_issue_templateno
has_code_of_conduct
readme_badge_servicesgithub.com, goreportcard.com, pkg.go.dev, shields.io
has_pull_request_template

Sostenibilidad y Gobernanza

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

63Moderado · 23% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 3 contributing companies or organizations -- score normalized to 10
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
41.3/42Resolución de issues — 98% de issues cerradas
28/30Aceptación de PR — 150/161 PR decididos fusionados
0/13Newcomer PR acceptance — ningún PR de un contribuyente primerizo decidido en 30 d
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs150
open_issues4
closed_issues228
prs_merged_7d14
prs_decided_7d14
prs_merged_30d58
prs_decided_30d58
issue_closed_ratio0,983
closed_unmerged_prs11
first_time_authors_30d0
first_time_prs_merged_30d0
first_time_prs_decided_30d0
Excluidos de la puntuación (sin datos o no aplicable): newcomer_pr_acceptance. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
18.5/25Alcance del propietario — 376 seguidores de jongio
24.8/25Trayectoria — 56 repos públicos, cuenta de ~13 años
Datos de entrada utilizados
followers376
owner_typeUser
is_verified
owner_loginjongio
public_repos56
account_age_days5100
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 go
35/35Recencia de publicación — última publicación hace 9 días
20/20Historial de versiones — 23 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/jongio/grut
ecosystemsgo
any_deprecatedno
min_days_since_publish9

Calidad de Ingeniería

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

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

Documentación

100Excepcional
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://jongio.github.io/grut/
10/10Descripción del repositorio
10/10Topics — 12 topics
10/10Wiki
Datos de entrada utilizados
topicsgit, terminal, cli, copilot, developer-tools, file-explorer, git-client, github, terminal-ui, tui, dprun, dx-idea
has_wiki
homepagehttps://jongio.github.io/grut/
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?

65Bueno · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 16 out of 16 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/30 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 3 contributing companies or organizations -- score normalized to 10
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — 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
4.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 9
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
5/5Security-Policy — security policy file detected
6/7.5Signed-Releases — 5 out of the last 5 releases have a total of 5 signed artifacts.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate6,5

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Tiene un peso deliberadamente pequeño (4%): las herramientas para agentes son una señal real de mantenimiento, pero un repositorio sin ninguna puede alcanzar igualmente 100/100.

93Excepcional · 4% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — .github/copilot-instructions.md, AGENTS.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 80 de 80 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_files.github/copilot-instructions.md, AGENTS.md
agent_instruction_max_bytes3607
Cómo se puntúa
18/18Arranque con un solo comando — internal/extension/templates/wasm-go/Makefile
22/22Pruebas automatizadas
11/11Configuración de lint / formato — .golangci.yml
11/11Verificación estática de tipos — web/tsconfig.json
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 75 de los últimos 100 commits con autoría o crédito de agente
5/8Mantenimiento automatizado — automatización de dependencias configurada, no observada en los commits muestreados
9/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 9
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum, package-lock.json
has_dockerfileno
typed_language
bootstrap_filesinternal/extension/templates/wasm-go/Makefile
has_devcontainerno
has_linter_config
typecheck_configsweb/tsconfig.json
agent_commit_share0,75
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
54.3/55Tamaños de archivo manejables — 8/618 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes191.210
source_files_sampled618
oversized_source_files8

Datos clave

41estrellas de GitHub
1contribuidores
438commits en los últimos 12 meses
0días desde el último push
18versiones publicadas
1factor bus
4issues abiertas
Go, npmecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • npm package 'web' points at a different repository (https://github.com/creationix/node-web); excluded from ecosystem scoring
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

Historial de estrellas y forks 0 ★ / 2 ⇿
0Estrellas
2Forks

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.

111222212026-052026-052026-05
OpenSSF Scorecard 6.5 / 10
6.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-08-03 13:43 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests16 out of 16 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/30 approved changesets -- score normalized to 0
10Contributorsproject has 3 contributing companies or organizations -- score normalized to 10
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate 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
9Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 9
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
8Signed-Releases5 out of the last 5 releases have a total of 5 signed artifacts.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 24
RegistroPaqueteRestricción de versiónManifiesto
Gocharm.land/bubbles/v2v2.1.1go.mod
Gocharm.land/bubbletea/v2v2.0.8go.mod
Gocharm.land/glamour/v2v2.0.1go.mod
Gocharm.land/lipgloss/v2v2.0.5go.mod
Gogithub.com/adrg/xdgv0.5.3go.mod
Gogithub.com/alecthomas/chroma/v2v2.27.0go.mod
Gogithub.com/anthropics/anthropic-sdk-gov1.61.0go.mod
Gogithub.com/charmbracelet/x/ansiv0.11.7go.mod
Gogithub.com/fsnotify/fsnotifyv1.10.1go.mod
Gogithub.com/gabriel-vasile/mimetypev1.4.15go.mod
Gogithub.com/github/copilot-sdk/gov1.0.8go.mod
Gogithub.com/google/go-github/v89v89.0.0go.mod
Gogithub.com/mark3labs/mcp-gov0.57.0go.mod
Gogithub.com/mattn/go-runewidthv0.0.27go.mod
Gogithub.com/pelletier/go-toml/v2v2.4.3go.mod
Gogithub.com/sabhiram/go-gitignorev0.0.0-20210923224102-525f6e181f06go.mod
Gogithub.com/sahilm/fuzzyv0.1.3go.mod
Gogithub.com/spf13/cobrav1.10.2go.mod
Gogithub.com/stretchr/testifyv1.11.1go.mod
Gogithub.com/tetratelabs/wazerov1.12.0go.mod
Gogithub.com/yuin/gopher-luav1.1.2go.mod
Gogolang.org/x/sysv0.47.0go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
npmastro^7.1.6web/package.json
Todas las dependencias no recopilado

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "git",
        "terminal",
        "cli",
        "copilot",
        "developer-tools",
        "file-explorer",
        "git-client",
        "github",
        "terminal-ui",
        "tui",
        "dprun",
        "dx-idea"
      ],
      "is_fork": false,
      "size_kb": 29359,
      "has_wiki": true,
      "homepage": "https://jongio.github.io/grut/",
      "languages": {
        "Go": 5929192,
        "CSS": 5436,
        "Lua": 159,
        "Astro": 205618,
        "Shell": 17055,
        "Python": 7768,
        "Makefile": 111,
        "JavaScript": 9153,
        "PowerShell": 14958,
        "Go Template": 258
      },
      "pushed_at": "2026-08-03T07:10:11Z",
      "created_at": "2026-03-10T04:26:50Z",
      "owner_type": "User",
      "updated_at": "2026-08-03T07:11:11Z",
      "description": "A terminal file explorer with full Git and GitHub integration, AI chat, and reactive panels that stay in sync as you navigate.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "http://jongallant.com",
      "name": "Jon Gallant",
      "type": "User",
      "login": "jongio",
      "company": "Microsoft",
      "location": "Seattle, WA",
      "followers": 376,
      "avatar_url": "https://avatars.githubusercontent.com/u/2163001?v=4",
      "created_at": "2012-08-16T12:38:10Z",
      "is_verified": null,
      "public_repos": 56,
      "account_age_days": 5100
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-07-25T05:11:02Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-07-24T18:44:27Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-07-21T22:01:07Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-07-07T19:37:19Z"
        },
        {
          "tag": "v0.4.4",
          "kind": "patch",
          "published_at": "2026-06-26T06:39:15Z"
        },
        {
          "tag": "v0.4.3",
          "kind": "patch",
          "published_at": "2026-06-08T03:26:22Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2026-06-03T20:53:36Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-06-02T18:25:57Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-05-27T04:25:27Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2026-05-19T17:20:15Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2026-05-19T12:55:46Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-05-19T03:10:20Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-05-18T13:57:59Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-05-15T22:14:17Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-05-14T16:43:48Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-05-11T13:48:37Z"
        },
        {
          "tag": "v0.0.4",
          "kind": "patch",
          "published_at": "2026-03-23T23:50:09Z"
        },
        {
          "tag": "v0.0.1",
          "kind": "patch",
          "published_at": "2026-03-19T20:37:10Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "4913b085accc7827e3d445c53949f3bee3666f8e",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-08-03T07:10:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d86227c76fc80fcb67bafadce7e8ea39573949c8",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-08-03T05:01:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c6fb0cf9406fa143f5237fd4e1c029999c1d7a7",
          "body": "Closes #387\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(clean): add --check flag to fail when cleanup is pending (#395)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-08-03T04:50:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cd131d0285307003fecf5016b56b477b76f292c2",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-08-02T17:42:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4942478ca07568db74edc497e598b9ad616d5d59",
          "body": "Closes #381\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(doctor): add --check flag for quiet health gate (#394)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-08-02T17:31:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b115391ab3566308145d218d830386e80c72988f",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-08-02T15:56:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bcffaf96eaa03ecc9559fd79f393b43e25db70b1",
          "body": "Closes #389\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(theme): add --filter flag to theme list (#393)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-08-02T15:45:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b966f636b8fbf125d1e9c99b2b057086fa67727e",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-08-01T19:21:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb8345f751ea93f67c8bcbd9b0cd856f3c3c636a",
          "body": "Go:\n- github.com/buger/jsonparser: v1.2.0 -> v1.6.1\n- github.com/yuin/goldmark: v1.8.4 -> v1.8.5\n- github.com/charmbracelet/ultraviolet: 20260720091822 -> 20260730003005\n- github.com/charmbracelet/x/exp/golden: 20260720091843 -> 20260730164118\n- github.com/charmbracelet/x/exp/slice: 20260720091843 -\n[…]\nort zero\nvulnerabilities. astro check and astro build pass for the web site.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 322b4a6b-6ff1-4af4-a0e5-ee8f09b78c2c",
          "is_bot": false,
          "headline": "deps: update dependencies to latest (#392)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-08-01T19:10:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "16240036dd0492a89dc07a14e5e3290a67c62a5b",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-31T14:45:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ef070e0ead909646844145966e7f440ae923c03",
          "body": "* Allow report show to use short IDs\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: e02217cd-ffed-496e-b8ea-848a781cda64\n\n* fix: remove unreachable crashlog.Read after short-ID lookup\n\nrunReportShow now resolves reports through List plus findCrashReport, so Re\n[…]\n26e7a44f1ed\n\n---------\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: e02217cd-ffed-496e-b8ea-848a781cda64\nCopilot-Session: 66a101e5-8e3c-41f0-bcf4-e26e7a44f1ed",
          "is_bot": false,
          "headline": "Allow crash reports to be shown by short ID (#376)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-31T14:34:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d2b72b441632059dbf7e687911804d3104c1bb85",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-31T06:01:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1fcc295a348b66bbb27f12e6740fc8b2d541c203",
          "body": "* Add JSON output to config check\n\nCloses #378\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 3f892a21-0f5d-41e7-aebb-afbda057615d\n\n* fix(config): print config path when keymap load fails\n\nThe JSON refactor dropped the \"Config: <path>\" line from the text\noutp\n[…]\n72d43653508\n\n---------\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 3f892a21-0f5d-41e7-aebb-afbda057615d\nCopilot-Session: 951180a3-9772-4cf6-8e49-372d43653508",
          "is_bot": false,
          "headline": "Add JSON output to config check (#383)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-31T05:50:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "433a3b04ed02005d0491ef0f667e53d80aacddad",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 340b4dd3-b4b3-4f1a-9163-66b16d96fa81",
          "is_bot": false,
          "headline": "config: add JSON path output (#369)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-31T05:49:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "edf5d4af2422e7317231d8eacf50e02d2626441c",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-27T16:34:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd8725af820d23b6bc5b09b51249a72ef0589432",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: e02217cd-ffed-496e-b8ea-848a781cda64",
          "is_bot": false,
          "headline": "Add JSON output to clean command (#374)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-27T16:22:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e849a63d6f537927250fe38eca65ec946ba15ed7",
          "body": "Closes #379\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 3f892a21-0f5d-41e7-aebb-afbda057615d",
          "is_bot": false,
          "headline": "Show resolved theme details (#384)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-27T16:22:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "340b3a5cd37546d1ce842ea4c46b9771451f494e",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 340b4dd3-b4b3-4f1a-9163-66b16d96fa81",
          "is_bot": false,
          "headline": "mcp: filter tool inventory (#368)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-27T16:22:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "51ebd2d7ce20ff10a7694a8038ae2277a30c123c",
          "body": "Closes #380\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 3f892a21-0f5d-41e7-aebb-afbda057615d",
          "is_bot": false,
          "headline": "Filter keybindings by section (#385)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-27T16:22:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "af02cc2168bb2d43db811b803e7487c73fd8513e",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 340b4dd3-b4b3-4f1a-9163-66b16d96fa81",
          "is_bot": false,
          "headline": "status: add dirty worktree check (#367)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-27T16:22:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "888c157d6397db38a1fbf2b451941ba684e6e335",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: e02217cd-ffed-496e-b8ea-848a781cda64",
          "is_bot": false,
          "headline": "Write completions to output files (#375)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-27T16:19:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0ea863518045b92a68e3891128862b5b38e1c03c",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-27T14:27:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e95d0e5e9dedfab09c344308d174fae76cf106c7",
          "body": "* deps: update dependencies to latest\n\n- actions/checkout: v7.0.0 -> v7.0.1\n- goreleaser: v2.16.0 -> v2.17.0\n- playwright: 1.61.1 -> 1.62.0\n- golang.org/x/exp: 20260709172345 -> 20260718201538\n- charmbracelet/x/exp/golden: 20260705004817 -> 20260720091843\n- @emnapi/core, @emnapi/runtime: 1.11.2 -> 1\n[…]\ngithub.com>\nCopilot-Session: 2127a7a3-47c9-410a-9f75-7eaf08125751\n\n---------\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 2127a7a3-47c9-410a-9f75-7eaf08125751",
          "is_bot": false,
          "headline": "deps: update dependencies to latest (#377)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-27T14:15:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "07d4f6256c59120fd2a62b9c2ffd238fc9aecb83",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-27T07:10:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e810a8b830a7e876e777a296b17cf267a2f88187",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-25T05:00:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c3dc6fe07a2d13fcebfcc5235cf7a16dd2a8b8c",
          "body": "…e crashes (#370)\n\n* fix(gitinfo): pick workflow-dispatch inputs and stop command-goroutine crashes\n\nPrompt for each workflow_dispatch input in turn: choice and boolean\ninputs are picked from their valid values (preselected on the workflow\ndefault), and free-form inputs are pre-filled with the defau\n[…]\ngithub.com>\nCopilot-Session: b9a3d924-7b48-4000-9d4d-fb592f3485b6\n\n---------\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: b9a3d924-7b48-4000-9d4d-fb592f3485b6",
          "is_bot": false,
          "headline": "fix(gitinfo): pick workflow-dispatch inputs and stop command-goroutin…",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-25T04:49:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "87f3fa295472eb51ac9e17b8236d5f32aecca50a",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T21:49:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08b2e8140b3a6920540e65da35ca33027829c10e",
          "body": null,
          "is_bot": false,
          "headline": "deps: update all dependencies to latest versions (#363)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T21:38:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2210af7f96b77b6cebd1e3c089a08c705b9be674",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T18:26:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed211f09f1ee187a9074bc69cf38f8db732231d5",
          "body": "TestShellInvocationForGOOS_WindowsPowerShellVariants forced goos=windows with a backslash path, but shellInvocationForGOOS uses filepath.Base (host-separator dependent), so on Linux/macOS CI the path wasn't reduced to pwsh.exe and the case failed. Production always calls with goos==runtime.GOOS, so \n[…]\noos test. The bare shell-name variants already cover the PowerShell branch.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 51e674dd-2361-4070-b223-21f7d08b972c",
          "is_bot": false,
          "headline": "test(customactions): drop non-portable Windows pwsh path case",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T18:14:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "11bec0fba75323463e1369f857cf08aca33d6c4f",
          "body": "th fix: filled the three genuinely low-coverage app packages surfaced by a test-health audit.\n\n- overlayreg: 0% -> 91.7% (factory panel constructors + custom-action copy semantics + all fuzzy-finder modes)\n\n- customactions: 25.9% -> 100% (Run success/failure/exit-code/cancel + shell-invocation branc\n[…]\nions to keep the new tests goconst-clean. All build/vet/lint/gofumpt clean.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 51e674dd-2361-4070-b223-21f7d08b972c",
          "is_bot": false,
          "headline": "test: raise coverage for overlayreg, customactions, and textsearch",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T18:00:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "45d843ae5aa5345f9ef8a1e36a34da445c217825",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T17:33:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eac8642787333268498d1fd7dbfd672020bdf8c0",
          "body": "CI's TestSetupProjectWithConflictScenario failed on Windows because the conflict setup silently ignored git errors (_ =), so a failing command produced a repo without the expected conflict and a later identity-less merge exited 128. Now buildGitHistory's conflict-critical git commands are error-chec\n[…]\ne merge diagnostic now includes git output to pinpoint any remaining cause.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 51e674dd-2361-4070-b223-21f7d08b972c",
          "is_bot": false,
          "headline": "fix(demo): surface git errors and set identity in demo scenario setup",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T17:21:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "18697813a22cc0bee13b31ff6605259f4b197b65",
          "body": "CI 'Check modules tidy' failed because go.sum was missing transitive hashes (e.g. github.com/MakeNowJust/heredoc). Regenerated with go mod tidy.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 51e674dd-2361-4070-b223-21f7d08b972c",
          "is_bot": false,
          "headline": "chore: go mod tidy (add missing go.sum hashes)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T17:21:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bc158fb3de1048e9fd78f08607a29a76f108f2e0",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T17:02:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df00656dc7e10601406f112cf2e0a9de7c161557",
          "body": "Documentation-accuracy fixes from a doc-check audit against the current code:\n\n- configuration.md: add the [mcp.security] section (the whole block was\n  undocumented), including allowed_write_paths which is now enforced. Note that\n  socket_auth is reserved and not yet enforced (#174).\n- web configur\n[…]\n, `R` request reviewers,\n  not `f`/refresh) and list the shipped PR actions.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 51e674dd-2361-4070-b223-21f7d08b972c",
          "is_bot": false,
          "headline": "docs: document MCP security and fix config/keybinding drift (doc-check)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T16:14:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "90df2169c7a05e4e15769ba7da3f26040eecd982",
          "body": "…R checkout, DoS)\n\nSecurity and robustness fixes surfaced by a deep max-quality + red-team pass over\nthe ~50 features shipped in the last week:\n\n- mcp: enforce mcp.security.allowed_write_paths on file_write. The option was\n  validated and stored but never consulted by any write tool, so it was a no-\n[…]\nolangci-lint, gofumpt,\ngovulncheck, and the full `go test ./...` suite pass.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 51e674dd-2361-4070-b223-21f7d08b972c",
          "is_bot": false,
          "headline": "fix: harden last-week features (symlink exfil, MCP write allowlist, P…",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T16:14:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "938f9f39d5d5ce956114ccc898278f1136e45271",
          "body": "Section 9 (final) of the swarm backlog, implemented as two sequential commits\nin one integration worktree (zero merge conflicts):\n\n- #288 feat: user-defined custom actions. New [[custom_actions]] config\n  (name, command, cwd, key, prompt, confirm) parsed into a dedicated\n  internal/customactions pac\n[…]\nok), diff-scoped\nemoji scan, and binary smoke (including NO_COLOR) all pass.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "swarm: resolve config/theme issues (#288, #193)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T01:26:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b74eba03552d807f47c67376052445c876d8daea",
          "body": "Add theme.color_mode resolution with NO_COLOR-aware mono mode, stable status markers, and a help overlay legend for color-safe state reading.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: add color-safe mode and status legend (#193)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T01:20:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f743386ae2c3b143b338d96ceed116654d8df9e3",
          "body": "Add config-driven shell actions with palette entries, optional keys, confirmation prompts, and async execution through the process-tree runner.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: add user-defined custom actions (#288)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T00:51:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5e18678c95faf55bfbaf06f74cce5e0d560e5d60",
          "body": "Section 8 of the swarm backlog, implemented as three sequential commits in\none integration worktree (zero merge conflicts):\n\n- #243 feat: send current file, diff, or commit to Copilot chat with an\n  explain key. New panels.AIExplainMsg; preview builds a context-aware\n  prompt (file / diff / commit) \n[…]\n suite (all packages ok), diff-scoped\nemoji scan, and binary smoke all pass.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "swarm: resolve 3 TUI navigation/AI/search issues (#243, #205, #208)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T00:26:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6f86de5fa20692107abcb979deeab96482b3d8e4",
          "body": "Add a repository text search overlay backed by git grep, with capped results, line-aware file selection, and command palette/keybinding documentation.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: add repo-wide text search overlay (#208)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-24T00:17:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bcca9563c275c3e50daa870833ec87e27e1f829e",
          "body": "Track TUI selection contexts for files, commits, branches, issues, PRs, and workflows. Add Alt+Left/Alt+Right actions that restore saved selections through the existing panel engine and reset history on directory changes.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: add back/forward navigation history (#205)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T23:43:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a9b79027df21cd94851d67b5d08af10d3628c0e2",
          "body": "… key (#243)\n\nAdd an explain-this action for preview content and commit selections that builds bounded prompts and opens the AI chat automatically.\nDocument the keybinding and cover file, diff, and commit prompt construction with unit tests.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: send current file, diff, or commit to Copilot chat with explain…",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T23:14:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "159dcd26b109fc8fa7ffab77216dae36b4796176",
          "body": "Section 7 of the swarm backlog (GitHub II cluster), developed sequentially in\none integration worktree and validated as a unit.\n\n- #245 feat: filter GitHub issues and PRs with / (incremental client-side\n  title/number filter on the Issues and PRs tabs; composes with state filters;\n  empty \"no matche\n[…]\n issues), full test suite,\nmage deadcode, emoji scan, binary smoke all pass.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "swarm: resolve 3 GitHub II issues (#245, #202, #212)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T22:09:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3b033683d3e5ed5c2334f871ed66f5cf514a3a44",
          "body": "Add a preview-panel PR diff comment composer that routes review comment requests through the GitHub panel, posts line-anchored review comments when possible, falls back to PR comments without line data, and refreshes the preview after posting. Closes #212\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: post PR review comments from the GitHub panel",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T21:34:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "733d05a2872b5609cec1899f7cfc2fe6fbf39c97",
          "body": "Add a read-only release compare action that compares a selected release against the next older release tag, then drives preview, file tree, and commits panels with the resulting range.\n\nCloses #202\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: compare releases with the previous tag",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T21:03:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1679f916a57f5abfc358a3261fcf97992d2a1793",
          "body": "Enable the existing incremental list filter for GitHub Issues and Pull Requests, and keep it applied when loaded GitHub rows are rebuilt.\\n\\nUpdate keybinding docs and add coverage for GitHub filter matching, cursor clamping, empty states, and filtered selection.\\n\\nCloses #245\\n\\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: filter GitHub issues and PRs with /",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T20:29:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5e2a2bd53cdc2729f4e7144ad45ab99723d78ced",
          "body": "Section 6 of the swarm backlog: GitHub panel improvements.\n\n#201: retain last-good GitHub tab data when a refresh fails, mark the\nsection stale with a last-updated age, and show one warning toast per\nrefresh burst instead of blanking the panel.\n\n#200: check out a pull request from the PRs tab with `\n[…]\nnterval until the\nrun reaches a terminal state, with a capped 100-line tail.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "swarm: resolve 3 GitHub I issues (#201, #200, #192)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T19:55:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "29312734d6eaba75b3ffdddc06953d1e2440dbf3",
          "body": "Add a documented Actions-tab live log follow toggle plus pause/resume controls.\nFresh log fetches bypass the 30s cache on a 3s loop until the run reaches a terminal state.\nFollow updates replace the preview log tail, auto-scroll to the newest lines, and keep the 100-line truncation cap.\nPreview jump/copy keys (g/G/y) continue to work for followed logs.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: add live GitHub Actions log follow mode (#192)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T19:42:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "53097fd14f5f6af3b4ab6c5be6a44b5272c45e5c",
          "body": "Pressing c on the PRs tab now opens a current/sibling worktree picker.\nFetch PR heads through origin pull/N/head for same-repo and fork PRs without fork remotes.\nRefuse dirty current-worktree checkouts while allowing sibling worktrees and refreshing panels.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat: check out pull requests from the GitHub panel (#200)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T19:12:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "afd33ce2ddb9ddb7313abcd43f410cdde3507aa7",
          "body": "Retain prior successful GitHub tab rows when page refreshes fail, mark those sections stale, and show a last-updated age in the active tab/header.\nDeduplicate stale refresh warnings to one toast per refresh burst while keeping cached previews display-only.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "fix: retain last-good GitHub data on refresh failure (#201)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T18:29:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f1b67aab16c1a0a5f3147a22dab9c661796c838c",
          "body": "Section 5 of the issue-backlog swarm. Two features on the Git Info panel,\nimplemented sequentially in one integration worktree.\n\n#242 - Filter Git Info lists with /: incremental case-insensitive filter on\nthe git-side list tabs (branches, tags, remotes, stash, worktrees, reflog,\nsubmodules), mirrori\n[…]\nhows in the status\nbar; a deleted or missing base warns instead of breaking.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "swarm: resolve 2 Git Info II issues (#242, #204)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T17:15:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "db83abb37cc7973e32c128b351870a1625be547f",
          "body": "Add a compare-base action to the Git Info branches flow: press `=` on a\nbranch, remote branch, or tag to pin it as the active diff base (press\nagain to clear). The file-tree branch-diff toggle and preview diffs then\ncompare against the pinned base instead of the configured default. The\nactive base i\n[…]\n deleted or missing base is\nhandled with a warning instead of a broken diff.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(gitinfo): pin a compare base for branch diff mode (#204)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T16:20:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3fa03d278d4389b584b143009fe23edc633a5a2d",
          "body": "Add an incremental `/` filter to the Git Info git-side list tabs\n(branches, tags, stash, remotes, worktrees, reflog, submodules),\nmirroring the gitlog search pattern. Live case-insensitive substring\nnarrowing, cursor clamping on the filtered list, Escape to exit and\nrestore, Enter to keep the filter\n[…]\nd (their\nown `f` filter is unchanged; `/` for GitHub is tracked separately).\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(gitinfo): add / incremental filter to git list tabs (#242)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T15:55:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3246aaeaf902d6da573cacbd5a36f6560924ce28",
          "body": "Section 4 (Git Info I):\n\n- #287 Submodules overview tab in Git Info (git submodule status parsing,\n  conditional tab, path/commit/state rows, preview details, empty message)\n- #286 In-memory git command log with bounded storage + credential\n  redaction, exposed via a read-only scrollable ctrl+g TUI \n[…]\nll-with-rebase, and push sync actions with\n  confirmations and notifications\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "swarm: resolve 3 Git Info issues (#287, #286, #213)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T14:43:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2cb0eb1d34136a9602c382df5cfd23555d9fde6d",
          "body": "The submodules mock method is test-only, like the other MockClient\nmethods already in the deadcode allowlist.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "chore(mage): allowlist MockClient.Submodules in deadcode (#287)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T02:55:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a4ea144286001cf282a4b36e174da19b1e838ad6",
          "body": "…nc actions (#213)\n\nShow upstream names and ahead/behind state in branch rows, with diverged branches marked distinctly. Add confirm-gated pull, pull --rebase, and push actions for local branches with success/error notifications and reload-backed count refresh. Cover no-upstream, ahead-only, behind-only, diverged, request, modal, and reload behavior with tests.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(gitinfo): show branch upstream/ahead-behind and add pull/push sy…",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T02:44:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9ce1267c848fa5d89519121c00d6cd18a2d9ea8a",
          "body": "Record all git client executions through runWithEnv into a bounded, thread-safe shared command log. Redact credentials and token-like values before storing entries, and expose a read-only scrollable TUI overlay with a global keybinding. Add coverage for recording, redaction, trimming, client integration, overlay rendering, and TUI toggling.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(git): add in-memory command log with TUI overlay (#286)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T02:04:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "df3efd20b6b0e56d86e1c8de417a7e54ee77245d",
          "body": "Add git submodule status parsing, expose submodule operations through the git client interfaces, render a conditional Submodules tab with path/commit/state rows, and show selected submodule details in preview. Cover parser, tab rendering, row state, and preview behavior with tests.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(gitinfo): add submodules overview tab (#287)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-23T00:13:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5ca121169d47634cdfd590fa736f53dfa7b25918",
          "body": "Section 3 (Preview cluster) resolved in one integration worktree:\n\n- #210 feat(preview): show archive manifest without extracting (zip/tar/tar.gz/tgz)\n- #203 feat(preview): add in-panel search with Ctrl+F and n/N navigation\n- #315 feat(preview): wire blame end-to-end and jump a blame line's commit into the Commits panel\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "swarm: resolve 3 preview issues (#210, #203, #315)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T22:56:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a3dba12af013652ea1b75a0444a665218b8a0b1b",
          "body": "…t (#315)\n\nWire ToggleBlameMsg -> async git blame -> BlameLoadedMsg in the tui, then\nadd preview key 'o' to open the current blame line's commit in the Commits\npanel (focus + detail view). Uncommitted lines show a toast.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(preview): wire blame end-to-end and jump blame line to its commi…",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T22:18:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ec83253ff1a954af9cdc3ea0ba340298e29cba3e",
          "body": "Adds preview-local search state, ANSI-aware highlighting, footer counts, and n/N match navigation for rendered file, diff, GitHub, and blame buffers. Updates keybinding metadata/docs and adds targeted preview search tests.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(preview): add in-panel search with Ctrl+F and n/N navigation (#203)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T21:52:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "341275b51ce5df4acf847cfec37740304530a60c",
          "body": "Show read-only manifests for zip, tar, tar.gz, and tgz archives with capped entries, sizes, and modified times. Corrupt archives render a friendly preview error instead of falling through to binary metadata.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(preview): show archive manifest without extracting (#210)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T21:33:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e557055cee19f2ab011fc93910846a802a51a454",
          "body": "File tree cluster (Section 2 of the issue-backlog swarm):\n\n- #209 On-demand directory size scan (key D): async subtree walk, no\n  symlink follow, skips .git, cached until refresh, human-readable\n  right-aligned sizes preserving git-status markers.\n- #214 Move deletes to a per-repo trash with undo (k\n[…]\n.json, and the default/classic/vim schemes;\ndocs/keybindings.md regenerated.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "swarm: resolve 3 file tree issues (#209, #214, #190)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T20:23:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fca0f3e49896be3287fdfd29059e954275c63ce4",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(filetree): add batch rename for selected entries (#190)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T19:49:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2d4f92a9e9c8d3a839dad14284faae14a386a391",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(filetree): move deletes to trash with undo (#214)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T19:28:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9d8e9492707de419184c7292df62327702be6339",
          "body": "Scan selected directories asynchronously and cache human-readable sizes until the tree refreshes. Render cached sizes alongside existing git status markers without following symlinks or descending into .git.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(filetree): add on-demand directory size scan (#209)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T19:13:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "44c26d0a951ec37408ddc10ce33ba3623d46e83c",
          "body": "Closes #290: Validate extension projects before install\nCloses #296: Print resolved config and data paths with a config path command\nCloses #289: Add a doctor command for environment checks\nCloses #291: Add guided scenarios to demo mode\n\nQuality: build, vet, golangci-lint, gofumpt, full test suite (\n[…]\ncluster E - CLI) | Agents: 4 | Conflicts resolved: 1 (docs/configuration.md)\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "swarm: resolve 4 CLI issues (#290, #296, #289, #291)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T18:02:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8dc9d9c6d7287fb2d464aa3458a082e8e1fd0203",
          "body": "SetupProject is only referenced by cmd/screenshots/main.go behind the\n//go:build screenshots tag; the wired demo API is SetupProjectWithOptions.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "chore(mage): allowlist demo.SetupProject deadcode false positive",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T17:48:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e46f9fe28562b35075f1c7c6362ffd73e4925389",
          "body": null,
          "is_bot": false,
          "headline": "Merge #291: guided demo scenarios",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T17:37:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6af5e58965b79b7358a3dce953284ff997e19111",
          "body": "Adds branch-review, conflict-resolution, and extensions scenarios behind the existing --demo flow. Scenario guidance is written into .grut/demo-scenario.md and opened in preview so the walkthrough is visible inside the TUI without adding a new overlay surface.\n\nThe conflict scenario resets tracked c\n[…]\nkeeps the generated repository and prints its path for local repro sharing.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(demo): add guided scenarios to demo mode (#291)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T17:36:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "17f3fca054d366e1f0b82c5e1ebf9d4083ad22e5",
          "body": "# Conflicts:\n#\tdocs/configuration.md",
          "is_bot": false,
          "headline": "Merge #289: doctor command",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T17:27:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7258853fcf0fe2a1e6009e50beb8c97029f0947",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(cmd): add doctor command for environment health checks (#289)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T17:25:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "80cbd9045effff1874b5bf7473f0697169071599",
          "body": null,
          "is_bot": false,
          "headline": "Merge #290: ext validate command",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T17:24:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd0eb5a085095f4a99ee50b4fa022fefe19af7e9",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(ext): add ext validate command (#290)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T17:23:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1273174c3faa8d83e818a9ac277ea90c8a32afc6",
          "body": null,
          "is_bot": false,
          "headline": "Merge #296: config path command",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T17:21:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88614ffe6aaed736f1ec1a192db5e9bf0b2bbd16",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: 48b0e4d0-26ca-4355-9957-777a9d00d8b3",
          "is_bot": false,
          "headline": "feat(config): add config path command (#296)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T17:20:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6a994555950edb2f7b5c14fb1a7568c508439667",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-22T16:57:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9fbbaa87dfc6fee0e7d7323ddbba04d5f2aa1b8f",
          "body": "* fix(tui): capture panics and harden GitHub workflow dispatch\n\nDispatching a GitHub Actions workflow crashed the whole TUI with a\ngeneric \"program was killed: program experienced a panic\" and left no\ncrash report, because Bubble Tea catches panics in the model's\nUpdate/View, swallows the value, and\n[…]\nauthored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: 2fe7a260-26ac-4066-8f4f-369ab6a38550\n\n---------\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(tui): capture panics and harden GitHub workflow dispatch (#362)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-22T16:46:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5724f372a05d90a4f2437e5450293fa60e9f711f",
          "body": "The website CLI reference only covered version, update, mcp, run, and ext. Add the status, config, theme, keys, clean, completion, and report commands with accurate flags and subcommands, matching the recent releases.\n\nAlso correct the mcp section: the --socket flag returns 'not yet implemented', so\n[…]\nGRUT_NERD_FONT, GRUT_FORCE_TERMINAL). Verified with astro build (42 pages).\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: e1e7a2e9-8a0a-42dc-be96-9ac694fc55c5",
          "is_bot": false,
          "headline": "docs(web): document new CLI commands and fix stale MCP socket reference",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T23:01:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9d299cccfeb9de64d92f3745a5ebf13667f8b7d2",
          "body": "README: add a Commands table covering status, config, theme, keys, clean, completion, run, ext, report, and mcp (all shipped recently but undocumented), and correct the Tech Stack Go version from 1.26.3 to 1.26.5 to match go.mod.\n\nconfiguration.md: add an Environment Variables section documenting GR\n[…]\n_FORCE_TERMINAL, which the code reads but were not in the config reference.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: e1e7a2e9-8a0a-42dc-be96-9ac694fc55c5",
          "is_bot": false,
          "headline": "docs: document new CLI subcommands and env vars, fix stale Go version",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T22:41:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dd1e564ebd16ae3105c34962a87dd4a8f8750001",
          "body": null,
          "is_bot": true,
          "headline": "perf: add v0.6.0 linux-amd64 baseline and release notes [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-21T21:57:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38aeadb9ae667bb60e7b31bb8a3f06f98899178d",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-21T20:59:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e02e73933faa56276bb1aab719809826afa7942e",
          "body": "…L lookup\n\nThe commits panel spawned a raw 'git remote get-url origin' subprocess, and TestOpenCommitOnGitHubNoGitHubRemote relied on that subprocess failing in a temp dir to simulate 'no remote'. Under heavy parallel load (e.g. mage install) the subprocess result was non-deterministic, intermittent\n[…]\nessage, and add a non-github-remote case. Verified 200x under -parallel 32.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: e1e7a2e9-8a0a-42dc-be96-9ac694fc55c5",
          "is_bot": false,
          "headline": "test(commits): de-flake openCommitOnGitHub by injecting the origin-UR…",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T20:46:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e7b07edbeaee70ce29ba99018ba0a58ba3819bfc",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-21T20:39:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6400577a3483bfea9aad85064412d036ae6af0c6",
          "body": "…ad pendingRevertSubject field\n\nMax-quality follow-up on the idea-PR backlog merges (PR-triage delta):\n\n- Add TestCopyLocalLocation_NoOpWhenNoFile/NoOpInGitHubMode to match the guard-test coverage its sibling preview actions (copyPermalink, openOnGitHub) already have.\n\n- Remove the write-only pendin\n[…]\ndingAndConfirms to assert the subject appears in the confirm modal message.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: e1e7a2e9-8a0a-42dc-be96-9ac694fc55c5",
          "is_bot": false,
          "headline": "test(preview): add copyLocalLocation guard tests; chore(tui): drop de…",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T20:27:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6272c4dc4d29fa7bc8f794b7dd5f76cb0fd85228",
          "body": null,
          "is_bot": true,
          "headline": "perf: update baselines [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-21T19:11:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc1e9a8133d18c2176bb0841ae672a9082a184f3",
          "body": "Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat: copy local file location (#293)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:58:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5732280a1bf2e86c65577f4993d9ba00b367ca2f",
          "body": "Add an O keybinding to the preview panel that opens the current file on\ngithub.com, pinned to the current HEAD commit and anchored to the selected\nline range (or the top visible line). It reuses the existing permalink\nbuilder and the browser launcher, and shows a clear toast when the preview\nis not \n[…]\ndings manifest, the generated\ndocs, and the help overlay. Adds unit tests for the no-file and github-mode\nguards.\n\nCloses #324\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(preview): open the previewed file on GitHub (#329)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:51:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c543d31753e36ad4d01044c469fd72d104015521",
          "body": "grut only accepted a directory as its positional argument, so jumping to a\nspecific file meant opening grut and then navigating the tree by hand. Now\nthe argument can also name a file, optionally with a \":line\" suffix.\n\nPassing a file roots grut at that file's directory, selects it in the File\nTree,\n[…]\nilesystem. The last colon is used as the line\nseparator so Windows drive letters such as C:\\path are not misread.\n\nCloses #317\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(cli): open a file at path and line from the command line (#321)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:47:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "79ffb37cfc18dd3d8c92e6dd8e30e7b89a53b694",
          "body": "Press v on a commit in the Commits panel to revert it. grut shows a\nconfirm prompt with the commit subject, then runs git revert on the\nselected hash and reloads the commits, branches, and status views.\n\nThe revert is recorded as an undoable action: undo resets HEAD back to\nwhere it was before the r\n[…]\nHeadSHA runs first; if it fails, the revert\ndoes not run.\n\nCloses #340\n\n\nCopilot-Session: 07f6eb49-d72f-4f2a-9285-065b5d835f5b\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(commits): revert the selected commit from the Commits panel (#350)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:40:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2f28092c306d5e00cb4922e7b97a63800d84f6bb",
          "body": "Press T to open a fuzzy finder over TODO, FIXME, HACK, BUG, and XXX\nmarkers across the working tree. Each entry shows file:line plus the\nmarker text; selecting one opens the file in the preview and jumps to\nthe line. The scanner walks the tree with the same hidden-dir and\n.gitignore filtering the fi\n[…]\n bound to todo_finder in the default, classic, and vim schemes\n- keybindings.json and docs/keybindings.md updated\n\nCloses #327\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(fuzzyfinder): add TODO/FIXME finder source (#333)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:38:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2b37e7e97811569e1d563c28da05d99cda86cf1d",
          "body": "* feat(help): filter shortcuts in help overlay\n\nCloses #346\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>\n\n* fix(help): extract escape key constant and align close-hint test with filter footer\n\nFixes the goconst failure and the stale TestView_ContainsCloseHint assertion t\n[…]\nred-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\nCopilot-Session: e1e7a2e9-8a0a-42dc-be96-9ac694fc55c5\n\n---------\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Filter the help overlay by key or action (#351)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:35:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6c1a05a5ffa2545c4dfbf28d3a86517194aa4a16",
          "body": "Add an M keybinding in the file tree that opens the OS file manager with\nthe item under the cursor highlighted inside its parent directory. Works\nfor both files and directories.\n\nPlatform launchers live in internal/panels/open.go:\n- Windows: explorer /select,<path>\n- macOS: open -R <path>\n- Linux: f\n[…]\nhs pass through ValidateEditorPath, so shell metacharacters and null\nbytes are rejected before any launcher runs.\n\nCloses #313\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(filetree): reveal selected file in OS file manager (#318)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:27:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dd95c5cdc2f2dabc223eb3473e403f1dfeac90b7",
          "body": "Add an `o` keybinding to the commits panel that opens the selected\ncommit's github.com page in the default browser. The commits panel\ncould copy a commit hash but had no way to jump straight to the commit\non GitHub, so reviewers had to build the URL by hand.\n\nThe handler resolves the origin remote, \n[…]\nkeybindings\nmanifest already documented `o` for this panel; this wires it up and\nregenerates docs/keybindings.md.\n\nCloses #328\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(commits): open the selected commit on GitHub (#330)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:23:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "28e66554292ead76aebb5ad1285f82fe93420eae",
          "body": "Add a `B` keybinding to the file tree that opens the entry under the\ncursor on github.com in the default browser, pinned to the current HEAD\ncommit. Files open at their blob URL and directories at their tree URL.\nThe tree could open files locally (editor, default app) but had no way\nto jump to the s\n[…]\nfault app) were already taken,\nso this uses `B` for browse. keybindings.json and docs/keybindings.md\nare updated.\n\nCloses #325\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(filetree): open the selected file or directory on GitHub (#331)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:22:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f309b0975784cad6e71c7fd0e426660dc534adeb",
          "body": "Add Ctrl+G in the preview panel to create a secret GitHub gist from the\nfile currently on screen and copy the gist URL to the clipboard. This is\na fast way to share a single file without leaving the TUI.\n\nThe handler is a no-op for GitHub content or an empty view, matching the\nexisting permalink guard. A new github.CreateGist helper shells out to\ngh gist create --secret via the shared ghExec path.\n\nCloses #326\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(preview): create a secret gist from the previewed file (#332)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:21:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fd5f17be99148b20ae28851b0c3e7e87fafaf6bb",
          "body": "Reading a long markdown file in the preview panel meant scrolling by hand\nto reach a section. Press \"t\" on a markdown file to open a heading list,\nmove the selection with j/k (or the arrows, g/G, home/end), and press\nEnter to scroll straight to that heading. Esc closes the list without\nmoving the vi\n[…]\natching the ansi-stripped heading text in document order. With\nrendering off the raw line index is used directly.\n\nCloses #316\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(preview): jump to a markdown heading in the preview (#320)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:19:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d354ebd4010813daaa61a100bf850beb28b9425a",
          "body": "Closes #349\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat(github): show issue metadata in preview (#353)",
          "author_name": "Jon Gallant",
          "author_login": "jongio",
          "committed_at": "2026-07-21T18:17:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 18,
      "commits_last_year": 438,
      "latest_release_at": "2026-07-25T05:11:02Z",
      "latest_release_tag": "v0.7.1",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 18,
      "days_since_latest_release": 9,
      "mean_days_between_releases": 7.4
    },
    "artifacts": {
      "collected": true,
      "structure": [
        "tree.go_main",
        "tree.goreleaser"
      ],
      "declarations": []
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "readme_badges": {
        "hosts": [
          "github.com",
          "goreportcard.com",
          "pkg.go.dev",
          "shields.io"
        ],
        "total": 6,
        "header": 6,
        "collected": true,
        "has_inspect_badge": false
      },
      "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": "github.com/jongio/grut",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "categories": [],
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/jongio/grut",
          "declared_type": null,
          "is_deprecated": false,
          "latest_version": "v0.7.1",
          "repository_url": "https://github.com/jongio/grut",
          "versions_count": 23,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-25T05:00:58Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 9
        },
        {
          "name": "web",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "categories": [],
          "matches_repo": false,
          "registry_url": "https://www.npmjs.com/package/web",
          "declared_type": null,
          "is_deprecated": false,
          "latest_version": "0.0.2",
          "repository_url": "https://github.com/creationix/node-web",
          "versions_count": 3,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 54428,
          "first_published_at": "2012-09-13T05:12:45.210000Z",
          "latest_published_at": "2013-01-31T19:50:36.663000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4931
        }
      ]
    },
    "popularity": {
      "forks": 2,
      "stars": 41,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-05-06",
            "count": 1
          },
          {
            "date": "2026-05-07",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 2,
        "total_forks": 2
      },
      "star_history": null,
      "open_issues_and_prs": 9
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "internal/extension/templates/wasm-go/Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "web/tsconfig.json"
      ],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 191210,
      "source_files_sampled": 618,
      "oversized_source_files": 8,
      "agent_instruction_files": [
        ".github/copilot-instructions.md",
        "AGENTS.md"
      ],
      "agent_instruction_max_bytes": 3607
    },
    "dependencies": {
      "manifests": [
        "go.mod",
        "web/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go",
        "npm"
      ],
      "dependencies": [
        {
          "name": "charm.land/bubbles/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.1.1"
        },
        {
          "name": "charm.land/bubbletea/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.8"
        },
        {
          "name": "charm.land/glamour/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.1"
        },
        {
          "name": "charm.land/lipgloss/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.5"
        },
        {
          "name": "github.com/adrg/xdg",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.5.3"
        },
        {
          "name": "github.com/alecthomas/chroma/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.27.0"
        },
        {
          "name": "github.com/anthropics/anthropic-sdk-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.61.0"
        },
        {
          "name": "github.com/charmbracelet/x/ansi",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.11.7"
        },
        {
          "name": "github.com/fsnotify/fsnotify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.1"
        },
        {
          "name": "github.com/gabriel-vasile/mimetype",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.4.15"
        },
        {
          "name": "github.com/github/copilot-sdk/go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.8"
        },
        {
          "name": "github.com/google/go-github/v89",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v89.0.0"
        },
        {
          "name": "github.com/mark3labs/mcp-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.57.0"
        },
        {
          "name": "github.com/mattn/go-runewidth",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.27"
        },
        {
          "name": "github.com/pelletier/go-toml/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.4.3"
        },
        {
          "name": "github.com/sabhiram/go-gitignore",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20210923224102-525f6e181f06"
        },
        {
          "name": "github.com/sahilm/fuzzy",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.1.3"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.1"
        },
        {
          "name": "github.com/tetratelabs/wazero",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.12.0"
        },
        {
          "name": "github.com/yuin/gopher-lua",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.2"
        },
        {
          "name": "golang.org/x/sys",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.47.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "astro",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.1.6"
        }
      ],
      "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": 5,
        "merged_prs": 150,
        "open_issues": 4,
        "closed_ratio": 0.983,
        "closed_issues": 228,
        "closed_unmerged_prs": 11
      },
      "bus_factor": 1,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "jongio",
          "commits": 241,
          "avatar_url": "https://avatars.githubusercontent.com/u/2163001?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "bench.yml",
        "ci.yml",
        "deploy-web.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": true,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum",
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "16 out of 16 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/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 3 contributing companies or organizations -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "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": 9,
            "reason": "dependency not pinned by hash detected -- score normalized to 9",
            "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": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 8,
            "reason": "5 out of the last 5 releases have a total of 5 signed artifacts.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "4913b085accc7827e3d445c53949f3bee3666f8e",
        "ran_at": "2026-08-03T13:43:45Z",
        "aggregate_score": 6.5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "recent_prs": {
        "merged_7d": 14,
        "decided_7d": 14,
        "merged_30d": 58,
        "authors_30d": 1,
        "decided_30d": 58,
        "sample_size": 60,
        "window_days": 30,
        "sample_exhausted": true,
        "authors_probed_30d": 1,
        "newcomer_merged_30d": 0,
        "bot_prs_excluded_30d": 2,
        "newcomer_authors_30d": 0,
        "newcomer_decided_30d": 0
      },
      "ci_last_run_at": null,
      "oldest_open_prs": [
        {
          "number": 396,
          "created_at": "2026-08-02T14:27:45Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 397,
          "created_at": "2026-08-02T14:28:13Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 398,
          "created_at": "2026-08-02T14:28:35Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 399,
          "created_at": "2026-08-02T14:28:58Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 400,
          "created_at": "2026-08-02T20:07:48Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-08-03T04:50:02Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": [
        {
          "number": 382,
          "created_at": "2026-07-26T17:49:21Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 388,
          "created_at": "2026-07-27T17:14:13Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 390,
          "created_at": "2026-07-27T17:14:15Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 391,
          "created_at": "2026-07-27T17:14:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/jongio/grut",
    "host": "github.com",
    "name": "grut",
    "owner": "jongio"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "excellent",
      "name": "Overall health",
      "note": "The weighted overall 74 is calibrated to 88 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 74,
            "calibrated": 88,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 88,
      "inputs": {
        "security": 65,
        "vitality": 85,
        "community": 57,
        "governance": 63,
        "calibration": "2026-08-02",
        "engineering": 94,
        "ai_readiness": 93,
        "weighted_overall_raw": 74
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 85,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "commits_last_year": 438,
              "human_commit_share": 0.8,
              "days_since_last_push": 0,
              "active_weeks_last_year": 18
            },
            "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": "18/52 weeks with commits",
                "points": 12.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 18
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "438 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 438
                    }
                  }
                ],
                "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": "exceptional",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "releases_count": 18,
              "latest_release_tag": "v0.7.1",
              "releases_from_tags": false,
              "days_since_latest_release": 9,
              "mean_days_between_releases": 7.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "18 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 18
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 9 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~7.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 7.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "5 out of the last 5 releases have a total of 5 signed artifacts.",
                "points": 8,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 57,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 26,
            "inputs": {
              "forks": 2,
              "stars": 41,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "41 stars",
                "points": 26,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 41
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "2 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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,
              "readme_badges": 6,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "readme_badge_services": [
                "github.com",
                "goreportcard.com",
                "pkg.go.dev",
                "shields.io"
              ],
              "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
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 63,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "excellent",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 80,
            "inputs": {
              "merged_prs": 150,
              "open_issues": 4,
              "closed_issues": 228,
              "prs_merged_7d": 14,
              "prs_decided_7d": 14,
              "prs_merged_30d": 58,
              "prs_decided_30d": 58,
              "issue_closed_ratio": 0.983,
              "closed_unmerged_prs": 11,
              "first_time_authors_30d": 0,
              "first_time_prs_merged_30d": 0,
              "first_time_prs_decided_30d": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "98% of issues closed",
                "points": 41.3,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 98
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "150/161 decided PRs merged",
                "points": 28,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 150,
                      "decided": 161
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "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": 67,
            "inputs": {
              "followers": 376,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "jongio",
              "public_repos": 56,
              "account_age_days": 5100
            },
            "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": "376 followers of jongio",
                "points": 18.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 376,
                      "login": "jongio"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "56 public repos, account ~13 yr old",
                "points": 24.8,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 56
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/jongio/grut"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 9
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 9 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "23 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 23
                    }
                  }
                ],
                "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": "exceptional",
        "name": "Engineering Quality",
        "value": 94,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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": ".golangci.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "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": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "16 out of 16 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "exceptional",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "git",
                "terminal",
                "cli",
                "copilot",
                "developer-tools",
                "file-explorer",
                "git-client",
                "github",
                "terminal-ui",
                "tui",
                "dprun",
                "dx-idea"
              ],
              "has_wiki": true,
              "homepage": "https://jongio.github.io/grut/",
              "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://jongio.github.io/grut/",
                "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": "12 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 12
                    }
                  }
                ],
                "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": "good",
        "name": "Security",
        "value": 65,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "good",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 6.5
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "16 out of 16 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/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "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 9",
                "points": 4.5,
                "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": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "5 out of the last 5 releases have a total of 5 signed artifacts.",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "exceptional",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 4
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "exceptional",
        "name": "AI Readiness",
        "value": 93,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                ".github/copilot-instructions.md",
                "AGENTS.md"
              ],
              "agent_instruction_max_bytes": 3607
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".github/copilot-instructions.md, AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".github/copilot-instructions.md, AGENTS.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": "80 of 80 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 80,
                      "sampled": 80
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "exceptional",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 96,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum",
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "internal/extension/templates/wasm-go/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "web/tsconfig.json"
              ],
              "agent_commit_share": 0.75,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "internal/extension/templates/wasm-go/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "internal/extension/templates/wasm-go/Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": ".golangci.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "web/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "web/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "75 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 75,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "dependency automation configured, none observed in the sampled commits",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "dependency_bot_config_only",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 9",
                "points": 9,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 191210,
              "source_files_sampled": 618,
              "oversized_source_files": 8
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "8/618 source files over 60KB",
                "points": 54.3,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 618,
                      "oversized": 8
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "labels": [
        "cli",
        "library",
        "tui"
      ],
      "scores": {
        "cli": 13,
        "tui": 4,
        "library": 6
      },
      "primary": "cli",
      "evidence": [
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:go",
          "weight": 6
        },
        {
          "tier": "dependencies",
          "label": "cli",
          "source": "dep:github.com/spf13/cobra",
          "weight": 4
        },
        {
          "tier": "structure",
          "label": "cli",
          "source": "tree.goreleaser",
          "weight": 4
        },
        {
          "tier": "structure",
          "label": "cli",
          "source": "tree.go_main",
          "weight": 3
        },
        {
          "tier": "tags",
          "label": "cli",
          "source": "tag:cli",
          "weight": 2
        },
        {
          "tier": "tags",
          "label": "tui",
          "source": "tag:terminal-ui",
          "weight": 2
        },
        {
          "tier": "tags",
          "label": "tui",
          "source": "tag:tui",
          "weight": 2
        }
      ],
      "artifacts": [],
      "confidence": "medium",
      "host_extension": false,
      "runs_as_process": true,
      "consumed_by_code": true
    },
    "metrics_version": "2.3.1"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "npm package 'web' points at a different repository (https://github.com/creationix/node-web); excluded from ecosystem scoring",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-08-03T13:44:00.953549Z",
  "schema_version": "0.30.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/j/jongio/grut.svg",
  "full_name": "jongio/grut",
  "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 v2.3.1, esquema v0.30.0 — metodología completa · wiki de métricas.

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