{"id":51069171,"url":"https://github.com/cdhagmann/gem-contribute","last_synced_at":"2026-06-23T09:01:36.065Z","repository":{"id":354323985,"uuid":"1223127538","full_name":"cdhagmann/gem-contribute","owner":"cdhagmann","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-05T13:14:29.000Z","size":646,"stargazers_count":1,"open_issues_count":19,"forks_count":3,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-05T14:34:44.046Z","etag":null,"topics":["cli","ruby","rubygems"],"latest_commit_sha":null,"homepage":"https://cdhagmann.com/gem-contribute/","language":"Ruby","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/cdhagmann.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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-28T03:10:30.000Z","updated_at":"2026-05-05T13:19:09.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/cdhagmann/gem-contribute","commit_stats":null,"previous_names":["cdhagmann/gem-contribute"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cdhagmann/gem-contribute","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdhagmann%2Fgem-contribute","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdhagmann%2Fgem-contribute/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdhagmann%2Fgem-contribute/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdhagmann%2Fgem-contribute/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cdhagmann","download_url":"https://codeload.github.com/cdhagmann/gem-contribute/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdhagmann%2Fgem-contribute/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34682633,"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-23T02:00:07.161Z","response_time":65,"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":["cli","ruby","rubygems"],"created_at":"2026-06-23T09:01:34.930Z","updated_at":"2026-06-23T09:01:36.051Z","avatar_url":"https://github.com/cdhagmann.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gem-contribute\n\n[![CI](https://github.com/cdhagmann/gem-contribute/actions/workflows/ci.yml/badge.svg)](https://github.com/cdhagmann/gem-contribute/actions/workflows/ci.yml)\n\nFind contributable issues in the gems your project already depends on.\n\n```\n$ gem-contribute scan\nScanning Gemfile.lock (44 gems)...\n44 gems · 42 on github.com · 2 unknown source\n\nTop contributable projects (by open contributable issue count):\n  rubocop          4  github.com/rubocop/rubocop\n  rspec            1  github.com/rspec/rspec\n  rspec-core       1  github.com/rspec/rspec\n  reline           1  github.com/ruby/reline\n  ...\n  gem-contribute   1  github.com/cdhagmann/gem-contribute\n```\n\nThe premise: the gems in your `Gemfile.lock` are the projects you have the most context on. If you depend on `sidekiq`, you have opinions about Sidekiq. That's a better starting point for open-source contribution than scanning all of GitHub for `good-first-issue` tags and hoping one looks interesting.\n\n## Status\n\nv0.x; the first 1.0-track release ships via [Trusted Publishing](https://guides.rubygems.org/trusted-publishing/) on rubygems.org once the polish phase lands.\n\nThe 1.0 surface is the standalone CLI shown above. The roadmap that follows it:\n\n- **v1.x** — `bundle contribute` and `gem contribute` plugins (so the tool is reachable from whatever invocation surface you're already in), plus multi-host adapters (GitLab, gem.coop). Same CLI shape; additional entry points and additional sources.\n- **v2.0** — Rooibos TUI as the bare-invocation experience for `gem-contribute`. Major version because bare-invocation behavior changes when the TUI auto-launches. ([issue #2](https://github.com/cdhagmann/gem-contribute/issues/2))\n\n[`docs/ROADMAP.md`](docs/ROADMAP.md) has the detail; [ADR-0015](docs/adr/0015-descope-v1-cli-only.md) explains why this sequencing.\n\n## Install\n\n```\ngem install gem-contribute\n```\n\nRequires Ruby 3.2 or later.\n\n## Usage\n\nThe CLI is a small set of subcommands:\n\n```\ngem-contribute init                   One-time interactive setup (sets clone_root, then auth).\ngem-contribute scan [path]            Summarize the contributable surface of a Gemfile.lock.\ngem-contribute issues \u003cgem|all\u003e       List contributable issues for one gem (or all).\ngem-contribute auth login             Authenticate with GitHub via OAuth device flow.\ngem-contribute fork \u003cgem|owner/repo\u003e  Fork and clone any GitHub repo, land on the default branch.\ngem-contribute fix \u003cgem\u003e/\u003cissue#\u003e     Fork, clone, and branch from main for a specific issue.\ngem-contribute submit                 Push the branch and open a pre-filled PR in the browser.\ngem-contribute config set \u003ckey\u003e \u003cval\u003e Persist user preferences (e.g. clone_root).\n```\n\nA typical session:\n\n```sh\n$ gem-contribute init                    # one-time: sets clone_root, then auth via GitHub device flow\n$ gem-contribute scan                    # see what's worth contributing to\n$ gem-contribute issues rubocop          # drill into one project's issues\n$ gem-contribute fix rubocop/12345       # fork, clone, branch\n$ cd ~/code/oss/rubocop/rubocop          # whatever clone_root you set during init\n# ... make your change, commit ...\n$ gem-contribute submit                  # push + open the PR compare page in your browser\n```\n\nOr, when you want to look around a project before picking an issue, use `fork`:\n\n```sh\n$ gem-contribute fork rubocop                       # fork-and-clone a gem by name\n$ gem-contribute fork rubyevents/rubyevents -e      # fork-and-clone any GitHub repo and open your editor\n```\n\n`fork` does the same fork-clone-upstream sequence as `fix` but stops on the default branch — no issue branch, no comment. Handy for \"build it locally and decide what to fix later.\" When you've picked an issue, `gem-contribute fix \u003cgem\u003e/\u003cissue#\u003e` branches off cleanly.\n\nThe auth step (run automatically by `init`, or directly via `gem-contribute auth login`) opens GitHub's device-flow page in your browser and copies the one-time code to your clipboard — same UX as `gh auth login`, no token paste, no client secret. Tokens cache at `~/.config/gem-contribute/auth.json` (mode 0600).\n\n## Configuration\n\nUser config lives at `~/.config/gem-contribute/config.yml`. The interactive way to set it is `gem-contribute init`; for scripted setup, use `gem-contribute config`:\n\n```sh\ngem-contribute config set clone_root ~/Projects/oss\ngem-contribute config list\n```\n\n| Key                | Default | Notes |\n|--------------------|---------|-------|\n| `clone_root`       | _(none)_ | Where `fix` and `fork` clone repos (`\u003croot\u003e/\u003cowner\u003e/\u003crepo\u003e`). Set via `init` or `config set`. `fix` errors if unset. |\n| `editor`           | `$EDITOR` | Editor launched by `fix -e` / `fork -e`. Falls back to `$EDITOR` if unset. |\n| `ai_tool`          | _(none)_ | AI coding tool launched by `fix -a` / `fork -a` with the clone directory as cwd. |\n| `comment_on_fix`   | `true` | Post a \"working on this\" comment on the issue when `fix` runs. Set to `false` to opt out globally; use `--no-comment` to opt out per invocation. |\n| `preferred_labels` | `[\"good first issue\", \"good-first-issue\", \"help wanted\"]` | Labels `scan` and `issues` query when counting contributable work. Each label is fetched separately (GitHub's API applies AND logic when labels are joined), then deduplicated by issue number. Pass a comma-separated string or set a YAML list directly. |\n\nPer-repo comment overrides (`comment_on_fix_overrides`) are YAML-only — edit `~/.config/gem-contribute/config.yml` directly:\n\n```yaml\ncomment_on_fix_overrides:\n  owner/repo: false\n```\n\n## Design\n\nSee [`docs/design.md`](docs/design.md) for the architecture overview and [`docs/adr/`](docs/adr/) for individual decisions with their reasoning. The short version: scan first, auth lazily, abstract the source host so GitHub isn't the only option forever, render the data as the maintainer wrote it (don't normalize labels, don't summarize CONTRIBUTING).\n\n## Contributing\n\nThe tool is *for* finding contributable projects, so it had better be one. See [`CONTRIBUTING.md`](CONTRIBUTING.md). Issues tagged [`good first issue`](https://github.com/cdhagmann/gem-contribute/labels/good%20first%20issue) are real and reviewed; issues with [`v1.x`](https://github.com/cdhagmann/gem-contribute/labels/v1.x) and [`v2.0`](https://github.com/cdhagmann/gem-contribute/labels/v2.0) labels indicate which release they're targeted at.\n\n## Disclosure\n\nBuilt with substantial assistance from Claude (Anthropic). Architecture, design decisions, and code review are mine; a fair amount of the typing isn't. Decisions are documented in `docs/adr/` partly so the reasoning is auditable independent of who or what produced the diff.\n\n## License\n\nMIT.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcdhagmann%2Fgem-contribute","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcdhagmann%2Fgem-contribute","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcdhagmann%2Fgem-contribute/lists"}