plutonium 0.54.0 → 0.56.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.
- checksums.yaml +4 -4
- data/.claude/skills/plutonium-behavior/SKILL.md +22 -0
- data/.claude/skills/plutonium-resource/SKILL.md +76 -2
- data/.claude/skills/plutonium-ui/SKILL.md +17 -3
- data/CHANGELOG.md +45 -0
- data/app/assets/plutonium.css +1 -1
- data/app/assets/plutonium.js +112 -26
- data/app/assets/plutonium.js.map +4 -4
- data/app/assets/plutonium.min.js +31 -31
- data/app/assets/plutonium.min.js.map +4 -4
- data/config/initializers/rabl.rb +16 -0
- data/docs/.vitepress/config.ts +1 -0
- data/docs/public/images/reference/structured-inputs-removed.png +0 -0
- data/docs/public/images/reference/structured-inputs.png +0 -0
- data/docs/public/templates/lite.rb +10 -0
- data/docs/reference/generators/lite.md +65 -0
- data/docs/reference/resource/definition.md +128 -2
- data/docs/reference/ui/assets.md +14 -0
- data/docs/reference/ui/displays.md +27 -1
- data/docs/reference/ui/forms.md +2 -1
- data/docs/reference/ui/layouts.md +33 -0
- data/docs/superpowers/plans/2026-06-02-structured-inputs.md +1061 -0
- data/docs/superpowers/plans/2026-06-02-structured-inputs.md.tasks.json +60 -0
- data/docs/superpowers/plans/2026-06-04-sqlite-tune-maintenance-generators.md +857 -0
- data/docs/superpowers/plans/2026-06-04-sqlite-tune-maintenance-generators.md.tasks.json +45 -0
- data/docs/superpowers/specs/2026-06-01-structured-inputs-design.md +191 -0
- data/docs/superpowers/specs/2026-06-04-sqlite-tune-maintenance-generators-design.md +238 -0
- data/gemfiles/rails_7.gemfile.lock +1 -1
- data/gemfiles/rails_8.0.gemfile.lock +1 -1
- data/gemfiles/rails_8.1.gemfile.lock +1 -1
- data/lib/generators/pu/core/update/update_generator.rb +4 -1
- data/lib/generators/pu/lib/plutonium_generators/concerns/configures_recurring.rb +89 -0
- data/lib/generators/pu/lite/maintenance/maintenance_generator.rb +45 -0
- data/lib/generators/pu/lite/maintenance/templates/app/jobs/sqlite_maintenance_job.rb.tt +60 -0
- data/lib/generators/pu/lite/rails_pulse/rails_pulse_generator.rb +4 -51
- data/lib/generators/pu/lite/rails_pulse/templates/config/initializers/rails_pulse.rb.tt +1 -1
- data/lib/generators/pu/lite/tune/tune_generator.rb +105 -0
- data/lib/plutonium/definition/base.rb +1 -0
- data/lib/plutonium/definition/structured_inputs.rb +67 -0
- data/lib/plutonium/interaction/README.md +24 -78
- data/lib/plutonium/interaction/base.rb +10 -2
- data/lib/plutonium/models/has_cents.rb +10 -0
- data/lib/plutonium/resource/controller.rb +6 -1
- data/lib/plutonium/resource/controllers/interactive_actions.rb +27 -6
- data/lib/plutonium/routing/mapper_extensions.rb +5 -0
- data/lib/plutonium/structured_inputs/param_cleaner.rb +36 -0
- data/lib/plutonium/structured_inputs/params_concern.rb +36 -0
- data/lib/plutonium/ui/display/base.rb +9 -0
- data/lib/plutonium/ui/display/components/badge.rb +83 -0
- data/lib/plutonium/ui/display/components/boolean.rb +28 -6
- data/lib/plutonium/ui/display/components/currency.rb +50 -0
- data/lib/plutonium/ui/display/options/inferred_types.rb +13 -0
- data/lib/plutonium/ui/display/theme.rb +5 -0
- data/lib/plutonium/ui/form/base.rb +5 -0
- data/lib/plutonium/ui/form/components/toggle.rb +14 -0
- data/lib/plutonium/ui/form/concerns/renders_nested_resource_fields.rb +17 -28
- data/lib/plutonium/ui/form/concerns/renders_repeater_row_controls.rb +67 -0
- data/lib/plutonium/ui/form/concerns/renders_structured_inputs.rb +145 -0
- data/lib/plutonium/ui/form/concerns/repeater_field_styles.rb +24 -0
- data/lib/plutonium/ui/form/interaction.rb +7 -2
- data/lib/plutonium/ui/form/options/inferred_types.rb +2 -0
- data/lib/plutonium/ui/form/resource.rb +5 -1
- data/lib/plutonium/ui/form/theme.rb +12 -0
- data/lib/plutonium/ui/grid/card.rb +58 -21
- data/lib/plutonium/ui/layout/icon_rail.rb +29 -9
- data/lib/plutonium/ui/modal/slideover.rb +9 -3
- data/lib/plutonium/ui/sidebar_menu.rb +29 -0
- data/lib/plutonium/version.rb +1 -1
- data/package.json +1 -1
- data/plutonium.gemspec +5 -4
- data/src/css/components.css +136 -5
- data/src/js/controllers/dirty_form_guard_controller.js +55 -4
- data/src/js/controllers/nested_resource_form_fields_controller.js +35 -12
- data/src/js/controllers/register_controllers.js +2 -0
- data/src/js/controllers/resource_drop_down_controller.js +49 -14
- data/src/js/controllers/structured_input_row_controller.js +26 -0
- metadata +30 -8
- data/docs/superpowers/specs/2026-06-01-interaction-repeater-inputs-design.md +0 -178
- data/lib/plutonium/interaction/nested_attributes.rb +0 -93
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"planPath": "docs/superpowers/plans/2026-06-02-structured-inputs.md",
|
|
3
|
+
"tasks": [
|
|
4
|
+
{
|
|
5
|
+
"id": 0,
|
|
6
|
+
"subject": "Task 0: Shared structured_input DSL + registry",
|
|
7
|
+
"status": "completed",
|
|
8
|
+
"description": "Shared concern: structured_input DSL, defined_structured_inputs registry (inherited), FieldsDefinition holder; included in resource Definition::Base.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/definition/structured_inputs.rb\", \"lib/plutonium/definition/base.rb\", \"test/plutonium/definition/structured_inputs_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/plutonium/definition/structured_inputs_test.rb\", \"acceptanceCriteria\": [\"structured_input registers in defined_structured_inputs with block\", \"fields holder exposes declared inputs\", \"repeat/limit options captured\", \"subclasses inherit registry\"], \"requiresUserVerification\": false}\n```"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": 1,
|
|
12
|
+
"subject": "Task 1: Shared param cleaner",
|
|
13
|
+
"status": "completed",
|
|
14
|
+
"description": "Pure ParamCleaner: single hash (strip _destroy) / repeater array (normalize array|index-hash, drop all-blank, strip _destroy).\n\n```json:metadata\n{\"files\": [\"lib/plutonium/structured_inputs/param_cleaner.rb\", \"test/plutonium/structured_inputs/param_cleaner_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/plutonium/structured_inputs/param_cleaner_test.rb\", \"acceptanceCriteria\": [\"single passes hash through, strips _destroy\", \"repeater normalizes array and index-hash\", \"drops all-blank rows\", \"blank to {} or []\"], \"requiresUserVerification\": false}\n```"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": 2,
|
|
18
|
+
"subject": "Task 2: Interaction host — attribute + remove nested surface",
|
|
19
|
+
"status": "completed",
|
|
20
|
+
"blockedBy": [0],
|
|
21
|
+
"description": "On interactions structured_input declares the backing attribute ({} single / [] repeat); remove nested_input + accepts_nested_attributes_for; delete nested_attributes.rb.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/interaction/base.rb\", \"lib/plutonium/interaction/nested_attributes.rb\", \"test/plutonium/interaction/structured_inputs_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/plutonium/interaction/structured_inputs_test.rb\", \"acceptanceCriteria\": [\"structured_input declares attribute with {} / [] default\", \"defaults not shared across instances\", \"nested_input/accepts_nested_attributes_for/defined_nested_inputs removed from interactions\"], \"requiresUserVerification\": false}\n```"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": 3,
|
|
25
|
+
"subject": "Task 3: Rendering — RendersStructuredInputs + form branch",
|
|
26
|
+
"status": "completed",
|
|
27
|
+
"blockedBy": [0],
|
|
28
|
+
"description": "RendersStructuredInputs concern: single via nest_one (one fieldset), repeater via nest_many (repeater chrome), classless, as: name. Branch render_resource_field in resource.rb. Full HTML assertions in Task 6.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/ui/form/concerns/renders_structured_inputs.rb\", \"lib/plutonium/ui/form/resource.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/plutonium/ui/form/hidden_input_test.rb\", \"acceptanceCriteria\": [\"render_resource_field dispatches structured inputs first\", \"single renders one fieldset, no chrome\", \"repeater renders controller container + template + add/delete\", \"no hidden id/_destroy\"], \"requiresUserVerification\": false}\n```"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": 4,
|
|
32
|
+
"subject": "Task 4: Param flow — apply cleaner on both hosts",
|
|
33
|
+
"status": "completed",
|
|
34
|
+
"blockedBy": [0, 1],
|
|
35
|
+
"description": "ParamsConcern#clean_structured_inputs(definition, params) keyed off defined_structured_inputs; applied in submitted_resource_params and submitted_interaction_params.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/structured_inputs/params_concern.rb\", \"lib/plutonium/resource/controller.rb\", \"lib/plutonium/resource/controllers/interactive_actions.rb\", \"test/plutonium/structured_inputs/params_concern_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/plutonium/structured_inputs/params_concern_test.rb\", \"acceptanceCriteria\": [\"clean_structured_inputs rewrites only structured keys\", \"applied in submitted_resource_params\", \"applied in submitted_interaction_params\"], \"requiresUserVerification\": false}\n```"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"id": 5,
|
|
39
|
+
"subject": "Task 5: Dummy fixtures (generators)",
|
|
40
|
+
"status": "completed",
|
|
41
|
+
"blockedBy": [0, 2, 3],
|
|
42
|
+
"description": "Via pu:* generators: a catalog resource with json columns + structured_input (single + repeat) + policy permit + admin route; an interaction with single + repeat structured_input wired as an action.\n\n```json:metadata\n{\"files\": [\"test/dummy/packages/catalog/app/definitions/catalog/spec_definition.rb\", \"test/dummy/packages/catalog/app/policies/catalog/spec_policy.rb\", \"test/dummy/packages/catalog/app/interactions/catalog/collect_spec.rb\", \"test/dummy/packages/admin_portal/config/routes.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/integration/admin_portal/resources_test.rb\", \"acceptanceCriteria\": [\"resource with json columns + structured_input\", \"interaction with single + repeat structured_input wired as action\", \"migrations run, app boots\"], \"requiresUserVerification\": false}\n```"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": 6,
|
|
46
|
+
"subject": "Task 6: Integration tests — render + round-trip (both hosts)",
|
|
47
|
+
"status": "completed",
|
|
48
|
+
"blockedBy": [3, 4, 5],
|
|
49
|
+
"description": "Render + persistence round-trip for single + repeater on resources (JSON column) and interactions (attribute to execute). Contract source of truth for the as: naming.\n\n```json:metadata\n{\"files\": [\"test/integration/admin_portal/structured_input_rendering_test.rb\", \"test/integration/admin_portal/structured_input_roundtrip_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/integration/admin_portal/structured_input_rendering_test.rb\", \"acceptanceCriteria\": [\"single + repeater render with correct nested names, no hidden id/_destroy\", \"create persists hash + cleaned array to json columns\", \"interaction execute receives hash + array\"], \"requiresUserVerification\": false}\n```"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"id": 7,
|
|
53
|
+
"subject": "Task 7: Full regression + docs",
|
|
54
|
+
"status": "completed",
|
|
55
|
+
"blockedBy": [6],
|
|
56
|
+
"description": "Full suite + cross-version spot checks; rework interaction README to structured_input; document structured_input; update skill docs referencing interaction nested_input.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/interaction/README.md\", \"docs/\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 rake test\", \"acceptanceCriteria\": [\"full suite green\", \"README/docs document structured_input and the interaction removals\"], \"requiresUserVerification\": false}\n```"
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"lastUpdated": "2026-06-02"
|
|
60
|
+
}
|