opencode-ruby-upgrader 0.1.4 → 0.1.6

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.
package/README.md CHANGED
@@ -1,6 +1,55 @@
1
1
  # opencode-ruby-upgrader
2
2
 
3
- An evidence-driven Ruby and Rails migration agent for [OpenCode](https://opencode.ai). It upgrades a project one Ruby minor series at a time toward a researched latest-stable or explicitly pinned Ruby target, researches compatibility guidance, updates affected code and dependencies, and leaves a reviewable migration trail.
3
+ An evidence-driven Ruby and Rails migration agent for [OpenCode](https://opencode.ai). It upgrades a project one Ruby minor series at a time toward a researched latest-stable or explicitly pinned Ruby target, researches compatibility guidance, updates affected code and dependencies, and leaves a reviewable migration trail. It ships as an OpenCode plugin: register it in your OpenCode config, then drive it with `/ruby-upgrade`.
4
+
5
+ ## Install
6
+
7
+ ### 1. Install OpenCode
8
+
9
+ This package is a plugin for [OpenCode](https://opencode.ai), an open-source AI coding agent that runs in your terminal. If you don't have it yet:
10
+
11
+ ```bash
12
+ curl -fsSL https://opencode.ai/install | bash
13
+ # or: npm install -g opencode-ai
14
+ # or: brew install anomalyco/tap/opencode
15
+ ```
16
+
17
+ You'll also need an API key for at least one LLM provider — run `/connect` inside OpenCode to sign in or paste a key. The [OpenCode intro](https://opencode.ai/docs/) covers the full first-run setup.
18
+
19
+ ### 2. Register the plugin
20
+
21
+ Add it to your OpenCode config, either the project config `opencode.json` (or `opencode.jsonc`) beside your project, or the global `~/.config/opencode/opencode.json`:
22
+
23
+ ```json
24
+ {
25
+ "$schema": "https://opencode.ai/config.json",
26
+ "plugin": ["opencode-ruby-upgrader"]
27
+ }
28
+ ```
29
+
30
+ Register it **per project** if you want the agent available only where you're upgrading; register it globally to use it across repositories. A project-scoped config is the tighter default here, because the upgrader additionally refuses to run outside a linked Git worktree you created yourself (see [Safety model](#safety-model)).
31
+
32
+ While developing a local checkout, point at the directory instead:
33
+
34
+ ```json
35
+ { "plugin": ["file:///absolute/path/to/opencode-ruby-upgrader"] }
36
+ ```
37
+
38
+ OpenCode installs npm plugins automatically at startup and caches them in `~/.cache/opencode/node_modules/`, so there is no separate install step.
39
+
40
+ ### 3. Restart and confirm
41
+
42
+ Restart OpenCode, then run `opencode` in the worktree you want to upgrade and type `/ruby-upgrade` — or `@ruby-upgrade` to select the agent directly.
43
+
44
+ ## Requirements
45
+
46
+ OpenCode with plugin support, Node `>=22.5.0`, and Git `>=2.5` for the linked-worktree safety model. Docker is optional and only needed when your host cannot run the Ruby version being tested (see [Security boundaries](#security-boundaries)).
47
+
48
+ The automatic validation adapters currently recognize Bundler projects using Rails, RSpec, or Minitest. Other stacks still receive a full inventory and research, but need a user-supplied validation command.
49
+
50
+ The package also installs an `opencode-ruby-upgrader` command. Most of its subcommands are driven by the agent itself; the two you run directly are `dashboard` and `resume`.
51
+
52
+ npm `>=11` is recommended for contributors and for publishing: npm 11 added the install-script approval gate this repository's release path relies on. It is not required to install or run the package, which ships no install scripts and no runtime dependencies.
4
53
 
5
54
  ## Quick start
6
55
 
@@ -22,8 +71,6 @@ opencode
22
71
 
23
72
  Then run `/ruby-upgrade` (or add `--dry-run` to get a no-write assessment first). The agent inventories the project, researches an official-source compatibility ladder, and proposes each validated hop as a local checkpoint commit for your review. See [Safety model](#safety-model) for what it will and will not do automatically.
24
73
 
25
- > Requires Git 2.5+ (linked-worktree safety model) and Docker for the isolated validation container when your host cannot run the Ruby version being tested (see [Security boundaries](#security-boundaries)).
26
-
27
74
  | Step | Who does it | Result |
28
75
  |---|---|---|
29
76
  | Set up worktree + config | You | Linked worktree, agent-ready |
@@ -33,18 +80,30 @@ Then run `/ruby-upgrade` (or add `--dry-run` to get a no-write assessment first)
33
80
  | Repeat | Loop | One minor series per hop |
34
81
  | Review & push | **You** | `git log`/dashboard then push the validated branch |
35
82
 
36
- ## Proof of work
83
+ ## Before you run it
84
+
85
+ Three flags bound how much a single run can change.
86
+
87
+ Use `/ruby-upgrade --dry-run` for a no-write inventory and proposed migration assessment; it creates no report, lock, checkpoint, or durable research evidence. Use `/ruby-upgrade --target <version>` (for example `/ruby-upgrade --target 3.4`) to pin an explicit final Ruby version, or `/ruby-upgrade --stop-after-hop` to validate and commit one hop before stopping.
88
+
89
+ ## Validated end-to-end run
37
90
 
38
91
  The agent has completed a real end-to-end migration against a public fixture: [`ruby2-rails4-bootstrap-heroku`](https://github.com/lilla021/ruby2-rails4-bootstrap-heroku) (BSD-2-Clause) moved from **Ruby 2.4.10 / Rails 4.2.11.3** to **Ruby 3.4.10 / Rails 7.1.6** across 15 receipt-backed hops. Every hop was validated by `bundle exec rspec` in an isolated Docker container, then committed as a local checkpoint before the next hop began.
39
92
 
40
93
  - [Upgrade pull request](https://github.com/lilla021/ruby2-rails4-bootstrap-heroku/pull/1) — the full migration: 19 commits, one per reviewed step, with lint and spec checks currently passing on GitHub Actions.
41
- - [Evidence ledger](E2E_EVIDENCE.md) — every hop's validation receipt, commit SHA, and the fixes the migration required.
94
+ - [Evidence ledger](https://github.com/lilla021/opencode-ruby-upgrader/blob/v0.1.6/E2E_EVIDENCE.md) — every hop's validation receipt, commit SHA, and the fixes the migration required.
42
95
 
43
- This proves the workflow works on a genuinely old, real-world Rails stack. It does not claim every upgrade is safe — see [Product limits](#product-limits).
96
+ This proves the workflow works on a genuinely old, real-world Rails stack. It does not claim every upgrade is safe — see [Safety model](#safety-model) for what the agent refuses to do without you, and [Product limits](#product-limits) for what it cannot prove.
44
97
 
45
98
  ## Safety model
46
99
 
47
- The agent runs durable migrations **only** from a linked Git worktree created by the user. Before starting, explicitly configure the repository default branch with `git config opencode-ruby-upgrader.defaultBranch main` (replace `main` as needed) — see [Quick start](#quick-start) for the three setup commands, which the agent also shows verbatim if you invoke it from a primary checkout. The upgrader fails closed if this configuration is absent and never guesses `main`, `master`, or a remote default. This keeps your normal checkout free for other work. Non-Git projects support dry-run inventory only. The agent never creates, switches, deletes, merges, pushes, or reconfigures branches/remotes. It also never publishes, deploys, or runs destructive database commands.
100
+ The agent runs durable migrations **only** from a linked Git worktree created by the user. Before starting, explicitly configure the repository default branch with `git config opencode-ruby-upgrader.defaultBranch main` (replace `main` as needed) — see [Quick start](#quick-start) for the three setup commands, which the agent also shows verbatim if you invoke it from a primary checkout. The upgrader fails closed if this configuration is absent and never guesses `main`, `master`, or a remote default. This keeps your normal checkout free for other work. Non-Git projects support dry-run inventory only.
101
+
102
+ The agent never:
103
+
104
+ - creates, switches, deletes, merges, pushes, or reconfigures branches or remotes
105
+ - publishes or deploys anything
106
+ - runs destructive database commands
48
107
 
49
108
  After every routine Ruby minor-version hop with passing validation, the agent proposes a **local** checkpoint commit through a guarded commit gate and OpenCode asks for confirmation. The gate verifies the linked worktree and non-default branch, exact expected Git history, an empty initial staging area, a complete passing report iteration, and scans staged content for likely credentials. It cannot push, fetch, alter remotes, switch branches, merge, rebase, reset, or amend history. You can review and push any validated checkpoint; a run becomes `complete` only once it reaches its pinned target.
50
109
 
@@ -52,23 +111,17 @@ The agent pauses—not guesses—when a migration involves data changes, authent
52
111
 
53
112
  Every hop declares its expected changed files before commit. The commit gate blocks undeclared changes, credential-like material, executable Git hooks, non-RubyGems dependency sources, and large lockfile churn unless the user has explicitly reviewed and permitted that specific concern. Any changed lockfile also requires a recorded compatibility and license review. The target Ruby version is pinned with the research timestamp at run start, so a new upstream release cannot silently change the target mid-run. If Git author or commit-signing configuration prevents a commit, the agent reports the exact local setup issue and stops; it never changes Git configuration for you.
54
113
 
55
- ## Install
56
-
57
- During development:
114
+ ## Security boundaries
58
115
 
59
- ```json
60
- { "plugin": ["file:///absolute/path/to/opencode-ruby-upgrader"] }
61
- ```
116
+ The agent defaults unknown shell commands to an OpenCode confirmation prompt. Git inspection is allowed, while direct Git mutation, GitHub CLI, publishing, and shell chaining/pipes/substitutions are denied. Dependency installation/updates, recognized tests, state writes, `commit-hop`, and `commit-rails-hop` require confirmation. This protects against accidental agent actions, not malicious project code: dependency installation and tests execute project-controlled code with your local user permissions. Use an isolated environment for repositories you do not trust, and review any command OpenCode asks you to approve.
62
117
 
63
- After publishing:
118
+ New reports require `record-executed-iteration --validation <id>` or `record-executed-rails-iteration --validation <test-id>`; asserted results cannot be recorded or committed. The accepted IDs map to fixed no-shell commands: `bundle-rspec`, `bundle-rails-test`, `bundle-rake-test`, `bin-rails-test`, and, for Rails bridges, `rails-app-update`. When the target Ruby is unavailable on your host, the agent runs `prepare-target-runtime --ruby <x.y.z>` after selecting the exact target patch release. One confirmation provisions labeled per-run Ruby and isolated PostgreSQL Docker resources, installs Node, installs Bundler 2.4.22, runs `bundle install`, and, for Rails, creates the isolated test database.
64
119
 
65
- ```json
66
- { "plugin": ["opencode-ruby-upgrader"] }
67
- ```
120
+ It writes nonsecret `.ruby-upgrades/runtime.json` with only safe preparation digests and the resolved image ID; raw output and `DATABASE_URL` are never persisted. `docker-bundle-rspec` reuses and verifies that manifest, including the exact requested Ruby execution and resolved image ID, before executing the fixed `docker exec --env DATABASE_CLEANER_ALLOW_REMOTE_DATABASE_URL=true <container> bundle exec rspec`. The safeguard override is scoped to the verified isolated test process; no container name, report path, or environment value is needed from the user.
68
121
 
69
- Restart OpenCode, then run `/ruby-upgrade` or select `@ruby-upgrade`.
122
+ Receipts persist only an output digest and byte count, plus structured test metrics; raw validation output is deliberately not committed. Each receipt also binds to a non-evidence working-tree fingerprint, which the commit gate rechecks after final validation. A checkpoint commit carries the receipt digest.
70
123
 
71
- Git 2.5 or newer is required for the linked-worktree safety model.
124
+ This is tamper-evident provenance for a committed report, not protection against the same local user rewriting both evidence and Git history.
72
125
 
73
126
  ## Evidence and dashboard
74
127
 
@@ -76,7 +129,11 @@ Every run has a generated JSON record and Markdown companion under `.ruby-upgrad
76
129
 
77
130
  As an example, here is one such run rendered in the dashboard — per-hop summaries, test metrics, and citation links. The full process and per-hop detail live in the run reports themselves:
78
131
 
79
- ![Example of the local evidence dashboard](docs/dashboard.png)
132
+ ![Example of the local evidence dashboard](https://raw.githubusercontent.com/lilla021/opencode-ruby-upgrader/v0.1.6/docs/dashboard.png)
133
+
134
+ The same reports open as a vault — each run is a Markdown note paired with its JSON record:
135
+
136
+ ![Example vault view: run reports as paired Markdown and JSON notes](https://raw.githubusercontent.com/lilla021/opencode-ruby-upgrader/v0.1.6/docs/vault.png)
80
137
 
81
138
  Launch the local-only dashboard from the repository worktree:
82
139
 
@@ -88,9 +145,7 @@ It binds exclusively to `127.0.0.1` on an ephemeral port and remains in the fore
88
145
 
89
146
  The dashboard identifies local checkpoint commits from trailers embedded in those commits. Before the final push, inspect them locally with `git log`, `git show`, and the dashboard; after you push, the same individual commits are available for GitHub review.
90
147
 
91
- ## Controls and recovery
92
-
93
- Use `/ruby-upgrade --dry-run` for a no-write inventory and proposed migration assessment; it creates no report, lock, checkpoint, or durable research evidence. Use `/ruby-upgrade --target <version>` (for example `/ruby-upgrade --target 3.4`) to pin an explicit final Ruby version, or `/ruby-upgrade --stop-after-hop` to validate and commit one hop before stopping.
148
+ ## Recovery
94
149
 
95
150
  Each active run holds a local lock. To stop for review or manual work, transition it to `paused`; that releases the lock without marking the migration complete. Resume the existing report rather than starting a second migration:
96
151
 
@@ -98,26 +153,53 @@ Each active run holds a local lock. To stop for review or manual work, transitio
98
153
  opencode-ruby-upgrader resume --report .ruby-upgrades/runs/<run>.json
99
154
  ```
100
155
 
101
- `complete`, `blocked`, and `paused` runs release their lock. For other blockers, inspect the report and use the documented transition/resume path. To undo a completed hop, use the reviewable local history: `git revert <hop-sha>`. Do not use reset, rebase, or force-push as routine migration recovery.
156
+ `complete`, `blocked`, and `paused` runs release their lock. For other blockers, inspect the report and use the documented transition/resume path.
102
157
 
103
- If a resolved Rails version blocks the next Ruby hop, record the user-approved bridge, then transition the Ruby run to `blocked`. That Ruby report is terminal: complete the linked Rails lifecycle and start a fresh Ruby run. Every Rails iteration executes `bin/rails app:update` first, records its receipt, reviews that exact working-tree fingerprint, and only then runs final tests. Validate and checkpoint each one with `commit-rails-hop`.
158
+ If a resolved Rails version blocks the next Ruby hop, that Ruby run becomes terminal and a separate Rails-bridge run takes over. See the [Rails bridge lifecycle](https://github.com/lilla021/opencode-ruby-upgrader/blob/v0.1.6/docs/rails-bridge.md) reference.
104
159
 
105
- ## Security boundaries
160
+ To undo a completed hop, use the reviewable local history: `git revert <hop-sha>`. Do not use reset, rebase, or force-push as routine migration recovery.
106
161
 
107
- The agent defaults unknown shell commands to an OpenCode confirmation prompt. Git inspection is allowed, while direct Git mutation, GitHub CLI, publishing, and shell chaining/pipes/substitutions are denied. Dependency installation/updates, recognized tests, state writes, `commit-hop`, and `commit-rails-hop` require confirmation. This protects against accidental agent actions, not malicious project code: dependency installation and tests execute project-controlled code with your local user permissions. Use an isolated environment for repositories you do not trust, and review any command OpenCode asks you to approve.
162
+ ## Troubleshooting
108
163
 
109
- New reports require `record-executed-iteration --validation <id>` or `record-executed-rails-iteration --validation <test-id>`; asserted results cannot be recorded or committed. The accepted IDs map to fixed no-shell commands: `bundle-rspec`, `bundle-rails-test`, `bundle-rake-test`, `bin-rails-test`, and, for Rails bridges, `rails-app-update`. When the target Ruby is unavailable on your host, the agent runs `prepare-target-runtime --ruby <x.y.z>` after selecting the exact target patch release. One confirmation provisions labeled per-run Ruby and isolated PostgreSQL Docker resources, installs Node, installs Bundler 2.4.22, runs `bundle install`, and, for Rails, creates the isolated test database.
164
+ ### If `/ruby-upgrade` isn't offered
165
+
166
+ The plugin didn't load. Check that your config file still parses — a stray comma breaks the whole file, not just this plugin — and restart OpenCode.
167
+
168
+ ### If you see `EBADENGINE`
169
+
170
+ `EBADENGINE` is a warning, not a failure: npm still completes the install. It appears when your Node is older than the `>=22.5.0` floor in [Requirements](#requirements), which exists because Node 18 is end-of-life and this agent runs your project's dependency install and test commands.
171
+
172
+ To clear it, upgrade Node and reinstall:
173
+
174
+ ```bash
175
+ node -v # confirm >= 22.5.0
176
+ npm i opencode-ruby-upgrader
177
+ ```
178
+
179
+ Upgrading npm alone cannot fix it. Current npm releases require a recent Node themselves, so npm refuses to install over an older Node. If `engine-strict=true` is set in your npm config, the warning becomes a hard error and the install fails until Node is upgraded.
110
180
 
111
- It writes nonsecret `.ruby-upgrades/runtime.json` with only safe preparation digests and the resolved image ID; raw output and `DATABASE_URL` are never persisted. `docker-bundle-rspec` reuses and verifies that manifest, including the exact requested Ruby execution and resolved image ID, before executing the fixed `docker exec --env DATABASE_CLEANER_ALLOW_REMOTE_DATABASE_URL=true <container> bundle exec rspec`. The safeguard override is scoped to the verified isolated test process; no container name, report path, or environment value is needed from the user. Receipts persist only an output digest and byte count, plus structured test metrics; raw validation output is deliberately not committed. Each receipt also binds to a non-evidence working-tree fingerprint, which the commit gate rechecks after final validation. A checkpoint commit carries the receipt digest. This is tamper-evident provenance for a committed report, not protection against the same local user rewriting both evidence and Git history.
181
+ ### Uninstalling
182
+
183
+ Remove `"opencode-ruby-upgrader"` from your config's `plugin` array and restart OpenCode. Your `.ruby-upgrades/` reports and any checkpoint commits are ordinary local files and Git history — nothing else to clean up.
112
184
 
113
185
  ## Product limits
114
186
 
115
- The upgrader automates evidence collection and compatibility-oriented edits; it cannot prove production behavior, security correctness, deployment safety, or semantic equivalence. It intentionally pauses instead of modifying database behavior, authorization, payments, secrets, and production configuration without a user decision. Supported automatic adapters currently recognize Bundler projects using Rails, RSpec, or Minitest; other stacks receive an inventory and require a user-supplied validation command.
187
+ The upgrader automates evidence collection and compatibility-oriented edits; it cannot prove production behavior, security correctness, deployment safety, or semantic equivalence. It intentionally pauses instead of modifying database behavior, authorization, payments, secrets, and production configuration without a user decision.
116
188
 
117
189
  The credential scanner is heuristic: it recognizes common token formats and quoted credential-like assignments, but may miss other forms such as arbitrary unquoted YAML values. Run reports are local mutable JSON evidence, so their integrity is bounded by the user and local filesystem permissions rather than a tamper-proof store. Credential-bearing source URLs are redacted from supply-chain evidence. Gemfile source detection is static and may not resolve dynamically computed sources; review those manually and explicitly approve private sources.
118
190
 
191
+ ## Privacy
192
+
193
+ No telemetry, no analytics, and no report uploads. Migration evidence is written only under `.ruby-upgrades/runs/` in the current worktree, and the dashboard binds to `127.0.0.1` only. Reports may contain target versions, branch names, commit SHAs, changed-file names, dependency source origins, citations, and bounded validation metadata — absolute local paths and recognized credentials are redacted, but redaction is best-effort.
194
+
195
+ Full detail in [PRIVACY.md](https://github.com/lilla021/opencode-ruby-upgrader/blob/v0.1.6/PRIVACY.md). To report a vulnerability, see [SECURITY.md](https://github.com/lilla021/opencode-ruby-upgrader/blob/v0.1.6/SECURITY.md).
196
+
197
+ ## Contributing
198
+
119
199
  Run the self-contained test suite with `npm test`. A CI environment that installs a supported OpenCode CLI can also run `OPENCODE_RUNTIME_E2E=1 npm run test:opencode`; this verifies the installed runtime is available and the plugin registers its agent/command contract before release.
120
200
 
201
+ CI runs that suite against Node 22, 24, and 26 so the declared `engines.node` range is exercised rather than assumed. Both workflows pin `npm@11.16.0` so the matrix varies Node rather than npm, because `allowScripts` — npm 11's dependency install-script approval gate, used here to narrowly permit the pinned `opencode-ai` postinstall — and npm trusted publishing both require npm 11 or newer. `RELEASING.md` covers the publish path.
202
+
121
203
  ## Acknowledgments
122
204
 
123
205
  This agent was built with [opencode-craft](https://github.com/pauloralves/opencode-craft) (MIT, by [Paulo Alves](https://github.com/pauloralves)) — a senior pair-programming, craftsmanship, and knowledge-ledger skill pack for OpenCode. Its review cadence, evidence discipline, and interview-oriented trade-off notes shaped how this project is designed and presented. Thanks also to the community that produces the [official Ruby release](https://www.ruby-lang.org/en/downloads/releases/) and [Rails](https://guides.rubyonrails.org/) documentation this agent cites.
@@ -5,6 +5,7 @@ Complete every item before pushing a `v*` tag. The protected `npm-release` envir
5
5
  ## Before every release
6
6
 
7
7
  - [ ] Bump the version and update [RELEASE_NOTES.md](RELEASE_NOTES.md): scope, supported adapters, known limitations, rollback.
8
+ - [ ] Repoint the README's tag-pinned links to the new version tag: `E2E_EVIDENCE.md`, `PRIVACY.md`, `SECURITY.md`, `docs/rails-bridge.md`, and both screenshot URLs. They are pinned to a tag so the registry page always shows the docs of the installed version rather than whatever `main` currently says; leaving them on the previous tag makes the published page drift behind the release.
8
9
  - [ ] Review the package metadata (name, description, keywords, `repository`, `bugs`, `homepage`) and the packed-file list with `npm pack --dry-run`.
9
10
  - [ ] Run `npm test`; confirm the release workflow's runtime smoke gate passes with the pinned OpenCode runtime.
10
11
  - [ ] Confirm no credentials, personal data, or local paths appear in the packed files, README, SECURITY.md, PRIVACY.md, or release notes.
package/RELEASE_NOTES.md CHANGED
@@ -1,5 +1,44 @@
1
1
  # opencode-ruby-upgrader — release notes
2
2
 
3
+ ## v0.1.6 — reader path and CI coverage
4
+
5
+ No runtime change. The agent's commands, permission policy, commit gate, and report format are untouched. This release restructures the public documentation and closes a CI coverage gap.
6
+
7
+ **Scope**
8
+
9
+ The README was reordered into a reader-state funnel — install, run it small, does it work, what it refuses, what backs that, what you get, how to recover, what it cannot prove — so each section answers the question a reader has at that point:
10
+
11
+ - `Install` is now first and reads as three numbered steps. It previously arrived fifth, with nothing earlier stating that this package is an OpenCode plugin.
12
+ - `Security boundaries` now sits directly after `Safety model`. Intent and enforcement are halves of one argument and had been separated by two unrelated sections.
13
+ - The pre-flight flags split out of the recovery material into `Before you run it`, immediately after Quick start where `--dry-run` is first mentioned.
14
+ - A new `Requirements` section carries the Node/Git/Docker floors and moves the supported-adapter qualification from position ten to before a reader creates a worktree.
15
+ - A new `Troubleshooting` section collects the `EBADENGINE` warning, a missing `/ruby-upgrade` command, and uninstall.
16
+ - A new `Privacy` section gives the previously unlinked `PRIVACY.md` and `SECURITY.md` an entry point in the packaged README.
17
+ - `Contributing` is separated from `Product limits`, so maintainer test instructions no longer sit inside an end-user section.
18
+ - Install now covers the OpenCode prerequisite and config registration for readers new to OpenCode, verified against the current plugin documentation.
19
+ - `Proof of work` is renamed `Validated end-to-end run`.
20
+ - Long paragraphs in `Safety model` and `Security boundaries` are split, and the agent's prohibitions are now a list.
21
+ - The Rails-bridge lifecycle moves to a standalone [`docs/rails-bridge.md`](docs/rails-bridge.md) reference, so `Recovery` ends on the `git revert` guidance instead of burying it.
22
+ - README links to companion documents and both screenshots are now pinned to the release tag instead of resolving against `main`. The registry page previously showed whatever `main` happened to contain, which could drift ahead of the installed version. The release gate now repoints them each release.
23
+
24
+ **CI**
25
+
26
+ `ci.yml` runs the test suite, pack check, and pinned-runtime smoke test across Node 22, 24, and 26. CI previously exercised Node 22 only while `engines.node` declared `>=22.5.0`, leaving most of the advertised support range untested. Both workflows pin `npm@11.16.0` so the matrix varies Node rather than npm. Publishing remains a single Node 22 job in `release.yml`, since every matrix leg would attempt the same version.
27
+
28
+ **Supported adapters:** unchanged — Bundler projects using Rails, RSpec, or Minitest; other stacks receive an inventory and require a user-supplied validation command.
29
+
30
+ **Known limitations:** unchanged. The credential scanner remains heuristic and reports remain local mutable JSON, bounded by the user and local filesystem permissions. See Product limits in the README.
31
+
32
+ **Rollback:** `npm install opencode-ruby-upgrader@0.1.5`. The command surface and on-disk format are identical across this release, so no report conversion is required.
33
+
34
+ Published through the same protected-CI gate.
35
+
36
+ ## v0.1.5 — registry visuals
37
+
38
+ No functional change. The npm package page now renders its README images: the dashboard and vault-view screenshots moved from relative paths to absolute GitHub URLs, so they display on the registry in addition to GitHub.
39
+
40
+ Published through the same protected-CI gate.
41
+
3
42
  ## v0.1.4 — showcase polish
4
43
 
5
44
  No functional change. Attribution and presentation updates:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-ruby-upgrader",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "A safe, evidence-driven Ruby runtime upgrade agent and local migration dashboard for OpenCode",
5
5
  "author": "Priscilla Cournoyer (https://github.com/lilla021)",
6
6
  "repository": {