From 68a6d4c9a8954178d90fd9bb14e1e70ecd8f5b7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Fri, 23 Jan 2026 20:13:04 +0100 Subject: [PATCH 1/8] :wrench: Add deploy plugin packages workflow placeholder and wrangle config files --- .github/workflows/plugins-deploy-package.yml | 11 +++++++++++ .github/workflows/plugins-deploy-packages.yml | 11 +++++++++++ plugins/apps/colors-to-tokens-plugin/wrangle.toml | 4 ++++ plugins/apps/contrast-plugin/wrangle.toml | 4 ++++ plugins/apps/create-palette-plugin/wrangle.toml | 4 ++++ plugins/apps/icons-plugin/wrangle.toml | 4 ++++ plugins/apps/lorem-ipsum-plugin/wrangle.toml | 4 ++++ plugins/apps/rename-layers-plugin/wrangle.toml | 5 +++++ plugins/apps/table-plugin/wrangle.toml | 5 +++++ 9 files changed, 52 insertions(+) create mode 100644 .github/workflows/plugins-deploy-package.yml create mode 100644 .github/workflows/plugins-deploy-packages.yml create mode 100644 plugins/apps/colors-to-tokens-plugin/wrangle.toml create mode 100644 plugins/apps/contrast-plugin/wrangle.toml create mode 100644 plugins/apps/create-palette-plugin/wrangle.toml create mode 100644 plugins/apps/icons-plugin/wrangle.toml create mode 100644 plugins/apps/lorem-ipsum-plugin/wrangle.toml create mode 100644 plugins/apps/rename-layers-plugin/wrangle.toml create mode 100644 plugins/apps/table-plugin/wrangle.toml diff --git a/.github/workflows/plugins-deploy-package.yml b/.github/workflows/plugins-deploy-package.yml new file mode 100644 index 0000000000..ca5fe817de --- /dev/null +++ b/.github/workflows/plugins-deploy-package.yml @@ -0,0 +1,11 @@ +name: Plugins/package deployer + +on: + workflow_dispatch: + +jobs: + print_text_job: + runs-on: ubuntu-latest + steps: + - name: Print Hello World + run: echo "Hello, World!" diff --git a/.github/workflows/plugins-deploy-packages.yml b/.github/workflows/plugins-deploy-packages.yml new file mode 100644 index 0000000000..cabc045f00 --- /dev/null +++ b/.github/workflows/plugins-deploy-packages.yml @@ -0,0 +1,11 @@ +name: Plugins/packages deployer + +on: + workflow_dispatch: + +jobs: + print_text_job: + runs-on: ubuntu-latest + steps: + - name: Print Hello World + run: echo "Hello, World!" diff --git a/plugins/apps/colors-to-tokens-plugin/wrangle.toml b/plugins/apps/colors-to-tokens-plugin/wrangle.toml new file mode 100644 index 0000000000..7722755890 --- /dev/null +++ b/plugins/apps/colors-to-tokens-plugin/wrangle.toml @@ -0,0 +1,4 @@ +name = "color-to-tokens-plugin" +compatibility_date = "2025-01-01" + +assets = { directory = "../../dist/apps/color-to-tokens-plugin/browser" } diff --git a/plugins/apps/contrast-plugin/wrangle.toml b/plugins/apps/contrast-plugin/wrangle.toml new file mode 100644 index 0000000000..726ae60d6e --- /dev/null +++ b/plugins/apps/contrast-plugin/wrangle.toml @@ -0,0 +1,4 @@ +name = "contrast-plugin" +compatibility_date = "2025-01-01" + +assets = { directory = "../../dist/apps/contrast-plugin/browser" } diff --git a/plugins/apps/create-palette-plugin/wrangle.toml b/plugins/apps/create-palette-plugin/wrangle.toml new file mode 100644 index 0000000000..74c4b73cb6 --- /dev/null +++ b/plugins/apps/create-palette-plugin/wrangle.toml @@ -0,0 +1,4 @@ +name = "create-palette-plugin" +compatibility_date = "2025-01-01" + +assets = { directory = "../../dist/apps/create-palette-plugin" } diff --git a/plugins/apps/icons-plugin/wrangle.toml b/plugins/apps/icons-plugin/wrangle.toml new file mode 100644 index 0000000000..26e7514ec8 --- /dev/null +++ b/plugins/apps/icons-plugin/wrangle.toml @@ -0,0 +1,4 @@ +name = "icons-plugin" +compatibility_date = "2025-01-01" + +assets = { directory = "../../dist/apps/icons-plugin/browser" } diff --git a/plugins/apps/lorem-ipsum-plugin/wrangle.toml b/plugins/apps/lorem-ipsum-plugin/wrangle.toml new file mode 100644 index 0000000000..9e4d9366f0 --- /dev/null +++ b/plugins/apps/lorem-ipsum-plugin/wrangle.toml @@ -0,0 +1,4 @@ +name = "lorem-ipsum-plugin" +compatibility_date = "2025-01-01" + +assets = { directory = "../../dist/apps/lorem-ipsum-plugin/browser" } diff --git a/plugins/apps/rename-layers-plugin/wrangle.toml b/plugins/apps/rename-layers-plugin/wrangle.toml new file mode 100644 index 0000000000..1dc6c2fe0a --- /dev/null +++ b/plugins/apps/rename-layers-plugin/wrangle.toml @@ -0,0 +1,5 @@ +name = "rename-layers-plugin" +compatibility_date = "2025-01-01" + +assets = { directory = "../../dist/apps/rename-layers-plugin/browser" } + diff --git a/plugins/apps/table-plugin/wrangle.toml b/plugins/apps/table-plugin/wrangle.toml new file mode 100644 index 0000000000..516dd54b1e --- /dev/null +++ b/plugins/apps/table-plugin/wrangle.toml @@ -0,0 +1,5 @@ +name = "table-plugin" +compatibility_date = "2025-01-01" + +assets = { directory = "../../dist/apps/table-plugin/browser" } + From 92a319ddd1e63c652c17c32583310ac45dbdbc8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Mon, 26 Jan 2026 09:33:37 +0100 Subject: [PATCH 2/8] :wrench: Rename wrangle to wrangler --- .github/workflows/plugins-deploy-api-doc.yml | 16 ++++++++++++++-- .../{wrangle.toml => wrangler.toml} | 4 ++++ .../{wrangle.toml => wrangler.toml} | 4 ++++ .../{wrangle.toml => wrangler.toml} | 4 ++++ .../icons-plugin/{wrangle.toml => wrangler.toml} | 4 ++++ .../{wrangle.toml => wrangler.toml} | 4 ++++ .../{wrangle.toml => wrangler.toml} | 3 +++ .../table-plugin/{wrangle.toml => wrangler.toml} | 3 +++ ...toml => wrangler-penpot-plugins-api-doc.toml} | 0 9 files changed, 40 insertions(+), 2 deletions(-) rename plugins/apps/colors-to-tokens-plugin/{wrangle.toml => wrangler.toml} (71%) rename plugins/apps/contrast-plugin/{wrangle.toml => wrangler.toml} (69%) rename plugins/apps/create-palette-plugin/{wrangle.toml => wrangler.toml} (70%) rename plugins/apps/icons-plugin/{wrangle.toml => wrangler.toml} (68%) rename plugins/apps/lorem-ipsum-plugin/{wrangle.toml => wrangler.toml} (70%) rename plugins/apps/rename-layers-plugin/{wrangle.toml => wrangler.toml} (71%) rename plugins/apps/table-plugin/{wrangle.toml => wrangler.toml} (68%) rename plugins/{wrangle-penpot-plugins-api-doc.toml => wrangler-penpot-plugins-api-doc.toml} (100%) diff --git a/.github/workflows/plugins-deploy-api-doc.yml b/.github/workflows/plugins-deploy-api-doc.yml index 62a87745bb..f8451e9816 100644 --- a/.github/workflows/plugins-deploy-api-doc.yml +++ b/.github/workflows/plugins-deploy-api-doc.yml @@ -11,7 +11,7 @@ on: - "plugins/libs/plugin-types/REAME.md" - "plugins/tools/typedoc.css" - "plugins/CHANGELOG.md" - - "plugins/wrangle-penpot-plugins-api-doc.toml" + - "plugins/wrangler-penpot-plugins-api-doc.toml" workflow_dispatch: inputs: gh_ref: @@ -98,4 +98,16 @@ jobs: workingDirectory: plugins apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - command: deploy --config wrangle-penpot-plugins-api-doc.toml --name ${{ env.WORKER_NAME }} + command: deploy --config wrangler-penpot-plugins-api-doc.toml --name ${{ env.WORKER_NAME }} + + - name: Notify Mattermost + if: failure() + uses: mattermost/action-mattermost-notify@master + with: + MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK }} + MATTERMOST_CHANNEL: bot-alerts-cicd + TEXT: | + ❌ 🧩📚 *[PENPOT PLUGINS] Error deploying API documentation.* + 📄 Triggered from ref: `${{ inputs.gh_ref }}` + 🔗 Run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} + @infra diff --git a/plugins/apps/colors-to-tokens-plugin/wrangle.toml b/plugins/apps/colors-to-tokens-plugin/wrangler.toml similarity index 71% rename from plugins/apps/colors-to-tokens-plugin/wrangle.toml rename to plugins/apps/colors-to-tokens-plugin/wrangler.toml index 7722755890..c1d45f3e87 100644 --- a/plugins/apps/colors-to-tokens-plugin/wrangle.toml +++ b/plugins/apps/colors-to-tokens-plugin/wrangler.toml @@ -2,3 +2,7 @@ name = "color-to-tokens-plugin" compatibility_date = "2025-01-01" assets = { directory = "../../dist/apps/color-to-tokens-plugin/browser" } + +[[routes]] +pattern = "WORKER_URI" +custom_domain = true diff --git a/plugins/apps/contrast-plugin/wrangle.toml b/plugins/apps/contrast-plugin/wrangler.toml similarity index 69% rename from plugins/apps/contrast-plugin/wrangle.toml rename to plugins/apps/contrast-plugin/wrangler.toml index 726ae60d6e..86f456ec95 100644 --- a/plugins/apps/contrast-plugin/wrangle.toml +++ b/plugins/apps/contrast-plugin/wrangler.toml @@ -2,3 +2,7 @@ name = "contrast-plugin" compatibility_date = "2025-01-01" assets = { directory = "../../dist/apps/contrast-plugin/browser" } + +[[routes]] +pattern = "WORKER_URI" +custom_domain = true diff --git a/plugins/apps/create-palette-plugin/wrangle.toml b/plugins/apps/create-palette-plugin/wrangler.toml similarity index 70% rename from plugins/apps/create-palette-plugin/wrangle.toml rename to plugins/apps/create-palette-plugin/wrangler.toml index 74c4b73cb6..40f4f67a38 100644 --- a/plugins/apps/create-palette-plugin/wrangle.toml +++ b/plugins/apps/create-palette-plugin/wrangler.toml @@ -2,3 +2,7 @@ name = "create-palette-plugin" compatibility_date = "2025-01-01" assets = { directory = "../../dist/apps/create-palette-plugin" } + +[[routes]] +pattern = "WORKER_URI" +custom_domain = true diff --git a/plugins/apps/icons-plugin/wrangle.toml b/plugins/apps/icons-plugin/wrangler.toml similarity index 68% rename from plugins/apps/icons-plugin/wrangle.toml rename to plugins/apps/icons-plugin/wrangler.toml index 26e7514ec8..0a690dac57 100644 --- a/plugins/apps/icons-plugin/wrangle.toml +++ b/plugins/apps/icons-plugin/wrangler.toml @@ -2,3 +2,7 @@ name = "icons-plugin" compatibility_date = "2025-01-01" assets = { directory = "../../dist/apps/icons-plugin/browser" } + +[[routes]] +pattern = "WORKER_URI" +custom_domain = true diff --git a/plugins/apps/lorem-ipsum-plugin/wrangle.toml b/plugins/apps/lorem-ipsum-plugin/wrangler.toml similarity index 70% rename from plugins/apps/lorem-ipsum-plugin/wrangle.toml rename to plugins/apps/lorem-ipsum-plugin/wrangler.toml index 9e4d9366f0..398691c3ba 100644 --- a/plugins/apps/lorem-ipsum-plugin/wrangle.toml +++ b/plugins/apps/lorem-ipsum-plugin/wrangler.toml @@ -2,3 +2,7 @@ name = "lorem-ipsum-plugin" compatibility_date = "2025-01-01" assets = { directory = "../../dist/apps/lorem-ipsum-plugin/browser" } + +[[routes]] +pattern = "WORKER_URI" +custom_domain = true diff --git a/plugins/apps/rename-layers-plugin/wrangle.toml b/plugins/apps/rename-layers-plugin/wrangler.toml similarity index 71% rename from plugins/apps/rename-layers-plugin/wrangle.toml rename to plugins/apps/rename-layers-plugin/wrangler.toml index 1dc6c2fe0a..4fdc18597d 100644 --- a/plugins/apps/rename-layers-plugin/wrangle.toml +++ b/plugins/apps/rename-layers-plugin/wrangler.toml @@ -3,3 +3,6 @@ compatibility_date = "2025-01-01" assets = { directory = "../../dist/apps/rename-layers-plugin/browser" } +[[routes]] +pattern = "WORKER_URI" +custom_domain = true diff --git a/plugins/apps/table-plugin/wrangle.toml b/plugins/apps/table-plugin/wrangler.toml similarity index 68% rename from plugins/apps/table-plugin/wrangle.toml rename to plugins/apps/table-plugin/wrangler.toml index 516dd54b1e..9c95160a01 100644 --- a/plugins/apps/table-plugin/wrangle.toml +++ b/plugins/apps/table-plugin/wrangler.toml @@ -3,3 +3,6 @@ compatibility_date = "2025-01-01" assets = { directory = "../../dist/apps/table-plugin/browser" } +[[routes]] +pattern = "WORKER_URI" +custom_domain = true diff --git a/plugins/wrangle-penpot-plugins-api-doc.toml b/plugins/wrangler-penpot-plugins-api-doc.toml similarity index 100% rename from plugins/wrangle-penpot-plugins-api-doc.toml rename to plugins/wrangler-penpot-plugins-api-doc.toml From 5306bed548c6d985b32683afa335ddb683fe66c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Mon, 26 Jan 2026 09:34:01 +0100 Subject: [PATCH 3/8] :wrench: Define deploy plugin packages workflows --- .github/workflows/plugins-deploy-package.yml | 124 ++++++++++++++++- .github/workflows/plugins-deploy-packages.yml | 130 +++++++++++++++++- 2 files changed, 247 insertions(+), 7 deletions(-) diff --git a/.github/workflows/plugins-deploy-package.yml b/.github/workflows/plugins-deploy-package.yml index ca5fe817de..cad4b1524f 100644 --- a/.github/workflows/plugins-deploy-package.yml +++ b/.github/workflows/plugins-deploy-package.yml @@ -1,11 +1,127 @@ name: Plugins/package deployer on: + # Deploy package from manual action workflow_dispatch: + inputs: + gh_ref: + description: 'Name of the branch' + type: choice + required: true + default: 'develop' + options: + - develop + - staging + - main + plugin_name: + description: 'Pluging name (like plugins/apps/-plugin)' + type: string + required: true + workflow_call: + inputs: + gh_ref: + description: 'Name of the branch' + type: string + required: true + default: 'develop' + plugin_name: + description: 'Publig name (from plugins/apps/-plugin)' + type: string + required: true + +permissions: + contents: read jobs: - print_text_job: - runs-on: ubuntu-latest + deploy: + runs-on: penpot-runner-01 steps: - - name: Print Hello World - run: echo "Hello, World!" + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ inputs.gh_ref }} + + # START: Setup Node and PNPM enabling cache + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: .nvmrc + + - name: Enable PNPM + working-directory: ./plugins + shell: bash + run: | + corepack enable; + corepack install; + + - name: Get pnpm store path + id: pnpm-store + working-directory: ./plugins + shell: bash + run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT + + - name: Cache pnpm store + uses: actions/cache@v4 + with: + path: ${{ steps.pnpm-store.outputs.STORE_PATH }} + key: ${{ runner.os }}-pnpm-${{ hashFiles('plugins/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm- + # END: Setup Node and PNPM enabling cache + + - name: Install deps + working-directory: ./plugins + shell: bash + run: | + pnpm install --no-frozen-lockfile; + pnpm add -D -w wrangler@latest; + + - name: "Build package for ${{ inputs.plugin_name }}-plugin" + working-directory: plugins + shell: bash + run: npx nx build ${{ inputs.plugin_name }}-plugin + + - name: Select Worker name + run: | + REF="${{ inputs.gh_ref }}" + case "$REF" in + main) + echo "WORKER_NAME=${{ inputs.plugin_name }}-plugin-pro" >> $GITHUB_ENV + echo "WORKER_URI=${{ inputs.plugin_name }}.plugins.penpot.app" >> $GITHUB_ENV ;; + staging) + echo "WORKER_NAME=${{ inputs.plugin_name }}-plugin-pre" >> $GITHUB_ENV + echo "WORKER_URI=${{ inputs.plugin_name }}.plugins.penpot.dev" >> $GITHUB_ENV ;; + develop) + echo "WORKER_NAME=${{ inputs.plugin_name }}-plugin-hourly" >> $GITHUB_ENV + echo "WORKER_URI=${{ inputs.plugin_name }}.plugins.hourly.penpot.dev" >> $GITHUB_ENV ;; + *) echo "Unsupported branch ${REF}" && exit 1 ;; + esac + + - name: Set the custom url + working-directory: plugins + shell: bash + run: | + sed -i "s/WORKER_URI/${{ env.WORKER_URI }}/g" apps/${{ inputs.plugin_name }}-plugin/wrangler.toml + + - name: Deploy to Cloudflare Workers + uses: cloudflare/wrangler-action@v3 + with: + workingDirectory: plugins + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: deploy --config apps/${{ inputs.plugin_name }}-plugin/wrangler.toml --name ${{ env.WORKER_NAME }} + + - name: Notify Mattermost + if: failure() + uses: mattermost/action-mattermost-notify@master + with: + MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK }} + MATTERMOST_CHANNEL: bot-alerts-cicd + TEXT: | + ❌ 🧩📦 *[PENPOT PLUGINS] Error deploying ${{ env.WORKER_NAME }}.* + 📄 Triggered from ref: `${{ inputs.gh_ref }}` + Plugin name: `${{ inputs.plugin_name }}-plugin` + Cloudflare worker name: `${{ env.WORKER_NAME }}` + 🔗 Run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} + @infra diff --git a/.github/workflows/plugins-deploy-packages.yml b/.github/workflows/plugins-deploy-packages.yml index cabc045f00..d1060389d5 100644 --- a/.github/workflows/plugins-deploy-packages.yml +++ b/.github/workflows/plugins-deploy-packages.yml @@ -1,11 +1,135 @@ name: Plugins/packages deployer on: + push: + branches: + - develop + - staging + - main + paths: + - 'plugins/apps/*-plugin/**' + - 'libs/plugins-styles/**' workflow_dispatch: + inputs: + gh_ref: + description: 'Name of the branch' + type: choice + required: true + default: 'develop' + options: + - develop + - staging + - main jobs: - print_text_job: + detect-changes: runs-on: ubuntu-latest + outputs: + colors_to_tokens: ${{ steps.filter.outputs.colors_to_tokens }} + create_palette: ${{ steps.filter.outputs.create_palette }} + lorem_ipsum: ${{ steps.filter.outputs.lorem_ipsum }} + rename_layers: ${{ steps.filter.outputs.rename_layers }} + contrast: ${{ steps.filter.outputs.contrast }} + icons: ${{ steps.filter.outputs.icons }} + poc_state: ${{ steps.filter.outputs.poc_state }} + table: ${{ steps.filter.outputs.table }} + # [For new plugins] + # Add more outputs here steps: - - name: Print Hello World - run: echo "Hello, World!" + - uses: actions/checkout@v4 + - id: filter + uses: dorny/paths-filter@v3 + with: + filters: | + colors_to_tokens: + - 'plugins/apps/colors-to-tokens-plugin/**' + - 'libs/plugins-styles/**' + contrast: + - 'plugins/apps/contrast-plugin/**' + - 'libs/plugins-styles/**' + create_palette: + - 'plugins/apps/create-palette-plugin/**' + - 'libs/plugins-styles/**' + icons: + - 'plugins/apps/icons-plugin/**' + - 'libs/plugins-styles/**' + lorem_ipsum: + - 'plugins/apps/lorem-ipsum-plugin/**' + - 'libs/plugins-styles/**' + rename_layers: + - 'plugins/apps/rename-layers-plugin/**' + - 'libs/plugins-styles/**' + table: + - 'plugins/apps/table-plugin/**' + - 'libs/plugins-styles/**' + # [For new plugins] + # Add more plugin filters here + # another_plugin: + # - 'plugins/apps/another-plugin/**' + # - 'libs/plugins-styles/**' + + colors-to-tokens-plugin: + needs: detect-changes + if: needs.detect-changes.outputs.colors_to_tokens == 'true' + uses: ./.github/workflows/plugins-deploy-package.yml + with: + gh_ref: "${{ inputs.gh_ref || github.ref_name }}" + plugin_name: colors-to-tokens + + contrast-plugin: + needs: detect-changes + if: needs.detect-changes.outputs.contrast == 'true' + uses: ./.github/workflows/plugins-deploy-package.yml + with: + gh_ref: "${{ inputs.gh_ref || github.ref_name }}" + plugin_name: contrast + + create-palette-plugin: + needs: detect-changes + if: needs.detect-changes.outputs.create_palette == 'true' + uses: ./.github/workflows/plugins-deploy-package.yml + with: + gh_ref: "${{ inputs.gh_ref || github.ref_name }}" + plugin_name: create-palette + + icons-plugin: + needs: detect-changes + if: needs.detect-changes.outputs.icons == 'true' + uses: ./.github/workflows/plugins-deploy-package.yml + with: + gh_ref: "${{ inputs.gh_ref || github.ref_name }}" + plugin_name: icons + + lorem-ipsum-plugin: + needs: detect-changes + if: needs.detect-changes.outputs.lorem_ipsum == 'true' + uses: ./.github/workflows/plugins-deploy-package.yml + with: + gh_ref: "${{ inputs.gh_ref || github.ref_name }}" + plugin_name: lorem-ipsum + + rename-layers-plugin: + needs: detect-changes + if: needs.detect-changes.outputs.rename_layers == 'true' + uses: ./.github/workflows/plugins-deploy-package.yml + with: + gh_ref: "${{ inputs.gh_ref || github.ref_name }}" + plugin_name: rename-layers + + table-plugin: + needs: detect-changes + if: needs.detect-changes.outputs.table == 'true' + uses: ./.github/workflows/plugins-deploy-package.yml + with: + gh_ref: "${{ inputs.gh_ref || github.ref_name }}" + plugin_name: table + + # [For new plugins] + # Add more jobs for other plugins below, following the same pattern + # another-plugin: + # needs: detect-changes + # if: needs.detect-changes.outputs.another_plugin == 'true' + # uses: ./.github/workflows/plugins-deploy-package.yml + # with: + # gh_ref: "${{ inputs.gh_ref || github.ref_name }}" + # plugin_name: another From ef809014009aa2058727c828dab9beeb05e884b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Mon, 26 Jan 2026 14:00:09 +0100 Subject: [PATCH 4/8] :wrench: Enable secret inheritance --- .github/workflows/plugins-deploy-packages.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/plugins-deploy-packages.yml b/.github/workflows/plugins-deploy-packages.yml index d1060389d5..b7c9c3af47 100644 --- a/.github/workflows/plugins-deploy-packages.yml +++ b/.github/workflows/plugins-deploy-packages.yml @@ -72,6 +72,7 @@ jobs: needs: detect-changes if: needs.detect-changes.outputs.colors_to_tokens == 'true' uses: ./.github/workflows/plugins-deploy-package.yml + secrets: inherit with: gh_ref: "${{ inputs.gh_ref || github.ref_name }}" plugin_name: colors-to-tokens @@ -80,6 +81,7 @@ jobs: needs: detect-changes if: needs.detect-changes.outputs.contrast == 'true' uses: ./.github/workflows/plugins-deploy-package.yml + secrets: inherit with: gh_ref: "${{ inputs.gh_ref || github.ref_name }}" plugin_name: contrast @@ -88,6 +90,7 @@ jobs: needs: detect-changes if: needs.detect-changes.outputs.create_palette == 'true' uses: ./.github/workflows/plugins-deploy-package.yml + secrets: inherit with: gh_ref: "${{ inputs.gh_ref || github.ref_name }}" plugin_name: create-palette @@ -96,6 +99,7 @@ jobs: needs: detect-changes if: needs.detect-changes.outputs.icons == 'true' uses: ./.github/workflows/plugins-deploy-package.yml + secrets: inherit with: gh_ref: "${{ inputs.gh_ref || github.ref_name }}" plugin_name: icons @@ -104,6 +108,7 @@ jobs: needs: detect-changes if: needs.detect-changes.outputs.lorem_ipsum == 'true' uses: ./.github/workflows/plugins-deploy-package.yml + secrets: inherit with: gh_ref: "${{ inputs.gh_ref || github.ref_name }}" plugin_name: lorem-ipsum @@ -112,6 +117,7 @@ jobs: needs: detect-changes if: needs.detect-changes.outputs.rename_layers == 'true' uses: ./.github/workflows/plugins-deploy-package.yml + secrets: inherit with: gh_ref: "${{ inputs.gh_ref || github.ref_name }}" plugin_name: rename-layers @@ -120,6 +126,7 @@ jobs: needs: detect-changes if: needs.detect-changes.outputs.table == 'true' uses: ./.github/workflows/plugins-deploy-package.yml + secrets: inherit with: gh_ref: "${{ inputs.gh_ref || github.ref_name }}" plugin_name: table @@ -130,6 +137,7 @@ jobs: # needs: detect-changes # if: needs.detect-changes.outputs.another_plugin == 'true' # uses: ./.github/workflows/plugins-deploy-package.yml + # secrets: inherit # with: # gh_ref: "${{ inputs.gh_ref || github.ref_name }}" # plugin_name: another From 1ce0b60e3de3b9398a506940a7a0dd1d2314c801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Mon, 26 Jan 2026 16:46:03 +0100 Subject: [PATCH 5/8] :wrench: Run all the jobs if the workflow is launched manually --- .github/workflows/plugins-deploy-packages.yml | 16 ++++++++-------- .../apps/colors-to-tokens-plugin/wrangler.toml | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/plugins-deploy-packages.yml b/.github/workflows/plugins-deploy-packages.yml index b7c9c3af47..3223bc52a6 100644 --- a/.github/workflows/plugins-deploy-packages.yml +++ b/.github/workflows/plugins-deploy-packages.yml @@ -70,7 +70,7 @@ jobs: colors-to-tokens-plugin: needs: detect-changes - if: needs.detect-changes.outputs.colors_to_tokens == 'true' + if: github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.colors_to_tokens == 'true' uses: ./.github/workflows/plugins-deploy-package.yml secrets: inherit with: @@ -79,7 +79,7 @@ jobs: contrast-plugin: needs: detect-changes - if: needs.detect-changes.outputs.contrast == 'true' + if: github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.contrast == 'true' uses: ./.github/workflows/plugins-deploy-package.yml secrets: inherit with: @@ -88,7 +88,7 @@ jobs: create-palette-plugin: needs: detect-changes - if: needs.detect-changes.outputs.create_palette == 'true' + if: github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.create_palette == 'true' uses: ./.github/workflows/plugins-deploy-package.yml secrets: inherit with: @@ -97,7 +97,7 @@ jobs: icons-plugin: needs: detect-changes - if: needs.detect-changes.outputs.icons == 'true' + if: github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.icons == 'true' uses: ./.github/workflows/plugins-deploy-package.yml secrets: inherit with: @@ -106,7 +106,7 @@ jobs: lorem-ipsum-plugin: needs: detect-changes - if: needs.detect-changes.outputs.lorem_ipsum == 'true' + if: github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.lorem_ipsum == 'true' uses: ./.github/workflows/plugins-deploy-package.yml secrets: inherit with: @@ -115,7 +115,7 @@ jobs: rename-layers-plugin: needs: detect-changes - if: needs.detect-changes.outputs.rename_layers == 'true' + if: github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.rename_layers == 'true' uses: ./.github/workflows/plugins-deploy-package.yml secrets: inherit with: @@ -124,7 +124,7 @@ jobs: table-plugin: needs: detect-changes - if: needs.detect-changes.outputs.table == 'true' + if: github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.table == 'true' uses: ./.github/workflows/plugins-deploy-package.yml secrets: inherit with: @@ -135,7 +135,7 @@ jobs: # Add more jobs for other plugins below, following the same pattern # another-plugin: # needs: detect-changes - # if: needs.detect-changes.outputs.another_plugin == 'true' + # if: github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.another_plugin == 'true' # uses: ./.github/workflows/plugins-deploy-package.yml # secrets: inherit # with: diff --git a/plugins/apps/colors-to-tokens-plugin/wrangler.toml b/plugins/apps/colors-to-tokens-plugin/wrangler.toml index c1d45f3e87..7f48730a36 100644 --- a/plugins/apps/colors-to-tokens-plugin/wrangler.toml +++ b/plugins/apps/colors-to-tokens-plugin/wrangler.toml @@ -1,7 +1,7 @@ name = "color-to-tokens-plugin" compatibility_date = "2025-01-01" -assets = { directory = "../../dist/apps/color-to-tokens-plugin/browser" } +assets = { directory = "../../dist/apps/colors-to-tokens-plugin/browser" } [[routes]] pattern = "WORKER_URI" From 56fd66b91a09c9d97b86b49075fc21dc5ab9d5c2 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 26 Jan 2026 22:48:57 +0100 Subject: [PATCH 6/8] :bug: Fix several issues related to path edition (#8187) * :sparkles: Improve save-path-content event consistency Mainly removing possible race conditions from the event implementation. * :sparkles: Ensure path content snapshot on start-path-edit event * :sparkles: Reuse already available shape-id on split-segments --- .../app/main/data/workspace/path/changes.cljs | 22 ++++---- .../app/main/data/workspace/path/edition.cljs | 51 +++++++++---------- 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/frontend/src/app/main/data/workspace/path/changes.cljs b/frontend/src/app/main/data/workspace/path/changes.cljs index d766487e7e..fc43b61fd5 100644 --- a/frontend/src/app/main/data/workspace/path/changes.cljs +++ b/frontend/src/app/main/data/workspace/path/changes.cljs @@ -70,20 +70,22 @@ (= (-> content last :command) :move-to)) (into [] (take (dec (count content)) content)) content)] - (-> state - (st/set-content content)))) + (st/set-content state content))) ptk/WatchEvent (watch [it state _] (let [page-id (:current-page-id state) - objects (dsh/lookup-page-objects state page-id) - id (dm/get-in state [:workspace-local :edition]) - old-content (dm/get-in state [:workspace-local :edit-path id :old-content]) - shape (st/get-path state)] + local (get state :workspace-local) + id (get local :edition) + objects (dsh/lookup-page-objects state page-id)] - (if (and (some? old-content) (some? (:id shape))) - (let [changes (generate-path-changes it objects page-id shape old-content (:content shape))] - (rx/of (dch/commit-changes changes))) - (rx/empty))))))) + ;; NOTE: we proceed only if the shape is present on the + ;; objects, if shape is a ephimeral drawing shape, we should + ;; do nothing + (when-let [shape (get objects id)] + (when-let [old-content (dm/get-in local [:edit-path id :old-content])] + (let [new-content (get shape :content) + changes (generate-path-changes it objects page-id shape old-content new-content)] + (rx/of (dch/commit-changes changes)))))))))) diff --git a/frontend/src/app/main/data/workspace/path/edition.cljs b/frontend/src/app/main/data/workspace/path/edition.cljs index 1210111f71..a97947ea05 100644 --- a/frontend/src/app/main/data/workspace/path/edition.cljs +++ b/frontend/src/app/main/data/workspace/path/edition.cljs @@ -8,7 +8,6 @@ (:require [app.common.data :as d] [app.common.data.macros :as dm] - [app.common.files.helpers :as cfh] [app.common.geom.point :as gpt] [app.common.types.path :as path] [app.common.types.path.helpers :as path.helpers] @@ -289,34 +288,34 @@ (declare stop-path-edit) + (defn start-path-edit [id] (ptk/reify ::start-path-edit ptk/UpdateEvent (update [_ state] (let [objects (dsh/lookup-page-objects state) - edit-path (dm/get-in state [:workspace-local :edit-path id]) - content (st/get-path state :content) - state (cond-> state - (cfh/path-shape? objects id) - (st/set-content (path/close-subpaths content)))] + shape (get objects id)] - (cond-> state - (or (not edit-path) - (= :draw (:edit-mode edit-path))) - (assoc-in [:workspace-local :edit-path id] {:edit-mode :move - :selected #{} - :snap-toggled false}) - (and (some? edit-path) - (= :move (:edit-mode edit-path))) - (assoc-in [:workspace-local :edit-path id :edit-mode] :draw)))) + (-> state + (st/set-content (path/close-subpaths (:content shape))) + (update-in [:workspace-local :edit-path id] + (fn [state] + (let [state (if state + (if (= :move (:edit-mode state)) + (assoc state :edit-mode :draw) + state) + {:edit-mode :move + :selected #{} + :snap-toggled false})] + (assoc state :old-content (:content shape)))))))) ptk/WatchEvent (watch [_ _ stream] - (let [stopper (->> stream - (rx/filter #(let [type (ptk/type %)] - (= type ::dwe/clear-edition-mode) - (= type ::start-path-edit))))] + (let [stopper (rx/filter #(let [type (ptk/type %)] + (= type ::dwe/clear-edition-mode) + (= type ::start-path-edit)) + stream)] (rx/concat (rx/of (undo/start-path-undo)) (->> stream @@ -325,7 +324,8 @@ (rx/map #(stop-path-edit id)) (rx/take-until stopper))))))) -(defn stop-path-edit [id] +(defn stop-path-edit + [id] (ptk/reify ::stop-path-edit ptk/UpdateEvent (update [_ state] @@ -335,13 +335,12 @@ (watch [_ _ _] (rx/of (ptk/data-event :layout/update {:ids [id]}))))) -(defn split-segments - [{:keys [from-p to-p t]}] +(defn- split-segments + [id {:keys [from-p to-p t]}] (ptk/reify ::split-segments ptk/UpdateEvent (update [_ state] - (let [id (st/get-path-id state) - content (st/get-path state :content)] + (let [content (st/get-path state :content)] (-> state (assoc-in [:workspace-local :edit-path id :old-content] content) (st/set-content (-> content @@ -353,10 +352,10 @@ (rx/of (changes/save-path-content {:preserve-move-to true}))))) (defn create-node-at-position - [event] + [params] (ptk/reify ::create-node-at-position ptk/WatchEvent (watch [_ state _] (let [id (st/get-path-id state)] (rx/of (dwsh/update-shapes [id] path/convert-to-path) - (split-segments event)))))) + (split-segments id params)))))) From 3112b240a006b83cb226f45769205a3dcad7bc8d Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 27 Jan 2026 09:28:41 +0100 Subject: [PATCH 7/8] :paperclip: Add missing entry on changelog --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index b175d03cfb..feff0ba555 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -36,6 +36,7 @@ - Fix exception on uploading large fonts [Github #8135](https://github.com/penpot/penpot/pull/8135) - Fix unhandled exception on open-new-window helper [Github #7787](https://github.com/penpot/penpot/issues/7787) - Fix incorrect handling of input values on layout gap and padding inputs [Github #8113](https://github.com/penpot/penpot/issues/8113) +- Fix several race conditions on path editor [Github #8187](https://github.com/penpot/penpot/pull/8187) ## 2.12.1 From 9ca76c745fa4dfa27394a80fc774ff0ca9ad8261 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 27 Jan 2026 17:31:50 +0100 Subject: [PATCH 8/8] :bug: Fix app freeze on token name change (#8214) --- CHANGES.md | 2 +- common/src/app/common/types/token.cljc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index feff0ba555..23f906325c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -37,7 +37,7 @@ - Fix unhandled exception on open-new-window helper [Github #7787](https://github.com/penpot/penpot/issues/7787) - Fix incorrect handling of input values on layout gap and padding inputs [Github #8113](https://github.com/penpot/penpot/issues/8113) - Fix several race conditions on path editor [Github #8187](https://github.com/penpot/penpot/pull/8187) - +- Fix app freeze when introducing an error on a very long token name [Taiga #13214](https://tree.taiga.io/project/penpot/issue/13214) ## 2.12.1 diff --git a/common/src/app/common/types/token.cljc b/common/src/app/common/types/token.cljc index 5ee3661a91..6a9d830a3a 100644 --- a/common/src/app/common/types/token.cljc +++ b/common/src/app/common/types/token.cljc @@ -99,7 +99,7 @@ (def token-name-ref [:re {:title "TokenNameRef" :gen/gen sg/text} - #"^(?!\$)([a-zA-Z0-9-$_]+\.?)*(?