Звіт у форматі 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
}