plutonium 0.50.0 → 0.52.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 (201) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/skills/plutonium/SKILL.md +85 -102
  3. data/.claude/skills/plutonium-app/SKILL.md +574 -0
  4. data/.claude/skills/plutonium-auth/SKILL.md +167 -302
  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 +674 -0
  8. data/.claude/skills/plutonium-testing/SKILL.md +9 -6
  9. data/.claude/skills/plutonium-ui/SKILL.md +900 -0
  10. data/CHANGELOG.md +44 -2
  11. data/Rakefile +2 -1
  12. data/app/assets/plutonium.css +1 -11
  13. data/app/assets/plutonium.js +1010 -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 +38 -29
  18. data/docs/.vitepress/theme/components/HomeAudienceSplit.vue +53 -0
  19. data/docs/.vitepress/theme/components/HomeCta.vue +108 -0
  20. data/docs/.vitepress/theme/components/HomeHero.vue +70 -0
  21. data/docs/.vitepress/theme/components/HomeInTheBox.vue +74 -0
  22. data/docs/.vitepress/theme/components/HomePillars.vue +42 -0
  23. data/docs/.vitepress/theme/components/HomeStopWriting.vue +49 -0
  24. data/docs/.vitepress/theme/components/HomeWalkthrough.vue +111 -0
  25. data/docs/.vitepress/theme/components/SectionLanding.vue +115 -0
  26. data/docs/.vitepress/theme/custom.css +144 -0
  27. data/docs/.vitepress/theme/index.ts +58 -1
  28. data/docs/getting-started/index.md +33 -57
  29. data/docs/getting-started/installation.md +37 -80
  30. data/docs/getting-started/tutorial/02-first-resource.md +17 -8
  31. data/docs/getting-started/tutorial/03-authentication.md +31 -23
  32. data/docs/getting-started/tutorial/05-custom-actions.md +9 -4
  33. data/docs/getting-started/tutorial/06-nested-resources.md +7 -1
  34. data/docs/getting-started/tutorial/07-author-portal.md +8 -0
  35. data/docs/getting-started/tutorial/08-customizing-ui.md +4 -0
  36. data/docs/getting-started/tutorial/index.md +4 -5
  37. data/docs/guides/adding-resources.md +66 -377
  38. data/docs/guides/authentication.md +98 -462
  39. data/docs/guides/authorization.md +124 -370
  40. data/docs/guides/creating-packages.md +93 -298
  41. data/docs/guides/custom-actions.md +126 -441
  42. data/docs/guides/customizing-ui.md +258 -0
  43. data/docs/guides/index.md +49 -52
  44. data/docs/guides/multi-tenancy.md +123 -186
  45. data/docs/guides/nested-resources.md +137 -396
  46. data/docs/guides/search-filtering.md +127 -238
  47. data/docs/guides/testing.md +10 -5
  48. data/docs/guides/theming.md +168 -405
  49. data/docs/guides/troubleshooting.md +5 -3
  50. data/docs/guides/user-invites.md +112 -425
  51. data/docs/guides/user-profile.md +82 -241
  52. data/docs/index.md +10 -219
  53. data/docs/public/asciinema/home-scaffold.cast +305 -0
  54. data/docs/public/images/guides/custom-actions-bulk.png +0 -0
  55. data/docs/public/images/guides/multi-tenancy-dashboard.png +0 -0
  56. data/docs/public/images/guides/multi-tenancy-welcome.png +0 -0
  57. data/docs/public/images/guides/nested-inputs.png +0 -0
  58. data/docs/public/images/guides/nested-resources-tab.png +0 -0
  59. data/docs/public/images/guides/search-filtering-index.png +0 -0
  60. data/docs/public/images/guides/search-filtering-panel.png +0 -0
  61. data/docs/public/images/guides/theming-after.png +0 -0
  62. data/docs/public/images/guides/theming-before.png +0 -0
  63. data/docs/public/images/guides/user-invites-landing.png +0 -0
  64. data/docs/public/images/guides/user-profile-edit.png +0 -0
  65. data/docs/public/images/guides/user-profile-show.png +0 -0
  66. data/docs/public/images/home-index.png +0 -0
  67. data/docs/public/images/home-new.png +0 -0
  68. data/docs/public/images/home-show.png +0 -0
  69. data/docs/public/images/tutorial/02-empty-index.png +0 -0
  70. data/docs/public/images/tutorial/02-index-with-posts.png +0 -0
  71. data/docs/public/images/tutorial/02-new-form-modal.png +0 -0
  72. data/docs/public/images/tutorial/02-new-form.png +0 -0
  73. data/docs/public/images/tutorial/03-create-account.png +0 -0
  74. data/docs/public/images/tutorial/03-login.png +0 -0
  75. data/docs/public/images/tutorial/04-admin-index.png +0 -0
  76. data/docs/public/images/tutorial/05-actions-menu.png +0 -0
  77. data/docs/public/images/tutorial/05-row-actions.png +0 -0
  78. data/docs/public/images/tutorial/06-comments-tab.png +0 -0
  79. data/docs/public/images/tutorial/06-post-with-comments.png +0 -0
  80. data/docs/public/images/tutorial/07-author-dashboard.png +0 -0
  81. data/docs/public/images/tutorial/07-author-portal.png +0 -0
  82. data/docs/public/images/tutorial/08-customized-index.png +0 -0
  83. data/docs/reference/app/generators.md +517 -0
  84. data/docs/reference/app/index.md +158 -0
  85. data/docs/reference/app/packages.md +146 -0
  86. data/docs/reference/app/portals.md +377 -0
  87. data/docs/reference/auth/accounts.md +229 -0
  88. data/docs/reference/auth/index.md +88 -0
  89. data/docs/reference/auth/profile.md +185 -0
  90. data/docs/reference/behavior/controllers.md +395 -0
  91. data/docs/reference/behavior/index.md +22 -0
  92. data/docs/reference/behavior/interactions.md +341 -0
  93. data/docs/reference/behavior/policies.md +417 -0
  94. data/docs/reference/index.md +67 -48
  95. data/docs/reference/resource/actions.md +423 -0
  96. data/docs/reference/resource/definition.md +508 -0
  97. data/docs/reference/resource/index.md +50 -0
  98. data/docs/reference/resource/model.md +348 -0
  99. data/docs/reference/resource/query.md +305 -0
  100. data/docs/reference/tenancy/entity-scoping.md +368 -0
  101. data/docs/reference/tenancy/index.md +36 -0
  102. data/docs/reference/tenancy/invites.md +400 -0
  103. data/docs/reference/tenancy/nested-resources.md +267 -0
  104. data/docs/reference/testing/index.md +287 -0
  105. data/docs/reference/ui/assets.md +400 -0
  106. data/docs/reference/ui/components.md +165 -0
  107. data/docs/reference/ui/displays.md +104 -0
  108. data/docs/reference/ui/forms.md +284 -0
  109. data/docs/reference/ui/index.md +30 -0
  110. data/docs/reference/ui/layouts.md +106 -0
  111. data/docs/reference/ui/pages.md +189 -0
  112. data/docs/reference/ui/tables.md +121 -0
  113. data/docs/superpowers/plans/2026-05-15-public-pages-overhaul.md +1648 -0
  114. data/docs/superpowers/plans/2026-05-15-public-pages-overhaul.md.tasks.json +109 -0
  115. data/docs/superpowers/specs/2026-05-09-typeahead-endpoint-design.md +203 -0
  116. data/docs/superpowers/specs/2026-05-12-skill-compaction-design.md +99 -0
  117. data/docs/superpowers/specs/2026-05-13-docs-restructure-design.md +186 -0
  118. data/docs/superpowers/specs/2026-05-15-public-pages-overhaul-design.md +263 -0
  119. data/gemfiles/rails_7.gemfile.lock +1 -1
  120. data/gemfiles/rails_8.0.gemfile.lock +1 -1
  121. data/gemfiles/rails_8.1.gemfile.lock +1 -1
  122. data/lib/generators/pu/core/assets/assets_generator.rb +10 -0
  123. data/lib/generators/pu/core/update/update_generator.rb +0 -20
  124. data/lib/generators/pu/invites/install_generator.rb +45 -0
  125. data/lib/generators/pu/invites/templates/packages/invites/app/controllers/invites/user_invitations_controller.rb.tt +1 -0
  126. data/lib/generators/pu/profile/conn_generator.rb +2 -2
  127. data/lib/generators/pu/res/conn/conn_generator.rb +33 -6
  128. data/lib/generators/pu/res/model/templates/model.rb.tt +4 -0
  129. data/lib/generators/pu/rodauth/account_generator.rb +2 -1
  130. data/lib/generators/pu/rodauth/admin_generator.rb +0 -2
  131. data/lib/generators/pu/rodauth/migration_generator.rb +0 -2
  132. data/lib/generators/pu/rodauth/views_generator.rb +0 -2
  133. data/lib/generators/pu/saas/membership/USAGE +4 -1
  134. data/lib/generators/pu/saas/setup_generator.rb +16 -4
  135. data/lib/generators/pu/saas/welcome/templates/app/controllers/welcome_controller.rb.tt +1 -1
  136. data/lib/plutonium/definition/base.rb +1 -1
  137. data/lib/plutonium/definition/{views.rb → index_views.rb} +21 -20
  138. data/lib/plutonium/helpers/turbo_helper.rb +30 -0
  139. data/lib/plutonium/helpers/turbo_stream_actions_helper.rb +14 -0
  140. data/lib/plutonium/resource/controller.rb +1 -0
  141. data/lib/plutonium/resource/controllers/crud_actions.rb +23 -5
  142. data/lib/plutonium/resource/controllers/interactive_actions.rb +3 -3
  143. data/lib/plutonium/resource/controllers/typeahead.rb +180 -0
  144. data/lib/plutonium/resource/policy.rb +7 -0
  145. data/lib/plutonium/routing/mapper_extensions.rb +15 -0
  146. data/lib/plutonium/ui/component/methods.rb +5 -0
  147. data/lib/plutonium/ui/form/base.rb +23 -3
  148. data/lib/plutonium/ui/form/components/json.rb +58 -0
  149. data/lib/plutonium/ui/form/components/resource_select.rb +62 -8
  150. data/lib/plutonium/ui/form/components/secure_association.rb +103 -22
  151. data/lib/plutonium/ui/form/concerns/typeahead_attributes.rb +83 -0
  152. data/lib/plutonium/ui/form/interaction.rb +1 -1
  153. data/lib/plutonium/ui/form/resource.rb +0 -4
  154. data/lib/plutonium/ui/form/theme.rb +1 -1
  155. data/lib/plutonium/ui/grid/resource.rb +1 -1
  156. data/lib/plutonium/ui/layout/base.rb +1 -0
  157. data/lib/plutonium/ui/page/base.rb +0 -7
  158. data/lib/plutonium/ui/page/edit.rb +1 -1
  159. data/lib/plutonium/ui/page/index.rb +4 -4
  160. data/lib/plutonium/ui/page/new.rb +1 -1
  161. data/lib/plutonium/ui/table/components/filter_form.rb +12 -4
  162. data/lib/plutonium/ui/table/resource.rb +1 -1
  163. data/lib/plutonium/version.rb +1 -1
  164. data/lib/plutonium.rb +8 -0
  165. data/lib/tasks/release.rake +15 -1
  166. data/package.json +13 -10
  167. data/src/css/slim_select.css +4 -0
  168. data/src/js/controllers/form_controller.js +5 -4
  169. data/src/js/controllers/slim_select_controller.js +61 -0
  170. data/src/js/turbo/turbo_actions.js +33 -0
  171. data/yarn.lock +661 -544
  172. metadata +86 -33
  173. data/.claude/skills/plutonium-assets/SKILL.md +0 -512
  174. data/.claude/skills/plutonium-controller/SKILL.md +0 -396
  175. data/.claude/skills/plutonium-create-resource/SKILL.md +0 -303
  176. data/.claude/skills/plutonium-definition/SKILL.md +0 -1223
  177. data/.claude/skills/plutonium-entity-scoping/SKILL.md +0 -317
  178. data/.claude/skills/plutonium-forms/SKILL.md +0 -465
  179. data/.claude/skills/plutonium-installation/SKILL.md +0 -331
  180. data/.claude/skills/plutonium-interaction/SKILL.md +0 -413
  181. data/.claude/skills/plutonium-invites/SKILL.md +0 -408
  182. data/.claude/skills/plutonium-model/SKILL.md +0 -440
  183. data/.claude/skills/plutonium-nested-resources/SKILL.md +0 -360
  184. data/.claude/skills/plutonium-package/SKILL.md +0 -198
  185. data/.claude/skills/plutonium-policy/SKILL.md +0 -456
  186. data/.claude/skills/plutonium-portal/SKILL.md +0 -410
  187. data/.claude/skills/plutonium-views/SKILL.md +0 -651
  188. data/docs/reference/assets/index.md +0 -496
  189. data/docs/reference/controller/index.md +0 -412
  190. data/docs/reference/definition/actions.md +0 -462
  191. data/docs/reference/definition/fields.md +0 -383
  192. data/docs/reference/definition/index.md +0 -326
  193. data/docs/reference/definition/query.md +0 -351
  194. data/docs/reference/generators/index.md +0 -648
  195. data/docs/reference/interaction/index.md +0 -449
  196. data/docs/reference/model/features.md +0 -248
  197. data/docs/reference/model/index.md +0 -218
  198. data/docs/reference/policy/index.md +0 -456
  199. data/docs/reference/portal/index.md +0 -379
  200. data/docs/reference/views/forms.md +0 -411
  201. data/docs/reference/views/index.md +0 -544
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8f93a96f45defbcd651a0c13ce62ca190dfb8fb83b7d0bca50d450f28c8ee6c0
4
- data.tar.gz: ac996ab0486ae36f7cfda6f6a25d625c71560f4841e828c443f1cd906cd1af2f
3
+ metadata.gz: b3015426fb7d1a742cd436928a9a8e2c24597f391d68657b8f00ed31058cf59c
4
+ data.tar.gz: 20bf4101ff956923bf01b28ad890bc5000760a5181ab65ac07f83f2bb739b0d7
5
5
  SHA512:
6
- metadata.gz: 8f06360e34c7b43c797877a2555bbae11222f870e2bf82e4ec0a1ce8c0a4baf0a078cff1b65baf6159f8095345068cd1216fdcdf4d152354d46069a4d0480ad6
7
- data.tar.gz: 663af09cc688359ef9fb41c3b4a76aa3061c9dc68b701586f03e6b09bce7b2d853b0afed60202d3b5ffa497e7b6c413b7e3c86207ac6bed9e26e1c4969400e76
6
+ metadata.gz: 14b0e28c435b199564a46eae98b84c4273c2783344a3257dcb9adc872002c8e761e058f7f76fbe909b3419facd0e90e1d9ee1a3c8fa5f128189eb1df6e365761
7
+ data.tar.gz: 19e6dfaf2c2526fcb4cfadba2eb2e09fa294141abb2175f52348f45d050d975aa92b59541d8aa5eb4c14b2bd973f60b45abea9498ea20bc7340529d8e2f96370
@@ -1,137 +1,127 @@
1
1
  ---
2
2
  name: plutonium
3
- description: Use BEFORE starting any Plutonium work — new app, new feature, or first edit in an unfamiliar area. Routes you to the right skills and bootstraps greenfield work.
3
+ description: Use BEFORE starting any Plutonium work — new app, new feature, or first edit in an unfamiliar area. Routes you to the right skill and bootstraps greenfield work.
4
4
  ---
5
5
 
6
6
  # Plutonium — Router & Bootstrapper
7
7
 
8
- This skill is the entry point for all Plutonium work. It does three things:
8
+ Entry point for all Plutonium work. Does three things:
9
9
 
10
10
  1. Surfaces the **most expensive mistakes** up front (🚨 below).
11
- 2. Tells you which foundational skills to load for **greenfield** work.
12
- 3. Maps specific "about to…" actions to the right **targeted skill** (router table).
13
-
14
- Read this first. Then follow the pointers.
11
+ 2. Tells you which skills to load for **greenfield** work.
12
+ 3. Maps specific "about to…" actions to the right targeted skill (router table).
15
13
 
16
14
  ## 🚨 Critical (read first)
17
15
 
18
- - **Plutonium is generator-driven.** Almost every file you'd hand-write has a `pu:*` generator. Use it. Hand-written files drift from conventions and break future generator runs.
16
+ - **Plutonium is generator-driven.** Almost every file you'd hand-write has a `pu:*` generator. Hand-written files drift from conventions and break future generator runs.
19
17
  - **For greenfield** (new app, substantial new feature, first resource in a new domain) — load the **bootstrap bundle** below before writing code.
20
- - **For targeted edits** — use the **router table** to jump straight to the right skill.
21
- - **For anything touching tenant scoping** — load `plutonium-entity-scoping`. Don't reach for `where(organization: ...)` in a policy; fix the model instead.
22
- - **Unattended execution:** always pass `--dest=`, `--force` (when re-running meta-generators), `--auth=`, `--skip-bundle`, and `--quiet` so generators don't block on prompts. See [Unattended execution](#unattended-execution).
18
+ - **For targeted edits** — use the **router table** to jump to the right skill.
19
+ - **For anything touching tenant scoping** — load `plutonium-tenancy`. Don't reach for `where(organization: ...)` in a policy; fix the model instead.
20
+ - **Unattended execution:** always pass `--dest=`, `--force` (when re-running meta-generators), `--auth=`, `--skip-bundle`, `--quiet` so generators don't block on prompts. See [Unattended execution](#unattended-execution).
21
+
22
+ ## The 8 skills
23
+
24
+ | Skill | Covers |
25
+ |---|---|
26
+ | **[[plutonium-app]]** | Installation, packages (feature + portal), portal engines, mounting, `register_resource` (including singular and custom routes), `pu:res:conn` |
27
+ | **[[plutonium-resource]]** | The resource itself — `pu:res:scaffold`, field types, model layer (`Plutonium::Resource::Record`, `has_cents`, SGID, routing), definition layer (fields/inputs/displays/columns, search/filters/scopes/sorting, custom actions, bulk actions, index views, page customization) |
28
+ | **[[plutonium-behavior]]** | Controllers (hooks, key methods, presentation), policies (action methods, `permitted_attributes_for_*`, `permitted_associations`), interactions (structure, outcomes, chaining, URL generation) |
29
+ | **[[plutonium-ui]]** | Page classes, forms, displays, tables, custom Phlex components, layouts, modals & tabs, Tailwind config, Stimulus, design tokens, `.pu-*` classes, Phlexi themes |
30
+ | **[[plutonium-auth]]** | Rodauth install, account types (basic / admin / SaaS), profile resource, security section |
31
+ | **[[plutonium-tenancy]]** | Entity scoping (`associated_with`, `default_relation_scope`, three model shapes), nested resources, invites |
32
+ | **[[plutonium-testing]]** | `pu:test:install`, `pu:test:scaffold`, `ResourceCrud`/`ResourcePolicy`/`ResourceDefinition`/`ResourceModel`/`NestedResource`/`PortalAccess`/`ResourceInteraction`, `AuthHelpers` |
23
33
 
24
34
  ## Greenfield bootstrap bundle
25
35
 
26
36
  Triggers: installing Plutonium, building a new app, adding the first resource in a new domain, setting up a new portal or package, "build me a Y app", "set up X from scratch".
27
37
 
28
- **Load ALL of these before writing code:**
38
+ **Load these before writing code:**
29
39
 
30
- 1. **`plutonium-installation`** — `pu:core:install`, Rails template vs existing app, base classes.
31
- 2. **`plutonium-create-resource`** — `pu:res:scaffold` syntax, field types, destinations.
32
- 3. **`plutonium-model`** — model structure, associations, `has_cents`, labeling, routing.
33
- 4. **`plutonium-policy`** — authorization actions, `permitted_attributes_for_*`, derived methods.
34
- 5. **`plutonium-entity-scoping`** — `associated_with`, `default_relation_scope`, model shapes for multi-tenancy.
35
- 6. **`plutonium-portal`** — `pu:pkg:portal`, mounting, resource connection, entity strategies.
36
- 7. **`plutonium-definition`** — fields, inputs, displays, search, filters, scopes, actions.
40
+ 1. **`plutonium-app`** — install, portals, packages, routes.
41
+ 2. **`plutonium-resource`** — scaffold, model, definition (the bulk of the work).
42
+ 3. **`plutonium-behavior`** — controllers, policies, interactions.
43
+ 4. **`plutonium-tenancy`** — only if multi-tenant; load before declaring entity scoping.
37
44
 
38
- Optional additions when relevant:
45
+ Add when relevant:
39
46
  - **`plutonium-auth`** for login / accounts / profile.
40
- - **`plutonium-invites`** for membership-based onboarding.
41
- - **`plutonium-package`** when splitting logic across feature packages.
42
- - **`plutonium-assets`** when customizing Tailwind / Stimulus / tokens.
47
+ - **`plutonium-ui`** for custom pages, forms, components, or theming.
48
+ - **`plutonium-testing`** when scaffolding tests.
43
49
 
44
50
  ## Router table
45
51
 
46
52
  | About to… | Load |
47
53
  |---|---|
48
- | Write/edit a model, add associations, use `has_cents` | `plutonium-model` |
49
- | Scope a model to a tenant, write `associated_with`, deal with multi-tenancy | **`plutonium-entity-scoping`** |
50
- | Write `relation_scope`, `permitted_attributes`, override a policy | `plutonium-policy` (+ `plutonium-entity-scoping` if scoping) |
51
- | Create a new resource via `pu:res:scaffold` | `plutonium-create-resource` |
52
- | Add fields, inputs, displays, search, filters, scopes, custom actions, or bulk actions | `plutonium-definition` |
53
- | Write an interaction class for business logic | `plutonium-interaction` |
54
- | Customize a controller action, hook, redirect, or param | `plutonium-controller` |
55
- | Build a custom page, panel, table, layout, Phlex component | `plutonium-views` |
56
- | Customize forms, field builders, inputs, submit buttons | `plutonium-forms` |
57
- | Configure Tailwind, register a Stimulus controller, edit design tokens | `plutonium-assets` |
58
- | Set up Rodauth, accounts, login flows, or profile / settings page | `plutonium-auth` |
59
- | Set up user invitations or entity membership | `plutonium-invites` (+ `plutonium-entity-scoping`) |
60
- | Configure parent/child resources, nested routes | `plutonium-nested-resources` |
61
- | Create a portal or feature package | `plutonium-portal` / `plutonium-package` |
62
- | Mount a portal, configure entity strategies, route portal resources | `plutonium-portal` (+ `plutonium-entity-scoping` for tenancy) |
63
- | Install Plutonium in a Rails app | `plutonium-installation` |
64
- | Write tests for a resource, run `pu:test:scaffold`, or include `Plutonium::Testing::*` concerns | `plutonium-testing` |
54
+ | Install Plutonium, create a portal or package, mount engines, register routes (incl. singular / custom routes) | **[[plutonium-app]]** |
55
+ | Run `pu:res:scaffold`, pick field types, set scaffold options | **[[plutonium-resource]]** |
56
+ | Edit a model, add associations, use `has_cents`, override `to_param` / `to_label` | **[[plutonium-resource]]** |
57
+ | Edit a definition fields, inputs, displays, columns, search, filters, scopes, custom actions, bulk actions, index views, modal/slideover, page titles | **[[plutonium-resource]]** |
58
+ | Override a controller action, hook, redirect, or `resource_params` | **[[plutonium-behavior]]** |
59
+ | Write `relation_scope`, `permitted_attributes_for_*`, `permitted_associations`, action methods, or any policy override | **[[plutonium-behavior]]** (+ **[[plutonium-tenancy]]** if scoping) |
60
+ | Write an interaction class for business logic | **[[plutonium-behavior]]** |
61
+ | Scope a model to a tenant, write `associated_with`, set portal entity strategy | **[[plutonium-tenancy]]** |
62
+ | Configure parent/child nested routes, custom parent resolution | **[[plutonium-tenancy]]** |
63
+ | Set up user invitations or entity membership | **[[plutonium-tenancy]]** |
64
+ | Build a custom page (override `ShowPage`/`IndexPage`/`NewPage`/`EditPage`), custom form, custom display, custom table, custom Phlex component | **[[plutonium-ui]]** |
65
+ | Configure Tailwind, register Stimulus controllers, edit design tokens, theme forms/displays/tables, write a custom layout | **[[plutonium-ui]]** |
66
+ | Install Rodauth, set up accounts, configure login flow, add the profile resource | **[[plutonium-auth]]** |
67
+ | Write tests for a resource, run `pu:test:scaffold`, include `Plutonium::Testing::*` concerns | **[[plutonium-testing]]** |
68
+
69
+ ## Resource architecture at a glance
70
+
71
+ A **resource** is four cooperating layers — Plutonium auto-fills defaults from the model, so you only declare overrides:
72
+
73
+ | Layer | File | Purpose |
74
+ |---|---|---|
75
+ | **Model** | `app/models/post.rb` | Data, validations, associations |
76
+ | **Definition** | `app/definitions/post_definition.rb` | UI — fields, filters, actions |
77
+ | **Policy** | `app/policies/post_policy.rb` | Authorization — who, what |
78
+ | **Controller** | `app/controllers/posts_controller.rb` | Request handling (rarely edited — use hooks) |
79
+
80
+ Plus one optional fifth layer:
81
+
82
+ | Layer | File | Purpose |
83
+ |---|---|---|
84
+ | **Interaction** | `app/interactions/publish_post_interaction.rb` | Business logic for custom actions |
65
85
 
66
86
  ## Generator catalog
67
87
 
68
88
  Every Plutonium generator is discoverable via `rails g pu:<tab>`. Always pass `--dest=` to skip prompts.
69
89
 
70
- | Generator | Purpose | Covered by |
90
+ | Generator | Purpose | Skill |
71
91
  |---|---|---|
72
- | `pu:core:install` | Initial Plutonium setup (base controller/policy/definition/layout) | `plutonium-installation` |
73
- | `pu:core:assets` | Install custom Tailwind + Stimulus toolchain | `plutonium-assets` |
74
- | `pu:res:scaffold NAME field:type ...` | Create a new resource (model, migration, controller, policy, definition) | `plutonium-create-resource` |
75
- | `pu:res:conn RESOURCE --dest=PORTAL` | Connect a resource to a portal | `plutonium-portal` |
76
- | `pu:pkg:package NAME` | Create a feature package | `plutonium-package` |
77
- | `pu:pkg:portal NAME --auth=... --scope=...` | Create a portal package | `plutonium-portal` |
92
+ | `pu:core:install` | Initial Plutonium setup | `plutonium-app` |
93
+ | `pu:core:assets` | Custom Tailwind + Stimulus toolchain | `plutonium-ui` |
94
+ | `pu:res:scaffold NAME field:type ...` | New resource (model, migration, controller, policy, definition) | `plutonium-resource` |
95
+ | `pu:res:conn RESOURCE --dest=PORTAL` | Connect resource to a portal | `plutonium-app` |
96
+ | `pu:pkg:package NAME` | Feature package | `plutonium-app` |
97
+ | `pu:pkg:portal NAME --auth=... --scope=...` | Portal package | `plutonium-app` |
78
98
  | `pu:rodauth:install` | Install Rodauth base | `plutonium-auth` |
79
- | `pu:rodauth:account NAME` | Create a basic Rodauth account | `plutonium-auth` |
80
- | `pu:rodauth:admin NAME` | Create a hardened admin account (2FA, lockout, audit) | `plutonium-auth` |
81
- | `pu:saas:setup --user ... --entity ...` | Meta-generator: user + entity + membership + portal + profile + welcome + invites | `plutonium-auth` + `plutonium-invites` |
82
- | `pu:saas:user / :entity / :membership` | Individual SaaS pieces | `plutonium-auth` |
83
- | `pu:saas:portal / :welcome` | SaaS portal & onboarding | `plutonium-auth` + `plutonium-portal` |
84
- | `pu:profile:install / :setup / :conn` | User profile resource + security section | `plutonium-auth` |
85
- | `pu:invites:install` | User invitations package | `plutonium-invites` |
86
- | `pu:invites:invitable NAME` | Mark a model as invitable | `plutonium-invites` |
87
- | `pu:field:input NAME` | Custom form input component | `plutonium-forms` |
88
- | `pu:field:renderer NAME` | Custom display renderer | `plutonium-definition` |
89
- | `pu:eject:layout` | Eject the base layout for customization | `plutonium-views` |
90
- | `pu:skills:sync` | Sync Plutonium Claude skills into the project | `plutonium` |
91
- | `pu:test:install` | Install Plutonium::Testing scaffolding | `plutonium-testing` |
92
- | `pu:test:scaffold NAME --portals=...` | Scaffold integration tests per (resource × portal) | `plutonium-testing` |
93
-
94
- ## Resource architecture at a glance
95
-
96
- A **resource** is four cooperating layers:
97
-
98
- | Layer | File | Purpose | Edit when… |
99
- |---|---|---|---|
100
- | **Model** | `app/models/post.rb` | Data, validations, associations | Adding domain data/logic |
101
- | **Definition** | `app/definitions/post_definition.rb` | UI — fields, filters, actions | Changing how it looks/behaves |
102
- | **Policy** | `app/policies/post_policy.rb` | Authorization — who, what | Restricting access |
103
- | **Controller** | `app/controllers/posts_controller.rb` | Request handling | Rarely — use hooks |
104
-
105
- ```
106
- ┌───────────────────────────────────────────────────────────────┐
107
- │ Resource │
108
- ├───────────────────────────────────────────────────────────────┤
109
- │ Model │ Definition │ Policy │ Controller │
110
- │ (WHAT) │ (HOW it looks) │ (WHO) │ (HOW it │
111
- │ │ │ │ responds)│
112
- ├───────────────────────────────────────────────────────────────┤
113
- │ - attributes │ - field types │ - actions │ - CRUD │
114
- │ - associations │ - inputs/forms │ - attributes │ - hooks │
115
- │ - validations │ - displays │ - scoping │ - redirects│
116
- │ - scopes │ - filters │ │ - params │
117
- └───────────────────────────────────────────────────────────────┘
118
- ```
119
-
120
- Auto-detection fills most of these in from your model — you only declare when **overriding defaults**.
99
+ | `pu:rodauth:account NAME` | Basic Rodauth account | `plutonium-auth` |
100
+ | `pu:rodauth:admin NAME` | Hardened admin account (2FA, lockout, audit) | `plutonium-auth` |
101
+ | `pu:saas:setup --user ... --entity ...` | Meta: user + entity + membership + portal + profile + welcome + invites | `plutonium-auth` + `plutonium-tenancy` |
102
+ | `pu:saas:user / :entity / :membership / :portal / :welcome` | Individual SaaS pieces | `plutonium-auth` + `plutonium-app` |
103
+ | `pu:profile:install / :setup / :conn` | Profile resource + security section | `plutonium-auth` |
104
+ | `pu:invites:install` | User invitations package | `plutonium-tenancy` |
105
+ | `pu:invites:invitable NAME` | Mark a model as invitable | `plutonium-tenancy` |
106
+ | `pu:eject:layout` | Eject base layout for customization | `plutonium-ui` |
107
+ | `pu:eject:shell` | Eject topbar/sidebar partials | `plutonium-ui` |
108
+ | `pu:test:install` | Install `Plutonium::Testing` scaffolding | `plutonium-testing` |
109
+ | `pu:test:scaffold NAME --portals=...` | Scaffold integration tests | `plutonium-testing` |
110
+ | `pu:skills:sync` | Sync Plutonium Claude skills into the project | (this skill) |
121
111
 
122
112
  ## Unattended execution
123
113
 
124
- Plutonium generators are interactive by default. For scripts, agents, or CI, pass these flags:
114
+ Plutonium generators are interactive by default. For scripts, agents, or CI:
125
115
 
126
116
  | Flag | Generators | Purpose |
127
117
  |---|---|---|
128
- | `--dest=main_app` / `--dest=package_name` | `pu:res:scaffold`, `pu:res:conn`, package-targeted generators | Skips "Select destination feature" prompt |
129
- | `--force` | any | Overwrites conflicting files (needed when re-running `pu:saas:setup` or meta-generators) |
130
- | `--auth=<account>` / `--public` / `--byo` | `pu:pkg:portal` | Skips auth-type prompt |
131
- | `--skip-bundle` | gem-installing generators | Avoids mid-run `bundle install` |
132
- | `--quiet` | most | Reduces output noise |
118
+ | `--dest=main_app` / `--dest=<package>` | `pu:res:scaffold`, `pu:res:conn`, package-targeted generators | Skip "select destination" prompt |
119
+ | `--force` | any | Overwrite conflicting files (required when re-running `pu:saas:setup` or meta-generators) |
120
+ | `--auth=<account>` / `--public` / `--byo` | `pu:pkg:portal` | Skip auth-type prompt |
121
+ | `--skip-bundle` | gem-installing generators | Avoid mid-run `bundle install` |
122
+ | `--quiet` | most | Reduce output noise |
133
123
 
134
- Meta-generators (`pu:saas:setup`) propagate these flags to the generators they chain. Always pass `--force` when re-running a meta-generator on an app that already has some of its outputs.
124
+ Meta-generators (`pu:saas:setup`) propagate flags to the generators they chain. Always pass `--force` when re-running a meta-generator on an app that already has some of its outputs.
135
125
 
136
126
  ## Workflow summary
137
127
 
@@ -141,10 +131,3 @@ Meta-generators (`pu:saas:setup`) propagate these flags to the generators they c
141
131
  4. **Connect** — `rails g pu:res:conn Model --dest=portal_name`.
142
132
  5. **Customize** — edit definition / policy as needed.
143
133
  6. **Verify** — hit the route in the browser.
144
-
145
- ## See also
146
-
147
- - `plutonium-installation` · `plutonium-create-resource` · `plutonium-model` · `plutonium-policy` · `plutonium-entity-scoping` · `plutonium-portal` · `plutonium-definition`
148
- - `plutonium-controller` · `plutonium-interaction` · `plutonium-views` · `plutonium-forms` · `plutonium-assets`
149
- - `plutonium-auth` · `plutonium-invites` · `plutonium-package` · `plutonium-nested-resources`
150
- - `plutonium-testing` — default test concerns and scaffolding