plutonium 0.62.0 → 0.62.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 62c3179e6fc69beaae9e39a5892a478bd41c546fcf0fb580dea6a4aa9680e296
4
- data.tar.gz: 94c2ce8570a323536961196170f8cb7187efe724834485edfd210a783147cbe8
3
+ metadata.gz: 75154d0671bfe1934ecdb6d045b6a0e119be04f3d9faa37740cf8c50eb113dab
4
+ data.tar.gz: e2dd3963d7a7862918a0ff3f3b482dec18115fec0c54ab5b186178a13006ae05
5
5
  SHA512:
6
- metadata.gz: 0b9dc172a16b74c0f313606cefe964a661842aacd63c21df3ed3cb9ca20179439d2f302b53658305a375ee2b752aacf056244eb0a6875e2a31e20276b8055a2c
7
- data.tar.gz: e1f47b1429392d82253f27e8268309e129d33e5d62716b04c669c13e24cc4e3b34d74728d154189c116124319c7155911e49000be008ea72a2bbdd64fecc3dbd
6
+ metadata.gz: 9cbfdd419b58dbef8e5f70c91de197065edfdbc108dd93062f407ebff187e61be334c8ff63e96b05a5bee5e4333b51681dfb8403ea294d41c232d4b1885eae38
7
+ data.tar.gz: 1114c97d24fd9c5341779419b545bb376503d2cc7e6b8b403b35ae8260c63f5c8db0483894c288ef8960ce72420952246e1e15f42f2bdb33e3e4da114130eaa8
data/CHANGELOG.md CHANGED
@@ -2,6 +2,39 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [0.62.2] - 2026-07-09
6
+
7
+ ### Bug Fixes
8
+
9
+ - Match nested paths under the deleted record on destroy redirect
10
+ - Respect all Rails falsey values in boolean inputs
11
+
12
+ ### Testing
13
+
14
+ - Drop hardcoded Migration[8.1] in dummy migrations
15
+ - Repair stale kanban and show unit tests
16
+ - Make scaffold generator test resilient to leftover state
17
+
18
+ ### Ci
19
+
20
+ - Switch to advanced setup with paths-ignore
21
+ - Bump actions to v4/v5 to clear deprecation warnings
22
+
23
+ ## [0.62.1] - 2026-07-07
24
+
25
+ ### Bug Fixes
26
+
27
+ - Split grouped error classes into per-constant files
28
+ - Fall back to index when deleting from the record's own page
29
+
30
+ ### Documentation
31
+
32
+ - Add SECURITY.md and auto-bump its version series on release
33
+
34
+ ### Miscellaneous Tasks
35
+
36
+ - Require RubyGems MFA and disable CI auto-release
37
+
5
38
  ## [0.62.0] - 2026-07-04
6
39
 
7
40
  ### Bug Fixes
@@ -65,16 +98,6 @@ All notable changes to this project will be documented in this file.
65
98
 
66
99
  - Docs accuracy + completeness audit, plus a per-field Shrine uploader for attachments ([#64](https://github.com/radioactive-labs/plutonium-core/issues/64))
67
100
 
68
- ## [0.60.5] - 2026-06-30
69
-
70
- ### 🐛 Bug Fixes
71
-
72
- - *(ui)* Coerce ActiveStorage::Filename to String for HTML title attributes
73
-
74
- ### âš™ī¸ Miscellaneous Tasks
75
-
76
- - Update yarn.lock and .yarnrc.yml after yarn install
77
-
78
101
  ## [0.60.4] - 2026-06-15
79
102
 
80
103
  ### Features
data/SECURITY.md ADDED
@@ -0,0 +1,57 @@
1
+ # Security Policy
2
+
3
+ We take the security of Plutonium seriously. Because Plutonium is a framework
4
+ that other applications are built on, a vulnerability here can affect many
5
+ downstream apps. We appreciate your help in disclosing issues responsibly.
6
+
7
+ ## Supported Versions
8
+
9
+ Plutonium is pre-1.0 and evolving quickly. Security fixes are released against
10
+ the **latest published version** only. If you are running an older release,
11
+ please upgrade before reporting an issue to confirm it still reproduces.
12
+
13
+ | Version | Supported |
14
+ | ------- | ------------------ |
15
+ | Latest release (`0.62.x`) | :white_check_mark: |
16
+ | Older releases | :x: |
17
+
18
+ ## Reporting a Vulnerability
19
+
20
+ **Please do not report security vulnerabilities through public GitHub issues,
21
+ discussions, or pull requests.**
22
+
23
+ Instead, use one of the following private channels:
24
+
25
+ - **Preferred:** [Open a private vulnerability report](https://github.com/radioactive-labs/plutonium-core/security/advisories/new)
26
+ via GitHub Security Advisories.
27
+ - **Email:** [sfroelich01@gmail.com](mailto:sfroelich01@gmail.com) with the
28
+ subject line `[SECURITY] Plutonium`.
29
+
30
+ To help us triage quickly, please include as much of the following as you can:
31
+
32
+ - The Plutonium version (and Rails version) affected.
33
+ - A description of the vulnerability and its impact.
34
+ - Steps to reproduce, or a proof-of-concept.
35
+ - Any known workarounds.
36
+
37
+ ## What to Expect
38
+
39
+ - **Acknowledgement:** We aim to acknowledge your report within **3 business days**.
40
+ - **Assessment:** We will investigate and let you know whether the report is
41
+ accepted, along with our expected timeline for a fix.
42
+ - **Disclosure:** We follow a coordinated disclosure process. We will work with
43
+ you to agree on a disclosure date once a fix is available, and we are happy to
44
+ credit you in the advisory unless you prefer to remain anonymous.
45
+
46
+ Please give us a reasonable opportunity to address the issue before any public
47
+ disclosure.
48
+
49
+ ## Scope
50
+
51
+ Security reports about the Plutonium framework code in this repository are in
52
+ scope. Issues in applications *built with* Plutonium, or in third-party
53
+ dependencies, should be reported to their respective maintainers — though if you
54
+ believe a dependency issue is triggered by how Plutonium uses it, we would like
55
+ to hear about it.
56
+
57
+ Thank you for helping keep Plutonium and its community safe.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- plutonium (0.60.4)
4
+ plutonium (0.62.2)
5
5
  action_policy (~> 0.7.0)
6
6
  csv
7
7
  listen (~> 3.8)
@@ -12,7 +12,7 @@ PATH
12
12
  phlex-tabler_icons
13
13
  phlexi-display (>= 0.2.0)
14
14
  phlexi-field (>= 0.2.0)
15
- phlexi-form (>= 0.14.2)
15
+ phlexi-form (>= 0.14.3)
16
16
  phlexi-menu (>= 0.4.1)
17
17
  phlexi-table (>= 0.2.0)
18
18
  rabl (~> 0.17.0)
@@ -74,6 +74,11 @@ GEM
74
74
  erubi (~> 1.11)
75
75
  rails-dom-testing (~> 2.2)
76
76
  rails-html-sanitizer (~> 1.6)
77
+ active_shrine (0.7.1)
78
+ activestorage
79
+ activesupport
80
+ railties
81
+ shrine
77
82
  activejob (7.2.3)
78
83
  activesupport (= 7.2.3)
79
84
  globalid (>= 0.3.6)
@@ -138,9 +143,13 @@ GEM
138
143
  thor (>= 0.14.6)
139
144
  concurrent-ruby (1.3.6)
140
145
  connection_pool (3.0.2)
146
+ content_disposition (1.0.0)
141
147
  crass (1.0.6)
142
148
  csv (3.3.5)
143
149
  date (3.5.1)
150
+ down (5.6.0)
151
+ addressable (~> 2.8)
152
+ base64 (~> 0.3)
144
153
  drb (2.2.3)
145
154
  erb (6.0.2)
146
155
  erubi (1.13.1)
@@ -253,7 +262,7 @@ GEM
253
262
  fiber-local
254
263
  phlex (~> 2.0)
255
264
  zeitwerk
256
- phlexi-form (0.14.2)
265
+ phlexi-form (0.14.3)
257
266
  activesupport
258
267
  phlex (~> 2.0)
259
268
  phlexi-field (~> 0.2.0)
@@ -392,6 +401,9 @@ GEM
392
401
  sequel-activerecord_connection (2.0.1)
393
402
  activerecord (>= 5.1)
394
403
  sequel (~> 5.38)
404
+ shrine (3.7.1)
405
+ content_disposition (~> 1.0)
406
+ down (~> 5.1)
395
407
  sin_lru_redux (2.5.2)
396
408
  sqlite3 (2.9.1-aarch64-linux-gnu)
397
409
  sqlite3 (2.9.1-aarch64-linux-musl)
@@ -464,6 +476,7 @@ PLATFORMS
464
476
  x86_64-linux-musl
465
477
 
466
478
  DEPENDENCIES
479
+ active_shrine
467
480
  appraisal
468
481
  bcrypt
469
482
  brakeman
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- plutonium (0.60.4)
4
+ plutonium (0.62.1)
5
5
  action_policy (~> 0.7.0)
6
6
  csv
7
7
  listen (~> 3.8)
@@ -12,7 +12,7 @@ PATH
12
12
  phlex-tabler_icons
13
13
  phlexi-display (>= 0.2.0)
14
14
  phlexi-field (>= 0.2.0)
15
- phlexi-form (>= 0.14.2)
15
+ phlexi-form (>= 0.14.3)
16
16
  phlexi-menu (>= 0.4.1)
17
17
  phlexi-table (>= 0.2.0)
18
18
  rabl (~> 0.17.0)
@@ -71,6 +71,11 @@ GEM
71
71
  erubi (~> 1.11)
72
72
  rails-dom-testing (~> 2.2)
73
73
  rails-html-sanitizer (~> 1.6)
74
+ active_shrine (0.7.1)
75
+ activestorage
76
+ activesupport
77
+ railties
78
+ shrine
74
79
  activejob (8.0.3)
75
80
  activesupport (= 8.0.3)
76
81
  globalid (>= 0.3.6)
@@ -135,9 +140,13 @@ GEM
135
140
  thor (>= 0.14.6)
136
141
  concurrent-ruby (1.3.6)
137
142
  connection_pool (3.0.2)
143
+ content_disposition (1.0.0)
138
144
  crass (1.0.6)
139
145
  csv (3.3.5)
140
146
  date (3.5.1)
147
+ down (5.6.0)
148
+ addressable (~> 2.8)
149
+ base64 (~> 0.3)
141
150
  drb (2.2.3)
142
151
  erb (6.0.2)
143
152
  erubi (1.13.1)
@@ -229,7 +238,7 @@ GEM
229
238
  fiber-local
230
239
  phlex (~> 2.0)
231
240
  zeitwerk
232
- phlexi-form (0.14.2)
241
+ phlexi-form (0.14.3)
233
242
  activesupport
234
243
  phlex (~> 2.0)
235
244
  phlexi-field (~> 0.2.0)
@@ -367,6 +376,9 @@ GEM
367
376
  sequel-activerecord_connection (2.0.1)
368
377
  activerecord (>= 5.1)
369
378
  sequel (~> 5.38)
379
+ shrine (3.7.1)
380
+ content_disposition (~> 1.0)
381
+ down (~> 5.1)
370
382
  sin_lru_redux (2.5.2)
371
383
  sqlite3 (2.9.1-arm64-darwin)
372
384
  standard (1.54.0)
@@ -425,6 +437,7 @@ PLATFORMS
425
437
  arm64-darwin
426
438
 
427
439
  DEPENDENCIES
440
+ active_shrine
428
441
  appraisal
429
442
  bcrypt
430
443
  brakeman
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- plutonium (0.61.0)
4
+ plutonium (0.62.1)
5
5
  action_policy (~> 0.7.0)
6
6
  csv
7
7
  listen (~> 3.8)
@@ -12,7 +12,7 @@ PATH
12
12
  phlex-tabler_icons
13
13
  phlexi-display (>= 0.2.0)
14
14
  phlexi-field (>= 0.2.0)
15
- phlexi-form (>= 0.14.2)
15
+ phlexi-form (>= 0.14.3)
16
16
  phlexi-menu (>= 0.4.1)
17
17
  phlexi-table (>= 0.2.0)
18
18
  rabl (~> 0.17.0)
@@ -240,7 +240,7 @@ GEM
240
240
  fiber-local
241
241
  phlex (~> 2.0)
242
242
  zeitwerk
243
- phlexi-form (0.14.2)
243
+ phlexi-form (0.14.3)
244
244
  activesupport
245
245
  phlex (~> 2.0)
246
246
  phlexi-field (~> 0.2.0)
@@ -212,13 +212,30 @@ module Plutonium
212
212
  end
213
213
 
214
214
  def redirect_url_after_destroy
215
- if (return_to = url_from(params[:return_to])) && return_to != request.url
215
+ if (return_to = url_from(params[:return_to])) && !same_resource_url?(return_to)
216
216
  return return_to
217
217
  end
218
218
 
219
219
  resource_url_for(resource_class)
220
220
  end
221
221
 
222
+ # A return_to pointing at the just-deleted record's own page — its show,
223
+ # edit, or any nested resource beneath it — would 404 on the follow-up
224
+ # request, so treat those as unusable and let the caller fall back to the
225
+ # index. We compare paths (return_to is the bare record URL while
226
+ # request.url still carries ?return_to=) and normalize both to a trailing
227
+ # slash so the prefix test respects segment boundaries: /posts/13/ must
228
+ # not match /posts/130.
229
+ def same_resource_url?(return_to)
230
+ return false unless resource_record?
231
+
232
+ target_path = ensure_trailing_slash URI.parse(return_to).path
233
+ record_path = ensure_trailing_slash URI.parse(resource_url_for(resource_record!)).path
234
+ target_path.start_with?(record_path)
235
+ end
236
+
237
+ def ensure_trailing_slash(path) = "#{path.chomp("/")}/"
238
+
222
239
  def preferred_action_after_submit
223
240
  @preferred_action_after_submit = begin
224
241
  if %w[new edit show index].include? params[:commit]
@@ -1,5 +1,5 @@
1
1
  module Plutonium
2
- VERSION = "0.62.0"
2
+ VERSION = "0.62.2"
3
3
  NEXT_MAJOR_VERSION = VERSION.split(".").tap { |v|
4
4
  v[1] = v[1].to_i + 1
5
5
  v[2] = 0
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Plutonium
4
+ module Wizard
5
+ # Raised when a wizard requires an anchor record but none is available.
6
+ class NotAnchoredError < StandardError; end
7
+ end
8
+ end
@@ -2,14 +2,6 @@
2
2
 
3
3
  module Plutonium
4
4
  module Wizard
5
- # Raised when a wizard requires an anchor record but none is available.
6
- class NotAnchoredError < StandardError; end
7
-
8
- # Raised when the `wizard_class` route default does not resolve to a
9
- # Plutonium::Wizard::Base subclass (a misconfigured mount, or a tampered
10
- # path parameter).
11
- class UnknownWizardError < StandardError; end
12
-
13
5
  # Raised when a wizard step fails. Carries the attribute the error should be
14
6
  # attached to (defaults to +:base+) so it can be surfaced on a form.
15
7
  class StepError < StandardError
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Plutonium
4
+ module Wizard
5
+ # Raised when the `wizard_class` route default does not resolve to a
6
+ # Plutonium::Wizard::Base subclass (a misconfigured mount, or a tampered
7
+ # path parameter).
8
+ class UnknownWizardError < StandardError; end
9
+ end
10
+ end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "wizard/errors"
4
3
  require_relative "wizard/configuration"
5
4
 
6
5
  module Plutonium
@@ -23,6 +23,7 @@ RELEASE_CLIFF_CONFIG = ".cliff.toml"
23
23
  RELEASE_VERSION_FILE = "lib/plutonium/version.rb"
24
24
  RELEASE_PACKAGE_JSON = "package.json"
25
25
  RELEASE_NPM_PACKAGE = "@radioactive-labs/plutonium"
26
+ RELEASE_SECURITY_FILE = "SECURITY.md"
26
27
 
27
28
  namespace :release do
28
29
  # --- helpers --------------------------------------------------------------
@@ -89,6 +90,21 @@ namespace :release do
89
90
  File.write(RELEASE_PACKAGE_JSON, pkg.gsub(/"version":\s*"[\d.]+"/, %("version": "#{version}")))
90
91
  puts "✓ #{RELEASE_PACKAGE_JSON}"
91
92
 
93
+ # Bump the supported-version series in SECURITY.md (e.g. `0.62.x`), so the
94
+ # policy always names the current release series. Skipped if the file or the
95
+ # expected `X.Y.x` marker is missing — a release must never fail over this.
96
+ if File.exist?(RELEASE_SECURITY_FILE)
97
+ series = "#{version.split(".").first(2).join(".")}.x"
98
+ security = File.read(RELEASE_SECURITY_FILE)
99
+ updated = security.gsub(/`\d+\.\d+\.x`/, "`#{series}`")
100
+ if updated == security
101
+ puts "â€ĸ #{RELEASE_SECURITY_FILE} — no `X.Y.x` marker found, skipping"
102
+ else
103
+ File.write(RELEASE_SECURITY_FILE, updated)
104
+ puts "✓ #{RELEASE_SECURITY_FILE}"
105
+ end
106
+ end
107
+
92
108
  # Changelog — same config CI uses for release notes, so they agree.
93
109
  abort "git-cliff not found. Install with: brew install git-cliff" unless git_cliff?
94
110
  system("git-cliff", "--config", RELEASE_CLIFF_CONFIG, "--tag", "v#{version}", "-o", "CHANGELOG.md") ||
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@radioactive-labs/plutonium",
3
- "version": "0.62.0",
3
+ "version": "0.62.2",
4
4
  "description": "Build production-ready Rails apps in minutes, not days. Convention-driven, fully customizable, AI-ready.",
5
5
  "type": "module",
6
6
  "main": "src/js/core.js",
data/plutonium.gemspec CHANGED
@@ -15,6 +15,9 @@ Gem::Specification.new do |spec|
15
15
  spec.required_ruby_version = ">= 3.2.2"
16
16
 
17
17
  spec.metadata["allowed_push_host"] = "https://rubygems.org"
18
+ # Require multi-factor auth for privileged RubyGems actions (push, yank,
19
+ # owner changes). `gem push` will prompt for an OTP at release time.
20
+ spec.metadata["rubygems_mfa_required"] = "true"
18
21
 
19
22
  spec.post_install_message = <<~MSG
20
23
  â„šī¸ Plutonium — breaking change introduced in 0.49.0
@@ -62,7 +65,7 @@ Gem::Specification.new do |spec|
62
65
  spec.add_dependency "phlex-rails"
63
66
  spec.add_dependency "phlex-tabler_icons"
64
67
  spec.add_dependency "phlexi-field", ">= 0.2.0"
65
- spec.add_dependency "phlexi-form", ">= 0.14.2"
68
+ spec.add_dependency "phlexi-form", ">= 0.14.3"
66
69
  spec.add_dependency "phlexi-table", ">= 0.2.0"
67
70
  spec.add_dependency "phlexi-display", ">= 0.2.0"
68
71
  spec.add_dependency "phlexi-menu", ">= 0.4.1"
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plutonium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.62.0
4
+ version: 0.62.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Froelich
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2026-07-04 00:00:00.000000000 Z
10
+ date: 2026-07-09 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: zeitwerk
@@ -197,14 +197,14 @@ dependencies:
197
197
  requirements:
198
198
  - - ">="
199
199
  - !ruby/object:Gem::Version
200
- version: 0.14.2
200
+ version: 0.14.3
201
201
  type: :runtime
202
202
  prerelease: false
203
203
  version_requirements: !ruby/object:Gem::Requirement
204
204
  requirements:
205
205
  - - ">="
206
206
  - !ruby/object:Gem::Version
207
- version: 0.14.2
207
+ version: 0.14.3
208
208
  - !ruby/object:Gem::Dependency
209
209
  name: phlexi-table
210
210
  requirement: !ruby/object:Gem::Requirement
@@ -467,6 +467,7 @@ files:
467
467
  - LICENSE.txt
468
468
  - README.md
469
469
  - Rakefile
470
+ - SECURITY.md
470
471
  - app/assets/plutonium.css
471
472
  - app/assets/plutonium.ico
472
473
  - app/assets/plutonium.js
@@ -1289,12 +1290,12 @@ files:
1289
1290
  - lib/plutonium/wizard/data.rb
1290
1291
  - lib/plutonium/wizard/driving.rb
1291
1292
  - lib/plutonium/wizard/dsl.rb
1292
- - lib/plutonium/wizard/errors.rb
1293
1293
  - lib/plutonium/wizard/field_capture.rb
1294
1294
  - lib/plutonium/wizard/field_importer.rb
1295
1295
  - lib/plutonium/wizard/gate.rb
1296
1296
  - lib/plutonium/wizard/instance_key.rb
1297
1297
  - lib/plutonium/wizard/lazy_persisted.rb
1298
+ - lib/plutonium/wizard/not_anchored_error.rb
1298
1299
  - lib/plutonium/wizard/resume.rb
1299
1300
  - lib/plutonium/wizard/review_step.rb
1300
1301
  - lib/plutonium/wizard/route_resolution.rb
@@ -1303,10 +1304,12 @@ files:
1303
1304
  - lib/plutonium/wizard/state.rb
1304
1305
  - lib/plutonium/wizard/step.rb
1305
1306
  - lib/plutonium/wizard/step_adapter.rb
1307
+ - lib/plutonium/wizard/step_error.rb
1306
1308
  - lib/plutonium/wizard/store/active_record.rb
1307
1309
  - lib/plutonium/wizard/store/base.rb
1308
1310
  - lib/plutonium/wizard/store/memory.rb
1309
1311
  - lib/plutonium/wizard/sweep_job.rb
1312
+ - lib/plutonium/wizard/unknown_wizard_error.rb
1310
1313
  - lib/rodauth/features/case_insensitive_login.rb
1311
1314
  - lib/rodauth/plugins.rb
1312
1315
  - lib/tasks/.keep
@@ -1387,6 +1390,7 @@ licenses:
1387
1390
  - MIT
1388
1391
  metadata:
1389
1392
  allowed_push_host: https://rubygems.org
1393
+ rubygems_mfa_required: 'true'
1390
1394
  homepage_uri: https://radioactive-labs.github.io/plutonium-core/
1391
1395
  source_code_uri: https://github.com/radioactive-labs/plutonium-core
1392
1396
  post_install_message: |