Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-26 15:40 UTC

aksisonline / gitswitch

A terminal UI for managing multiple local git identities. Switch the name, email, SSH key, and GitHub account that are used for your commits — instantly, without touching config files manually.

GoSin licencia detectada★ 36 estrellas⑂ 0 forksdesde abr 2026Ver en GitHub ↗

aksisonline/gitswitch tiene un índice de salud de 55 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es AI Readiness (81/100) y la más baja, Community & Adoption (25/100). Se actualizó por última vez hace 16 días. Una sola persona concentra la mayor parte del trabajo reciente.

55
global / 100
Moderado

Índice de salud del software

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

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

Perfil de puntuación

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

Titularidad

13 seguidores63 repositorios públicosdesde ago 2021@Edirq-RE

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/aksisonline/gitswitchv0.2.3-49hace 17 días

Métricas por categoría

Vitalidad

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

73Bueno · 22% del índice global
Cómo se puntúa
28.8/36Recencia de push — último push hace 16 días
5.5/36Cadencia de commits — 8/52 semanas con commits
18/18Volumen de commits — 152 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year152
human_commit_share0,87
days_since_last_push16
active_weeks_last_year8
Cómo se puntúa
27/27Publica versiones — 43 versiones publicadas
36/36Recencia de las versiones — última versión hace 17 días
27/27Cadencia de publicación — una versión cada ~1,2 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count43
latest_release_tagv0.2.3
releases_from_tagsno
days_since_latest_release17
mean_days_between_releases1,2

Comunidad y Adopción

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

25Crítico · 18% del índice global
Cómo se puntúa
25/60Estrellas — 36 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars36
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
0/22.5Licencia — no se detectó ningún archivo de licencia
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_licenseno
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

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

55Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
3/22.5Distribución de commits — el principal contribuyente firma el 87% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,867
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
36.1/38.3Aceptación de PR — 17/18 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/21 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs17
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs1
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
8.2/25Alcance del propietario — 13 seguidores de aksisonline
22.9/25Trayectoria — 63 repos públicos, cuenta de ~4 años
Datos de entrada utilizados
followers13
owner_typeUser
is_verified
owner_loginaksisonline
public_repos63
account_age_days1810
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 17 días
20/20Historial de versiones — 49 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/aksisonline/gitswitch
ecosystemsgo
any_deprecatedno
min_days_since_publish17

Calidad de Ingeniería

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

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

Documentación

100Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://gitswitch.dev
10/10Descripción del repositorio
10/10Topics — 5 topics
10/10Wiki
Datos de entrada utilizados
topicsgh, git, git-config, github, local
has_wiki
homepagehttps://gitswitch.dev
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?

48En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 0 out of 2 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/21 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
0/2.5Licencia — license file not detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6/7.5Vulnerabilities — 2 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3,5
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
0/25Dependencias indirectas libres de avisos conocidos — el conjunto transitivo no es separable de las dependencias de desarrollo y prueba en este alcance
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories2
affected_packages2
assessed_packages40
unassessed_packages0
affected_by_severityunknown 2
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Dependencias indirectas libres de avisos conocidos, Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejaron 40 dependencias resueltas con OSV. Este repositorio no publica ningún paquete que el índice resuelva, por lo que se evaluó en su lugar el grafo de dependencias del repositorio. Ese grafo mezcla fijaciones de desarrollo y prueba con las dependencias distribuidas, de modo que solo se puntúan las dependencias declaradas en tiempo de ejecución; los hallazgos transitivos se informan como contexto y quedan excluidos de la puntuación. No se analiza la alcanzabilidad.

Preparación para IA

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

81Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 77 de 87 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,885
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes3317
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 64 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfileno
typed_language
bootstrap_filesMakefile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,64
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
55/55Tamaños de archivo manejables — 0/40 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes31.955
source_files_sampled40
oversized_source_files0

Datos clave

36estrellas de GitHub
2contribuidores
152commits en los últimos 12 meses
16días desde el último push
43versiones publicadas
1factor bus
0issues abiertas
Goecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

Más detalle

OpenSSF Scorecard 3.5 / 10
3.5agregado

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
0CI-Tests0 out of 2 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/21 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
0Licenselicense file not detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
8Vulnerabilities2 existing vulnerabilities detected
Dependencias directas 11
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/charmbracelet/bubblesv1.0.0go.mod
Gogithub.com/charmbracelet/bubbleteav1.3.10go.mod
Gogithub.com/charmbracelet/harmonicav0.2.0go.mod
Gogithub.com/charmbracelet/huhv1.0.0go.mod
Gogithub.com/charmbracelet/lipglossv1.1.0go.mod
Gogithub.com/charmbracelet/x/ansiv0.11.6go.mod
Gogithub.com/cli/oauthv1.2.2go.mod
Gogithub.com/mattn/go-isattyv0.0.20go.mod
Gogithub.com/spf13/cobrav1.7.0go.mod
Gogithub.com/zalando/go-keyringv0.2.8go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
Todas las dependencias 40

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 11 paquetes directos y 29 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

RegistroPaqueteVersiónRelación
Gogithub.com/charmbracelet/bubblesv1.0.0directa
Gogithub.com/charmbracelet/bubbleteav1.3.10directa
Gogithub.com/charmbracelet/harmonicav0.2.0directa
Gogithub.com/charmbracelet/huhv1.0.0directa
Gogithub.com/charmbracelet/lipglossv1.1.0directa
Gogithub.com/charmbracelet/x/ansiv0.11.6directa
Gogithub.com/cli/oauthv1.2.2directa
Gogithub.com/mattn/go-isattyv0.0.20directa
Gogithub.com/spf13/cobrav1.7.0directa
Gogithub.com/zalando/go-keyringv0.2.8directa
Gogopkg.in/yaml.v3v3.0.1directa
Gogithub.com/atotto/clipboardv0.1.4indirecta
Gogithub.com/aymanbagabas/go-osc52/v2v2.0.1indirecta
Gogithub.com/catppuccin/gov0.3.0indirecta
Gogithub.com/charmbracelet/colorprofilev0.4.1indirecta
Gogithub.com/charmbracelet/x/cellbufv0.0.15indirecta
Gogithub.com/charmbracelet/x/exp/stringsv0.0.0-20240722160745-212f7b056ed0indirecta
Gogithub.com/charmbracelet/x/termv0.2.2indirecta
Gogithub.com/cli/browserv1.0.0indirecta
Gogithub.com/cli/safeexecv1.0.0indirecta
Gogithub.com/clipperhouse/displaywidthv0.9.0indirecta
Gogithub.com/clipperhouse/stringishv0.1.1indirecta
Gogithub.com/clipperhouse/uax29/v2v2.5.0indirecta
Gogithub.com/danieljoos/wincredv1.2.3indirecta
Gogithub.com/dustin/go-humanizev1.0.1indirecta
Gogithub.com/erikgeiser/coninputv0.0.0-20211004153227-1c3628e74d0findirecta
Gogithub.com/godbus/dbus/v5v5.2.2indirecta
Gogithub.com/inconshreveable/mousetrapv1.1.0indirecta
Gogithub.com/lucasb-eyer/go-colorfulv1.3.0indirecta
Gogithub.com/mattn/go-localereaderv0.0.1indirecta
Gogithub.com/mattn/go-runewidthv0.0.19indirecta
Gogithub.com/mitchellh/hashstructure/v2v2.0.2indirecta
Gogithub.com/muesli/ansiv0.0.0-20230316100256-276c6243b2f6indirecta
Gogithub.com/muesli/cancelreaderv0.2.2indirecta
Gogithub.com/muesli/termenvv0.16.0indirecta
Gogithub.com/rivo/unisegv0.4.7indirecta
Gogithub.com/spf13/pflagv1.0.5indirecta
Gogithub.com/xo/terminfov0.0.0-20220910002029-abceb7e1c41eindirecta
Gogolang.org/x/sysv0.38.0indirecta
Gogolang.org/x/textv0.23.0indirecta
Avisos de dependencias 2

Este repositorio no publica ningún paquete que el índice resuelva, así que se evaluó su propio grafo de dependencias — 40 paquetes, que incluyen también fijaciones de desarrollo y prueba que nunca se distribuyen: 2 tienen avisos conocidos, de los cuales 0 son directas.

PaqueteVersiónRelaciónGravedadAvisosCorregido en
golang.org/x/sysv0.38.0indirectadesconocida10.44.0
golang.org/x/textv0.23.0indirectadesconocida10.39.0

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "gh",
        "git",
        "git-config",
        "github",
        "local"
      ],
      "is_fork": false,
      "size_kb": 461,
      "has_wiki": true,
      "homepage": "https://gitswitch.dev",
      "languages": {
        "Go": 281466,
        "Ruby": 599,
        "Makefile": 344
      },
      "pushed_at": "2026-07-09T19:00:19Z",
      "created_at": "2026-04-20T17:16:49Z",
      "owner_type": "User",
      "updated_at": "2026-07-09T21:14:57Z",
      "description": "A terminal UI for managing multiple local git identities. Switch the name, email, SSH key, and GitHub account that are used for your commits — instantly, without touching config files manually.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": null,
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "abhiramkanna.com",
      "name": "Abhiram Kanna Seelamanthula",
      "type": "User",
      "login": "aksisonline",
      "company": "@Edirq-RE",
      "location": "India",
      "followers": 13,
      "avatar_url": "https://avatars.githubusercontent.com/u/88733940?v=4",
      "created_at": "2021-08-10T16:42:23Z",
      "is_verified": null,
      "public_repos": 63,
      "account_age_days": 1810
    },
    "license": {
      "state": "absent",
      "spdx_id": null,
      "raw_spdx": null,
      "file_present": false,
      "scorecard_found": false,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-07-09T00:51:11Z"
        },
        {
          "tag": "v0.2.3-beta.3",
          "kind": "prerelease",
          "published_at": "2026-07-03T10:56:58Z"
        },
        {
          "tag": "v0.2.3-beta.2",
          "kind": "prerelease",
          "published_at": "2026-07-03T10:39:42Z"
        },
        {
          "tag": "v0.2.3-beta.1",
          "kind": "prerelease",
          "published_at": "2026-07-03T10:26:45Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-06-28T10:53:44Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-06-28T09:43:34Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-06-28T08:50:56Z"
        },
        {
          "tag": "v0.1.25",
          "kind": "patch",
          "published_at": "2026-06-28T07:13:03Z"
        },
        {
          "tag": "v0.1.24",
          "kind": "patch",
          "published_at": "2026-06-28T06:51:41Z"
        },
        {
          "tag": "v0.1.23",
          "kind": "patch",
          "published_at": "2026-06-27T20:43:52Z"
        },
        {
          "tag": "v0.2.0-beta.14",
          "kind": "prerelease",
          "published_at": "2026-06-27T18:25:53Z"
        },
        {
          "tag": "v0.2.0-beta.13",
          "kind": "prerelease",
          "published_at": "2026-06-25T12:01:12Z"
        },
        {
          "tag": "v0.2.0-beta.12",
          "kind": "prerelease",
          "published_at": "2026-06-25T11:47:27Z"
        },
        {
          "tag": "v0.2.0-beta.11",
          "kind": "prerelease",
          "published_at": "2026-06-25T11:39:30Z"
        },
        {
          "tag": "v0.2.0-beta.10",
          "kind": "prerelease",
          "published_at": "2026-06-25T11:24:39Z"
        },
        {
          "tag": "v0.2.0-beta.8",
          "kind": "prerelease",
          "published_at": "2026-06-24T11:10:16Z"
        },
        {
          "tag": "v0.2.0-beta.7",
          "kind": "prerelease",
          "published_at": "2026-06-24T10:40:08Z"
        },
        {
          "tag": "v0.2.0-beta.6",
          "kind": "prerelease",
          "published_at": "2026-06-24T10:24:54Z"
        },
        {
          "tag": "v0.2.0-beta.5",
          "kind": "prerelease",
          "published_at": "2026-06-24T10:24:03Z"
        },
        {
          "tag": "v0.2.0-beta.4",
          "kind": "prerelease",
          "published_at": "2026-06-23T13:05:28Z"
        },
        {
          "tag": "v0.2.0-beta.3",
          "kind": "prerelease",
          "published_at": "2026-06-23T12:47:14Z"
        },
        {
          "tag": "v0.2.0-beta.2",
          "kind": "prerelease",
          "published_at": "2026-06-23T12:38:29Z"
        },
        {
          "tag": "v0.2.0-beta.1",
          "kind": "prerelease",
          "published_at": "2026-06-23T12:28:17Z"
        },
        {
          "tag": "v0.1.22",
          "kind": "patch",
          "published_at": "2026-05-30T22:29:43Z"
        },
        {
          "tag": "v0.1.21",
          "kind": "patch",
          "published_at": "2026-05-30T21:57:35Z"
        },
        {
          "tag": "v0.1.20",
          "kind": "patch",
          "published_at": "2026-05-06T17:13:09Z"
        },
        {
          "tag": "v0.1.19",
          "kind": "patch",
          "published_at": "2026-05-06T16:30:05Z"
        },
        {
          "tag": "v0.1.18",
          "kind": "patch",
          "published_at": "2026-05-01T15:16:54Z"
        },
        {
          "tag": "v0.1.17",
          "kind": "patch",
          "published_at": "2026-05-01T10:23:14Z"
        },
        {
          "tag": "v0.1.16",
          "kind": "patch",
          "published_at": "2026-04-30T21:45:41Z"
        },
        {
          "tag": "v0.1.15",
          "kind": "patch",
          "published_at": "2026-04-30T19:35:09Z"
        },
        {
          "tag": "v0.1.14",
          "kind": "patch",
          "published_at": "2026-04-27T22:02:18Z"
        },
        {
          "tag": "v0.1.13",
          "kind": "patch",
          "published_at": "2026-04-26T21:08:20Z"
        },
        {
          "tag": "v0.1.12",
          "kind": "patch",
          "published_at": "2026-04-26T20:45:14Z"
        },
        {
          "tag": "v0.1.11",
          "kind": "patch",
          "published_at": "2026-04-26T20:37:14Z"
        },
        {
          "tag": "v0.1.10",
          "kind": "patch",
          "published_at": "2026-04-26T20:20:05Z"
        },
        {
          "tag": "v0.1.9",
          "kind": "patch",
          "published_at": "2026-04-26T19:06:18Z"
        },
        {
          "tag": "v0.1.8",
          "kind": "patch",
          "published_at": "2026-04-20T18:16:42Z"
        },
        {
          "tag": "v0.1.7",
          "kind": "patch",
          "published_at": "2026-04-20T18:13:52Z"
        },
        {
          "tag": "v0.1.6",
          "kind": "patch",
          "published_at": "2026-04-20T18:05:39Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2026-04-20T18:01:06Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2026-04-20T17:55:53Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-04-20T17:44:52Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "41ccc106d8432f06b717ad683c80402cc409bb23",
          "body": "Both commands have shipped since v0.2.3 but were undocumented outside\nthe CHANGELOG — reauthor had no CLI reference entry at all. Adds a\ndedicated AI Coding Agents page and cross-links it from intro and\ncommit-identity docs.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: document gitswitch claude and reauthor for AI coding agents",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-07-09T19:00:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2b0137df8e11f88dc2904cf9d8ca4774c1084ad5",
          "body": "…ailure\n\nThe \"Package skill file\" step created an untracked gitswitch-skill/\ndirectory in the repo tree, and GoReleaser refuses to run when git is\ndirty — this is why the v0.2.3 release run just failed outright before\nbuilding anything. release/gitswitch.skill was never consumed by\nanything: the act\n[…]\npo) and uploaded via `gh release\nupload` after GoReleaser succeeds. Deleting the dead step fixes the\ndirty check with no loss of functionality.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: remove dead skill-packaging step causing GoReleaser dirty-tree f…",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-07-09T00:49:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "532c396bdcc92bd880f9c67a21b79888ffa84598",
          "body": "Release v0.2.0: merge canary into main (conflicts resolved)",
          "is_bot": false,
          "headline": "Merge pull request #18 from aksisonline/main-merge-canary",
          "author_name": "Abhiram Kanna Seelamanthula",
          "author_login": "aksisonline",
          "committed_at": "2026-07-09T00:44:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e103f1526613d668cecf6d77f1d4b4fc0bce6017",
          "body": "- shell: validate the alias against a safe shell-identifier pattern\n  before writing it into RC files — an unvalidated alias could inject\n  arbitrary shell code into the user's startup files.\n- tui: fix mouse hitLabel using a byte offset where a cell offset was\n  expected, breaking hit-testing on la\n[…]\nn a non-existent `build`\n  job id (the matrix build job is actually named `release`), which\n  would have prevented the job from running at all.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: address Copilot review findings on PR #18",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-07-09T00:42:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4b5c14af509ec18e74c29f0d9ab206aee611e21c",
          "body": "Ships the v0.2.0 TUI redesign (3-tab layout, onboarding wizard, mouse\nsupport, GitHub OAuth login, YAML config) as the new main baseline.\n\nResolved conflicts by keeping canary's TUI/version-check implementation\nwhere the two branches diverged, while preserving main-only work that\ncanary never picked\n[…]\nynamic What's-New/upgrade-TUI flow (rewired onto\ncanary's model fields and dismiss handlers instead of the duplicate\nstatic splash canary had).\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge branch 'canary' into main-merge-canary",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-07-09T00:26:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e2f67747d650ead6a92ce511dc73757d566012c2",
          "body": "huh (the add/edit form library) has no mouse handling at all — clicks on\nthose screens silently did nothing, and Delete confirm was keyboard-only\ntoo. Clicking a field's title, description, or input line now focuses\nthat field (huh.Form.NextField/PrevField stepped exactly as far as\nneeded, never pas\n[…]\nbels\nare now clickable. Setup-screen hints that already accepted a click\n(what's-new, detect) now say so instead of only mentioning a keypress.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: mouse support on Add/Edit Profile and Delete confirm screens",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-07-03T10:55:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d37e0a1fe955c0e2472fecec9d803e6bef74cbbc",
          "body": "One-step rebase to fix commits authored under the wrong identity\n(gitswitch reauthor <base> --to <nickname> [--from <email>] [--push]),\nso Claude/agents fix pre-switch attribution without hand-scripting\ngit rebase/commit --amend.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add reauthor command to rewrite commit attribution",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-07-03T10:38:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "53851b49bc69e4f752a3d08dc223c72d4d6d8b35",
          "body": "Canary builds were offered the stable release once it shipped; now beta\nbuilds only ever see beta tags (any base, so updates continue after a\nstable ships) and stable builds only see stable releases. Switching\nchannels stays explicit via gitswitch stable / gitswitch beta.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: keep update notifications channel-locked (canary vs stable)",
          "author_name": "abhiramkanna-edirq",
          "author_login": "abhiramkanna-edirq",
          "committed_at": "2026-07-03T10:18:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "da5d950a71153bede97d518b03368af3d35f816c",
          "body": "…sistent hi-score\n\nMouse clicks were mapped with hardcoded row offsets that had drifted from\nthe actual layout (5-row grid for 4-row item boxes, arcade score line\noff-by-one, compact-mode shifts, variable-height wizard/update screens).\nClicks are now hit-tested against the rendered body itself, so e\n[…]\nit form survives\ndelete-cancel, onboarding skip button is real, dead StateNoProfiles and\nviewList removed, width + mouse-grid smoke tests added.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: rendered-output mouse hit-testing; arcade tabs, hover focus, per…",
          "author_name": "abhiramkanna-edirq",
          "author_login": "abhiramkanna-edirq",
          "committed_at": "2026-07-03T10:18:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "32493e2c754903d607c821512e3aff2af1b55714",
          "body": null,
          "is_bot": false,
          "headline": "fix: align canary versions with main (patch bump, not minor)",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-28T11:06:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fcfefe8e3a07d545ac01cc6ace19a317b94fda35",
          "body": "- Check job: if latest tag has no GitHub release (previous goreleaser\n  failure left an orphan tag), set should_release=true so the build\n  retries automatically on the next push\n- Release job: delete the remote tag if goreleaser fails, preventing\n  orphan tags from silently blocking future releases\n- Deleted orphan tags v0.2.2 and v0.2.3 that were blocking CI\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: detect orphan tags, delete tag on goreleaser failure",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-28T10:52:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ddc143911ce23a8f2df53fced6817ee64e5c7778",
          "body": "…ally in install.sh\n\n- goreleaser requires clean git state; sed CHANGELOG.md in-place was\n  dirtying the tree. Now copies to /tmp/release-notes.md instead.\n- install.sh no longer has a hardcoded default version that goes stale.\n  When called without args it resolves the latest tag from GitHub API.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: write release notes to temp file, resolve latest version dynamic…",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-28T10:36:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1674346b70bfaa61de4c287e8dc8dfcbcf0bf647",
          "body": "…p type\n\nUpgrade TUI now writes whats-new-pending.txt with the new version\nbefore running the install script. On next launch ShouldShowWhatsNew\nreads that file and shows the splash unconditionally, then deletes it.\n\nThe minor/major gate only applies to auto-detection (brew upgrades,\nmanual script installs) — not to explicit gitswitch upgrade runs.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: always show What's New after explicit upgrade, regardless of bum…",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-28T10:30:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "db79a6362ac9c7f921e79f4b74ec373b9185c40e",
          "body": "…version in CI",
          "is_bot": false,
          "headline": "fix: require [minor]/[major] at end of subject line, stamp CHANGELOG …",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-28T10:11:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4adbdf8901e428d91b422526aabdceef38c58d10",
          "body": "…al bumps",
          "is_bot": false,
          "headline": "fix: CI always bumps patch, use [minor]/[major] markers for intention…",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-28T10:02:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eda6951228a83856e614a57c64ba099a602e2f85",
          "body": "What's New splash:\n- Now shows on first install and on upgrades from versions that\n  predate this feature (no version-seen.txt means show, not skip)\n- Recurring updates: still only shows on minor/major version bumps\n- Does not write version-seen.txt until user dismisses the splash\n\ngitswitch upgrade\n[…]\n)\n- Brew installs show a friendly \"run brew upgrade gitswitch\" message\n- Yanked version detection bypasses TUI and force-upgrades immediately\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: show What's New on first install and add upgrade TUI",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-28T09:56:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1e307bd051c0929bf74c71d7c9e1165103cdff95",
          "body": "…ispatch input\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: trigger release on .goreleaser.yaml changes, add force_release d…",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-28T09:42:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "72fddfb2277ce6d4630eef7b929c307ea76959eb",
          "body": "With format: binary, goreleaser downloads a file named\ngitswitch-darwin-arm64. The custom install block was looking for\n\"gitswitch\" which doesn't exist, causing Homebrew to fail with\nENOENT. Removing the override lets goreleaser auto-generate the\ncorrect bin.install rename.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: remove custom install block from goreleaser brews config",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-28T09:38:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "eecaa6c155e5ba1fb685e32688a3057dc3536d90",
          "body": "- Replace hand-rolled build/release/homebrew workflow with GoReleaser\n- CI bumps MINOR on feat: commits, PATCH otherwise (semver convention)\n- What's New splash fires on minor/major version updates, content\n  fetched from GitHub release body (CHANGELOG.md passed to GoReleaser)\n- Beta channel callout\n[…]\nHANGELOG for v0.2.0 splash\n- Add CLAUDE.md with release notes writing standard and CI docs\n- Promote go-isatty to direct dependency in go.mod\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: migrate CI to GoReleaser and add What's New splash screen",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-28T08:49:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2068ec3d077d00cd1f59a730d12debeea220cac8",
          "body": null,
          "is_bot": true,
          "headline": "chore: update install script for v0.1.25",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-28T07:12:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e92a1a2468e54edd101796884c6dcaa7afbb4bfb",
          "body": "gitswitch upgrade now checks if the installed version still exists as a\nGitHub release. If it was deleted (yanked), it upgrades to the current\nlatest instead of saying \"already on latest\". Also clears the version\ncache after any successful upgrade so the TUI banner disappears\nimmediately.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: force upgrade when running a yanked release",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-28T07:12:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4d3314abf591c06b0ebcaf899cf94c40108aeb0f",
          "body": null,
          "is_bot": true,
          "headline": "chore: update install script for v0.1.24",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-28T06:51:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f523aef0b6d452b7232429765425766f69370ece",
          "body": "…anner\n\nDeleted/yanked tags (e.g. accidental v0.2.1 push) would persist in the\n24-hour disk cache and keep showing a stale update prompt. Now does a\nHEAD request to releases/tags/{version} on each cache hit; busts cache\nand re-fetches if GitHub returns 404.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: validate cached release tag still exists before showing update b…",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-28T06:50:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "39deebf74d30c4f95aed9ff6d5d113f7b69c954a",
          "body": null,
          "is_bot": true,
          "headline": "chore: update install script for v0.1.23",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-27T20:43:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b3b8b929f2f9a301abfcfbeb08128818e1d279b",
          "body": "The tag filter matched canary beta tags (v0.2.0-beta.14), causing the\nversion job to compute v0.2.1 instead of v0.1.23 on the main branch.\n\nAdd `grep -v -- '-'` to filter out any tag containing a pre-release\nseparator before computing the next patch version.\n\nAlso revert install.sh default back to v0.1.22 (the last correct stable\nrelease); CI will update it to v0.1.23 on the next run.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: exclude pre-release tags from stable version computation",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-27T20:42:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f8cf22b122fcf0d9903cbc4beab1dd9547efd0eb",
          "body": "- continue-on-error: true on notify-website — website failure no longer\n  fails the release build\n- notify-website-manual: fires on workflow_dispatch when no code changed,\n  dispatches to gitswitch-web-v3 using the current latest tag so the site\n  can be re-triggered without cutting a new release\n- check job now outputs latest_tag for use by the manual path\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: website step non-blocking + manual rerun triggers dispatch",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-27T19:38:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "df4ec70ea28091aef48f47a60cc42a8b54c0ec4f",
          "body": null,
          "is_bot": true,
          "headline": "chore: update install script for v0.2.1",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-27T19:24:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eba7a9a9c83c2b0ffde1e6243ca0da1ac5a9718d",
          "body": "Adds `gitswitch beta` and `gitswitch stable` commands for switching between\nthe stable and canary release channels.\n\n- Detects Homebrew installs and uninstalls the formula before installing the\n  canary binary (with explicit user confirmation).\n- `~/.config/gitswitch/` profiles and settings are pres\n[…]\n` does not reject canary version strings.\n- Canary release fetch uses `?per_page=100` to avoid missing a pre-release\n  buried below many stable entries.\n\nResolves Copilot comments from initial review.",
          "is_bot": false,
          "headline": "feat: beta/stable channel-switching commands",
          "author_name": "Abhiram Kanna Seelamanthula",
          "author_login": "aksisonline",
          "committed_at": "2026-06-27T19:23:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1e513fe4ffad6258d5368842169d191701b11f3e",
          "body": "`gitswitch beta` — switches from stable to the latest canary pre-release.\nDetects Homebrew installs and uninstalls the formula first (with user\nconfirmation) before installing the canary binary via the install script.\n\n`gitswitch stable` — switches from canary back to the latest stable release.\nBoth commands are no-ops if already on the target channel, and both\npreserve ~/.config/gitswitch/ profiles and settings transparently.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add beta/stable channel-switching commands",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-27T18:24:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "297c4d58254735b16a7dca97c133a650e79499e6",
          "body": "GitHubHost(\"github.com\") passed a bare hostname to url.Parse, which\ntreated it as a path — leaving scheme and host empty — producing the\nmalformed URL :///login/device/code. Switch to the non-deprecated\nNewGitHubHost with an explicit https:// prefix.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: use NewGitHubHost with full URL to fix device flow auth",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-25T11:59:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1acfd00cbd39681a03694e7a7f978ad7e75c4e90",
          "body": "…screen\n\n- Toggling alias on/off or renaming now calls Reinstall (uninstall +\n  install) immediately if shell integration is active — no manual\n  reinstall required, just reload the shell\n- shell.Install no longer defaults empty alias to \"gs\"; empty = skip\n  alias line in snippet\n- Update prompt fet\n[…]\nd 24h); shows \"What's new:\" section with notes\n- CachedLatestRelease returns Release{Version, Notes}; cache struct\n  gains ReleaseNotes field\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: auto-reinstall alias on toggle/rename; release notes in update …",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-25T11:46:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e00b98aff977127583f68db264ca241f598986e9",
          "body": "- Settings alias box now shows ● enabled / ○ disabled state\n- enter = toggle alias on/off; e = rename; click right side = rename\n- Shell snippets only include the alias line when enabled (empty alias\n  string skips the line entirely — no defaulting to \"gs\" in snippets)\n- ShellAliasDisabled bool (zero value = enabled) avoids JSON ambiguity\n- Add CHANGELOG.md; document v0.2.0-beta.11, beta.9, beta.8\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: alias on/off toggle + conditional snippet injection",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-25T11:35:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0537e8072ebeb1b7a7d19ad0c3f102e66ac55b96",
          "body": "- Settings tab gets a new \"Shell Alias\" item (index 2) showing the\n  current alias (default \"gs\"); clicking or pressing enter opens an\n  inline textinput to rename it; value persisted to Prefs.ShellAlias\n- All shell snippets (zsh/bash/fish/p10k) now include\n  `alias {alias}=gitswitch` so the short n\n[…]\ntall\n- shell.Install now accepts an alias string; all callers updated\n- Fix: re-enable mouse cell motion after returning from external editor\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: editable shell alias in Settings tab + fix mouse after editor",
          "author_name": "abhiramkanna-edirq",
          "author_login": "abhiramkanna-edirq",
          "committed_at": "2026-06-25T11:23:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5b1ff0f0bb82a3f61b596da6a3fe68a392eb39f7",
          "body": "…mates\n\npanelTopY() previously used hardcoded constants per state/tab (e.g.\nutilities=22, settings=18, accounts=13+N) which drifted whenever content\nchanged, causing all mouse hit-boxes to shift.\n\nNow renders the actual panel body string and measures it with\nlipgloss.Height() — the same value lipgloss.Place uses in View() — so\nthe computed Y is always exact regardless of tab, status message presence,\nprofile count, or compact mode.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: derive panel top-Y from actual render height, not hardcoded esti…",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-24T11:09:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d91c670ef57d9031e5f59ce7458e2878f9b26d52",
          "body": "- viewStatusLine always renders a reserved blank line when empty so\n  the panel height never shifts on switch — mouse grid stays stable\n- up/down keys no-op in utilities tab until more items ship; remove\n  the ↑/↓ hint from the footer to match\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: stable status line height; disable utility nav with single item",
          "author_name": "abhiramkanna-edirq",
          "author_login": "abhiramkanna-edirq",
          "committed_at": "2026-06-24T10:37:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "075f8ca014e27e0e66d7e2bb059344e01186e55c",
          "body": null,
          "is_bot": false,
          "headline": "test",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-24T10:23:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0c4f52424755429a75ac776bcce63c6fb28559a",
          "body": "fix: P0/P1 migration fixes for 0.1.x → 0.2.x upgrade path",
          "is_bot": false,
          "headline": "Merge pull request #15 from aksisonline/fix/migration-upgrade-p0p1",
          "author_name": "Abhiram Kanna Seelamanthula",
          "author_login": "aksisonline",
          "committed_at": "2026-06-24T10:22:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f77e7799f8b19ca2d6471398cb9aa0cc2aa485af",
          "body": "- Save(): handle Windows rename-over-existing by remove+retry\n- Load() corrupt fallback: also try profiles.json if .v1.bak missing\n- Migration backup tracking: set bakCreated only when rename succeeds;\n  TUI message conditionally mentions backup based on actual state\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: address Copilot review comments on PR #15",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-24T10:20:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0aef47ba652ea58d2c751fe6e2a91b3fffe22a48",
          "body": "Storage (P0):\n- Save() writes atomically via config.yaml.tmp + rename\n- Load() falls back to profiles.json.v1.bak on corrupt config.yaml\n- Store.WasMigrated() signals first-run migration; TUI shows notice\n\nVersion (P1):\n- FetchLatestVersionFreshFor() routes beta builds to full releases list\n- upgrad\n[…]\nence\n- HookUpdateMessage suppresses false \"outdated\" nudge when hook is\n  already current; stamps hook-version silently to skip future checks\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: P0/P1 migration fixes for 0.1.x → 0.2.x upgrade path",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-24T10:11:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e3870e1838d2187b118d737cbd8397cd9903b22a",
          "body": "- Build matrix adds windows/amd64 and windows/arm64 (.exe) to both\n  release and canary workflows\n- .github/install.ps1 — one-liner installer (irm | iex), no admin\n  required, installs to %LOCALAPPDATA%\\gitswitch, adds to user PATH\n- .github/install.cmd — curl-based batch installer for CMD users,\n  \n[…]\ntch.exe\n- version.UpgradeCommand uses PowerShell on runtime.GOOS == \"windows\"\n- Install scripts bundled as release artifacts on every publish\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Windows support — exe builds, PowerShell + CMD installers",
          "author_name": "abhiramkanna-edirq",
          "author_login": "abhiramkanna-edirq",
          "committed_at": "2026-06-23T13:04:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "47b86e47b1842248b1faa7fa58d75f8d82cfd67f",
          "body": "- On launch, if a newer version is found, TUI enters StateUpdatePrompt\n  (modal with y/n) instead of showing only a passive banner\n- Beta builds (v0.x.y-beta.N) check /releases list for newer betas of\n  the same target version, or promote to stable if it has shipped\n- version.IsUpdateAvailable and c\n[…]\ng: stable > beta; beta.N+1 > beta.N\n- UpgradeCommand now accepts beta version strings\n- Separate disk cache for beta vs stable channel checks\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: update prompt on TUI launch; beta-aware version checks",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-23T12:46:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1c642298679dc86622db8d0372ba592432bad5c7",
          "body": "- shellEnabled now reads shell.IsInstalled(RCFile) on startup instead\n  of trusting the stale prefs JSON value\n- After install, status shows \"source ~/.zshrc\" (or detected RC file)\n- After TUI exits with a pending reload, main.go prints the source\n  command so user can copy-run it in one step\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: detect real shell integration state; show source cmd after install",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-23T12:37:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5603c764d21acb2c078b9d5a554ee15f127a9274",
          "body": "Version job now checks for vX.(Y+1).0-beta.* tags before computing\nthe next version. If beta tags exist (canary was tested), it tags the\nstable vX.(Y+1).0 release instead of incrementing the patch.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: promote canary beta to stable on main release",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-23T12:28:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "33f1c8292ab022785a7b0352d5053f9400a5372c",
          "body": "Triggers on push to canary branch. Tags as v{major}.{minor+1}.0-beta.N,\nmarks GitHub release as prerelease. Skips Homebrew and website steps.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: add canary release workflow for beta builds",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-23T12:27:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "32cb6a35907146fa1a70805e9fac46c1b12d48f3",
          "body": "- 'a' and 'e' keys now only fire when tabIndex == 0 (Accounts tab),\n  preventing bleed into Utilities/Settings tabs\n- Settings Config Location item now opens $EDITOR/$VISUAL/vi via\n  tea.ExecProcess on both enter key and mouse click\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: gate a/e keys to accounts tab; wire settings config editor",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-23T12:17:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9248264408729eded587fd7ceaba528e5cdf7977",
          "body": "OAuth button now sets LaunchOAuth on the model and exits TUI; main.go\nruns the device flow inline — no need to separately invoke gs login.\nRemoves all v0.2.1 stub messages.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: wire OAuth login flow into TUI for v0.2.0",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-23T12:01:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "899bbc051ec1bd6eaa1134b36dc2161939b28cf8",
          "body": "- Add form.go (huh-based add-account form) and shellconfirm.go\n- Refine update logic, styles, view rendering, and account tab view\n- Storage minor additions; dependency bump\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: TUI polish pass — form, shell confirm, view/update fixes",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-23T11:58:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e2d426e1e72696c6d538a892c07749b2c55eaa0d",
          "body": "…pport\n\n- 3-tab layout: Accounts (switch), Utilities (toggles), Settings (theme/config)\n- New-user onboarding wizard: auto-detect git configs, import confirmation,\n  OAuth/manual add-more screen\n- Existing-user what's new splash (shown once, persisted in prefs)\n- GUI-style toggle switches with fixed\n[…]\nca spring constructors for future animations (animation.go)\n- Shared UI helpers: renderToggle, renderItemBox, truncate, padTo (components.go)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: v0.2.0 TUI redesign — 3-tab layout, onboarding wizard, mouse su…",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-23T10:05:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "355528f021a08654e29364cf3cba4a65a347c295",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'feat/tui-refresh' into release/v0.2.0",
          "author_name": "abhiramkanna-edirq",
          "author_login": "abhiramkanna-edirq",
          "committed_at": "2026-06-22T09:39:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2cacf9f5b2066d23159dae399d2d10ab96c4d63e",
          "body": "Merge feat/login-oauth — keep yaml tags from config-yaml branch,\ncombine all new imports and command registrations.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: resolve merge conflicts in release/v0.2.0",
          "author_name": "abhiramkanna-edirq",
          "author_login": "abhiramkanna-edirq",
          "committed_at": "2026-06-22T09:39:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ef72153d76423df260e7e7f624abbe4479a1ff48",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'feat/config-yaml' into release/v0.2.0",
          "author_name": "abhiramkanna-edirq",
          "author_login": "abhiramkanna-edirq",
          "committed_at": "2026-06-22T09:37:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f6405d177859a8bc63556c814c83510f8e35340",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'feat/prereqs' into release/v0.2.0",
          "author_name": "abhiramkanna-edirq",
          "author_login": "abhiramkanna-edirq",
          "committed_at": "2026-06-22T09:37:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1316c420477c3556fecd594cac2d1a9c886568f",
          "body": "- WithMouseCellMotion: scroll wheel navigates, click selects profile\n- StateNoProfiles: centered welcome screen on empty profile list\n  [L] login / [A] manual add / [Q] quit — one clear path forward\n- LaunchLogin signal: exits TUI and prints gs login hint\n- ensureInitialized: silent auto-import (no console noise on first run)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: TUI mouse support + first-run welcome screen + silent auto-import",
          "author_name": "abhiramkanna-edirq",
          "author_login": "abhiramkanna-edirq",
          "committed_at": "2026-06-22T09:37:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c7adedc885233ed98ccdabc009b20272cc4d9b54",
          "body": "- gs login: device flow via github.com/cli/oauth (GitHub's own library)\n  prints URL + code, waits for browser auth, creates profile automatically\n- internal/oauth: thin Login() wrapper; fetches user + primary email\n- internal/secrets: KeychainStore (go-keyring, machine-local) with noop fallback\n- storage.Profile gains TokenRef field for keychain ref\n- client_id Ov23li75EL8QeU1iIfkR baked in; --client-id overrides for GHES\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: GitHub OAuth login + OS keychain token storage",
          "author_name": "abhiramkanna-edirq",
          "author_login": "abhiramkanna-edirq",
          "committed_at": "2026-06-22T09:35:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ba3cfc99d9e108a1e211788b99d6ded7d3f79429",
          "body": "- config.yaml replaces profiles.json as primary store (v2 schema)\n- Profile gains TokenRef field for OS keychain refs\n- On first load: profiles.json silently migrates to config.yaml,\n  old file renamed to profiles.json.v1.bak — zero breakage for existing users\n- gopkg.in/yaml.v3 added (same dep as half the ecosystem)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: migrate config to YAML, add TokenRef to Profile",
          "author_name": "abhiramkanna-edirq",
          "author_login": "abhiramkanna-edirq",
          "committed_at": "2026-06-22T09:33:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "39325a0b3e9e1292ade95ed01a62bbbc8618714a",
          "body": "- internal/prereqs: Check() detects git/gh install + version, returns\n  platform-specific install hints (brew/winget/apt)\n- doctor: shows ✓/✗ status for git and gh; --json for machine output\n- setup: human-readable next-steps; --agent emits JSON manifest for AI\n- Minimum versions: git ≥ 2.28, gh ≥ 2.0\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: prereq checks + doctor/setup commands",
          "author_name": "abhiramkanna-edirq",
          "author_login": "abhiramkanna-edirq",
          "committed_at": "2026-06-22T09:32:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bcedcdf8ca391f7add5457af07dce9fffc935744",
          "body": "- install.sh creates gs symlink after binary install, conflict-safe\n- rootCmd Short simplified to one plain line; Long removed\n- tea.WithMouseCellMotion() added; scroll wheel and click-to-switch work\n- StateNoProfiles: first-run screen with [L] login / [A] add / [Q] quit\n- LaunchLogin signal: TUI exits with hint to run gs login\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: gs alias + mouse TUI + beginner-first no-profiles screen",
          "author_name": "abhiramkanna-edirq",
          "author_login": "abhiramkanna-edirq",
          "committed_at": "2026-06-22T09:30:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "adc33e1d7b0989b3182f66c787270c6f06a572df",
          "body": "…mplate\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: fix issue template for CLI context and clarify Formula is a te…",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-03T19:07:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6822cb5f47209dcd9ac41d3ecf6789f1405c4954",
          "body": null,
          "is_bot": false,
          "headline": "Documentation update",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-06-02T14:46:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95ddb0fac0b45c43beff532826e03dadc91b22c6",
          "body": null,
          "is_bot": true,
          "headline": "chore: update install script for v0.1.22",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-30T22:29:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2cf27c63bc7b1a91c2526c0733a3e03a6d7b4e13",
          "body": "fix: hook-check dev version noise + combined upgrade+HTTPS nudge",
          "is_bot": false,
          "headline": "Merge pull request #14 from aksisonline/fix/hook-check-version-noise",
          "author_name": "Abhiram Kanna Seelamanthula",
          "author_login": "aksisonline",
          "committed_at": "2026-05-30T22:28:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f87782d9beef354782b597d56ffb6ac68cab37d",
          "body": "WriteHookVersion skips writing when version is \"dev\" or empty.\nLocal/test builds were corrupting hook-version, causing\n\"dev → vX.Y.Z\" messages on next real binary launch.\n\nHookUpdateMessage:\n- Dev currentVersion → silent, no nudges\n- Stale \"dev\" entry in hook-version treated as current (no false pos\n[…]\nitch install\"\n  Previously HTTPS nudge only showed when versions matched, so brew\n  upgraders needed two shell opens to discover the feature.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: hook-check dev version noise + combined upgrade+HTTPS nudge",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-30T22:27:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a04ba35db39204592c11e3fe7aa975a4eada6c2c",
          "body": null,
          "is_bot": true,
          "headline": "chore: update install script for v0.1.21",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-30T21:57:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a06a2464fb9e80cb2f4f660c9bbc37cbbb7b288",
          "body": "feat: HTTPS credential routing + interactive install wizard",
          "is_bot": false,
          "headline": "Merge pull request #13 from aksisonline/feat/https-credential-helper",
          "author_name": "Abhiram Kanna Seelamanthula",
          "author_login": "aksisonline",
          "committed_at": "2026-05-30T21:56:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "583a75bf0616a340e2fd29579aea584b7198fedb",
          "body": "Three real bugs fixed:\n\nSetSignKey / SetSSHKey — both branches previously returned nil, making\nthe comment \"ignore error if key is not set\" a lie: ALL errors were\nsilently swallowed, including git not being found or a permissions\nfailure. Now uses isUnsetNothingErr (exit code 5) to distinguish\n\"noth\n[…]\nft as-is — the alternative\n(required param) would re-break shell_test.go callers for a style win\non an internal package; not worth the churn.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: address Copilot review comments",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-30T21:51:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8f03f1d8f9df7ef0b556cc18edd0e1e89bec8cfd",
          "body": null,
          "is_bot": false,
          "headline": "Delete tones.md",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-30T21:46:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b12c8809b69536434a7825a6557959ec0dd1983c",
          "body": "Two paths, both auto-surface the new feature:\n\ncurl-installed users\n  After `gitswitch upgrade` completes, if shell integration is active\n  but the HTTPS credential helper is not registered, the setup wizard\n  launches immediately — no manual `gitswitch install` needed.\n\nbrew users (and all shell-op\n[…]\ntered.\n\nHookUpdateMessage gains an optional credHelperInstalled bool param\n(variadic to preserve backwards-compat with callers that omit it).\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: auto-prompt HTTPS setup on upgrade",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-30T21:43:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "abe674351385349537c845fdbf162a0a2c0edb9b",
          "body": "Rewrites the install wizard as a proper Bubble Tea full-screen TUI,\nmatching the main gitswitch visual style — rounded borders, purple\nprimary, green accent, yellow highlight, muted secondary text.\n\nNo arcade effects in setup: the clean modern look is the right register\nfor a first-run experience. A\n[…]\nred in terminal\n  - Smart upgrade path: if shell already installed, shows only the\n    new HTTPS step (Step 1 of 1) with upgrade context note\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(install): clean TUI wizard matching main gitswitch style",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-30T21:40:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "516106ccc589355449ae977136e277595cbc622b",
          "body": null,
          "is_bot": false,
          "headline": "Update .gitignore",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-30T21:39:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3216b7a09a6f3450aeff51b8c4de0495faef7e95",
          "body": "When shell integration is already active (e.g. upgrading from v0.1.20\nvia brew), the interactive wizard skips Step 1 entirely and shows only\nthe new HTTPS credential routing step — labelled \"Step 1 of 1\".\n\nThis means existing users who run `gitswitch install` after upgrading\nsee a focused, relevant \n[…]\ne cases:\n  - Both shell + HTTPS already set up → \"Nothing to do\" and exit\n  - Non-interactive (piped/--yes) → idempotent defaults, no prompts\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(install): smart upgrade path for existing brew installs",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-30T21:33:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1824bafdd544eb969396d347c33ea1edfa85682b",
          "body": "`gitswitch install` now runs a step-by-step setup wizard when called\nfrom a real terminal:\n\n  Step 1 — Shell integration\n    shows detected shell + framework, before/after prompt comparison,\n    explains the nudge-on-cd behaviour, prompts Y/n\n\n  Step 2 — HTTPS credential routing\n    explains what th\n[…]\no (TTY detection via\nmattn/go-isatty, already in go.sum). installCmd simplified to delegate\nentirely to wizard.Run() + wizard.PrintSummary().\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: interactive install wizard with before/after visuals",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-30T21:19:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3bfbb16b816a78d252451f64f0aafd882eb52fa3",
          "body": "gitswitch now wires up HTTPS auth, not just SSH. Registered as a git\ncredential helper (credential.helper = !gitswitch credential), it resolves\nthe active/pinned profile for the current repo and delegates token retrieval\nto the gh CLI (gh auth token --hostname H --user U). gitswitch stores no\ntokens\n[…]\nded\n\nAlso fixes a pre-existing build break in shell_test.go (HookUpdateMessage\ngained a rcFile param; test calls weren't updated).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: HTTPS credential helper that delegates to gh",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-30T21:12:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "52f4e2b9641aeb78fef754acf736dc402209351a",
          "body": null,
          "is_bot": false,
          "headline": "Update issue templates",
          "author_name": "Abhiram Kanna Seelamanthula",
          "author_login": "aksisonline",
          "committed_at": "2026-05-30T17:34:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e221d395a5eb8719169b65962aad6713cdfe93a",
          "body": null,
          "is_bot": false,
          "headline": "Update privacy-policy.md",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-29T09:17:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "98b2f31e79735ba6ef7ed6169421a234f0007cab",
          "body": null,
          "is_bot": false,
          "headline": "Create privacy-policy.md",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-29T09:12:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38b94ea1b87e1458bb493cb0103be5873ba54c4d",
          "body": null,
          "is_bot": true,
          "headline": "chore: update install script for v0.1.20",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-06T17:13:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da452cab9df69c745e1b39cb9af29ce2a5de75fd",
          "body": "fix(shell): reliable OMZ install + stale hook detection",
          "is_bot": false,
          "headline": "Merge pull request #12 from aksisonline/fix/shell-install",
          "author_name": "Abhiram Kanna Seelamanthula",
          "author_login": "aksisonline",
          "committed_at": "2026-05-06T17:11:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0fce604b5a32be1061ca04140854806130689a0f",
          "body": "… stale installs\n\nTwo bugs:\n1. installOMZ wrote to the OMZ plugin dir and required the user to manually\n   add 'gitswitch' to their plugins array — hooks silently never loaded.\n   Fix: write the snippet directly to ~/.zshrc with the marker block,\n   same as raw zsh. Reliable, no user action required\n[…]\nced got no hint to reinstall.\n   Fix: if hook-version is absent but the marker IS in the rc file, print\n   a generic \"may be outdated\" nudge.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(shell): OMZ install writes to .zshrc directly; hook-check detects…",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-06T17:10:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cdf3cee8c9210e668514ede7adfaeea8ec7222fc",
          "body": null,
          "is_bot": true,
          "headline": "chore: update install script for v0.1.19",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-06T16:29:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "97bc35eb3362309f7513da057621ae7c7956b945",
          "body": "feat: identity awareness, shell integration, Claude skill, and gitswitch rename",
          "is_bot": false,
          "headline": "Merge pull request #11 from aksisonline/feature/identity-awareness",
          "author_name": "Abhiram Kanna Seelamanthula",
          "author_login": "aksisonline",
          "committed_at": "2026-05-06T16:28:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "045b3548db455a72b1a1b021b549f49e3a7cc625",
          "body": "…teMessage tests\n\nAgent-Logs-Url: https://github.com/aksisonline/gitswitch/sessions/c99ac89e-cdd3-462e-9c87-3f0d391fdb67\n\nCo-authored-by: aksisonline <88733940+aksisonline@users.noreply.github.com>",
          "is_bot": true,
          "headline": "fix: extract gitswitchConfigDir helper; add WriteHookVersion/HookUpda…",
          "author_name": "copilot-swe-agent[bot]",
          "author_login": "Copilot",
          "committed_at": "2026-05-06T16:22:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e64c544f28619c435e22bdb8cad6153e2945d47",
          "body": "gitswitch install now writes ~/.config/gitswitch/hook-version. On each\nterminal launch the shell hook runs 'gitswitch hook-check' (hidden cmd,\nsilent on success) which compares that file to the binary version and\nprints a one-liner if stale:\n\n  gitswitch: shell integration updated (v0.1.6 → v0.1.7) — run: gitswitch install\n\nNo y/n interaction — print only, so it never collides with the nudge prompt.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(shell): print update hint on terminal launch if hook is stale",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-06T16:05:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "657ab0eb5fb4901845fade1272cc775d51238fd0",
          "body": "Bare __gitswitch_nudge during .zshrc sourcing fires before the terminal\nemulator (VS Code, iTerm2) sets the working directory, so git rev-parse\nfails and no nudge runs on launch. Using a one-shot precmd hook delays\nthe check until just before the first prompt, by which time the cwd is\ncorrect. chpwd still handles subsequent cd changes.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(shell): run startup nudge via precmd hook, not bare call",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-06T15:13:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b614b0c69e4b3d4579653fa4d3609ffba2911366",
          "body": "Binary was already gitswitch; aligns all docs, skill name, install\npath (~/.claude/skills/gitswitch/), and release artifact name.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: rename project from git-switcher to gitswitch",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-06T15:04:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0f83ad786410c63e63a05875160e88aee92146b1",
          "body": "Repo renamed from homebrew-gitswitch → homebrew-tap so install command\nis now: brew install aksisonline/tap/gitswitch\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update homebrew tap to aksisonline/tap",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-06T15:00:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5bd9b6f6d44970c03f59ca901305d466b3b60683",
          "body": null,
          "is_bot": true,
          "headline": "chore: update install script for v0.1.18",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-01T15:16:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ecdcf25c73fb057e97a18683ea01fc0f02af8807",
          "body": "feat(shell): theme-colored nickname prompt, git-repo guard, uninstall command",
          "is_bot": false,
          "headline": "Merge pull request #10 from aksisonline/feature/identity-awareness",
          "author_name": "Abhiram Kanna Seelamanthula",
          "author_login": "aksisonline",
          "committed_at": "2026-05-01T15:15:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43e810569c76fa350ad15932033f625dd9cf93e7",
          "body": "gitswitch upgrade previously always ran the curl install script, which\nconflicts with Homebrew-managed installs (wrong binary location, version\ntracking bypass).\n\nAdd isBrewInstall() which resolves the running executable's symlinks and\nchecks for /Cellar/ or /linuxbrew/ in the path. When detected:\n-\n[…]\nh version: shows \"brew upgrade gitswitch\" instead of\n  \"gitswitch upgrade\" in the update-available hint\n\ncurl/direct installs are unaffected.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: detect Homebrew install and route upgrade accordingly",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-01T15:11:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6f9a310a566babf522b72f2b11c7aaa4071d7f63",
          "body": "- Use _ for unused fw parameter in Uninstall (Go style, not a compile error\n  but clarifies intent)\n- Fix installStarship to wrap snippet in marker begin/end so removeMarkerBlock\n  can correctly strip it during uninstall\n- Add separate --prompt flag (outputs nick\\tcolor) to avoid breaking --short\n  \n[…]\n, works on starship.toml format\n- Update prompt-flag tests to assert --prompt used in prompt functions and\n  --short kept in Starship snippet\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: address Copilot review findings on PR #10",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-01T15:09:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d72f4b99fe468eddddb0aa43f3057d638f1fc882",
          "body": "- Add ThemePromptColor(index int) to tui package, returning the primary\n  ANSI 256-color code for the selected palette\n- Extend gitswitch current --short to emit a 3rd tab field with the color\n  code (nickname\\temail\\tcolor), keeping existing parsers unaffected\n- Update all 5 prompt functions (zsh, \n[…]\nent\n- Fallback to 141 (default theme purple) when color field is absent\n- Update tests: assert dynamic color variable used, no hardcoded cyan\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(shell): prompt color follows the TUI theme selection",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-01T12:54:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "daeaae094fa32052d76710766a02ef6081247742",
          "body": "RPROMPT appeared too close to the cursor on long prompts (oh-my-zsh with\nbranch + dirty indicator). Revert to prepending to left PROMPT but keep\nthe improvements: nickname instead of email, %F{cyan}..%f color, and the\ngit-repo guard so it hides outside git directories.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(shell): move prompt indicator back to left, prepend with cyan color",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-01T12:49:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e41da276d13a026049f468cfd3fe929b9b6e8609",
          "body": "…repos\n\n- Replace git config user.email lookup with gitswitch current --short | cut -f1\n  so the prompt shows the profile nickname instead of the full email address\n- Add git rev-parse --git-dir guard to all prompt functions so the indicator\n  is hidden entirely when not inside a git repo\n- Zsh/OMZ:\n[…]\nent call\n- Add tests: nickname-not-email (5 variants), git-repo guard (5 variants),\n  RPROMPT placement for zsh, cyan color for bash and fish\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(shell): show nickname in cyan on right prompt, hide outside git …",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-01T12:39:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "395aa9eedc636dd458a89c1b192d823ec38e8f9b",
          "body": null,
          "is_bot": true,
          "headline": "chore: update install script for v0.1.17",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-01T10:23:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f739c681a44168cba17218235d32a04bd135379f",
          "body": "fix(shell): clear GITSWITCH_LAST_REPO when leaving a git repo",
          "is_bot": false,
          "headline": "Merge pull request #9 from aksisonline/feature/identity-awareness",
          "author_name": "Abhiram Kanna Seelamanthula",
          "author_login": "aksisonline",
          "committed_at": "2026-05-01T10:22:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c5f27af7c7edf564a608099164c25cd0bc0b508",
          "body": "Using `export VAR=\"\"` leaves a ghost empty variable in the environment.\nSwitch to `unset __GITSWITCH_LAST_REPO` (zsh/bash/OMZ/P10k) and\n`set -e __GITSWITCH_LAST_REPO` (fish) to fully remove the variable when\nleaving a git repo. Functionally equivalent for the dedup check but\ncleaner env hygiene.\n\nAl\n[…]\nect true/false/missing-file results\n- DetectShell maps SHELL env var to correct enum values\n- installRaw idempotency verified via IsInstalled\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(shell): unset GITSWITCH_LAST_REPO instead of setting empty string",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-05-01T10:10:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "990c54a894b71f8f390733d81916d53e9f993e5d",
          "body": "Previously, __GITSWITCH_LAST_REPO was set on repo entry but never cleared\nwhen leaving. Returning to the same repo after switching identity elsewhere\nwould silently skip the nudge because the gate saw the old cached value.\n\nFix: on failed git rev-parse (i.e. not inside a git repo), explicitly\nunset \n[…]\nry to any repo re-triggers\nthe nudge. Applied to all five nudge function variants (zsh, bash, fish,\noh-my-zsh plugin, Powerlevel10k snippet).\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(shell): clear GITSWITCH_LAST_REPO when leaving a git repo",
          "author_name": "abhiramkanna-edirq",
          "author_login": "abhiramkanna-edirq",
          "committed_at": "2026-05-01T09:53:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "11bebf3f0c832dc5d0f4693751553d0b208b5045",
          "body": null,
          "is_bot": true,
          "headline": "chore: update install script for v0.1.16",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-04-30T21:45:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78588c1ca5d49cfbf1557615565c86bd225aee92",
          "body": "feat: identity awareness — usage history, shell integration, pin/unpin",
          "is_bot": false,
          "headline": "Merge pull request #8 from aksisonline/feature/identity-awareness",
          "author_name": "Abhiram Kanna Seelamanthula",
          "author_login": "aksisonline",
          "committed_at": "2026-04-30T21:44:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae6c6a1e367d9af00835c329a8fd85f52fc7e843",
          "body": "…ropagation, full-pipeline tests\n\nAgent-Logs-Url: https://github.com/aksisonline/gitswitch/sessions/37166c8c-b8cf-42a7-b321-4d67848b0501\n\nCo-authored-by: aksisonline <88733940+aksisonline@users.noreply.github.com>",
          "is_bot": true,
          "headline": "fix: address remaining PR review findings — file lock, Load() error p…",
          "author_name": "copilot-swe-agent[bot]",
          "author_login": "Copilot",
          "committed_at": "2026-04-30T21:39:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8fa2302eb105830e4cab4eb6b7b578e5d2b080e5",
          "body": "- history: fix import ordering (gofmt)\n- history: Save() uses temp file + rename for atomic writes\n- history: Load() backs up corrupted history.json as .bak before starting fresh\n- history: extract recordInHistory() helper so tests exercise real record logic\n- history: tests now call recordInHistory\n[…]\ne + returns errNoRecommendation\n  instead of os.Exit(1) inside RunE\n- main: recordCmd returns history.Record() error instead of discarding it\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: address Copilot review findings on PR #8",
          "author_name": "aksisonline",
          "author_login": "aksisonline",
          "committed_at": "2026-04-30T21:32:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 43,
      "commits_last_year": 152,
      "latest_release_at": "2026-07-09T00:51:11Z",
      "latest_release_tag": "v0.2.3",
      "releases_from_tags": false,
      "days_since_last_push": 16,
      "active_weeks_last_year": 8,
      "days_since_latest_release": 17,
      "mean_days_between_releases": 1.2
    },
    "community": {
      "has_readme": true,
      "has_license": false,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/aksisonline/gitswitch",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/aksisonline/gitswitch",
          "is_deprecated": false,
          "latest_version": "v0.2.3",
          "repository_url": "https://github.com/aksisonline/gitswitch",
          "versions_count": 49,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-09T00:49:17Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 17
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 36,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 31955,
      "source_files_sampled": 40,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 3317
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [
          {
            "name": "golang.org/x/sys",
            "direct": false,
            "version": "v0.38.0",
            "severity": "unknown",
            "ecosystem": "go",
            "cvss_score": null,
            "advisory_ids": [
              "GO-2026-5024"
            ],
            "fixed_version": "0.44.0",
            "advisory_count": 1,
            "oldest_advisory_days": 64
          },
          {
            "name": "golang.org/x/text",
            "direct": false,
            "version": "v0.23.0",
            "severity": "unknown",
            "ecosystem": "go",
            "cvss_score": null,
            "advisory_ids": [
              "GO-2026-5970"
            ],
            "fixed_version": "0.39.0",
            "advisory_count": 1,
            "oldest_advisory_days": 11
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "unknown": 2
        },
        "advisory_count": 2,
        "affected_count": 2,
        "assessed_count": 40,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/charmbracelet/bubbles",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.0"
        },
        {
          "name": "github.com/charmbracelet/bubbletea",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.10"
        },
        {
          "name": "github.com/charmbracelet/harmonica",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.2.0"
        },
        {
          "name": "github.com/charmbracelet/huh",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.0"
        },
        {
          "name": "github.com/charmbracelet/lipgloss",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.0"
        },
        {
          "name": "github.com/charmbracelet/x/ansi",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.11.6"
        },
        {
          "name": "github.com/cli/oauth",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.2.2"
        },
        {
          "name": "github.com/mattn/go-isatty",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.20"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.7.0"
        },
        {
          "name": "github.com/zalando/go-keyring",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.2.8"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "github.com/charmbracelet/bubbles",
            "direct": true,
            "version": "v1.0.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/bubbletea",
            "direct": true,
            "version": "v1.3.10",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/harmonica",
            "direct": true,
            "version": "v0.2.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/huh",
            "direct": true,
            "version": "v1.0.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/lipgloss",
            "direct": true,
            "version": "v1.1.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/x/ansi",
            "direct": true,
            "version": "v0.11.6",
            "ecosystem": "go"
          },
          {
            "name": "github.com/cli/oauth",
            "direct": true,
            "version": "v1.2.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mattn/go-isatty",
            "direct": true,
            "version": "v0.0.20",
            "ecosystem": "go"
          },
          {
            "name": "github.com/spf13/cobra",
            "direct": true,
            "version": "v1.7.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/zalando/go-keyring",
            "direct": true,
            "version": "v0.2.8",
            "ecosystem": "go"
          },
          {
            "name": "gopkg.in/yaml.v3",
            "direct": true,
            "version": "v3.0.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/atotto/clipboard",
            "direct": false,
            "version": "v0.1.4",
            "ecosystem": "go"
          },
          {
            "name": "github.com/aymanbagabas/go-osc52/v2",
            "direct": false,
            "version": "v2.0.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/catppuccin/go",
            "direct": false,
            "version": "v0.3.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/colorprofile",
            "direct": false,
            "version": "v0.4.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/x/cellbuf",
            "direct": false,
            "version": "v0.0.15",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/x/exp/strings",
            "direct": false,
            "version": "v0.0.0-20240722160745-212f7b056ed0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/x/term",
            "direct": false,
            "version": "v0.2.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/cli/browser",
            "direct": false,
            "version": "v1.0.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/cli/safeexec",
            "direct": false,
            "version": "v1.0.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/clipperhouse/displaywidth",
            "direct": false,
            "version": "v0.9.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/clipperhouse/stringish",
            "direct": false,
            "version": "v0.1.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/clipperhouse/uax29/v2",
            "direct": false,
            "version": "v2.5.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/danieljoos/wincred",
            "direct": false,
            "version": "v1.2.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/dustin/go-humanize",
            "direct": false,
            "version": "v1.0.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/erikgeiser/coninput",
            "direct": false,
            "version": "v0.0.0-20211004153227-1c3628e74d0f",
            "ecosystem": "go"
          },
          {
            "name": "github.com/godbus/dbus/v5",
            "direct": false,
            "version": "v5.2.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/inconshreveable/mousetrap",
            "direct": false,
            "version": "v1.1.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/lucasb-eyer/go-colorful",
            "direct": false,
            "version": "v1.3.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mattn/go-localereader",
            "direct": false,
            "version": "v0.0.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mattn/go-runewidth",
            "direct": false,
            "version": "v0.0.19",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mitchellh/hashstructure/v2",
            "direct": false,
            "version": "v2.0.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/muesli/ansi",
            "direct": false,
            "version": "v0.0.0-20230316100256-276c6243b2f6",
            "ecosystem": "go"
          },
          {
            "name": "github.com/muesli/cancelreader",
            "direct": false,
            "version": "v0.2.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/muesli/termenv",
            "direct": false,
            "version": "v0.16.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/rivo/uniseg",
            "direct": false,
            "version": "v0.4.7",
            "ecosystem": "go"
          },
          {
            "name": "github.com/spf13/pflag",
            "direct": false,
            "version": "v1.0.5",
            "ecosystem": "go"
          },
          {
            "name": "github.com/xo/terminfo",
            "direct": false,
            "version": "v0.0.0-20220910002029-abceb7e1c41e",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/sys",
            "direct": false,
            "version": "v0.38.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/text",
            "direct": false,
            "version": "v0.23.0",
            "ecosystem": "go"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 40,
        "direct_count": 11,
        "indirect_count": 29
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 17,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 1
      },
      "bus_factor": 1,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "aksisonline",
          "commits": 111,
          "avatar_url": "https://avatars.githubusercontent.com/u/88733940?v=4"
        },
        {
          "type": "User",
          "login": "abhiramkanna-edirq",
          "commits": 17,
          "avatar_url": "https://avatars.githubusercontent.com/u/241703842?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.867
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "canary.yml",
        "docs-sync.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "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": 0,
            "reason": "0 out of 2 merged PRs checked by a CI test -- score normalized to 0",
            "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/21 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 0,
            "reason": "license file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "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": 8,
            "reason": "2 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "41ccc106d8432f06b717ad683c80402cc409bb23",
        "ran_at": "2026-07-26T15:40:20Z",
        "aggregate_score": 3.5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-09T19:00:30Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-09T00:44:34Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/aksisonline/gitswitch",
    "host": "github.com",
    "name": "gitswitch",
    "owner": "aksisonline"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 55,
      "inputs": {
        "security": 48,
        "vitality": 73,
        "community": 25,
        "governance": 55,
        "engineering": 69
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 73,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 62,
            "inputs": {
              "commits_last_year": 152,
              "human_commit_share": 0.87,
              "days_since_last_push": 16,
              "active_weeks_last_year": 8
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 16 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 16
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "8/52 weeks with commits",
                "points": 5.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "152 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 152
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 43,
              "latest_release_tag": "v0.2.3",
              "releases_from_tags": false,
              "days_since_latest_release": 17,
              "mean_days_between_releases": 1.2
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "43 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 43
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 17 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 17
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.2 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.2
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 25,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "forks": 0,
              "stars": 36,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "36 stars",
                "points": 25,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 36
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "critical",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": true,
              "has_license": false,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "no license file detected",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "license_absent",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 55,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 18,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.867
            },
            "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 87% of commits",
                "points": 3,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 87
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 68,
            "inputs": {
              "merged_prs": 17,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 1
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "17/18 decided PRs merged",
                "points": 36.1,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 17,
                      "decided": 18
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/21 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 51,
            "inputs": {
              "followers": 13,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "aksisonline",
              "public_repos": 63,
              "account_age_days": 1810
            },
            "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": "13 followers of aksisonline",
                "points": 8.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 13,
                      "login": "aksisonline"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "63 public repos, account ~4 yr old",
                "points": 22.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 63
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 4
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/aksisonline/gitswitch"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 17
            },
            "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 17 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 17
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "49 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 49
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 69,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 48,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "0 out of 2 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "gh",
                "git",
                "git-config",
                "github",
                "local"
              ],
              "has_wiki": true,
              "homepage": "https://gitswitch.dev",
              "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://gitswitch.dev",
                "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": "5 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 48,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 35,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 3.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": "0 out of 2 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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/21 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "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": "2 existing vulnerabilities detected",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 40 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "indirect_dependencies_free_of_known_advisories",
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 40
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 2,
              "affected_packages": 2,
              "assessed_packages": 40,
              "unassessed_packages": 0,
              "affected_by_severity": "unknown 2",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 40,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 81,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.885,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 3317
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "77 of 87 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 77,
                      "sampled": 87
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.64,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "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": "64 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 64,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 31955,
              "source_files_sampled": 40,
              "oversized_source_files": 0
            },
            "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": "0/40 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 40,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-26T15:40:30.208011Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/aksisonline/gitswitch.svg",
  "full_name": "aksisonline/gitswitch",
  "license_state": "absent",
  "license_spdx": null
}

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

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

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