diff --git a/frontend/svelte5-best-practices.mdc b/.claude/skills/svelte-frontend/SKILL.md similarity index 98% rename from frontend/svelte5-best-practices.mdc rename to .claude/skills/svelte-frontend/SKILL.md index 6951584bc5..41d65a12be 100644 --- a/frontend/svelte5-best-practices.mdc +++ b/.claude/skills/svelte-frontend/SKILL.md @@ -1,8 +1,8 @@ --- -description: -globs: frontend/src/**/*.svelte -alwaysApply: false +name: svelte-frontend +description: Svelte coding guidelines for the Windmill frontend. MUST use when writing or modifying code in the frontend directory. --- + # Svelte 5 Best Practices This guide outlines best practices for developing with Svelte 5, incorporating the new Runes API and other modern Svelte features. These rules MUST NOT be applied on svelte 4 files unless explicitly asked to do so. diff --git a/.github/workflows/check-org-membership.yml b/.github/workflows/check-org-membership.yml index d8d648e659..eb338d3188 100644 --- a/.github/workflows/check-org-membership.yml +++ b/.github/workflows/check-org-membership.yml @@ -4,9 +4,10 @@ on: workflow_call: inputs: commenter: - required: true + required: false type: string - description: 'The username to check for organization membership' + default: '' + description: 'The username to check. Auto-detected from the event context if not provided.' organization: required: false type: string @@ -32,11 +33,27 @@ jobs: outputs: is_member: ${{ steps.check-membership.outputs.is_member }} steps: + - name: Determine commenter + id: determine-commenter + run: | + COMMENTER="${{ inputs.commenter }}" + if [[ -z "$COMMENTER" ]]; then + if [[ "${{ github.event_name }}" == "issue_comment" || \ + "${{ github.event_name }}" == "pull_request_review_comment" ]]; then + COMMENTER="${{ github.event.comment.user.login }}" + elif [[ "${{ github.event_name }}" == "pull_request_review" ]]; then + COMMENTER="${{ github.event.review.user.login }}" + else + COMMENTER="${{ github.event.issue.user.login }}" + fi + fi + echo "commenter=$COMMENTER" >> $GITHUB_OUTPUT + - name: Check organization membership id: check-membership env: ORG_ACCESS_TOKEN: ${{ secrets.access_token }} - COMMENTER: ${{ inputs.commenter }} + COMMENTER: ${{ steps.determine-commenter.outputs.commenter }} ORG: ${{ inputs.organization }} TRUSTED_BOT: ${{ inputs.trusted_bot }} run: | diff --git a/.github/workflows/claude-fast.yml b/.github/workflows/claude-fast.yml index 9ca2f5d8ce..4ad53d326f 100644 --- a/.github/workflows/claude-fast.yml +++ b/.github/workflows/claude-fast.yml @@ -11,40 +11,18 @@ on: types: [submitted] jobs: - determine-commenter: + check-membership: if: | (github.event_name == 'issue_comment' && contains(github.event.comment.body, '/ai-fast')) || (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '/ai-fast')) || (github.event_name == 'pull_request_review' && contains(github.event.review.body, '/ai-fast')) || (github.event_name == 'issues' && contains(github.event.issue.body, '/ai-fast')) - runs-on: ubicloud-standard-2 - outputs: - commenter: ${{ steps.determine-commenter.outputs.commenter }} - steps: - - name: Determine commenter - id: determine-commenter - run: | - # Work out who wrote the comment / review - if [[ "${{ github.event_name }}" == "issue_comment" || \ - "${{ github.event_name }}" == "pull_request_review_comment" ]]; then - COMMENTER="${{ github.event.comment.user.login }}" - elif [[ "${{ github.event_name }}" == "pull_request_review" ]]; then - COMMENTER="${{ github.event.review.user.login }}" - else - COMMENTER="${{ github.event.issue.user.login }}" - fi - echo "commenter=$COMMENTER" >> $GITHUB_OUTPUT - - check-membership: - needs: determine-commenter uses: ./.github/workflows/check-org-membership.yml - with: - commenter: ${{ needs.determine-commenter.outputs.commenter }} secrets: access_token: ${{ secrets.ORG_ACCESS_TOKEN }} claude-code-action: - needs: [determine-commenter, check-membership] + needs: check-membership if: | needs.check-membership.outputs.is_member == 'true' runs-on: ubicloud-standard-8 diff --git a/.github/workflows/claude-plan.yml b/.github/workflows/claude-plan.yml index c9abc3465b..c0457dabed 100644 --- a/.github/workflows/claude-plan.yml +++ b/.github/workflows/claude-plan.yml @@ -11,40 +11,18 @@ on: types: [submitted] jobs: - determine-commenter: + check-membership: if: | (github.event_name == 'issue_comment' && contains(github.event.comment.body, '/plan')) || (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '/plan')) || (github.event_name == 'pull_request_review' && contains(github.event.review.body, '/plan')) || (github.event_name == 'issues' && contains(github.event.issue.body, '/plan')) - runs-on: ubicloud-standard-2 - outputs: - commenter: ${{ steps.determine-commenter.outputs.commenter }} - steps: - - name: Determine commenter - id: determine-commenter - run: | - # Work out who wrote the comment / review - if [[ "${{ github.event_name }}" == "issue_comment" || \ - "${{ github.event_name }}" == "pull_request_review_comment" ]]; then - COMMENTER="${{ github.event.comment.user.login }}" - elif [[ "${{ github.event_name }}" == "pull_request_review" ]]; then - COMMENTER="${{ github.event.review.user.login }}" - else - COMMENTER="${{ github.event.issue.user.login }}" - fi - echo "commenter=$COMMENTER" >> $GITHUB_OUTPUT - - check-membership: - needs: determine-commenter uses: ./.github/workflows/check-org-membership.yml - with: - commenter: ${{ needs.determine-commenter.outputs.commenter }} secrets: access_token: ${{ secrets.ORG_ACCESS_TOKEN }} claude-plan-action: - needs: [determine-commenter, check-membership] + needs: check-membership if: | needs.check-membership.outputs.is_member == 'true' runs-on: ubicloud-standard-4 diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index ad1e234d98..88dacf80ef 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -11,40 +11,18 @@ on: types: [submitted] jobs: - determine-commenter: + check-membership: if: | (github.event_name == 'issue_comment' && contains(github.event.comment.body, '/ai')) || (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '/ai')) || (github.event_name == 'pull_request_review' && contains(github.event.review.body, '/ai')) || (github.event_name == 'issues' && contains(github.event.issue.body, '/ai')) - runs-on: ubicloud-standard-2 - outputs: - commenter: ${{ steps.determine-commenter.outputs.commenter }} - steps: - - name: Determine commenter - id: determine-commenter - run: | - # Work out who wrote the comment / review - if [[ "${{ github.event_name }}" == "issue_comment" || \ - "${{ github.event_name }}" == "pull_request_review_comment" ]]; then - COMMENTER="${{ github.event.comment.user.login }}" - elif [[ "${{ github.event_name }}" == "pull_request_review" ]]; then - COMMENTER="${{ github.event.review.user.login }}" - else - COMMENTER="${{ github.event.issue.user.login }}" - fi - echo "commenter=$COMMENTER" >> $GITHUB_OUTPUT - - check-membership: - needs: determine-commenter uses: ./.github/workflows/check-org-membership.yml - with: - commenter: ${{ needs.determine-commenter.outputs.commenter }} secrets: access_token: ${{ secrets.ORG_ACCESS_TOKEN }} claude-code-action: - needs: [determine-commenter, check-membership] + needs: check-membership if: | needs.check-membership.outputs.is_member == 'true' runs-on: ubicloud-standard-8 diff --git a/.github/workflows/create-docs.yml b/.github/workflows/create-docs.yml deleted file mode 100644 index e6b313617c..0000000000 --- a/.github/workflows/create-docs.yml +++ /dev/null @@ -1,39 +0,0 @@ -on: - issue_comment: - types: [created] - -jobs: - check-membership: - if: ${{ github.event.issue.pull_request && startsWith(github.event.comment.body, '/docs') }} - uses: ./.github/workflows/check-org-membership.yml - with: - commenter: ${{ github.event.comment.user.login }} - secrets: - access_token: ${{ secrets.ORG_ACCESS_TOKEN }} - - generate-token: - needs: check-membership - if: ${{ needs.check-membership.outputs.is_member == 'true' }} - runs-on: ubicloud-standard-2 - outputs: - app_token: ${{ steps.app.outputs.token }} - steps: - - name: Generate an installation token - id: app - uses: actions/create-github-app-token@v2 - with: - app-id: ${{ vars.INTERNAL_APP_ID }} - private-key: ${{ secrets.INTERNAL_APP_KEY }} - owner: windmill-labs - - trigger-docs: - needs: [generate-token, check-membership] - if: ${{ needs.check-membership.outputs.is_member == 'true' }} - uses: windmill-labs/windmilldocs/.github/workflows/create-docs.yml@main - with: - pr_number: ${{ github.event.issue.number }} - repo: ${{ github.event.repository.name }} - comment_text: ${{ github.event.comment.body }} - secrets: - DOCS_TOKEN: ${{ needs.generate-token.outputs.app_token }} - GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} diff --git a/.github/workflows/git-commands.yaml b/.github/workflows/git-commands.yaml index 6e44067283..4e93cd8e9b 100644 --- a/.github/workflows/git-commands.yaml +++ b/.github/workflows/git-commands.yaml @@ -5,8 +5,21 @@ on: types: [created] jobs: + check-membership: + if: >- + github.event.issue.pull_request && ( + startsWith(github.event.comment.body, '/updatesqlx') || + startsWith(github.event.comment.body, '/demo') || + startsWith(github.event.comment.body, '/eeref') || + startsWith(github.event.comment.body, '/docs') + ) + uses: ./.github/workflows/check-org-membership.yml + secrets: + access_token: ${{ secrets.ORG_ACCESS_TOKEN }} + update-sqlx: - if: github.event.issue.pull_request && startsWith(github.event.comment.body, '/updatesqlx') + needs: check-membership + if: needs.check-membership.outputs.is_member == 'true' && startsWith(github.event.comment.body, '/updatesqlx') runs-on: ubicloud-standard-8 permissions: contents: write @@ -121,7 +134,8 @@ jobs: }) demo: - if: github.event.issue.pull_request && startsWith(github.event.comment.body, '/demo') + needs: check-membership + if: needs.check-membership.outputs.is_member == 'true' && startsWith(github.event.comment.body, '/demo') runs-on: ubicloud-standard-2 permissions: contents: read @@ -200,7 +214,8 @@ jobs: fi update-ee-ref: - if: github.event.issue.pull_request && startsWith(github.event.comment.body, '/eeref') + needs: check-membership + if: needs.check-membership.outputs.is_member == 'true' && startsWith(github.event.comment.body, '/eeref') runs-on: ubicloud-standard-2 permissions: contents: write @@ -283,3 +298,35 @@ jobs: repo: context.repo.repo, body: 'Successfully updated ee-repo-ref.txt' }) + + update-docs: + needs: check-membership + if: needs.check-membership.outputs.is_member == 'true' && startsWith(github.event.comment.body, '/docs') + runs-on: ubicloud-standard-2 + permissions: + contents: read + pull-requests: read + issues: read + steps: + - uses: actions/create-github-app-token@v2 + id: app + with: + app-id: ${{ vars.INTERNAL_APP_ID }} + private-key: ${{ secrets.INTERNAL_APP_KEY }} + owner: ${{ github.repository_owner }} + repositories: | + windmilldocs + + - name: Trigger docs update + env: + GH_TOKEN: ${{ steps.app.outputs.token }} + COMMENT_TEXT: ${{ github.event.comment.body }} + run: | + jq -n \ + --argjson pr_number ${{ github.event.issue.number }} \ + --arg repo "${{ github.event.repository.name }}" \ + --arg comment "$COMMENT_TEXT" \ + '{event_type: "create-docs", client_payload: {pr_number: $pr_number, repo: $repo, comment_text: $comment}}' | \ + gh api repos/windmill-labs/windmilldocs/dispatches \ + --method POST \ + --input - diff --git a/.github/workflows/spawn-ephemeral-backend.yml b/.github/workflows/spawn-ephemeral-backend.yml index 9070f5af0d..725890031a 100644 --- a/.github/workflows/spawn-ephemeral-backend.yml +++ b/.github/workflows/spawn-ephemeral-backend.yml @@ -13,38 +13,16 @@ on: type: number jobs: - determine-commenter: + check-membership: if: | (github.event_name == 'issue_comment' && contains(github.event.comment.body, '/spawnbackend')) || (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '/spawnbackend')) - runs-on: ubicloud-standard-2 - outputs: - commenter: ${{ steps.determine-commenter.outputs.commenter }} - steps: - - name: Determine commenter - id: determine-commenter - run: | - # Work out who wrote the comment / review - if [[ "${{ github.event_name }}" == "issue_comment" || \ - "${{ github.event_name }}" == "pull_request_review_comment" ]]; then - COMMENTER="${{ github.event.comment.user.login }}" - elif [[ "${{ github.event_name }}" == "pull_request_review" ]]; then - COMMENTER="${{ github.event.review.user.login }}" - else - COMMENTER="${{ github.event.issue.user.login }}" - fi - echo "commenter=$COMMENTER" >> $GITHUB_OUTPUT - - check-membership: - needs: determine-commenter uses: ./.github/workflows/check-org-membership.yml - with: - commenter: ${{ needs.determine-commenter.outputs.commenter }} secrets: access_token: ${{ secrets.ORG_ACCESS_TOKEN }} spawn-backend: - needs: [determine-commenter, check-membership] + needs: check-membership # Only run on PR comments that contain /spawn-backend, or manual dispatch if: | github.event_name == 'workflow_dispatch' || diff --git a/.mcp.json b/.mcp.json index 8a587025cd..d71108f978 100644 --- a/.mcp.json +++ b/.mcp.json @@ -3,6 +3,10 @@ "svelte": { "type": "http", "url": "https://mcp.svelte.dev/mcp" + }, + "playwright": { + "command": "npx", + "args": ["@playwright/mcp@latest"] } } } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index fa40577230..e8c4b0e5f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,149 @@ # Changelog +## [1.635.1](https://github.com/windmill-labs/windmill/compare/v1.635.0...v1.635.1) (2026-02-15) + + +### Bug Fixes + +* pin strum_macros to 0.27 to match strum version ([#7957](https://github.com/windmill-labs/windmill/issues/7957)) ([68f766e](https://github.com/windmill-labs/windmill/commit/68f766e1ae54dbe2fe42769559d81d4d76a409ef)) + +## [1.635.0](https://github.com/windmill-labs/windmill/compare/v1.634.6...v1.635.0) (2026-02-15) + + +### Features + +* add Kubernetes operator and instance settings YAML editor ([#7836](https://github.com/windmill-labs/windmill/issues/7836)) ([82e5f6d](https://github.com/windmill-labs/windmill/commit/82e5f6de48e246a49b25e7d4ea7be65122e8772c)) +* add maven settings.xml support for java private registries ([#7940](https://github.com/windmill-labs/windmill/issues/7940)) ([581dde8](https://github.com/windmill-labs/windmill/commit/581dde8d0bc4428a5e95fcb5341239231ab36ef6)) +* **cli:** add `lint` command ([#7917](https://github.com/windmill-labs/windmill/issues/7917)) ([37d1277](https://github.com/windmill-labs/windmill/commit/37d1277b91d1b8a03e327b0585f547037482498d)) +* handle $var: and $res: in arrays for transform_json_value ([#7949](https://github.com/windmill-labs/windmill/issues/7949)) ([e4a34d0](https://github.com/windmill-labs/windmill/commit/e4a34d031b2bdb1b73a2a7ca68544fa34f83ed0f)) +* IaC hints, YAML editor for worker configs ([#7956](https://github.com/windmill-labs/windmill/issues/7956)) ([8b8e33e](https://github.com/windmill-labs/windmill/commit/8b8e33e2dc1a2b4c0effab70463f6d4b402a0f7f)) +* open-source worker group configuration UI ([#7954](https://github.com/windmill-labs/windmill/issues/7954)) ([6cf3f5f](https://github.com/windmill-labs/windmill/commit/6cf3f5f4a35a6139b5cdf9f44af29c3941f19645)) + + +### Bug Fixes + +* allow renaming of backend runnables in the UI ([6215760](https://github.com/windmill-labs/windmill/commit/6215760b1294d55245909a1c1de6c4cc8cef320a)) +* **go:** preserve proxy envs for go mod tidy/download ([#7946](https://github.com/windmill-labs/windmill/issues/7946)) ([8410b59](https://github.com/windmill-labs/windmill/commit/8410b59a8f23d62c57e497d170449643b46595a0)) +* Missing app policy for datatable ([#7944](https://github.com/windmill-labs/windmill/issues/7944)) ([a9dbd1f](https://github.com/windmill-labs/windmill/commit/a9dbd1f73fca9100b64106281802c43881181e78)) +* strip slack_oauth_client_secret from get_settings for non-admins ([#7950](https://github.com/windmill-labs/windmill/issues/7950)) ([43218c6](https://github.com/windmill-labs/windmill/commit/43218c62852490d0efafa8f94385bfe0e8f2ad82)) + +## [1.634.6](https://github.com/windmill-labs/windmill/compare/v1.634.5...v1.634.6) (2026-02-13) + + +### Bug Fixes + +* full build fix with new rustup config ([caccdd5](https://github.com/windmill-labs/windmill/commit/caccdd553ad72ff26c2c7c45f0ff3a25bd19a49f)) + +## [1.634.5](https://github.com/windmill-labs/windmill/compare/v1.634.4...v1.634.5) (2026-02-13) + + +### Bug Fixes + +* rust + java works with just /tmp mounted ([e144432](https://github.com/windmill-labs/windmill/commit/e144432a168178a531aa146def0aff478f3d1586)) + +## [1.634.4](https://github.com/windmill-labs/windmill/compare/v1.634.3...v1.634.4) (2026-02-13) + + +### Bug Fixes + +* improve style panel reactivity and CSS defaults ([#7935](https://github.com/windmill-labs/windmill/issues/7935)) ([eacbee3](https://github.com/windmill-labs/windmill/commit/eacbee38cb51d11b051612ac66994e6444e81bf2)) +* java + rust only relies on /tmp, + https proxy improvement for java ([791cb3e](https://github.com/windmill-labs/windmill/commit/791cb3e225ebda4b2f6f7181bc8265c378150d4e)) + +## [1.634.3](https://github.com/windmill-labs/windmill/compare/v1.634.2...v1.634.3) (2026-02-13) + + +### Bug Fixes + +* fix incorrect oauth base url refresh error ([b3a1629](https://github.com/windmill-labs/windmill/commit/b3a1629e56217605d059d1dceca43c9999a58592)) + +## [1.634.2](https://github.com/windmill-labs/windmill/compare/v1.634.1...v1.634.2) (2026-02-13) + + +### Bug Fixes + +* fix hub schedule not set at on-boarding ([beeb19d](https://github.com/windmill-labs/windmill/commit/beeb19db04e8e9059c63007d2402981c3e81f1e2)) + +## [1.634.1](https://github.com/windmill-labs/windmill/compare/v1.634.0...v1.634.1) (2026-02-13) + + +### Bug Fixes + +* conditionally skip relock on dep job ([#7860](https://github.com/windmill-labs/windmill/issues/7860)) ([d6c72df](https://github.com/windmill-labs/windmill/commit/d6c72df99a0a500bdd925fcdcba8abd8bbe537f5)) +* improve on-boarding experience ([4e38a4f](https://github.com/windmill-labs/windmill/commit/4e38a4f1083d880b0814e336d5e27cb40187fc28)) + +## [1.634.0](https://github.com/windmill-labs/windmill/compare/v1.633.1...v1.634.0) (2026-02-12) + + +### Features + +* add force_sandboxing global setting and #sandbox bash annotation ([#7816](https://github.com/windmill-labs/windmill/issues/7816)) ([2646629](https://github.com/windmill-labs/windmill/commit/2646629194f260d0be3a809be421bbab1307f927)) +* support for datatables in App Db studio ([#7930](https://github.com/windmill-labs/windmill/issues/7930)) ([6cee34a](https://github.com/windmill-labs/windmill/commit/6cee34a81da389faebb1474957a3989c4aadb00f)) + +## [1.633.1](https://github.com/windmill-labs/windmill/compare/v1.633.0...v1.633.1) (2026-02-12) + + +### Bug Fixes + +* add private registries support for RUST + java home nit ([e2c28e4](https://github.com/windmill-labs/windmill/commit/e2c28e42dbda0f7bf119efc8d587da0d30636a44)) + +## [1.633.0](https://github.com/windmill-labs/windmill/compare/v1.632.0...v1.633.0) (2026-02-12) + + +### Features + +* /health endpoints ([#7727](https://github.com/windmill-labs/windmill/issues/7727)) ([7df4aa4](https://github.com/windmill-labs/windmill/commit/7df4aa4fec021fc728950fc10db4d0401a205087)) + + +### Bug Fixes + +* save deployment msg in CE ([#7923](https://github.com/windmill-labs/windmill/issues/7923)) ([e9be616](https://github.com/windmill-labs/windmill/commit/e9be616d3c079a0c6fd98733c66560f2cc1ee40d)) + +## [1.632.0](https://github.com/windmill-labs/windmill/compare/v1.631.2...v1.632.0) (2026-02-12) + + +### Features + +* **ai:** add AWS bedrock session token support ([#7908](https://github.com/windmill-labs/windmill/issues/7908)) ([d95e4db](https://github.com/windmill-labs/windmill/commit/d95e4db8f31e70a645a5f41e287557933b257db8)) + + +### Bug Fixes + +* add kafka kerberos runtime packages ([#7918](https://github.com/windmill-labs/windmill/issues/7918)) ([22f22c2](https://github.com/windmill-labs/windmill/commit/22f22c26612b904c2b82b415ec9337213ef593c3)) +* **frontend:** redesign instance settings ([#7916](https://github.com/windmill-labs/windmill/issues/7916)) ([dd419ad](https://github.com/windmill-labs/windmill/commit/dd419ade94a992073dfd1a979bfeb8a5fadfb051)) +* hash long dedicated worker tags ([#7914](https://github.com/windmill-labs/windmill/issues/7914)) ([aaa1b92](https://github.com/windmill-labs/windmill/commit/aaa1b92300bdc0794de5356ef6750bab5d8d81a0)) + +## [1.631.2](https://github.com/windmill-labs/windmill/compare/v1.631.1...v1.631.2) (2026-02-11) + + +### Bug Fixes + +* **frontend:** revert CloseButton refactor that broke tag removal in MultiSelect ([#7909](https://github.com/windmill-labs/windmill/issues/7909)) ([b11d6ed](https://github.com/windmill-labs/windmill/commit/b11d6ed7940faddfe74a22b25bcb132527cbcec8)) +* nix flake libz.so for deno_core ([#7905](https://github.com/windmill-labs/windmill/issues/7905)) ([900c76c](https://github.com/windmill-labs/windmill/commit/900c76ccad09f58fc6adcfa8151db780249617f6)) +* strip unsupported schema fields for Google AI ([#7894](https://github.com/windmill-labs/windmill/issues/7894)) ([5effb87](https://github.com/windmill-labs/windmill/commit/5effb87a36793e20d17e678619091ef458fe8f0a)), closes [#7759](https://github.com/windmill-labs/windmill/issues/7759) + +## [1.631.1](https://github.com/windmill-labs/windmill/compare/v1.631.0...v1.631.1) (2026-02-11) + + +### Bug Fixes + +* add kafka-gssapi support to ee builds ([2815cfa](https://github.com/windmill-labs/windmill/commit/2815cfae1a5eefb2c553e893dc926e62ad1df528)) + +## [1.631.0](https://github.com/windmill-labs/windmill/compare/v1.630.2...v1.631.0) (2026-02-11) + + +### Features + +* **ai:** support 1M context window for Anthropic resources ([#7891](https://github.com/windmill-labs/windmill/issues/7891)) ([f22eb96](https://github.com/windmill-labs/windmill/commit/f22eb964e47defe9922ecdb6ab471dd4ca267952)) +* **uv:** index resolve strategy ([#7885](https://github.com/windmill-labs/windmill/issues/7885)) ([097d928](https://github.com/windmill-labs/windmill/commit/097d9288c58076882f1991e2fb33e4441fe332d3)) + + +### Bug Fixes + +* **frontend:** improve time picker ([#7893](https://github.com/windmill-labs/windmill/issues/7893)) ([31bfccc](https://github.com/windmill-labs/windmill/commit/31bfccc74588af10fc11fbbb0bc4833d65ff6421)) +* otel gracefully handle no native ts ([92c6018](https://github.com/windmill-labs/windmill/commit/92c601860f1e1211aa34838cd08900ba7334a20c)) +* waitJob getJob and streamJob in raw apps ([#7901](https://github.com/windmill-labs/windmill/issues/7901)) ([754b48c](https://github.com/windmill-labs/windmill/commit/754b48cb898dffe196339cea1c1598c9e1765cdc)) +* worker do not apply migrations anymore but wait for servers to do so ([7eb239f](https://github.com/windmill-labs/windmill/commit/7eb239f1e2eb1b71234a8d4265c7c5813e5861ae)) + ## [1.630.2](https://github.com/windmill-labs/windmill/compare/v1.630.1...v1.630.2) (2026-02-11) diff --git a/CLAUDE.md b/CLAUDE.md index 9f68fae3a1..7a5c365101 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -17,19 +17,52 @@ When implementing new features in Windmill, follow these best practices: ## Language-Specific Guides -- Backend (Rust): @backend/rust-best-practices.mdc + @backend/summarized_schema.txt -- Frontend (Svelte 5): @frontend/svelte5-best-practices.mdc +- Backend (Rust): see `backend/CLAUDE.md` and the `rust-backend` skill: `.claude/skills/rust-backend/SKILL.md` +- Frontend (Svelte 5): see `frontend/CLAUDE.md` and the `svelte-frontend` skill: `.claude/skills/svelte-frontend/SKILL.md` + +## Dev Environment + +- **Backend**: `cargo run` from `backend/` (API at http://localhost:8000) +- **Frontend**: `REMOTE=http://localhost:8000 npm run dev` from `frontend/` + - The `REMOTE` env var configures the Vite proxy target. Without it, API calls proxy to `https://app.windmill.dev` instead of the local backend. + - The dev server starts on port 3000 (or 3001+ if 3000 is in use). +- **Default login**: `admin@windmill.dev` / `changeme` +- **Instance settings**: navigate to `/#superadmin-settings` (opens the drawer overlay) + +## UI Testing with Playwright MCP + +When testing the frontend with the Playwright MCP tools: + +1. **Start servers**: Launch backend (`cargo run`) and frontend (`REMOTE=http://localhost:8000 npm run dev`) as background tasks +2. **Wait for readiness**: Backend takes ~60s to compile; check output for `health check completed`. Frontend starts in ~5s. +3. **Login flow**: Navigate to `/user/login`, click "Log in without third-party", fill email/password, submit +4. **Instance settings drawer**: Navigate to `/#superadmin-settings` to open the drawer directly +5. **Toggle components**: The YAML toggle uses a custom `` component where the checkbox is visually hidden (`sr-only`). Click the wrapper ` {#if enabled} -
+
+ {/if} diff --git a/frontend/src/lib/components/AuthSettings.svelte b/frontend/src/lib/components/AuthSettings.svelte index 8d9d90ff2b..c157808017 100644 --- a/frontend/src/lib/components/AuthSettings.svelte +++ b/frontend/src/lib/components/AuthSettings.svelte @@ -23,6 +23,7 @@ import Tooltip from './Tooltip.svelte' import { tick } from 'svelte' import { Popover } from './meltComponents' + import SettingsPageHeader from './settings/SettingsPageHeader.svelte' interface Props { snowflakeAccountIdentifier?: string @@ -30,6 +31,8 @@ requirePreexistingUserForOauth?: boolean baseUrl?: string scim?: import('svelte').Snippet + tab?: 'sso' | 'oauth' | 'scim' + hideTabs?: boolean } let { @@ -37,7 +40,9 @@ oauths = $bindable(), requirePreexistingUserForOauth = $bindable(), baseUrl, - scim + scim, + tab = $bindable('sso'), + hideTabs = false }: Props = $props() $effect(() => { @@ -87,8 +92,6 @@ let ssoClientName = $state('') let ssoNameInput = $state() - let tab: 'sso' | 'oauth' | 'scim' = $state('sso') - function createOAuthClient(name: string) { if (oauths && name) { // Create a new object to ensure the new item is added at the end @@ -212,34 +215,30 @@ } -
- - - - - -
+{#if !hideTabs} +
+ + + + + +
+{/if}
{#if oauths} {#if tab === 'sso'} + {#if !$enterpriseLicense || $enterpriseLicense.endsWith('_pro')} - + Without EE, the number of SSO users is limited to 10. SCIM/SAML is available on EE
{/if} - -
-
When at least one of the below options is set, users will be able to login to Windmill - via their third-party account. -
To test SSO, the recommended workflow is to to save the settings and try to login - in an incognito window. - Learn more -
-
-
-
{/if} {:else if tab == 'scim'} + {@render scim?.()} {/if} {/if} diff --git a/frontend/src/lib/components/AutheliaSetting.svelte b/frontend/src/lib/components/AutheliaSetting.svelte index ece8cb7d58..bd32b632a9 100644 --- a/frontend/src/lib/components/AutheliaSetting.svelte +++ b/frontend/src/lib/components/AutheliaSetting.svelte @@ -2,6 +2,7 @@ import IconedResourceType from './IconedResourceType.svelte' import TextInput from './text_input/TextInput.svelte' import Toggle from './Toggle.svelte' + import SettingCard from './instanceSettings/SettingCard.svelte' export let value: any @@ -46,7 +47,7 @@ /> {#if enabled} -
+ -
+ {/if}
diff --git a/frontend/src/lib/components/AuthentikSetting.svelte b/frontend/src/lib/components/AuthentikSetting.svelte index 70d56c5abf..6aa6a76d57 100644 --- a/frontend/src/lib/components/AuthentikSetting.svelte +++ b/frontend/src/lib/components/AuthentikSetting.svelte @@ -1,6 +1,7 @@
-
1080 ? 'pt-28' : 'pt-12')} > +
1080 ? 'pt-28' : 'pt-12' + )} + > {#if (!disableLogo && !$enterpriseLicense) || !$whitelabelNameStore}