- Commits = issue events (creation, comments, state changes)
- Refs = issue identity (refs/issues/<uuid>)
- Trailers = structured metadata (same format as Signed-off-by)
- Merge commits = conflict resolution
- Fetch/push = sync
Usage: $ git issue create "Fix login crash" -l bug -p high
$ git issue ls -f full
$ git issue show a7f3b2c
$ git issue sync github:owner/repo
The architecture follows Git's own philosophy: the core only knows commits, refs, and trailers. Platform bridges (GitHub, GitLab, Gitea/Forgejo) are separate scripts that translate between APIs and git primitives. New platform = new bridge, core doesn't change. brew install remenoscodes/git-native-issue/git-native-issue
# or
curl -sSL https://raw.githubusercontent.com/remenoscodes/git-native-issue/main/install.sh | sh
The markdown files approach gives you grep/ag/rg search for free, which is a real advantage. And the repo-prefix + sequential ID scheme is definitely more memorable than UUIDs for daily use.
A couple of questions after reading the code:
- With a single refs/issues/latest branch for all issues, what happens when two contributors work offline on different issues and then push? Seems like it would produce a merge even though the issues are independent, does that cause friction in practice?
- On the ID scheme: gen_repo_id() generates 6 chars from a 22-letter alphabet. Two clones getting the same prefix is unlikely but not impossible. Have you considered what happens if it collides?