plutonium 0.50.0 → 0.51.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 (132) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/skills/plutonium/SKILL.md +85 -102
  3. data/.claude/skills/plutonium-app/SKILL.md +572 -0
  4. data/.claude/skills/plutonium-auth/SKILL.md +163 -300
  5. data/.claude/skills/plutonium-behavior/SKILL.md +838 -0
  6. data/.claude/skills/plutonium-resource/SKILL.md +1176 -0
  7. data/.claude/skills/plutonium-tenancy/SKILL.md +655 -0
  8. data/.claude/skills/plutonium-testing/SKILL.md +6 -5
  9. data/.claude/skills/plutonium-ui/SKILL.md +900 -0
  10. data/CHANGELOG.md +27 -2
  11. data/Rakefile +2 -1
  12. data/app/assets/plutonium.css +1 -11
  13. data/app/assets/plutonium.js +1009 -1214
  14. data/app/assets/plutonium.js.map +3 -3
  15. data/app/assets/plutonium.min.js +52 -51
  16. data/app/assets/plutonium.min.js.map +3 -3
  17. data/docs/.vitepress/config.ts +37 -27
  18. data/docs/getting-started/index.md +22 -29
  19. data/docs/getting-started/installation.md +37 -80
  20. data/docs/getting-started/tutorial/index.md +4 -5
  21. data/docs/guides/adding-resources.md +66 -377
  22. data/docs/guides/authentication.md +94 -463
  23. data/docs/guides/authorization.md +124 -370
  24. data/docs/guides/creating-packages.md +94 -296
  25. data/docs/guides/custom-actions.md +121 -441
  26. data/docs/guides/index.md +22 -42
  27. data/docs/guides/multi-tenancy.md +116 -187
  28. data/docs/guides/nested-resources.md +103 -431
  29. data/docs/guides/search-filtering.md +123 -240
  30. data/docs/guides/testing.md +5 -4
  31. data/docs/guides/theming.md +157 -407
  32. data/docs/guides/troubleshooting.md +5 -3
  33. data/docs/guides/user-invites.md +106 -425
  34. data/docs/guides/user-profile.md +76 -243
  35. data/docs/index.md +1 -1
  36. data/docs/reference/app/generators.md +517 -0
  37. data/docs/reference/app/index.md +158 -0
  38. data/docs/reference/app/packages.md +146 -0
  39. data/docs/reference/app/portals.md +377 -0
  40. data/docs/reference/auth/accounts.md +230 -0
  41. data/docs/reference/auth/index.md +88 -0
  42. data/docs/reference/auth/profile.md +185 -0
  43. data/docs/reference/behavior/controllers.md +395 -0
  44. data/docs/reference/behavior/index.md +22 -0
  45. data/docs/reference/behavior/interactions.md +341 -0
  46. data/docs/reference/behavior/policies.md +417 -0
  47. data/docs/reference/index.md +56 -49
  48. data/docs/reference/resource/actions.md +423 -0
  49. data/docs/reference/resource/definition.md +508 -0
  50. data/docs/reference/resource/index.md +50 -0
  51. data/docs/reference/resource/model.md +348 -0
  52. data/docs/reference/resource/query.md +305 -0
  53. data/docs/reference/tenancy/entity-scoping.md +361 -0
  54. data/docs/reference/tenancy/index.md +36 -0
  55. data/docs/reference/tenancy/invites.md +393 -0
  56. data/docs/reference/tenancy/nested-resources.md +267 -0
  57. data/docs/reference/testing/index.md +287 -0
  58. data/docs/reference/ui/assets.md +400 -0
  59. data/docs/reference/ui/components.md +165 -0
  60. data/docs/reference/ui/displays.md +104 -0
  61. data/docs/reference/ui/forms.md +284 -0
  62. data/docs/reference/ui/index.md +30 -0
  63. data/docs/reference/ui/layouts.md +106 -0
  64. data/docs/reference/ui/pages.md +189 -0
  65. data/docs/reference/ui/tables.md +117 -0
  66. data/docs/superpowers/specs/2026-05-09-typeahead-endpoint-design.md +203 -0
  67. data/docs/superpowers/specs/2026-05-12-skill-compaction-design.md +99 -0
  68. data/docs/superpowers/specs/2026-05-13-docs-restructure-design.md +186 -0
  69. data/gemfiles/rails_7.gemfile.lock +1 -1
  70. data/gemfiles/rails_8.0.gemfile.lock +1 -1
  71. data/gemfiles/rails_8.1.gemfile.lock +1 -1
  72. data/lib/generators/pu/core/update/update_generator.rb +0 -20
  73. data/lib/generators/pu/invites/install_generator.rb +1 -0
  74. data/lib/plutonium/definition/base.rb +1 -1
  75. data/lib/plutonium/definition/{views.rb → index_views.rb} +21 -20
  76. data/lib/plutonium/helpers/turbo_helper.rb +11 -0
  77. data/lib/plutonium/helpers/turbo_stream_actions_helper.rb +14 -0
  78. data/lib/plutonium/resource/controller.rb +1 -0
  79. data/lib/plutonium/resource/controllers/crud_actions.rb +19 -1
  80. data/lib/plutonium/resource/controllers/typeahead.rb +180 -0
  81. data/lib/plutonium/resource/policy.rb +7 -0
  82. data/lib/plutonium/routing/mapper_extensions.rb +15 -0
  83. data/lib/plutonium/ui/component/methods.rb +4 -0
  84. data/lib/plutonium/ui/form/base.rb +6 -2
  85. data/lib/plutonium/ui/form/components/json.rb +58 -0
  86. data/lib/plutonium/ui/form/components/resource_select.rb +62 -8
  87. data/lib/plutonium/ui/form/components/secure_association.rb +98 -22
  88. data/lib/plutonium/ui/form/concerns/typeahead_attributes.rb +83 -0
  89. data/lib/plutonium/ui/form/resource.rb +0 -4
  90. data/lib/plutonium/ui/grid/resource.rb +1 -1
  91. data/lib/plutonium/ui/layout/base.rb +1 -0
  92. data/lib/plutonium/ui/page/base.rb +0 -7
  93. data/lib/plutonium/ui/page/index.rb +4 -4
  94. data/lib/plutonium/ui/table/resource.rb +1 -1
  95. data/lib/plutonium/version.rb +1 -1
  96. data/lib/plutonium.rb +8 -0
  97. data/lib/tasks/release.rake +15 -1
  98. data/package.json +10 -10
  99. data/src/css/slim_select.css +4 -0
  100. data/src/js/controllers/slim_select_controller.js +61 -0
  101. data/src/js/turbo/turbo_actions.js +33 -0
  102. data/yarn.lock +553 -543
  103. metadata +44 -33
  104. data/.claude/skills/plutonium-assets/SKILL.md +0 -512
  105. data/.claude/skills/plutonium-controller/SKILL.md +0 -396
  106. data/.claude/skills/plutonium-create-resource/SKILL.md +0 -303
  107. data/.claude/skills/plutonium-definition/SKILL.md +0 -1223
  108. data/.claude/skills/plutonium-entity-scoping/SKILL.md +0 -317
  109. data/.claude/skills/plutonium-forms/SKILL.md +0 -465
  110. data/.claude/skills/plutonium-installation/SKILL.md +0 -331
  111. data/.claude/skills/plutonium-interaction/SKILL.md +0 -413
  112. data/.claude/skills/plutonium-invites/SKILL.md +0 -408
  113. data/.claude/skills/plutonium-model/SKILL.md +0 -440
  114. data/.claude/skills/plutonium-nested-resources/SKILL.md +0 -360
  115. data/.claude/skills/plutonium-package/SKILL.md +0 -198
  116. data/.claude/skills/plutonium-policy/SKILL.md +0 -456
  117. data/.claude/skills/plutonium-portal/SKILL.md +0 -410
  118. data/.claude/skills/plutonium-views/SKILL.md +0 -651
  119. data/docs/reference/assets/index.md +0 -496
  120. data/docs/reference/controller/index.md +0 -412
  121. data/docs/reference/definition/actions.md +0 -462
  122. data/docs/reference/definition/fields.md +0 -383
  123. data/docs/reference/definition/index.md +0 -326
  124. data/docs/reference/definition/query.md +0 -351
  125. data/docs/reference/generators/index.md +0 -648
  126. data/docs/reference/interaction/index.md +0 -449
  127. data/docs/reference/model/features.md +0 -248
  128. data/docs/reference/model/index.md +0 -218
  129. data/docs/reference/policy/index.md +0 -456
  130. data/docs/reference/portal/index.md +0 -379
  131. data/docs/reference/views/forms.md +0 -411
  132. data/docs/reference/views/index.md +0 -544
@@ -1,331 +0,0 @@
1
- ---
2
- name: plutonium-installation
3
- description: Use BEFORE installing Plutonium in a Rails app, running pu:core:install, or configuring initial Plutonium setup. Covers generators, gemfile, and initial config.
4
- ---
5
-
6
- # Plutonium Installation
7
-
8
- ## 🚨 Critical (read first)
9
- - **Use the generators.** `pu:core:install`, `pu:rodauth:install`, `pu:pkg:portal`, `pu:res:scaffold`, `pu:res:conn` — never hand-write base controllers, policies, or layouts.
10
- - **Use `base.rb`, not `plutonium.rb`, for existing apps.** The `plutonium.rb` template reruns the full bootstrap (dotenv, annotate, solid_*, assets) and clobbers git history. For any pre-existing app, use `base.rb`.
11
- - **Pass `--dest`, `--force`, `--auth`, `--skip-bundle` for unattended runs** so generators don't block on prompts. See `plutonium` index for the full flag matrix.
12
- - **Related skills:** `plutonium` (architecture overview), `plutonium-auth` (Rodauth setup), `plutonium-portal` (portal config), `plutonium-create-resource` (scaffolding resources).
13
-
14
- ## Quick checklist
15
-
16
- Fresh install in a new Rails app:
17
-
18
- 1. Generate the Rails app with `rails new myapp -a propshaft -j esbuild -c tailwind -m https://radioactive-labs.github.io/plutonium-core/templates/plutonium.rb` (greenfield) OR `bin/rails app:template LOCATION=.../base.rb` (existing app).
19
- 2. Run `bundle install` if you added the gem manually.
20
- 3. Run `rails generate pu:core:install` to create base controllers, policies, definitions, and config.
21
- 4. Run `rails generate pu:rodauth:install` + `rails generate pu:rodauth:account user` for auth.
22
- 5. Run `rails generate pu:pkg:portal admin --auth=user` to create a portal.
23
- 6. Run `rails generate pu:res:scaffold Post title:string 'content:text?' --dest=main_app` for a first resource.
24
- 7. Run `rails db:migrate`.
25
- 8. Run `rails generate pu:res:conn Post --dest=admin_portal` to connect the resource.
26
- 9. Mount the portal in `config/routes.rb`: `mount AdminPortal::Engine, at: "/admin"`.
27
- 10. Start the server and visit `/admin`.
28
-
29
- ## New Rails App (Recommended)
30
-
31
- Use the Rails template for a fully configured setup:
32
-
33
- ```bash
34
- rails new myapp -a propshaft -j esbuild -c tailwind \
35
- -m https://radioactive-labs.github.io/plutonium-core/templates/plutonium.rb
36
- ```
37
-
38
- This sets up Rails with Propshaft, esbuild, TailwindCSS, and Plutonium in one command.
39
-
40
- ## Existing Rails App
41
-
42
- > **⚠️ Use `base.rb`, not `plutonium.rb`.** The `plutonium.rb` template is for `rails new` only — it re-runs the full app bootstrap (dotenv, annotate, solid_*, assets) and creates generic "initial commit" commits that clobber history. For any pre-existing app, always use `base.rb`.
43
-
44
- ### Option 1: Rails Template
45
-
46
- ```bash
47
- bin/rails app:template \
48
- LOCATION=https://radioactive-labs.github.io/plutonium-core/templates/base.rb
49
- ```
50
-
51
- ### Option 2: Manual Installation
52
-
53
- ```bash
54
- # Add to Gemfile
55
- gem "plutonium"
56
-
57
- # Install
58
- bundle install
59
- rails generate pu:core:install
60
- ```
61
-
62
- ## What Gets Generated
63
-
64
- After `pu:core:install`:
65
-
66
- ```
67
- app/
68
- ├── controllers/
69
- │ ├── plutonium_controller.rb # Base controller
70
- │ └── resource_controller.rb # Resource CRUD base
71
- ├── definitions/
72
- │ └── resource_definition.rb # Definition base class
73
- ├── interactions/
74
- │ └── resource_interaction.rb # Interaction base class
75
- ├── models/
76
- │ └── resource_record.rb # Abstract model base
77
- ├── policies/
78
- │ └── resource_policy.rb # Policy base class
79
- └── views/
80
- └── layouts/
81
- └── resource.html.erb # Base layout
82
-
83
- config/
84
- ├── initializers/
85
- │ └── plutonium.rb # Configuration
86
- └── packages.rb # Package loader
87
-
88
- packages/
89
- └── .keep
90
- ```
91
-
92
- ## Base Classes
93
-
94
- ### ResourceController
95
-
96
- ```ruby
97
- class ResourceController < PlutoniumController
98
- include Plutonium::Resource::Controller
99
- # Provides: index, show, new, create, edit, update, destroy
100
- # Plus: interactive actions, authorization, query handling
101
- end
102
- ```
103
-
104
- ### ResourcePolicy
105
-
106
- ```ruby
107
- class ResourcePolicy < Plutonium::Resource::Policy
108
- def create?
109
- true # Override with your logic
110
- end
111
-
112
- def read?
113
- true
114
- end
115
- end
116
- ```
117
-
118
- ### ResourceDefinition
119
-
120
- ```ruby
121
- class ResourceDefinition < Plutonium::Resource::Definition
122
- # Add app-wide definition defaults here
123
- end
124
- ```
125
-
126
- ### ResourceRecord
127
-
128
- ```ruby
129
- class ResourceRecord < ApplicationRecord
130
- self.abstract_class = true
131
- # Models inherit from this for Plutonium features
132
- end
133
- ```
134
-
135
- ## Authentication Setup
136
-
137
- ### Install Rodauth
138
-
139
- ```bash
140
- rails generate pu:rodauth:install
141
- ```
142
-
143
- ### Create Account Types
144
-
145
- ```bash
146
- # Basic user account
147
- rails generate pu:rodauth:account user
148
-
149
- # Admin with 2FA, lockout, audit logging
150
- rails generate pu:rodauth:admin admin
151
-
152
- # SaaS user with entity/organization (multi-tenant)
153
- rails generate pu:saas:setup --user Customer --entity Organization
154
- ```
155
-
156
- ### Account Options
157
-
158
- | Option | Description |
159
- |--------|-------------|
160
- | `--defaults` | Enable common features (login, logout, remember, reset_password) |
161
- | `--kitchen_sink` | Enable all available features |
162
- | `--no-allow-signup` | Disable public signup |
163
-
164
- ### Connect Auth to Controllers
165
-
166
- ```ruby
167
- # app/controllers/resource_controller.rb
168
- class ResourceController < PlutoniumController
169
- include Plutonium::Resource::Controller
170
- include Plutonium::Auth::Rodauth(:user) # Add this
171
- end
172
- ```
173
-
174
- ## Creating Your First Resource
175
-
176
- ```bash
177
- rails generate pu:res:scaffold Post user:belongs_to title:string content:text
178
- rails db:migrate
179
- ```
180
-
181
- ## Creating a Portal
182
-
183
- ```bash
184
- rails generate pu:pkg:portal admin
185
- ```
186
-
187
- Select authentication when prompted:
188
- - **Rodauth account** - Use existing auth
189
- - **Public access** - No authentication
190
- - **Bring your own** - Custom implementation
191
-
192
- ### Mount the Portal
193
-
194
- ```ruby
195
- # config/routes.rb
196
- Rails.application.routes.draw do
197
- mount AdminPortal::Engine, at: "/admin"
198
- end
199
- ```
200
-
201
- ### Connect Resources to Portal
202
-
203
- ```bash
204
- rails generate pu:res:conn Post --dest=admin_portal
205
- ```
206
-
207
- ## Configuration
208
-
209
- ```ruby
210
- # config/initializers/plutonium.rb
211
- Plutonium.configure do |config|
212
- config.load_defaults 1.0
213
-
214
- # Page chrome. Default :modern (topbar + icon rail). Set :classic
215
- # only when upgrading and you want to keep the legacy header + sidebar.
216
- # config.shell = :classic
217
-
218
- # Custom assets (optional)
219
- # config.assets.stylesheet = "custom_stylesheet"
220
- # config.assets.script = "custom_script"
221
- # config.assets.logo = "custom_logo.png"
222
- end
223
- ```
224
-
225
- ## Package System
226
-
227
- Packages are loaded from `config/packages.rb`:
228
-
229
- ```ruby
230
- Dir.glob(File.expand_path("../packages/**/lib/engine.rb", __dir__)) { |package| load package }
231
- ```
232
-
233
- Create packages in `packages/` directory:
234
- - **Feature packages** - Business logic (`rails g pu:pkg:package blogging`)
235
- - **Portal packages** - Web interfaces (`rails g pu:pkg:portal admin`)
236
-
237
- ## Post-Installation Checklist
238
-
239
- 1. **Install core**
240
- ```bash
241
- rails generate pu:core:install
242
- ```
243
-
244
- 2. **Setup authentication** (if needed)
245
- ```bash
246
- rails generate pu:rodauth:install
247
- rails generate pu:rodauth:account user
248
- ```
249
-
250
- 3. **Create a portal**
251
- ```bash
252
- rails generate pu:pkg:portal admin
253
- ```
254
-
255
- 4. **Create resources**
256
- ```bash
257
- rails generate pu:res:scaffold Post title:string content:text
258
- ```
259
-
260
- 5. **Connect resources to portal**
261
- ```bash
262
- rails generate pu:res:conn Post --dest=admin_portal
263
- ```
264
-
265
- 6. **Run migrations**
266
- ```bash
267
- rails db:migrate
268
- ```
269
-
270
- 7. **Mount portal** (add to `config/routes.rb`)
271
- ```ruby
272
- mount AdminPortal::Engine, at: "/admin"
273
- ```
274
-
275
- 8. **Start server**
276
- ```bash
277
- rails server
278
- ```
279
-
280
- ## Converting Existing Models
281
-
282
- For models that already exist in your app:
283
-
284
- 1. Include the module:
285
- ```ruby
286
- class Post < ApplicationRecord
287
- include Plutonium::Resource::Record
288
- end
289
- ```
290
-
291
- 2. Generate supporting files (skips model/migration):
292
- ```bash
293
- rails g pu:res:scaffold Post
294
- ```
295
-
296
- 3. Connect to portal:
297
- ```bash
298
- rails g pu:res:conn Post --dest=admin_portal
299
- ```
300
-
301
- ## Generator Reference
302
-
303
- | Generator | Purpose |
304
- |-----------|---------|
305
- | `pu:core:install` | Initial Plutonium setup |
306
- | `pu:rodauth:install` | Setup Rodauth authentication |
307
- | `pu:rodauth:account NAME` | Create user account type |
308
- | `pu:rodauth:admin NAME` | Create admin account with 2FA |
309
- | `pu:saas:setup` | Create SaaS user + entity + membership |
310
- | `pu:saas:user NAME` | Create SaaS user account |
311
- | `pu:saas:entity NAME` | Create entity model |
312
- | `pu:saas:membership` | Create membership join table |
313
- | `pu:pkg:package NAME` | Create feature package |
314
- | `pu:pkg:portal NAME` | Create portal package |
315
- | `pu:res:scaffold NAME` | Create resource (model, policy, definition, controller) |
316
- | `pu:res:conn NAME` | Connect resource to portal |
317
- | `pu:eject:layout` | Eject layout files for customization |
318
- | `pu:eject:shell` | Eject the topbar/sidebar partials so you can customize chrome per-portal |
319
- | `pu:core:update` | Update the plutonium gem + npm package |
320
- | `pu:skills:sync` | Sync Claude Code skills to project |
321
-
322
- ## Related Skills
323
-
324
- - `plutonium` - Resource architecture overview
325
- - `plutonium-auth` - Authentication setup and configuration
326
- - `plutonium-package` - Feature and portal packages
327
- - `plutonium-portal` - Portal configuration
328
- - `plutonium-views` - Custom pages, layouts, and Phlex components
329
- - `plutonium-assets` - TailwindCSS and custom styling
330
- - `plutonium-create-resource` - Resource scaffold options
331
- - `plutonium-portal` - Portal connection