Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 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.

GoЛіцензію не виявлено★ 36 зірок⑂ 0 форківз квіт. 2026 р.Переглянути на GitHub ↗

aksisonline/gitswitch має індекс здоров’я 55 зі 100, що відповідає смузі «Помірний». Найвищий показник — AI Readiness (81/100), найнижчий — Community & Adoption (25/100). Останнє оновлення було 16 днів тому. Більшість нещодавньої роботи виконує один учасник.

55
загалом / 100
Помірний

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

55
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

Abhiram Kanna SeelamanthulaОсобистий обліковий запис
13 підписників63 публічні репозиторіїз серп. 2021 р.@Edirq-RE

Цей репозиторій належить особистому обліковому запису. Проєкт з єдиним власником несе більший ризик безперервності, ніж підтримуваний організацією.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
Gogithub.com/aksisonline/gitswitchv0.2.3-4917 днів тому

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

73Добрий · 22% загального індексу
Як обчислюється оцінка
28.8/36Свіжість push — останній push 16 дн. тому
5.5/36Ритм комітів — 8/52 тижнів із комітами
18/18Обсяг комітів — 152 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year152
human_commit_share0,87
days_since_last_push16
active_weeks_last_year8
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 43 релізів
36/36Свіжість релізів — останній реліз 17 дн. тому
27/27Ритм релізів — реліз кожні ~1,2 дн.
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Використані вхідні дані
releases_count43
latest_release_tagv0.2.3
releases_from_tagsні
days_since_latest_release17
mean_days_between_releases1,2

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

25Критичний · 18% загального індексу
Як обчислюється оцінка
25/60Зірки — 36 зірок
0/25Форки — 0 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks0
stars36
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
0/22.5Ліцензія — файлу ліцензії не виявлено
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseні
has_contributingні
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

55Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
3/22.5Розподіл комітів — головний контриб’ютор — автор 87% комітів
2.7/13.5Широта контриб’юторів — 2 контриб’юторів
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Використані вхідні дані
bus_factor1
contributors_sampled2
top_contributor_share0,867
Як обчислюється оцінка
0/46.8Вирішення issue — немає issue або даних
36.1/38.3Прийняття PR — злито 17/18 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/21 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs17
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs1
Виключено з оцінювання (немає даних або не застосовно): Вирішення issue. Залишкові ваги перенормовано.
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
8.2/25Охоплення власника — 13 підписників у aksisonline
22.9/25Послужний список — 63 публічних репозиторіїв, вік облікового запису ~4 р.
Використані вхідні дані
followers13
owner_typeUser
is_verified
owner_loginaksisonline
public_repos63
account_age_days1 810
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у go
35/35Свіжість публікацій — остання публікація 17 дн. тому
20/20Історія версій — 49 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesgithub.com/aksisonline/gitswitch
ecosystemsgo
any_deprecatedні
min_days_since_publish17

Інженерна якість

Чи наявні базові інженерні практики та документація?

69Помірний · 20% загального індексу

Інженерні практики

48У зоні ризику
Як обчислюється оцінка
24/24Процеси CI — 3 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-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
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні

Документація

100Відмінний
Як обчислюється оцінка
30/30README
25/25Каталог документації
15/15Сайт документації / домашня сторінка — https://gitswitch.dev
10/10Опис репозиторію
10/10Теми — 5 тем
10/10Wiki
Використані вхідні дані
topicsgh, git, git-config, github, local
has_wikiтак
homepagehttps://gitswitch.dev
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

48У зоні ризику · 16% загального індексу

Стан безпеки

35У зоні ризику
Як обчислюється оцінка
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.5Ліцензія — 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
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3,5
Як обчислюється оцінка
35/35Прямі залежності без відомих сповіщень — жодна пряма залежність не має відомих сповіщень
0/25Непрямі залежності без відомих сповіщень — транзитивний набір не відокремлюється від залежностей розробки й тестування в цьому обсязі
0/40Немає задавнених сповіщень — жодне сповіщення не має дати публікації
Використані вхідні дані
sourceosv
advisories2
affected_packages2
assessed_packages40
unassessed_packages0
affected_by_severityunknown 2
direct_affected_packages0
Виключено з оцінювання (немає даних або не застосовно): Непрямі залежності без відомих сповіщень, Немає задавнених сповіщень. Залишкові ваги перенормовано. Звірено 40 резолвлених залежностей із OSV. Цей репозиторій не публікує пакета, який резолвить індекс, тож натомість оцінено граф залежностей репозиторію. Цей граф змішує закріплені версії для розробки й тестування зі справді постачаними залежностями, тож оцінюються лише задекларовані runtime-залежності; транзитивні знахідки подаються як контекст і в оцінку не входять. Досяжність не аналізується.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

81Добрий · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 77 з 87 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,885
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes3 317
Як обчислюється оцінка
18/18Розгортання однією командою — Makefile
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — Go (статично типізована)
10/10Відтворюване середовище — lockfile
10/10Підтверджена практика роботи з агентами — 64 з останніх 100 комітів створено агентом або з його зазначенням
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfilesgo.sum
has_dockerfileні
typed_languageтак
bootstrap_filesMakefile
has_devcontainerні
has_linter_configні
typecheck_configs
agent_commit_share0,64
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — Go (статично типізована)
55/55Керовані розміри файлів — 0/40 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageGo
largest_source_bytes31 955
source_files_sampled40
oversized_source_files0

Ключові факти

36зірок GitHub
2контриб'юторів
152комітів за останні 12 місяців
16днів від останнього пушу
43релізів
1бас-фактор
0відкритих issue
Goпакетних екосистем

Попередження щодо збору даних

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

Докладніше

OpenSSF Scorecard 3.5 / 10
3.5сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).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
Прямі залежності 11
РеєстрПакетОбмеження версіїМаніфест
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
Усі залежності 40

Повний розв'язаний набір залежностей із графа залежностей GitHub: 11 прямих і 29 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

РеєстрПакетВерсіяЗв'язок
Gogithub.com/charmbracelet/bubblesv1.0.0пряма
Gogithub.com/charmbracelet/bubbleteav1.3.10пряма
Gogithub.com/charmbracelet/harmonicav0.2.0пряма
Gogithub.com/charmbracelet/huhv1.0.0пряма
Gogithub.com/charmbracelet/lipglossv1.1.0пряма
Gogithub.com/charmbracelet/x/ansiv0.11.6пряма
Gogithub.com/cli/oauthv1.2.2пряма
Gogithub.com/mattn/go-isattyv0.0.20пряма
Gogithub.com/spf13/cobrav1.7.0пряма
Gogithub.com/zalando/go-keyringv0.2.8пряма
Gogopkg.in/yaml.v3v3.0.1пряма
Gogithub.com/atotto/clipboardv0.1.4непряма
Gogithub.com/aymanbagabas/go-osc52/v2v2.0.1непряма
Gogithub.com/catppuccin/gov0.3.0непряма
Gogithub.com/charmbracelet/colorprofilev0.4.1непряма
Gogithub.com/charmbracelet/x/cellbufv0.0.15непряма
Gogithub.com/charmbracelet/x/exp/stringsv0.0.0-20240722160745-212f7b056ed0непряма
Gogithub.com/charmbracelet/x/termv0.2.2непряма
Gogithub.com/cli/browserv1.0.0непряма
Gogithub.com/cli/safeexecv1.0.0непряма
Gogithub.com/clipperhouse/displaywidthv0.9.0непряма
Gogithub.com/clipperhouse/stringishv0.1.1непряма
Gogithub.com/clipperhouse/uax29/v2v2.5.0непряма
Gogithub.com/danieljoos/wincredv1.2.3непряма
Gogithub.com/dustin/go-humanizev1.0.1непряма
Gogithub.com/erikgeiser/coninputv0.0.0-20211004153227-1c3628e74d0fнепряма
Gogithub.com/godbus/dbus/v5v5.2.2непряма
Gogithub.com/inconshreveable/mousetrapv1.1.0непряма
Gogithub.com/lucasb-eyer/go-colorfulv1.3.0непряма
Gogithub.com/mattn/go-localereaderv0.0.1непряма
Gogithub.com/mattn/go-runewidthv0.0.19непряма
Gogithub.com/mitchellh/hashstructure/v2v2.0.2непряма
Gogithub.com/muesli/ansiv0.0.0-20230316100256-276c6243b2f6непряма
Gogithub.com/muesli/cancelreaderv0.2.2непряма
Gogithub.com/muesli/termenvv0.16.0непряма
Gogithub.com/rivo/unisegv0.4.7непряма
Gogithub.com/spf13/pflagv1.0.5непряма
Gogithub.com/xo/terminfov0.0.0-20220910002029-abceb7e1c41eнепряма
Gogolang.org/x/sysv0.38.0непряма
Gogolang.org/x/textv0.23.0непряма
Сповіщення про залежності 2

Цей репозиторій не публікує пакета, який розпізнає індекс, тож оцінено його власний граф залежностей — 40 пакетів, серед яких є й піниї розробки та тестування, що ніколи не постачаються: 2 мають відомі сповіщення, з них 0 прямі.

ПакетВерсіяЗв'язокКритичністьСповіщеньВиправлено в
golang.org/x/sysv0.38.0непряманевідома10.44.0
golang.org/x/textv0.23.0непряманевідома10.39.0

Сповіщення означає, що версія, записана в графі залежностей, потрапляє в уражений діапазон. Досяжність не аналізується, а граф містить піниї розробки й тестування — знахідка може стосуватися інструментів, а не поставленого коду.

Звіт у форматі JSON машиночитний
{
  "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
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.27.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистикаGo.