confctl 2.2.2 → 3.0.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 (178) hide show
  1. checksums.yaml +4 -4
  2. data/.git-hooks/pre_commit/nixfmt.rb +13 -0
  3. data/.github/workflows/rspec.yml +64 -0
  4. data/.github/workflows/rubocop.yml +27 -0
  5. data/.github/workflows/tests.yml +139 -0
  6. data/.gitignore +12 -7
  7. data/.overcommit.yml +2 -0
  8. data/.rspec +1 -0
  9. data/.rubocop.yml +8 -1
  10. data/AGENTS.md +42 -0
  11. data/CHANGELOG.md +57 -0
  12. data/Gemfile +3 -2
  13. data/Gemfile.lock +198 -0
  14. data/README.md +166 -58
  15. data/Rakefile +5 -0
  16. data/confctl.gemspec +20 -2
  17. data/docs/carrier.md +3 -3
  18. data/docs/flake-inputs.md +159 -0
  19. data/docs/swpins-to-flakes.md +325 -0
  20. data/example/cluster/module-list.nix +2 -1
  21. data/example/cluster/nixos-machine/config.nix +12 -2
  22. data/example/cluster/nixos-machine/hardware.nix +6 -1
  23. data/example/cluster/vpsadminos-container/config.nix +6 -1
  24. data/example/cluster/vpsadminos-container/module.nix +4 -1
  25. data/example/cluster/vpsadminos-machine/config.nix +6 -1
  26. data/example/cluster/vpsadminos-machine/hardware.nix +6 -1
  27. data/example/cluster/vpsadminos-machine/module.nix +5 -2
  28. data/example/cluster/vpsfreecz-vps/config.nix +6 -1
  29. data/example/cluster/vpsfreecz-vps/module.nix +4 -1
  30. data/example/configs/swpins.nix +8 -3
  31. data/example/environments/base.nix +6 -1
  32. data/example/swpins/core.json +35 -0
  33. data/example-flake/.gitignore +2 -0
  34. data/example-flake/README.md +38 -0
  35. data/example-flake/cluster/cluster.nix +5 -0
  36. data/example-flake/cluster/module-list.nix +4 -0
  37. data/example-flake/cluster/nested/nixos-machine/config.nix +25 -0
  38. data/example-flake/cluster/nested/nixos-machine/hardware.nix +9 -0
  39. data/example-flake/cluster/nested/nixos-machine/module.nix +8 -0
  40. data/example-flake/cluster/nixos-machine/config.nix +25 -0
  41. data/example-flake/cluster/nixos-machine/hardware.nix +9 -0
  42. data/example-flake/cluster/nixos-machine/module.nix +8 -0
  43. data/example-flake/cluster/vpsadminos-container/config.nix +28 -0
  44. data/example-flake/cluster/vpsadminos-container/module.nix +8 -0
  45. data/example-flake/cluster/vpsadminos-machine/config.nix +27 -0
  46. data/example-flake/cluster/vpsadminos-machine/hardware.nix +9 -0
  47. data/example-flake/cluster/vpsadminos-machine/module.nix +8 -0
  48. data/example-flake/cluster/vpsfreecz-vps/config.nix +31 -0
  49. data/example-flake/cluster/vpsfreecz-vps/module.nix +8 -0
  50. data/example-flake/configs/confctl.nix +10 -0
  51. data/example-flake/data/default.nix +5 -0
  52. data/example-flake/data/ssh-keys.nix +7 -0
  53. data/example-flake/environments/base.nix +18 -0
  54. data/example-flake/flake.lock +75 -0
  55. data/example-flake/flake.nix +36 -0
  56. data/example-flake/modules/module-list.nix +13 -0
  57. data/example-flake/shell.nix +11 -0
  58. data/flake.lock +159 -0
  59. data/flake.nix +189 -0
  60. data/gemset.nix +1022 -0
  61. data/lib/confctl/cli/app.rb +145 -0
  62. data/lib/confctl/cli/attr_filters.rb +1 -1
  63. data/lib/confctl/cli/cluster.rb +681 -108
  64. data/lib/confctl/cli/command.rb +24 -2
  65. data/lib/confctl/cli/configuration.rb +171 -106
  66. data/lib/confctl/cli/generation.rb +65 -1
  67. data/lib/confctl/cli/inputs/channels.rb +190 -0
  68. data/lib/confctl/cli/inputs/machines.rb +83 -0
  69. data/lib/confctl/cli/inputs/root.rb +101 -0
  70. data/lib/confctl/cli/inputs.rb +5 -0
  71. data/lib/confctl/cli/log_view.rb +21 -10
  72. data/lib/confctl/cli/migrate/swpins_to_flakes.rb +866 -0
  73. data/lib/confctl/cli/migrate.rb +5 -0
  74. data/lib/confctl/cli/output_formatter.rb +5 -7
  75. data/lib/confctl/cli/swpins/base.rb +9 -0
  76. data/lib/confctl/cli/swpins/channel.rb +2 -5
  77. data/lib/confctl/cli/swpins/cluster.rb +2 -5
  78. data/lib/confctl/cli/swpins/core.rb +2 -5
  79. data/lib/confctl/config_type.rb +7 -0
  80. data/lib/confctl/flake_lock.rb +78 -0
  81. data/lib/confctl/flake_lock_diff.rb +36 -0
  82. data/lib/confctl/generation/build.rb +131 -24
  83. data/lib/confctl/generation/build_list.rb +4 -3
  84. data/lib/confctl/generation/unified.rb +14 -1
  85. data/lib/confctl/git_repo_mirror.rb +2 -2
  86. data/lib/confctl/health_checks/run_command.rb +3 -2
  87. data/lib/confctl/health_checks/systemd/properties.rb +1 -1
  88. data/lib/confctl/health_checks/systemd/property_list.rb +2 -2
  89. data/lib/confctl/inputs/commit_message.rb +125 -0
  90. data/lib/confctl/inputs/git_commit.rb +17 -0
  91. data/lib/confctl/inputs/nix_output_guard.rb +37 -0
  92. data/lib/confctl/inputs/setter.rb +179 -0
  93. data/lib/confctl/inputs/updater.rb +76 -0
  94. data/lib/confctl/inputs.rb +5 -0
  95. data/lib/confctl/inputs_info.rb +50 -0
  96. data/lib/confctl/line_buffer.rb +1 -1
  97. data/lib/confctl/machine.rb +18 -3
  98. data/lib/confctl/machine_control.rb +8 -2
  99. data/lib/confctl/machine_list.rb +2 -2
  100. data/lib/confctl/machine_status.rb +63 -20
  101. data/lib/confctl/nix/args.rb +48 -0
  102. data/lib/confctl/nix.rb +30 -437
  103. data/lib/confctl/nix_build_flake.rb +95 -0
  104. data/lib/confctl/nix_copy.rb +14 -2
  105. data/lib/confctl/nix_flake.rb +449 -0
  106. data/lib/confctl/nix_format.rb +3 -3
  107. data/lib/confctl/nix_legacy.rb +467 -0
  108. data/lib/confctl/swpins/change_set.rb +29 -3
  109. data/lib/confctl/swpins/specs/base.rb +2 -2
  110. data/lib/confctl/ui.rb +19 -0
  111. data/lib/confctl/version.rb +1 -1
  112. data/man/index.html +11 -0
  113. data/man/man8/confctl-options.nix.8.html +113 -0
  114. data/man/man8/confctl.8 +152 -21
  115. data/man/man8/confctl.8.html +355 -0
  116. data/man/man8/confctl.8.md +148 -17
  117. data/man/style.css +301 -0
  118. data/nix/evaluator.nix +94 -69
  119. data/nix/flake/mk-confctl-devshell.nix +85 -0
  120. data/nix/flake/mk-confctl-outputs.nix +522 -0
  121. data/nix/flake/mk-config-devshell.nix +168 -0
  122. data/nix/lib/default.nix +118 -65
  123. data/nix/lib/machine/default.nix +65 -45
  124. data/nix/lib/machine/info.nix +16 -5
  125. data/nix/lib/swpins/eval.nix +42 -29
  126. data/nix/lib/swpins/options.nix +6 -2
  127. data/nix/machines.nix +23 -15
  128. data/nix/modules/cluster/default.nix +104 -41
  129. data/nix/modules/confctl/carrier/base.nix +11 -4
  130. data/nix/modules/confctl/carrier/carrier-env.rb +2 -2
  131. data/nix/modules/confctl/carrier/netboot/build-netboot-server.rb +50 -16
  132. data/nix/modules/confctl/carrier/netboot/nixos.nix +56 -24
  133. data/nix/modules/confctl/configuration-info.nix +17 -0
  134. data/nix/modules/confctl/generations.nix +2 -2
  135. data/nix/modules/confctl/host.nix +13 -0
  136. data/nix/modules/confctl/inputs-info.nix +21 -0
  137. data/nix/modules/confctl/kexec-netboot/default.nix +13 -6
  138. data/nix/modules/confctl/kexec-netboot/kexec-netboot.8.adoc +3 -0
  139. data/nix/modules/confctl/kexec-netboot/kexec-netboot.rb +25 -16
  140. data/nix/modules/confctl/nix.nix +31 -1
  141. data/nix/modules/confctl/swpins.nix +13 -6
  142. data/nix/modules/module-list.nix +4 -2
  143. data/nix/modules/system-list.nix +4 -1
  144. data/nix/package.nix +37 -0
  145. data/shell.nix +39 -8
  146. data/skills/confctl-configuration-update/SKILL.md +228 -0
  147. data/skills/confctl-configuration-update/agents/openai.yaml +4 -0
  148. data/skills/confctl-release/SKILL.md +102 -0
  149. data/skills/confctl-release/agents/openai.yaml +4 -0
  150. data/spec/confctl/cli/cluster_health_check_spec.rb +43 -0
  151. data/spec/confctl/cli/cluster_skip_current_deploy_spec.rb +157 -0
  152. data/spec/confctl/cli/cluster_status_flake_spec.rb +83 -0
  153. data/spec/confctl/cli/inputs_set_output_spec.rb +70 -0
  154. data/spec/confctl/configuration_spec.rb +45 -0
  155. data/spec/confctl/inputs_spec.rb +104 -0
  156. data/spec/confctl/machine_control_spec.rb +112 -0
  157. data/spec/confctl/machine_list_spec.rb +47 -0
  158. data/spec/confctl/nix_flake_spec.rb +41 -0
  159. data/spec/confctl/swpins_spec.rb +106 -0
  160. data/spec/generation/build_modes_spec.rb +132 -0
  161. data/spec/inputs/commit_message_spec.rb +205 -0
  162. data/spec/inputs/nix_cached_fallback_spec.rb +50 -0
  163. data/spec/inputs/nix_output_guard_spec.rb +45 -0
  164. data/spec/spec_helper.rb +12 -0
  165. data/spec/support/cli_helper.rb +57 -0
  166. data/test-runner.sh +7 -0
  167. data/tests/all-tests.nix +30 -0
  168. data/tests/make-test.nix +15 -0
  169. data/tests/runner/extensions/confctl_helpers.rb +238 -0
  170. data/tests/runner/extensions/hostfwd_ports.rb +41 -0
  171. data/tests/suite/auto_rollback.nix +344 -0
  172. data/tests/suite/carrier/deploy.nix +751 -0
  173. data/tests/suite/carrier/netboot.nix +849 -0
  174. data/tests/suite/deploy/base.nix +806 -0
  175. data/tests/suite/deploy/flakes.nix +1 -0
  176. data/tests/suite/deploy/swpins.nix +1 -0
  177. metadata +104 -4
  178. data/nix/modules/confctl/overlays.nix +0 -15
data/gemset.nix ADDED
@@ -0,0 +1,1022 @@
1
+ {
2
+ activesupport = {
3
+ dependencies = [
4
+ "base64"
5
+ "bigdecimal"
6
+ "concurrent-ruby"
7
+ "connection_pool"
8
+ "drb"
9
+ "i18n"
10
+ "json"
11
+ "logger"
12
+ "minitest"
13
+ "securerandom"
14
+ "tzinfo"
15
+ "uri"
16
+ ];
17
+ groups = [ "default" ];
18
+ platforms = [ ];
19
+ source = {
20
+ remotes = [ "https://rubygems.org" ];
21
+ sha256 = "1pw09rmd9f9x0i0ai11ajcf6c7xvi48pn8sbjf8q7z648gzd67c9";
22
+ type = "gem";
23
+ };
24
+ version = "8.1.4";
25
+ };
26
+ ast = {
27
+ groups = [
28
+ "default"
29
+ "development"
30
+ "test"
31
+ ];
32
+ platforms = [ ];
33
+ source = {
34
+ remotes = [ "https://rubygems.org" ];
35
+ sha256 = "10yknjyn0728gjn6b5syynvrvrwm66bhssbxq8mkhshxghaiailm";
36
+ type = "gem";
37
+ };
38
+ version = "2.4.3";
39
+ };
40
+ base64 = {
41
+ groups = [ "default" ];
42
+ platforms = [ ];
43
+ source = {
44
+ remotes = [ "https://rubygems.org" ];
45
+ sha256 = "0yx9yn47a8lkfcjmigk79fykxvr80r4m1i35q82sxzynpbm7lcr7";
46
+ type = "gem";
47
+ };
48
+ version = "0.3.0";
49
+ };
50
+ bigdecimal = {
51
+ groups = [
52
+ "default"
53
+ "development"
54
+ "test"
55
+ ];
56
+ platforms = [ ];
57
+ source = {
58
+ remotes = [ "https://rubygems.org" ];
59
+ sha256 = "0rng45p4vc3f6nac44cnylwch7rj4zsff3icdz6c7garwpjy3sv1";
60
+ type = "gem";
61
+ };
62
+ version = "4.1.3";
63
+ };
64
+ binman = {
65
+ dependencies = [ "opener" ];
66
+ groups = [ "default" ];
67
+ platforms = [ ];
68
+ source = {
69
+ remotes = [ "https://rubygems.org" ];
70
+ sha256 = "1wn4myh5ir80j6xmvrbz6hrq47m9p4l6yd6nyk1g1r9klds52yvn";
71
+ type = "gem";
72
+ };
73
+ version = "5.1.0";
74
+ };
75
+ childprocess = {
76
+ dependencies = [ "logger" ];
77
+ groups = [
78
+ "default"
79
+ "development"
80
+ "test"
81
+ ];
82
+ platforms = [ ];
83
+ source = {
84
+ remotes = [ "https://rubygems.org" ];
85
+ sha256 = "1v5nalaarxnfdm6rxb7q6fmc6nx097jd630ax6h9ch7xw95li3cs";
86
+ type = "gem";
87
+ };
88
+ version = "5.1.0";
89
+ };
90
+ concurrent-ruby = {
91
+ groups = [ "default" ];
92
+ platforms = [ ];
93
+ source = {
94
+ remotes = [ "https://rubygems.org" ];
95
+ sha256 = "1qfi2ns3zwkgq616fc127xiqhan7g7m7gqpwriwcr34nds1vxwdj";
96
+ type = "gem";
97
+ };
98
+ version = "1.3.8";
99
+ };
100
+ confctl = {
101
+ dependencies = [
102
+ "curses"
103
+ "gli"
104
+ "json"
105
+ "md2man"
106
+ "rainbow"
107
+ "rake"
108
+ "require_all"
109
+ "tty-command"
110
+ "tty-cursor"
111
+ "tty-pager"
112
+ "tty-progressbar"
113
+ "tty-spinner"
114
+ "vpsfree-client"
115
+ ];
116
+ groups = [ "default" ];
117
+ platforms = [ ];
118
+ source = {
119
+ path = ./.;
120
+ type = "path";
121
+ };
122
+ version = "3.0.0";
123
+ };
124
+ connection_pool = {
125
+ groups = [ "default" ];
126
+ platforms = [ ];
127
+ source = {
128
+ remotes = [ "https://rubygems.org" ];
129
+ sha256 = "02ifws3c4x7b54fv17sm4cca18d2pfw1saxpdji2lbd1f6xgbzrk";
130
+ type = "gem";
131
+ };
132
+ version = "3.0.2";
133
+ };
134
+ curses = {
135
+ groups = [ "default" ];
136
+ platforms = [ ];
137
+ source = {
138
+ remotes = [ "https://rubygems.org" ];
139
+ sha256 = "0mvh67ijv03cvnwbkjxh6vrg9nhyndii4wyjd1ni7gabf0qgy965";
140
+ type = "gem";
141
+ };
142
+ version = "1.7.0";
143
+ };
144
+ diff-lcs = {
145
+ groups = [
146
+ "default"
147
+ "development"
148
+ "test"
149
+ ];
150
+ platforms = [ ];
151
+ source = {
152
+ remotes = [ "https://rubygems.org" ];
153
+ sha256 = "0qlrj2qyysc9avzlr4zs1py3x684hqm61n4czrsk1pyllz5x5q4s";
154
+ type = "gem";
155
+ };
156
+ version = "1.6.2";
157
+ };
158
+ domain_name = {
159
+ groups = [ "default" ];
160
+ platforms = [ ];
161
+ source = {
162
+ remotes = [ "https://rubygems.org" ];
163
+ sha256 = "0vgfimffni6yryk76k7grvixisaikbhc925fs3z07rpsd6gr8ddk";
164
+ type = "gem";
165
+ };
166
+ version = "0.6.20260921";
167
+ };
168
+ drb = {
169
+ groups = [ "default" ];
170
+ platforms = [ ];
171
+ source = {
172
+ remotes = [ "https://rubygems.org" ];
173
+ sha256 = "0wrkl7yiix268s2md1h6wh91311w95ikd8fy8m5gx589npyxc00b";
174
+ type = "gem";
175
+ };
176
+ version = "2.2.3";
177
+ };
178
+ gli = {
179
+ dependencies = [ "ostruct" ];
180
+ groups = [ "default" ];
181
+ platforms = [ ];
182
+ source = {
183
+ remotes = [ "https://rubygems.org" ];
184
+ sha256 = "1c2x5wh3d3mz8vg5bs7c5is0zvc56j6a2b4biv5z1w5hi1n8s3jq";
185
+ type = "gem";
186
+ };
187
+ version = "2.22.2";
188
+ };
189
+ hana = {
190
+ groups = [
191
+ "default"
192
+ "development"
193
+ "test"
194
+ ];
195
+ platforms = [ ];
196
+ source = {
197
+ remotes = [ "https://rubygems.org" ];
198
+ sha256 = "03cvrv2wl25j9n4n509hjvqnmwa60k92j741b64a1zjisr1dn9al";
199
+ type = "gem";
200
+ };
201
+ version = "1.3.7";
202
+ };
203
+ haveapi-client = {
204
+ dependencies = [
205
+ "activesupport"
206
+ "highline"
207
+ "json"
208
+ "require_all"
209
+ "rest-client"
210
+ "ruby-progressbar"
211
+ ];
212
+ groups = [ "default" ];
213
+ platforms = [ ];
214
+ source = {
215
+ remotes = [ "https://rubygems.org" ];
216
+ sha256 = "1xngwpff10qs6ylj72lm6xn8p0d1gx7i3v2f1kp7rgqza482dg2p";
217
+ type = "gem";
218
+ };
219
+ version = "0.29.8";
220
+ };
221
+ highline = {
222
+ dependencies = [ "reline" ];
223
+ groups = [ "default" ];
224
+ platforms = [ ];
225
+ source = {
226
+ remotes = [ "https://rubygems.org" ];
227
+ sha256 = "0jmvyhjp2v3iq47la7w6psrxbprnbnmzz0hxxski3vzn356x7jv7";
228
+ type = "gem";
229
+ };
230
+ version = "3.1.2";
231
+ };
232
+ http-accept = {
233
+ groups = [ "default" ];
234
+ platforms = [ ];
235
+ source = {
236
+ remotes = [ "https://rubygems.org" ];
237
+ sha256 = "09m1facypsdjynfwrcv19xcb1mqg8z6kk31g8r33pfxzh838c9n6";
238
+ type = "gem";
239
+ };
240
+ version = "1.7.0";
241
+ };
242
+ http-cookie = {
243
+ dependencies = [ "domain_name" ];
244
+ groups = [ "default" ];
245
+ platforms = [ ];
246
+ source = {
247
+ remotes = [ "https://rubygems.org" ];
248
+ sha256 = "1aga7z4p0dka4zcqw9i05wa4ab1q7h7cgnj328ldqqfycjz84jxs";
249
+ type = "gem";
250
+ };
251
+ version = "1.1.6";
252
+ };
253
+ i18n = {
254
+ dependencies = [ "concurrent-ruby" ];
255
+ groups = [ "default" ];
256
+ platforms = [ ];
257
+ source = {
258
+ remotes = [ "https://rubygems.org" ];
259
+ sha256 = "1dfikmmd9dllirsfq0kjiyxpmlq0afkxm5sslsr97r9g85ifpy80";
260
+ type = "gem";
261
+ };
262
+ version = "1.15.2";
263
+ };
264
+ iniparse = {
265
+ groups = [
266
+ "default"
267
+ "development"
268
+ "test"
269
+ ];
270
+ platforms = [ ];
271
+ source = {
272
+ remotes = [ "https://rubygems.org" ];
273
+ sha256 = "1wb1qy4i2xrrd92dc34pi7q7ibrjpapzk9y465v0n9caiplnb89n";
274
+ type = "gem";
275
+ };
276
+ version = "1.5.0";
277
+ };
278
+ io-console = {
279
+ groups = [ "default" ];
280
+ platforms = [ ];
281
+ source = {
282
+ remotes = [ "https://rubygems.org" ];
283
+ sha256 = "1cgvhm0d4awr8j42b8v1nl1jfgx45ihv8mylargfi3lj697k00x4";
284
+ type = "gem";
285
+ };
286
+ version = "0.9.4";
287
+ };
288
+ json = {
289
+ groups = [
290
+ "default"
291
+ "development"
292
+ "test"
293
+ ];
294
+ platforms = [ ];
295
+ source = {
296
+ remotes = [ "https://rubygems.org" ];
297
+ sha256 = "0shwgjqbj856mb6m9kgkpy08nhym2gdvc2yaprlimfmky9y3n78z";
298
+ type = "gem";
299
+ };
300
+ version = "2.21.2";
301
+ };
302
+ json_schemer = {
303
+ dependencies = [
304
+ "bigdecimal"
305
+ "hana"
306
+ "regexp_parser"
307
+ "simpleidn"
308
+ ];
309
+ groups = [
310
+ "default"
311
+ "development"
312
+ "test"
313
+ ];
314
+ platforms = [ ];
315
+ source = {
316
+ remotes = [ "https://rubygems.org" ];
317
+ sha256 = "15p31bq932bfpsi1wgrkgwm71l7z1h1w53q6vl44w6kjrr6gn09g";
318
+ type = "gem";
319
+ };
320
+ version = "2.5.0";
321
+ };
322
+ language_server-protocol = {
323
+ groups = [
324
+ "default"
325
+ "development"
326
+ "test"
327
+ ];
328
+ platforms = [ ];
329
+ source = {
330
+ remotes = [ "https://rubygems.org" ];
331
+ sha256 = "1w5p8c2145lmqzr25bxh4ikzjm6k8y1k5lriqqdpw9pq730w1wjy";
332
+ type = "gem";
333
+ };
334
+ version = "3.17.0.6";
335
+ };
336
+ lint_roller = {
337
+ groups = [
338
+ "default"
339
+ "development"
340
+ "test"
341
+ ];
342
+ platforms = [ ];
343
+ source = {
344
+ remotes = [ "https://rubygems.org" ];
345
+ sha256 = "11yc0d84hsnlvx8cpk4cbj6a4dz9pk0r1k29p0n1fz9acddq831c";
346
+ type = "gem";
347
+ };
348
+ version = "1.1.0";
349
+ };
350
+ logger = {
351
+ groups = [
352
+ "default"
353
+ "development"
354
+ "test"
355
+ ];
356
+ platforms = [ ];
357
+ source = {
358
+ remotes = [ "https://rubygems.org" ];
359
+ sha256 = "00q2zznygpbls8asz5knjvvj2brr3ghmqxgr83xnrdj4rk3xwvhr";
360
+ type = "gem";
361
+ };
362
+ version = "1.7.0";
363
+ };
364
+ mcp = {
365
+ dependencies = [ "json_schemer" ];
366
+ groups = [
367
+ "default"
368
+ "development"
369
+ "test"
370
+ ];
371
+ platforms = [ ];
372
+ source = {
373
+ remotes = [ "https://rubygems.org" ];
374
+ sha256 = "162xg5yzwbrd335dmfkcjxk4fl5chpmwb2lvbmpgvdk07dgkmkwa";
375
+ type = "gem";
376
+ };
377
+ version = "0.25.0";
378
+ };
379
+ md2man = {
380
+ dependencies = [
381
+ "binman"
382
+ "redcarpet"
383
+ "rouge"
384
+ ];
385
+ groups = [ "default" ];
386
+ platforms = [ ];
387
+ source = {
388
+ remotes = [ "https://rubygems.org" ];
389
+ sha256 = "0ii25vxasg3fm93wa2cabl4c8ijqdcdr8if8sd98rv9kix42gpp5";
390
+ type = "gem";
391
+ };
392
+ version = "5.1.2";
393
+ };
394
+ mime-types = {
395
+ dependencies = [
396
+ "logger"
397
+ "mime-types-data"
398
+ ];
399
+ groups = [ "default" ];
400
+ platforms = [ ];
401
+ source = {
402
+ remotes = [ "https://rubygems.org" ];
403
+ sha256 = "0mjyxl7c0xzyqdqa8r45hqg7jcw2prp3hkp39mdf223g4hfgdsyw";
404
+ type = "gem";
405
+ };
406
+ version = "3.7.0";
407
+ };
408
+ mime-types-data = {
409
+ groups = [ "default" ];
410
+ platforms = [ ];
411
+ source = {
412
+ remotes = [ "https://rubygems.org" ];
413
+ sha256 = "0bxfwiafwy50qlq5pz9kc61mcx21jg8gj1afb29z8mzqzprp6yb5";
414
+ type = "gem";
415
+ };
416
+ version = "3.2026.1006";
417
+ };
418
+ minitest = {
419
+ dependencies = [
420
+ "drb"
421
+ "prism"
422
+ ];
423
+ groups = [ "default" ];
424
+ platforms = [ ];
425
+ source = {
426
+ remotes = [ "https://rubygems.org" ];
427
+ sha256 = "1wfnqyfayx9n9j7x871v2ars4hjhfisi1dl24fa64ylq3mns6ghm";
428
+ type = "gem";
429
+ };
430
+ version = "6.0.6";
431
+ };
432
+ netrc = {
433
+ groups = [ "default" ];
434
+ platforms = [ ];
435
+ source = {
436
+ remotes = [ "https://rubygems.org" ];
437
+ sha256 = "0gzfmcywp1da8nzfqsql2zqi648mfnx6qwkig3cv36n9m0yy676y";
438
+ type = "gem";
439
+ };
440
+ version = "0.11.0";
441
+ };
442
+ opener = {
443
+ groups = [ "default" ];
444
+ platforms = [ ];
445
+ source = {
446
+ remotes = [ "https://rubygems.org" ];
447
+ sha256 = "0ngxijhmcfjv23cp3r0lmnrhya37w8p16bandcw28z59ib4crrbz";
448
+ type = "gem";
449
+ };
450
+ version = "0.1.0";
451
+ };
452
+ ostruct = {
453
+ groups = [ "default" ];
454
+ platforms = [ ];
455
+ source = {
456
+ remotes = [ "https://rubygems.org" ];
457
+ sha256 = "04nrir9wdpc4izqwqbysxyly8y7hsfr4fsv69rw91lfi9d5fv8lm";
458
+ type = "gem";
459
+ };
460
+ version = "0.6.3";
461
+ };
462
+ overcommit = {
463
+ dependencies = [
464
+ "childprocess"
465
+ "iniparse"
466
+ "rexml"
467
+ ];
468
+ groups = [
469
+ "development"
470
+ "test"
471
+ ];
472
+ platforms = [ ];
473
+ source = {
474
+ remotes = [ "https://rubygems.org" ];
475
+ sha256 = "0d596lg514b19fxdg2q7qq8ni5sd5549s7rqpqwr8jpdlfcx4pki";
476
+ type = "gem";
477
+ };
478
+ version = "0.73.0";
479
+ };
480
+ parallel = {
481
+ groups = [
482
+ "default"
483
+ "development"
484
+ "test"
485
+ ];
486
+ platforms = [ ];
487
+ source = {
488
+ remotes = [ "https://rubygems.org" ];
489
+ sha256 = "0w697335hi5dk5ay9kyn53399sy87y8v0y6ij93m5wmshhadxrik";
490
+ type = "gem";
491
+ };
492
+ version = "1.28.0";
493
+ };
494
+ parser = {
495
+ dependencies = [
496
+ "ast"
497
+ "racc"
498
+ ];
499
+ groups = [
500
+ "default"
501
+ "development"
502
+ "test"
503
+ ];
504
+ platforms = [ ];
505
+ source = {
506
+ remotes = [ "https://rubygems.org" ];
507
+ sha256 = "0a4q5h2hcihk79dbr20scgkm56l79qp7fsvfvkxlv8nmapvxg9i1";
508
+ type = "gem";
509
+ };
510
+ version = "3.3.12.0";
511
+ };
512
+ pastel = {
513
+ dependencies = [ "tty-color" ];
514
+ groups = [ "default" ];
515
+ platforms = [ ];
516
+ source = {
517
+ remotes = [ "https://rubygems.org" ];
518
+ sha256 = "0xash2gj08dfjvq4hy6l1z22s5v30fhizwgs10d6nviggpxsj7a8";
519
+ type = "gem";
520
+ };
521
+ version = "0.8.0";
522
+ };
523
+ prism = {
524
+ groups = [
525
+ "default"
526
+ "development"
527
+ "test"
528
+ ];
529
+ platforms = [ ];
530
+ source = {
531
+ remotes = [ "https://rubygems.org" ];
532
+ sha256 = "11ggfikcs1lv17nhmhqyyp6z8nq5pkfcj6a904047hljkxm0qlvv";
533
+ type = "gem";
534
+ };
535
+ version = "1.9.0";
536
+ };
537
+ racc = {
538
+ groups = [
539
+ "default"
540
+ "development"
541
+ "test"
542
+ ];
543
+ platforms = [ ];
544
+ source = {
545
+ remotes = [ "https://rubygems.org" ];
546
+ sha256 = "0byn0c9nkahsl93y9ln5bysq4j31q8xkf2ws42swighxd4lnjzsa";
547
+ type = "gem";
548
+ };
549
+ version = "1.8.1";
550
+ };
551
+ rainbow = {
552
+ groups = [
553
+ "default"
554
+ "development"
555
+ "test"
556
+ ];
557
+ platforms = [ ];
558
+ source = {
559
+ remotes = [ "https://rubygems.org" ];
560
+ sha256 = "0smwg4mii0fm38pyb5fddbmrdpifwv22zv3d3px2xx497am93503";
561
+ type = "gem";
562
+ };
563
+ version = "3.1.1";
564
+ };
565
+ rake = {
566
+ groups = [ "default" ];
567
+ platforms = [ ];
568
+ source = {
569
+ remotes = [ "https://rubygems.org" ];
570
+ sha256 = "009p524zl0p0kfa65nii8wdmaigkmawv9pbvlcffky7islmmp0nb";
571
+ type = "gem";
572
+ };
573
+ version = "13.4.2";
574
+ };
575
+ redcarpet = {
576
+ groups = [ "default" ];
577
+ platforms = [ ];
578
+ source = {
579
+ remotes = [ "https://rubygems.org" ];
580
+ sha256 = "0iglapqs4av4za9yfaac0lna7s16fq2xn36wpk380m55d8792i6l";
581
+ type = "gem";
582
+ };
583
+ version = "3.6.1";
584
+ };
585
+ regexp_parser = {
586
+ groups = [
587
+ "default"
588
+ "development"
589
+ "test"
590
+ ];
591
+ platforms = [ ];
592
+ source = {
593
+ remotes = [ "https://rubygems.org" ];
594
+ sha256 = "0jxl6c5cagjz5i5n9jplhdy2izad6wapmwgfhqggb22nqfvvdvas";
595
+ type = "gem";
596
+ };
597
+ version = "2.13.1";
598
+ };
599
+ reline = {
600
+ dependencies = [ "io-console" ];
601
+ groups = [ "default" ];
602
+ platforms = [ ];
603
+ source = {
604
+ remotes = [ "https://rubygems.org" ];
605
+ sha256 = "0gaq2lc463ap1srz7y5kh2p4dxazs7vjrpiby58d9yfvan72s0av";
606
+ type = "gem";
607
+ };
608
+ version = "0.7.0";
609
+ };
610
+ require_all = {
611
+ groups = [ "default" ];
612
+ platforms = [ ];
613
+ source = {
614
+ remotes = [ "https://rubygems.org" ];
615
+ sha256 = "0sjf2vigdg4wq7z0xlw14zyhcz4992s05wgr2s58kjgin12bkmv8";
616
+ type = "gem";
617
+ };
618
+ version = "2.0.0";
619
+ };
620
+ rest-client = {
621
+ dependencies = [
622
+ "http-accept"
623
+ "http-cookie"
624
+ "mime-types"
625
+ "netrc"
626
+ ];
627
+ groups = [ "default" ];
628
+ platforms = [ ];
629
+ source = {
630
+ remotes = [ "https://rubygems.org" ];
631
+ sha256 = "1qs74yzl58agzx9dgjhcpgmzfn61fqkk33k1js2y5yhlvc5l19im";
632
+ type = "gem";
633
+ };
634
+ version = "2.1.0";
635
+ };
636
+ rexml = {
637
+ groups = [
638
+ "default"
639
+ "development"
640
+ "test"
641
+ ];
642
+ platforms = [ ];
643
+ source = {
644
+ remotes = [ "https://rubygems.org" ];
645
+ sha256 = "0hninnbvqd2pn40h863lbrn9p11gvdxp928izkag5ysx8b1s5q0r";
646
+ type = "gem";
647
+ };
648
+ version = "3.4.4";
649
+ };
650
+ rouge = {
651
+ groups = [ "default" ];
652
+ platforms = [ ];
653
+ source = {
654
+ remotes = [ "https://rubygems.org" ];
655
+ sha256 = "1dnfkrk8xx2m8r3r9m2p5xcq57viznyc09k7r3i4jbm758i57lx3";
656
+ type = "gem";
657
+ };
658
+ version = "3.30.0";
659
+ };
660
+ rspec = {
661
+ dependencies = [
662
+ "rspec-core"
663
+ "rspec-expectations"
664
+ "rspec-mocks"
665
+ ];
666
+ groups = [
667
+ "development"
668
+ "test"
669
+ ];
670
+ platforms = [ ];
671
+ source = {
672
+ remotes = [ "https://rubygems.org" ];
673
+ sha256 = "11q5hagj6vr694innqj4r45jrm8qcwvkxjnphqgyd66piah88qi0";
674
+ type = "gem";
675
+ };
676
+ version = "3.13.2";
677
+ };
678
+ rspec-core = {
679
+ dependencies = [ "rspec-support" ];
680
+ groups = [
681
+ "default"
682
+ "development"
683
+ "test"
684
+ ];
685
+ platforms = [ ];
686
+ source = {
687
+ remotes = [ "https://rubygems.org" ];
688
+ sha256 = "0bcbh9yv6cs6pv299zs4bvalr8yxa51kcdd1pjl60yv625j3r0m8";
689
+ type = "gem";
690
+ };
691
+ version = "3.13.6";
692
+ };
693
+ rspec-expectations = {
694
+ dependencies = [
695
+ "diff-lcs"
696
+ "rspec-support"
697
+ ];
698
+ groups = [
699
+ "default"
700
+ "development"
701
+ "test"
702
+ ];
703
+ platforms = [ ];
704
+ source = {
705
+ remotes = [ "https://rubygems.org" ];
706
+ sha256 = "0dl8npj0jfpy31bxi6syc7jymyd861q277sfr6jawq2hv6hx791k";
707
+ type = "gem";
708
+ };
709
+ version = "3.13.5";
710
+ };
711
+ rspec-mocks = {
712
+ dependencies = [
713
+ "diff-lcs"
714
+ "rspec-support"
715
+ ];
716
+ groups = [
717
+ "default"
718
+ "development"
719
+ "test"
720
+ ];
721
+ platforms = [ ];
722
+ source = {
723
+ remotes = [ "https://rubygems.org" ];
724
+ sha256 = "0iqxmw0knjiz5nf6pgr8ihs6cjzh89f0ppj3fqiz8cvms79x6sh8";
725
+ type = "gem";
726
+ };
727
+ version = "3.13.8";
728
+ };
729
+ rspec-support = {
730
+ groups = [
731
+ "default"
732
+ "development"
733
+ "test"
734
+ ];
735
+ platforms = [ ];
736
+ source = {
737
+ remotes = [ "https://rubygems.org" ];
738
+ sha256 = "0z64h5rznm2zv21vjdjshz4v0h7bxvg02yc6g7yzxakj11byah06";
739
+ type = "gem";
740
+ };
741
+ version = "3.13.7";
742
+ };
743
+ rubocop = {
744
+ dependencies = [
745
+ "json"
746
+ "language_server-protocol"
747
+ "lint_roller"
748
+ "mcp"
749
+ "parallel"
750
+ "parser"
751
+ "rainbow"
752
+ "regexp_parser"
753
+ "rubocop-ast"
754
+ "ruby-progressbar"
755
+ "unicode-display_width"
756
+ ];
757
+ groups = [
758
+ "development"
759
+ "test"
760
+ ];
761
+ platforms = [ ];
762
+ source = {
763
+ remotes = [ "https://rubygems.org" ];
764
+ sha256 = "0xyc0rs1xaiqln7x611v0f3kjpna7n8h6apbxrvc795sc7lzkg1x";
765
+ type = "gem";
766
+ };
767
+ version = "1.85.1";
768
+ };
769
+ rubocop-ast = {
770
+ dependencies = [
771
+ "parser"
772
+ "prism"
773
+ ];
774
+ groups = [
775
+ "default"
776
+ "development"
777
+ "test"
778
+ ];
779
+ platforms = [ ];
780
+ source = {
781
+ remotes = [ "https://rubygems.org" ];
782
+ sha256 = "1nw84xk6vc2ls8sxqvyhxs2agh4l0jrws85d4bi3x0501lq8ijmr";
783
+ type = "gem";
784
+ };
785
+ version = "1.50.0";
786
+ };
787
+ rubocop-rake = {
788
+ dependencies = [
789
+ "lint_roller"
790
+ "rubocop"
791
+ ];
792
+ groups = [
793
+ "development"
794
+ "test"
795
+ ];
796
+ platforms = [ ];
797
+ source = {
798
+ remotes = [ "https://rubygems.org" ];
799
+ sha256 = "0kdfrckz1v32dy7c7bdiksjysx9l9zsda9kc6zvrsghch6vg55rp";
800
+ type = "gem";
801
+ };
802
+ version = "0.7.1";
803
+ };
804
+ ruby-progressbar = {
805
+ groups = [
806
+ "default"
807
+ "development"
808
+ "test"
809
+ ];
810
+ platforms = [ ];
811
+ source = {
812
+ remotes = [ "https://rubygems.org" ];
813
+ sha256 = "0cwvyb7j47m7wihpfaq7rc47zwwx9k4v7iqd9s1xch5nm53rrz40";
814
+ type = "gem";
815
+ };
816
+ version = "1.13.0";
817
+ };
818
+ securerandom = {
819
+ groups = [ "default" ];
820
+ platforms = [ ];
821
+ source = {
822
+ remotes = [ "https://rubygems.org" ];
823
+ sha256 = "1cd0iriqfsf1z91qg271sm88xjnfd92b832z49p1nd542ka96lfc";
824
+ type = "gem";
825
+ };
826
+ version = "0.4.1";
827
+ };
828
+ simpleidn = {
829
+ groups = [
830
+ "default"
831
+ "development"
832
+ "test"
833
+ ];
834
+ platforms = [ ];
835
+ source = {
836
+ remotes = [ "https://rubygems.org" ];
837
+ sha256 = "00sdym5q3d9zg7lv47mjamzv67z1lfyd3gz9256v0g9gxl5p7jhj";
838
+ type = "gem";
839
+ };
840
+ version = "0.3.0";
841
+ };
842
+ strings = {
843
+ dependencies = [
844
+ "strings-ansi"
845
+ "unicode-display_width"
846
+ "unicode_utils"
847
+ ];
848
+ groups = [ "default" ];
849
+ platforms = [ ];
850
+ source = {
851
+ remotes = [ "https://rubygems.org" ];
852
+ sha256 = "1yynb0qhhhplmpzavfrrlwdnd1rh7rkwzcs4xf0mpy2wr6rr6clk";
853
+ type = "gem";
854
+ };
855
+ version = "0.2.1";
856
+ };
857
+ strings-ansi = {
858
+ groups = [ "default" ];
859
+ platforms = [ ];
860
+ source = {
861
+ remotes = [ "https://rubygems.org" ];
862
+ sha256 = "120wa6yjc63b84lprglc52f40hx3fx920n4dmv14rad41rv2s9lh";
863
+ type = "gem";
864
+ };
865
+ version = "0.2.0";
866
+ };
867
+ tty-color = {
868
+ groups = [ "default" ];
869
+ platforms = [ ];
870
+ source = {
871
+ remotes = [ "https://rubygems.org" ];
872
+ sha256 = "0aik4kmhwwrmkysha7qibi2nyzb4c8kp42bd5vxnf8sf7b53g73g";
873
+ type = "gem";
874
+ };
875
+ version = "0.6.0";
876
+ };
877
+ tty-command = {
878
+ dependencies = [ "pastel" ];
879
+ groups = [ "default" ];
880
+ platforms = [ ];
881
+ source = {
882
+ remotes = [ "https://rubygems.org" ];
883
+ sha256 = "14hi8xiahfrrnydw6g3i30lxvvz90wp4xsrlhx8mabckrcglfv0c";
884
+ type = "gem";
885
+ };
886
+ version = "0.10.1";
887
+ };
888
+ tty-cursor = {
889
+ groups = [ "default" ];
890
+ platforms = [ ];
891
+ source = {
892
+ remotes = [ "https://rubygems.org" ];
893
+ sha256 = "0j5zw041jgkmn605ya1zc151bxgxl6v192v2i26qhxx7ws2l2lvr";
894
+ type = "gem";
895
+ };
896
+ version = "0.7.1";
897
+ };
898
+ tty-pager = {
899
+ dependencies = [
900
+ "strings"
901
+ "tty-screen"
902
+ ];
903
+ groups = [ "default" ];
904
+ platforms = [ ];
905
+ source = {
906
+ remotes = [ "https://rubygems.org" ];
907
+ sha256 = "0cz0yrfjzz9xkd3wh939hz64nqxny4h6hrkc17rkfgj38lyyd44z";
908
+ type = "gem";
909
+ };
910
+ version = "0.14.0";
911
+ };
912
+ tty-progressbar = {
913
+ dependencies = [
914
+ "strings-ansi"
915
+ "tty-cursor"
916
+ "tty-screen"
917
+ "unicode-display_width"
918
+ ];
919
+ groups = [ "default" ];
920
+ platforms = [ ];
921
+ source = {
922
+ remotes = [ "https://rubygems.org" ];
923
+ sha256 = "1xm5sk1sqp7v16akqpxza672qza6dbml68ah1lcajx2ywmh45fvc";
924
+ type = "gem";
925
+ };
926
+ version = "0.18.3";
927
+ };
928
+ tty-screen = {
929
+ groups = [ "default" ];
930
+ platforms = [ ];
931
+ source = {
932
+ remotes = [ "https://rubygems.org" ];
933
+ sha256 = "0l4vh6g333jxm9lakilkva2gn17j6gb052626r1pdbmy2lhnb460";
934
+ type = "gem";
935
+ };
936
+ version = "0.8.2";
937
+ };
938
+ tty-spinner = {
939
+ dependencies = [ "tty-cursor" ];
940
+ groups = [ "default" ];
941
+ platforms = [ ];
942
+ source = {
943
+ remotes = [ "https://rubygems.org" ];
944
+ sha256 = "0hh5awmijnzw9flmh5ak610x1d00xiqagxa5mbr63ysggc26y0qf";
945
+ type = "gem";
946
+ };
947
+ version = "0.9.3";
948
+ };
949
+ tzinfo = {
950
+ dependencies = [ "concurrent-ruby" ];
951
+ groups = [ "default" ];
952
+ platforms = [ ];
953
+ source = {
954
+ remotes = [ "https://rubygems.org" ];
955
+ sha256 = "16w2g84dzaf3z13gxyzlzbf748kylk5bdgg3n1ipvkvvqy685bwd";
956
+ type = "gem";
957
+ };
958
+ version = "2.0.6";
959
+ };
960
+ unicode-display_width = {
961
+ groups = [
962
+ "default"
963
+ "development"
964
+ "test"
965
+ ];
966
+ platforms = [ ];
967
+ source = {
968
+ remotes = [ "https://rubygems.org" ];
969
+ sha256 = "0nkz7fadlrdbkf37m0x7sw8bnz8r355q3vwcfb9f9md6pds9h9qj";
970
+ type = "gem";
971
+ };
972
+ version = "2.6.0";
973
+ };
974
+ unicode_utils = {
975
+ groups = [ "default" ];
976
+ platforms = [ ];
977
+ source = {
978
+ remotes = [ "https://rubygems.org" ];
979
+ sha256 = "0h1a5yvrxzlf0lxxa1ya31jcizslf774arnsd89vgdhk4g7x08mr";
980
+ type = "gem";
981
+ };
982
+ version = "1.4.0";
983
+ };
984
+ uri = {
985
+ groups = [ "default" ];
986
+ platforms = [ ];
987
+ source = {
988
+ remotes = [ "https://rubygems.org" ];
989
+ sha256 = "1ijpbj7mdrq7rhpq2kb51yykhrs2s54wfs6sm9z3icgz4y6sb7rp";
990
+ type = "gem";
991
+ };
992
+ version = "1.1.1";
993
+ };
994
+ vpsadmin-client = {
995
+ dependencies = [
996
+ "base64"
997
+ "curses"
998
+ "haveapi-client"
999
+ "json"
1000
+ "ruby-progressbar"
1001
+ ];
1002
+ groups = [ "default" ];
1003
+ platforms = [ ];
1004
+ source = {
1005
+ remotes = [ "https://rubygems.org" ];
1006
+ sha256 = "1m57d01k5n89fanzzd511c20v5df8397cxv2nf4whln7ym5z8rj9";
1007
+ type = "gem";
1008
+ };
1009
+ version = "4.2.1";
1010
+ };
1011
+ vpsfree-client = {
1012
+ dependencies = [ "vpsadmin-client" ];
1013
+ groups = [ "default" ];
1014
+ platforms = [ ];
1015
+ source = {
1016
+ remotes = [ "https://rubygems.org" ];
1017
+ sha256 = "0cl6r20r7hksd3g6sjqrgi9x21ykbvv170vszf2l06a8ifrrqlk7";
1018
+ type = "gem";
1019
+ };
1020
+ version = "0.19.0";
1021
+ };
1022
+ }