{"id":50970692,"url":"https://github.com/ajardin/kiroshi","last_synced_at":"2026-06-19T02:01:37.594Z","repository":{"id":362574102,"uuid":"1218422058","full_name":"ajardin/kiroshi","owner":"ajardin","description":"Terminal dashboard for your GitHub pull requests, sorted by what's waiting on whom.","archived":false,"fork":false,"pushed_at":"2026-06-04T21:53:38.000Z","size":158,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-04T23:13:02.684Z","etag":null,"topics":["github","golang","jira","pull-requests","tui"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ajardin.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-22T21:30:58.000Z","updated_at":"2026-06-04T21:52:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ajardin/kiroshi","commit_stats":null,"previous_names":["ajardin/kiroshi"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/ajardin/kiroshi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ajardin%2Fkiroshi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ajardin%2Fkiroshi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ajardin%2Fkiroshi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ajardin%2Fkiroshi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ajardin","download_url":"https://codeload.github.com/ajardin/kiroshi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ajardin%2Fkiroshi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34514285,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-19T02:00:06.005Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["github","golang","jira","pull-requests","tui"],"created_at":"2026-06-19T02:01:34.407Z","updated_at":"2026-06-19T02:01:37.573Z","avatar_url":"https://github.com/ajardin.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# kiroshi\n\nA terminal dashboard that classifies your GitHub pull requests by who is\nexpected to act next: **Waiting On You**, **Waiting On Others**,\n**Ready To Ship**, or **In Flight**.\n\nTwo panes, toggled with `tab`: **Incoming** (PRs you're reviewing) and\n**Mine** (PRs you authored). The Mine pane reuses the same four cards with\nauthor-side labels — **Needs You**, **In Review**, **Ready**, **Draft** —\nsplitting whatever your search returns by author, with no extra API calls.\n\nBuilt as a CLI with an optional Bubble Tea TUI. Plain-text output is\navailable for pipes, CI, and any non-TTY context.\n\n## Install\n\n### Homebrew (macOS)\n\n```bash\nbrew install ajardin/tap/kiroshi\n```\n\nThe tap auto-installs, so no separate `brew tap` step is needed. Upgrades\ncome through `brew upgrade` like any other formula.\n\n### Go\n\n```bash\ngo install github.com/ajardin/kiroshi/cmd/kiroshi@latest\n```\n\nRequires Go 1.25 or newer.\n\n### Pre-built binaries\n\nArchives for Linux, macOS, and Windows (amd64/arm64) ship with every tagged\nrelease on the [releases page](https://github.com/ajardin/kiroshi/releases).\nDownload, extract, and put the `kiroshi` binary on your `PATH`.\n\n## Configure\n\nThe fastest way to create the config is the interactive wizard:\n\n```bash\nkiroshi -init\n```\n\nIt prompts for the token, search query, `min_reviews`, an optional\nauto-refresh interval, and optional Jira credentials, validates the token\nagainst GitHub live, and writes the file\n(mode `0600`). kiroshi also launches the wizard automatically the first time\nyou run it on a terminal with no config present. To write the file by hand\ninstead:\n\nkiroshi reads a TOML file from\n`$XDG_CONFIG_HOME/kiroshi/config.toml`\n(or `~/.config/kiroshi/config.toml` when `XDG_CONFIG_HOME` is unset).\n\n```toml\n# ~/.config/kiroshi/config.toml\n\n# Personal access token used to call the GitHub REST API.\n# Can also be supplied via the GITHUB_TOKEN environment variable, which\n# takes precedence over this field. Required scopes:\n#   - repo        (read pull requests in private repos)\n#   - read:org    (resolve org membership for the search query)\ngithub_token = \"ghp_xxxxxxxxxxxxxxxxxxxx\"\n\n# Any valid GitHub issues/search query. The advanced_search backend is\n# forced on automatically so boolean expressions work as expected.\n# `involves:@me` returns both the PRs you authored and the ones you're asked\n# to review; the TUI splits them into two panes (toggle with `tab`).\nsearch = \"is:pr is:open involves:@me archived:false\"\n\n# Minimum number of non-author APPROVED reviews required before kiroshi\n# classifies a pull request as Ready To Ship. Defaults to 2.\nmin_reviews = 2\n\n# Optional auto-refresh cadence for the TUI, as a Go duration (\"30s\", \"5m\",\n# \"1h\"). When set, the dashboard rescans on its own and the footer shows an\n# \"auto \u003cinterval\u003e\" indicator. Omit it (or set 0) to refresh only on demand\n# with the \"r\" key.\nrefresh_interval = \"5m\"\n\n# Optional Jira Cloud integration. When set, kiroshi extracts the issue key\n# from each PR's branch, title, or body (e.g. PROJ-1234) and shows the ticket\n# status in the listing. All three fields are required together; leave them\n# out to disable Jira. The token is a Jira Cloud API token created at\n# https://id.atlassian.com/manage-profile/security/api-tokens and is used with\n# HTTP Basic auth (email + token). jira_token can also be supplied via the\n# JIRA_API_TOKEN environment variable, which takes precedence.\njira_base_url = \"https://your-org.atlassian.net\"\njira_email    = \"you@your-org.com\"\njira_token    = \"xxxxxxxxxxxxxxxxxxxx\"\n```\n\nBoth token fields are redacted from structured logs (see\n`config.Config.LogValue`).\n\n## Run\n\n```bash\nkiroshi                       # interactive TUI when stdout is a terminal\nkiroshi -init                 # interactively create the config file and exit\nkiroshi -no-tui               # plain text, always\nkiroshi -config ./my.toml     # override the config path\nkiroshi -verbose              # debug-level slog output on stderr\nkiroshi -version              # print build metadata and exit\n```\n\nWhen stdout is not a TTY (pipe, file, CI), the TUI is skipped\nautomatically — TTY detection lives in `cli.isTerminal`.\n\n### Keybindings (TUI)\n\n| Key        | Action                          |\n| ---------- | ------------------------------- |\n| ↓/↑        | move selection down / up        |\n| tab        | switch incoming / mine view     |\n| g/G        | jump to top / bottom (or home/end) |\n| enter / o  | open selected PR in browser     |\n| d          | show selected PR detail overlay |\n| r          | rescan from GitHub              |\n| f or /     | filter the visible list         |\n| s          | cycle sort order                |\n| a          | cycle approval filter           |\n| ?          | toggle the keybindings overlay  |\n| q / esc    | quit                            |\n\n## Development\n\n```bash\nmake build     # compile ./bin/kiroshi\nmake test      # go test -race -count=1 ./...\nmake bench     # baseline benchmarks (enrichment hot path)\nmake cover     # coverage report\nmake lint      # golangci-lint v2\nmake fmt       # gofmt + goimports via golangci-lint\n```\n\nInstall the pre-commit hooks once to mirror the CI checks locally:\n\n```bash\npip install pre-commit \u0026\u0026 pre-commit install\n```\n\nTo preview the TUI without launching a real session:\n\n```bash\ngo test -v -run TestPreview ./internal/tui\n```\n\n(Use `rtk proxy go test ...` if you have rtk installed and want raw\noutput instead of token-filtered.)\n\n## Architecture\n\n`internal/cli` parses flags and wires the GitHub client to either the\nTUI or plain-text renderer. `internal/gh` is a narrow wrapper around\n[`go-github`](https://github.com/google/go-github) that adds REST\nenrichment (review state, CI checks, diff stats) in parallel across PRs.\n`internal/tui` is a custom Bubble Tea model — see `CLAUDE.md` for the\nlocked color palette, bucket semantics, and CI-state aggregation rules.\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fajardin%2Fkiroshi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fajardin%2Fkiroshi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fajardin%2Fkiroshi/lists"}