gem-contribute 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6f6941e81cacd8ab2bb7abb6824bb54d5b04ec05789d24c792b48eb4c5125e02
4
- data.tar.gz: 9a548392f2d027dbc99719d74de627940086e3858fd5c5152fa8d4ecffddb7b8
3
+ metadata.gz: 1ba185bef64e34f7c11bce3b56e18dc85f9a937a597db98615977b8b29d0306a
4
+ data.tar.gz: f1f2c4b77dca2e77da8eaa188a3a2db6d87d4c62eef471c3e9e8d13faff3ecc5
5
5
  SHA512:
6
- metadata.gz: 1a4c00ea48ba2ef0245f3564d97b2bb0e6d3eb7098a79ef598a58dda95c6130630648e04351e8a5ef7f767456d938a836c647aa02c18d7b22663816a6b9d7d2e
7
- data.tar.gz: 1d60a359d87cc17ba4e2c8bad1acab5f039334df63afd34055165d1a61b569e3c9c7fd57f5159d33ed0031e7634cabb93fd1b82e52f36cd4a5d0e30bfd2ef2ca
6
+ metadata.gz: 6a52e54602d58024cc94db5cd353556b0f0d18ea6b07a5647a918a96c748547b692531a53ee1f6a1fd7e7a887b9cf30650edce9568a84a76d993245b68d35661
7
+ data.tar.gz: 9c4b75036cb2091312b1405797ebea50fe9ab1103ae793081834c03a5e18a1151c006f127e84f160b234a8ab6b8037e243bf3d09feea962daeb8854f96c3770b
data/.gem_release.yml ADDED
@@ -0,0 +1 @@
1
+ file: lib/gem_contribute/version.rb
@@ -0,0 +1,22 @@
1
+ ## Summary
2
+
3
+ <!-- One or two sentences. What changes, and why. The "why" is the part that's hard to recover later. -->
4
+
5
+ ## Review preference
6
+
7
+ Lowering friction is the whole point of this project. Pick whichever fits — defaults to the first if you don't tick anything.
8
+
9
+ - [ ] **Ship it.** Review for correctness, tests, and design fit. Skip style nits unless they're load-bearing.
10
+ - [ ] **Full review, please.** Feedback on style, naming, idioms, and alternative designs welcome. I want the deep version, whether to learn the Ruby way or to stress-test a pattern I'm trying.
11
+
12
+ ## Working agreement check
13
+
14
+ - [ ] Single concern (multi-concern PRs get bounced — see [CLAUDE.md](../CLAUDE.md))
15
+ - [ ] ADRs touched: <!-- list ADR numbers, or "none" -->
16
+ - [ ] `bin/rubocop` and `bin/rspec` pass locally
17
+ - [ ] New behavior has a test; bug fix has a regression test
18
+ - [ ] Async work goes through Rooibos Commands (no direct threads / `Async` / synchronous shellouts)
19
+
20
+ ## Notes for reviewer
21
+
22
+ <!-- Tradeoffs, open questions, follow-ups — anything not obvious from the diff. -->
data/CHANGELOG.md CHANGED
@@ -4,6 +4,21 @@ All notable changes to this project will be documented here. The format is based
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.2.0] - 2026-05-02
8
+
9
+ ### Added
10
+
11
+ - `gem-contribute init` — interactive first-run setup: prompts for `clone_root` and chains into `auth login` when no token is cached. Users who skip it can run each step separately at any time.
12
+ - Rate-limit footer after `scan` and `issues` runs: `GitHub rate limit: 4,587 / 5,000 remaining · resets at 14:32 UTC`. Surfaced so users know whether a degraded run is seconds or minutes away from recovering (closes [#4](https://github.com/cdhagmann/gem-contribute/issues/4)).
13
+
14
+ ### Changed
15
+
16
+ - `gem-contribute fix` now errors with an `init` hint when `clone_root` is not configured, instead of silently defaulting to `~/code/oss/`. Existing users with a configured `clone_root` are unaffected (closes [#15](https://github.com/cdhagmann/gem-contribute/issues/15)).
17
+
18
+ ### Fixed
19
+
20
+ - `gem-contribute submit` no longer requires an `upstream` remote. When only `origin` is present (e.g. when dogfooding on your own repo), it treats `origin` as the upstream and emits a same-repo compare URL. The cross-fork path is unchanged for normal contributors.
21
+
7
22
  ## [0.1.0] - 2026-04-28
8
23
 
9
24
  ### Added
@@ -0,0 +1,86 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ Version 3.0.
4
+
5
+ ## Our Pledge
6
+
7
+ We pledge to make our community welcoming, safe, and equitable for all.
8
+
9
+ We are committed to fostering an environment that respects and promotes the dignity, rights, and contributions of all individuals, regardless of characteristics including race, ethnicity, caste, color, age, physical characteristics, neurodiversity, disability, sex or gender, gender identity or expression, sexual orientation, language, philosophy or religion, national or social origin, socio-economic position, level of education, or other status. The same privileges of participation are extended to everyone who participates in good faith and in accordance with this Covenant.
10
+
11
+ ## Encouraged Behaviors
12
+
13
+ While acknowledging differences in social norms, we all strive to meet our community's expectations for positive behavior. We also understand that our words and actions may be interpreted differently than we intend based on culture, background, or native language.
14
+
15
+ With these considerations in mind, we agree to behave mindfully toward each other and act in ways that center our shared values, including:
16
+
17
+ 1. Respecting the **purpose of our community**, our activities, and our ways of gathering.
18
+ 2. Engaging **kindly and honestly** with others.
19
+ 3. Respecting **different viewpoints** and experiences.
20
+ 4. **Taking responsibility** for our actions and contributions.
21
+ 5. Gracefully giving and accepting **constructive feedback**.
22
+ 6. Committing to **repairing harm** when it occurs.
23
+ 7. Behaving in other ways that promote and sustain the **well-being of our community**.
24
+
25
+ ## Restricted Behaviors
26
+
27
+ We agree to restrict the following behaviors in our community. Instances, threats, and promotion of these behaviors are violations of this Code of Conduct.
28
+
29
+ 1. **Harassment.** Violating explicitly expressed boundaries or engaging in unnecessary personal attention after any clear request to stop.
30
+ 2. **Character attacks.** Making insulting, demeaning, or pejorative comments directed at a community member or group of people.
31
+ 3. **Stereotyping or discrimination.** Characterizing anyone's personality or behavior on the basis of immutable identities or traits.
32
+ 4. **Sexualization.** Behaving in a way that would generally be considered inappropriately intimate in the context or purpose of the community.
33
+ 5. **Violating confidentiality.** Sharing or acting on someone's personal or private information without their permission.
34
+ 6. **Endangerment.** Causing, encouraging, or threatening violence or other harm toward any person or group.
35
+ 7. Behaving in other ways that **threaten the well-being** of our community.
36
+
37
+ ### Other Restrictions
38
+
39
+ 1. **Misleading identity.** Impersonating someone else for any reason, or pretending to be someone else to evade enforcement actions.
40
+ 2. **Failing to credit sources.** Not properly crediting the sources of content you contribute.
41
+ 3. **Promotional materials.** Sharing marketing or other commercial content in a way that is outside the norms of the community.
42
+ 4. **Irresponsible communication.** Failing to responsibly present content which includes, links or describes any other restricted behaviors.
43
+
44
+ ## Reporting an Issue
45
+
46
+ Tensions can occur between community members even when they are trying their best to collaborate. Not every conflict represents a code of conduct violation, and this Code of Conduct reinforces encouraged behaviors and norms that can help avoid conflicts and minimize harm.
47
+
48
+ When an incident does occur, it is important to report it promptly. To report a possible violation, email **gem.contribute@cdhagmann.com**. Reports are read by the project maintainer.
49
+
50
+ Community Moderators take reports of violations seriously and will make every effort to respond in a timely manner. They will investigate all reports of code of conduct violations, reviewing messages, logs, and recordings, or interviewing witnesses and other participants. Community Moderators will keep investigation and enforcement actions as transparent as possible while prioritizing safety and confidentiality. In order to honor these values, enforcement actions are carried out in private with the involved parties, but communicating to the whole community may be part of a mutually agreed upon resolution.
51
+
52
+ ## Addressing and Repairing Harm
53
+
54
+ If an investigation by the Community Moderators finds that this Code of Conduct has been violated, the following enforcement ladder may be used to determine how best to repair harm, based on the incident's impact on the individuals involved and the community as a whole. Depending on the severity of a violation, lower rungs on the ladder may be skipped.
55
+
56
+ 1. Warning
57
+ 1. Event: A violation involving a single incident or series of incidents.
58
+ 2. Consequence: A private, written warning from the Community Moderators.
59
+ 3. Repair: Examples of repair include a private written apology, acknowledgement of responsibility, and seeking clarification on expectations.
60
+
61
+ 2. Temporarily Limited Activities
62
+ 1. Event: A repeated incidence of a violation that previously resulted in a warning, or the first incidence of a more serious violation.
63
+ 2. Consequence: A private, written warning with a time-limited cooldown period designed to underscore the seriousness of the situation and give the community members involved time to process the incident. The cooldown period may be limited to particular communication channels or interactions with particular community members.
64
+ 3. Repair: Examples of repair may include making an apology, using the cooldown period to reflect on actions and impact, and being thoughtful about re-entering community spaces after the period is over.
65
+
66
+ 3. Temporary Suspension
67
+ 1. Event: A pattern of repeated violation which the Community Moderators have tried to address with warnings, or a single serious violation.
68
+ 2. Consequence: A private written warning with conditions for return from suspension. In general, temporary suspensions give the person being suspended time to reflect upon their behavior and possible corrective actions.
69
+ 3. Repair: Examples of repair include respecting the spirit of the suspension, meeting the specified conditions for return, and being thoughtful about how to reintegrate with the community when the suspension is lifted.
70
+
71
+ 4. Permanent Ban
72
+ 1. Event: A pattern of repeated code of conduct violations that other steps on the ladder have failed to resolve, or a violation so serious that the Community Moderators determine there is no way to keep the community safe with this person as a member.
73
+ 2. Consequence: Access to all community spaces, tools, and communication channels is removed. In general, permanent bans should be rarely used, should have strong reasoning behind them, and should only be resorted to if working through other remedies has failed to change the behavior.
74
+ 3. Repair: There is no possible repair in cases of this severity.
75
+
76
+ This enforcement ladder is intended as a guideline. It does not limit the ability of Community Managers to use their discretion and judgment, in keeping with the best interests of our community.
77
+
78
+ ## Scope
79
+
80
+ This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public or other spaces. Examples of representing our community include using an official email address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
81
+
82
+ ## Attribution
83
+
84
+ This Code of Conduct is adapted from the Contributor Covenant, version 3.0, permanently available at https://www.contributor-covenant.org/version/3/0/.
85
+
86
+ Contributor Covenant is stewarded by the Organization for Ethical Source and licensed under CC BY-SA 4.0.
data/CONTRIBUTING.md CHANGED
@@ -5,8 +5,9 @@ Thanks for considering a contribution. This project is *about* lowering the fric
5
5
  ## Quick start
6
6
 
7
7
  ```
8
- git clone https://github.com/cdhagmann/gem-contribute
9
- cd gem-contribute
8
+ gem install gem-contribute
9
+ gem-contribute init # set clone_root and auth with GitHub
10
+ gem-contribute fix gem-contribute/issue-5
10
11
  bundle install
11
12
  bin/rspec # tests should pass on a clean checkout
12
13
  bin/gem-contribute # tool should run against this repo's own Gemfile.lock
@@ -21,14 +22,6 @@ bin/gem-contribute # tool should run against this repo's own Gemfile.lock
21
22
  - Performance improvements with before/after numbers
22
23
  - Accessibility improvements to the TUI (color contrast, keyboard-only flows, screen-reader compatibility)
23
24
 
24
- ## What we'd push back on
25
-
26
- - Label normalization (see [ADR-0005](docs/adr/0005-render-labels-verbatim.md))
27
- - Parsing CONTRIBUTING.md for structured data (see [ADR-0007](docs/adr/0007-display-contributing-verbatim.md))
28
- - AI-anything that summarizes, suggests, or rewrites maintainer-authored content
29
- - Bundler plugin packaging (see [ADR-0006](docs/adr/0006-standalone-gem-not-plugin.md)) — we'll consider it later, just not now
30
-
31
- If you have a strong case for any of the above, open an issue first and let's talk before you write code.
32
25
 
33
26
  ## PR expectations
34
27
 
@@ -39,7 +32,7 @@ If you have a strong case for any of the above, open an issue first and let's ta
39
32
 
40
33
  ## Code of Conduct
41
34
 
42
- Be kind. Assume good faith. The Ruby community deserves both. Specific incidents go to chris@example.com (placeholderTODO: update before merging this).
35
+ Be kind. Assume good faith. The Ruby community deserves both. The full text adapted from [Contributor Covenant 3.0](https://www.contributor-covenant.org/version/3/0/)lives in [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md). Specific incidents go to gem.contribute@cdhagmann.com.
43
36
 
44
37
  ## AI assistance
45
38
 
data/README.md CHANGED
@@ -35,6 +35,7 @@ Requires Ruby 3.2 or later.
35
35
  The CLI is a small set of subcommands:
36
36
 
37
37
  ```
38
+ gem-contribute init One-time interactive setup (sets clone_root, then auth).
38
39
  gem-contribute scan [path] Summarize the contributable surface of a Gemfile.lock.
39
40
  gem-contribute issues <gem|all> List "good first issue" issues for one gem (or all).
40
41
  gem-contribute auth login Authenticate with GitHub via OAuth device flow.
@@ -46,29 +47,29 @@ gem-contribute config set <key> <val> Persist user preferences (e.g. clone_root)
46
47
  A typical session:
47
48
 
48
49
  ```sh
49
- $ gem-contribute auth login # one-time; uses GitHub device flow
50
+ $ gem-contribute init # one-time: sets clone_root, then auth via GitHub device flow
50
51
  $ gem-contribute scan # see what's worth contributing to
51
52
  $ gem-contribute issues rubocop # drill into one project's issues
52
53
  $ gem-contribute fix rubocop/12345 # fork, clone, branch
53
- $ cd ~/code/oss/rubocop/rubocop # (or wherever clone_root points)
54
+ $ cd ~/code/oss/rubocop/rubocop # whatever clone_root you set during init
54
55
  # ... make your change, commit ...
55
56
  $ gem-contribute submit # push + open the PR compare page in your browser
56
57
  ```
57
58
 
58
- The `auth login` step 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).
59
+ The 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).
59
60
 
60
61
  ## Configuration
61
62
 
62
- User config lives at `~/.config/gem-contribute/config.yml`. Manage it with `gem-contribute config`:
63
+ User 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`:
63
64
 
64
65
  ```sh
65
66
  gem-contribute config set clone_root ~/Projects/oss
66
67
  gem-contribute config list
67
68
  ```
68
69
 
69
- | Key | Default | Notes |
70
- |--------------|--------------|--------------------------------------------------|
71
- | `clone_root` | `~/code/oss` | Where `fix` clones forks (`<root>/<owner>/<repo>`). |
70
+ | Key | Notes |
71
+ |--------------|------------------------------------------------------------------------------------|
72
+ | `clone_root` | Where `fix` clones forks (`<root>/<owner>/<repo>`). Set via `init` or `config set`. No default — `fix` errors if unset. |
72
73
 
73
74
  ## Design
74
75
 
@@ -1,6 +1,6 @@
1
1
  # ADR 0008: Use Rooibos for the TUI layer
2
2
 
3
- **Status:** Accepted
3
+ **Status:** Superseded by [ADR-0010](0010-charm-ruby-tui-framework.md)
4
4
  **Date:** 2026-04-27
5
5
  **Supersedes parts of:** the original "TUI built directly on `ratatui_ruby`" approach implied by ADR-0001 and the `docs/design.md` v1.
6
6
 
@@ -0,0 +1,84 @@
1
+ # ADR 0010: Use Charm-Ruby (bubbletea + lipgloss) for the TUI layer
2
+
3
+ **Status:** Accepted
4
+ **Date:** 2026-05-02
5
+ **Supersedes:** [ADR-0008](0008-rooibos-tui-framework.md)
6
+
7
+ ## Context
8
+
9
+ [ADR-0008](0008-rooibos-tui-framework.md) chose Rooibos (on `ratatui_ruby`) as the TUI framework. That decision was made on 2026-04-27, *before* `bubbletea-ruby` (Marco Roth's Ruby bindings to Charm's Bubble Tea) existed. Bubbletea-ruby was first published on 2025-12-26 and is now at 0.1.4 (March 2026); the companion styling library, `lipgloss-ruby`, is at 0.2.2.
10
+
11
+ Stage 3 (the TUI work, [issue #2](https://github.com/cdhagmann/gem-contribute/issues/2)) has not started, so the cost of changing this decision is at its lifetime minimum.
12
+
13
+ ## Decision
14
+
15
+ Use **bubbletea-ruby** as the TUI framework, with **lipgloss-ruby** for styling. This replaces Rooibos and removes `ratatui_ruby` from the dependency tree.
16
+
17
+ ## Reasoning
18
+
19
+ **Idiomatic Ruby surface.** Bubbletea-ruby's API is plain Ruby — `class Foo; include Bubbletea::Model; def init; def update(msg); def view; end`. Rooibos uses lambda-as-constants (`Init = ->`, `View = ->`), which ADR-0008 itself called out as a real onboarding cost for Rails developers. For Blue Ridge Ruby 2026, lower onboarding cost matters.
20
+
21
+ **Battle-tested core.** The Go bubbletea library is the dominant TUI framework in the Go ecosystem — used by `gh`, `glow`, the Charm CLI suite, and dozens of other production tools. Bubbletea-ruby is a young binding (0.1.x), but the rendering and event-loop semantics it wraps are mature in a way that no pure-Ruby alternative is.
22
+
23
+ **Workshop transferability.** "You're learning the Ruby flavor of Bubble Tea" is a stronger pitch than "you're learning Rooibos." MVU is the transferable mental model; Bubble Tea is the largest MVU-TUI ecosystem to walk into afterward.
24
+
25
+ **Install friction is acceptable on workshop hardware.** Both frameworks ship precompiled binaries via the standard Ruby gem-platform mechanism. On a typical Mac/Linux workshop laptop, `gem install` pulls a binary; no Rust or Go toolchain on the user's machine. Verified on rubygems.org:
26
+
27
+ | Platform | ratatui_ruby (1.5.0) | bubbletea (0.1.4) / lipgloss (0.2.2) |
28
+ |----------------------------|-----------------------|---------------------------------------|
29
+ | macOS arm64 | precompiled | precompiled |
30
+ | macOS x86_64 | source build | precompiled |
31
+ | Linux x86_64 gnu | precompiled | precompiled |
32
+ | Linux x86_64 musl | source build | precompiled |
33
+ | Linux arm64 (gnu/musl) | source build | precompiled |
34
+ | Windows | precompiled | source build |
35
+
36
+ Bubbletea wins broadly on Mac+Linux; ratatui_ruby wins on Windows. For a regional Ruby conference, that asymmetry favors bubbletea.
37
+
38
+ **Companion ecosystem.** Lipgloss-ruby provides idiomatic styling; the Charm-Ruby umbrella (charm-ruby.dev) signals an ongoing port effort, not a one-off binding.
39
+
40
+ ## Tradeoffs accepted
41
+
42
+ **Project-shaped Command primitives are gone.** Rooibos provides `Command.system`, `Command.http`, `Command.wait`, `Command.cancel` as first-class primitives matching this project's exact verbs. Bubbletea-ruby follows the Go idiom: a Command is a closure that returns a message. We write thin helpers — `http_command(url, envelope:)`, `system_command(argv, envelope:)`, `wait_command(seconds, envelope:)` — once, and use them throughout. This is the only meaningful piece of Rooibos value we reproduce ourselves.
43
+
44
+ **Test helpers unverified.** Rooibos shipped pure-function-Update testing + snapshot helpers + headless terminal style assertions. Bubbletea-ruby's testing story is not yet documented in its README. Pre-merge of Stage 3, verify what bubbletea-ruby ships and either use it, port `teatest` patterns from Go's bubbletea, or build a minimal snapshot harness. Acceptable risk because pure-function `update` is testable on its own.
45
+
46
+ **Younger Ruby surface.** Bubbletea-ruby is at 0.1.4; Rooibos was at 0.7/0.8. Both are pre-1.0 with API-change risk; bubbletea-ruby has had less time to settle. Mitigation: pin bubbletea-ruby and lipgloss to known-good versions; bump deliberately with verification.
47
+
48
+ **Two native gems vs one.** Bubbletea-ruby and lipgloss-ruby are both Go-built native gems; Rooibos was pure Ruby on top of one native gem (`ratatui_ruby`). The user-visible difference is marginal — both `bundle install` to a precompiled binary on common platforms.
49
+
50
+ **Maintainer alignment.** Rooibos and `ratatui_ruby` were both Kerrick Long: one mind, one ecosystem. Charm-Ruby splits maintainership across charmbracelet (Go upstream) and Marco Roth (Ruby bindings, plus many other projects). When Go upstream bumps an API, Marco's lag determines our exposure. Mitigation: pin to a known-good version; bump deliberately.
51
+
52
+ **Windows attendees compile.** No precompiled bubbletea binary for Windows. Document the source-build path in `docs/workshop.md` for any Windows attendee.
53
+
54
+ ## Alternatives considered
55
+
56
+ - **Stay on Rooibos.** ADR-0008's reasoning is no longer current. The "lambda-as-constant style is unfamiliar" cost it identified is removed by switching, and the platform matrix favors bubbletea on the workshop's expected hardware.
57
+ - **Bare bubbletea (no lipgloss).** Bubbletea handles the rendering loop; lipgloss handles styling. Skipping lipgloss means hand-building style helpers. Not worth it — lipgloss is small, well-shaped, and idiomatic to use alongside bubbletea.
58
+ - **Wait for bubbletea-ruby 1.0.** Same logic as ADR-0008 declining to wait for Rooibos 1.0: the architectural fit is good, the change cost rises every week we delay, and pinning is sufficient mitigation.
59
+
60
+ ## Consequences
61
+
62
+ **On dependencies:** remove `rooibos` from the gemspec. Add `bubbletea` (`~> 0.1.4`) and `lipgloss` (`~> 0.2.2`). Drop the `ratatui_ruby` Rust-toolchain warning from `docs/workshop.md`.
63
+
64
+ **On `docs/design.md`:** the TUI-layer section needs reworking — fragments become bubbletea models composed by routing, lambda-as-constant examples are replaced with idiomatic class-with-mixin examples, the Command list (`Command.http`, etc.) is replaced with the wrapper helpers defined above.
65
+
66
+ **On `CLAUDE.md`:** the working-agreement bullet "Async work is always a Rooibos Command" becomes "Async work is always a bubbletea Command." The package-pinning note about Rooibos is replaced with bubbletea/lipgloss pins.
67
+
68
+ **On ADR-0008:** marked Superseded by ADR-0010.
69
+
70
+ **On [issue #2](https://github.com/cdhagmann/gem-contribute/issues/2):** rewritten to point at bubbletea-ruby + lipgloss-ruby instead of Rooibos.
71
+
72
+ **On the workshop:** attendees still learn MVU, but the framing is "Charm-style TUI in Ruby" — the same pattern as `gh`, `glow`, and the Charm CLIs they may already know.
73
+
74
+ **On testing:** before Stage 3 lands, verify bubbletea-ruby's test helpers. If absent, port `teatest` patterns or build a minimal snapshot harness. Pure-function `update` testability is independent of the framework choice.
75
+
76
+ **On the maintainer relationship:** reach out to Marco Roth before the workshop to mention "we're building a workshop project on bubbletea-ruby for Blue Ridge Ruby 2026" — same etiquette ADR-0008 prescribed for Kerrick Long.
77
+
78
+ ## What this *doesn't* change
79
+
80
+ - ADR-0001 (just-in-time auth). MVU shape preserved; framework change.
81
+ - ADR-0002, ADR-0003, ADR-0004 (data layer). Outside the TUI.
82
+ - ADR-0005, ADR-0007 (render verbatim, no parsing). Display contract; framework choice doesn't affect it.
83
+ - ADR-0006 (standalone gem, not Bundler plugin). Packaging concern; orthogonal.
84
+ - ADR-0009 (top-level namespace). Orthogonal.
data/docs/adr/README.md CHANGED
@@ -13,8 +13,9 @@ Format: [Michael Nygard's template](https://github.com/joelparkerhenderson/archi
13
13
  - [0005 — Render labels verbatim](0005-render-labels-verbatim.md)
14
14
  - [0006 — Ship as a standalone gem, not a Bundler plugin](0006-standalone-gem-not-plugin.md)
15
15
  - [0007 — Show CONTRIBUTING; don't parse it](0007-display-contributing-verbatim.md)
16
- - [0008 — Use Rooibos for the TUI layer](0008-rooibos-tui-framework.md)
16
+ - [0008 — Use Rooibos for the TUI layer](0008-rooibos-tui-framework.md) — superseded by 0010
17
17
  - [0009 — Top-level namespace is `GemContribute`](0009-top-level-namespace.md)
18
+ - [0010 — Use Charm-Ruby (bubbletea + lipgloss) for the TUI layer](0010-charm-ruby-tui-framework.md)
18
19
 
19
20
  ## When to add an ADR
20
21
 
data/docs/ideas.md ADDED
@@ -0,0 +1 @@
1
+ - Make sure it respects PR templates
data/docs/index.md CHANGED
@@ -38,7 +38,7 @@ gem-contribute submit # push, then open the PR compare page in y
38
38
 
39
39
  - **v0.1**: a CLI with `scan`, `issues`, `auth`, `fix`, `submit`, and `config`. GitHub-only.
40
40
  - **Planned**: a Rooibos TUI that does all of the above as a single keyboard-driven session ([issue #2](https://github.com/cdhagmann/gem-contribute/issues/2)).
41
- - **Workshop project**: built for [Blue Ridge Ruby 2026](https://blueridgeruby.com).
41
+ - **Workshop project**: built for [Blue Ridge Ruby 2026](https://blueridgeruby.com). [Lightning talk slides →](talk/)
42
42
 
43
43
  ## Commands
44
44
 
@@ -0,0 +1,45 @@
1
+ # Talk source
2
+
3
+ Lightning talk for Blue Ridge Ruby 2026: *Building what you cannot find*.
4
+
5
+ `lightning.md` is a [Marp](https://marp.app/) presentation. The same file
6
+ is the source of truth for HTML, PDF, and the slides shown live.
7
+
8
+ ## Render the slides
9
+
10
+ The easiest path is the Marp VS Code extension — open `lightning.md` and
11
+ preview it in the side panel. For a finished export:
12
+
13
+ ```sh
14
+ # one-time
15
+ npm install -g @marp-team/marp-cli
16
+
17
+ # preview live in browser
18
+ marp --server talk/
19
+
20
+ # publish to GitHub Pages (committed; appears at /talk/ on the docs site)
21
+ marp talk/lightning.md --html -o docs/talk/index.html
22
+
23
+ # export to PDF (recommended for the talk itself — survives wifi)
24
+ marp talk/lightning.md --pdf -o talk/lightning.pdf
25
+ ```
26
+
27
+ The HTML version under `docs/talk/index.html` is served via the docs
28
+ site at <https://cdhagmann.com/gem-contribute/talk/>. Re-run the `--html`
29
+ command and commit the changed file whenever the slides change.
30
+
31
+ ## Speaker notes
32
+
33
+ Embedded as `<!-- ... -->` HTML comments inside `lightning.md`. They
34
+ don't render in the slide output but show up in Marp's presenter view.
35
+
36
+ ## Demo recording
37
+
38
+ Always record the live demo before the talk and have the video queued
39
+ on the second monitor. Wifi at conferences is unreliable. If `submit`
40
+ hangs, you swap to the recording without losing the audience.
41
+
42
+ ## Timing
43
+
44
+ Target 5 minutes. Practice with a phone timer at least four times
45
+ standing up. Cut on every pass.