From 049221ceff6223ff10fae49c0cb9757368c565bf Mon Sep 17 00:00:00 2001 From: Jarek Krochmalski Date: Wed, 2 Sep 2026 15:52:45 +0200 Subject: [PATCH] release housekeeping and generated api spec --- VERSION | 2 +- package.json | 2 +- src/lib/data/changelog.json | 23 +++++++++++---- src/lib/openapi.generated.json | 52 ++++++++++++++++++++++++++++------ 4 files changed, 64 insertions(+), 15 deletions(-) diff --git a/VERSION b/VERSION index 035e1ac..daf2340 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v1.0.45 +v1.0.46 diff --git a/package.json b/package.json index 49a9d60..e6587e3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "dockhand", "private": true, - "version": "1.0.45", + "version": "1.0.46", "type": "module", "scripts": { "dev": "npx vite dev", diff --git a/src/lib/data/changelog.json b/src/lib/data/changelog.json index 93e9ed0..6a7934e 100644 --- a/src/lib/data/changelog.json +++ b/src/lib/data/changelog.json @@ -1,13 +1,26 @@ [ { "version": "1.0.46", - "date": "", - "comingSoon": true, + "date": "2026-09-02", "changes": [ - { "type": "feature", "text": "restart a stack in depends_on order (#1480)" }, - { "type": "fix", "text": "cache app icons so the containers and stacks pages load faster" }, + { "type": "feature", "text": "restart a stack in depends_on order, keeping the same containers (#1480)" }, + { "type": "feature", "text": "allow secret-less git webhooks via the ALLOW_WEBHOOKS_WITHOUT_SECRET env var" }, + { "type": "feature", "text": "optional STACKS_DIR flat layout for local stacks (#514, #778, PR#1482, @xd003)" }, + { "type": "fix", "text": "faster incremental backups when multiple stacks share one repository (#1494)" }, + { "type": "fix", "text": "\"disable build cache\" no longer errors on deploy (#1479, PR#1020, @He-Is-HaZaRdOuS)" }, + { "type": "fix", "text": "test connection on a saved environment without re-entering the token (#1483)" }, + { "type": "fix", "text": "populate environment variables again finds the repo's .env file (#1495)" }, + { "type": "fix", "text": "POST /api/stacks honors the target environment in the body (#1491)" }, + { "type": "fix", "text": "large image scans no longer fail when the scanner log rotates (#1496)" }, + { "type": "fix", "text": "Compose Validate no longer false-flags a valid env_file (#1497)" }, + { "type": "fix", "text": "cache app icons in one request so the containers and stacks pages load faster" }, { "type": "fix", "text": "upgrade svelte to 5.56.10 (#1476, PR#1477, @ThanatosDi)" }, - { "type": "fix", "text": "refresh the bundled docker-compose (5.5.0-r2)" } + { "type": "fix", "text": "refresh the bundled docker-compose (5.5.0-r2)" }, + { "type": "fix", "text": "stricter per-environment access and permission checks across the API" }, + { "type": "fix", "text": "redact secret values from compose command output and restrict backup restore targets" }, + { "type": "fix", "text": "local-path backup destinations now reject a host path that isn't a Dockhand bind mount (#1506)" }, + { "type": "fix", "text": "escape $ in env values when generating a compose file from a container (#1507)" }, + { "type": "fix", "text": "clearer git permission errors that match the credential type (token vs SSH key) (#1509)" } ], "imageTag": "fnsys/dockhand:v1.0.46" }, diff --git a/src/lib/openapi.generated.json b/src/lib/openapi.generated.json index 8d67400..ac8d59c 100644 --- a/src/lib/openapi.generated.json +++ b/src/lib/openapi.generated.json @@ -2,7 +2,7 @@ "openapi": "3.0.3", "info": { "title": "Dockhand API", - "version": "1.0.45", + "version": "1.0.46", "description": "Auto-generated from src/routes/**/+server.ts by scripts/generate-openapi.ts. Path, HTTP method, tag, and auth requirement are derived automatically from the route tree and hooks.server.ts PUBLIC_PATHS. Parameters, response status codes, and request body fields are additionally auto-detected from each handler’s own source (query params via url.searchParams, status codes via status:/error(), body fields via destructuring) — adding a new endpoint therefore requires ZERO manual spec edits to show up with real params/responses. An optional, additive `@openapi` JSDoc annotation on a handler replaces the generic auto-descriptions with hand-written summaries, exact types, and examples." }, "servers": [ @@ -6860,7 +6860,7 @@ "description": "Directory listing (entries with name, type, size and permission metadata)" }, "403": { - "description": "Permission denied" + "description": "Permission denied (needs containers:exec)" }, "404": { "description": "Container not found" @@ -7063,7 +7063,7 @@ "description": "Path is missing, the target is a directory, or the container is not running" }, "403": { - "description": "Permission denied to read the file" + "description": "Permission denied to read the file (needs containers:exec)" }, "404": { "description": "File not found" @@ -10078,7 +10078,7 @@ } }, "403": { - "description": "Memory monitor not enabled (set MEMORY_MONITOR=true)" + "description": "Memory monitor not enabled (set MEMORY_MONITOR=true), or the caller is not an admin" } }, "security": [ @@ -11967,6 +11967,9 @@ } } }, + "403": { + "description": "Permission denied" + }, "404": { "description": "Environment not found" } @@ -12462,6 +12465,9 @@ }, "400": { "description": "Host is required for direct/hawser-standard connection types" + }, + "403": { + "description": "The caller cannot access the environment named by environmentId" } }, "security": [ @@ -12472,6 +12478,7 @@ "bearerAuth": [] } ], + "description": "Pass environmentId to fall back to that saved environment's stored secrets (hawserToken, tlsKey) for any secret field left blank in the body, so Test connection works when editing without re-entering the token.", "requestBody": { "required": true, "content": { @@ -12508,6 +12515,9 @@ }, "hawserToken": { "type": "string" + }, + "environmentId": { + "type": "integer" } }, "required": [ @@ -18489,6 +18499,9 @@ "400": { "description": "Invalid ID (not a number)" }, + "403": { + "description": "Permission denied (needs notifications:edit)" + }, "404": { "description": "Notification setting not found" }, @@ -20996,6 +21009,9 @@ "400": { "description": "Missing registry parameter, or Docker Hub was targeted (catalog listing unsupported)" }, + "403": { + "description": "Permission denied (requires registries:view)" + }, "404": { "description": "Registry not found, or the registry does not implement the V2 catalog API" }, @@ -21194,6 +21210,9 @@ "400": { "description": "The term query parameter is missing" }, + "403": { + "description": "Permission denied (requires registries:view)" + }, "404": { "description": "The referenced registry does not exist" }, @@ -21280,6 +21299,9 @@ "400": { "description": "image and tag are required" }, + "403": { + "description": "Permission denied (requires registries:view)" + }, "404": { "description": "Registry not found" } @@ -21414,6 +21436,9 @@ "400": { "description": "The image query parameter is missing" }, + "403": { + "description": "Permission denied (requires registries:view)" + }, "404": { "description": "The referenced registry does not exist" }, @@ -24279,7 +24304,7 @@ "schema": { "type": "integer" }, - "description": "Target environment id" + "description": "Target environment id (takes precedence over envId/environmentId in the body)" } ], "responses": { @@ -24304,7 +24329,7 @@ "bearerAuth": [] } ], - "description": "Writes the compose + .env to the stack dir, stores secrets in the DB, and with start deploys it. Can bind a secret provider.", + "description": "Writes the compose + .env to the stack dir, stores secrets in the DB, and with start deploys it. Can bind a secret provider. Target environment comes from the env query param, or from envId/environmentId in the body when the query is absent.", "requestBody": { "required": true, "content": { @@ -24338,6 +24363,12 @@ }, "start": { "type": "boolean" + }, + "envId": { + "type": "integer" + }, + "environmentId": { + "type": "integer" } }, "required": [ @@ -24355,7 +24386,9 @@ ], "rawEnvContent": "string", "secretProviderId": 0, - "start": true + "start": true, + "envId": 0, + "environmentId": 0 } } } @@ -25779,7 +25812,10 @@ "description": "oldDir and newComposePath are required, or the source directory does not exist" }, "403": { - "description": "Permission denied (requires stacks:edit)" + "description": "Permission denied (requires stacks:edit), or a supplied path is not allowed" + }, + "404": { + "description": "No stack source row for this name and environment" }, "500": { "description": "Failed to relocate stack"