Pipelines never paid off as a separate module kind, so peel out:
- Engine: drop pipeline_handler, remove "pipeline" from valid module
types in repositories + schema parity.
- Manager: delete Pipelines/PipelineEditor views, PipelineSteps +
PipelineStepPicker components and their tests. Router, sidebar,
topbar, dashboard, TestRunner, ImportExport, resolver and
bundleSelection repointed off the removed routes/types.
- wp_api: drop pipeline branch from modules.py + import_export.py
(and its test).
In its place, add a unified library view:
- src/manager/views/AllItems.vue — modules + bundles in one filter
panel with kind multi-select (OR across the 6 kinds). Reachable
via the Dashboard "View all" link.
- ModuleListView grew the slots/props AllItems needs; BundleAddChild
+ Dashboard + ImportExport updated alongside.
Misc polish along the way: kind-icons / theme tokens / display-prefs
touch-ups, ContextWidget + DebugViewer + AssemblerHelper small fixes,
MockModuleCard + ModulePickerModal tweaks, _shared widget cleanup.
One-shot Python migration that walks every existing constraint module's
payload.matrix and rewrites rows keyed by source-option VALUE to be
keyed by source SUB_CATEGORY instead. Closes the data-shape gap left
by the d47e50e SPA flip (matrix UI is now subcat × subcat) — without
this script, legacy constraints still have value-keyed rows that
render zero cells in the new editor.
Behavior:
- Already subcat-keyed rows are kept (idempotent, safe to re-run).
- Value rows are remapped via source.payload.options[*].sub_category
lookup; multiple values mapping to the same subcat merge cells (last
cell wins per target column, with a `merged` warning in the log).
- Orphan rows (neither subcat nor known option value) are dropped.
- Missing/broken source_wildcard_id → constraint skipped with a `!`
warning, no crash.
- --dry-run flag prints the plan without writing.
Also updates seed_mock_data.py:shirt_x_color_compat to use the new
subcat-keyed shape (formal × warm reduce) plus carries the original
"white linen × red exclude" intent into the exceptions table — so
re-seeding a fresh DB doesn't reintroduce the legacy shape.