taken?
taken? answers one question before you volunteer for a GitHub issue: is it
already taken?
The catch it was built for: GitHub shows "linked a pull request" events in the
issue timeline, but never in the comments. You can read every comment on an
issue and still miss that someone already opened a PR for it. taken? checks
the timeline, scans comments for people claiming the work, looks at assignees,
reads CONTRIBUTING.md for AI contribution policies, and checks whether the
repo is still active. Then it gives a verdict, GO, TAKEN, or CAUTION, with the
evidence cited.
Requirements
- Python 3.10 or newer
- The GitHub CLI (
gh), authenticated
taken? only makes read-only API calls through your own gh login. It never
sees or stores tokens, and it never writes anything to GitHub.
Install as a tool
uv tool install taken-gh
taken owner/repo#123
Or with pipx:
pipx install taken-gh
taken owner/repo#123
Usage
uv run taken owner/repo#123
A full issue URL works too:
uv run taken https://github.com/owner/repo/issues/123
Useful flags:
--json: print the full findings as JSON instead of the human summary--me LOGIN: ignore your own comments when scanning for claimants--file PATH: read targets from a file, one per line--limit N: scan mode checks at most N open issues per repo (default: 20)--label LABEL: scan mode only considers open issues carrying this label--no-cache: bypass the API response cache--version,--help
Exit codes: 0 means GO, 1 means TAKEN, 2 means CAUTION, 3 means something
broke (bad target, no gh, API error). With several targets the exit code
is 0 when every target produced a verdict and 3 when any target failed.
Batch mode and repo scans
Give taken several targets and it prints one verdict line per target:
taken owner/repo#123 owner/repo#124 --me mylogin
TAKEN owner/repo#123 assigned to: dk5488
GO owner/repo#124 no linked PRs, no assignees, no claimants, repo is active
A bare owner/repo scans the repo automatically: its open issues
(most recently updated first, PRs excluded) are each checked:
taken django/django --label "good first issue" --limit 10
API responses are cached for one hour in ~/.cache/taken
(override with TAKEN_CACHE_DIR), so repeated scans stay cheap.
--no-cache skips the cache.
JSON output
taken --json owner/repo#123 prints an object with three keys:
verdict: one ofGO,TAKEN,CAUTIONreasons: list of human-readable strings explaining the verdictfindings: the raw check results:target: e.g.owner/repo#123issue:number,state,title,labels,assignees,comment_count,author,url,created_atlinked_prs: list ofnumber,title,state,merged,author,urlclaimants: list ofauthor,date,pattern,snippet,urlai_policy:verdict(ban,disclosure-required, ornone-found),snippet,sourcerepo_health:pushed_at,pushed_recently,recent_merges,stars
Examples
An issue with a PR already fixing it:
$ uv run taken Exodus-Privacy/exodus#300
taken? Exodus-Privacy/exodus#300
verdict: TAKEN
...
why:
- open PR #700 already covers this: https://github.com/Exodus-Privacy/exodus/pull/700
An issue someone is already assigned to:
$ uv run taken chahe-dridi/vscode-agent-bell#200
taken? chahe-dridi/vscode-agent-bell#200
verdict: TAKEN
...
why:
- assigned to: dk5488
A clean issue, with your own volunteering comment filtered out:
$ uv run taken snowflakedb/snowflake-cli#3145 --me RogueAlg0
taken? snowflakedb/snowflake-cli#3145
verdict: GO
...
why:
- no linked PRs, no assignees, no claimants, repo is active
How the verdict works
TAKEN wins over CAUTION, which wins over GO.
- TAKEN: the issue is closed, an open PR links to it, or someone is assigned.
- CAUTION: a comment says someone wants it (soft claim, they may have moved on), a linked PR was merged but the issue is still open, the repo has an AI policy to respect, or the repo looks inactive.
- GO: none of the above.
The claimant scan is a heuristic over comment text, not proof. The verdict always prints its evidence so you can judge for yourself.
Development
uv sync # install dev tools (ruff, pytest)
uv run pytest
uv run ruff check
uv run ruff format --check
AI assistance
This project is built with AI assistance, and says so openly. Every contribution is reviewed and understood by its author before it lands.
Release files for taken-gh 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| taken_gh-0.2.0.tar.gz | 29.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| taken_gh-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 41.0 kB
Release files / taken_gh-0.2.0.tar.gz
| Download URL | taken_gh-0.2.0.tar.gz |
|---|---|
| Size | 29.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
db0ae31bebd0d3d35f51383a689c9eedf38a8d73afb89489ca262df01d74e4a8
|
|
BLAKE2b-256 checksum How to use checksums |
8944ea0c523f4addd32e374aea52f3921b37827b61c33f121e718330bc8df27f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.19 {"installer":{"name":"uv","version":"0.12.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / taken_gh-0.2.0-py3-none-any.whl
| Download URL | taken_gh-0.2.0-py3-none-any.whl |
|---|---|
| Size | 12.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1d3eefb50ec78f5f476eeb97a314586eaebafe65611ff554cb422a590b79986a
|
|
BLAKE2b-256 checksum How to use checksums |
f44792ef33aa2f9c399206a4983e59e4817a022e2c221a7e259496600a2050a9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.19 {"installer":{"name":"uv","version":"0.12.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|