plutonium 0.60.5 → 0.62.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 (199) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/skills/plutonium/SKILL.md +19 -1
  3. data/.claude/skills/plutonium-app/SKILL.md +41 -0
  4. data/.claude/skills/plutonium-auth/SKILL.md +40 -0
  5. data/.claude/skills/plutonium-behavior/SKILL.md +47 -1
  6. data/.claude/skills/plutonium-kanban/SKILL.md +378 -0
  7. data/.claude/skills/plutonium-resource/SKILL.md +40 -0
  8. data/.claude/skills/plutonium-tenancy/SKILL.md +43 -0
  9. data/.claude/skills/plutonium-testing/SKILL.md +38 -0
  10. data/.claude/skills/plutonium-ui/SKILL.md +51 -0
  11. data/.claude/skills/plutonium-wizard/SKILL.md +469 -0
  12. data/.cliff.toml +6 -0
  13. data/Appraisals +3 -0
  14. data/CHANGELOG.md +576 -439
  15. data/CLAUDE.md +15 -7
  16. data/app/assets/plutonium.css +1 -1
  17. data/app/assets/plutonium.js +1173 -194
  18. data/app/assets/plutonium.js.map +4 -4
  19. data/app/assets/plutonium.min.js +53 -53
  20. data/app/assets/plutonium.min.js.map +4 -4
  21. data/app/views/layouts/basic.html.erb +7 -0
  22. data/app/views/plutonium/_flash_toasts.html.erb +2 -46
  23. data/app/views/plutonium/_toast.html.erb +52 -0
  24. data/app/views/resource/_kanban_move_action_form.html.erb +1 -0
  25. data/app/views/resource/_resource_kanban.html.erb +1 -0
  26. data/app/views/resource/kanban_move_form.html.erb +1 -0
  27. data/config/brakeman.ignore +2 -2
  28. data/db/migrate/wizard/20260615000001_create_plutonium_wizard_sessions.rb +57 -0
  29. data/docs/.vitepress/config.ts +45 -1
  30. data/docs/.vitepress/sync-skills.mjs +45 -0
  31. data/docs/ai.md +99 -0
  32. data/docs/guides/index.md +2 -0
  33. data/docs/guides/kanban.md +557 -0
  34. data/docs/guides/wizards.md +447 -0
  35. data/docs/public/images/guides/kanban-after-move.png +0 -0
  36. data/docs/public/images/guides/kanban-board-light.png +0 -0
  37. data/docs/public/images/guides/kanban-board.png +0 -0
  38. data/docs/public/images/guides/kanban-show-centered-modal.png +0 -0
  39. data/docs/public/images/guides/kanban-wip-toast.png +0 -0
  40. data/docs/public/images/guides/wizards-chooser.png +0 -0
  41. data/docs/public/images/guides/wizards-completed.png +0 -0
  42. data/docs/public/images/guides/wizards-index-action.png +0 -0
  43. data/docs/public/images/guides/wizards-repeater.png +0 -0
  44. data/docs/public/images/guides/wizards-review.png +0 -0
  45. data/docs/public/images/guides/wizards-step.png +0 -0
  46. data/docs/reference/behavior/policies.md +1 -1
  47. data/docs/reference/index.md +14 -0
  48. data/docs/reference/kanban/authorization.md +82 -0
  49. data/docs/reference/kanban/dsl.md +334 -0
  50. data/docs/reference/kanban/index.md +40 -0
  51. data/docs/reference/kanban/positioning.md +162 -0
  52. data/docs/reference/resource/definition.md +26 -1
  53. data/docs/reference/resource/model.md +26 -0
  54. data/docs/reference/ui/forms.md +77 -0
  55. data/docs/reference/ui/pages.md +2 -0
  56. data/docs/reference/wizard/anchoring-resume.md +194 -0
  57. data/docs/reference/wizard/dsl.md +337 -0
  58. data/docs/reference/wizard/index.md +33 -0
  59. data/docs/reference/wizard/one-time.md +129 -0
  60. data/docs/reference/wizard/registration-launch.md +177 -0
  61. data/docs/reference/wizard/storage-config.md +151 -0
  62. data/docs/superpowers/plans/2026-06-14-form-sectioning.md +2 -2
  63. data/docs/superpowers/plans/2026-06-15-wizard-dsl.md +1619 -0
  64. data/docs/superpowers/plans/2026-06-15-wizard-dsl.md.tasks.json +68 -0
  65. data/docs/superpowers/plans/2026-06-26-kanban-dsl.md +1128 -0
  66. data/docs/superpowers/plans/2026-06-26-kanban-dsl.md.tasks.json +24 -0
  67. data/docs/superpowers/plans/2026-07-02-kanban-drop-interactions.md +714 -0
  68. data/docs/superpowers/plans/2026-07-02-kanban-drop-interactions.md.tasks.json +68 -0
  69. data/docs/superpowers/specs/2026-06-15-wizard-dsl-design.md +836 -0
  70. data/docs/superpowers/specs/2026-06-15-wizard-dsl-examples.rb +245 -0
  71. data/docs/superpowers/specs/2026-06-17-wizard-relaunch-prompt-design.md +86 -0
  72. data/docs/superpowers/specs/2026-06-18-wizard-attachments-design.md +101 -0
  73. data/docs/superpowers/specs/2026-06-18-wizard-hosting-design.md +220 -0
  74. data/docs/superpowers/specs/2026-06-26-kanban-dsl-design.md +388 -0
  75. data/docs/superpowers/specs/2026-07-03-kanban-auth-simplification.md +159 -0
  76. data/gemfiles/postgres.gemfile +8 -0
  77. data/gemfiles/postgres.gemfile.lock +321 -0
  78. data/gemfiles/rails_7.gemfile +1 -0
  79. data/gemfiles/rails_7.gemfile.lock +1 -1
  80. data/gemfiles/rails_8.0.gemfile +1 -0
  81. data/gemfiles/rails_8.0.gemfile.lock +1 -1
  82. data/gemfiles/rails_8.1.gemfile +1 -0
  83. data/gemfiles/rails_8.1.gemfile.lock +14 -1
  84. data/lib/generators/pu/gem/active_shrine/active_shrine_generator.rb +5 -0
  85. data/lib/generators/pu/invites/templates/packages/invites/app/controllers/invites/user_invitations_controller.rb.tt +6 -1
  86. data/lib/plutonium/action/base.rb +17 -0
  87. data/lib/plutonium/auth/rodauth.rb +1 -2
  88. data/lib/plutonium/configuration.rb +16 -0
  89. data/lib/plutonium/core/controller.rb +20 -1
  90. data/lib/plutonium/definition/base.rb +25 -0
  91. data/lib/plutonium/definition/form_layout.rb +54 -35
  92. data/lib/plutonium/definition/index_views.rb +70 -1
  93. data/lib/plutonium/definition/wizards.rb +209 -0
  94. data/lib/plutonium/invites/concerns/invite_token.rb +9 -0
  95. data/lib/plutonium/invites/concerns/invite_user.rb +9 -0
  96. data/lib/plutonium/invites/controller.rb +4 -1
  97. data/lib/plutonium/kanban/action.rb +7 -0
  98. data/lib/plutonium/kanban/board.rb +40 -0
  99. data/lib/plutonium/kanban/broadcaster.rb +54 -0
  100. data/lib/plutonium/kanban/column.rb +122 -0
  101. data/lib/plutonium/kanban/context.rb +15 -0
  102. data/lib/plutonium/kanban/dsl.rb +71 -0
  103. data/lib/plutonium/kanban/grouping.rb +51 -0
  104. data/lib/plutonium/kanban/positioning.rb +75 -0
  105. data/lib/plutonium/kanban.rb +11 -0
  106. data/lib/plutonium/migrations.rb +40 -0
  107. data/lib/plutonium/models/has_cents.rb +30 -2
  108. data/lib/plutonium/positioning.rb +146 -0
  109. data/lib/plutonium/railtie.rb +33 -0
  110. data/lib/plutonium/resource/controller.rb +24 -1
  111. data/lib/plutonium/resource/controllers/crud_actions.rb +9 -1
  112. data/lib/plutonium/resource/controllers/kanban_actions.rb +851 -0
  113. data/lib/plutonium/resource/controllers/wizard_actions.rb +165 -0
  114. data/lib/plutonium/resource/policy.rb +14 -0
  115. data/lib/plutonium/routing/mapper_extensions.rb +45 -0
  116. data/lib/plutonium/routing/wizard_registration.rb +289 -0
  117. data/lib/plutonium/ui/display/components/currency.rb +41 -9
  118. data/lib/plutonium/ui/display/options/inferred_types.rb +2 -5
  119. data/lib/plutonium/ui/display/resource.rb +17 -12
  120. data/lib/plutonium/ui/form/base.rb +25 -5
  121. data/lib/plutonium/ui/form/components/currency.rb +64 -0
  122. data/lib/plutonium/ui/form/components/intl_tel_input.rb +27 -1
  123. data/lib/plutonium/ui/form/components/password.rb +126 -0
  124. data/lib/plutonium/ui/form/components/uppy.rb +26 -5
  125. data/lib/plutonium/ui/form/kanban_move.rb +46 -0
  126. data/lib/plutonium/ui/form/options/inferred_types.rb +26 -0
  127. data/lib/plutonium/ui/form/resource.rb +13 -1
  128. data/lib/plutonium/ui/form/theme.rb +7 -0
  129. data/lib/plutonium/ui/form/wizard.rb +63 -0
  130. data/lib/plutonium/ui/grid/card.rb +56 -18
  131. data/lib/plutonium/ui/kanban/card.rb +67 -0
  132. data/lib/plutonium/ui/kanban/color_dot.rb +36 -0
  133. data/lib/plutonium/ui/kanban/column.rb +411 -0
  134. data/lib/plutonium/ui/kanban/resource.rb +319 -0
  135. data/lib/plutonium/ui/layout/base.rb +1 -1
  136. data/lib/plutonium/ui/layout/resource_layout.rb +7 -1
  137. data/lib/plutonium/ui/modal/base.rb +30 -3
  138. data/lib/plutonium/ui/modal/centered.rb +5 -2
  139. data/lib/plutonium/ui/options/has_cents_field.rb +21 -0
  140. data/lib/plutonium/ui/page/index.rb +2 -1
  141. data/lib/plutonium/ui/page/interactive_action.rb +12 -2
  142. data/lib/plutonium/ui/page/kanban_move.rb +20 -0
  143. data/lib/plutonium/ui/page/show.rb +29 -1
  144. data/lib/plutonium/ui/page/wizard.rb +371 -0
  145. data/lib/plutonium/ui/page/wizard_chooser.rb +97 -0
  146. data/lib/plutonium/ui/page/wizard_completed.rb +86 -0
  147. data/lib/plutonium/ui/table/base.rb +1 -1
  148. data/lib/plutonium/ui/table/components/view_switcher.rb +2 -1
  149. data/lib/plutonium/ui/table/resource.rb +1 -1
  150. data/lib/plutonium/ui/wizard/review.rb +196 -0
  151. data/lib/plutonium/ui/wizard/stepper.rb +122 -0
  152. data/lib/plutonium/ui/wizard/summary_display.rb +92 -0
  153. data/lib/plutonium/version.rb +1 -1
  154. data/lib/plutonium/wizard/attachment_data.rb +42 -0
  155. data/lib/plutonium/wizard/attachments.rb +226 -0
  156. data/lib/plutonium/wizard/base.rb +216 -0
  157. data/lib/plutonium/wizard/base_controller.rb +31 -0
  158. data/lib/plutonium/wizard/configuration.rb +42 -0
  159. data/lib/plutonium/wizard/controller.rb +162 -0
  160. data/lib/plutonium/wizard/data.rb +134 -0
  161. data/lib/plutonium/wizard/driving.rb +639 -0
  162. data/lib/plutonium/wizard/dsl.rb +336 -0
  163. data/lib/plutonium/wizard/errors.rb +27 -0
  164. data/lib/plutonium/wizard/field_capture.rb +157 -0
  165. data/lib/plutonium/wizard/field_importer.rb +208 -0
  166. data/lib/plutonium/wizard/gate.rb +171 -0
  167. data/lib/plutonium/wizard/instance_key.rb +97 -0
  168. data/lib/plutonium/wizard/lazy_persisted.rb +77 -0
  169. data/lib/plutonium/wizard/resume.rb +250 -0
  170. data/lib/plutonium/wizard/review_step.rb +48 -0
  171. data/lib/plutonium/wizard/route_resolution.rb +40 -0
  172. data/lib/plutonium/wizard/runner.rb +684 -0
  173. data/lib/plutonium/wizard/session.rb +53 -0
  174. data/lib/plutonium/wizard/state.rb +35 -0
  175. data/lib/plutonium/wizard/step.rb +61 -0
  176. data/lib/plutonium/wizard/step_adapter.rb +103 -0
  177. data/lib/plutonium/wizard/store/active_record.rb +174 -0
  178. data/lib/plutonium/wizard/store/base.rb +42 -0
  179. data/lib/plutonium/wizard/store/memory.rb +44 -0
  180. data/lib/plutonium/wizard/sweep_job.rb +76 -0
  181. data/lib/plutonium/wizard.rb +86 -0
  182. data/lib/plutonium.rb +5 -0
  183. data/lib/rodauth/features/case_insensitive_login.rb +1 -1
  184. data/lib/tasks/release.rake +144 -191
  185. data/package.json +7 -5
  186. data/src/css/components.css +137 -0
  187. data/src/js/controllers/attachment_input_controller.js +15 -1
  188. data/src/js/controllers/currency_input_controller.js +39 -0
  189. data/src/js/controllers/dirty_form_guard_controller.js +155 -27
  190. data/src/js/controllers/intl_tel_input_controller.js +4 -0
  191. data/src/js/controllers/kanban_controller.js +717 -0
  192. data/src/js/controllers/password_sentinel_controller.js +39 -0
  193. data/src/js/controllers/register_controllers.js +8 -0
  194. data/src/js/controllers/remote_modal_controller.js +10 -0
  195. data/src/js/controllers/row_click_controller.js +14 -1
  196. data/src/js/controllers/wizard_controller.js +54 -0
  197. data/src/js/turbo/turbo_confirm.js +1 -1
  198. data/yarn.lock +945 -286
  199. metadata +113 -2
data/CHANGELOG.md CHANGED
@@ -1,3 +1,70 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [0.62.0] - 2026-07-04
6
+
7
+ ### Bug Fixes
8
+
9
+ - Run input-less column actions directly instead of an empty modal
10
+ - Don't call signed_id on an unsaved ActiveStorage blob in uppy
11
+ - Active_shrine downstream fixes — mime-types gem + resource param double-read
12
+ - Stop the board blanking on search/filter/scope
13
+ - Size currency input padding to its unit prefix
14
+ - Preserve collapse + horizontal scroll across moves and refresh
15
+ - Give the body a base text color so unstyled text stays visible
16
+ - Give modal dialogs a base text color so unstyled text stays visible
17
+
18
+ ### Features
19
+
20
+ - AI agent on-ramp — llms.txt, /ai quickstart, crawlable skills
21
+ - Type-aware kanban meta badges + has_cents currency unit
22
+ - Expose intl-tel-input options + default_phone_country config
23
+ - Currency input + currency/choice-aware wizard review summary
24
+ - Add :lost terminal column role
25
+ - Keep the board fresh + scrolled across writes and actions
26
+ - [**breaking**] Drop interactions, immediate drops, on_exit + on_drop→on_enter rename ([#67](https://github.com/radioactive-labs/plutonium-core/issues/67))
27
+
28
+ ### Refactoring
29
+
30
+ - Server-read collapse cookie + stable frame placeholders
31
+
32
+ ## [0.61.0] - 2026-06-30
33
+
34
+ ### Bug Fixes
35
+
36
+ - Animate the dialog scale pop via the `scale` property
37
+ - Normalize mixed-case logins to lowercase on input
38
+ - Normalize invite email to lowercase at the source
39
+ - Downcase login in signup handler's existing-account guard
40
+ - Rescue DeleteRestrictionError in CRUD destroy
41
+ - Keep modal dialogs transform-free so fixed overlays escape the panel
42
+ - Render the classic shell sidebar again
43
+ - Mount uppy Dashboard into the modal dialog so it renders above it
44
+ - Coerce ActiveStorage::Filename to String for HTML title attributes ([#66](https://github.com/radioactive-labs/plutonium-core/issues/66))
45
+ - Bump dompurify to 3.4.11 and esbuild to 0.28.1 to clear npm audit
46
+ - Clear npm Dependabot alerts (lodash 4.18.1 + dev-tree dedupe)
47
+
48
+ ### Features
49
+
50
+ - Omit empty Details tab when no fields are permitted
51
+ - Mask password/secret fields so the stored value never reaches the DOM
52
+ - Plutonium::Wizard — declarative multi-step wizard subsystem ([#62](https://github.com/radioactive-labs/plutonium-core/issues/62))
53
+ - Kanban board DSL — first-class index view with drag-to-move ([#63](https://github.com/radioactive-labs/plutonium-core/issues/63))
54
+
55
+ ### Miscellaneous Tasks
56
+
57
+ - Make releasing laptop-driven and race-free
58
+ - Review before commit — prepare stages, publish commits
59
+
60
+ ### Refactoring
61
+
62
+ - Drop the current_<name> alias from the rodauth mixin
63
+
64
+ ### Wizard
65
+
66
+ - Docs accuracy + completeness audit, plus a per-field Shrine uploader for attachments ([#64](https://github.com/radioactive-labs/plutonium-core/issues/64))
67
+
1
68
  ## [0.60.5] - 2026-06-30
2
69
 
3
70
  ### 🐛 Bug Fixes
@@ -7,648 +74,680 @@
7
74
  ### ⚙️ Miscellaneous Tasks
8
75
 
9
76
  - Update yarn.lock and .yarnrc.yml after yarn install
77
+
10
78
  ## [0.60.4] - 2026-06-15
11
79
 
12
- ### 🚀 Features
80
+ ### Features
81
+
82
+ - Drop the section divider rule, keep the accent bar
13
83
 
14
- - *(layout)* Drop the section divider rule, keep the accent bar
15
84
  ## [0.60.3] - 2026-06-15
16
85
 
17
- ### 🚀 Features
86
+ ### Features
18
87
 
19
- - *(layout)* Drop form_layout sections that resolve to zero fields
20
- - *(layout)* Refine form_layout section header styling
88
+ - Drop form_layout sections that resolve to zero fields
89
+ - Refine form_layout section header styling
21
90
 
22
- ### 🚜 Refactor
91
+ ### Refactoring
92
+
93
+ - Move engine shell to Portal::Engine with live cascade
23
94
 
24
- - *(layout)* Move engine shell to Portal::Engine with live cascade
25
95
  ## [0.60.2] - 2026-06-15
26
96
 
27
- ### 🚀 Features
97
+ ### Features
98
+
99
+ - Resolve shell across global, engine, and controller tiers
28
100
 
29
- - *(layout)* Resolve shell across global, engine, and controller tiers
30
101
  ## [0.60.1] - 2026-06-15
31
102
 
32
- ### 🚀 Features
103
+ ### Bug Fixes
33
104
 
34
- - *(layout)* First-class railless portal support
105
+ - Skip section fields not in the permitted set instead of raising
35
106
 
36
- ### 🐛 Bug Fixes
107
+ ### Features
108
+
109
+ - First-class railless portal support
37
110
 
38
- - *(forms)* Skip section fields not in the permitted set instead of raising
39
111
  ## [0.60.0] - 2026-06-14
40
112
 
41
- ### 🚀 Features
113
+ ### Features
114
+
115
+ - Add resend-invite action to rodauth admin
116
+ - Form sectioning DSL (form_layout / section / ungrouped) ([#61](https://github.com/radioactive-labs/plutonium-core/issues/61))
42
117
 
43
- - *(generators)* Add resend-invite action to rodauth admin
44
- - *(forms)* Form sectioning DSL (form_layout / section / ungrouped) (#61)
45
118
  ## [0.59.0] - 2026-06-13
46
119
 
47
- ### 🚀 Features
120
+ ### Bug Fixes
48
121
 
49
- - *(resource)* Add built-in policy-gated CSV export
122
+ - Configure solid_errors reading connection and env lookup
123
+ - Resolve association filter class via resource_class reflection
50
124
 
51
- ### 🐛 Bug Fixes
125
+ ### Features
126
+
127
+ - Add built-in policy-gated CSV export
52
128
 
53
- - *(generators)* Configure solid_errors reading connection and env lookup
54
- - *(query)* Resolve association filter class via resource_class reflection
55
129
  ## [0.58.1] - 2026-06-10
56
130
 
57
- ### 🐛 Bug Fixes
131
+ ### Bug Fixes
132
+
133
+ - Prevent pu-rail-pinned persisting on non-rail pages
58
134
 
59
- - *(ui/layout)* Prevent pu-rail-pinned persisting on non-rail pages
60
135
  ## [0.58.0] - 2026-06-10
61
136
 
62
- ### 🐛 Bug Fixes
137
+ ### Bug Fixes
138
+
139
+ - Set url_options directly on ActionMailer::Base instead of config
140
+ - Short-circuit call with failure when validation fails
141
+ - Pre-populate extraction record so conditioned selects resolve correctly
142
+ - Use after_commit to avoid orphaned email jobs on rollback
63
143
 
64
- - *(rodauth)* Set url_options directly on ActionMailer::Base instead of config
65
- - *(interaction)* Short-circuit call with failure when validation fails
66
- - *(form)* Pre-populate extraction record so conditioned selects resolve correctly
67
- - *(invites)* Use after_commit to avoid orphaned email jobs on rollback
68
144
  ## [0.57.0] - 2026-06-09
69
145
 
70
- ### 🚀 Features
146
+ ### Bug Fixes
71
147
 
72
- - *(scopes)* Add display-only condition: to scopes
148
+ - Guard tailwind prerequisite and fix landing page command
149
+ - Guard against nil current_scoped_entity in remember_scoped_entity
150
+ - Use dynamic viewport height to prevent clipping on mobile
73
151
 
74
- ### 🐛 Bug Fixes
152
+ ### Features
75
153
 
76
- - *(generators/assets)* Guard tailwind prerequisite and fix landing page command
77
- - *(entity_scoping)* Guard against nil current_scoped_entity in remember_scoped_entity
78
- - *(ui/slideover)* Use dynamic viewport height to prevent clipping on mobile
154
+ - Add display-only condition: to scopes
79
155
 
80
- ### ⚙️ Miscellaneous Tasks
156
+ ### Miscellaneous Tasks
157
+
158
+ - Add skill sync to plutonium template and use conventional commits
81
159
 
82
- - *(templates)* Add skill sync to plutonium template and use conventional commits
83
160
  ## [0.56.3] - 2026-06-07
84
161
 
85
- ### 🐛 Bug Fixes
162
+ ### Bug Fixes
163
+
164
+ - Use dynamic viewport height so mobile rail toggle stays visible
165
+ - Link icon rail logo to home
166
+ - Default icon rail to pinned
167
+ - Let scopes bar scroll horizontally on small screens
86
168
 
87
- - *(ui/sidebar)* Use dynamic viewport height so mobile rail toggle stays visible
88
- - *(ui/sidebar)* Link icon rail logo to home
89
- - *(ui/sidebar)* Default icon rail to pinned
90
- - *(ui/table)* Let scopes bar scroll horizontally on small screens
91
169
  ## [0.56.2] - 2026-06-05
92
170
 
93
- ### 🐛 Bug Fixes
171
+ ### Bug Fixes
172
+
173
+ - Run skills sync in unbundled env
174
+ - Prevent large page numbers from overflowing buttons
94
175
 
95
- - *(generators/update)* Run skills sync in unbundled env
96
- - *(ui/pagination)* Prevent large page numbers from overflowing buttons
97
176
  ## [0.56.1] - 2026-06-05
98
177
 
99
- ### 🚀 Features
178
+ ### Bug Fixes
100
179
 
101
- - *(actions)* Add display-only condition: to actions
180
+ - Version-adapt kitchen_sinks migration
102
181
 
103
- ### 🐛 Bug Fixes
182
+ ### Documentation
104
183
 
105
- - *(dummy)* Version-adapt kitchen_sinks migration
184
+ - Recommend db:prepare, firm up README, document conditional actions
106
185
 
107
- ### 📚 Documentation
186
+ ### Features
187
+
188
+ - Add display-only condition: to actions
108
189
 
109
- - Recommend db:prepare, firm up README, document conditional actions
110
190
  ## [0.56.0] - 2026-06-05
111
191
 
112
- ### 🚀 Features
192
+ ### Bug Fixes
113
193
 
114
- - *(ui)* Auto-rendered components for boolean, enum & money fields
115
- - *(generators/lite)* Add pu:lite:tune and pu:lite:maintenance for SQLite tuning + maintenance
116
- - *(ui)* Sidebar menu items accept arbitrary link attributes
117
- - *(ui)* Restore deleted nested rows + shared, polished removed bar
118
- - *(ui)* Type-aware grid cards + overhaul KitchenSink dummy resource
194
+ - Sync skills in a fresh process; pin post-install notice to 0.49.0
195
+ - Native multi-selects render at a usable height
196
+ - Dropdown menu teleports to <body> to escape overflow clipping
197
+ - Force :resources route_type for has_many nested routes
198
+ - Record-scoped commit URL for actions with record_action: false
199
+ - Serialize JSON values via as_json (ISO 8601 datetimes)
200
+ - Add reading role to Rails Pulse connects_to config
201
+ - Bind subject during interaction param extraction
202
+ - Dirty-form-guard tracks edits via first-interaction baseline
203
+ - Give the JSON form input dark-mode styling
119
204
 
120
- ### 🐛 Bug Fixes
205
+ ### Features
121
206
 
122
- - *(generators/update)* Sync skills in a fresh process; pin post-install notice to 0.49.0
123
- - *(ui)* Native multi-selects render at a usable height
124
- - *(ui)* Dropdown menu teleports to <body> to escape overflow clipping
125
- - *(routing)* Force :resources route_type for has_many nested routes
126
- - *(ui)* Record-scoped commit URL for actions with record_action: false
127
- - *(api)* Serialize JSON values via as_json (ISO 8601 datetimes)
128
- - *(generators)* Add reading role to Rails Pulse connects_to config
129
- - *(actions)* Bind subject during interaction param extraction
130
- - *(ui)* Dirty-form-guard tracks edits via first-interaction baseline
131
- - *(ui)* Give the JSON form input dark-mode styling
207
+ - Auto-rendered components for boolean, enum & money fields
208
+ - Add pu:lite:tune and pu:lite:maintenance for SQLite tuning + maintenance
209
+ - Sidebar menu items accept arbitrary link attributes
210
+ - Restore deleted nested rows + shared, polished removed bar
211
+ - Type-aware grid cards + overhaul KitchenSink dummy resource
132
212
 
133
- ### 🧪 Testing
213
+ ### Miscellaneous Tasks
134
214
 
135
- - Fix stale generator assertions and drop committed dummy schema
136
- - *(dummy)* Add KitchenSink resource exercising every input/display type
215
+ - Sync appraisal gemfile.lock files to v0.55.0
137
216
 
138
- ### ⚙️ Miscellaneous Tasks
217
+ ### Testing
218
+
219
+ - Fix stale generator assertions and drop committed dummy schema
220
+ - Add KitchenSink resource exercising every input/display type
139
221
 
140
- - Sync appraisal gemfile.lock files to v0.55.0
141
222
  ## [0.55.0] - 2026-06-03
142
223
 
143
- ### 🚀 Features
224
+ ### Bug Fixes
144
225
 
145
- - Structured_input classless structured & repeater inputs (resources + interactions) (#60)
226
+ - Keep modal backdrop static to smooth dialog dismiss
146
227
 
147
- ### 🐛 Bug Fixes
228
+ ### Features
229
+
230
+ - Structured_input — classless structured & repeater inputs (resources + interactions) ([#60](https://github.com/radioactive-labs/plutonium-core/issues/60))
148
231
 
149
- - *(ui)* Keep modal backdrop static to smooth dialog dismiss
232
+ ### Testing
150
233
 
151
- ### 🧪 Testing
234
+ - Land authenticated users on the entity-scoped org portal
235
+ - Serve the Organization resource in the org portal
152
236
 
153
- - *(dummy)* Land authenticated users on the entity-scoped org portal
154
- - *(dummy)* Serve the Organization resource in the org portal
155
237
  ## [0.54.0] - 2026-06-01
156
238
 
157
- ### 🚀 Features
239
+ ### Bug Fixes
158
240
 
159
- - *(ui)* Refine file-input height and required-marker theming
241
+ - Match Plutonium::Engine by name to survive dev reload
242
+ - Carry only an explicit return_to on resource forms
243
+ - Ignore bubbled file-input cancel in modal dialogs
244
+ - Cap icon-rail flyout to the viewport height
160
245
 
161
- ### 🐛 Bug Fixes
246
+ ### Features
162
247
 
163
- - *(engine)* Match Plutonium::Engine by name to survive dev reload
164
- - *(ui)* Carry only an explicit return_to on resource forms
165
- - *(ui)* Ignore bubbled file-input cancel in modal dialogs
166
- - *(ui)* Cap icon-rail flyout to the viewport height
248
+ - Refine file-input height and required-marker theming
167
249
 
168
- ### 🚜 Refactor
250
+ ### Miscellaneous Tasks
169
251
 
170
- - *(ui)* Render flash via self-contained component classes
252
+ - Rebuild bundled assets
171
253
 
172
- ### 🧪 Testing
254
+ ### Refactoring
173
255
 
174
- - *(ui)* Characterize nested resource and interaction form rendering
256
+ - Render flash via self-contained component classes
175
257
 
176
- ### ⚙️ Miscellaneous Tasks
258
+ ### Testing
259
+
260
+ - Characterize nested resource and interaction form rendering
177
261
 
178
- - *(assets)* Rebuild bundled assets
179
262
  ## [0.53.1] - 2026-05-31
180
263
 
181
- ### 🐛 Bug Fixes
264
+ ### Bug Fixes
265
+
266
+ - Tolerate non-Plutonium engines during route reload
182
267
 
183
- - *(routing)* Tolerate non-Plutonium engines during route reload
184
268
  ## [0.53.0] - 2026-05-31
185
269
 
186
- ### 🚀 Features
270
+ ### Bug Fixes
187
271
 
188
- - *(ui)* Add Avatar component with Navii fallback (#59)
272
+ - Correct broken cross-page anchors in guides
273
+ - Retract incorrect "never super" guidance in relation_scope
274
+ - Correct scoped-URL shape in multi-tenancy docs
275
+ - Match change_password_notify mailer template name
189
276
 
190
- ### 🐛 Bug Fixes
277
+ ### Features
278
+
279
+ - Add Avatar component with Navii fallback ([#59](https://github.com/radioactive-labs/plutonium-core/issues/59))
191
280
 
192
- - *(docs)* Correct broken cross-page anchors in guides
193
- - *(docs)* Retract incorrect "never super" guidance in relation_scope
194
- - *(docs)* Correct scoped-URL shape in multi-tenancy docs
195
- - *(rodauth)* Match change_password_notify mailer template name
281
+ ### Refactoring
196
282
 
197
- ### 🚜 Refactor
283
+ - Remove dead view helpers superseded by Phlex components
198
284
 
199
- - *(helpers)* Remove dead view helpers superseded by Phlex components
200
285
  ## [0.52.0] - 2026-05-21
201
286
 
202
- ### 🐛 Bug Fixes
287
+ ### Bug Fixes
203
288
 
204
- - *(generators)* Use inclusion validation for required booleans
205
- - *(generators/assets)* Warn on failed yarn add instead of silently continuing
206
- - *(docs)* Let StopWriting terminals scroll horizontally instead of overflowing the column
207
- - *(docs)* Drop misleading 15-min claim — hero CTA → 'Tutorial', getting-started title → 'Learn Plutonium by building'
208
- - *(generators,docs)* Tutorial walkthrough + reference audit (#57)
209
- - *(ui/form)* Scope form ids per turbo frame to prevent stream-replace collisions
210
- - *(ui/form)* Hide secure_association "+" inside secondary modal
211
- - *(js/form)* Dedupe pre_submit hidden field on repeat change events
212
- - *(ui)* Form error alert margin + include model name in New/Edit page titles
289
+ - Use inclusion validation for required booleans
290
+ - Warn on failed yarn add instead of silently continuing
291
+ - Let StopWriting terminals scroll horizontally instead of overflowing the column
292
+ - Drop misleading 15-min claim — hero CTA → 'Tutorial', getting-started title → 'Learn Plutonium by building'
293
+ - Tutorial walkthrough + reference audit ([#57](https://github.com/radioactive-labs/plutonium-core/issues/57))
294
+ - Scope form ids per turbo frame to prevent stream-replace collisions
295
+ - Hide secure_association "+" inside secondary modal
296
+ - Dedupe pre_submit hidden field on repeat change events
297
+ - Form error alert margin + include model name in New/Edit page titles
213
298
 
214
- ### ⚙️ Miscellaneous Tasks
299
+ ### Miscellaneous Tasks
300
+
301
+ - Refresh rails-8.1 gemfile.lock for v0.51.0
215
302
 
216
- - *(appraisal)* Refresh rails-8.1 gemfile.lock for v0.51.0
217
303
  ## [0.51.0] - 2026-05-14
218
304
 
219
- ### 🚀 Features
305
+ ### Bug Fixes
220
306
 
221
- - *(form)* Stack secondary modal for inline "+" on associations
222
- - *(form)* Json/jsonb input component with raw-value support
223
- - Typeahead endpoint for resource form inputs and filters (#55)
307
+ - Stabilize generator test suite against hangs
308
+ - Validate association SGIDs against full authz scope
309
+ - Keep yarn out of the parent TTY
224
310
 
225
- ### 🐛 Bug Fixes
311
+ ### Documentation
226
312
 
227
- - *(test)* Stabilize generator test suite against hangs
228
- - *(form)* Validate association SGIDs against full authz scope
229
- - *(release)* Keep yarn out of the parent TTY
313
+ - Restructure into 7 functional areas + rewrite guides as task recipes
230
314
 
231
- ### 🚜 Refactor
315
+ ### Features
232
316
 
233
- - *(definition)* Rename views DSL to index_views
234
- - *(skills)* Compact and merge 19 skills into 8
317
+ - Stack secondary modal for inline "+" on associations
318
+ - Json/jsonb input component with raw-value support
319
+ - Typeahead endpoint for resource form inputs and filters ([#55](https://github.com/radioactive-labs/plutonium-core/issues/55))
235
320
 
236
- ### 📚 Documentation
321
+ ### Miscellaneous Tasks
237
322
 
238
- - Restructure into 7 functional areas + rewrite guides as task recipes
323
+ - Bump frontend deps to clear Dependabot alerts
324
+ - Bump appraisal lockfiles to 0.50.0
325
+ - Drop dead pin_shell_to_classic hook
239
326
 
240
- ### ⚙️ Miscellaneous Tasks
327
+ ### Refactoring
328
+
329
+ - Rename views DSL to index_views
330
+ - Compact and merge 19 skills into 8
241
331
 
242
- - Bump appraisal lockfiles to 0.50.0
243
- - *(generators/update)* Drop dead pin_shell_to_classic hook
244
332
  ## [0.50.0] - 2026-05-11
245
333
 
246
- ### 🚀 Features
334
+ ### Bug Fixes
247
335
 
248
- - *(css)* Style WebKit autofill on .pu-input variants
336
+ - Suppress label and chrome for hidden fields
337
+ - Inject recurring tasks under env blocks
249
338
 
250
- ### 🐛 Bug Fixes
339
+ ### Features
340
+
341
+ - Style WebKit autofill on .pu-input variants
251
342
 
252
- - *(ui/form)* Suppress label and chrome for hidden fields
253
- - *(generators/rails_pulse)* Inject recurring tasks under env blocks
254
343
  ## [0.49.1] - 2026-05-06
255
344
 
256
- ### 🚀 Features
345
+ ### Bug Fixes
257
346
 
258
- - *(invites)* Support multiple invite models per app
347
+ - Scope parent association only to matching relations
348
+ - Preserve sidebar scroll across Turbo navigations
349
+ - Add invite_entity_attribute hook for non-:entity invite models
350
+ - Restore default layout on direct loads
351
+ - Unblock acceptance + non-importmap apps
352
+ - Force text/html on failure response
353
+ - Position calendar correctly inside modal dialogs
259
354
 
260
- ### 🐛 Bug Fixes
355
+ ### Features
356
+
357
+ - Support multiple invite models per app
261
358
 
262
- - *(policy)* Scope parent association only to matching relations
263
- - *(ui)* Preserve sidebar scroll across Turbo navigations
264
- - *(invites)* Add invite_entity_attribute hook for non-:entity invite models
265
- - *(interactive_actions)* Restore default layout on direct loads
266
- - *(invites)* Unblock acceptance + non-importmap apps
267
- - *(interactive_actions)* Force text/html on failure response
268
- - *(flatpickr)* Position calendar correctly inside modal dialogs
269
359
  ## [0.49.0] - 2026-05-04
270
360
 
271
- ### 🚀 Features
361
+ ### Bug Fixes
272
362
 
273
- - *(generators)* Add `pu:gem:actual_db_schema` and wire into app template
274
- - *(ui)* Add auto mode to color mode selector
275
- - *(ui)* Render color mode selector on rodauth layout
276
- - *(generators)* Flesh out rails_pulse initializer template
363
+ - Return clean 403 from non-HTML unauthorized handler
364
+ - Align pu:lite:rails_pulse with v0.3 schema flow
365
+ - Prefer main_app.root_path over login_redirect
277
366
 
278
- ### 🐛 Bug Fixes
367
+ ### Features
279
368
 
280
- - *(controller)* Return clean 403 from non-HTML unauthorized handler
281
- - *(generators)* Align pu:lite:rails_pulse with v0.3 schema flow
282
- - *(rodauth)* Prefer main_app.root_path over login_redirect
369
+ - Add `pu:gem:actual_db_schema` and wire into app template
370
+ - Add auto mode to color mode selector
371
+ - Render color mode selector on rodauth layout
372
+ - Flesh out rails_pulse initializer template
283
373
 
284
- ### 🚜 Refactor
374
+ ### Miscellaneous Tasks
285
375
 
286
- - *(routing)* Rename entity scope prefix from `_scope` to `_scoped`
376
+ - Rename :client_max_limit to :max_limit
377
+ - Run appraisals
287
378
 
288
- ### ⚙️ Miscellaneous Tasks
379
+ ### Refactoring
380
+
381
+ - Rename entity scope prefix from `_scope` to `_scoped`
289
382
 
290
- - *(pagy)* Rename :client_max_limit to :max_limit
291
- - Run appraisals
292
383
  ## [0.48.0] - 2026-04-16
293
384
 
294
- ### 🚀 Features
385
+ ### Bug Fixes
295
386
 
296
- - *(turbo)* Preserve scroll by emitting refresh when redirect target matches referer
387
+ - Respect `confirmation: false` on interactive actions
297
388
 
298
- ### 🐛 Bug Fixes
389
+ ### Features
299
390
 
300
- - *(action)* Respect `confirmation: false` on interactive actions
391
+ - Preserve scroll by emitting refresh when redirect target matches referer
301
392
 
302
- ### 🧪 Testing
393
+ ### Testing
394
+
395
+ - Browser coverage for Turbo refresh + scroll preservation
303
396
 
304
- - *(system)* Browser coverage for Turbo refresh + scroll preservation
305
397
  ## [0.47.0] - 2026-04-15
306
398
 
307
- ### 🚀 Features
399
+ ### Features
308
400
 
309
- - *(core)* Add `interaction:` kwarg to resource_url_for
310
- - *(testing)* Add Plutonium::Testing module, generators, skill, docs, and migrate in-repo tests
401
+ - Add `interaction:` kwarg to resource_url_for
402
+ - Add Plutonium::Testing module, generators, skill, docs, and migrate in-repo tests
311
403
 
312
- ### ⚙️ Miscellaneous Tasks
404
+ ### Miscellaneous Tasks
313
405
 
314
406
  - Update yarn
407
+
315
408
  ## [0.46.0] - 2026-04-11
316
409
 
317
- ### 🚀 Features
410
+ ### Bug Fixes
318
411
 
319
- - *(profile)* Default profile model to {UserModel}Profile
320
- - *(generators)* Sync skills during pu:core:update if plutonium skill is installed
321
- - *(generators/active_shrine)* Disable Active Storage railtie and include ActiveShrine::Model
412
+ - Resolve scoped entity class lazily to survive autoreload
413
+ - Render page title in layout, drop per-view h1s
414
+ - Use derived user association in current_membership
415
+ - Redirect to login after verification email sent
322
416
 
323
- ### 🐛 Bug Fixes
417
+ ### Documentation
324
418
 
325
- - *(engine)* Resolve scoped entity class lazily to survive autoreload
326
- - *(rodauth)* Render page title in layout, drop per-view h1s
327
- - *(generators/invites)* Use derived user association in current_membership
328
- - *(generators/rodauth)* Redirect to login after verification email sent
419
+ - Clarify generator gotchas for installation, rodauth, and unattended runs
420
+ - Comprehensive Plutonium skills overhaul
421
+ - Document nested_attributes gotchas in policy and definition
329
422
 
330
- ### 🚜 Refactor
423
+ ### Features
331
424
 
332
- - *(generators)* Add inject_into_concerns_controller to merge included blocks
425
+ - Default profile model to {UserModel}Profile
426
+ - Sync skills during pu:core:update if plutonium skill is installed
427
+ - Disable Active Storage railtie and include ActiveShrine::Model
333
428
 
334
- ### 📚 Documentation
429
+ ### Miscellaneous Tasks
335
430
 
336
- - *(skills)* Clarify generator gotchas for installation, rodauth, and unattended runs
337
- - *(skills)* Comprehensive Plutonium skills overhaul
338
- - *(skills)* Document nested_attributes gotchas in policy and definition
431
+ - Update test lockfiles
339
432
 
340
- ### ⚙️ Miscellaneous Tasks
433
+ ### Refactoring
434
+
435
+ - Add inject_into_concerns_controller to merge included blocks
341
436
 
342
- - Update test lockfiles
343
437
  ## [0.45.3] - 2026-04-07
344
438
 
345
- ### 🐛 Bug Fixes
439
+ ### Bug Fixes
440
+
441
+ - Use Pagy::OPTIONS instead of frozen DEFAULT
346
442
 
347
- - *(pagy)* Use Pagy::OPTIONS instead of frozen DEFAULT
348
443
  ## [0.45.2] - 2026-04-07
349
444
 
350
- ### 🐛 Bug Fixes
445
+ ### Bug Fixes
446
+
447
+ - Honor limit param by setting client_max_limit
351
448
 
352
- - *(pagy)* Honor limit param by setting client_max_limit
353
449
  ## [0.45.1] - 2026-04-02
354
450
 
355
- ### 🐛 Bug Fixes
451
+ ### Bug Fixes
452
+
453
+ - Use named route helpers for top-level resource URLs
356
454
 
357
- - *(routing)* Use named route helpers for top-level resource URLs
358
455
  ## [0.45.0] - 2026-04-01
359
456
 
360
- ### 🚀 Features
457
+ ### Bug Fixes
361
458
 
362
- - *(generator)* Add entity link to portal resource header
363
- - *(tokens)* Add --pu-text-danger CSS token
459
+ - Suffix scoped_entity_param_key to prevent route param collision
460
+ - Add view path and fix nested form in invitation template
364
461
 
365
- ### 🐛 Bug Fixes
462
+ ### Features
366
463
 
367
- - *(engine)* Suffix scoped_entity_param_key to prevent route param collision
368
- - *(invites)* Add view path and fix nested form in invitation template
464
+ - Add entity link to portal resource header
465
+ - Add --pu-text-danger CSS token
369
466
 
370
- ### 🚜 Refactor
467
+ ### Refactoring
468
+
469
+ - Consolidate skills and improve discoverability
371
470
 
372
- - *(skills)* Consolidate skills and improve discoverability
373
471
  ## [0.44.1] - 2026-03-30
374
472
 
375
- ### 🐛 Bug Fixes
473
+ ### Bug Fixes
474
+
475
+ - Register rescue responses before action_dispatch.configure
476
+ - Pass association SGIDs in create params to match form submission
477
+
478
+ ### Miscellaneous Tasks
376
479
 
377
- - *(railtie)* Register rescue responses before action_dispatch.configure
378
- - *(test)* Pass association SGIDs in create params to match form submission
480
+ - Bump phlexi-form to >= 0.14.2
379
481
 
380
- ### 🚜 Refactor
482
+ ### Refactoring
483
+
484
+ - Use upstream @raw_choices from phlexi-form 0.14.2
381
485
 
382
- - *(form)* Use upstream @raw_choices from phlexi-form 0.14.2
383
486
  ## [0.44.0] - 2026-03-30
384
487
 
385
- ### 🚀 Features
488
+ ### Bug Fixes
386
489
 
387
- - Support singular parent resources and entity scoping in nested URL generation
388
- - *(generators)* Add pu:saas:welcome generator for post-login onboarding
389
- - *(generators)* Extend pu:saas:setup with portal, welcome, invites, and profile
490
+ - Lazy-load sequel to avoid requiring it when Rodauth is unused
390
491
 
391
- ### 🐛 Bug Fixes
492
+ ### Features
392
493
 
393
- - *(auth)* Lazy-load sequel to avoid requiring it when Rodauth is unused
494
+ - Support singular parent resources and entity scoping in nested URL generation
495
+ - Add pu:saas:welcome generator for post-login onboarding
496
+ - Extend pu:saas:setup with portal, welcome, invites, and profile
394
497
 
395
- ### 🚜 Refactor
498
+ ### Refactoring
396
499
 
397
500
  - Upgrade pagy from v9 to v43
398
- - *(generators)* Improve SaaS generators and shared concerns
399
- - *(invites)* Improve welcome flow, idempotent routes, and skip action
400
- - *(generators)* Add non-interactive prompt, improve build tooling and association resolver
401
- - *(test)* Restructure dummy app with catalog, multi-portal architecture
402
- ## [0.43.2] - 2026-03-13
403
-
404
- ### 🐛 Bug Fixes
501
+ - Improve SaaS generators and shared concerns
502
+ - Improve welcome flow, idempotent routes, and skip action
503
+ - Add non-interactive prompt, improve build tooling and association resolver
504
+ - Restructure dummy app with catalog, multi-portal architecture
405
505
 
406
- - *(invites)* Use enum name for status and correct interaction base class
506
+ ## [0.43.2] - 2026-03-13
407
507
 
408
- ### 🚜 Refactor
508
+ ### Bug Fixes
409
509
 
410
- - *(auth)* Extract current_policy_context to base authorizable
411
- - *(invites)* Use Rodauth module include and remove dead code
510
+ - Use enum name for status and correct interaction base class
412
511
 
413
- ### ⚙️ Miscellaneous Tasks
512
+ ### Miscellaneous Tasks
414
513
 
415
- - *(tests)* Fix generator assertions and remove dead code
514
+ - Fix generator assertions and remove dead code
416
515
  - Remove trailing blank line in model_generator_base
417
516
  - Update Ruby to 3.4 and refresh dependencies
418
- ## [0.43.1] - 2026-03-09
419
517
 
420
- ### 🐛 Bug Fixes
518
+ ### Refactoring
421
519
 
422
- - *(ui)* Fix scope comparison and clean up scopes bar component
423
- - *(release)* Auto-run npm login instead of aborting on missing auth
424
- ## [0.43.0] - 2026-03-05
520
+ - Extract current_policy_context to base authorizable
521
+ - Use Rodauth module include and remove dead code
425
522
 
426
- ### 🚀 Features
523
+ ## [0.43.1] - 2026-03-09
427
524
 
428
- - *(generators)* Add TypeSpec API specification generator
429
- - *(forms)* Make submit_and_continue button configurable
430
- - *(generators)* Add package destination and namespace handling to invites
431
- - *(controller)* Auto-detect entity association by class
432
- - *(generators)* Add profile generators for user settings pages
433
- - *(auth)* Add profile_url helper method to rodauth module
525
+ ### Bug Fixes
434
526
 
435
- ### 🐛 Bug Fixes
527
+ - Fix scope comparison and clean up scopes bar component
528
+ - Auto-run npm login instead of aborting on missing auth
436
529
 
437
- - *(ui)* Support custom primary keys and optional timestamps
438
- - *(routing)* Handle singular resources and entity scoping correctly
439
- - *(generators)* Improve robustness and package support
440
- - *(resource)* Handle class reloading in associated_with scope
441
- - *(ui)* Show profile link in user menu only when profile_url defined
442
- - *(generators)* Fix invites templates and null attribute handling
530
+ ## [0.43.0] - 2026-03-05
443
531
 
444
- ### 🚜 Refactor
532
+ ### Bug Fixes
445
533
 
446
- - *(ui)* Extract breadcrumb rendering methods and add tests
534
+ - Support custom primary keys and optional timestamps
535
+ - Handle singular resources and entity scoping correctly
536
+ - Improve robustness and package support
537
+ - Handle class reloading in associated_with scope
538
+ - Show profile link in user menu only when profile_url defined
539
+ - Fix invites templates and null attribute handling
447
540
 
448
- ### 📚 Documentation
541
+ ### Documentation
449
542
 
450
543
  - Add profile guide and update skill documentation
451
544
 
452
- ### 🧪 Testing
545
+ ### Features
453
546
 
454
- - Add OrgPortal fixture for entity scoping tests
455
- - Add tests for routing, authorization, and display helpers
547
+ - Add TypeSpec API specification generator
548
+ - Make submit_and_continue button configurable
549
+ - Add package destination and namespace handling to invites
550
+ - Auto-detect entity association by class
551
+ - Add profile generators for user settings pages
552
+ - Add profile_url helper method to rodauth module
456
553
 
457
- ### ⚙️ Miscellaneous Tasks
554
+ ### Miscellaneous Tasks
458
555
 
459
556
  - Add profile_url stub to controller template and test fixtures
460
- ## [0.42.0] - 2026-02-14
461
557
 
462
- ### 🚀 Features
558
+ ### Refactoring
463
559
 
464
- - *(ui)* Add clipboard controller and fix modal scroll lock
465
- - *(interaction)* Add turbo stream support to render response
466
- - *(interaction)* Add scoping concern for entity/parent access
467
- - *(generators)* Enhance rodauth generators
468
- - *(generators)* Add API client generator for SaaS apps
560
+ - Extract breadcrumb rendering methods and add tests
469
561
 
470
- ### 🚜 Refactor
562
+ ### Testing
563
+
564
+ - Add OrgPortal fixture for entity scoping tests
565
+ - Add tests for routing, authorization, and display helpers
471
566
 
472
- - *(tests)* Consolidate generator test cleanup with git restore
567
+ ## [0.42.0] - 2026-02-14
473
568
 
474
- ### 📚 Documentation
569
+ ### Documentation
475
570
 
476
571
  - Update generator documentation and improve saas generators
477
572
 
478
- ### 🧪 Testing
573
+ ### Features
479
574
 
480
- - Add unit tests for api client and response concerns
575
+ - Add clipboard controller and fix modal scroll lock
576
+ - Add turbo stream support to render response
577
+ - Add scoping concern for entity/parent access
578
+ - Enhance rodauth generators
579
+ - Add API client generator for SaaS apps
481
580
 
482
- ### ⚙️ Miscellaneous Tasks
581
+ ### Miscellaneous Tasks
483
582
 
484
583
  - Update gemfile locks
584
+
585
+ ### Refactoring
586
+
587
+ - Consolidate generator test cleanup with git restore
588
+
589
+ ### Testing
590
+
591
+ - Add unit tests for api client and response concerns
592
+
485
593
  ## [0.41.1] - 2026-02-09
486
594
 
487
- ### 🚀 Features
595
+ ### Features
596
+
597
+ - Support JSON default values for jsonb fields
488
598
 
489
- - *(generators)* Support JSON default values for jsonb fields
490
599
  ## [0.41.0] - 2026-02-09
491
600
 
492
- ### 🚀 Features
601
+ ### Bug Fixes
493
602
 
494
- - *(generators)* Add default value support and improve SQLite compatibility
495
- - *(generators)* Add class_name option for belongs_to fields
496
- - *(generators)* Add --policy and --definition flags to conn generator
603
+ - Fix has_many association injection pattern
604
+ - Add missing scripts to package.json in assets generator
605
+ - Remove primary account support for rodauth
606
+ - Use top-level Gem::Version to avoid namespace collision
607
+ - Check resource registration before generating association add URL
497
608
 
498
- ### 🐛 Bug Fixes
609
+ ### Documentation
610
+
611
+ - Add class_name option and associations section to generator docs
499
612
 
500
- - *(generators)* Fix has_many association injection pattern
501
- - *(generators)* Add missing scripts to package.json in assets generator
502
- - *(generators)* Remove primary account support for rodauth
503
- - *(generators)* Use top-level Gem::Version to avoid namespace collision
504
- - *(ui)* Check resource registration before generating association add URL
613
+ ### Features
505
614
 
506
- ### 📚 Documentation
615
+ - Add default value support and improve SQLite compatibility
616
+ - Add class_name option for belongs_to fields
617
+ - Add --policy and --definition flags to conn generator
507
618
 
508
- - Add class_name option and associations section to generator docs
619
+ ### Testing
509
620
 
510
- ### 🧪 Testing
621
+ - Add tests for named rodauth account configuration
622
+ - Move type alias tests to core and test actual migrations
511
623
 
512
- - *(generators)* Add tests for named rodauth account configuration
513
- - *(sqlite)* Move type alias tests to core and test actual migrations
514
624
  ## [0.40.0] - 2026-02-04
515
625
 
516
- ### 🚀 Features
626
+ ### Bug Fixes
517
627
 
518
- - *(invites)* Add user invitation system for multi-tenant apps
519
- - *(generators)* Add roles and extra_attributes options to rodauth generators
520
- - *(generator)* Add --scope flag to portal generator for entity scoping
521
- - *(generator)* Add --singular flag to pu:res:conn for singular resources
522
- - *(generators)* Add pu:lite namespace for SQLite-based services
523
- - *(generators)* Add pu:saas namespace for multi-tenant SaaS setup
524
- - *(definition)* Add default_scope method for setting default query scope
628
+ - Scope load_memory to account-specific paths
629
+ - Resolve Thor invoke caching in entity generator
630
+ - Use dynamic migration versioning for Rails compatibility
631
+ - Wrap SQLite alias in defined? check for compatibility
632
+ - Add variants to product policy permitted attributes
633
+ - Improve has_one url assertion in resource_url_for test
634
+ - Normalize CamelCase package names and validate resource records
635
+ - Dedupe namespace and read model attrs with --no-model
636
+ - Use local gem path when LOCAL=1
637
+ - Guard against envs gems during template execution
638
+ - Run db:prepare after config in lite generators
639
+ - Restore ResourceController to portal generator
525
640
 
526
- ### 🐛 Bug Fixes
641
+ ### Documentation
642
+
643
+ - Add invites skill and update rodauth skill
644
+ - Add user invites guide
527
645
 
528
- - *(rodauth)* Scope load_memory to account-specific paths
529
- - *(generators)* Resolve Thor invoke caching in entity generator
530
- - *(test)* Use dynamic migration versioning for Rails compatibility
531
- - *(config)* Wrap SQLite alias in defined? check for compatibility
532
- - *(test)* Add variants to product policy permitted attributes
533
- - *(test)* Improve has_one url assertion in resource_url_for test
534
- - *(generators)* Normalize CamelCase package names and validate resource records
535
- - *(generators)* Dedupe namespace and read model attrs with --no-model
536
- - *(templates)* Use local gem path when LOCAL=1
537
- - *(generators)* Guard against envs gems during template execution
538
- - *(generators)* Run db:prepare after config in lite generators
539
- - *(generators)* Restore ResourceController to portal generator
646
+ ### Features
540
647
 
541
- ### 🚜 Refactor
648
+ - Add user invitation system for multi-tenant apps
649
+ - Add roles and extra_attributes options to rodauth generators
650
+ - Add --scope flag to portal generator for entity scoping
651
+ - Add --singular flag to pu:res:conn for singular resources
652
+ - Add pu:lite namespace for SQLite-based services
653
+ - Add pu:saas namespace for multi-tenant SaaS setup
654
+ - Add default_scope method for setting default query scope
542
655
 
543
- - *(generators)* Comment out default policy methods
656
+ ### Miscellaneous Tasks
544
657
 
545
- ### 📚 Documentation
658
+ - Update gemfile locks
659
+ - Remove old assets
546
660
 
547
- - *(skills)* Add invites skill and update rodauth skill
548
- - *(guides)* Add user invites guide
661
+ ### Refactoring
549
662
 
550
- ### 🧪 Testing
663
+ - Comment out default policy methods
551
664
 
552
- - *(generators)* Add tests for rodauth and invites generators
665
+ ### Testing
553
666
 
554
- ### ⚙️ Miscellaneous Tasks
667
+ - Add tests for rodauth and invites generators
555
668
 
556
- - Remove old assets
557
669
  ## [0.39.2] - 2026-01-27
558
670
 
559
- ### 🐛 Bug Fixes
671
+ ### Bug Fixes
560
672
 
561
673
  - Handle create and update nested routes
562
- ## [0.39.1] - 2026-01-26
563
674
 
564
- ### 🐛 Bug Fixes
675
+ ## [0.39.1] - 2026-01-26
565
676
 
566
- - *(ui)* Include ImageTag helper for AssetsHelper compatibility
567
- ## [0.39.0] - 2026-01-26
677
+ ### Bug Fixes
568
678
 
569
- ### 🚀 Features
679
+ - Include ImageTag helper for AssetsHelper compatibility
570
680
 
571
- - *(core)* Handle ActionPolicy::Unauthorized for non-HTML formats
572
- - *(interactive_actions)* Add non-HTML response handlers for successful actions
573
- - *(routing)* Add has_one nested resource support
574
- - *(routing)* [**breaking**] Refactor nested resource URL generation with named route helpers
575
- - *(policy)* Add default_relation_scope method with verification
576
- - *(nested)* Use association names for nested resource titles and breadcrumbs
681
+ ## [0.39.0] - 2026-01-26
577
682
 
578
- ### 🐛 Bug Fixes
683
+ ### Bug Fixes
579
684
 
580
685
  - Remove duplicate kv store controller and move improvements into original
581
- - *(filters)* Improve association filter class resolution
582
- - *(ui)* Improve dropdown positioning with viewport boundary
583
- - *(auth)* Dynamically detect database adapter for Rodauth (#51)
584
- - *(crud)* Use correct action attributes for form re-rendering on errors
585
- - *(form)* Distinguish empty vs not-submitted key-value store fields
586
- - *(controller)* Use existing record context for form param extraction
587
- - *(controller)* Prevent UrlGenerationError when extracting params for nested resource update
588
- - *(routing)* Correct URL generation for interactive actions on nested resources
589
- - *(ui)* Replace deprecated phlex-rails `helpers` method with `view_context`
590
- - *(routing)* Add named routes for commit actions and document route naming requirement
591
-
592
- ### 📚 Documentation
593
-
594
- - *(definition)* Document formatter option for columns and displays
686
+ - Improve association filter class resolution
687
+ - Improve dropdown positioning with viewport boundary
688
+ - Dynamically detect database adapter for Rodauth ([#51](https://github.com/radioactive-labs/plutonium-core/issues/51))
689
+ - Use correct action attributes for form re-rendering on errors
690
+ - Distinguish empty vs not-submitted key-value store fields
691
+ - Use existing record context for form param extraction
692
+ - Prevent UrlGenerationError when extracting params for nested resource update
693
+ - Correct URL generation for interactive actions on nested resources
694
+ - Replace deprecated phlex-rails `helpers` method with `view_context`
695
+ - Add named routes for commit actions and document route naming requirement
696
+
697
+ ### Documentation
698
+
699
+ - Document formatter option for columns and displays
595
700
  - Cleanup review definition
596
701
  - Add troubleshooting guide for inflection issue
597
702
  - Update nested resource routes to use nested_ prefix
598
703
 
599
- ### 🧪 Testing
704
+ ### Features
600
705
 
601
- - Refactor tests to use real module implementations instead of mocks
706
+ - Handle ActionPolicy::Unauthorized for non-HTML formats
707
+ - Add non-HTML response handlers for successful actions
708
+ - Add has_one nested resource support
709
+ - [**breaking**] Refactor nested resource URL generation with named route helpers
710
+ - Add default_relation_scope method with verification
711
+ - Use association names for nested resource titles and breadcrumbs
602
712
 
603
- ### ⚙️ Miscellaneous Tasks
713
+ ### Miscellaneous Tasks
604
714
 
605
715
  - Use chokidar to fix dev build cyclic dependency issues
606
716
  - Warn when running tests without Appraisal
607
717
  - Switch to yarn
608
718
  - Update og image
719
+
720
+ ### Testing
721
+
722
+ - Refactor tests to use real module implementations instead of mocks
723
+
609
724
  ## [0.37.0] - 2026-01-21
610
725
 
611
- ### 🚀 Features
726
+ ### Features
612
727
 
613
- - *(ui)* Add textarea auto-grow functionality
728
+ - Add textarea auto-grow functionality
614
729
 
615
- ### 🚜 Refactor
730
+ ### Refactoring
616
731
 
617
- - *(ui)* Migrate slim-select styles to design tokens
618
- ## [0.36.0] - 2026-01-21
732
+ - Migrate slim-select styles to design tokens
619
733
 
620
- ### 🚀 Features
734
+ ## [0.36.0] - 2026-01-21
621
735
 
622
- - *(generators)* Add pu:core:update to sync gem and npm versions
623
- ## [0.35.0] - 2026-01-20
736
+ ### Features
624
737
 
625
- ### 🚀 Features
738
+ - Add pu:core:update to sync gem and npm versions
626
739
 
627
- - Add demo_features package and demo_portal for testing
628
- - Implement bulk actions for resource tables
629
- - Modernize UI with design token system and component classes
630
- - Add actions dropdown for secondary and danger actions
631
- - Add form input type aliases for explicit field type declarations
632
- - Add built-in filter types with dropdown filter panel UI
633
- - *(display)* Add boolean and color components with type aliases
634
- - *(filters)* Add clear all button with filter-panel controller
740
+ ## [0.35.0] - 2026-01-20
635
741
 
636
- ### 🐛 Bug Fixes
742
+ ### Bug Fixes
637
743
 
638
744
  - Use turbo stream redirect action instead of HTTP 302 for form submissions
639
745
  - Exclude turbo_stream format from URL preservation
640
746
  - Improve table container scroll and telephone input padding
641
747
  - Pass unwrapped record into custom column blocks
642
- - *(docs)* Prevent h2 text cutoff in VitePress docs
643
-
644
- ### 🚜 Refactor
645
-
646
- - Remove ResourceController from portal generator
647
- - Rename skills with plutonium- prefix to avoid conflicts
648
- - Simplify dashboard templates with design system classes
649
- - *(ui)* Update auth pages with new design tokens
748
+ - Prevent h2 text cutoff in VitePress docs
650
749
 
651
- ### 📚 Documentation
750
+ ### Documentation
652
751
 
653
752
  - Improve interaction docs
654
753
  - Overhaul README, CONTRIBUTING, and add CLAUDE.md for development
@@ -666,156 +765,194 @@
666
765
  - Document authorization methods
667
766
  - Add skills for themeing specifically
668
767
 
669
- ### ⚙️ Miscellaneous Tasks
768
+ ### Features
769
+
770
+ - Add demo_features package and demo_portal for testing
771
+ - Implement bulk actions for resource tables
772
+ - Modernize UI with design token system and component classes
773
+ - Add actions dropdown for secondary and danger actions
774
+ - Add form input type aliases for explicit field type declarations
775
+ - Add built-in filter types with dropdown filter panel UI
776
+ - Add boolean and color components with type aliases
777
+ - Add clear all button with filter-panel controller
778
+
779
+ ### Miscellaneous Tasks
670
780
 
671
781
  - Optimize og graph title and images
672
782
  - Realign marketing material
673
783
  - Add seeds for demo models and fix foreign keys
674
784
  - Standardrb
675
- ## [0.34.1] - 2026-01-18
676
785
 
677
- ### 🐛 Bug Fixes
786
+ ### Refactoring
678
787
 
679
- - *(release)* Check npm auth early in release workflow
680
- - *(docs)* Correct generator flags to use --dest instead of --portal/--package
681
- ## [0.34.0] - 2026-01-18
788
+ - Remove ResourceController from portal generator
789
+ - Rename skills with plutonium- prefix to avoid conflicts
790
+ - Simplify dashboard templates with design system classes
791
+ - Update auth pages with new design tokens
682
792
 
683
- ### 🚀 Features
793
+ ## [0.34.1] - 2026-01-18
684
794
 
685
- - *(generators)* Configure default_url_options via RAILS_DEFAULT_URL env var
686
- - *(generators)* Add pu:skills:sync to install Claude Code skills
687
- - *(query)* Execute adhoc blocks in controller context
688
- - *(railtie)* Map ActionPolicy::Unauthorized to 403 Forbidden
689
- - *(query)* Add default scope support for resource queries
795
+ ### Bug Fixes
690
796
 
691
- ### 🐛 Bug Fixes
797
+ - Check npm auth early in release workflow
798
+ - Correct generator flags to use --dest instead of --portal/--package
799
+
800
+ ## [0.34.0] - 2026-01-18
692
801
 
693
- - *(controllers)* Handle turbo_stream format in CRUD and interactive actions
694
- - *(generators)* Support nullable syntax with type options
695
- - *(generators)* Prevent overwriting existing url_options configuration
696
- - *(generators)* Normalize reference names before comparing namespaces
697
- - *(package)* Include engine migrations in programmatic migration paths
698
- - *(release)* Handle missing version tag in next_version task
802
+ ### Bug Fixes
699
803
 
700
- ### 📚 Documentation
804
+ - Handle turbo_stream format in CRUD and interactive actions
805
+ - Support nullable syntax with type options
806
+ - Prevent overwriting existing url_options configuration
807
+ - Normalize reference names before comparing namespaces
808
+ - Include engine migrations in programmatic migration paths
809
+ - Handle missing version tag in next_version task
810
+
811
+ ### Documentation
701
812
 
702
813
  - Add Claude Code skills and improve generator documentation
703
814
  - Add definition skills and update module documentation
704
815
  - Add comprehensive Claude Code skills for resources
705
816
  - Add package and portal skills
706
817
  - Add interaction skill for business logic actions
707
- - *(skills)* Add new Claude Code skills and enhance existing ones
818
+ - Add new Claude Code skills and enhance existing ones
708
819
 
709
- ### 🎨 Styling
820
+ ### Features
710
821
 
711
- - Standardrb linting
822
+ - Configure default_url_options via RAILS_DEFAULT_URL env var
823
+ - Add pu:skills:sync to install Claude Code skills
824
+ - Execute adhoc blocks in controller context
825
+ - Map ActionPolicy::Unauthorized to 403 Forbidden
826
+ - Add default scope support for resource queries
712
827
 
713
- ### ⚙️ Miscellaneous Tasks
828
+ ### Miscellaneous Tasks
714
829
 
715
830
  - Overhaul documentation structure and test infrastructure
716
831
  - Move brakeman config to config/ and update ignore list
832
+
833
+ ### Styling
834
+
835
+ - Standardrb linting
836
+
717
837
  ## [0.33.0] - 2026-01-12
718
838
 
719
- ### ◀️ Revert
839
+ ### Revert
840
+
841
+ - Remove semantic design token system
720
842
 
721
- - *(ui)* Remove semantic design token system
722
843
  ## [0.32.0] - 2026-01-12
723
844
 
724
- ### 🐛 Bug Fixes
845
+ ### Bug Fixes
846
+
847
+ - Move fontFamily to theme root level
725
848
 
726
- - *(ui)* Move fontFamily to theme root level
727
849
  ## [0.31.0] - 2026-01-12
728
850
 
729
- ### 🚀 Features
851
+ ### Bug Fixes
730
852
 
731
- - *(ui)* Add cross-tab color mode synchronization
732
- - *(release)* Add npm package publishing support
733
- - *(ui)* Add semantic design token system for theming
853
+ - Preserve request format in redirects
854
+ - Reset policy cache before rendering create response for api calls
734
855
 
735
- ### 🐛 Bug Fixes
856
+ ### Features
736
857
 
737
- - *(core)* Preserve request format in redirects
738
- - *(api)* Reset policy cache before rendering create response for api calls
858
+ - Add cross-tab color mode synchronization
859
+ - Add npm package publishing support
860
+ - Add semantic design token system for theming
739
861
 
740
- ### ⚙️ Miscellaneous Tasks
741
-
742
- - *(release)* Build assets during prepare phase
743
- ## [0.28.0] - 2025-11-12
862
+ ### Miscellaneous Tasks
744
863
 
745
- ### 🚀 Features
864
+ - Build assets during prepare phase
746
865
 
747
- - Add sgid support and improve association serialization in API
866
+ ## [0.28.0] - 2025-11-12
748
867
 
749
- ### 🐛 Bug Fixes
868
+ ### Bug Fixes
750
869
 
751
870
  - Make controller_for inheritable and respect custom inflections
752
- ## [0.27.0] - 2025-11-05
753
871
 
754
- ### 🚀 Features
872
+ ### Features
755
873
 
756
- - Add field-level options support for input/display/column definitions
874
+ - Add sgid support and improve association serialization in API
757
875
 
758
- ### 🐛 Bug Fixes
876
+ ## [0.27.0] - 2025-11-05
877
+
878
+ ### Bug Fixes
759
879
 
760
880
  - Reload version constant in release:publish task
761
881
 
762
- ### 📚 Documentation
882
+ ### Documentation
763
883
 
764
884
  - Setup contribution guidelines using Conventional Commits
885
+
886
+ ### Features
887
+
888
+ - Add field-level options support for input/display/column definitions
889
+
765
890
  ## [0.26.9] - 2025-09-25
766
891
 
767
- ### 🚀 Features
892
+ ### Features
768
893
 
769
894
  - Disable csrf protection if authorization header is set
895
+
770
896
  ## [0.26.8] - 2025-08-11
771
897
 
772
- ### 🐛 Bug Fixes
898
+ ### Bug Fixes
899
+
900
+ - Prevent SQLite adapter error when using non-SQLite databases ([#42](https://github.com/radioactive-labs/plutonium-core/issues/42))
901
+ - Fix STI model routing logic in controller ([#43](https://github.com/radioactive-labs/plutonium-core/issues/43))
773
902
 
774
- - Prevent SQLite adapter error when using non-SQLite databases (#42)
775
- - Fix STI model routing logic in controller (#43)
776
903
  ## [0.26.6] - 2025-08-03
777
904
 
778
- ### 🚜 Refactor
905
+ ### Refactoring
906
+
907
+ - Enhance color mode selector and integrate into header layout ([#41](https://github.com/radioactive-labs/plutonium-core/issues/41))
779
908
 
780
- - Enhance color mode selector and integrate into header layout (#41)
781
909
  ## [0.26.2] - 2025-07-22
782
910
 
783
- ### 🐛 Bug Fixes
911
+ ### Bug Fixes
912
+
913
+ - Handle redirect after interaction submission ([#37](https://github.com/radioactive-labs/plutonium-core/issues/37))
914
+ - Enhance flatpickr to attach to modals correctly ([#35](https://github.com/radioactive-labs/plutonium-core/issues/35))
784
915
 
785
- - Handle redirect after interaction submission (#37)
786
- - Enhance flatpickr to attach to modals correctly (#35)
787
916
  ## [0.23.2] - 2025-05-27
788
917
 
789
- ### 🚜 Refactor
918
+ ### Refactoring
919
+
920
+ - Update EasyMDE styles ([#33](https://github.com/radioactive-labs/plutonium-core/issues/33))
790
921
 
791
- - Update EasyMDE styles (#33)
792
922
  ## [0.23.1] - 2025-05-27
793
923
 
794
- ### 🐛 Bug Fixes
924
+ ### Bug Fixes
925
+
926
+ - Hide password visibility checkbox when not needed ([#32](https://github.com/radioactive-labs/plutonium-core/issues/32))
795
927
 
796
- - Hide password visibility checkbox when not needed (#32)
797
928
  ## [0.21.1] - 2025-04-27
798
929
 
799
- ### 🚀 Features
930
+ ### Features
931
+
932
+ - Preserve whitespace in hints to allow some formatting ([#25](https://github.com/radioactive-labs/plutonium-core/issues/25))
800
933
 
801
- - Preserve whitespace in hints to allow some formatting (#25)
934
+ ### Refactoring
802
935
 
803
- ### 🚜 Refactor
936
+ - Fix join condition for `has_one` and `has_many` associations ([#23](https://github.com/radioactive-labs/plutonium-core/issues/23))
804
937
 
805
- - Fix join condition for `has_one` and `has_many` associations (#23)
806
938
  ## [0.21.0] - 2025-04-01
807
939
 
808
- ### 🚀 Features
940
+ ### Features
941
+
942
+ - Add cleaner cards for resources on the dashboard index page ([#22](https://github.com/radioactive-labs/plutonium-core/issues/22))
809
943
 
810
- - Add cleaner cards for resources on the dashboard index page (#22)
811
944
  ## [0.20.4] - 2025-03-15
812
945
 
813
- ### 🐛 Bug Fixes
946
+ ### Bug Fixes
947
+
948
+ - Fix Tailwind CSS v4 upgrade issue for existing projects ([#18](https://github.com/radioactive-labs/plutonium-core/issues/18))
814
949
 
815
- - Fix Tailwind CSS v4 upgrade issue for existing projects (#18)
816
950
  ## [0.19.13] - 2025-03-02
817
951
 
818
- ### 🚀 Features
952
+ ### Features
953
+
954
+ - Add password visibility toggle to sign up and login forms ([#17](https://github.com/radioactive-labs/plutonium-core/issues/17))
819
955
 
820
- - Add password visibility toggle to sign up and login forms (#17)
821
956
  ## [0.6.2] - 2024-02-21
957
+
958
+ <!-- generated by git-cliff -->