plutonium 0.63.0 → 0.65.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 (280) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/skills/plutonium/SKILL.md +4 -1
  3. data/.claude/skills/plutonium-app/SKILL.md +14 -0
  4. data/.claude/skills/plutonium-dashboard/SKILL.md +161 -0
  5. data/.claude/skills/plutonium-resource/SKILL.md +94 -14
  6. data/.claude/skills/plutonium-ui/SKILL.md +22 -1
  7. data/.standard.yml +1 -1
  8. data/CHANGELOG.md +65 -0
  9. data/CLAUDE.md +282 -210
  10. data/SECURITY.md +1 -1
  11. data/app/assets/plutonium-charts.js +20604 -0
  12. data/app/assets/plutonium-charts.js.map +7 -0
  13. data/app/assets/plutonium-charts.min.js +41 -0
  14. data/app/assets/plutonium-charts.min.js.map +7 -0
  15. data/app/assets/plutonium.css +1 -1
  16. data/app/assets/plutonium.js +794 -629
  17. data/app/assets/plutonium.js.map +4 -4
  18. data/app/assets/plutonium.min.js +48 -48
  19. data/app/assets/plutonium.min.js.map +4 -4
  20. data/app/views/plutonium/_flash_alerts.html.erb +2 -2
  21. data/app/views/plutonium/_resource_header.html.erb +2 -2
  22. data/app/views/plutonium/_resource_sidebar.html.erb +11 -2
  23. data/app/views/plutonium/_toast.html.erb +2 -2
  24. data/app/views/rodauth/_login_form.html.erb +1 -1
  25. data/app/views/rodauth/_password_visibility.html.erb +1 -1
  26. data/app/views/rodauth/add_recovery_codes.html.erb +2 -2
  27. data/app/views/rodauth/change_login.html.erb +2 -2
  28. data/app/views/rodauth/create_account.html.erb +4 -4
  29. data/app/views/rodauth/reset_password_request.html.erb +1 -1
  30. data/app/views/rodauth/verify_account_resend.html.erb +1 -1
  31. data/app/views/rodauth/webauthn_remove.html.erb +1 -1
  32. data/config/brakeman.ignore +4 -4
  33. data/config/initializers/rabl.rb +0 -40
  34. data/config/locales/en/api_client.yml +22 -0
  35. data/config/locales/en/async.yml +34 -0
  36. data/config/locales/en/dashboard.yml +25 -0
  37. data/config/locales/en/invites.yml +37 -0
  38. data/config/locales/en/js.yml +40 -0
  39. data/config/locales/en/kanban.yml +28 -0
  40. data/config/locales/en/plutonium.yml +26 -0
  41. data/config/locales/en/positioning.yml +14 -0
  42. data/config/locales/en/profile.yml +29 -0
  43. data/config/locales/en/resource.yml +60 -0
  44. data/config/locales/en/ui.yml +93 -0
  45. data/config/locales/en/wizard.yml +46 -0
  46. data/docs/.vitepress/config.ts +34 -1
  47. data/docs/.vitepress/theme/components/HomeHero.vue +1 -1
  48. data/docs/.vitepress/theme/components/HomeInTheBox.vue +14 -0
  49. data/docs/.vitepress/theme/custom.css +34 -377
  50. data/docs/blog/introducing-plutonium-dashboards.md +175 -0
  51. data/docs/blog/introducing-plutonium-i18n.md +91 -0
  52. data/docs/blog/introducing-plutonium.md +4 -5
  53. data/docs/blog/whats-new-async-kanban-wizards.md +1 -1
  54. data/docs/guides/dashboards.md +300 -0
  55. data/docs/guides/index.md +1 -0
  56. data/docs/guides/kanban.md +2 -2
  57. data/docs/public/images/blog/dashboards-card-error.png +0 -0
  58. data/docs/public/images/blog/dashboards-loading.png +0 -0
  59. data/docs/public/images/blog/dashboards-overview.png +0 -0
  60. data/docs/public/images/blog/dashboards-sidebar.png +0 -0
  61. data/docs/public/images/blog/i18n-es-admin.png +0 -0
  62. data/docs/public/images/guides/dashboard-card-error.png +0 -0
  63. data/docs/public/images/guides/dashboard-loading.png +0 -0
  64. data/docs/public/images/guides/dashboard-overview.png +0 -0
  65. data/docs/public/images/guides/dashboard-sidebar.png +0 -0
  66. data/docs/reference/app/generators.md +2 -2
  67. data/docs/reference/app/portals.md +2 -0
  68. data/docs/reference/configuration.md +84 -27
  69. data/docs/reference/dashboard/dsl.md +123 -0
  70. data/docs/reference/dashboard/index.md +35 -0
  71. data/docs/reference/dashboard/registration.md +76 -0
  72. data/docs/reference/i18n.md +239 -0
  73. data/docs/reference/index.md +10 -1
  74. data/docs/reference/kanban/dsl.md +1 -1
  75. data/docs/reference/kanban/positioning.md +2 -2
  76. data/docs/reference/resource/actions.md +1 -1
  77. data/docs/reference/resource/definition.md +96 -18
  78. data/docs/reference/resource/export.md +5 -1
  79. data/docs/reference/resource/index.md +2 -0
  80. data/docs/reference/{positioning.md → resource/positioning.md} +2 -1
  81. data/docs/reference/resource/query.md +2 -0
  82. data/docs/reference/ui/assets.md +8 -0
  83. data/docs/reference/ui/displays.md +5 -8
  84. data/docs/reference/ui/index.md +1 -1
  85. data/docs/reference/wizard/dsl.md +2 -2
  86. data/esbuild.config.js +5 -2
  87. data/gemfiles/rails_7.gemfile.lock +3 -3
  88. data/gemfiles/rails_8.0.gemfile.lock +1 -1
  89. data/gemfiles/rails_8.1.gemfile.lock +2 -2
  90. data/lib/active_model/validations/array_validator.rb +1 -1
  91. data/lib/active_model/validations/attached_validator.rb +1 -1
  92. data/lib/active_model/validations/url_validator.rb +2 -2
  93. data/lib/generators/pu/core/assets/assets_generator.rb +36 -21
  94. data/lib/generators/pu/core/assets/templates/postcss.config.js +1 -1
  95. data/lib/generators/pu/core/update/update_generator.rb +3 -2
  96. data/lib/generators/pu/dashboard/dashboard_generator.rb +96 -0
  97. data/lib/generators/pu/dashboard/templates/dashboard.rb.tt +25 -0
  98. data/lib/generators/pu/docker/install/install_generator.rb +58 -0
  99. data/lib/generators/pu/docker/install/templates/Dockerfile.dev.tt +18 -3
  100. data/lib/generators/pu/docker/install/templates/Dockerfile.tt +20 -5
  101. data/lib/generators/pu/docker/install/templates/{docker-compose.yml → docker-compose.yml.tt} +1 -1
  102. data/lib/generators/pu/gem/dotenv/dotenv_generator.rb +1 -1
  103. data/lib/generators/pu/invites/invitable_generator.rb +18 -1
  104. data/lib/generators/pu/lib/plutonium_generators/concerns/actions.rb +0 -95
  105. data/lib/generators/pu/lib/plutonium_generators/concerns/js_package_manager.rb +146 -0
  106. data/lib/generators/pu/lib/plutonium_generators/generator.rb +1 -17
  107. data/lib/generators/pu/pkg/package/package_generator.rb +1 -0
  108. data/lib/generators/pu/pkg/package/templates/config/locales/en.yml.tt +28 -0
  109. data/lib/generators/pu/pkg/portal/portal_generator.rb +1 -0
  110. data/lib/generators/pu/pkg/portal/templates/config/locales/en.yml.tt +30 -0
  111. data/lib/generators/pu/res/scaffold/scaffold_generator.rb +0 -8
  112. data/lib/generators/pu/rodauth/concerns/feature_selector.rb +0 -18
  113. data/lib/plutonium/action/base.rb +27 -3
  114. data/lib/plutonium/action/interactive.rb +17 -4
  115. data/lib/plutonium/api_client/concerns/create_api_client.rb +12 -11
  116. data/lib/plutonium/api_client/concerns/disable_api_client.rb +3 -3
  117. data/lib/plutonium/auth/sequel_adapter.rb +1 -1
  118. data/lib/plutonium/configuration.rb +5 -0
  119. data/lib/plutonium/core/controller.rb +25 -1
  120. data/lib/plutonium/core/controllers/authorizable.rb +1 -1
  121. data/lib/plutonium/dashboard/base.rb +114 -0
  122. data/lib/plutonium/dashboard/card.rb +200 -0
  123. data/lib/plutonium/dashboard/controller.rb +101 -0
  124. data/lib/plutonium/dashboard/dsl.rb +104 -0
  125. data/lib/plutonium/dashboard/register.rb +40 -0
  126. data/lib/plutonium/dashboard/route_resolution.rb +30 -0
  127. data/lib/plutonium/dashboard.rb +42 -0
  128. data/lib/plutonium/definition/actions.rb +6 -1
  129. data/lib/plutonium/definition/base.rb +41 -3
  130. data/lib/plutonium/definition/index_views.rb +1 -1
  131. data/lib/plutonium/definition/positioning.rb +1 -1
  132. data/lib/plutonium/definition/presentable.rb +2 -2
  133. data/lib/plutonium/helpers/assets_helper.rb +15 -2
  134. data/lib/plutonium/helpers/display_helper.rb +10 -2
  135. data/lib/plutonium/interaction/async/context.rb +6 -8
  136. data/lib/plutonium/interaction/async/executor.rb +6 -7
  137. data/lib/plutonium/interaction/async/run.rb +2 -2
  138. data/lib/plutonium/interaction/async/run_definition.rb +1 -1
  139. data/lib/plutonium/interaction/base.rb +2 -0
  140. data/lib/plutonium/interaction/concerns/dispatchable.rb +15 -3
  141. data/lib/plutonium/invites/concerns/cancel_invite.rb +3 -3
  142. data/lib/plutonium/invites/concerns/invite_token.rb +25 -7
  143. data/lib/plutonium/invites/concerns/invite_user.rb +10 -5
  144. data/lib/plutonium/invites/concerns/resend_invite.rb +4 -4
  145. data/lib/plutonium/invites/controller.rb +11 -11
  146. data/lib/plutonium/kanban/column.rb +13 -3
  147. data/lib/plutonium/kanban/dsl.rb +7 -4
  148. data/lib/plutonium/models/has_cents.rb +1 -1
  149. data/lib/plutonium/profile/security_section.rb +10 -18
  150. data/lib/plutonium/query/filter.rb +10 -1
  151. data/lib/plutonium/query/filters/association.rb +27 -2
  152. data/lib/plutonium/query/filters/boolean.rb +4 -4
  153. data/lib/plutonium/query/filters/date.rb +4 -17
  154. data/lib/plutonium/query/filters/date_range.rb +2 -2
  155. data/lib/plutonium/query/filters/select.rb +10 -1
  156. data/lib/plutonium/query/filters/text.rb +9 -12
  157. data/lib/plutonium/railtie.rb +17 -0
  158. data/lib/plutonium/resource/controller.rb +10 -5
  159. data/lib/plutonium/resource/controllers/crud_actions.rb +17 -20
  160. data/lib/plutonium/resource/controllers/export_csv.rb +19 -9
  161. data/lib/plutonium/resource/controllers/kanban_actions.rb +16 -16
  162. data/lib/plutonium/resource/controllers/position_actions.rb +5 -5
  163. data/lib/plutonium/resource/controllers/typeahead.rb +24 -1
  164. data/lib/plutonium/resource/query_object.rb +30 -3
  165. data/lib/plutonium/routing/dashboard_registration.rb +137 -0
  166. data/lib/plutonium/routing/resource_registration.rb +5 -0
  167. data/lib/plutonium/routing/route_set_extensions.rb +2 -1
  168. data/lib/plutonium/translation.rb +227 -0
  169. data/lib/plutonium/ui/actions_dropdown.rb +2 -2
  170. data/lib/plutonium/ui/breadcrumbs.rb +3 -3
  171. data/lib/plutonium/ui/color_mode_selector.rb +1 -1
  172. data/lib/plutonium/ui/component/behaviour.rb +46 -0
  173. data/lib/plutonium/ui/component/methods.rb +4 -0
  174. data/lib/plutonium/ui/dashboard/board.rb +80 -0
  175. data/lib/plutonium/ui/dashboard/card.rb +127 -0
  176. data/lib/plutonium/ui/dashboard/chart.rb +43 -0
  177. data/lib/plutonium/ui/dashboard/custom.rb +32 -0
  178. data/lib/plutonium/ui/dashboard/frame.rb +25 -0
  179. data/lib/plutonium/ui/dashboard/metric.rb +137 -0
  180. data/lib/plutonium/ui/dashboard/skeleton.rb +40 -0
  181. data/lib/plutonium/ui/display/components/attachment.rb +1 -1
  182. data/lib/plutonium/ui/display/components/badge.rb +7 -1
  183. data/lib/plutonium/ui/display/components/boolean.rb +2 -2
  184. data/lib/plutonium/ui/display/resource.rb +23 -16
  185. data/lib/plutonium/ui/export_button.rb +3 -3
  186. data/lib/plutonium/ui/form/components/key_value_store.rb +5 -5
  187. data/lib/plutonium/ui/form/components/password.rb +2 -2
  188. data/lib/plutonium/ui/form/components/resource_select.rb +27 -0
  189. data/lib/plutonium/ui/form/components/secure_association.rb +2 -0
  190. data/lib/plutonium/ui/form/components/uppy.rb +11 -3
  191. data/lib/plutonium/ui/form/concerns/renders_nested_resource_fields.rb +1 -1
  192. data/lib/plutonium/ui/form/concerns/renders_repeater_row_controls.rb +5 -4
  193. data/lib/plutonium/ui/form/concerns/renders_structured_inputs.rb +1 -1
  194. data/lib/plutonium/ui/form/query.rb +8 -8
  195. data/lib/plutonium/ui/form/resource.rb +54 -26
  196. data/lib/plutonium/ui/frame_navigator_panel.rb +4 -4
  197. data/lib/plutonium/ui/grid/card.rb +3 -3
  198. data/lib/plutonium/ui/grid/resource.rb +3 -3
  199. data/lib/plutonium/ui/interaction/async/run_progress.rb +6 -6
  200. data/lib/plutonium/ui/interaction/async/running_banner.rb +2 -2
  201. data/lib/plutonium/ui/kanban/column.rb +6 -6
  202. data/lib/plutonium/ui/layout/base.rb +19 -1
  203. data/lib/plutonium/ui/layout/header.rb +1 -1
  204. data/lib/plutonium/ui/layout/icon_rail.rb +4 -4
  205. data/lib/plutonium/ui/layout/rodauth_layout.rb +1 -1
  206. data/lib/plutonium/ui/layout/sidebar.rb +1 -1
  207. data/lib/plutonium/ui/layout/topbar.rb +2 -2
  208. data/lib/plutonium/ui/modal/base.rb +4 -4
  209. data/lib/plutonium/ui/nav_grid_menu.rb +1 -1
  210. data/lib/plutonium/ui/nav_user.rb +2 -2
  211. data/lib/plutonium/ui/page/base.rb +10 -2
  212. data/lib/plutonium/ui/page/dashboard.rb +54 -0
  213. data/lib/plutonium/ui/page/edit.rb +3 -3
  214. data/lib/plutonium/ui/page/interactive_action.rb +2 -2
  215. data/lib/plutonium/ui/page/new.rb +3 -3
  216. data/lib/plutonium/ui/page/show.rb +2 -2
  217. data/lib/plutonium/ui/page/wizard.rb +22 -16
  218. data/lib/plutonium/ui/page/wizard_chooser.rb +10 -10
  219. data/lib/plutonium/ui/page/wizard_completed.rb +2 -2
  220. data/lib/plutonium/ui/skeleton_table.rb +1 -1
  221. data/lib/plutonium/ui/table/base.rb +2 -2
  222. data/lib/plutonium/ui/table/components/attachment.rb +1 -1
  223. data/lib/plutonium/ui/table/components/bulk_actions_toolbar.rb +19 -3
  224. data/lib/plutonium/ui/table/components/drag_handle.rb +3 -3
  225. data/lib/plutonium/ui/table/components/filter_form.rb +11 -10
  226. data/lib/plutonium/ui/table/components/filter_pills.rb +4 -4
  227. data/lib/plutonium/ui/table/components/pagy_info.rb +61 -17
  228. data/lib/plutonium/ui/table/components/pagy_pagination.rb +9 -5
  229. data/lib/plutonium/ui/table/components/row_actions_dropdown.rb +1 -1
  230. data/lib/plutonium/ui/table/components/scopes_bar.rb +6 -2
  231. data/lib/plutonium/ui/table/components/scopes_pills.rb +3 -3
  232. data/lib/plutonium/ui/table/components/selection_column.rb +1 -1
  233. data/lib/plutonium/ui/table/components/toolbar.rb +2 -2
  234. data/lib/plutonium/ui/table/components/view_switcher.rb +12 -8
  235. data/lib/plutonium/ui/table/resource.rb +53 -17
  236. data/lib/plutonium/ui/wizard/review.rb +7 -7
  237. data/lib/plutonium/ui/wizard/stepper.rb +1 -1
  238. data/lib/plutonium/ui/wizard/summary_display.rb +6 -0
  239. data/lib/plutonium/version.rb +1 -1
  240. data/lib/plutonium/wizard/base.rb +2 -0
  241. data/lib/plutonium/wizard/driving.rb +8 -2
  242. data/lib/plutonium/wizard/dsl.rb +4 -2
  243. data/lib/plutonium/wizard/field_importer.rb +1 -8
  244. data/lib/plutonium/wizard/review_step.rb +8 -1
  245. data/lib/plutonium/wizard/step.rb +14 -3
  246. data/package.json +4 -2
  247. data/plutonium.gemspec +15 -30
  248. data/postcss-gem-import.cjs +34 -0
  249. data/postcss-gem-import.js +3 -28
  250. data/src/css/components.css +91 -0
  251. data/src/css/slim_select.css +0 -38
  252. data/src/css/tokens.css +24 -0
  253. data/src/js/controllers/attachment_input_controller.js +15 -6
  254. data/src/js/controllers/chart_controller.js +162 -0
  255. data/src/js/controllers/clipboard_controller.js +3 -2
  256. data/src/js/controllers/dirty_form_guard_controller.js +4 -3
  257. data/src/js/controllers/easymde_controller.js +3 -0
  258. data/src/js/controllers/filter_panel_controller.js +15 -6
  259. data/src/js/controllers/flatpickr_controller.js +8 -0
  260. data/src/js/controllers/frame_refresh_controller.js +59 -0
  261. data/src/js/controllers/intl_tel_input_controller.js +5 -0
  262. data/src/js/controllers/register_controllers.js +4 -0
  263. data/src/js/controllers/slim_select_controller.js +79 -176
  264. data/src/js/core.js +9 -1
  265. data/src/js/i18n.js +69 -0
  266. data/src/js/plutonium-charts.js +15 -0
  267. data/src/js/turbo/turbo_confirm.js +5 -3
  268. metadata +71 -31
  269. data/.yarnrc.yml +0 -8
  270. data/config/initializers/hotwire_turbo_monkey_patches.rb +0 -12
  271. data/lib/generators/pu/field/input/input_generator.rb +0 -32
  272. data/lib/generators/pu/field/input/templates/input.rb.tt +0 -15
  273. data/lib/generators/pu/lib/plutonium_generators/concerns/config.rb +0 -39
  274. data/lib/generators/pu/lib/plutonium_generators/concerns/serializer.rb +0 -39
  275. data/lib/generators/pu/lib/plutonium_generators/installer.rb +0 -205
  276. data/lib/generators/pu/res/scaffold/templates/presenter.rb.tt +0 -13
  277. data/lib/generators/pu/res/scaffold/templates/query_object.rb.tt +0 -17
  278. data/public/plutonium-assets/application.js +0 -31419
  279. data/public/plutonium-assets/plutonium.ico +0 -0
  280. data/yarn.lock +0 -6858
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plutonium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.63.0
4
+ version: 0.65.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Froelich
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2026-08-22 00:00:00.000000000 Z
10
+ date: 2026-10-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: zeitwerk
@@ -72,6 +72,9 @@ dependencies:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
74
  version: '43.0'
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: 43.5.6
75
78
  type: :runtime
76
79
  prerelease: false
77
80
  version_requirements: !ruby/object:Gem::Requirement
@@ -79,6 +82,9 @@ dependencies:
79
82
  - - "~>"
80
83
  - !ruby/object:Gem::Version
81
84
  version: '43.0'
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: 43.5.6
82
88
  - !ruby/object:Gem::Dependency
83
89
  name: rabl
84
90
  requirement: !ruby/object:Gem::Requirement
@@ -459,6 +465,7 @@ files:
459
465
  - ".claude/skills/plutonium-async-interactions/SKILL.md"
460
466
  - ".claude/skills/plutonium-auth/SKILL.md"
461
467
  - ".claude/skills/plutonium-behavior/SKILL.md"
468
+ - ".claude/skills/plutonium-dashboard/SKILL.md"
462
469
  - ".claude/skills/plutonium-kanban/SKILL.md"
463
470
  - ".claude/skills/plutonium-resource/SKILL.md"
464
471
  - ".claude/skills/plutonium-tenancy/SKILL.md"
@@ -474,7 +481,6 @@ files:
474
481
  - ".vscode/extensions.json"
475
482
  - ".vscode/launch.json"
476
483
  - ".vscode/settings.json"
477
- - ".yarnrc.yml"
478
484
  - Appraisals
479
485
  - CHANGELOG.md
480
486
  - CLAUDE.md
@@ -483,6 +489,10 @@ files:
483
489
  - README.md
484
490
  - Rakefile
485
491
  - SECURITY.md
492
+ - app/assets/plutonium-charts.js
493
+ - app/assets/plutonium-charts.js.map
494
+ - app/assets/plutonium-charts.min.js
495
+ - app/assets/plutonium-charts.min.js.map
486
496
  - app/assets/plutonium.css
487
497
  - app/assets/plutonium.ico
488
498
  - app/assets/plutonium.js
@@ -564,10 +574,21 @@ files:
564
574
  - config.ru
565
575
  - config/brakeman.ignore
566
576
  - config/initializers/action_policy.rb
567
- - config/initializers/hotwire_turbo_monkey_patches.rb
568
577
  - config/initializers/pagy.rb
569
578
  - config/initializers/rabl.rb
570
579
  - config/initializers/sqlite_alias.rb
580
+ - config/locales/en/api_client.yml
581
+ - config/locales/en/async.yml
582
+ - config/locales/en/dashboard.yml
583
+ - config/locales/en/invites.yml
584
+ - config/locales/en/js.yml
585
+ - config/locales/en/kanban.yml
586
+ - config/locales/en/plutonium.yml
587
+ - config/locales/en/positioning.yml
588
+ - config/locales/en/profile.yml
589
+ - config/locales/en/resource.yml
590
+ - config/locales/en/ui.yml
591
+ - config/locales/en/wizard.yml
571
592
  - db/migrate/async_interactions/20260817000001_create_plutonium_async_runs.rb
572
593
  - db/migrate/wizard/20260615000001_create_plutonium_wizard_sessions.rb
573
594
  - docs/.vitepress/config.ts
@@ -592,6 +613,8 @@ files:
592
613
  - docs/blog/half-finished-forms-are-pii.md
593
614
  - docs/blog/index.md
594
615
  - docs/blog/interactions-are-presentation-objects.md
616
+ - docs/blog/introducing-plutonium-dashboards.md
617
+ - docs/blog/introducing-plutonium-i18n.md
595
618
  - docs/blog/introducing-plutonium.md
596
619
  - docs/blog/jobs-are-not-permission-snapshots.md
597
620
  - docs/blog/plutonium-and-ai-agents.md
@@ -615,6 +638,7 @@ files:
615
638
  - docs/guides/creating-packages.md
616
639
  - docs/guides/custom-actions.md
617
640
  - docs/guides/customizing-ui.md
641
+ - docs/guides/dashboards.md
618
642
  - docs/guides/index.md
619
643
  - docs/guides/kanban.md
620
644
  - docs/guides/multi-tenancy.md
@@ -636,8 +660,17 @@ files:
636
660
  - docs/public/favicon-16x16.png
637
661
  - docs/public/favicon-32x32.png
638
662
  - docs/public/favicon.ico
663
+ - docs/public/images/blog/dashboards-card-error.png
664
+ - docs/public/images/blog/dashboards-loading.png
665
+ - docs/public/images/blog/dashboards-overview.png
666
+ - docs/public/images/blog/dashboards-sidebar.png
667
+ - docs/public/images/blog/i18n-es-admin.png
639
668
  - docs/public/images/components/avatar.png
640
669
  - docs/public/images/guides/custom-actions-bulk.png
670
+ - docs/public/images/guides/dashboard-card-error.png
671
+ - docs/public/images/guides/dashboard-loading.png
672
+ - docs/public/images/guides/dashboard-overview.png
673
+ - docs/public/images/guides/dashboard-sidebar.png
641
674
  - docs/public/images/guides/kanban-after-move.png
642
675
  - docs/public/images/guides/kanban-board-light.png
643
676
  - docs/public/images/guides/kanban-board.png
@@ -716,18 +749,22 @@ files:
716
749
  - docs/reference/behavior/interactions.md
717
750
  - docs/reference/behavior/policies.md
718
751
  - docs/reference/configuration.md
752
+ - docs/reference/dashboard/dsl.md
753
+ - docs/reference/dashboard/index.md
754
+ - docs/reference/dashboard/registration.md
719
755
  - docs/reference/generators/lite.md
756
+ - docs/reference/i18n.md
720
757
  - docs/reference/index.md
721
758
  - docs/reference/kanban/authorization.md
722
759
  - docs/reference/kanban/dsl.md
723
760
  - docs/reference/kanban/index.md
724
761
  - docs/reference/kanban/positioning.md
725
- - docs/reference/positioning.md
726
762
  - docs/reference/resource/actions.md
727
763
  - docs/reference/resource/definition.md
728
764
  - docs/reference/resource/export.md
729
765
  - docs/reference/resource/index.md
730
766
  - docs/reference/resource/model.md
767
+ - docs/reference/resource/positioning.md
731
768
  - docs/reference/resource/query.md
732
769
  - docs/reference/tenancy/entity-scoping.md
733
770
  - docs/reference/tenancy/index.md
@@ -838,6 +875,8 @@ files:
838
875
  - lib/generators/pu/core/typespec/templates/model.tsp.tt
839
876
  - lib/generators/pu/core/typespec/typespec_generator.rb
840
877
  - lib/generators/pu/core/update/update_generator.rb
878
+ - lib/generators/pu/dashboard/dashboard_generator.rb
879
+ - lib/generators/pu/dashboard/templates/dashboard.rb.tt
841
880
  - lib/generators/pu/docker/install/install_generator.rb
842
881
  - lib/generators/pu/docker/install/templates/.keep
843
882
  - lib/generators/pu/docker/install/templates/Dockerfile.dev.tt
@@ -845,14 +884,12 @@ files:
845
884
  - lib/generators/pu/docker/install/templates/bin/console
846
885
  - lib/generators/pu/docker/install/templates/bin/restart
847
886
  - lib/generators/pu/docker/install/templates/bin/shell
848
- - lib/generators/pu/docker/install/templates/docker-compose.yml
887
+ - lib/generators/pu/docker/install/templates/docker-compose.yml.tt
849
888
  - lib/generators/pu/eject/layout/layout_generator.rb
850
889
  - lib/generators/pu/eject/shell/shell_generator.rb
851
890
  - lib/generators/pu/extra/colorized_logger/colorized_logger_generator.rb
852
891
  - lib/generators/pu/extra/colorized_logger/templates/config/initializers/colorized_logger.rb
853
- - lib/generators/pu/field/input/input_generator.rb
854
892
  - lib/generators/pu/field/input/templates/.keep
855
- - lib/generators/pu/field/input/templates/input.rb.tt
856
893
  - lib/generators/pu/field/renderer/renderer_generator.rb
857
894
  - lib/generators/pu/field/renderer/templates/.keep
858
895
  - lib/generators/pu/field/renderer/templates/renderer.rb.tt
@@ -906,18 +943,16 @@ files:
906
943
  - lib/generators/pu/lib/plutonium_generators.rb
907
944
  - lib/generators/pu/lib/plutonium_generators/cli.rb
908
945
  - lib/generators/pu/lib/plutonium_generators/concerns/actions.rb
909
- - lib/generators/pu/lib/plutonium_generators/concerns/config.rb
910
946
  - lib/generators/pu/lib/plutonium_generators/concerns/configures_recurring.rb
911
947
  - lib/generators/pu/lib/plutonium_generators/concerns/configures_sqlite.rb
948
+ - lib/generators/pu/lib/plutonium_generators/concerns/js_package_manager.rb
912
949
  - lib/generators/pu/lib/plutonium_generators/concerns/logger.rb
913
950
  - lib/generators/pu/lib/plutonium_generators/concerns/mounts_engines.rb
914
951
  - lib/generators/pu/lib/plutonium_generators/concerns/package_selector.rb
915
952
  - lib/generators/pu/lib/plutonium_generators/concerns/resource_registration.rb
916
953
  - lib/generators/pu/lib/plutonium_generators/concerns/resource_selector.rb
917
954
  - lib/generators/pu/lib/plutonium_generators/concerns/rodauth_redirects.rb
918
- - lib/generators/pu/lib/plutonium_generators/concerns/serializer.rb
919
955
  - lib/generators/pu/lib/plutonium_generators/generator.rb
920
- - lib/generators/pu/lib/plutonium_generators/installer.rb
921
956
  - lib/generators/pu/lib/plutonium_generators/model_generator_base.rb
922
957
  - lib/generators/pu/lib/plutonium_generators/non_interactive_prompt.rb
923
958
  - lib/generators/pu/lite/litestream/litestream_generator.rb
@@ -940,6 +975,7 @@ files:
940
975
  - lib/generators/pu/pkg/package/templates/app/policies/resource_policy.rb.tt
941
976
  - lib/generators/pu/pkg/package/templates/app/presenters/resource_presenter.rb.tt
942
977
  - lib/generators/pu/pkg/package/templates/app/query_objects/resource_query_object.rb.tt
978
+ - lib/generators/pu/pkg/package/templates/config/locales/en.yml.tt
943
979
  - lib/generators/pu/pkg/package/templates/lib/engine.rb.tt
944
980
  - lib/generators/pu/pkg/portal/USAGE
945
981
  - lib/generators/pu/pkg/portal/portal_generator.rb
@@ -953,6 +989,7 @@ files:
953
989
  - lib/generators/pu/pkg/portal/templates/app/query_objects/resource_query_object.rb.tt
954
990
  - lib/generators/pu/pkg/portal/templates/app/views/package/.keep
955
991
  - lib/generators/pu/pkg/portal/templates/app/views/package/dashboard/index.html.erb
992
+ - lib/generators/pu/pkg/portal/templates/config/locales/en.yml.tt
956
993
  - lib/generators/pu/pkg/portal/templates/config/routes.rb.tt
957
994
  - lib/generators/pu/pkg/portal/templates/lib/engine.rb.tt
958
995
  - lib/generators/pu/profile/USAGE
@@ -981,8 +1018,6 @@ files:
981
1018
  - lib/generators/pu/res/scaffold/templates/controller.rb.tt
982
1019
  - lib/generators/pu/res/scaffold/templates/definition.rb.tt
983
1020
  - lib/generators/pu/res/scaffold/templates/policy.rb.tt
984
- - lib/generators/pu/res/scaffold/templates/presenter.rb.tt
985
- - lib/generators/pu/res/scaffold/templates/query_object.rb.tt
986
1021
  - lib/generators/pu/rodauth/account_generator.rb
987
1022
  - lib/generators/pu/rodauth/admin_generator.rb
988
1023
  - lib/generators/pu/rodauth/concerns/account_selector.rb
@@ -1104,6 +1139,13 @@ files:
1104
1139
  - lib/plutonium/core/controllers/authorizable.rb
1105
1140
  - lib/plutonium/core/controllers/bootable.rb
1106
1141
  - lib/plutonium/core/controllers/entity_scoping.rb
1142
+ - lib/plutonium/dashboard.rb
1143
+ - lib/plutonium/dashboard/base.rb
1144
+ - lib/plutonium/dashboard/card.rb
1145
+ - lib/plutonium/dashboard/controller.rb
1146
+ - lib/plutonium/dashboard/dsl.rb
1147
+ - lib/plutonium/dashboard/register.rb
1148
+ - lib/plutonium/dashboard/route_resolution.rb
1107
1149
  - lib/plutonium/definition/actions.rb
1108
1150
  - lib/plutonium/definition/base.rb
1109
1151
  - lib/plutonium/definition/config_attr.rb
@@ -1223,6 +1265,7 @@ files:
1223
1265
  - lib/plutonium/resource/record/routes.rb
1224
1266
  - lib/plutonium/resource/register.rb
1225
1267
  - lib/plutonium/rodauth/controller_methods.rb
1268
+ - lib/plutonium/routing/dashboard_registration.rb
1226
1269
  - lib/plutonium/routing/mapper_extensions.rb
1227
1270
  - lib/plutonium/routing/resource_registration.rb
1228
1271
  - lib/plutonium/routing/route_set_extensions.rb
@@ -1240,6 +1283,7 @@ files:
1240
1283
  - lib/plutonium/testing/resource_interaction.rb
1241
1284
  - lib/plutonium/testing/resource_model.rb
1242
1285
  - lib/plutonium/testing/resource_policy.rb
1286
+ - lib/plutonium/translation.rb
1243
1287
  - lib/plutonium/ui.rb
1244
1288
  - lib/plutonium/ui/action_button.rb
1245
1289
  - lib/plutonium/ui/actions_dropdown.rb
@@ -1256,6 +1300,13 @@ files:
1256
1300
  - lib/plutonium/ui/component/section.rb
1257
1301
  - lib/plutonium/ui/component/tokens.rb
1258
1302
  - lib/plutonium/ui/component_classes.rb
1303
+ - lib/plutonium/ui/dashboard/board.rb
1304
+ - lib/plutonium/ui/dashboard/card.rb
1305
+ - lib/plutonium/ui/dashboard/chart.rb
1306
+ - lib/plutonium/ui/dashboard/custom.rb
1307
+ - lib/plutonium/ui/dashboard/frame.rb
1308
+ - lib/plutonium/ui/dashboard/metric.rb
1309
+ - lib/plutonium/ui/dashboard/skeleton.rb
1259
1310
  - lib/plutonium/ui/display/base.rb
1260
1311
  - lib/plutonium/ui/display/components/association.rb
1261
1312
  - lib/plutonium/ui/display/components/attachment.rb
@@ -1326,6 +1377,7 @@ files:
1326
1377
  - lib/plutonium/ui/nav_user.rb
1327
1378
  - lib/plutonium/ui/options/has_cents_field.rb
1328
1379
  - lib/plutonium/ui/page/base.rb
1380
+ - lib/plutonium/ui/page/dashboard.rb
1329
1381
  - lib/plutonium/ui/page/edit.rb
1330
1382
  - lib/plutonium/ui/page/index.rb
1331
1383
  - lib/plutonium/ui/page/interactive_action.rb
@@ -1401,11 +1453,10 @@ files:
1401
1453
  - package.json
1402
1454
  - plutonium-blog-post.md
1403
1455
  - plutonium.gemspec
1456
+ - postcss-gem-import.cjs
1404
1457
  - postcss-gem-import.js
1405
1458
  - postcss.config.js
1406
1459
  - public/.keep
1407
- - public/plutonium-assets/application.js
1408
- - public/plutonium-assets/plutonium.ico
1409
1460
  - sig/.keep
1410
1461
  - src/.npmignore
1411
1462
  - src/css/components.css
@@ -1424,6 +1475,7 @@ files:
1424
1475
  - src/js/controllers/breadcrumbs_controller.js
1425
1476
  - src/js/controllers/bulk_actions_controller.js
1426
1477
  - src/js/controllers/capture_url_controller.js
1478
+ - src/js/controllers/chart_controller.js
1427
1479
  - src/js/controllers/clipboard_controller.js
1428
1480
  - src/js/controllers/color_mode_controller.js
1429
1481
  - src/js/controllers/currency_input_controller.js
@@ -1433,6 +1485,7 @@ files:
1433
1485
  - src/js/controllers/flatpickr_controller.js
1434
1486
  - src/js/controllers/form_controller.js
1435
1487
  - src/js/controllers/frame_navigator_controller.js
1488
+ - src/js/controllers/frame_refresh_controller.js
1436
1489
  - src/js/controllers/icon_rail_controller.js
1437
1490
  - src/js/controllers/icon_rail_flyout_controller.js
1438
1491
  - src/js/controllers/intl_tel_input_controller.js
@@ -1462,6 +1515,8 @@ files:
1462
1515
  - src/js/controllers/wizard_controller.js
1463
1516
  - src/js/core.js
1464
1517
  - src/js/drag/sortable.js
1518
+ - src/js/i18n.js
1519
+ - src/js/plutonium-charts.js
1465
1520
  - src/js/plutonium.js
1466
1521
  - src/js/support/dom_element.js
1467
1522
  - src/js/support/mime_icon.js
@@ -1472,7 +1527,6 @@ files:
1472
1527
  - src/js/turbo/turbo_frame_monkey_patch.js
1473
1528
  - tailwind.config.js
1474
1529
  - tailwind.options.js
1475
- - yarn.lock
1476
1530
  homepage: https://radioactive-labs.github.io/plutonium-core/
1477
1531
  licenses:
1478
1532
  - MIT
@@ -1481,20 +1535,6 @@ metadata:
1481
1535
  rubygems_mfa_required: 'true'
1482
1536
  homepage_uri: https://radioactive-labs.github.io/plutonium-core/
1483
1537
  source_code_uri: https://github.com/radioactive-labs/plutonium-core
1484
- post_install_message: |
1485
- ⚠️ Ruby 3.2 support ends in the NEXT release
1486
-
1487
- This is the last Plutonium release that installs on Ruby 3.2.
1488
-
1489
- Why: pagy patches CVE-2026-54659 (a path-traversal in
1490
- `Pagy::I18n.locale=`) only in >= 43.5.6, and pagy dropped Ruby 3.2 in
1491
- 43.5.0. No pagy version is both patched and installable on 3.2, so
1492
- continuing to support it means shipping a known-vulnerable dependency.
1493
-
1494
- Ruby 3.2 reached end-of-life in March 2026.
1495
-
1496
- Action: upgrade to Ruby 3.3 or newer before your next Plutonium bump.
1497
- If you stay on 3.2, `bundle update plutonium` will hold you here.
1498
1538
  rdoc_options: []
1499
1539
  require_paths:
1500
1540
  - lib
@@ -1502,7 +1542,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
1502
1542
  requirements:
1503
1543
  - - ">="
1504
1544
  - !ruby/object:Gem::Version
1505
- version: 3.2.2
1545
+ version: '3.3'
1506
1546
  required_rubygems_version: !ruby/object:Gem::Requirement
1507
1547
  requirements:
1508
1548
  - - ">="
data/.yarnrc.yml DELETED
@@ -1,8 +0,0 @@
1
- approvedGitRepositories:
2
- - "**"
3
-
4
- enableScripts: true
5
-
6
- nodeLinker: node-modules
7
-
8
- npmMinimalAgeGate: 0
@@ -1,12 +0,0 @@
1
- # Work around for https://github.com/hotwired/turbo-rails/issues/512
2
- # When ActionCable is not loaded, Turbo breaks boot
3
- Rails.autoloaders.once.do_not_eager_load("#{Turbo::Engine.root}/app/channels") unless defined?(ActionCable)
4
-
5
- # Work around for https://github.com/hotwired/turbo-rails/issues/535
6
- Rails.application.config.after_initialize do
7
- Turbo::Streams::BroadcastStreamJob.class_eval do
8
- def self.perform_later(stream, content:)
9
- super(stream, content: content.to_str)
10
- end
11
- end
12
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "../../lib/plutonium_generators"
4
-
5
- module Pu
6
- module Field
7
- class InputGenerator < Rails::Generators::Base
8
- include PlutoniumGenerators::Generator
9
-
10
- source_root File.expand_path("templates", __dir__)
11
-
12
- desc "Generates a field input"
13
-
14
- argument :name
15
-
16
- def start
17
- in_root do
18
- template "input.rb", "app/plutonium/fields/inputs/#{name.underscore}_input.rb"
19
- insert_into_file "config/initializers/plutonium.rb", registration_statement, after: /.*# Register components here.*\n/
20
- end
21
- rescue => e
22
- exception "#{self.class} failed:", e
23
- end
24
-
25
- private
26
-
27
- def registration_statement
28
- indent "Plutonium::Core::Fields::Inputs::Factory.map_type :#{name.underscore}, to: Fields::Inputs::#{name.camelize}Input\n", 2
29
- end
30
- end
31
- end
32
- end
@@ -1,15 +0,0 @@
1
- module Fields
2
- module Inputs
3
- class <%= name.camelize %>Input < Plutonium::Core::Fields::Inputs::Base
4
- def render
5
- form.input name, **options
6
- end
7
-
8
- private
9
-
10
- def input_options
11
- {}
12
- end
13
- end
14
- end
15
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "yaml"
4
-
5
- module PlutoniumGenerators
6
- module Concerns
7
- module Config
8
- def write_config(scope, **kwargs)
9
- write_config! config.deep_merge({scope => kwargs})
10
- end
11
-
12
- def read_config(scope, key, default: nil)
13
- config.dig(scope, key) || default
14
- end
15
-
16
- private
17
-
18
- def config
19
- in_root do
20
- if File.exist? config_filename
21
- YAML.load_file(config_filename, permitted_classes: [Regexp, Symbol]) || {}
22
- else
23
- {}
24
- end
25
- end
26
- end
27
-
28
- def write_config!(config)
29
- in_root do
30
- File.write(config_filename, YAML.dump(config))
31
- end
32
- end
33
-
34
- def config_filename
35
- ".pu"
36
- end
37
- end
38
- end
39
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module PlutoniumGenerators
4
- module Concerns
5
- module Serializer
6
- private
7
-
8
- def serialize_value(value)
9
- case value
10
- when Symbol
11
- ":#{value}"
12
- when String
13
- serialize_string value
14
- when Integer, Float, BigDecimal
15
- serialize_number value
16
- when Enumerable
17
- serialize_enumerable value
18
- when nil
19
- "nil"
20
- else
21
- # debug "Unable to serialize a value '#{value}:#{value.class}'"
22
- value
23
- end
24
- end
25
-
26
- def serialize_string(value)
27
- "'#{value.gsub("'", "\\\\'")}'"
28
- end
29
-
30
- def serialize_number(num)
31
- num.to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, '\\1_')
32
- end
33
-
34
- def serialize_enumerable(enum)
35
- "[#{enum.entries.map { |val| serialize_value val }.join ", "}]"
36
- end
37
- end
38
- end
39
- end
@@ -1,205 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "semantic_range"
4
- require "yaml"
5
-
6
- module PlutoniumGenerators
7
- module Installer
8
- def self.included(base)
9
- base.send :source_root, File.expand_path("lib/generators/pu/setup/_templates", PlutoniumGenerators::ROOT_DIR)
10
-
11
- base.send :class_option, :interactive, type: :boolean, desc: "Show prompts. Default: true"
12
- base.send :class_option, :bundle, type: :boolean, desc: "Run bundle after setup. Default: true"
13
- base.send :class_option, :lint, type: :boolean, desc: "Run linter after generation. Default: false"
14
- base.send :class_option, :pug_id, type: :numeric, default: 0,
15
- desc: "Used internally by plutonium generators. " \
16
- "Do not set this value as it might lead to unspecified behaviour."
17
- base.send :class_option, :force, type: :boolean, default: false,
18
- desc: "Force installation even if it have been previously installed."
19
- end
20
-
21
- protected
22
-
23
- def install!(feature)
24
- # set_ruby_version! if root_pug?
25
-
26
- from_version = read_config(:installed, feature, default: "0.0.0")
27
- versions = methods.map do |m|
28
- m.to_s.match(/install_v([\d_]+)/)&.[](1)&.tr("_", ".")
29
- end
30
- versions = versions.select do |version|
31
- force? || SemanticRange.satisfies?(version, ">#{from_version}")
32
- end.compact.sort
33
-
34
- if versions.any?
35
- versions.each do |version|
36
- log :install!, "#{feature} v#{version}"
37
- send :"install_v#{version.tr(".", "_")}!"
38
- end
39
-
40
- installed_version = versions.last
41
- write_config :installed, feature => installed_version
42
-
43
- if root_pug?
44
- if bundle?
45
- bundle!
46
- # run last minute bundle changes
47
- bundle! false
48
- end
49
-
50
- begin
51
- log :rubocop, "autocorrect"
52
- run_eval "bundle exec standardrb --fix"
53
- rescue
54
- # Do nothing
55
- end
56
-
57
- success "Successfully installed #{feature} v#{installed_version}"
58
- end
59
- else
60
- debug "Skipping installation of #{feature}. No new versions since v#{from_version}."
61
- end
62
- rescue => e
63
- exception "#{self.class.desc} failed:", e
64
- end
65
-
66
- def add_gem(name, **)
67
- log :add_gem, name
68
- before_bundle(:gem, name, **)
69
- end
70
-
71
- def rubocop(library = nil)
72
- log :rubocop, "install #{library}"
73
-
74
- add_gem "rubocop", group: :development, require: false
75
-
76
- in_root do
77
- rubocop_file = ".rubocop.yml"
78
- if File.exist?(rubocop_file)
79
- rubocop_def = YAML.load_file(rubocop_file)
80
- rubocop_def["require"] ||= []
81
- else
82
- rubocop_def = {
83
- "require" => [],
84
- "Style/FrozenStringLiteralComment" => {"SafeAutoCorrect" => true},
85
- "Style/ClassAndModuleChildren" => {"SafeAutoCorrect" => true}
86
- }
87
- end
88
-
89
- if library.present?
90
- library = "rubocop-#{library}"
91
- add_gem library, group: :development, require: false
92
- rubocop_def["require"] << library
93
- end
94
-
95
- rubocop_def["require"].uniq!
96
- create_file rubocop_file, YAML.dump(rubocop_def), force: true, verbose: false
97
- end
98
- end
99
-
100
- def after_bundle(command, *args, **kwargs)
101
- add_task_after(:bundle, [command, args, kwargs])
102
- end
103
-
104
- def before_bundle(command, *args, **kwargs)
105
- add_task_before(:bundle, [command, args, kwargs])
106
- end
107
-
108
- def yes?(statement, color = nil)
109
- !interactive? || super
110
- end
111
-
112
- def interactive?
113
- options[:interactive] != false
114
- end
115
-
116
- def bundle?
117
- options[:bundle] != false
118
- end
119
-
120
- def lint?
121
- options[:lint] == true
122
- end
123
-
124
- def pug(command)
125
- args = options.slice("lint", "interactive").map { |k, v| "--#{k} #{v}" }.join " "
126
- generate "pu:#{command} --pug-id=#{depth + 1} --force=#{force?} #{args}"
127
- end
128
-
129
- private
130
-
131
- def bundle!(run_tasks = true)
132
- log :bundle, "install"
133
-
134
- execute_tasks_before! :bundle if run_tasks
135
- Bundler.with_unbundled_env do
136
- run "bundle install", verbose: false
137
- end
138
- execute_tasks_after! :bundle if run_tasks
139
- end
140
-
141
- def add_task(event, action, task)
142
- log :add_task, "#{event} #{action}: #{task}"
143
-
144
- key = :"tasks_#{event}"
145
- tasks = read_config(key, action, default: [])
146
- tasks << task
147
- write_config(key, action => tasks)
148
- end
149
-
150
- def execute_tasks!(event, action)
151
- log :execute_tasks!, "#{event} #{action}"
152
-
153
- key = :"tasks_#{event}"
154
- tasks = read_config(key, action, default: [])
155
- tasks.each do |a|
156
- task = a[0]
157
- args = a[1] || []
158
- kwargs = a[2] || {}
159
-
160
- log :execute_task, "#{event} #{action}: #{task}"
161
- send task, *args, **kwargs
162
- end
163
-
164
- write_config(key, action => [])
165
- end
166
-
167
- def add_task_before(action, task)
168
- add_task :before, action, task
169
- end
170
-
171
- def add_task_after(action, task)
172
- add_task :after, action, task
173
- end
174
-
175
- def execute_tasks_before!(action)
176
- execute_tasks! :before, action
177
- end
178
-
179
- def execute_tasks_after!(action)
180
- execute_tasks! :after, action
181
- end
182
-
183
- def depth
184
- options[:pug_id]
185
- end
186
-
187
- def force?
188
- options[:force]
189
- end
190
-
191
- def root_pug?
192
- depth == 0
193
- end
194
-
195
- # def process(cmd)
196
- # stdout, stderr, status = Open3.capture3(cmd + ";")
197
- # case status.exitstatus
198
- # when 0
199
- # stdout
200
- # else
201
- # raise stderr
202
- # end
203
- # end
204
- end
205
- end