gemvault 0.1.4 → 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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.containerignore +10 -0
  3. data/.rubocop.yml +8 -1
  4. data/CHANGELOG.md +56 -0
  5. data/CLAUDE.md +6 -5
  6. data/Dockerfile.test +14 -0
  7. data/README.md +18 -6
  8. data/Rakefile +19 -0
  9. data/docs/tarvault-findings.md +186 -0
  10. data/docs/tarvault.md +42 -0
  11. data/issues.rec +540 -17
  12. data/lib/bundler/plugin/vault_source.rb +61 -73
  13. data/lib/bundler/plugin/vaulted_gem.rb +66 -0
  14. data/lib/gemvault/archive_entry.rb +6 -0
  15. data/lib/gemvault/cli/command.rb +9 -5
  16. data/lib/gemvault/cli/commands/extract.rb +11 -11
  17. data/lib/gemvault/cli/commands/new.rb +3 -2
  18. data/lib/gemvault/cli/commands/remove.rb +15 -5
  19. data/lib/gemvault/cli/commands/upgrade.rb +72 -0
  20. data/lib/gemvault/dbvault.rb +101 -0
  21. data/lib/gemvault/deprecation.rb +48 -0
  22. data/lib/gemvault/gem_entry.rb +20 -24
  23. data/lib/gemvault/gem_extraction.rb +41 -0
  24. data/lib/gemvault/gem_reference/any_version.rb +6 -2
  25. data/lib/gemvault/gem_reference/parser.rb +44 -0
  26. data/lib/gemvault/gem_reference/specific_version.rb +9 -25
  27. data/lib/gemvault/gem_reference.rb +13 -45
  28. data/lib/gemvault/manifest.rb +78 -0
  29. data/lib/gemvault/tarball.rb +53 -0
  30. data/lib/gemvault/tarvault.rb +139 -0
  31. data/lib/gemvault/vault.rb +55 -157
  32. data/lib/gemvault/vault_path.rb +33 -0
  33. data/lib/gemvault/vault_session.rb +16 -0
  34. data/lib/gemvault/vault_upgrade.rb +94 -0
  35. data/lib/gemvault/version.rb +1 -1
  36. data/lib/gemvault.rb +2 -0
  37. data/lib/rubygems/resolver/vault_set.rb +5 -7
  38. data/lib/rubygems/source/vault.rb +28 -32
  39. data/lib/rubygems_plugin.rb +17 -6
  40. metadata +21 -33
data/issues.rec CHANGED
@@ -23,7 +23,7 @@ Description: Removal of gems when version is specified is broken. try the follow
23
23
  Status: closed
24
24
 
25
25
  Id: 1
26
- Updated: Tue, 21 Apr 2026 23:28:44 -0400
26
+ Updated: Sun, 19 Jul 2026 03:27:39 +0000
27
27
  Name: Getting error when dir structure has slightly changed
28
28
  Description: Installing bundler-source-vault 0.1.2
29
29
  + The following plugin paths don't exist: /workspace/gemvault/shim/..
@@ -57,12 +57,17 @@ Description: Installing bundler-source-vault 0.1.2
57
57
  + from /Users/davidgillis/.rbenv/versions/4.0.1/lib/ruby/site_ruby/4.0.0/rubygems.rb:304:in 'Gem.activate_and_load_bin_path'
58
58
  + from /Users/davidgillis/.rbenv/versions/4.0.1/bin/bundle:25:in '<main>'
59
59
  + /Users/davidgillis/.rbenv/versions/4.0.1/lib/ruby/gems/4.0.0/gems/bundler-4.0.8/lib/bundler/source_list.rb:59:in 'Bundler::SourceList#add_plugin_source': undefined method 'new' for nil (NoMethodError)
60
- +
60
+ +
61
61
  + add_source_to_list Plugin.source(source).new(options), @plugin_sources
62
- Status: open
62
+ +
63
+ + RESOLUTION: replicated by spec/integration/bundle_install_spec.rb ("path-installed
64
+ + bundler plugin's source directory has been renamed"): Bundler's plugin index pins
65
+ + the absolute path, and `gemvault doctor` clears it and reinstalls. Installing the
66
+ + published gems (no `plugin ... path:` line) avoids the class entirely.
67
+ Status: closed
63
68
 
64
69
  Id: 2
65
- Updated: Tue, 21 Apr 2026 23:31:42 -0400
70
+ Updated: Sun, 19 Jul 2026 03:27:39 +0000
66
71
  Name: Renaming gemv file breaks bundler config
67
72
  Description: Steps to replicate:
68
73
  + 1. add vault source with some gems
@@ -81,10 +86,14 @@ Description: Steps to replicate:
81
86
  + ```
82
87
  +
83
88
  + Where vendored.gemv is the name of the old file, and there is still an entry in Gemfile.lock
84
- Status: open
89
+ +
90
+ + RESOLUTION: fixed on the tarvault branch; replicated by
91
+ + spec/integration/bundle_install_spec.rb ("when the .gemv file is renamed and the
92
+ + Gemfile updated to match"), passing.
93
+ Status: closed
85
94
 
86
95
  Id: 3
87
- Updated: Tue, 21 Apr 2026 23:42:59 -0400
96
+ Updated: Sun, 19 Jul 2026 03:27:39 +0000
88
97
  Name: Name of vault in logs should show relative path
89
98
  Description: This vault is in vendor/vendored_gems.gmv, relative to the Gemfile
90
99
  + in the logs of bundle install I see:
@@ -92,10 +101,14 @@ Description: This vault is in vendor/vendored_gems.gmv, relative to the Gemfile
92
101
  + ```
93
102
  + Installing acme 1.0.1 from vault vendored_gems.gemv
94
103
  + ```
95
- Status: open
104
+ +
105
+ + RESOLUTION: fixed on the tarvault branch; replicated by
106
+ + spec/integration/bundle_install_spec.rb ("logs the relative path as written"),
107
+ + passing.
108
+ Status: closed
96
109
 
97
110
  Id: 4
98
- Updated: Wed, 22 Apr 2026 12:16:44 -0400
111
+ Updated: Sun, 19 Jul 2026 03:27:39 +0000
99
112
  Name: Running bundle install reinstalls gemvault deps every single run
100
113
  Description: Anytime I run bundle install, I always see:
101
114
  +
@@ -109,10 +122,18 @@ Description: Anytime I run bundle install, I always see:
109
122
  + ```
110
123
  +
111
124
  + This is unacceptable. these should only need to be installed once
125
+ +
126
+ + ANALYSIS: upstream Bundler behavior. Bundler::Plugin.gemfile_install runs on
127
+ + every `bundle install`/`bundle update` (bundler cli/install.rb:41), re-resolves
128
+ + the inferred plugin definition remotely, and Source::Rubygems#install checks
129
+ + "already installed?" against the default gem paths rather than Plugin.root, so
130
+ + the plugin gems reinstall every run. No gemvault code runs in that path.
131
+ + Replicated by spec/integration/plugin_reinstall_spec.rb (marked pending so the
132
+ + suite flags it if a future Bundler fixes it). Worth filing at rubygems/rubygems.
112
133
  Status: open
113
134
 
114
135
  Id: 5
115
- Updated: Wed, 22 Apr 2026 18:24:09 -0400
136
+ Updated: Sun, 19 Jul 2026 03:27:39 +0000
116
137
  Name: Installing gem via rubygems fails to resolve absolute path
117
138
  Description: Consider the following:
118
139
  + ```
@@ -122,26 +143,46 @@ Description: Consider the following:
122
143
  + ```
123
144
  +
124
145
  + Notice an absolute path was passed to --source, yet it tried to resolve locally
125
- Status: open
146
+ +
147
+ + RESOLUTION: fixed on the tarvault branch; replicated by
148
+ + spec/integration/gem_install_spec.rb ("accepts a vault:// URI with an absolute
149
+ + path" and the file:// variant), passing. URI stripping now lives in
150
+ + Gemvault::VaultPath, shared with the CLI. Duplicate of #8.
151
+ Status: closed
126
152
 
127
153
  Id: 6
128
- Updated: Thu, 23 Apr 2026 11:04:39 -0400
154
+ Updated: Sun, 19 Jul 2026 03:27:39 +0000
129
155
  Name: Cannot add gem with non-numerical suffix
130
156
  Description: When adding a gem like 'ronin-db-0.2.1.patch1.gem', gemvault successfully adds the gem, but the gem install command fails:
131
157
  + ```
132
158
  + gemvault add myvault.gemv ronin-db-0.2.1.patch1.gem # success
133
159
  + gem install --debug --verbose --clear-sources --source file://myvault.gemv ronin-db # failure
134
160
  + ```
135
- Status: open
161
+ +
162
+ + RESOLUTION: RubyGems semantics, not a vault bug. A version containing letters
163
+ + (0.2.1.patch1) is a prerelease everywhere in RubyGems, and `gem install`
164
+ + excludes prereleases unless --pre is passed; with --pre the install from a
165
+ + vault succeeds. Replicated by spec/integration/gem_install_spec.rb ("treats it
166
+ + as a prerelease and installs it with --pre"). The relative `file://myvault.gemv`
167
+ + form also resolves now (Gemvault::VaultPath rejoins host and path).
168
+ Status: closed
136
169
 
137
170
  Id: 7
138
- Updated: Fri, 19 Jun 2026 10:42:46 -0400
171
+ Updated: Sun, 19 Jul 2026 03:27:39 +0000
139
172
  Name: Gemvault pollutes project dir with plugin files in .bundle
140
173
  Description: Why is it not using the plugin that is already installed globally?
174
+ +
175
+ + ANALYSIS: two parts. (1) Global `bundle plugin install bundler-source-vault`
176
+ + crashed outright (issue #10's bug also hit the global root); that is fixed and
177
+ + covered by spec/integration/plugin_install_spec.rb ("when run outside any
178
+ + project"). (2) The local .bundle/plugin copies come from the same upstream
179
+ + Bundler behavior as #4: when a Gemfile declares/implies a plugin, Bundler
180
+ + always resolves and installs it into the project-local plugin root, global
181
+ + install notwithstanding. Nothing gemvault-side can prevent that.
141
182
  Status: open
142
183
 
143
184
  Id: 8
144
- Updated: Wed, 22 Apr 2026 18:24:09 -0400
185
+ Updated: Sun, 19 Jul 2026 03:27:39 +0000
145
186
  Name: Installing gem via rubygems fails to resolve absolute path
146
187
  Description: Consider the following:
147
188
  + ```
@@ -151,10 +192,492 @@ Description: Consider the following:
151
192
  + ```
152
193
  +
153
194
  + Notice an absolute path was passed to --source, yet it tried to resolve locally
154
- Status: open
195
+ +
196
+ + RESOLUTION: duplicate of #5; see its resolution.
197
+ Status: closed
155
198
 
156
199
  Id: 9
157
- Updated: Sun, 28 Jun 2026 00:17:27 -0400
200
+ Updated: Sun, 19 Jul 2026 03:27:39 +0000
158
201
  Name: Gemvault commands should also be able to accept a uri
159
202
  Description: e.g. gemvault list vault:///Users/davidgillis/repos/vault/rubylib/myvault.gemv
160
- Status: open
203
+ +
204
+ + RESOLUTION: implemented. Gemvault::VaultPath resolves vault:// and file://
205
+ + locators (absolute and two-slash relative forms) and every CLI command that
206
+ + opens a vault goes through it, as does the RubyGems source. Covered by
207
+ + spec/gemvault/vault_path_spec.rb and spec/integration/cli/vault_uri_spec.rb.
208
+ Status: closed
209
+
210
+ Id: 10
211
+ Updated: Sun, 19 Jul 2026 03:27:39 +0000
212
+ Name: Bundler fails install on "bundle plugin install bundler-source-vault"
213
+ Description:
214
+ +
215
+ + [dev@reversal-store]/workspace% bundle plugin install bundler-source-vault
216
+ + Fetching gem metadata from https://rubygems.org/.......
217
+ + Resolving dependencies...
218
+ + Installing command_kit 0.6.0
219
+ + Fetching gemvault 0.1.5
220
+ + Installing gemvault 0.1.5
221
+ + Fetching bundler-source-vault 0.1.5
222
+ + Installing bundler-source-vault 0.1.5
223
+ + --- ERROR REPORT TEMPLATE -------------------------------------------------------
224
+ +
225
+ + ```
226
+ + LoadError: cannot load such file -- bundler/plugin/vault_source
227
+ + /workspace/.bundle/plugin/gems/bundler-source-vault-0.1.5/plugins.rb:21:in 'Kernel#require'
228
+ + /workspace/.bundle/plugin/gems/bundler-source-vault-0.1.5/plugins.rb:21:in '<top (required)>'
229
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/plugin.rb:317:in 'Kernel#load'
230
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/plugin.rb:317:in 'Bundler::Plugin.register_plugin'
231
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/plugin.rb:288:in 'Bundler::Plugin.save_plugin'
232
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/plugin.rb:263:in 'block in Bundler::Plugin.save_plugins'
233
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/plugin.rb:255:in 'Array#each'
234
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/plugin.rb:255:in 'Bundler::Plugin.save_plugins'
235
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/plugin.rb:43:in 'Bundler::Plugin.install'
236
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/cli/plugin.rb:22:in 'Bundler::CLI::Plugin#install'
237
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/vendor/thor/lib/thor/command.rb:28:in 'Bundler::Thor::Command#run'
238
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in 'Bundler::Thor::Invocation#invoke_command'
239
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/vendor/thor/lib/thor.rb:538:in 'Bundler::Thor.dispatch'
240
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/vendor/thor/lib/thor/invocation.rb:116:in 'Bundler::Thor::Invocation#invoke'
241
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/vendor/thor/lib/thor.rb:338:in 'block in Bundler::CLI#subcommand'
242
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/vendor/thor/lib/thor/command.rb:28:in 'Bundler::Thor::Command#run'
243
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in 'Bundler::Thor::Invocation#invoke_command'
244
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/vendor/thor/lib/thor.rb:538:in 'Bundler::Thor.dispatch'
245
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/cli.rb:35:in 'Bundler::CLI.dispatch'
246
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/vendor/thor/lib/thor/base.rb:584:in 'Bundler::Thor::Base::ClassMethods#start'
247
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/cli.rb:29:in 'Bundler::CLI.start'
248
+ + /usr/local/share/gems/gems/bundler-4.0.14/exe/bundle:28:in 'block in <top (required)>'
249
+ + /usr/local/share/gems/gems/bundler-4.0.14/lib/bundler/friendly_errors.rb:118:in 'Bundler.with_friendly_errors'
250
+ + /usr/local/share/gems/gems/bundler-4.0.14/exe/bundle:20:in '<top (required)>'
251
+ + /usr/local/share/ruby/site_ruby/rubygems.rb:305:in 'Kernel#load'
252
+ + /usr/local/share/ruby/site_ruby/rubygems.rb:305:in 'Gem.activate_and_load_bin_path'
253
+ + /usr/local/bin/bundle:25:in '<main>'
254
+ +
255
+ + ```
256
+ +
257
+ + ## Environment
258
+ +
259
+ + ```
260
+ + Bundler 4.0.14
261
+ + Platforms ruby, aarch64-linux
262
+ + Ruby 4.0.1p0 (2026-01-13 revision e04267a14b1a5dea2d2c368e48d41bd3db441f4f) [aarch64-linux]
263
+ + Full Path /usr/bin/ruby
264
+ + Config Dir /etc
265
+ + RubyGems 4.0.14
266
+ + Gem Home /workspace/.bundle/plugin
267
+ + Gem Path /workspace/.bundle/plugin
268
+ + User Home /home/dev
269
+ + User Path /home/dev/.local/share/gem/ruby/4.0.0
270
+ + Bin Dir /workspace/.bundle/plugin/bin
271
+ + OpenSSL
272
+ + Compiled OpenSSL 3.5.4 30 Sep 2025
273
+ + Loaded OpenSSL 3.5.7 9 Jun 2026
274
+ + Cert File /etc/pki/tls/cert.pem
275
+ + Cert Dir /etc/pki/tls/certs
276
+ + Tools
277
+ + Git 2.54.0
278
+ + RVM not installed
279
+ + rbenv rbenv 1.3.2
280
+ + chruby not installed
281
+ + ```
282
+ +
283
+ + ## Bundler Build Metadata
284
+ +
285
+ + ```
286
+ + Timestamp 2026-07-19
287
+ + Git SHA 265babb801
288
+ + ```
289
+ +
290
+ + ## Bundler settings
291
+ +
292
+ + ```
293
+ + cache_all
294
+ + Set for your local app (/workspace/.bundle/config): true
295
+ + frozen
296
+ + Set for your local app (/workspace/.bundle/config): false
297
+ + gem.push_key
298
+ + Set for your local app (/workspace/.bundle/config): "[REDACTED]"
299
+ + global_gem_cache
300
+ + Set for your local app (/workspace/.bundle/config): true
301
+ + path
302
+ + Set for your local app (/workspace/.bundle/config): "vendor"
303
+ + ```
304
+ +
305
+ + ## Gemfile
306
+ +
307
+ + ### Gemfile
308
+ +
309
+ + ```ruby
310
+ + source "https://rubygems.org"
311
+ +
312
+ + source "vendor/vendored.gemv", type: :vault do
313
+ + gem "tailspin"
314
+ + end
315
+ +
316
+ + gemspec
317
+ +
318
+ + gem "addressable", "~> 2.8"
319
+ + gem "async"
320
+ + gem "csv"
321
+ + gem "debug", platform: :mri
322
+ + gem "flexor", "~> 0.1.2"
323
+ + gem "irb", platform: :mri
324
+ + gem "minitest"
325
+ + gem "minitest-reporters", require: false
326
+ + gem "rake"
327
+ + gem "repl_type_completor", platform: :mri
328
+ + gem "gempilot"
329
+ + gem "rubocop"
330
+ + gem "rubocop-minitest"
331
+ + gem "rubocop-performance"
332
+ + gem "rubocop-rake"
333
+ +
334
+ + gem "minitest-mock", "~> 5.27"
335
+ + ```
336
+ +
337
+ + ### Gemfile.lock
338
+ +
339
+ + ```
340
+ + PLUGIN SOURCE
341
+ + remote: vendor/vendored.gemv
342
+ + type: vault
343
+ + specs:
344
+ + tailspin (0.0.3)
345
+ + flexor
346
+ + zeitwerk
347
+ +
348
+ + PATH
349
+ + remote: .
350
+ + specs:
351
+ + reversal-store (0.0.4)
352
+ + async
353
+ + base64
354
+ + command_kit
355
+ + console
356
+ + csv
357
+ + flexor
358
+ + pstore
359
+ + tailspin (>= 0.0.3)
360
+ + zeitwerk
361
+ +
362
+ + GEM
363
+ + remote: https://rubygems.org/
364
+ + specs:
365
+ + addressable (2.9.0)
366
+ + public_suffix (>= 2.0.2, < 8.0)
367
+ + ansi (1.6.0)
368
+ + ast (2.4.3)
369
+ + async (2.42.0)
370
+ + console (~> 1.29)
371
+ + fiber-annotation
372
+ + io-event (~> 1.11)
373
+ + metrics (~> 0.12)
374
+ + traces (~> 0.18)
375
+ + base64 (0.3.0)
376
+ + builder (3.3.0)
377
+ + command_kit (0.6.0)
378
+ + console (1.37.0)
379
+ + fiber-annotation
380
+ + fiber-local (~> 1.1)
381
+ + json
382
+ + csv (3.3.5)
383
+ + debug (1.11.1)
384
+ + irb (~> 1.10)
385
+ + reline (>= 0.3.8)
386
+ + drb (2.2.3)
387
+ + erb (6.0.5)
388
+ + fiber-annotation (0.2.0)
389
+ + fiber-local (1.1.0)
390
+ + fiber-storage
391
+ + fiber-storage (1.0.1)
392
+ + flexor (0.1.4)
393
+ + gempilot (0.2.3)
394
+ + command_kit
395
+ + rake
396
+ + warning
397
+ + zeitwerk
398
+ + io-console (0.8.2)
399
+ + io-event (1.19.2)
400
+ + irb (1.18.0)
401
+ + pp (>= 0.6.0)
402
+ + prism (>= 1.3.0)
403
+ + rdoc (>= 4.0.0)
404
+ + reline (>= 0.4.2)
405
+ + json (2.21.1)
406
+ + language_server-protocol (3.17.0.6)
407
+ + lint_roller (1.1.0)
408
+ + logger (1.7.0)
409
+ + metrics (0.15.0)
410
+ + minitest (6.0.6)
411
+ + drb (~> 2.0)
412
+ + prism (~> 1.5)
413
+ + minitest-mock (5.27.0)
414
+ + minitest-reporters (1.8.0)
415
+ + ansi
416
+ + builder
417
+ + minitest (>= 5.0, < 7)
418
+ + ruby-progressbar
419
+ + parallel (2.1.0)
420
+ + parser (3.3.12.0)
421
+ + ast (~> 2.4.1)
422
+ + racc
423
+ + pp (0.6.4)
424
+ + prettyprint
425
+ + prettyprint (0.2.0)
426
+ + prism (1.9.0)
427
+ + pstore (0.2.1)
428
+ + public_suffix (7.0.5)
429
+ + racc (1.8.1)
430
+ + rainbow (3.1.1)
431
+ + rake (13.4.2)
432
+ + rbs (4.0.3)
433
+ + logger
434
+ + prism (>= 1.6.0)
435
+ + tsort
436
+ + rdoc (8.0.0)
437
+ + erb
438
+ + prism (>= 1.6.0)
439
+ + rbs (>= 4.0.0)
440
+ + tsort
441
+ + regexp_parser (2.12.0)
442
+ + reline (0.6.3)
443
+ + io-console (~> 0.5)
444
+ + repl_type_completor (0.1.15)
445
+ + prism (~> 1.0)
446
+ + rbs (>= 2.7.0)
447
+ + rubocop (1.88.2)
448
+ + json (~> 2.3)
449
+ + language_server-protocol (~> 3.17.0.2)
450
+ + lint_roller (~> 1.1.0)
451
+ + parallel (>= 1.10)
452
+ + parser (>= 3.3.0.2)
453
+ + rainbow (>= 2.2.2, < 4.0)
454
+ + regexp_parser (>= 2.9.3, < 3.0)
455
+ + rubocop-ast (>= 1.49.0, < 2.0)
456
+ + ruby-progressbar (~> 1.7)
457
+ + unicode-display_width (>= 2.4.0, < 4.0)
458
+ + rubocop-ast (1.50.0)
459
+ + parser (>= 3.3.7.2)
460
+ + prism (~> 1.7)
461
+ + rubocop-minitest (0.39.1)
462
+ + lint_roller (~> 1.1)
463
+ + rubocop (>= 1.75.0, < 2.0)
464
+ + rubocop-ast (>= 1.38.0, < 2.0)
465
+ + rubocop-performance (1.26.1)
466
+ + lint_roller (~> 1.1)
467
+ + rubocop (>= 1.75.0, < 2.0)
468
+ + rubocop-ast (>= 1.47.1, < 2.0)
469
+ + rubocop-rake (0.7.1)
470
+ + lint_roller (~> 1.1)
471
+ + rubocop (>= 1.72.1)
472
+ + ruby-progressbar (1.13.0)
473
+ + traces (0.18.2)
474
+ + tsort (0.2.0)
475
+ + unicode-display_width (3.2.0)
476
+ + unicode-emoji (~> 4.1)
477
+ + unicode-emoji (4.2.0)
478
+ + warning (1.6.0)
479
+ + zeitwerk (2.8.2)
480
+ +
481
+ + PLATFORMS
482
+ + aarch64-linux
483
+ + ruby
484
+ +
485
+ + DEPENDENCIES
486
+ + addressable (~> 2.8)
487
+ + async
488
+ + csv
489
+ + debug
490
+ + flexor (~> 0.1.2)
491
+ + gempilot
492
+ + irb
493
+ + minitest
494
+ + minitest-mock (~> 5.27)
495
+ + minitest-reporters
496
+ + rake
497
+ + repl_type_completor
498
+ + reversal-store!
499
+ + rubocop
500
+ + rubocop-minitest
501
+ + rubocop-performance
502
+ + rubocop-rake
503
+ + tailspin!
504
+ +
505
+ + CHECKSUMS
506
+ + addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
507
+ + ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658
508
+ + ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
509
+ + async (2.42.0) sha256=536078293b8c95d5b5679fa01bf7d2458bcc65cd46dec2c4cb3580feaeb965c6
510
+ + base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
511
+ + builder (3.3.0) sha256=497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f
512
+ + command_kit (0.6.0) sha256=e57f29cf5aee4f571c210041d910ff87f85749e42dfe75139c57cc93d84afa90
513
+ + console (1.37.0) sha256=8093b286c2595a063849c098594fee5155ecc7967d36f3aa8cbe7569c8f3efd7
514
+ + csv (3.3.5) sha256=6e5134ac3383ef728b7f02725d9872934f523cb40b961479f69cf3afa6c8e73f
515
+ + debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6
516
+ + drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373
517
+ + erb (6.0.5) sha256=858e63488cb796c9daba8b6e9ff4b3879c395022049be9a66a8e00980e612eac
518
+ + fiber-annotation (0.2.0) sha256=7abfadf1d119f508867d4103bf231c0354d019cc39a5738945dec2edadaf6c03
519
+ + fiber-local (1.1.0) sha256=c885f94f210fb9b05737de65d511136ea602e00c5105953748aa0f8793489f06
520
+ + fiber-storage (1.0.1) sha256=f48e5b6d8b0be96dac486332b55cee82240057065dc761c1ea692b2e719240e1
521
+ + flexor (0.1.4) sha256=f0196703da64e8e6b75fef021ba792ad73a5880848cbcd3d1cca709b45940c72
522
+ + gempilot (0.2.3) sha256=b011c5965917bb4faccc85ba63ac68271d9baf9bcab4a9f9e3334be3bb8cd020
523
+ + io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
524
+ + io-event (1.19.2) sha256=c9ac4f0c3153b453727ab15c03cc762b29a207979c703b2bb15c8be6209d4b4c
525
+ + irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3
526
+ + json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583
527
+ + language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0
528
+ + lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
529
+ + logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
530
+ + metrics (0.15.0) sha256=61ded5bac95118e995b1bc9ed4a5f19bc9814928a312a85b200abbdac9039072
531
+ + minitest (6.0.6) sha256=153ea36d1d987a62942382b61075745042a2b3123b1cd48f4c3675af9cc7d6f1
532
+ + minitest-mock (5.27.0) sha256=7040ed7185417a966920987eaa6eaf1be4ea1fc5b25bb03ff4703f98564a55b0
533
+ + minitest-reporters (1.8.0) sha256=8ce5280fb73ad3178ae525454df169b6f28c1b38b1d088ea91815d3a370ba384
534
+ + parallel (2.1.0) sha256=b35258865c2e31134c5ecb708beaaf6772adf9d5efae28e93e99260877b09356
535
+ + parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828
536
+ + pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570
537
+ + prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
538
+ + prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
539
+ + pstore (0.2.1) sha256=03904d0f2c66579e96d1e6704cdabc0c88df7ea8ed8782d9f3569f6f6c702c1a
540
+ + public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
541
+ + racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
542
+ + rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
543
+ + rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701
544
+ + rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14
545
+ + rdoc (8.0.0) sha256=03bf8c08a9639658855a0cfd77c0abca8325c227693f7f33f82957811348c469
546
+ + regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb
547
+ + reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835
548
+ + repl_type_completor (0.1.15) sha256=dec24c45fffefa3b55b19115fee20b3446c2f75c7605f579ab6047e931edd335
549
+ + reversal-store (0.0.4)
550
+ + rubocop (1.88.2) sha256=8def251c90cd955feb4daa3edc0ab56893250c4ce90ef81e6c80c03f9a939bbf
551
+ + rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db
552
+ + rubocop-minitest (0.39.1) sha256=998398d6da4026d297f0f9bf709a1eac5f2b6947c24431f94af08138510cf7ed
553
+ + rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834
554
+ + rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d
555
+ + ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
556
+ + tailspin (0.0.3)
557
+ + traces (0.18.2) sha256=80f1649cb4daace1d7174b81f3b3b7427af0b93047759ba349960cb8f315e214
558
+ + tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
559
+ + unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
560
+ + unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
561
+ + warning (1.6.0) sha256=a49cdfae19fb77d19afff2efbe45f8ab759e9cd25b4e4ce2c79dbaf46bdb6c9e
562
+ + zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12
563
+ +
564
+ + BUNDLED WITH
565
+ + 4.0.14
566
+ + ```
567
+ +
568
+ + ## Gemspecs
569
+ +
570
+ + ### reversal-store.gemspec
571
+ +
572
+ + ```ruby
573
+ + require_relative "lib/reversal/store/version"
574
+ +
575
+ + Gem::Specification.new do |spec|
576
+ + spec.name = "reversal-store"
577
+ + spec.version = Reversal::Store::VERSION
578
+ + spec.authors = ["David Gillis"]
579
+ + spec.email = ["david@flipmine.com"]
580
+ +
581
+ + spec.summary = "Reversal device storage"
582
+ + spec.license = "MIT"
583
+ + spec.required_ruby_version = ">= 3.4.8"
584
+ +
585
+ + spec.metadata["allowed_push_host"] = "https://gemsluice.flipmine.com/private"
586
+ +
587
+ + gemspec = File.basename(__FILE__)
588
+ + spec.files = IO.popen(%w[git ls-files -z], chdir: __dir__, err: IO::NULL) do |ls|
589
+ + ls.readlines("\x0", chomp: true).reject do |f|
590
+ + (f == gemspec) ||
591
+ + f.start_with?(*%w[bin/ test/ spec/ features/ .git appveyor Gemfile])
592
+ + end
593
+ + end
594
+ + spec.files << "vendor/vendored.gemv"
595
+ + spec.bindir = "exe"
596
+ + spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
597
+ + spec.require_paths = ["lib"]
598
+ +
599
+ + spec.add_dependency "base64"
600
+ + spec.add_dependency "async"
601
+ + spec.add_dependency "console"
602
+ + spec.add_dependency "command_kit"
603
+ + spec.add_dependency "csv"
604
+ + spec.add_dependency "flexor"
605
+ + spec.add_dependency "pstore"
606
+ + spec.add_dependency "zeitwerk"
607
+ + spec.add_dependency "tailspin", '>= 0.0.3'
608
+ + spec.metadata["rubygems_mfa_required"] = "true"
609
+ + end
610
+ + ```
611
+ +
612
+ + --- TEMPLATE END ----------------------------------------------------------------
613
+ +
614
+ + Unfortunately, an unexpected error occurred, and Bundler cannot continue.
615
+ +
616
+ + First, try this link to see if there are any existing issue reports for this error:
617
+ + https://github.com/ruby/rubygems/search?q=cannot+load+such+file+--+bundler%2Fplugin%2Fvault_source&type=Issues
618
+ +
619
+ + If there aren't any reports for this error yet, please fill in the new issue form located at https://github.com/ruby/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md. Make sure to copy and paste the full output of this command under the "What happened instead?" section.
620
+ +
621
+ + RESOLUTION: two root causes, both fixed. (1) `bundle plugin install` switches
622
+ + GEM_HOME to the plugin root mid-process, and RubyGems' spec stub cache is
623
+ + populated during resolution, before gemvault is installed there; the shim's
624
+ + preamble only checked Gem::Specification.dirs membership, skipped its reset,
625
+ + and the stale cache made `require "bundler/plugin/vault_source"` fail. The
626
+ + shim now derives the gem root from its own __dir__ (covering plugin roots,
627
+ + the global root, and plain GEM_HOME installs), adds unsearched spec dirs, and
628
+ + resets the stale spec cache when gemvault is not resolvable. (2) gemvault
629
+ + declared bundler as a runtime dependency, which fails activation wherever
630
+ + GEM_PATH is restricted (bundle exec, plugin install) on rubies that ship
631
+ + bundler as a regular gem; the dependency is removed. Replicated by
632
+ + spec/integration/plugin_install_spec.rb (project with path vendor, global
633
+ + root, distro-style regular-gem bundler), all passing.
634
+ Status: closed
635
+
636
+ Id: 11
637
+ Updated: Sun, 19 Jul 2026 03:56:57 +0000
638
+ Name: CI tests aren't running
639
+ Description: CI tests should be running on all platforms
640
+ +
641
+ + ANALYSIS: .github/workflows/ci.yml exists (unit tests, specs, rubocop on
642
+ + push/PR to master). Two likely reasons it cannot go green: (1) `rake rubocop`
643
+ + exits nonzero on the pre-existing Gemspec/RequiredRubyVersion offenses
644
+ + (required_ruby_version ">= 3.4.8" vs TargetRubyVersion 4.0 in .rubocop.yml) --
645
+ + pick one and align; (2) `rake spec` builds/uses a podman image, so the runner
646
+ + needs podman available. Not replicable as a podman rspec spec (CI infra).
647
+ +
648
+ + RESOLUTION: three blockers fixed. (1) TargetRubyVersion aligned to 3.4.8, the
649
+ + gemspec floor, clearing the Gemspec/RequiredRubyVersion offenses; whole
650
+ + tracked tree is rubocop-clean. (2) The integration job invoked
651
+ + `rake spec:integration`, which did not exist -- the Rakefile now defines
652
+ + spec:host (--tag ~integration) and spec:integration (--tag integration,
653
+ + depends on spec:setup), and the unit job runs spec:host instead of the full
654
+ + podman-backed `rake spec`. (3) The integration job installs podman if the
655
+ + runner image lacks it. Every CI step verified locally, rubocop against a
656
+ + simulated clean checkout: rake test 113/0, spec:host 100/0, rubocop 91 files
657
+ + clean, spec:build ok, spec:integration 45/0 (1 intentional pending). First
658
+ + green run happens on the next push to master/PR.
659
+ Status: closed
660
+
661
+ Id: 12
662
+ Updated: Sun, 19 Jul 2026 03:27:39 +0000
663
+ Name: bundle exec fails after successful bundle install with path vendor
664
+ Description: Reported 2026-07-19 (reversal-store): bundle install succeeds, then
665
+ + any `bundle exec` fails while parsing the Gemfile:
666
+ +
667
+ + ```
668
+ + [!] There was an error parsing `Gemfile`: Could not find 'bundler' (>= 2.0)
669
+ + among 101 total gem(s)
670
+ + Checked in 'GEM_PATH=/workspace/vendor/ruby/4.0.0' at:
671
+ + /workspace/.bundle/plugin/specifications/gemvault-0.1.5.gemspec
672
+ + ```
673
+ +
674
+ + RESOLUTION: gemvault declared bundler as a runtime dependency. Under
675
+ + `bundle exec` with path vendor, GEM_PATH is restricted to the app bundle, and
676
+ + on rubies where bundler is a regular (non-default) gem its spec is invisible,
677
+ + so activating gemvault from the plugin root raises Gem::MissingSpecError while
678
+ + the Gemfile's vault source loads. The dependency is removed (bundler always
679
+ + exists in the process the plugin runs in). Replicated verbatim in podman by
680
+ + spec/integration/bundle_exec_spec.rb, which simulates distro-style rubies by
681
+ + reinstalling bundler as a regular gem and deleting its default-gem spec stub;
682
+ + also covers the system-installed (`gem install gemvault`) flow. Both passing.
683
+ Status: closed