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