Skip to the content.

Roadmap

v1.0 ships the standalone gem-contribute CLI on rubygems.org against github.com. Output-free service layer (per ADR-0012), real release on rubygems with Trusted Publishing, CHANGELOG, CI.

v1.x adds Bundler plugin (bundle contribute), RubyGems plugin (gem contribute), multi-host adapters (GitLab, gem.coop), and other extensions that ride the existing CLI shape. Architecture for these is locked in (per ADR-0014); shipping is sequenced after 1.0 lands real users.

v2.0 ships the Rooibos TUI as the bare-invocation experience for gem-contribute. Major version because bare-invocation behavior changes.

The descope of TUI and plugins from v1.0 is recorded in ADR-0015.

This document is the plan. Decisions still in flight live in OPEN_QUESTIONS.md and get resolved one at a time.

🌱 marks a good first issue β€” small, self-contained scope, friendly for someone new to the codebase.

Decision history (the short version)


What’s already done

In flight

Nothing β€” Phase 6 polish is landing. See Phase 6 below.

What hasn’t started


v1.0 β€” Standalone CLI

Phase 0 β€” Reset workshop-era decisions (DONE)

Two new ADRs landed:

ADR header sweep done in commit 00f5a4c. Doc sweeps:

A third descope ADR landed later: ADR-0015 β€” moves plugins to v1.x and TUI to v2.0.


Phase 1 β€” Service layer (ADR-0012 Phase 1) (DONE)

Made every operation output-free and Result-returning. This is what lets the eventual TUI and plugins reuse the same code paths the standalone CLI uses. Merged via PR #48 on 2026-05-04.

Steps:

  1. Add dry-monads, dry-operation, dry-initializer to gemspec.
  2. Remove stdout: from Operations::Fork and Operations::Clone.
  3. Define Operations::Clone::Result = Data.define(:path, :reused) (currently returns a bare path).
  4. Convert both operations to return Success(Result) / Failure(reason).
  5. Convert Workflow#build_adapter to return Success(adapter) / Failure(:unauthenticated).
  6. Extract Operations::Branch (from inline branch logic in CLI::Fix) and Operations::Announce (from CLI::IssueAnnouncer).
  7. Build Operations::FixPipeline using dry-operation to compose Fork β†’ Clone β†’ Branch β†’ Announce.
  8. Replace verbose initializers in CLI::Fork/CLI::Fix with dry-initializer (kills the rubocop suppressions).
  9. Update CLI verbs to pattern-match on Result. Retire Workflow#with_workflow_rescues.

Acceptance:

Issues:


Phase 2 β€” CLI pipeline (ADR-0012 Phase 2) (DONE)

Moved CLI verbs to a semantic output abstraction so the look-and-feel can evolve independently of the service layer. Merged via PR #51 on 2026-05-04.

Steps:

  1. Introduce Output::Standard (wraps stdout/stderr; #info, #warn, #error, #progress).
  2. Introduce Output::Null (for tests).
  3. Replace raw @stdout / @stderr in every CLI verb with @output.
  4. Add tty-spinner for Output::Standard#progress.
  5. Replace CLI::Init’s stdout.print + @gets with tty-prompt.

Acceptance:

Issues:


Phase 6 β€” Polish, release infrastructure, v1.0

Everything required to call it 1.0 and not 0.x. Phase number stays at 6 to preserve the existing phase:6 issue labels and historical references; in the post-ADR-0015 ordering it’s the third remaining v1.0 phase.

Pre-existing user-facing issues that fold into this phase:

Release infrastructure:


Sequencing logic for v1.0


v1.x β€” Plugins, multi-host adapters, polish extensions

Each item below is independently shippable as a 1.x point release (1.1, 1.2, …). Sequencing is a runtime call informed by what 1.0 users actually ask for.

Bundler plugin (bundle contribute)

A plugins.rb entry point at the root of the gem registers a Bundler plugin command per Bundler convention. Delegates to the same dispatch table the standalone CLI uses.

Constraints:

Acceptance:

Issue: #38 β€” Bundler plugin: bundle contribute entry point

RubyGems plugin (gem contribute)

A rubygems_plugin.rb entry point registers a Gem::Command subclass per RubyGems convention. Same dispatch table.

Constraints:

Acceptance:

Issue: #39 β€” RubyGems plugin: gem contribute Gem::Command

Multi-host adapters

ADR-0011’s HostAdapter architecture is the bet that pays off here. Each host is its own adapter implementing the same interface (fork, comment, pull_request_url, etc.).

Other v1.x candidates


v2.0 β€” Rooibos TUI

Umbrella issue: #2 β€” Implement Rooibos TUI on top of the v0.1 CLI. The major work. Per design.md and ADR-0013. v2.0 because bare-invocation behavior changes (gem-contribute with no args goes from β€œprint USAGE” to β€œlaunch TUI”); existing pipe-into-CLI scripts would otherwise break.

Pre-work (Q7 verification):

Fragments:

(The world map fragment stays post-v2.0 β€” awaits adoption to make the data interesting. Framework choice locked in now per ADR-0013.)

Wiring:

Key contracts:

Acceptance:

Issues (under umbrella #2):


Out of scope (any version)

🌱 #5 itself stays open indefinitely as a sandbox for new contributors to practice the fix β†’ submit loop.


Issue tracking

All roadmap work is tracked on the issue tracker. Filter by label:

Bucket Issues Notes
Phase 0 (DONE) #23, #24 Two doc sweeps
Phase 1 (DONE) #25–#28 Service layer (ADR-0012)
Phase 2 (DONE) #29–#31 CLI output pipeline
Phase 6 (v1.0 polish + release) #1, #9, #10, #40–#46, #54 Release infra + papercut polish
v1.x #3, #8, #38, #39, #47, #49, #50 Plugins, multi-host, extensions
v2.0 #2 (umbrella), #13, #32–#37 Rooibos TUI

Out-of-scope items don’t get version labels. #5 (sandbox) stays without phase or version labels.