From 91860be6be5ff032dca30a29b959bc447f9ed96b Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Fri, 25 Sep 2026 14:15:59 +0100 Subject: [PATCH 1/2] refactor: move mise node project tasks (#711) --- .dockerignore | 1 + .github/workflows/ci.yml | 6 +-- .github/workflows/deploy.yml | 2 +- .github/workflows/docs-destroy.yml | 3 +- .github/workflows/docs.yml | 5 +- .mise/config.toml | 48 ++++++++++++++----- .mise/tasks/lint/_default | 2 +- .mise/tasks/test/e2e/_default | 2 +- .mise/tasks/test/e2e/wait | 2 +- .mise/tasks/test/integration/k3d | 4 +- .mise/tasks/test/integration/s3 | 2 +- .mise/tasks/web/build | 6 --- .mise/tasks/web/dev | 8 ---- .mise/tasks/yucca-sdk/build | 4 -- .mise/tasks/yucca-sdk/check | 4 -- .mise/tasks/yucca-sdk/dev | 4 -- .mise/tasks/yucca-sdk/test/_default | 4 -- .mise/tasks/yucca-sdk/test/e2e-web | 4 -- CLAUDE.md | 14 +++--- .../common/.mise/tasks}/build | 0 .../docs => packages/docs/.mise/tasks}/build | 0 .../docs => packages/docs/.mise/tasks}/check | 0 .../docs => packages/docs/.mise/tasks}/deploy | 3 +- .../docs/.mise/tasks}/destroy | 1 + .../docs => packages/docs/.mise/tasks}/dev | 0 .../docs/.mise/tasks}/preview | 2 +- .../docs/.mise/tasks}/test/_default | 0 packages/docs/README.md | 10 ++-- packages/e2e/k3d/run.sh | 8 ++-- .../emails/.mise/tasks}/build | 0 .../futo-backups-bot/.mise/tasks}/build | 2 +- .../futo-backups-bot/.mise/tasks}/dev | 4 +- .../futo-backups-bot/.mise/tasks}/env | 0 .../.mise/tasks}/test/_default | 0 packages/futo-backups-bot/Dockerfile | 2 +- .../standalone-app/.mise/tasks}/build | 2 +- .../standalone-app/.mise/tasks}/check | 0 .../standalone-app/.mise/tasks}/dev | 2 +- .../standalone-app/.mise/tasks}/docker | 1 + .../standalone-app/.mise/tasks}/start | 0 packages/web/.mise/tasks/build | 6 +++ .../web => packages/web/.mise/tasks}/check | 0 packages/web/.mise/tasks/dev | 8 ++++ .../web/.mise/tasks}/lingui/_default | 4 +- .../web/.mise/tasks}/lingui/check | 2 +- .../web/.mise/tasks}/lingui/compile | 0 .../web/.mise/tasks}/lingui/extract | 0 .../web => packages/web/.mise/tasks}/preview | 2 +- .../web/.mise/tasks}/test/_default | 0 .../web/.mise/tasks}/test/e2e/web/_default | 2 +- .../web/.mise/tasks}/test/e2e/web/create | 0 .../web/.mise/tasks}/test/install-deps | 0 packages/web/Dockerfile | 2 +- .../yucca-admin-api/.mise/tasks}/build | 2 +- .../yucca-admin-api/.mise/tasks}/dev | 4 +- .../yucca-admin-api/.mise/tasks}/env | 2 +- .../yucca-admin-api/.mise/tasks}/sync-openapi | 3 +- .../.mise/tasks}/test/_default | 0 .../.mise/tasks}/test/integration | 0 .../yucca-admin-api/.mise/tasks}/test/watch | 0 packages/yucca-admin-api/Dockerfile | 2 +- .../yucca-api-client/.mise/tasks}/build | 2 +- .../yucca-api/.mise/tasks}/build | 2 +- .../.mise/tasks}/check-migration-order | 1 + .../yucca-api/.mise/tasks}/dev | 4 +- .../yucca-api/.mise/tasks}/env | 0 .../yucca-api/.mise/tasks}/migrations | 1 - .../yucca-api/.mise/tasks}/sync-openapi | 3 +- .../yucca-api/.mise/tasks}/test/_default | 0 .../yucca-api/.mise/tasks}/test/integration | 0 .../yucca-api/.mise/tasks}/test/watch | 0 packages/yucca-api/Dockerfile | 2 +- .../yucca-metrics-worker/.mise/tasks}/build | 2 +- .../yucca-metrics-worker/.mise/tasks}/dev | 4 +- .../yucca-metrics-worker/.mise/tasks}/env | 0 .../.mise/tasks}/test/_default | 0 .../.mise/tasks}/test/integration | 0 packages/yucca-metrics-worker/Dockerfile | 2 +- .../orchestration-api/.mise/tasks}/build | 2 +- .../orchestration-api/.mise/tasks}/dev | 2 +- .../orchestration-api/.mise/tasks}/start | 0 .../.mise/tasks}/test/_default | 0 .../.mise/tasks}/test/integration | 0 .../orchestration-ui/.mise/tasks}/build | 2 +- .../orchestration-ui/.mise/tasks}/check | 0 .../orchestration-ui/.mise/tasks}/dev | 2 +- .../.mise/tasks}/generate-fetch-client | 2 +- .../orchestration-ui/.mise/tasks}/preview | 2 +- .../.mise/tasks}/test/_default | 0 .../.mise/tasks}/test/e2e/web/_default | 2 +- .../.mise/tasks}/test/e2e/web/create | 0 .../.mise/tasks}/test/install-deps | 0 tf/pages/.env | 2 +- tf/pages/README.md | 8 ++-- 94 files changed, 127 insertions(+), 121 deletions(-) delete mode 100755 .mise/tasks/web/build delete mode 100755 .mise/tasks/web/dev delete mode 100755 .mise/tasks/yucca-sdk/build delete mode 100755 .mise/tasks/yucca-sdk/check delete mode 100755 .mise/tasks/yucca-sdk/dev delete mode 100755 .mise/tasks/yucca-sdk/test/_default delete mode 100755 .mise/tasks/yucca-sdk/test/e2e-web rename {.mise/tasks/common/server => packages/common/.mise/tasks}/build (100%) rename {.mise/tasks/docs => packages/docs/.mise/tasks}/build (100%) rename {.mise/tasks/docs => packages/docs/.mise/tasks}/check (100%) rename {.mise/tasks/docs => packages/docs/.mise/tasks}/deploy (89%) rename {.mise/tasks/docs => packages/docs/.mise/tasks}/destroy (93%) rename {.mise/tasks/docs => packages/docs/.mise/tasks}/dev (100%) rename {.mise/tasks/docs => packages/docs/.mise/tasks}/preview (78%) rename {.mise/tasks/docs => packages/docs/.mise/tasks}/test/_default (100%) rename {.mise/tasks/common/emails => packages/emails/.mise/tasks}/build (100%) rename {.mise/tasks/futo-backups-bot => packages/futo-backups-bot/.mise/tasks}/build (79%) rename {.mise/tasks/futo-backups-bot => packages/futo-backups-bot/.mise/tasks}/dev (80%) rename {.mise/tasks/futo-backups-bot => packages/futo-backups-bot/.mise/tasks}/env (100%) rename {.mise/tasks/futo-backups-bot => packages/futo-backups-bot/.mise/tasks}/test/_default (100%) rename {.mise/tasks/standalone-app => packages/standalone-app/.mise/tasks}/build (55%) rename {.mise/tasks/standalone-app => packages/standalone-app/.mise/tasks}/check (100%) rename {.mise/tasks/standalone-app => packages/standalone-app/.mise/tasks}/dev (67%) rename {.mise/tasks/standalone-app => packages/standalone-app/.mise/tasks}/docker (86%) rename {.mise/tasks/standalone-app => packages/standalone-app/.mise/tasks}/start (100%) create mode 100755 packages/web/.mise/tasks/build rename {.mise/tasks/web => packages/web/.mise/tasks}/check (100%) create mode 100755 packages/web/.mise/tasks/dev rename {.mise/tasks/web => packages/web/.mise/tasks}/lingui/_default (51%) rename {.mise/tasks/web => packages/web/.mise/tasks}/lingui/check (84%) rename {.mise/tasks/web => packages/web/.mise/tasks}/lingui/compile (100%) rename {.mise/tasks/web => packages/web/.mise/tasks}/lingui/extract (100%) rename {.mise/tasks/web => packages/web/.mise/tasks}/preview (78%) rename {.mise/tasks/web => packages/web/.mise/tasks}/test/_default (100%) rename {.mise/tasks/web => packages/web/.mise/tasks}/test/e2e/web/_default (73%) rename {.mise/tasks/web => packages/web/.mise/tasks}/test/e2e/web/create (100%) rename {.mise/tasks/web => packages/web/.mise/tasks}/test/install-deps (100%) rename {.mise/tasks/yucca-admin-api => packages/yucca-admin-api/.mise/tasks}/build (78%) rename {.mise/tasks/yucca-admin-api => packages/yucca-admin-api/.mise/tasks}/dev (80%) rename {.mise/tasks/yucca-admin-api => packages/yucca-admin-api/.mise/tasks}/env (96%) rename {.mise/tasks/yucca-admin-api => packages/yucca-admin-api/.mise/tasks}/sync-openapi (61%) rename {.mise/tasks/yucca-admin-api => packages/yucca-admin-api/.mise/tasks}/test/_default (100%) rename {.mise/tasks/yucca-admin-api => packages/yucca-admin-api/.mise/tasks}/test/integration (100%) rename {.mise/tasks/yucca-admin-api => packages/yucca-admin-api/.mise/tasks}/test/watch (100%) rename {.mise/tasks/yucca-api-client => packages/yucca-api-client/.mise/tasks}/build (78%) rename {.mise/tasks/yucca-api => packages/yucca-api/.mise/tasks}/build (77%) rename {.mise/tasks/yucca-api => packages/yucca-api/.mise/tasks}/check-migration-order (96%) rename {.mise/tasks/yucca-api => packages/yucca-api/.mise/tasks}/dev (79%) rename {.mise/tasks/yucca-api => packages/yucca-api/.mise/tasks}/env (100%) rename {.mise/tasks/yucca-api => packages/yucca-api/.mise/tasks}/migrations (84%) rename {.mise/tasks/yucca-api => packages/yucca-api/.mise/tasks}/sync-openapi (64%) rename {.mise/tasks/yucca-api => packages/yucca-api/.mise/tasks}/test/_default (100%) rename {.mise/tasks/yucca-api => packages/yucca-api/.mise/tasks}/test/integration (100%) rename {.mise/tasks/yucca-api => packages/yucca-api/.mise/tasks}/test/watch (100%) rename {.mise/tasks/yucca-metrics-worker => packages/yucca-metrics-worker/.mise/tasks}/build (80%) rename {.mise/tasks/yucca-metrics-worker => packages/yucca-metrics-worker/.mise/tasks}/dev (80%) rename {.mise/tasks/yucca-metrics-worker => packages/yucca-metrics-worker/.mise/tasks}/env (100%) rename {.mise/tasks/yucca-metrics-worker => packages/yucca-metrics-worker/.mise/tasks}/test/_default (100%) rename {.mise/tasks/yucca-metrics-worker => packages/yucca-metrics-worker/.mise/tasks}/test/integration (100%) rename {.mise/tasks/yucca-sdk/orchestration-api => packages/yucca-sdk/orchestration-api/.mise/tasks}/build (75%) rename {.mise/tasks/yucca-sdk/orchestration-api => packages/yucca-sdk/orchestration-api/.mise/tasks}/dev (66%) rename {.mise/tasks/yucca-sdk/orchestration-api => packages/yucca-sdk/orchestration-api/.mise/tasks}/start (100%) rename {.mise/tasks/yucca-sdk/orchestration-api => packages/yucca-sdk/orchestration-api/.mise/tasks}/test/_default (100%) rename {.mise/tasks/yucca-sdk/orchestration-api => packages/yucca-sdk/orchestration-api/.mise/tasks}/test/integration (100%) rename {.mise/tasks/yucca-sdk/orchestration-ui => packages/yucca-sdk/orchestration-ui/.mise/tasks}/build (69%) rename {.mise/tasks/yucca-sdk/orchestration-ui => packages/yucca-sdk/orchestration-ui/.mise/tasks}/check (100%) rename {.mise/tasks/yucca-sdk/orchestration-ui => packages/yucca-sdk/orchestration-ui/.mise/tasks}/dev (78%) rename {.mise/tasks/yucca-sdk/orchestration-ui => packages/yucca-sdk/orchestration-ui/.mise/tasks}/generate-fetch-client (78%) rename {.mise/tasks/yucca-sdk/orchestration-ui => packages/yucca-sdk/orchestration-ui/.mise/tasks}/preview (75%) rename {.mise/tasks/yucca-sdk/orchestration-ui => packages/yucca-sdk/orchestration-ui/.mise/tasks}/test/_default (100%) rename {.mise/tasks/yucca-sdk/orchestration-ui => packages/yucca-sdk/orchestration-ui/.mise/tasks}/test/e2e/web/_default (72%) rename {.mise/tasks/yucca-sdk/orchestration-ui => packages/yucca-sdk/orchestration-ui/.mise/tasks}/test/e2e/web/create (100%) rename {.mise/tasks/yucca-sdk/orchestration-ui => packages/yucca-sdk/orchestration-ui/.mise/tasks}/test/install-deps (100%) diff --git a/.dockerignore b/.dockerignore index ba6bcfb9..490f3c5e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -11,6 +11,7 @@ e2e **/.env* Dockerfile packages/**/build +!packages/**/.mise/tasks/** .dev .mise/data **/tmp diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 522d1d1f..1e816861 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: # that goes stale after a migration re-date on main slips past it; the # deploy workflow's gate is the authoritative check. - name: Migration ordering vs main - run: .mise/tasks/yucca-api/check-migration-order origin/main + run: packages/yucca-api/.mise/tasks/check-migration-order origin/main - name: Setup Mise uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c # v4.3.0 @@ -80,8 +80,8 @@ jobs: ( mise k3d:up && mise tilt:ci-infra ) > /tmp/k3d-infra.log 2>&1 & infra=$! mise run install:frozen - mise run common:server:build - mise run common:emails:build + mise run //packages/common:build + mise run //packages/emails:build wait "$infra" || { echo "::error::k3d infra failed"; cat /tmp/k3d-infra.log; exit 1; } echo "::group::k3d infra log"; cat /tmp/k3d-infra.log; echo "::endgroup::" diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 23a068c4..37611f4f 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -45,7 +45,7 @@ jobs: with: persist-credentials: false fetch-depth: 2 - - run: .mise/tasks/yucca-api/check-migration-order HEAD^ + - run: packages/yucca-api/.mise/tasks/check-migration-order HEAD^ # == Build + push every app image (the ONLY delivery action CI performs) == # Release commits build like any other. v image tags are published diff --git a/.github/workflows/docs-destroy.yml b/.github/workflows/docs-destroy.yml index 02d573b6..9f75fb87 100644 --- a/.github/workflows/docs-destroy.yml +++ b/.github/workflows/docs-destroy.yml @@ -12,7 +12,6 @@ on: - 'pnpm-workspace.yaml' - '.npmrc' - '.mise/config.toml' - - '.mise/tasks/docs/**' - 'tf/pages/**' - 'tf/op-run.sh' - '.github/workflows/docs.yml' @@ -49,7 +48,7 @@ jobs: - name: Install 1Password CLI uses: 1password/install-cli-action@a5215d3a7f75c1629216c465ea9ab3ab399c4b71 # v4.0.0 - - run: mise run docs:destroy + - run: mise run //packages/docs:destroy - name: Remove preview comment if: ${{ github.event_name == 'pull_request_target' }} diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 410e03ff..9ac3995a 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -12,7 +12,6 @@ on: - 'pnpm-workspace.yaml' - '.npmrc' - '.mise/config.toml' - - '.mise/tasks/docs/**' - 'tf/pages/**' - 'tf/op-run.sh' - '.github/workflows/docs.yml' @@ -45,7 +44,7 @@ jobs: - run: mise run install:frozen - - run: mise run docs:build + - run: mise run //packages/docs:build - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: @@ -83,7 +82,7 @@ jobs: path: packages/docs/build - id: deploy - run: mise run docs:deploy + run: mise run //packages/docs:deploy - name: Preview comment if: ${{ github.event_name == 'pull_request' }} diff --git a/.mise/config.toml b/.mise/config.toml index b80061bb..fdc6175e 100644 --- a/.mise/config.toml +++ b/.mise/config.toml @@ -1,7 +1,23 @@ monorepo_root = true [monorepo] -config_roots = ["ansible/ceph", "ansible/talos", "packages/restic-proxy"] +config_roots = [ + "ansible/ceph", + "ansible/talos", + "packages/common", + "packages/docs", + "packages/emails", + "packages/futo-backups-bot", + "packages/restic-proxy", + "packages/standalone-app", + "packages/web", + "packages/yucca-admin-api", + "packages/yucca-api", + "packages/yucca-api-client", + "packages/yucca-metrics-worker", + "packages/yucca-sdk/orchestration-api", + "packages/yucca-sdk/orchestration-ui", +] [tools] node = "25.9.0" @@ -38,34 +54,44 @@ opentofu = "1.12.6" terragrunt = "0.99.5" # ansible/mgmt convergence (mgmt:ansible task, run from CI on prod apply). "pipx:ansible-core" = "2.21.4" + [tasks.dev] description = "Start all services in development mode" depends = ["install:deps", "common:build", "docker:start"] -run = [{ task = "*:dev" }] +run = [ + { tasks = [ + "michael:dev", + "//packages/restic-proxy:dev", + "//packages/web:dev", + "//packages/yucca-admin-api:dev", + "//packages/yucca-api:dev", + "//packages/yucca-metrics-worker:dev", + "//packages/yucca-sdk/orchestration-api:dev", + "//packages/yucca-sdk/orchestration-ui:dev", + ] }, +] [tasks.build] description = "Build all packages" -depends = ["*:build"] +depends = ["*:build", "//packages/...:build"] [tasks."common:build"] description = "Build all common packages" -run = [{ task = "install:deps" }, { task = "common:*:build" }] +run = [{ task = "install:deps" }, { tasks = ["//packages/common:build", "//packages/emails:build"] }] [tasks.test] description = "Run all unit tests" -depends = ["*:test"] +depends = ["*:test", "//packages/...:test"] [tasks."test:integration"] description = "Run all integration tests" # NB: mise flags must precede the task pattern — anything after it is forwarded # to the tasks themselves (jest/go test choke on a stray --jobs). -# Both depths: `*` does not cross `:`, so the first pattern alone silently -# skipped yucca-sdk:orchestration-api:test:integration. -run = "mise run --jobs 1 '*:test:integration' ::: '*:*:test:integration'" +run = "mise run --jobs 1 '*:test:integration' ::: '//packages/...:test:integration'" [tasks."test:e2e:web"] description = "Run all web e2e tests" -run = [{ task = "test:e2e:wait" }, { task = "*:test:e2e:web" }] +run = [{ task = "test:e2e:wait" }, { task = "//packages/...:test:e2e:web" }] [tasks."prepare"] description = "Install and build packages" @@ -73,11 +99,11 @@ run = [{ task = "install:frozen" }, { task = "build" }] [tasks."check"] description = "Run checks & unit tests" -run = [{ tasks = ["lint", "lint:go", "*:check"] }, { task = "format" }, { task = "test" }] +run = [{ tasks = ["lint", "lint:go", "//packages/...:check"] }, { task = "format" }, { task = "test" }] [tasks.fix] description = "Run all possible code fixes" -run = [{ task = "*:fix" }, { task = "web:lingui" }] +run = [{ task = "*:fix" }, { task = "//packages/web:lingui" }] [tasks."o11y:render"] description = "Render the o11y bundle" diff --git a/.mise/tasks/lint/_default b/.mise/tasks/lint/_default index 0571870a..896254cf 100755 --- a/.mise/tasks/lint/_default +++ b/.mise/tasks/lint/_default @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Lint all code files" -#MISE depends=["*:check"] +#MISE depends=["//packages/...:check"] set -e pnpm exec eslint "**/src/**/*.ts" --max-warnings 0 diff --git a/.mise/tasks/test/e2e/_default b/.mise/tasks/test/e2e/_default index d3b8f4f4..b6c19ec1 100755 --- a/.mise/tasks/test/e2e/_default +++ b/.mise/tasks/test/e2e/_default @@ -3,7 +3,7 @@ #MISE depends=["test:e2e:wait", "//packages/restic-proxy:build"] set -e source "$(dirname "$0")/../../michael/env" -source "$(dirname "$0")/../../yucca-api/env" +source "$(dirname "$0")/../../../../packages/yucca-api/.mise/tasks/env" export PATH="$(dirname "$0")/../../../../dist:$PATH" pnpm --filter e2e test "$@" diff --git a/.mise/tasks/test/e2e/wait b/.mise/tasks/test/e2e/wait index 98edff40..c6fae9c5 100755 --- a/.mise/tasks/test/e2e/wait +++ b/.mise/tasks/test/e2e/wait @@ -4,7 +4,7 @@ # handling in packages/e2e/k3d/run.sh and does not use this task). set -e source "$(dirname "$0")/../../michael/env" -source "$(dirname "$0")/../../yucca-api/env" +source "$(dirname "$0")/../../../../packages/yucca-api/.mise/tasks/env" echo Ensure dev environment is running before invoking tests. diff --git a/.mise/tasks/test/integration/k3d b/.mise/tasks/test/integration/k3d index 030c2fb4..3b8efcad 100755 --- a/.mise/tasks/test/integration/k3d +++ b/.mise/tasks/test/integration/k3d @@ -61,5 +61,5 @@ echo "==> run the database-backed integration suites" # same tables between tests. orchestration-api needs no infrastructure at all # and rides along here because this is where integration suites are expected to # run — the glob in `mise test:integration` had never matched its task name. -mise run --jobs 1 yucca-api:test:integration ::: yucca-admin-api:test:integration -mise run yucca-sdk:orchestration-api:test:integration +mise run --jobs 1 //packages/yucca-api:test:integration ::: //packages/yucca-admin-api:test:integration +mise run //packages/yucca-sdk/orchestration-api:test:integration diff --git a/.mise/tasks/test/integration/s3 b/.mise/tasks/test/integration/s3 index 5ecf8e9f..1f27310e 100755 --- a/.mise/tasks/test/integration/s3 +++ b/.mise/tasks/test/integration/s3 @@ -62,4 +62,4 @@ export RADOS_ENDPOINT RADOS_ACCESS_KEY_ID RADOS_SECRET_ACCESS_KEY echo "==> run the S3-backed integration suites" # Concurrent: each scopes itself to freshly generated repository/bucket names. -mise run michael:test:integration ::: yucca-metrics-worker:test:integration +mise run michael:test:integration ::: //packages/yucca-metrics-worker:test:integration diff --git a/.mise/tasks/web/build b/.mise/tasks/web/build deleted file mode 100755 index 7cb803d7..00000000 --- a/.mise/tasks/web/build +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash -#MISE description="Build web" -#MISE depends=["yucca-api-client:build", "web:lingui", "yucca-sdk:orchestration-ui:build"] -set -e - -NODE_ENV=production pnpm --filter web build diff --git a/.mise/tasks/web/dev b/.mise/tasks/web/dev deleted file mode 100755 index 63482328..00000000 --- a/.mise/tasks/web/dev +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -#MISE description="Run web in development mode" -#MISE depends=["yucca-api-client:build", "common:build", "web:lingui:compile", "yucca-sdk:orchestration-ui:build"] -set -e -source "$(dirname "$0")/../yucca-api/env" -export WEB_PORT=${WEB_PORT:-36033} - -pnpm --filter web dev --host --port $WEB_PORT diff --git a/.mise/tasks/yucca-sdk/build b/.mise/tasks/yucca-sdk/build deleted file mode 100755 index 8727ac4f..00000000 --- a/.mise/tasks/yucca-sdk/build +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash -#MISE description="Build yucca-sdk" -#MISE depends=["yucca-sdk:*:build"] -set -e diff --git a/.mise/tasks/yucca-sdk/check b/.mise/tasks/yucca-sdk/check deleted file mode 100755 index d4e28c11..00000000 --- a/.mise/tasks/yucca-sdk/check +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash -#MISE description="Check yucca-sdk" -#MISE depends=["yucca-sdk:*:check"] -set -e diff --git a/.mise/tasks/yucca-sdk/dev b/.mise/tasks/yucca-sdk/dev deleted file mode 100755 index 6b199caf..00000000 --- a/.mise/tasks/yucca-sdk/dev +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash -#MISE description="Start yucca-sdk in development mode" -#MISE depends=["yucca-sdk:*:dev"] -set -e diff --git a/.mise/tasks/yucca-sdk/test/_default b/.mise/tasks/yucca-sdk/test/_default deleted file mode 100755 index f997e744..00000000 --- a/.mise/tasks/yucca-sdk/test/_default +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash -#MISE description="Test yucca-sdk" -#MISE depends=["yucca-sdk:*:test"] -set -e diff --git a/.mise/tasks/yucca-sdk/test/e2e-web b/.mise/tasks/yucca-sdk/test/e2e-web deleted file mode 100755 index 82d33da3..00000000 --- a/.mise/tasks/yucca-sdk/test/e2e-web +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash -#MISE description="Run end-to-end tests for yucca-sdk" -#MISE depends=["yucca-sdk:*:test:e2e-web"] -set -e diff --git a/CLAUDE.md b/CLAUDE.md index 6f139810..07cee4a4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -51,8 +51,8 @@ Yucca is a multi-tenant **backup service**: OIDC-authenticated users get S3-back ```bash mise dev # compose-based dev: deps, docker infra (postgres/minio/mock-oidc/victoria-*), all *:dev -mise :dev # one service, e.g. mise web:dev, mise yucca-api:dev -mise docs:dev # docs site (packages/docs) on :36034 +mise //packages/:dev # one service, e.g. mise //packages/web:dev; Go services stay mise michael:dev +mise //packages/docs:dev # docs site (packages/docs) on :36034 mise check # lint + format check + svelte-check + unit tests (= the `checks` CI job) mise fix # autofix lint/format + lingui extract @@ -62,9 +62,9 @@ mise test # all unit tests (jest per NestJS pkg, vitest for web) mise test:integration # integration tests (--jobs 1; needs infra up) mise test:integration:k3d # CI split: the database-backed suites; :s3 = the Ceph-backed ones mise test:e2e # e2e (needs the stack running); mise test:e2e:web = Playwright -mise :test # one package; args after -- go to jest: mise yucca-api:test -- -t "name" +mise //packages/:test # one package; args after -- go to jest: mise //packages/yucca-api:test -- -t "name" -mise yucca-api:migrations # DB migrations (@immich/sql-tools; yucca-api owns the schema) +mise //packages/yucca-api:migrations # DB migrations (@immich/sql-tools; yucca-api owns the schema) ``` ### k3d + Tilt (prod-shaped dev) @@ -117,7 +117,7 @@ Zod-validated `env.ts`, JWT auth guards via `@AuthRoute()`, OTel from `@common/s | `emails` (`@common/emails`) | Svelte lib | Transactional email templates (better-svelte-email, web theme), prebuilt to JS for the NestJS apps. See `docs/email.md`. | **Frontend** (`packages/web`): SvelteKit 5 + Tailwind 4, `@immich/ui`, lingui i18n -(`mise web:lingui:*`; compiled locales are generated, not edited), generated API client. +(`mise //packages/web:lingui:*`; compiled locales are generated, not edited), generated API client. **Docs** (`packages/docs`, https://docs.futo.cloud): the **end-user** documentation site (beta setup guides for Immich and the standalone container). SvelteKit + `adapter-static`; every page is a `src/routes/
//+page.md` compiled by `@immich/svelte-markdown-preprocess` (front matter @@ -127,8 +127,8 @@ in `docs/` and the per-directory READMEs — do not move them onto the site. **`packages/yucca-sdk/`** (orchestration-api + orchestration-ui) is separately versioned and added explicitly in `pnpm-workspace.yaml`. -**API client generation**: yucca-api DTOs → `mise yucca-api:sync-openapi` → -`mise yucca-api-client:build` (oazapfts) → `packages/yucca-api-client/src/fetch-client.ts`. +**API client generation**: yucca-api DTOs → `mise //packages/yucca-api:sync-openapi` → +`mise //packages/yucca-api-client:build` (oazapfts) → `packages/yucca-api-client/src/fetch-client.ts`. Generated — regenerate on contract changes, never hand-edit. **Database**: PostgreSQL via **Kysely**. Schema in `packages/yucca-api/src/schema/` diff --git a/.mise/tasks/common/server/build b/packages/common/.mise/tasks/build similarity index 100% rename from .mise/tasks/common/server/build rename to packages/common/.mise/tasks/build diff --git a/.mise/tasks/docs/build b/packages/docs/.mise/tasks/build similarity index 100% rename from .mise/tasks/docs/build rename to packages/docs/.mise/tasks/build diff --git a/.mise/tasks/docs/check b/packages/docs/.mise/tasks/check similarity index 100% rename from .mise/tasks/docs/check rename to packages/docs/.mise/tasks/check diff --git a/.mise/tasks/docs/deploy b/packages/docs/.mise/tasks/deploy similarity index 89% rename from .mise/tasks/docs/deploy rename to packages/docs/.mise/tasks/deploy index 0eaab6b4..d4ee828c 100755 --- a/.mise/tasks/docs/deploy +++ b/packages/docs/.mise/tasks/deploy @@ -1,12 +1,13 @@ #!/usr/bin/env bash #MISE description="Publish packages/docs/build to Cloudflare Pages (ENVIRONMENT=prod|dev, TF_VAR_stage=pr- for a preview)" +#MISE dir="{{config_root}}/../.." set -euo pipefail export ENVIRONMENT="${ENVIRONMENT:-dev}" export TF_VAR_stage="${TF_VAR_stage:-}" export OP_ENV_FILE=tf/pages/.env -[ -d packages/docs/build ] || { echo "docs:deploy: packages/docs/build is missing — run mise docs:build first" >&2; exit 1; } +[ -d packages/docs/build ] || { echo "docs:deploy: packages/docs/build is missing — run mise //packages/docs:build first" >&2; exit 1; } tf/op-run.sh terragrunt run --all apply --non-interactive --parallelism 1 --working-dir tf/pages/docs diff --git a/.mise/tasks/docs/destroy b/packages/docs/.mise/tasks/destroy similarity index 93% rename from .mise/tasks/docs/destroy rename to packages/docs/.mise/tasks/destroy index bbdeb7d7..08cd7da4 100755 --- a/.mise/tasks/docs/destroy +++ b/packages/docs/.mise/tasks/destroy @@ -1,5 +1,6 @@ #!/usr/bin/env bash #MISE description="Tear down a docs preview stage (TF_VAR_stage=pr-); the shared Pages project is kept" +#MISE dir="{{config_root}}/../.." set -euo pipefail export ENVIRONMENT="${ENVIRONMENT:-dev}" diff --git a/.mise/tasks/docs/dev b/packages/docs/.mise/tasks/dev similarity index 100% rename from .mise/tasks/docs/dev rename to packages/docs/.mise/tasks/dev diff --git a/.mise/tasks/docs/preview b/packages/docs/.mise/tasks/preview similarity index 78% rename from .mise/tasks/docs/preview rename to packages/docs/.mise/tasks/preview index 934d71e6..f99c6872 100755 --- a/.mise/tasks/docs/preview +++ b/packages/docs/.mise/tasks/preview @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Run docs in preview mode" -#MISE depends=["docs:build"] +#MISE depends=[":build"] set -e pnpm --filter docs preview --host diff --git a/.mise/tasks/docs/test/_default b/packages/docs/.mise/tasks/test/_default similarity index 100% rename from .mise/tasks/docs/test/_default rename to packages/docs/.mise/tasks/test/_default diff --git a/packages/docs/README.md b/packages/docs/README.md index 064c15ff..0311bb45 100644 --- a/packages/docs/README.md +++ b/packages/docs/README.md @@ -7,10 +7,10 @@ This site is a SvelteKit app, published at [docs.futo.cloud](https://docs.futo.c ## Running the site ```bash -mise docs:dev # dev server with hot reload on http://localhost:36034 -mise docs:check # svelte-check -mise docs:test # unit tests for the page index -mise docs:build # static build into packages/docs/build +mise //packages/docs:dev # dev server with hot reload on http://localhost:36034 +mise //packages/docs:check # svelte-check +mise //packages/docs:test # unit tests for the page index +mise //packages/docs:build # static build into packages/docs/build ``` `mise check` and `mise build` include the docs, so CI builds the site on every pull request. @@ -93,7 +93,7 @@ Because the page is compiled as Svelte, curly braces and tag-like text such as ` ## Previews and deployment -The Docs workflow publishes the site to Cloudflare Pages. Every pull request that touches the documentation gets its own preview at `docs.pr-.dev.futo.cloud`, linked from a comment on the pull request and removed when it closes; merging to `main` deploys [docs.futo.cloud](https://docs.futo.cloud). The Pages project and its domains are Terraform under `tf/pages/docs`, and `mise docs:deploy` and `mise docs:destroy` are the tasks behind the workflow. +The Docs workflow publishes the site to Cloudflare Pages. Every pull request that touches the documentation gets its own preview at `docs.pr-.dev.futo.cloud`, linked from a comment on the pull request and removed when it closes; merging to `main` deploys [docs.futo.cloud](https://docs.futo.cloud). The Pages project and its domains are Terraform under `tf/pages/docs`, and `mise //packages/docs:deploy` and `mise //packages/docs:destroy` are the tasks behind the workflow. ## Search diff --git a/packages/e2e/k3d/run.sh b/packages/e2e/k3d/run.sh index 4913b6a6..a23f8513 100755 --- a/packages/e2e/k3d/run.sh +++ b/packages/e2e/k3d/run.sh @@ -47,8 +47,8 @@ trap cleanup EXIT # CI has already built the workspace by this point. if [ -z "${YUCCA_E2E_PREBUILT:-}" ]; then echo "==> build workspace libs (sdk consumed by orchestration-api + the e2e)" - mise run common:build >/dev/null - mise run yucca-sdk:orchestration-ui:build >/dev/null + mise run //:common:build >/dev/null + mise run //packages/yucca-sdk/orchestration-ui:build >/dev/null fi echo "==> build restic-proxy (spawned by orchestration-api and the proxy suites)" @@ -98,7 +98,7 @@ echo "==> launch orchestration-api as a separate local process (:22676)" # setsid gives it a process group cleanup can reap whole. FUTO_BACKUPS_WELL_KNOWN_URL="http://localhost:8080/.well-known/yucca.json" \ NODE_OPTIONS="--require $HERE/hostmap.cjs" \ - setsid mise run yucca-sdk:orchestration-api:dev >/tmp/yucca-e2e-orch.log 2>&1 & + setsid mise run //packages/yucca-sdk/orchestration-api:dev >/tmp/yucca-e2e-orch.log 2>&1 & ORCH_PGID="$(ps -o pgid= -p $! 2>/dev/null | tr -d ' ')" wait_for_http() { @@ -120,7 +120,7 @@ echo "==> jest e2e (it-works, restic, yucca-api, orchestration-api)" # shellcheck disable=SC1091 source .mise/tasks/michael/env # shellcheck disable=SC1091 -source .mise/tasks/yucca-api/env +source packages/yucca-api/.mise/tasks/env # Three, not one per suite: orchestration-api alone runs ~105s and gates the # phase, so a fourth worker adds no wall-clock — only a fourth CPU consumer on a # runner that is already hosting the cluster these suites drive. diff --git a/.mise/tasks/common/emails/build b/packages/emails/.mise/tasks/build similarity index 100% rename from .mise/tasks/common/emails/build rename to packages/emails/.mise/tasks/build diff --git a/.mise/tasks/futo-backups-bot/build b/packages/futo-backups-bot/.mise/tasks/build similarity index 79% rename from .mise/tasks/futo-backups-bot/build rename to packages/futo-backups-bot/.mise/tasks/build index 38797bb2..a5a3fd4b 100755 --- a/.mise/tasks/futo-backups-bot/build +++ b/packages/futo-backups-bot/.mise/tasks/build @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Build futo-backups-bot" -#MISE depends=["common:build"] +#MISE depends=["//:common:build"] set -e NODE_ENV=production pnpm --filter futo-backups-bot build diff --git a/.mise/tasks/futo-backups-bot/dev b/packages/futo-backups-bot/.mise/tasks/dev similarity index 80% rename from .mise/tasks/futo-backups-bot/dev rename to packages/futo-backups-bot/.mise/tasks/dev index 442cb76b..3caa2cad 100755 --- a/.mise/tasks/futo-backups-bot/dev +++ b/packages/futo-backups-bot/.mise/tasks/dev @@ -1,7 +1,7 @@ #!/usr/bin/env bash #MISE description="Run futo-backups-bot in development mode" -#MISE depends=["common:build"] -#MISE dir="{{config_root}}" +#MISE depends=["//:common:build"] +#MISE dir="{{config_root}}/../.." set -e source "$(dirname "$0")/env" diff --git a/.mise/tasks/futo-backups-bot/env b/packages/futo-backups-bot/.mise/tasks/env similarity index 100% rename from .mise/tasks/futo-backups-bot/env rename to packages/futo-backups-bot/.mise/tasks/env diff --git a/.mise/tasks/futo-backups-bot/test/_default b/packages/futo-backups-bot/.mise/tasks/test/_default similarity index 100% rename from .mise/tasks/futo-backups-bot/test/_default rename to packages/futo-backups-bot/.mise/tasks/test/_default diff --git a/packages/futo-backups-bot/Dockerfile b/packages/futo-backups-bot/Dockerfile index 73bbfe10..42383e69 100644 --- a/packages/futo-backups-bot/Dockerfile +++ b/packages/futo-backups-bot/Dockerfile @@ -66,7 +66,7 @@ RUN npm install -g pnpm@10.28.1 RUN curl https://mise.run | sh RUN mise trust RUN pnpm i --frozen-lockfile -RUN mise futo-backups-bot:build +RUN mise //packages/futo-backups-bot:build RUN pnpm --filter futo-backups-bot deploy /deploy --prod --legacy FROM ${ALPINE_IMAGE} diff --git a/.mise/tasks/standalone-app/build b/packages/standalone-app/.mise/tasks/build similarity index 55% rename from .mise/tasks/standalone-app/build rename to packages/standalone-app/.mise/tasks/build index 2ac94295..0e2f61db 100755 --- a/.mise/tasks/standalone-app/build +++ b/packages/standalone-app/.mise/tasks/build @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Build standalone-app" -#MISE depends=["yucca-sdk:orchestration-api:build", "yucca-sdk:orchestration-ui:build"] +#MISE depends=["//packages/yucca-sdk/orchestration-api:build", "//packages/yucca-sdk/orchestration-ui:build"] set -e NODE_ENV=production pnpm --filter @futo-org/backups-standalone build diff --git a/.mise/tasks/standalone-app/check b/packages/standalone-app/.mise/tasks/check similarity index 100% rename from .mise/tasks/standalone-app/check rename to packages/standalone-app/.mise/tasks/check diff --git a/.mise/tasks/standalone-app/dev b/packages/standalone-app/.mise/tasks/dev similarity index 67% rename from .mise/tasks/standalone-app/dev rename to packages/standalone-app/.mise/tasks/dev index 7026ea17..221de383 100755 --- a/.mise/tasks/standalone-app/dev +++ b/packages/standalone-app/.mise/tasks/dev @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Run standalone-app in development mode (vite UI + tsx server)" -#MISE depends=["yucca-sdk:orchestration-ui:generate-fetch-client", "yucca-sdk:orchestration-api:build", "yucca-sdk:orchestration-ui:build"] +#MISE depends=["//packages/yucca-sdk/orchestration-ui:generate-fetch-client", "//packages/yucca-sdk/orchestration-api:build", "//packages/yucca-sdk/orchestration-ui:build"] set -e export STANDALONE_WEB_PORT=${STANDALONE_WEB_PORT:-36067} export PORT=${PORT:-22676} diff --git a/.mise/tasks/standalone-app/docker b/packages/standalone-app/.mise/tasks/docker similarity index 86% rename from .mise/tasks/standalone-app/docker rename to packages/standalone-app/.mise/tasks/docker index 2e2c4441..d45994ec 100755 --- a/.mise/tasks/standalone-app/docker +++ b/packages/standalone-app/.mise/tasks/docker @@ -1,5 +1,6 @@ #!/usr/bin/env bash #MISE description="Build the standalone-app Docker image" +#MISE dir="{{config_root}}/../.." set -e TAG=${STANDALONE_IMAGE_TAG:-yucca-standalone:dev} diff --git a/.mise/tasks/standalone-app/start b/packages/standalone-app/.mise/tasks/start similarity index 100% rename from .mise/tasks/standalone-app/start rename to packages/standalone-app/.mise/tasks/start diff --git a/packages/web/.mise/tasks/build b/packages/web/.mise/tasks/build new file mode 100755 index 00000000..d5a35e01 --- /dev/null +++ b/packages/web/.mise/tasks/build @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +#MISE description="Build web" +#MISE depends=["//packages/yucca-api-client:build", ":lingui", "//packages/yucca-sdk/orchestration-ui:build"] +set -e + +NODE_ENV=production pnpm --filter web build diff --git a/.mise/tasks/web/check b/packages/web/.mise/tasks/check similarity index 100% rename from .mise/tasks/web/check rename to packages/web/.mise/tasks/check diff --git a/packages/web/.mise/tasks/dev b/packages/web/.mise/tasks/dev new file mode 100755 index 00000000..8e0b72db --- /dev/null +++ b/packages/web/.mise/tasks/dev @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +#MISE description="Run web in development mode" +#MISE depends=["//packages/yucca-api-client:build", "//:common:build", ":lingui:compile", "//packages/yucca-sdk/orchestration-ui:build"] +set -e +source "$(dirname "$0")/../../../yucca-api/.mise/tasks/env" +export WEB_PORT=${WEB_PORT:-36033} + +pnpm --filter web dev --host --port $WEB_PORT diff --git a/.mise/tasks/web/lingui/_default b/packages/web/.mise/tasks/lingui/_default similarity index 51% rename from .mise/tasks/web/lingui/_default rename to packages/web/.mise/tasks/lingui/_default index 07d2fddd..4ed6ecbc 100755 --- a/.mise/tasks/web/lingui/_default +++ b/packages/web/.mise/tasks/lingui/_default @@ -1,4 +1,4 @@ #!/usr/bin/env bash #MISE description="Extract and compile i18n catalogs" -mise web:lingui:extract -mise web:lingui:compile +mise //packages/web:lingui:extract +mise //packages/web:lingui:compile diff --git a/.mise/tasks/web/lingui/check b/packages/web/.mise/tasks/lingui/check similarity index 84% rename from .mise/tasks/web/lingui/check rename to packages/web/.mise/tasks/lingui/check index dec09aad..d640df79 100755 --- a/.mise/tasks/web/lingui/check +++ b/packages/web/.mise/tasks/lingui/check @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Ensure i18n catalogs are up to date" -#MISE depends=["web:lingui"] +#MISE depends=[":lingui"] set -e git status --porcelain -- "web/src/locales" | grep -q . && exit 1 || exit 0 diff --git a/.mise/tasks/web/lingui/compile b/packages/web/.mise/tasks/lingui/compile similarity index 100% rename from .mise/tasks/web/lingui/compile rename to packages/web/.mise/tasks/lingui/compile diff --git a/.mise/tasks/web/lingui/extract b/packages/web/.mise/tasks/lingui/extract similarity index 100% rename from .mise/tasks/web/lingui/extract rename to packages/web/.mise/tasks/lingui/extract diff --git a/.mise/tasks/web/preview b/packages/web/.mise/tasks/preview similarity index 78% rename from .mise/tasks/web/preview rename to packages/web/.mise/tasks/preview index 5fd5b988..3fed796c 100755 --- a/.mise/tasks/web/preview +++ b/packages/web/.mise/tasks/preview @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Run web in preview mode" -#MISE depends=["web:build"] +#MISE depends=[":build"] set -e pnpm --filter web preview --host diff --git a/.mise/tasks/web/test/_default b/packages/web/.mise/tasks/test/_default similarity index 100% rename from .mise/tasks/web/test/_default rename to packages/web/.mise/tasks/test/_default diff --git a/.mise/tasks/web/test/e2e/web/_default b/packages/web/.mise/tasks/test/e2e/web/_default similarity index 73% rename from .mise/tasks/web/test/e2e/web/_default rename to packages/web/.mise/tasks/test/e2e/web/_default index 0d99a122..799aa699 100755 --- a/.mise/tasks/web/test/e2e/web/_default +++ b/packages/web/.mise/tasks/test/e2e/web/_default @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Run end-to-end tests for web" -#MISE depends=["web:test:install-deps"] +#MISE depends=[":test:install-deps"] set -e pnpm --filter web test:e2e "$@" diff --git a/.mise/tasks/web/test/e2e/web/create b/packages/web/.mise/tasks/test/e2e/web/create similarity index 100% rename from .mise/tasks/web/test/e2e/web/create rename to packages/web/.mise/tasks/test/e2e/web/create diff --git a/.mise/tasks/web/test/install-deps b/packages/web/.mise/tasks/test/install-deps similarity index 100% rename from .mise/tasks/web/test/install-deps rename to packages/web/.mise/tasks/test/install-deps diff --git a/packages/web/Dockerfile b/packages/web/Dockerfile index 100781fb..2a4aecad 100644 --- a/packages/web/Dockerfile +++ b/packages/web/Dockerfile @@ -69,7 +69,7 @@ RUN npm install -g pnpm@10.28.1 RUN curl https://mise.run | sh RUN mise trust RUN pnpm i --frozen-lockfile -RUN NODE_ENV=production mise web:build +RUN NODE_ENV=production mise //packages/web:build RUN pnpm --filter web deploy /deploy --prod --legacy FROM ${ALPINE_IMAGE} diff --git a/.mise/tasks/yucca-admin-api/build b/packages/yucca-admin-api/.mise/tasks/build similarity index 78% rename from .mise/tasks/yucca-admin-api/build rename to packages/yucca-admin-api/.mise/tasks/build index 3108131e..e177f9f9 100755 --- a/.mise/tasks/yucca-admin-api/build +++ b/packages/yucca-admin-api/.mise/tasks/build @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Build yucca-admin-api" -#MISE depends=["common:build"] +#MISE depends=["//:common:build"] set -e NODE_ENV=production pnpm --filter yucca-admin-api build diff --git a/.mise/tasks/yucca-admin-api/dev b/packages/yucca-admin-api/.mise/tasks/dev similarity index 80% rename from .mise/tasks/yucca-admin-api/dev rename to packages/yucca-admin-api/.mise/tasks/dev index 009f9641..ec0fe9c1 100755 --- a/.mise/tasks/yucca-admin-api/dev +++ b/packages/yucca-admin-api/.mise/tasks/dev @@ -1,7 +1,7 @@ #!/usr/bin/env bash #MISE description="Run yucca-admin-api in development mode" -#MISE depends=["common:build"] -#MISE dir="{{config_root}}" +#MISE depends=["//:common:build"] +#MISE dir="{{config_root}}/../.." set -e source "$(dirname "$0")/env" diff --git a/.mise/tasks/yucca-admin-api/env b/packages/yucca-admin-api/.mise/tasks/env similarity index 96% rename from .mise/tasks/yucca-admin-api/env rename to packages/yucca-admin-api/.mise/tasks/env index e32820a6..d447b7b1 100755 --- a/.mise/tasks/yucca-admin-api/env +++ b/packages/yucca-admin-api/.mise/tasks/env @@ -9,7 +9,7 @@ export POSTGRES_DATABASE=${POSTGRES_DATABASE:-yucca} export POSTGRES_PORT=${POSTGRES_PORT:-15432} # The project's well-known local-dev ES256 keypair (same fixture as -# .mise/tasks/yucca-api/env); signs CLI session JWTs in dev. +# packages/yucca-api/.mise/tasks/env); signs CLI session JWTs in dev. export JWT_PRIVATE_KEY=${JWT_PRIVATE_KEY:------BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgCla79+Sip4o2hZ1K nQJYp2xU/nsCJmRoZmvXjeX6cW+hRANCAASkubBRIE7Sns/VS8ZF5XEVO8CwJ+AZ diff --git a/.mise/tasks/yucca-admin-api/sync-openapi b/packages/yucca-admin-api/.mise/tasks/sync-openapi similarity index 61% rename from .mise/tasks/yucca-admin-api/sync-openapi rename to packages/yucca-admin-api/.mise/tasks/sync-openapi index b9c5cbae..651af8e3 100755 --- a/.mise/tasks/yucca-admin-api/sync-openapi +++ b/packages/yucca-admin-api/.mise/tasks/sync-openapi @@ -1,7 +1,6 @@ #!/usr/bin/env bash #MISE description="yucca-admin-api: sync OpenAPI specification" -#MISE dir="{{config_root}}/packages/yucca-admin-api" -#MISE depends=["yucca-admin-api:build"] +#MISE depends=[":build"] set -e source "$(dirname "$0")/env" diff --git a/.mise/tasks/yucca-admin-api/test/_default b/packages/yucca-admin-api/.mise/tasks/test/_default similarity index 100% rename from .mise/tasks/yucca-admin-api/test/_default rename to packages/yucca-admin-api/.mise/tasks/test/_default diff --git a/.mise/tasks/yucca-admin-api/test/integration b/packages/yucca-admin-api/.mise/tasks/test/integration similarity index 100% rename from .mise/tasks/yucca-admin-api/test/integration rename to packages/yucca-admin-api/.mise/tasks/test/integration diff --git a/.mise/tasks/yucca-admin-api/test/watch b/packages/yucca-admin-api/.mise/tasks/test/watch similarity index 100% rename from .mise/tasks/yucca-admin-api/test/watch rename to packages/yucca-admin-api/.mise/tasks/test/watch diff --git a/packages/yucca-admin-api/Dockerfile b/packages/yucca-admin-api/Dockerfile index 47be8c79..8085ac83 100644 --- a/packages/yucca-admin-api/Dockerfile +++ b/packages/yucca-admin-api/Dockerfile @@ -66,7 +66,7 @@ RUN npm install -g pnpm@10.28.1 RUN curl https://mise.run | sh RUN mise trust RUN pnpm i --frozen-lockfile -RUN mise yucca-admin-api:build +RUN mise //packages/yucca-admin-api:build RUN pnpm --filter yucca-admin-api deploy /deploy --prod --legacy FROM ${ALPINE_IMAGE} diff --git a/.mise/tasks/yucca-api-client/build b/packages/yucca-api-client/.mise/tasks/build similarity index 78% rename from .mise/tasks/yucca-api-client/build rename to packages/yucca-api-client/.mise/tasks/build index e88035e1..7f9aebcb 100755 --- a/.mise/tasks/yucca-api-client/build +++ b/packages/yucca-api-client/.mise/tasks/build @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Generate and build yucca-api-client" -#MISE depends=["yucca-api:sync-openapi"] +#MISE depends=["//packages/yucca-api:sync-openapi"] set -e pnpm --filter @futo-org/backups-api-client generate diff --git a/.mise/tasks/yucca-api/build b/packages/yucca-api/.mise/tasks/build similarity index 77% rename from .mise/tasks/yucca-api/build rename to packages/yucca-api/.mise/tasks/build index 10b57728..6db91a43 100755 --- a/.mise/tasks/yucca-api/build +++ b/packages/yucca-api/.mise/tasks/build @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Build yucca-api" -#MISE depends=["common:build"] +#MISE depends=["//:common:build"] set -e NODE_ENV=production pnpm --filter yucca-api build diff --git a/.mise/tasks/yucca-api/check-migration-order b/packages/yucca-api/.mise/tasks/check-migration-order similarity index 96% rename from .mise/tasks/yucca-api/check-migration-order rename to packages/yucca-api/.mise/tasks/check-migration-order index c4bbbae5..9063d1ed 100755 --- a/.mise/tasks/yucca-api/check-migration-order +++ b/packages/yucca-api/.mise/tasks/check-migration-order @@ -1,5 +1,6 @@ #!/usr/bin/env bash #MISE description="Fail if a new migration sorts before one already present on the base ref" +#MISE dir="{{config_root}}/../.." set -euo pipefail base="${1:-origin/main}" diff --git a/.mise/tasks/yucca-api/dev b/packages/yucca-api/.mise/tasks/dev similarity index 79% rename from .mise/tasks/yucca-api/dev rename to packages/yucca-api/.mise/tasks/dev index ff8baf51..1e81b1b9 100755 --- a/.mise/tasks/yucca-api/dev +++ b/packages/yucca-api/.mise/tasks/dev @@ -1,7 +1,7 @@ #!/usr/bin/env bash #MISE description="Run yucca-api in development mode" -#MISE depends=["common:build"] -#MISE dir="{{config_root}}" +#MISE depends=["//:common:build"] +#MISE dir="{{config_root}}/../.." set -e source "$(dirname "$0")/env" diff --git a/.mise/tasks/yucca-api/env b/packages/yucca-api/.mise/tasks/env similarity index 100% rename from .mise/tasks/yucca-api/env rename to packages/yucca-api/.mise/tasks/env diff --git a/.mise/tasks/yucca-api/migrations b/packages/yucca-api/.mise/tasks/migrations similarity index 84% rename from .mise/tasks/yucca-api/migrations rename to packages/yucca-api/.mise/tasks/migrations index 2075b172..e397538b 100755 --- a/.mise/tasks/yucca-api/migrations +++ b/packages/yucca-api/.mise/tasks/migrations @@ -1,6 +1,5 @@ #!/usr/bin/env bash #MISE description="yucca-api: database migrations script" -#MISE dir="{{config_root}}/packages/yucca-api" set -e source "$(dirname "$0")/env" diff --git a/.mise/tasks/yucca-api/sync-openapi b/packages/yucca-api/.mise/tasks/sync-openapi similarity index 64% rename from .mise/tasks/yucca-api/sync-openapi rename to packages/yucca-api/.mise/tasks/sync-openapi index 9c46ee82..8fb27fdb 100755 --- a/.mise/tasks/yucca-api/sync-openapi +++ b/packages/yucca-api/.mise/tasks/sync-openapi @@ -1,7 +1,6 @@ #!/usr/bin/env bash #MISE description="yucca-api: sync OpenAPI specification" -#MISE dir="{{config_root}}/packages/yucca-api" -#MISE depends=["yucca-api:build"] +#MISE depends=[":build"] set -e source "$(dirname "$0")/env" diff --git a/.mise/tasks/yucca-api/test/_default b/packages/yucca-api/.mise/tasks/test/_default similarity index 100% rename from .mise/tasks/yucca-api/test/_default rename to packages/yucca-api/.mise/tasks/test/_default diff --git a/.mise/tasks/yucca-api/test/integration b/packages/yucca-api/.mise/tasks/test/integration similarity index 100% rename from .mise/tasks/yucca-api/test/integration rename to packages/yucca-api/.mise/tasks/test/integration diff --git a/.mise/tasks/yucca-api/test/watch b/packages/yucca-api/.mise/tasks/test/watch similarity index 100% rename from .mise/tasks/yucca-api/test/watch rename to packages/yucca-api/.mise/tasks/test/watch diff --git a/packages/yucca-api/Dockerfile b/packages/yucca-api/Dockerfile index 6f847ab7..1fcc86c2 100644 --- a/packages/yucca-api/Dockerfile +++ b/packages/yucca-api/Dockerfile @@ -66,7 +66,7 @@ RUN npm install -g pnpm@10.28.1 RUN curl https://mise.run | sh RUN mise trust RUN pnpm i --frozen-lockfile -RUN mise yucca-api:build +RUN mise //packages/yucca-api:build RUN pnpm --filter yucca-api deploy /deploy --prod --legacy FROM ${ALPINE_IMAGE} diff --git a/.mise/tasks/yucca-metrics-worker/build b/packages/yucca-metrics-worker/.mise/tasks/build similarity index 80% rename from .mise/tasks/yucca-metrics-worker/build rename to packages/yucca-metrics-worker/.mise/tasks/build index db4cf78c..4ce969a1 100755 --- a/.mise/tasks/yucca-metrics-worker/build +++ b/packages/yucca-metrics-worker/.mise/tasks/build @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Build yucca-metrics-worker" -#MISE depends=["common:build"] +#MISE depends=["//:common:build"] set -e NODE_ENV=production pnpm --filter yucca-metrics-worker build diff --git a/.mise/tasks/yucca-metrics-worker/dev b/packages/yucca-metrics-worker/.mise/tasks/dev similarity index 80% rename from .mise/tasks/yucca-metrics-worker/dev rename to packages/yucca-metrics-worker/.mise/tasks/dev index 51d8dd9e..0fe5820d 100755 --- a/.mise/tasks/yucca-metrics-worker/dev +++ b/packages/yucca-metrics-worker/.mise/tasks/dev @@ -1,7 +1,7 @@ #!/usr/bin/env bash #MISE description="Run yucca-metrics-worker in development mode" -#MISE depends=["common:build"] -#MISE dir="{{config_root}}" +#MISE depends=["//:common:build"] +#MISE dir="{{config_root}}/../.." set -e source "$(dirname "$0")/env" diff --git a/.mise/tasks/yucca-metrics-worker/env b/packages/yucca-metrics-worker/.mise/tasks/env similarity index 100% rename from .mise/tasks/yucca-metrics-worker/env rename to packages/yucca-metrics-worker/.mise/tasks/env diff --git a/.mise/tasks/yucca-metrics-worker/test/_default b/packages/yucca-metrics-worker/.mise/tasks/test/_default similarity index 100% rename from .mise/tasks/yucca-metrics-worker/test/_default rename to packages/yucca-metrics-worker/.mise/tasks/test/_default diff --git a/.mise/tasks/yucca-metrics-worker/test/integration b/packages/yucca-metrics-worker/.mise/tasks/test/integration similarity index 100% rename from .mise/tasks/yucca-metrics-worker/test/integration rename to packages/yucca-metrics-worker/.mise/tasks/test/integration diff --git a/packages/yucca-metrics-worker/Dockerfile b/packages/yucca-metrics-worker/Dockerfile index 522b5d6b..29aaad7e 100644 --- a/packages/yucca-metrics-worker/Dockerfile +++ b/packages/yucca-metrics-worker/Dockerfile @@ -66,7 +66,7 @@ RUN npm install -g pnpm@10.28.1 RUN curl https://mise.run | sh RUN mise trust RUN pnpm i --frozen-lockfile -RUN mise yucca-metrics-worker:build +RUN mise //packages/yucca-metrics-worker:build RUN pnpm --filter yucca-metrics-worker deploy /deploy --prod --legacy FROM ${ALPINE_IMAGE} diff --git a/.mise/tasks/yucca-sdk/orchestration-api/build b/packages/yucca-sdk/orchestration-api/.mise/tasks/build similarity index 75% rename from .mise/tasks/yucca-sdk/orchestration-api/build rename to packages/yucca-sdk/orchestration-api/.mise/tasks/build index 5481e75f..141d97a9 100755 --- a/.mise/tasks/yucca-sdk/orchestration-api/build +++ b/packages/yucca-sdk/orchestration-api/.mise/tasks/build @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Build yucca-sdk/orchestration-api" -#MISE depends=["yucca-api-client:build"] +#MISE depends=["//packages/yucca-api-client:build"] set -e NODE_ENV=production pnpm --filter @futo-org/backups-orchestrator-api build diff --git a/.mise/tasks/yucca-sdk/orchestration-api/dev b/packages/yucca-sdk/orchestration-api/.mise/tasks/dev similarity index 66% rename from .mise/tasks/yucca-sdk/orchestration-api/dev rename to packages/yucca-sdk/orchestration-api/.mise/tasks/dev index 04e4a79d..003a7cf8 100755 --- a/.mise/tasks/yucca-sdk/orchestration-api/dev +++ b/packages/yucca-sdk/orchestration-api/.mise/tasks/dev @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Run yucca-sdk/orchestration-api in development mode" -#MISE depends=["yucca-sdk:orchestration-ui:generate-fetch-client"] +#MISE depends=["//packages/yucca-sdk/orchestration-ui:generate-fetch-client"] set -e pnpm --filter @futo-org/backups-orchestrator-api dev diff --git a/.mise/tasks/yucca-sdk/orchestration-api/start b/packages/yucca-sdk/orchestration-api/.mise/tasks/start similarity index 100% rename from .mise/tasks/yucca-sdk/orchestration-api/start rename to packages/yucca-sdk/orchestration-api/.mise/tasks/start diff --git a/.mise/tasks/yucca-sdk/orchestration-api/test/_default b/packages/yucca-sdk/orchestration-api/.mise/tasks/test/_default similarity index 100% rename from .mise/tasks/yucca-sdk/orchestration-api/test/_default rename to packages/yucca-sdk/orchestration-api/.mise/tasks/test/_default diff --git a/.mise/tasks/yucca-sdk/orchestration-api/test/integration b/packages/yucca-sdk/orchestration-api/.mise/tasks/test/integration similarity index 100% rename from .mise/tasks/yucca-sdk/orchestration-api/test/integration rename to packages/yucca-sdk/orchestration-api/.mise/tasks/test/integration diff --git a/.mise/tasks/yucca-sdk/orchestration-ui/build b/packages/yucca-sdk/orchestration-ui/.mise/tasks/build similarity index 69% rename from .mise/tasks/yucca-sdk/orchestration-ui/build rename to packages/yucca-sdk/orchestration-ui/.mise/tasks/build index 006a939b..412f03ae 100755 --- a/.mise/tasks/yucca-sdk/orchestration-ui/build +++ b/packages/yucca-sdk/orchestration-ui/.mise/tasks/build @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Build yucca-sdk/orchestration-ui" -#MISE depends=["yucca-sdk:orchestration-ui:generate-fetch-client"] +#MISE depends=[":generate-fetch-client"] set -e NODE_ENV=production pnpm --filter @futo-org/backups-orchestrator-ui build diff --git a/.mise/tasks/yucca-sdk/orchestration-ui/check b/packages/yucca-sdk/orchestration-ui/.mise/tasks/check similarity index 100% rename from .mise/tasks/yucca-sdk/orchestration-ui/check rename to packages/yucca-sdk/orchestration-ui/.mise/tasks/check diff --git a/.mise/tasks/yucca-sdk/orchestration-ui/dev b/packages/yucca-sdk/orchestration-ui/.mise/tasks/dev similarity index 78% rename from .mise/tasks/yucca-sdk/orchestration-ui/dev rename to packages/yucca-sdk/orchestration-ui/.mise/tasks/dev index b0722677..2518491a 100755 --- a/.mise/tasks/yucca-sdk/orchestration-ui/dev +++ b/packages/yucca-sdk/orchestration-ui/.mise/tasks/dev @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Run yucca-sdk/orchestration-ui in development mode" -#MISE depends=["yucca-sdk:orchestration-ui:generate-fetch-client"] +#MISE depends=[":generate-fetch-client"] set -e export ORCHESTRATOR_WEB_PORT=${ORCHESTRATOR_WEB_PORT:-36066} diff --git a/.mise/tasks/yucca-sdk/orchestration-ui/generate-fetch-client b/packages/yucca-sdk/orchestration-ui/.mise/tasks/generate-fetch-client similarity index 78% rename from .mise/tasks/yucca-sdk/orchestration-ui/generate-fetch-client rename to packages/yucca-sdk/orchestration-ui/.mise/tasks/generate-fetch-client index e94cdf28..8d16d3f2 100755 --- a/.mise/tasks/yucca-sdk/orchestration-ui/generate-fetch-client +++ b/packages/yucca-sdk/orchestration-ui/.mise/tasks/generate-fetch-client @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Generate fetch client for yucca-sdk/orchestration-ui" -#MISE depends=["yucca-sdk:orchestration-api:build"] +#MISE depends=["//packages/yucca-sdk/orchestration-api:build"] set -e pnpm --filter @futo-org/backups-orchestrator-api sync:openapi diff --git a/.mise/tasks/yucca-sdk/orchestration-ui/preview b/packages/yucca-sdk/orchestration-ui/.mise/tasks/preview similarity index 75% rename from .mise/tasks/yucca-sdk/orchestration-ui/preview rename to packages/yucca-sdk/orchestration-ui/.mise/tasks/preview index 0d625178..e96228b1 100755 --- a/.mise/tasks/yucca-sdk/orchestration-ui/preview +++ b/packages/yucca-sdk/orchestration-ui/.mise/tasks/preview @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Run yucca-sdk/orchestration-ui in preview mode" -#MISE depends=["yucca-sdk:orchestration-ui:build"] +#MISE depends=[":build"] set -e pnpm --filter @futo-org/backups-orchestrator-ui preview --host diff --git a/.mise/tasks/yucca-sdk/orchestration-ui/test/_default b/packages/yucca-sdk/orchestration-ui/.mise/tasks/test/_default similarity index 100% rename from .mise/tasks/yucca-sdk/orchestration-ui/test/_default rename to packages/yucca-sdk/orchestration-ui/.mise/tasks/test/_default diff --git a/.mise/tasks/yucca-sdk/orchestration-ui/test/e2e/web/_default b/packages/yucca-sdk/orchestration-ui/.mise/tasks/test/e2e/web/_default similarity index 72% rename from .mise/tasks/yucca-sdk/orchestration-ui/test/e2e/web/_default rename to packages/yucca-sdk/orchestration-ui/.mise/tasks/test/e2e/web/_default index 6b0fa0c0..52661c7d 100755 --- a/.mise/tasks/yucca-sdk/orchestration-ui/test/e2e/web/_default +++ b/packages/yucca-sdk/orchestration-ui/.mise/tasks/test/e2e/web/_default @@ -1,6 +1,6 @@ #!/usr/bin/env bash #MISE description="Run end-to-end tests for yucca-sdk/orchestration-ui" -#MISE depends=["yucca-sdk:orchestration-ui:test:install-deps"] +#MISE depends=[":test:install-deps"] set -e pnpm --filter @futo-org/backups-orchestrator-ui test:e2e "$@" diff --git a/.mise/tasks/yucca-sdk/orchestration-ui/test/e2e/web/create b/packages/yucca-sdk/orchestration-ui/.mise/tasks/test/e2e/web/create similarity index 100% rename from .mise/tasks/yucca-sdk/orchestration-ui/test/e2e/web/create rename to packages/yucca-sdk/orchestration-ui/.mise/tasks/test/e2e/web/create diff --git a/.mise/tasks/yucca-sdk/orchestration-ui/test/install-deps b/packages/yucca-sdk/orchestration-ui/.mise/tasks/test/install-deps similarity index 100% rename from .mise/tasks/yucca-sdk/orchestration-ui/test/install-deps rename to packages/yucca-sdk/orchestration-ui/.mise/tasks/test/install-deps diff --git a/tf/pages/.env b/tf/pages/.env index ac25582b..47f0898e 100644 --- a/tf/pages/.env +++ b/tf/pages/.env @@ -1,4 +1,4 @@ -# op:// references only, resolved by the docs:deploy / docs:destroy mise tasks +# op:// references only, resolved by the //packages/docs:deploy / //packages/docs:destroy mise tasks # and .github/workflows/docs*.yml. Every item is readable by every env SA. export AWS_ACCESS_KEY_ID="op://yucca_tf/TF_STATE_S3_ACCESS_KEY/password" diff --git a/tf/pages/README.md b/tf/pages/README.md index 54e96e04..f61c41b4 100644 --- a/tf/pages/README.md +++ b/tf/pages/README.md @@ -24,7 +24,7 @@ previews; `TF_VAR_stage` is empty on main and `pr-` for a preview. `docs/site` stage (custom domain + CNAME). The Pages project and the uploaded preview deployment itself are left in place. -Both run `mise run docs:deploy` / `mise run docs:destroy`, so an operator can +Both run `mise run //packages/docs:deploy` / `mise run //packages/docs:destroy`, so an operator can do the same locally. ## Prerequisites @@ -45,9 +45,9 @@ CI uses the existing `OP_TF_YUCCA_PROD_ENV` (main) and `OP_TF_YUCCA_STAGING_ENV` ## Running locally ```bash -mise docs:build -ENVIRONMENT=dev TF_VAR_stage=pr-0 mise docs:deploy # https://docs.pr-0.dev.futo.cloud -ENVIRONMENT=dev TF_VAR_stage=pr-0 mise docs:destroy +mise //packages/docs:build +ENVIRONMENT=dev TF_VAR_stage=pr-0 mise //packages/docs:deploy # https://docs.pr-0.dev.futo.cloud +ENVIRONMENT=dev TF_VAR_stage=pr-0 mise //packages/docs:destroy OP_ENV_FILE=tf/pages/.env ENVIRONMENT=prod tf/op-run.sh terragrunt run --all plan --working-dir tf/pages/docs ``` From 8c20fe5856c5c00146bf0fa9f32035a5dfbeca41 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Mon, 28 Sep 2026 14:13:20 +0100 Subject: [PATCH 2/2] feat(yucca sdk): freeform bandwidth limit (#713) --- .../settings/ImmichSettingsBandwidth.svelte | 33 ++++++++----------- .../src/lib/services/config.service.spec.ts | 27 ++++++++++----- .../src/lib/services/config.service.ts | 26 ++++++++------- 3 files changed, 47 insertions(+), 39 deletions(-) diff --git a/packages/yucca-sdk/orchestration-ui/src/lib/components/integrations/immich/settings/ImmichSettingsBandwidth.svelte b/packages/yucca-sdk/orchestration-ui/src/lib/components/integrations/immich/settings/ImmichSettingsBandwidth.svelte index 06043f04..d4e39044 100644 --- a/packages/yucca-sdk/orchestration-ui/src/lib/components/integrations/immich/settings/ImmichSettingsBandwidth.svelte +++ b/packages/yucca-sdk/orchestration-ui/src/lib/components/integrations/immich/settings/ImmichSettingsBandwidth.svelte @@ -5,7 +5,7 @@ defaultQuietHoursStart, toBandwidthDto, toBandwidthForm, - unlimitedBandwidth, + toBytesPerSec, useConfig, useUpdateConfig, } from "$lib/services/config.service"; @@ -14,6 +14,7 @@ Field, HStack, LoadingSpinner, + NumberInput, Select, Stack, Switch, @@ -21,16 +22,6 @@ } from "@immich/ui"; import { mdiSpeedometerSlow } from "@mdi/js"; - const bytesPerMegabyte = 1_000_000; - - const speeds = [ - { value: unlimitedBandwidth, label: "No limit" }, - ...[0.5, 1, 2, 5, 10, 20, 50, 100].map((megabytes) => ({ - value: String(megabytes * bytesPerMegabyte), - label: `${megabytes} MB/s`, - })), - ]; - const hours = Array.from({ length: 24 }, (_, hour) => ({ value: `${String(hour).padStart(2, "0")}:00`, label: `${String(hour).padStart(2, "0")}:00`, @@ -39,7 +30,7 @@ const config = useConfig(); const mutation = useUpdateConfig(); - let speed = $state(unlimitedBandwidth); + let mbps = $state(); let quiet = $state(false); let quietStart = $state(defaultQuietHoursStart); let quietEnd = $state(defaultQuietHoursEnd); @@ -50,7 +41,7 @@ return; } - ({ speed, quiet, quietStart, quietEnd } = toBandwidthForm( + ({ mbps, quiet, quietStart, quietEnd } = toBandwidthForm( config.data.bandwidth, )); }; @@ -64,11 +55,11 @@ load(); }); - const limited = $derived(speed !== unlimitedBandwidth); + const limited = $derived(toBytesPerSec(mbps) > 0); const onSave = () => { mutation.mutate({ - bandwidth: toBandwidthDto({ speed, quiet, quietStart, quietEnd }), + bandwidth: toBandwidthDto({ mbps, quiet, quietStart, quietEnd }), }); }; @@ -84,13 +75,15 @@ {:else} -