v1.5.0-rc.12
[1.5.0-rc.12] — 2026-04-22
Fixed
- #315 — Self-update now works against private registries whose
registry.urlis stored as the v2 API base (e.g.https://ghcr.io/v2).resolveHelperImagein the Docker action trigger was building the helper image reference by concatenatingregistry.urlverbatim withname:tag, producinghttps://ghcr.io/v2/codeswhat/drydock:1.5.0— which Docker'sPOST /containers/createrejects with HTTP 400. The fix normalizes the reference to matchRegistry.getImageFullName(scheme and/v2stripped) so the self-update helper spawn uses the same image shape as the pull path. No-scheme / no-v2 registries fall back toname:tag. - #309 — Status column in the Containers list now shows its label alongside the icon at typical widths. The column was width-capped at 90px which fell below the shared
dd-cell-show-80container-query threshold (80px) once the 10px padding was subtracted — widened to 120px so the label renders whenever the column is visible. - #291 (rc.11 follow-up) — Terminal update toasts (
Updated: <name>/Update failed: <name>/Rolled back: <name>) now fire after the operation display hold ends instead of on the raw terminal SSE. The container row stays visually in "updating" for another 1.5s (OPERATION_DISPLAY_HOLD_MS) after the terminal event so it settles without flicker, but the toast was announcing the outcome before the UI reflected it. Wrapped the three terminal toast calls insetTimeout(..., OPERATION_DISPLAY_HOLD_MS)in bothContainersView.applyOperationPatchandDashboardView.handleTerminalOperationSseso the row releases first and the toast lands right after. - Dashboard fly-in animation on update actions — Three
fetchDashboardData()calls inDashboardView(single-updateonAccepted,onStale, and the update-all finalizer) were refreshing without{ background: true }, which flippedstate.loadingto true and caused the<GridLayout v-if="!loading">to unmount and remount — re-triggering grid-layout-plus's initial positioning transitions (the "fly in from the left" rebuild reporters saw after every update). Switched those three calls to the background variant so the grid stays mounted and only the underlying widget data refreshes in place. - Pre-push e2e hook timeout —
scripts/run-e2e-tests.shunconditionally restarted Colima before every run, which scaled badly once the dev host accumulated QA fixtures (VM cold-boot with 45+ attached containers exceeded the lefthook 10m timeout before cucumber started). DefaultDD_E2E_RESTART_COLIMAtoauto— skip the restart whendocker infoalready succeeds, and only force one when the engine is actually wedged. Set totrue/falseto override.
Security
- fast-xml-parser override 5.5.8 → 5.7.1 — Addresses GHSA-gh4j-gqv2-49f6 / CVE-2026-41650 (XML comment/CDATA injection via unescaped delimiters in
XMLBuilder, medium). Vulnerable range ≤ 5.5.12, patched in 5.7.0; bumped bothapp/ande2e/workspace overrides to 5.7.1 (latest). - uuid 13.0.0 → 14.0.0 — Addresses GHSA-w5hq-g745-h8pq (missing buffer bounds check in
v3/v5/v6whenbufis provided, medium). Vulnerable range ≤ 13.0.0, patched in 14.0.0. Drydock only usesv4(unaffected by the buffer path) but the scanner flags any vulnerable version in the tree. Bumped the app's direct dep and addeduuid: 14.0.0to bothapp/ande2e/overrides so transitive callers (dockerode, artillery, @azure/msal-node, @ngneat/falso) also resolve the patched version.
Performance
- Granular SSE container patch — Container list updates triggered by
dd:sse-container-added/-updated/-removednow patch the local containers array in place instead of refetching the full list over HTTP. Preserves row identity via a prototype-chain merge so Vue's reactivity system reuses the existing row DOM nodes, eliminating the post-SSE flicker and the polling refetch that the previous debounced-reload path required. shallowRefforheldOperationsmap — The operation display-hold store swapped from a deepref(Map)toshallowRef(Map)plus explicittriggerRefon mutation. Avoids Vue walking the entire map on every held-row render in large inventories.
Changed
- Expand all / Collapse all bulk toggle — Replaced the single chevron toggle in the Containers toolbar with an explicit "Expand all" / "Collapse all" button whose label reflects the current global expand state. Individual stack headers still toggle their own group; this is the bulk shortcut on top.
- Compact "Suggested" badge — The "Suggested" tag badge on container rows now renders compact (the full suggested tag moves into a tooltip on hover) so the row metadata band stays readable at narrower column widths.
Tests / CI
- Thin test hardening —
app/agent/index.test.tsgrew 5 → 11 tests. Existing coverage verified call counts but not argument correctness, same-instance registration, fire-and-forgetclient.init()behavior, skip-branch warning messages, or mixed valid/invalid registry state. Added behavioral assertions for each while keeping 100% coverage. - SSE / pending-poll / hold-release edge coverage — New tests for
useOperationDisplayHold,useContainerActions.pollPendingActionsState, andapplyDashboardContainerPatchclose the remaining uncovered branches (delete-no-op, in-flight poll guard, removed-kind patches, Object.assign merge, push-new, mapApiContainer throw, container-removed SSE listener). - QA compose fixture trims — Shrank test-fixture images so update flows finish in seconds instead of minutes, and swapped
timescaledb-ha→ non-HA to unblock scan tests that were failing against the HA variant's readiness probe. - Release pipeline fragility fixes — Three recurring CI failures in the release cut path addressed (see
a1ea1a82onfix/ci-release-fragility, renamed tofeature/v1.5-rc12).