plutonium 0.60.5 → 0.61.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/SKILL.md +19 -1
- data/.claude/skills/plutonium-app/SKILL.md +41 -0
- data/.claude/skills/plutonium-auth/SKILL.md +40 -0
- data/.claude/skills/plutonium-behavior/SKILL.md +47 -1
- data/.claude/skills/plutonium-kanban/SKILL.md +313 -0
- data/.claude/skills/plutonium-resource/SKILL.md +40 -0
- data/.claude/skills/plutonium-tenancy/SKILL.md +43 -0
- data/.claude/skills/plutonium-testing/SKILL.md +38 -0
- data/.claude/skills/plutonium-ui/SKILL.md +51 -0
- data/.claude/skills/plutonium-wizard/SKILL.md +469 -0
- data/.cliff.toml +6 -0
- data/Appraisals +3 -0
- data/CHANGELOG.md +549 -439
- data/CLAUDE.md +15 -7
- data/app/assets/plutonium.css +1 -1
- data/app/assets/plutonium.js +895 -193
- data/app/assets/plutonium.js.map +4 -4
- data/app/assets/plutonium.min.js +53 -53
- data/app/assets/plutonium.min.js.map +4 -4
- data/app/views/layouts/basic.html.erb +7 -0
- data/app/views/plutonium/_flash_toasts.html.erb +2 -46
- data/app/views/plutonium/_toast.html.erb +52 -0
- data/app/views/resource/_resource_kanban.html.erb +1 -0
- data/db/migrate/wizard/20260615000001_create_plutonium_wizard_sessions.rb +57 -0
- data/docs/.vitepress/config.ts +24 -0
- data/docs/guides/index.md +2 -0
- data/docs/guides/kanban.md +447 -0
- data/docs/guides/wizards.md +447 -0
- data/docs/public/images/guides/kanban-after-move.png +0 -0
- data/docs/public/images/guides/kanban-board-light.png +0 -0
- data/docs/public/images/guides/kanban-board.png +0 -0
- data/docs/public/images/guides/kanban-show-centered-modal.png +0 -0
- data/docs/public/images/guides/kanban-wip-toast.png +0 -0
- data/docs/public/images/guides/wizards-chooser.png +0 -0
- data/docs/public/images/guides/wizards-completed.png +0 -0
- data/docs/public/images/guides/wizards-index-action.png +0 -0
- data/docs/public/images/guides/wizards-repeater.png +0 -0
- data/docs/public/images/guides/wizards-review.png +0 -0
- data/docs/public/images/guides/wizards-step.png +0 -0
- data/docs/reference/behavior/policies.md +1 -1
- data/docs/reference/index.md +14 -0
- data/docs/reference/kanban/authorization.md +62 -0
- data/docs/reference/kanban/dsl.md +293 -0
- data/docs/reference/kanban/index.md +40 -0
- data/docs/reference/kanban/positioning.md +162 -0
- data/docs/reference/resource/definition.md +16 -0
- data/docs/reference/ui/forms.md +36 -0
- data/docs/reference/ui/pages.md +2 -0
- data/docs/reference/wizard/anchoring-resume.md +194 -0
- data/docs/reference/wizard/dsl.md +332 -0
- data/docs/reference/wizard/index.md +33 -0
- data/docs/reference/wizard/one-time.md +129 -0
- data/docs/reference/wizard/registration-launch.md +177 -0
- data/docs/reference/wizard/storage-config.md +151 -0
- data/docs/superpowers/plans/2026-06-14-form-sectioning.md +2 -2
- data/docs/superpowers/plans/2026-06-15-wizard-dsl.md +1619 -0
- data/docs/superpowers/plans/2026-06-15-wizard-dsl.md.tasks.json +68 -0
- data/docs/superpowers/plans/2026-06-26-kanban-dsl.md +1128 -0
- data/docs/superpowers/plans/2026-06-26-kanban-dsl.md.tasks.json +24 -0
- data/docs/superpowers/specs/2026-06-15-wizard-dsl-design.md +836 -0
- data/docs/superpowers/specs/2026-06-15-wizard-dsl-examples.rb +245 -0
- data/docs/superpowers/specs/2026-06-17-wizard-relaunch-prompt-design.md +86 -0
- data/docs/superpowers/specs/2026-06-18-wizard-attachments-design.md +101 -0
- data/docs/superpowers/specs/2026-06-18-wizard-hosting-design.md +220 -0
- data/docs/superpowers/specs/2026-06-26-kanban-dsl-design.md +388 -0
- data/gemfiles/postgres.gemfile +8 -0
- data/gemfiles/postgres.gemfile.lock +321 -0
- data/gemfiles/rails_7.gemfile +1 -0
- data/gemfiles/rails_7.gemfile.lock +1 -1
- data/gemfiles/rails_8.0.gemfile +1 -0
- data/gemfiles/rails_8.0.gemfile.lock +1 -1
- data/gemfiles/rails_8.1.gemfile +1 -0
- data/gemfiles/rails_8.1.gemfile.lock +14 -1
- data/lib/generators/pu/invites/templates/packages/invites/app/controllers/invites/user_invitations_controller.rb.tt +6 -1
- data/lib/plutonium/action/base.rb +9 -0
- data/lib/plutonium/auth/rodauth.rb +1 -2
- data/lib/plutonium/configuration.rb +4 -0
- data/lib/plutonium/core/controller.rb +20 -1
- data/lib/plutonium/definition/base.rb +25 -0
- data/lib/plutonium/definition/form_layout.rb +54 -35
- data/lib/plutonium/definition/index_views.rb +54 -1
- data/lib/plutonium/definition/wizards.rb +209 -0
- data/lib/plutonium/invites/concerns/invite_token.rb +9 -0
- data/lib/plutonium/invites/concerns/invite_user.rb +9 -0
- data/lib/plutonium/invites/controller.rb +4 -1
- data/lib/plutonium/kanban/action.rb +7 -0
- data/lib/plutonium/kanban/board.rb +40 -0
- data/lib/plutonium/kanban/broadcaster.rb +54 -0
- data/lib/plutonium/kanban/column.rb +69 -0
- data/lib/plutonium/kanban/context.rb +15 -0
- data/lib/plutonium/kanban/dsl.rb +71 -0
- data/lib/plutonium/kanban/grouping.rb +51 -0
- data/lib/plutonium/kanban/positioning.rb +75 -0
- data/lib/plutonium/kanban.rb +11 -0
- data/lib/plutonium/migrations.rb +40 -0
- data/lib/plutonium/positioning.rb +146 -0
- data/lib/plutonium/railtie.rb +33 -0
- data/lib/plutonium/resource/controller.rb +2 -0
- data/lib/plutonium/resource/controllers/crud_actions.rb +1 -1
- data/lib/plutonium/resource/controllers/kanban_actions.rb +455 -0
- data/lib/plutonium/resource/controllers/wizard_actions.rb +165 -0
- data/lib/plutonium/resource/policy.rb +8 -0
- data/lib/plutonium/routing/mapper_extensions.rb +44 -0
- data/lib/plutonium/routing/wizard_registration.rb +289 -0
- data/lib/plutonium/ui/display/resource.rb +17 -12
- data/lib/plutonium/ui/form/base.rb +19 -5
- data/lib/plutonium/ui/form/components/password.rb +126 -0
- data/lib/plutonium/ui/form/components/uppy.rb +6 -3
- data/lib/plutonium/ui/form/options/inferred_types.rb +20 -0
- data/lib/plutonium/ui/form/resource.rb +1 -1
- data/lib/plutonium/ui/form/wizard.rb +63 -0
- data/lib/plutonium/ui/grid/card.rb +16 -5
- data/lib/plutonium/ui/kanban/card.rb +67 -0
- data/lib/plutonium/ui/kanban/color_dot.rb +36 -0
- data/lib/plutonium/ui/kanban/column.rb +324 -0
- data/lib/plutonium/ui/kanban/resource.rb +212 -0
- data/lib/plutonium/ui/layout/resource_layout.rb +7 -1
- data/lib/plutonium/ui/modal/base.rb +30 -3
- data/lib/plutonium/ui/modal/centered.rb +5 -2
- data/lib/plutonium/ui/page/index.rb +1 -0
- data/lib/plutonium/ui/page/show.rb +23 -0
- data/lib/plutonium/ui/page/wizard.rb +371 -0
- data/lib/plutonium/ui/page/wizard_chooser.rb +97 -0
- data/lib/plutonium/ui/page/wizard_completed.rb +86 -0
- data/lib/plutonium/ui/table/base.rb +1 -1
- data/lib/plutonium/ui/table/components/view_switcher.rb +2 -1
- data/lib/plutonium/ui/wizard/review.rb +196 -0
- data/lib/plutonium/ui/wizard/stepper.rb +122 -0
- data/lib/plutonium/ui/wizard/summary_display.rb +59 -0
- data/lib/plutonium/version.rb +1 -1
- data/lib/plutonium/wizard/attachment_data.rb +42 -0
- data/lib/plutonium/wizard/attachments.rb +226 -0
- data/lib/plutonium/wizard/base.rb +216 -0
- data/lib/plutonium/wizard/base_controller.rb +31 -0
- data/lib/plutonium/wizard/configuration.rb +42 -0
- data/lib/plutonium/wizard/controller.rb +162 -0
- data/lib/plutonium/wizard/data.rb +134 -0
- data/lib/plutonium/wizard/driving.rb +639 -0
- data/lib/plutonium/wizard/dsl.rb +336 -0
- data/lib/plutonium/wizard/errors.rb +27 -0
- data/lib/plutonium/wizard/field_capture.rb +157 -0
- data/lib/plutonium/wizard/field_importer.rb +208 -0
- data/lib/plutonium/wizard/gate.rb +171 -0
- data/lib/plutonium/wizard/instance_key.rb +97 -0
- data/lib/plutonium/wizard/lazy_persisted.rb +77 -0
- data/lib/plutonium/wizard/resume.rb +250 -0
- data/lib/plutonium/wizard/review_step.rb +48 -0
- data/lib/plutonium/wizard/route_resolution.rb +40 -0
- data/lib/plutonium/wizard/runner.rb +684 -0
- data/lib/plutonium/wizard/session.rb +53 -0
- data/lib/plutonium/wizard/state.rb +35 -0
- data/lib/plutonium/wizard/step.rb +61 -0
- data/lib/plutonium/wizard/step_adapter.rb +103 -0
- data/lib/plutonium/wizard/store/active_record.rb +174 -0
- data/lib/plutonium/wizard/store/base.rb +42 -0
- data/lib/plutonium/wizard/store/memory.rb +44 -0
- data/lib/plutonium/wizard/sweep_job.rb +76 -0
- data/lib/plutonium/wizard.rb +86 -0
- data/lib/plutonium.rb +5 -0
- data/lib/rodauth/features/case_insensitive_login.rb +1 -1
- data/lib/tasks/release.rake +144 -191
- data/package.json +3 -3
- data/src/css/components.css +132 -0
- data/src/js/controllers/attachment_input_controller.js +15 -1
- data/src/js/controllers/dirty_form_guard_controller.js +155 -27
- data/src/js/controllers/kanban_controller.js +330 -0
- data/src/js/controllers/password_sentinel_controller.js +39 -0
- data/src/js/controllers/register_controllers.js +6 -0
- data/src/js/controllers/remote_modal_controller.js +10 -0
- data/src/js/controllers/row_click_controller.js +14 -1
- data/src/js/controllers/wizard_controller.js +54 -0
- data/src/js/turbo/turbo_confirm.js +1 -1
- data/yarn.lock +271 -282
- metadata +100 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"planPath": "docs/superpowers/plans/2026-06-26-kanban-dsl.md",
|
|
3
|
+
"tasks": [
|
|
4
|
+
{"id": 0, "subject": "Task 0: Register :kanban index view + DSL entrypoint", "status": "completed", "blockedBy": [], "description": "Add :kanban to KNOWN_VIEWS; kanban{} appends :kanban + stores block.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/definition/index_views.rb\", \"test/plutonium/definition/kanban_index_view_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/plutonium/definition/kanban_index_view_test.rb\", \"acceptanceCriteria\": [\"KNOWN_VIEWS includes :kanban\", \"appends + stores block\", \"table not removed\"], \"requiresUserVerification\": false}\n```"},
|
|
5
|
+
{"id": 1, "subject": "Task 1: Plutonium::Positioning decimal concern", "status": "completed", "blockedBy": [], "description": "Standalone decimal ordering: midpoint/ends, rebalance, seed on create, backfill.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/positioning.rb\", \"lib/plutonium.rb\", \"test/plutonium/positioning_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/plutonium/positioning_test.rb\", \"acceptanceCriteria\": [\"midpoint+ends\", \"rebalance\", \"seed on create\", \"backfill\"], \"requiresUserVerification\": false}\n```"},
|
|
6
|
+
{"id": 2, "subject": "Task 2: Compile kanban DSL into Board/Column/Action", "status": "completed", "blockedBy": [3], "description": "Kanban::DSL.build -> Board/Column/Action; roles, behaviours, proc-or-symbol, board config, dynamic columns.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/kanban/dsl.rb\", \"lib/plutonium/kanban/board.rb\", \"lib/plutonium/kanban/column.rb\", \"lib/plutonium/kanban/action.rb\", \"lib/plutonium/kanban.rb\", \"lib/plutonium.rb\", \"test/plutonium/kanban/dsl_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/plutonium/kanban/dsl_test.rb\", \"acceptanceCriteria\": [\"columns in order\", \"roles overridable\", \"actions compile\", \"board config\", \"proc-or-symbol\"], \"requiresUserVerification\": false}\n```"},
|
|
7
|
+
{"id": 3, "subject": "Task 3: position_on strategy resolver (Mode A/B/C)", "status": "completed", "blockedBy": [1], "description": "Config + Strategy: Mode A delegates to Positioning, B yields move, C no-op; exposes order(relation) + reposition!.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/kanban/positioning.rb\", \"test/plutonium/kanban/positioning_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/plutonium/kanban/positioning_test.rb\", \"acceptanceCriteria\": [\"Config default/attr/block/disabled\", \"Mode A delegates\", \"Mode B yields move\", \"Mode C no-op\"], \"requiresUserVerification\": false}\n```"},
|
|
8
|
+
{"id": 4, "subject": "Task 4: Request Context + relation Grouping", "status": "completed", "blockedBy": [2, 3], "description": "Context (SimpleDelegator over view_context); Grouping groups authorized unpaginated relation, orders override default_sort, per_column caps, dynamic columns.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/kanban/context.rb\", \"lib/plutonium/kanban/grouping.rb\", \"test/plutonium/kanban/grouping_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/plutonium/kanban/grouping_test.rb\", \"acceptanceCriteria\": [\"context user/entity\", \"scope proc+symbol\", \"order overrides default_sort\", \"per_column caps\", \"dynamic columns\"], \"requiresUserVerification\": false}\n```"},
|
|
9
|
+
{"id": 5, "subject": "Task 5: kanban_move? policy predicate -> update?", "status": "completed", "blockedBy": [], "description": "Delegating predicate; read-only board when false; overridable.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/resource/policy.rb\", \"test/plutonium/resource/kanban_policy_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/plutonium/resource/kanban_policy_test.rb\", \"acceptanceCriteria\": [\"defaults to update?\", \"overridable\"], \"requiresUserVerification\": false}\n```"},
|
|
10
|
+
{"id": 6, "subject": "Task 6: kanban_column lazy frame endpoint", "status": "completed", "blockedBy": [4, 9, 15], "description": "Render one column's cards (frame src) from authorized unpaginated query-applied relation; unknown column safe.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/resource/controllers/kanban_actions.rb\", \"lib/plutonium/resource/controller.rb\", \"test/integration/admin_portal/kanban_column_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/integration/admin_portal/kanban_column_test.rb\", \"acceptanceCriteria\": [\"renders one column\", \"unpaginated authorized\", \"unknown safe\"], \"requiresUserVerification\": false}\n```"},
|
|
11
|
+
{"id": 7, "subject": "Task 7: Move action (drop policy, on_drop, position, wip)", "status": "completed", "blockedBy": [4, 5, 3, 6, 15], "description": "Direct non-form move action; kanban_move?, accepts/locked, on_drop, fractional position, wip, frame response, snap-back.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/resource/controllers/kanban_actions.rb\", \"test/integration/admin_portal/kanban_move_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/integration/admin_portal/kanban_move_test.rb\", \"acceptanceCriteria\": [\"on_drop+position\", \"403 read-only\", \"422 accepts/locked\", \"422 wip\", \"from+to frames\", \"symbol on_drop\"], \"requiresUserVerification\": false}\n```"},
|
|
12
|
+
{"id": 8, "subject": "Task 8: Column actions via interactive_bulk_action", "status": "completed", "blockedBy": [6, 9, 15], "description": "Column header actions resolve ids by on:; link to bulk_actions; policy-gated.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/resource/controllers/kanban_actions.rb\", \"lib/plutonium/ui/kanban/column.rb\", \"test/integration/admin_portal/kanban_column_action_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/integration/admin_portal/kanban_column_action_test.rb\", \"acceptanceCriteria\": [\":all beyond per_column\", \":visible capped\", \"links bulk\", \"policy-gated\"], \"requiresUserVerification\": false}\n```"},
|
|
13
|
+
{"id": 9, "subject": "Task 9: Phlex board shell + column + card", "status": "completed", "blockedBy": [2, 4], "description": "Kanban::Resource (lazy frames), Column (cards/+N/wip/collapsed), Card (reuses grid card).\n\n```json:metadata\n{\"files\": [\"lib/plutonium/ui/kanban/resource.rb\", \"lib/plutonium/ui/kanban/column.rb\", \"lib/plutonium/ui/kanban/card.rb\", \"test/plutonium/ui/kanban/resource_test.rb\", \"test/plutonium/ui/kanban/column_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/plutonium/ui/kanban/resource_test.rb\", \"acceptanceCriteria\": [\"lazy frames\", \"+N more\", \"wip badge\", \"grid card reuse\", \"collapsed\"], \"requiresUserVerification\": false}\n```"},
|
|
14
|
+
{"id": 10, "subject": "Task 10: Wire board into index page + switcher", "status": "completed", "blockedBy": [9, 0], "description": "when :kanban render branch + switcher segment; cookie sticky.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/ui/page/index.rb\", \"lib/plutonium/ui/table/components/view_switcher.rb\", \"test/integration/admin_portal/kanban_index_view_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/integration/admin_portal/kanban_index_view_test.rb\", \"acceptanceCriteria\": [\"?view=kanban renders\", \"switcher segment\", \"cookie sticky\"], \"requiresUserVerification\": false}\n```"},
|
|
15
|
+
{"id": 11, "subject": "Task 11: Stimulus kanban_controller drag+move", "status": "completed", "blockedBy": [7, 10], "description": "Drag across frames, POST move, response reconciles + snap-back; register + yarn build.\n\n```json:metadata\n{\"files\": [\"src/js/controllers/kanban_controller.js\", \"src/js/controllers/register_controllers.js\", \"test/system/kanban_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/system/kanban_test.rb\", \"acceptanceCriteria\": [\"drag posts move\", \"reconcile+snap-back\", \"registered+built\"], \"requiresUserVerification\": false}\n```"},
|
|
16
|
+
{"id": 12, "subject": "Task 12: Per-column quick-add (add: true)", "status": "completed", "blockedBy": [9, 6], "description": "+Add on add:true columns; create seeds on_drop + end position; create? gates.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/ui/kanban/column.rb\", \"lib/plutonium/resource/controllers/kanban_actions.rb\", \"test/integration/admin_portal/kanban_quick_add_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/integration/admin_portal/kanban_quick_add_test.rb\", \"acceptanceCriteria\": [\"+Add renders\", \"seeds on_drop+pos\", \"create? gates\"], \"requiresUserVerification\": false}\n```"},
|
|
17
|
+
{"id": 13, "subject": "Task 13: Column behaviour UI (collapse, drop, wip)", "status": "completed", "blockedBy": [9, 11], "description": "Collapse toggle, accepts/locked client constraints, wip badge + over-limit.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/ui/kanban/column.rb\", \"src/js/controllers/kanban_controller.js\", \"test/plutonium/ui/kanban/behaviours_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/plutonium/ui/kanban/behaviours_test.rb\", \"acceptanceCriteria\": [\"collapse toggle\", \"client constraints\", \"wip badge\"], \"requiresUserVerification\": false}\n```"},
|
|
18
|
+
{"id": 14, "subject": "Task 14: Opt-in real-time broadcaster", "status": "completed", "blockedBy": [7, 9], "description": "realtime mirrors success frames to other viewers, tenant+board scoped; off by default.\n\n```json:metadata\n{\"files\": [\"lib/plutonium/kanban/broadcaster.rb\", \"lib/plutonium/resource/controllers/kanban_actions.rb\", \"lib/plutonium/ui/kanban/resource.rb\", \"test/plutonium/kanban/broadcaster_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/plutonium/kanban/broadcaster_test.rb\", \"acceptanceCriteria\": [\"tenant+board scoped\", \"only when realtime\", \"subscribes only when realtime\"], \"requiresUserVerification\": false}\n```"},
|
|
19
|
+
{"id": 15, "subject": "Task 15: Dummy Task board fixture + smoke test", "status": "completed", "blockedBy": [0, 1, 2, 5], "description": "Generate Task resource (status + decimal position) via pu generators, add kanban board + dummy interaction, smoke test.\n\n```json:metadata\n{\"files\": [\"test/dummy/app/models/task.rb\", \"test/dummy/app/definitions/task_definition.rb\", \"test/integration/admin_portal/kanban_smoke_test.rb\"], \"verifyCommand\": \"bundle exec appraisal rails-8.1 ruby -Itest test/integration/admin_portal/kanban_smoke_test.rb\", \"acceptanceCriteria\": [\"scaffolded Task decimal position\", \"kanban board\", \"smoke render+move+action\"], \"requiresUserVerification\": false}\n```"},
|
|
20
|
+
{"id": 16, "subject": "Task 16: Documentation (guide + reference)", "status": "completed", "blockedBy": [14], "description": "docs/guides/kanban.md + docs/reference/kanban/* + nav; yarn docs:build clean.\n\n```json:metadata\n{\"files\": [\"docs/guides/kanban.md\", \"docs/reference/kanban/index.md\", \"docs/reference/kanban/dsl.md\", \"docs/.vitepress/config.ts\"], \"verifyCommand\": \"yarn docs:build\", \"acceptanceCriteria\": [\"covers all features\", \"docs build clean\"], \"requiresUserVerification\": false}\n```"},
|
|
21
|
+
{"id": 17, "subject": "Task 17: plutonium-kanban skill + router entry", "status": "completed", "blockedBy": [16], "description": "Skill mirroring plutonium-wizard + router row in plutonium/SKILL.md.\n\n```json:metadata\n{\"files\": [\".claude/skills/plutonium-kanban/SKILL.md\", \".claude/skills/plutonium/SKILL.md\"], \"verifyCommand\": \"git grep -n plutonium-kanban .claude/skills/plutonium/SKILL.md\", \"acceptanceCriteria\": [\"skill written\", \"router entry\"], \"requiresUserVerification\": false}\n```"}
|
|
22
|
+
],
|
|
23
|
+
"lastUpdated": "2026-06-26"
|
|
24
|
+
}
|