diff --git a/CHANGELOG.md b/CHANGELOG.md index 2020649..0f5c877 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,40 @@ All notable changes to DashCaddy are documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.17.0] - 2026-10-07 + +### Added +- **DC-CATALOG-3: catalog deploys route through the shipdeck bridge.** The App Selector sends + `subdomain` to `POST /api/deploys/catalog`, which validates the label and forwards it to the + bridge; the route reads the bridge journal for service state instead of spawning a subprocess per + service. +- **Composition-root e2e suite.** `__tests__/e2e-node/composition-root.e2e.test.js` boots the real + app via `createApp()`, mints a JWT, and probes each mounted route against a nonexistent control + path in the identical request shape, so a real mount is distinguishable from an unknown route. +- **Shield route committed.** `routes/shield.js` (until now present only on the production host) is + tracked in git, mounted by `src/app.js`, and covered by `__tests__/shield-dc.routes.test.js`. + +### Fixed +- **DC-160: catalog detail returned empty template metadata.** `routes/catalog.js` reads + `app.docker.*` from the catalog template instead of the hand-rolled category map. +- **Deploy audit contract.** The catalog-deploy route calls + `auditLogger.log({action,resource,details,outcome,ip})` fire-and-forget — the same dependency + shape `src/app.js` injects — and the route test constructs that shape, so a divergence fails. +- **Bridge response handling is total.** Any non-plain-object body (`null`, arrays, empty) is + coerced into the same failure shape as a non-JSON body, so no `body.ok` dereference can 500 or + report a false success. +- **Subdomain labels.** Validation rejects leading and trailing hyphens and is length-bounded + (1-63 characters); the rejection table in the route suite covers both edges. +- **Boot timeout kills its child, exercised.** The e2e boot timeout is parameterized and a real test + drives it against a child that never reports readiness, asserting the killed child's `SIGKILL`. +- **Test port allocation.** The e2e child binds port 0 and reports the OS-assigned port, removing + the release-and-rebind race in the old `freePort` helper. + +### Notes +- Pre-existing and unrelated: `__tests__/billing/invoice.test.js` fails identically at the release + base (`1fa5ba8`) because it bundles a stale `pdf.js 1.10.100`; the failing set is measured, not + assumed, and recorded in the release evidence. + ## [Unreleased] ### Production-Grade Hardening Sprint (2026-08-12) diff --git a/dashcaddy-api/package.json b/dashcaddy-api/package.json index c5ed9c4..7530e60 100644 --- a/dashcaddy-api/package.json +++ b/dashcaddy-api/package.json @@ -1,6 +1,6 @@ { "name": "dashcaddy-api", - "version": "1.16.0", + "version": "1.17.0", "description": "DashCaddy API server - Dashboard backend for Docker, Caddy & DNS management", "main": "server.js", "engines": {