Skip to content

ci: add a v3 release workflow#3329

Closed
talkor wants to merge 82 commits intomasterfrom
v3-release-workflow
Closed

ci: add a v3 release workflow#3329
talkor wants to merge 82 commits intomasterfrom
v3-release-workflow

Conversation

@talkor
Copy link
Copy Markdown
Member

@talkor talkor commented Mar 11, 2026

User description

https://monday.monday.com/boards/10027056258/pulses/10027056856


PR Type

Enhancement, Other


Description

  • Add v3 release workflow for automated publishing

  • Remove unnecessary blank lines across component files

  • Implement branch validation and Slack notifications

  • Configure npm publishing with v3 dist-tag


Diagram Walkthrough

flowchart LR
  A["Release Trigger"] --> B["Validate Branch"]
  B --> C["Notify Slack"]
  B --> D["Build"]
  D --> E["Test"]
  E --> F["Release to npm"]
  C -.-> G["Slack Notification"]
  F --> H["Published with v3 tag"]
Loading

File Walkthrough

Relevant files
Configuration changes
release-v3.yml
Add v3 release workflow automation                                             

.github/workflows/release-v3.yml

  • New workflow file for v3 release automation triggered manually
  • Validates execution on vibe3 branch only
  • Sends Slack notifications on release start
  • Runs build and test jobs before publishing
  • Publishes to npm with v3 dist-tag using lerna
+85/-0   
Formatting
Badge.tsx
Remove blank line in imports                                                         

packages/core/src/components/Badge/Badge.tsx

  • Remove unnecessary blank line between imports
  • Consolidate import statements for cleaner formatting
+0/-1     
Combobox.tsx
Remove blank line in imports                                                         

packages/core/src/components/Combobox/Combobox.tsx

  • Remove unnecessary blank line between imports
  • Consolidate import statements for cleaner formatting
+0/-1     
Counter.tsx
Remove blank line in imports                                                         

packages/core/src/components/Counter/Counter.tsx

  • Remove unnecessary blank line between imports
  • Consolidate import statements for cleaner formatting
+0/-1     
ListItem.tsx
Remove blank line in imports                                                         

packages/core/src/components/ListItem/ListItem.tsx

  • Remove unnecessary blank line between imports
  • Consolidate import statements for cleaner formatting
+0/-1     
ListItemIcon.tsx
Remove blank line in imports                                                         

packages/core/src/components/ListItemIcon/ListItemIcon.tsx

  • Remove unnecessary blank line between imports
  • Consolidate import statements for cleaner formatting
+0/-1     
Menu.tsx
Remove blank line in imports                                                         

packages/core/src/components/Menu/Menu/Menu.tsx

  • Remove unnecessary blank line between imports
  • Consolidate import statements for cleaner formatting
+0/-1     

rivka-ungar and others added 30 commits February 25, 2026 08:54
- Add VIBE4_CHANGELOG.md for tracking breaking changes
- Add VIBE4_MIGRATION_GUIDE.md with comprehensive migration documentation
- Create v3-to-v4 migration structure in codemod package
- Update CLI to support --migration v4
- Add helper script for generating component migrations
- Set up enum mapping template for string literal conversions

This provides the foundation for implementing individual breaking
changes and their corresponding codemods as development progresses.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix broken codemod infrastructure that was causing build failures.

ISSUE:
- type-imports-migration.ts had TypeScript errors accessing .name property
- path.value.id can be Identifier OR TSQualifiedName
- TSQualifiedName doesn't have .name property, causing TS2339 errors
- Build failures blocked all v4 codemod development

SOLUTION:
- Convert to safe no-op until actual type migrations are identified for v4
- Satisfies codemod CLI infrastructure requirements
- Removes TypeScript compilation errors
- Documents TODO structure for future type migrations

This is general v4 infrastructure, not specific to any breaking change.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
#3266)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…3280)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Rivka Ungar <rivkaun@monday.com>
Co-authored-by: vibe-bot <vibe@monday.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
#3290)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Icons are now hidden from screen readers by default (ariaHidden=true),
aligning with the common pattern that most icons are decorative. Consumers
must explicitly set ariaHidden={false} for meaningful icons with labels.

- Default ariaHidden to true in Icon and CustomSvgIcon
- Remove auto-detection fallback in useIconScreenReaderAccessProps
- Fix internal consumer (TableHeaderCell) and story files
- Add codemod to migrate Icon elements with label but no ariaHidden
- Update migration guide and MCP example

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…implementation (#3285)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…3294)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…perties (#3295)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@talkor talkor requested a review from a team as a code owner March 11, 2026 09:22
@qodo-free-for-open-source-projects
Copy link
Copy Markdown
Contributor

Review Summary by Qodo

Add v3 release workflow with validation and publishing

✨ Enhancement

Grey Divider

Walkthroughs

Description
• Add v3 release workflow triggered manually from vibe3 branch
• Validate branch, notify Slack, build and test before release
• Generate versions using Lerna with conventional commits
• Publish packages to npm with v3 dist-tag
Diagram
flowchart LR
  A["Workflow Dispatch"] --> B["Validate Branch"]
  B --> C["Notify Slack"]
  B --> D["Build"]
  D --> E["Test"]
  E --> F["Release"]
  F --> G["Generate Versions"]
  G --> H["Publish to npm"]
Loading

Grey Divider

File Changes

1. .github/workflows/release-v3.yml ⚙️ Configuration changes +85/-0

Complete v3 release workflow with validation and publishing

• New workflow file for v3 release process triggered manually
• Validates that workflow runs on vibe3 branch only
• Sends Slack notification when release starts
• Orchestrates build, test, and release jobs in sequence
• Generates new versions using Lerna with conventional commits
• Publishes packages to npm registry with v3 dist-tag

.github/workflows/release-v3.yml


Grey Divider

Qodo Logo

@qodo-free-for-open-source-projects
Copy link
Copy Markdown
Contributor

qodo-free-for-open-source-projects bot commented Mar 11, 2026

Code Review by Qodo

🐞 Bugs (5) 📘 Rule violations (0) 📎 Requirement gaps (0)

Grey Divider


Action required

1. Publish is dry-run 🐞 Bug ✓ Correctness
Description
release-v3.yml runs yarn lerna publish ... --dry-run, so no packages are actually published even
though the workflow also bumps versions and creates a GitHub release, leaving the repo/releases
ahead of npm. This can produce a broken release state where consumers cannot install the released
versions.
Code

.github/workflows/release-v3.yml[R81-82]

+      - name: Publish to npm with v3 dist-tag
+        run: yarn lerna publish from-package --dist-tag v3 --dry-run -y
Evidence
The v3 workflow explicitly uses --dry-run for publishing, while still running a version+GitHub
release step. The existing release workflow publishes without --dry-run, indicating the intended
behavior is a real publish.

.github/workflows/release-v3.yml[73-82]
.github/workflows/release.yml[72-82]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The v3 release workflow does not publish anything because it runs `yarn lerna publish ... --dry-run`, despite creating version bumps/GitHub releases.
### Issue Context
This can create GitHub tags/releases and bumped versions without corresponding npm artifacts.
### Fix Focus Areas
- .github/workflows/release-v3.yml[81-82]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

2. .npmrc cleanup skipped on failure 🐞 Bug ⛨ Security
Description
The workflow writes an auth token to .npmrc but the cleanup step won’t run if a later step fails
because it lacks always(). This leaves the token file on disk for the remainder of the job and is
avoidable risk/hygiene debt.
Code

.github/workflows/release-v3.yml[R78-85]

+      - name: Setup .npmrc for publish
+        id: setup-npmrc
+        run: echo "//registry.npmjs.org/:_authToken=$NODE_AUTH_TOKEN" > .npmrc
+      - name: Publish to npm with v3 dist-tag
+        run: yarn lerna publish from-package --dist-tag v3 --dry-run -y
+      - name: Remove .npmrc
+        if: steps.setup-npmrc.outcome == 'success'
+        run: rm .npmrc
Evidence
GitHub Actions steps default to if: success(). The cleanup step only checks
steps.setup-npmrc.outcome == 'success' and will be skipped if publishing (or any later step)
fails, even though .npmrc was created successfully.

.github/workflows/release-v3.yml[78-85]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`.npmrc` is created with a registry auth token but may not be deleted if a subsequent step fails.
### Issue Context
The cleanup step currently runs only on overall step success.
### Fix Focus Areas
- .github/workflows/release-v3.yml[83-85]
- Change to `if: always() && steps.setup-npmrc.outcome == 'success'` so cleanup runs even when publish/version steps fail.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Slack notify not sequenced 🐞 Bug ✓ Correctness
Description
notify-release-start and build both depend only on validate-branch, so Slack notification can
run concurrently with (or after) the build rather than before it.
Code

.github/workflows/release-v3.yml[R17-44]

+  notify-release-start:
+    name: Notify Slack - Release Started
+    needs: validate-branch
+    runs-on: ubuntu-latest
+    continue-on-error: true
+    steps:
+      - name: Send Slack notification
+        uses: fjogeleit/http-request-action@v1
+        with:
+          url: ${{ secrets.SLACK_DEV_TEAM_WEBHOOK_URL }}
+          method: "POST"
+          contentType: "application/json"
+          data: |
+            {
+              "event": "v3_release_started",
+              "actor": "${{ github.actor }}",
+              "commit_id": "${{ github.sha }}",
+              "workflow": "${{ github.workflow }}",
+              "run_url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}",
+              "commit_url": "${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}"
+            }
+
+  build:
+    name: Build
+    needs: validate-branch
+    uses: ./.github/workflows/build-and-upload.yml
+    secrets:
+      npm_token: ${{ secrets.npm_token }}
Evidence
The job dependency graph shows both the Slack notification job and the build job have the same
single dependency (validate-branch), enabling parallel execution and making notification timing
nondeterministic relative to the build start.

.github/workflows/release-v3.yml[17-44]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Slack notification is not guaranteed to run before the build begins because both jobs only depend on `validate-branch`.
### Issue Context
If the goal is Notify-&gt;Build-&gt;Test-&gt;Release sequencing, dependencies must enforce that ordering.
### Fix Focus Areas
- .github/workflows/release-v3.yml[17-44]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


4. Change gating targets master 🐞 Bug ⛯ Reliability
Description
On vibe3, has_changes is computed using --since=origin/master...HEAD, so the v3 workflow’s
build/test/release gating is based on divergence from master rather than a vibe3-appropriate
baseline (e.g., last v3 release).
Code

.github/workflows/release-v3.yml[R39-59]

+  build:
+    name: Build
+    needs: validate-branch
+    uses: ./.github/workflows/build-and-upload.yml
+    secrets:
+      npm_token: ${{ secrets.npm_token }}
+
+  test:
+    name: Test
+    needs: build
+    uses: ./.github/workflows/test.yml
+    with:
+      has_changes: ${{ needs.build.outputs.has_changes }}
+    secrets:
+      npm_token: ${{ secrets.npm_token }}
+
+  release:
+    name: Release
+    needs: [build, test]
+    if: ${{ needs.build.outputs.has_changes == 'true' }}
+    runs-on: ubuntu-latest
Evidence
The reusable build workflow’s has_changes output is computed by check-changed-packages, which
always derives its --since range from determine-lerna-since-flag. For any non-master branch
(including vibe3), that action hardcodes --since=origin/master...HEAD. Since release-v3.yml
uses needs.build.outputs.has_changes to decide whether to test and release, the decision is
fundamentally keyed off master divergence rather than a release-branch baseline.

.github/workflows/release-v3.yml[46-59]
.github/workflows/build-and-upload.yml[19-37]
.github/actions/check-changed-packages/action.yml[17-25]
.github/actions/determine-lerna-since-flag/action.yml[15-21]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The `has_changes` signal driving build/test/release in the v3 workflow is computed against `origin/master` for any non-master branch, which is a mismatch for a dedicated release branch (`vibe3`).
### Issue Context
`build-and-upload.yml` derives `has_changes` via `check-changed-packages`, which uses `determine-lerna-since-flag` to decide the `--since` range passed to Lerna.
### Fix Focus Areas
- .github/actions/determine-lerna-since-flag/action.yml[15-21]
- .github/actions/check-changed-packages/action.yml[17-25]
- .github/workflows/build-and-upload.yml[19-37]
- .github/workflows/release-v3.yml[46-59]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


View more (1)
5. Unpinned third-party action 🐞 Bug ⛨ Security
Description
The workflow uses fjogeleit/http-request-action@v1 (mutable tag) while passing the Slack webhook
secret, so a compromised/retargeted upstream tag could exfiltrate the webhook URL or send fraudulent
notifications. This is an avoidable supply-chain risk in CI.
Code

.github/workflows/release-v3.yml[R23-27]

+      - name: Send Slack notification
+        uses: fjogeleit/http-request-action@v1
+        with:
+          url: ${{ secrets.SLACK_DEV_TEAM_WEBHOOK_URL }}
+          method: "POST"
Evidence
A third-party action is referenced by a mutable major tag and is invoked with a secret URL input,
meaning the action code (if changed upstream) would still run and could access that secret.

.github/workflows/release-v3.yml[23-27]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
A third-party GitHub Action is referenced via a mutable tag (`@v1`) while receiving a Slack webhook secret.
### Issue Context
Pinning to a commit SHA reduces supply-chain risk from upstream tag changes.
### Fix Focus Areas
- .github/workflows/release-v3.yml[23-27]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

ⓘ The new review experience is currently in Beta. Learn more

Grey Divider

Grey Divider

Previous review results

Review updated until commit 39b4f99

Results up to commit 39c0646


🐞 Bugs (5) 📘 Rule violations (0) 📎 Requirement gaps (0) 📐 Spec deviations (0)

Grey Divider
Action required
1. Publish is dry-run 🐞 Bug ✓ Correctness
Description
release-v3.yml runs yarn lerna publish ... --dry-run, so no packages are actually published even
though the workflow also bumps versions and creates a GitHub release, leaving the repo/releases
ahead of npm. This can produce a broken release state where consumers cannot install the released
versions.
Code

.github/workflows/release-v3.yml[R81-82]

+      - name: Publish to npm with v3 dist-tag
+        run: yarn lerna publish from-package --dist-tag v3 --dry-run -y
Evidence
The v3 workflow explicitly uses --dry-run for publishing, while still running a version+GitHub
release step. The existing release workflow publishes without --dry-run, indicating the intended
behavior is a real publish.

.github/workflows/release-v3.yml[73-82]
.github/workflows/release.yml[72-82]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The v3 release workflow does not publish anything because it runs `yarn lerna publish ... --dry-run`, despite creating version bumps/GitHub releases.
### Issue Context
This can create GitHub tags/releases and bumped versions without corresponding npm artifacts.
### Fix Focus Areas
- .github/workflows/release-v3.yml[81-82]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended
2. .npmrc cleanup skipped on failure 🐞 Bug ⛨ Security ⭐ New
Description
The workflow writes an auth token to .npmrc but the cleanup step won’t run if a later step fails
because it lacks always(). This leaves the token file on disk for the remainder of the job and is
avoidable risk/hygiene debt.
Code

.github/workflows/release-v3.yml[R78-85]

+      - name: Setup .npmrc for publish
+        id: setup-npmrc
+        run: echo "//registry.npmjs.org/:_authToken=$NODE_AUTH_TOKEN" > .npmrc
+      - name: Publish to npm with v3 dist-tag
+        run: yarn lerna publish from-package --dist-tag v3 --dry-run -y
+      - name: Remove .npmrc
+        if: steps.setup-npmrc.outcome == 'success'
+        run: rm .npmrc
Evidence
GitHub Actions steps default to if: success(). The cleanup step only checks
steps.setup-npmrc.outcome == 'success' and will be skipped if publishing (or any later step)
fails, even though .npmrc was created successfully.

.github/workflows/release-v3.yml[78-85]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`.npmrc` is created with a registry auth token but may not be deleted if a subsequent step fails.

### Issue Context
The cleanup step currently runs only on overall step success.

### Fix Focus Areas
- .github/workflows/release-v3.yml[83-85]
 - Change to `if: always() && steps.setup-npmrc.outcome == 'success'` so cleanup runs even when publish/version steps fail.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Slack notify not sequenced 🐞 Bug ✓ Correctness
Description
notify-release-start and build both depend only on validate-branch, so Slack notification can
run concurrently with (or after) the build rather than before it.
Code

.github/workflows/release-v3.yml[R17-44]

+  notify-release-start:
+    name: Notify Slack - Release Started
+    needs: validate-branch
+    runs-on: ubuntu-latest
+    continue-on-error: true
+    steps:
+      - name: Send Slack notification
+        uses: fjogeleit/http-request-action@v1
+        with:
+          url: ${{ secrets.SLACK_DEV_TEAM_WEBHOOK_URL }}
+          method: "POST"
+          contentType: "application/json"
+          data: |
+            {
+              "event": "v3_release_started",
+              "actor": "${{ github.actor }}",
+              "commit_id": "${{ github.sha }}",
+              "workflow": "${{ github.workflow }}",
+              "run_url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}",
+              "commit_url": "${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}"
+            }
+
+  build:
+    name: Build
+    needs: validate-branch
+    uses: ./.github/workflows/build-and-upload.yml
+    secrets:
+      npm_token: ${{ secrets.npm_token }}
Evidence
The job dependency graph shows both the Slack notification job and the build job have the same
single dependency (validate-branch), enabling parallel execution and making notification timing
nondeterministic relative to the build start.

.github/workflows/release-v3.yml[17-44]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Slack notification is not guaranteed to run before the build begins because both jobs only depend on `validate-branch`.
### Issue Context
If the goal is Notify-&gt;Build-&gt;Test-&gt;Release sequencing, dependencies must enforce that ordering.
### Fix Focus Areas
- .github/workflows/release-v3.yml[17-44]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


4. Change gating targets master 🐞 Bug ⛯ Reliability
Description
On vibe3, has_changes is computed using --since=origin/master...HEAD, so the v3 workflow’s
build/test/release gating is based on divergence from master rather than a vibe3-appropriate
baseline (e.g., last v3 release).
Code

.github/workflows/release-v3.yml[R39-59]

+  build:
+    name: Build
+    needs: validate-branch
+    uses: ./.github/workflows/build-and-upload.yml
+    secrets:
+      npm_token: ${{ secrets.npm_token }}
+
+  test:
+    name: Test
+    needs: build
+    uses: ./.github/workflows/test.yml
+    with:
+      has_changes: ${{ needs.build.outputs.has_changes }}
+    secrets:
+      npm_token: ${{ secrets.npm_token }}
+
+  release:
+    name: Release
+    needs: [build, test]
+    if: ${{ needs.build.outputs.has_changes == 'true' }}
+    runs-on: ubuntu-latest
Evidence
The reusable build workflow’s has_changes output is computed by check-changed-packages, which
always derives its --since range from determine-lerna-since-flag. For any non-master branch
(including vibe3), that action hardcodes --since=origin/master...HEAD. Since release-v3.yml
uses needs.build.outputs.has_changes to decide whether to test and release, the decision is
fundamentally keyed off master divergence rather than a release-branch baseline.

.github/workflows/release-v3.yml[46-59]
.github/workflows/build-and-upload.yml[19-37]
.github/actions/check-changed-packages/action.yml[17-25]
.github/actions/determine-lerna-since-flag/action.yml[15-21]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The `has_changes` signal driving build/test/release in the v3 workflow is computed against `origin/master` for any non-master branch, which is a mismatch for a dedicated release branch (`vibe3`).
### Issue Context
`build-and-upload.yml` derives `has_changes` via `check-changed-packages`, which uses `determine-lerna-since-flag` to decide the `--since` range passed to Lerna.
### Fix Focus Areas
- .github/actions/determine-lerna-since-flag/action.yml[15-21]
- .github/actions/check-changed-packages/action.yml[17-25]
- .github/workflows/build-and-upload.yml[19-37]
- .github/workflows/release-v3.yml[46-59]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


View more (1)
5. Unpinned third-party action 🐞 Bug ⛨ Security
Description
The workflow uses fjogeleit/http-request-action@v1 (mutable tag) while passing the Slack webhook
secret, so a compromised/retargeted upstream tag could exfiltrate the webhook URL or send fraudulent
notifications. This is an avoidable supply-chain risk in CI.
Code

.github/workflows/release-v3.yml[R23-27]

+      - name: Send Slack notification
+        uses: fjogeleit/http-request-action@v1
+        with:
+          url: ${{ secrets.SLACK_DEV_TEAM_WEBHOOK_URL }}
+          method: "POST"
Evidence
A third-party action is referenced by a mutable major tag and is invoked with a secret URL input,
meaning the action code (if changed upstream) would still run and could access that secret.

.github/workflows/release-v3.yml[23-27]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
A third-party GitHub Action is referenced via a mutable tag (`@v1`) while receiving a Slack webhook secret.
### Issue Context
Pinning to a commit SHA reduces supply-chain risk from upstream tag changes.
### Fix Focus Areas
- .github/workflows/release-v3.yml[23-27]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider Grey Divider
Results up to commit 5d04fb2


🐞 Bugs (4) 📘 Rule violations (0) 📎 Requirement gaps (0) 📐 Spec deviations (0)

Grey Divider
Action required
1. Publish is dry-run 🐞 Bug ✓ Correctness
Description
release-v3.yml runs yarn lerna publish ... --dry-run, so no packages are actually published even
though the workflow also bumps versions and creates a GitHub release, leaving the repo/releases
ahead of npm. This can produce a broken release state where consumers cannot install the released
versions.
Code

.github/workflows/release-v3.yml[R81-82]

+      - name: Publish to npm with v3 dist-tag
+        run: yarn lerna publish from-package --dist-tag v3 --dry-run -y
Evidence
The v3 workflow explicitly uses --dry-run for publishing, while still running a version+GitHub
release step. The existing release workflow publishes without --dry-run, indicating the intended
behavior is a real publish.

.github/workflows/release-v3.yml[73-82]
.github/workflows/release.yml[72-82]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The v3 release workflow does not publish anything because it runs `yarn lerna publish ... --dry-run`, despite creating version bumps/GitHub releases.
### Issue Context
This can create GitHub tags/releases and bumped versions without corresponding npm artifacts.
### Fix Focus Areas
- .github/workflows/release-v3.yml[81-82]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended
2. Slack notify not sequenced 🐞 Bug ✓ Correctness
Description
notify-release-start and build both depend only on validate-branch, so Slack notification can
run concurrently with (or after) the build rather than before it.
Code

.github/workflows/release-v3.yml[R17-44]

+  notify-release-start:
+    name: Notify Slack - Release Started
+    needs: validate-branch
+    runs-on: ubuntu-latest
+    continue-on-error: true
+    steps:
+      - name: Send Slack notification
+        uses: fjogeleit/http-request-action@v1
+        with:
+          url: ${{ secrets.SLACK_DEV_TEAM_WEBHOOK_URL }}
+          method: "POST"
+          contentType: "application/json"
+          data: |
+            {
+              "event": "v3_release_started",
+              "actor": "${{ github.actor }}",
+              "commit_id": "${{ github.sha }}",
+              "workflow": "${{ github.workflow }}",
+              "run_url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}",
+              "commit_url": "${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}"
+            }
+
+  build:
+    name: Build
+    needs: validate-branch
+    uses: ./.github/workflows/build-and-upload.yml
+    secrets:
+      npm_token: ${{ secrets.npm_token }}
Evidence
The job dependency graph shows both the Slack notification job and the build job have the same
single dependency (validate-branch), enabling parallel execution and making notification timing
nondeterministic relative to the build start.

.github/workflows/release-v3.yml[17-44]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Slack notification is not guaranteed to run before the build begins because both jobs only depend on `validate-branch`.
### Issue Context
If the goal is Notify-&gt;Build-&gt;Test-&gt;Release sequencing, dependencies must enforce that ordering.
### Fix Focus Areas
- .github/workflows/release-v3.yml[17-44]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Change gating targets master 🐞 Bug ⛯ Reliability
Description
On vibe3, has_changes is computed using --since=origin/master...HEAD, so the v3 workflow’s
build/test/release gating is based on divergence from master rather than a vibe3-appropriate
baseline (e.g., last v3 release).
Code

.github/workflows/release-v3.yml[R39-59]

+  build:
+    name: Build
+    needs: validate-branch
+    uses: ./.github/workflows/build-and-upload.yml
+    secrets:
+      npm_token: ${{ secrets.npm_token }}
+
+  test:
+    name: Test
+    needs: build
+    uses: ./.github/workflows/test.yml
+    with:
+      has_changes: ${{ needs.build.outputs.has_changes }}
+    secrets:
+      npm_token: ${{ secrets.npm_token }}
+
+  release:
+    name: Release
+    needs: [build, test]
+    if: ${{ needs.build.outputs.has_changes == 'true' }}
+    runs-on: ubuntu-latest
Evidence
The reusable build workflow’s has_changes output is computed by check-changed-packages, which
always derives its --since range from determine-lerna-since-flag. For any non-master branch
(including vibe3), that action hardcodes --since=origin/master...HEAD. Since release-v3.yml
uses needs.build.outputs.has_changes to decide whether to test and release, the decision is
fundamentally keyed off master divergence rather than a release-branch baseline.

.github/workflows/release-v3.yml[46-59]
.github/workflows/build-and-upload.yml[19-37]
.github/actions/check-changed-packages/action.yml[17-25]
.github/actions/determine-lerna-since-flag/action.yml[15-21]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The `has_changes` signal driving build/test/release in the v3 workflow is computed against `origin/master` for any non-master branch, which is a mismatch for a dedicated release branch (`vibe3`).
### Issue Context
`build-and-upload.yml` derives `has_changes` via `check-changed-packages`, which uses `determine-lerna-since-flag` to decide the `--since` range passed to Lerna.
### Fix Focus Areas
- .github/actions/determine-lerna-since-flag/action.yml[15-21]
- .github/actions/check-changed-packages/action.yml[17-25]
- .github/workflows/build-and-upload.yml[19-37]
- .github/workflows/release-v3.yml[46-59]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


4. Unpinned third-party action 🐞 Bug ⛨ Security
Description
The workflow uses fjogeleit/http-request-action@v1 (mutable tag) while passing the Slack webhook
secret, so a compromised/retargeted upstream tag could exfiltrate the webhook URL or send fraudulent
notifications. This is an avoidable supply-chain risk in CI.
Code

.github/workflows/release-v3.yml[R23-27]

+      - name: Send Slack notification
+        uses: fjogeleit/http-request-action@v1
+        with:
+          url: ${{ secrets.SLACK_DEV_TEAM_WEBHOOK_URL }}
+          method: "POST"
Evidence
A third-party action is referenced by a mutable major tag and is invoked with a secret URL input,
meaning the action code (if changed upstream) would still run and could access that secret.

.github/workflows/release-v3.yml[23-27]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
A third-party GitHub Action is referenced via a mutable tag (`@v1`) while receiving a Slack webhook secret.
### Issue Context
Pinning to a commit SHA reduces supply-chain risk from upstream tag changes.
### Fix Focus Areas
- .github/workflows/release-v3.yml[23-27]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider Grey Divider
Results up to commit 8074005


🐞 Bugs (4) 📘 Rule violations (0) 📎 Requirement gaps (0)

Grey Divider
Action required
1. Publish is dry-run 🐞 Bug ✓ Correctness
Description
release-v3.yml runs yarn lerna publish ... --dry-run, so no packages are actually published even
though the workflow also bumps versions and creates a GitHub release, leaving the repo/releases
ahead of npm. This can produce a broken release state where consumers cannot install the released
versions.
Code

.github/workflows/release-v3.yml[R81-82]

+      - name: Publish to npm with v3 dist-tag
+        run: yarn lerna publish from-package --dist-tag v3 --dry-run -y
Evidence
The v3 workflow explicitly uses --dry-run for publishing, while still running a version+GitHub
release step. The existing release workflow publishes without --dry-run, indicating the intended
behavior is a real publish.

.github/workflows/release-v3.yml[73-82]
.github/workflows/release.yml[72-82]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The v3 release workflow does not publish anything because it runs `yarn lerna publish ... --dry-run`, despite creating version bumps/GitHub releases.
### Issue Context
This can create GitHub tags/releases and bumped versions without corresponding npm artifacts.
### Fix Focus Areas
- .github/workflows/release-v3.yml[81-82]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended
2. Slack notify not sequenced 🐞 Bug ✧ Quality ⭐ New
Description
notify-release-start and build both depend only on validate-branch, so Slack notification can
run concurrently with (or after) the build rather than before it.
Code

.github/workflows/release-v3.yml[R17-44]

+  notify-release-start:
+    name: Notify Slack - Release Started
+    needs: validate-branch
+    runs-on: ubuntu-latest
+    continue-on-error: true
+    steps:
+      - name: Send Slack notification
+        uses: fjogeleit/http-request-action@v1
+        with:
+          url: ${{ secrets.SLACK_DEV_TEAM_WEBHOOK_URL }}
+          method: "POST"
+          contentType: "application/json"
+          data: |
+            {
+              "event": "v3_release_started",
+              "actor": "${{ github.actor }}",
+              "commit_id": "${{ github.sha }}",
+              "workflow": "${{ github.workflow }}",
+              "run_url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}",
+              "commit_url": "${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}"
+            }
+
+  build:
+    name: Build
+    needs: validate-branch
+    uses: ./.github/workflows/build-and-upload.yml
+    secrets:
+      npm_token: ${{ secrets.npm_token }}
Evidence
The job dependency graph shows both the Slack notification job and the build job have the same
single dependency (validate-branch), enabling parallel execution and making notification timing
nondeterministic relative to the build start.

.github/workflows/release-v3.yml[17-44]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
Slack notification is not guaranteed to run before the build begins because both jobs only depend on `validate-branch`.

### Issue Context
If the goal is Notify-&gt;Build-&gt;Test-&gt;Release sequencing, dependencies must enforce that ordering.

### Fix Focus Areas
- .github/workflows/release-v3.yml[17-44]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Change gating targets master 🐞 Bug ⛯ Reliability ⭐ New
Description
On vibe3, has_changes is computed using --since=origin/master...HEAD, so the v3 workflow’s
build/test/release gating is based on divergence from master rather than a vibe3-appropriate
baseline (e.g., last v3 release).
Code

.github/workflows/release-v3.yml[R39-59]

+  build:
+    name: Build
+    needs: validate-branch
+    uses: ./.github/workflows/build-and-upload.yml
+    secrets:
+      npm_token: ${{ secrets.npm_token }}
+
+  test:
+    name: Test
+    needs: build
+    uses: ./.github/workflows/test.yml
+    with:
+      has_changes: ${{ needs.build.outputs.has_changes }}
+    secrets:
+      npm_token: ${{ secrets.npm_token }}
+
+  release:
+    name: Release
+    needs: [build, test]
+    if: ${{ needs.build.outputs.has_changes == 'true' }}
+    runs-on: ubuntu-latest
Evidence
The reusable build workflow’s has_changes output is computed by check-changed-packages, which
always derives its --since range from determine-lerna-since-flag. For any non-master branch
(including vibe3), that action hardcodes --since=origin/master...HEAD. Since release-v3.yml
uses needs.build.outputs.has_changes to decide whether to test and release, the decision is
fundamentally keyed off master divergence rather than a release-branch baseline.

.github/workflows/release-v3.yml[46-59]
.github/workflows/build-and-upload.yml[19-37]
.github/actions/check-changed-packages/action.yml[17-25]
.github/actions/determine-lerna-since-flag/action.yml[15-21]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The `has_changes` signal driving build/test/release in the v3 workflow is computed against `origin/master` for any non-master branch, which is a mismatch for a dedicated release branch (`vibe3`).

### Issue Context
`build-and-upload.yml` derives `has_changes` via `check-changed-packages`, which uses `determine-lerna-since-flag` to decide the `--since` range passed to Lerna.

### Fix Focus Areas
- .github/actions/determine-lerna-since-flag/action.yml[15-21]
- .github/actions/check-changed-packages/action.yml[17-25]
- .github/workflows/build-and-upload.yml[19-37]
- .github/workflows/release-v3.yml[46-59]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


4. Unpinned third-party action 🐞 Bug ⛨ Security
Description
The workflow uses fjogeleit/http-request-action@v1 (mutable tag) while passing the Slack webhook
secret, so a compromised/retargeted upstream tag could exfiltrate the webhook URL or send fraudulent
notifications. This is an avoidable supply-chain risk in CI.
Code

.github/workflows/release-v3.yml[R23-27]

+      - name: Send Slack notification
+        uses: fjogeleit/http-request-action@v1
+        with:
+          url: ${{ secrets.SLACK_DEV_TEAM_WEBHOOK_URL }}
+          method: "POST"
Evidence
A third-party action is referenced by a mutable major tag and is invoked with a secret URL input,
meaning the action code (if changed upstream) would still run and could access that secret.

.github/workflows/release-v3.yml[23-27]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
A third-party GitHub Action is referenced via a mutable tag (`@v1`) while receiving a Slack webhook secret.
### Issue Context
Pinning to a commit SHA reduces supply-chain risk from upstream tag changes.
### Fix Focus Areas
- .github/workflows/release-v3.yml[23-27]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider Grey Divider
Results up to commit 71f526c


🐞 Bugs (2) 📘 Rule violations (0) 📎 Requirement gaps (0)

Grey Divider
Action required
1. Publish is dry-run 🐞 Bug ✓ Correctness
Description
release-v3.yml runs yarn lerna publish ... --dry-run, so no packages are actually published even
though the workflow also bumps versions and creates a GitHub release, leaving the repo/releases
ahead of npm. This can produce a broken release state where consumers cannot install the released
versions.
Code

.github/workflows/release-v3.yml[R81-82]

+      - name: Publish to npm with v3 dist-tag
+        run: yarn lerna publish from-package --dist-tag v3 --dry-run -y
Evidence
The v3 workflow explicitly uses --dry-run for publishing, while still running a version+GitHub
release step. The existing release workflow publishes without --dry-run, indicating the intended
behavior is a real publish.

.github/workflows/release-v3.yml[73-82]
.github/workflows/release.yml[72-82]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The v3 release workflow does not publish anything because it runs `yarn lerna publish ... --dry-run`, despite creating version bumps/GitHub releases.

### Issue Context
This can create GitHub tags/releases and bumped versions without corresponding npm artifacts.

### Fix Focus Areas
- .github/workflows/release-v3.yml[81-82]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended
2. Unpinned third-party action 🐞 Bug ⛨ Security
Description
The workflow uses fjogeleit/http-request-action@v1 (mutable tag) while passing the Slack webhook
secret, so a compromised/retargeted upstream tag could exfiltrate the webhook URL or send fraudulent
notifications. This is an avoidable supply-chain risk in CI.
Code

.github/workflows/release-v3.yml[R23-27]

+      - name: Send Slack notification
+        uses: fjogeleit/http-request-action@v1
+        with:
+          url: ${{ secrets.SLACK_DEV_TEAM_WEBHOOK_URL }}
+          method: "POST"
Evidence
A third-party action is referenced by a mutable major tag and is invoked with a secret URL input,
meaning the action code (if changed upstream) would still run and could access that secret.

.github/workflows/release-v3.yml[23-27]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
A third-party GitHub Action is referenced via a mutable tag (`@v1`) while receiving a Slack webhook secret.

### Issue Context
Pinning to a commit SHA reduces supply-chain risk from upstream tag changes.

### Fix Focus Areas
- .github/workflows/release-v3.yml[23-27]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider Grey Divider
Qodo Logo

Comment on lines +81 to +82
- name: Publish to npm with v3 dist-tag
run: yarn lerna publish from-package --dist-tag v3 --dry-run -y
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

1. Publish is dry-run 🐞 Bug ✓ Correctness

release-v3.yml runs yarn lerna publish ... --dry-run, so no packages are actually published even
though the workflow also bumps versions and creates a GitHub release, leaving the repo/releases
ahead of npm. This can produce a broken release state where consumers cannot install the released
versions.
Agent Prompt
### Issue description
The v3 release workflow does not publish anything because it runs `yarn lerna publish ... --dry-run`, despite creating version bumps/GitHub releases.

### Issue Context
This can create GitHub tags/releases and bumped versions without corresponding npm artifacts.

### Fix Focus Areas
- .github/workflows/release-v3.yml[81-82]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

rivka-ungar and others added 11 commits March 12, 2026 12:24
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
 - @vibe/base@4.0.0-alpha.2
 - @vibe/codemod@4.0.0-alpha.2
 - @vibe/button@4.0.0-alpha.2
 - @vibe/clickable@4.0.0-alpha.2
 - @vibe/dialog@4.0.0-alpha.2
 - @vibe/icon@4.0.0-alpha.2
 - @vibe/icon-button@4.0.0-alpha.2
 - @vibe/layer@4.0.0-alpha.2
 - @vibe/layout@4.0.0-alpha.2
 - @vibe/loader@4.0.0-alpha.2
 - @vibe/tooltip@4.0.0-alpha.2
 - @vibe/typography@4.0.0-alpha.2
 - @vibe/config@4.0.0-alpha.2
 - @vibe/core@4.0.0-alpha.2
 - @vibe/docs@4.0.0-alpha.2
 - @vibe/hooks@4.0.0-alpha.2
 - @vibe/icons@4.0.0-alpha.2
 - @vibe/mcp@4.0.0-alpha.2
 - @vibe/shared@4.0.0-alpha.2
 - vibe-storybook-components@4.0.0-alpha.2
 - @vibe/style@4.0.0-alpha.2
 - @vibe/testkit@4.0.0-alpha.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
@qodo-free-for-open-source-projects
Copy link
Copy Markdown
Contributor

qodo-free-for-open-source-projects bot commented Mar 16, 2026

Persistent review updated to latest commit 8074005

Base automatically changed from vibe4 to master March 18, 2026 10:24
@qodo-free-for-open-source-projects
Copy link
Copy Markdown
Contributor

qodo-free-for-open-source-projects bot commented Mar 24, 2026

Persistent review updated to latest commit 5d04fb2

Comment on lines +8 to +17
name: Validate Branch
runs-on: ubuntu-latest
steps:
- name: Ensure running on vibe3
if: github.ref != 'refs/heads/vibe3'
run: |
echo "::error::Release v3 workflow must be triggered from the vibe3 branch. Current branch: ${{ github.ref }}"
exit 1

notify-release-start:

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {}

Copilot Autofix

AI 9 days ago

In general, fix this by adding an explicit permissions block that grants only the minimal scopes needed. You can set a restrictive permissions block at the workflow root (applies to all jobs) and then override it per job where additional permissions are necessary.

For this specific workflow:

  • Add a top-level permissions block after name: (or after on:) with the minimal sensible default, e.g. contents: read. This is safe for jobs that don’t need to modify the repo or PRs.
  • For validate-branch: it only checks github.ref and prints an error; it does not use GITHUB_TOKEN at all. It can either inherit contents: read or, more strictly, override with permissions: {} to disable the token entirely.
  • For notify-release-start: it calls an HTTP webhook using a secret and does not interact with the GitHub API; inheriting contents: read is fine, but it also could use permissions: {}. To keep the configuration simple, letting it inherit read-only is acceptable and still follows least-privilege relative to defaults.
  • For build and test: they are uses:-reusable workflows. Their inner permissions are defined in their own files; this file only needs enough permission for needs/outputs, which does not require extra scopes beyond read of repo metadata. Let them inherit contents: read.
  • For release: this job checks out the repository, creates versions and GitHub releases (lerna version --create-release github), and uses VIBE_GITHUB_TOKEN. Creating releases requires contents: write; it may also need pull-requests: write if it manipulates PRs (not visible here), but we can safely grant contents: write which covers creating tags and releases. So add a per-job permissions block with contents: write (and optionally other specific scopes if later required) overriding the read-only default.

All required changes are in .github/workflows/release-v3.yml:

  • Insert a root-level permissions: block (e.g., after the on: block) with contents: read.
  • Insert a permissions: {} block in the validate-branch job to fully disable GITHUB_TOKEN for that job.
  • Insert a permissions: block for the release job that sets contents: write.

No new imports or external libraries are needed, as this is a YAML workflow configuration change only.

Suggested changeset 1
.github/workflows/release-v3.yml

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/.github/workflows/release-v3.yml b/.github/workflows/release-v3.yml
--- a/.github/workflows/release-v3.yml
+++ b/.github/workflows/release-v3.yml
@@ -3,10 +3,14 @@
 on:
   workflow_dispatch:
 
+permissions:
+  contents: read
+
 jobs:
   validate-branch:
     name: Validate Branch
     runs-on: ubuntu-latest
+    permissions: {}
     steps:
       - name: Ensure running on vibe3
         if: github.ref != 'refs/heads/vibe3'
@@ -57,6 +57,8 @@
     needs: [build, test]
     if: ${{ needs.build.outputs.has_changes == 'true' }}
     runs-on: ubuntu-latest
+    permissions:
+      contents: write
     env:
       NODE_AUTH_TOKEN: ${{ secrets.npm_token }}
     steps:
EOF
@@ -3,10 +3,14 @@
on:
workflow_dispatch:

permissions:
contents: read

jobs:
validate-branch:
name: Validate Branch
runs-on: ubuntu-latest
permissions: {}
steps:
- name: Ensure running on vibe3
if: github.ref != 'refs/heads/vibe3'
@@ -57,6 +57,8 @@
needs: [build, test]
if: ${{ needs.build.outputs.has_changes == 'true' }}
runs-on: ubuntu-latest
permissions:
contents: write
env:
NODE_AUTH_TOKEN: ${{ secrets.npm_token }}
steps:
Copilot is powered by AI and may make mistakes. Always verify output.
Comment on lines +18 to +39
name: Notify Slack - Release Started
needs: validate-branch
runs-on: ubuntu-latest
continue-on-error: true
steps:
- name: Send Slack notification
uses: fjogeleit/http-request-action@v1
with:
url: ${{ secrets.SLACK_DEV_TEAM_WEBHOOK_URL }}
method: "POST"
contentType: "application/json"
data: |
{
"event": "v3_release_started",
"actor": "${{ github.actor }}",
"commit_id": "${{ github.sha }}",
"workflow": "${{ github.workflow }}",
"run_url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}",
"commit_url": "${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}"
}

build:

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {}

Copilot Autofix

AI 9 days ago

In general, to fix this issue you should explicitly declare a permissions: block in the workflow, granting only the minimal rights each job actually needs. Jobs that only read repository metadata (or do not use GITHUB_TOKEN at all, like a pure Slack webhook call) can safely be restricted to contents: read. Jobs that need to write releases or tags may need contents: write or other specific scopes, but that is outside the scope of the flagged line; we must not change functionality of other jobs.

For this specific alert on notify-release-start, the safest, non-breaking fix is to define explicit read-only permissions for that job only. The job does not check out code, does not push commits, and does not create releases or pull requests. Its steps all use only secrets and workflow context; therefore, giving it contents: read is sufficient and will not impact its behavior. We will add a permissions: block under the notify-release-start job with contents: read. We will leave the other jobs (validate-branch, build, test, release) unchanged, so they continue using the repo’s current defaults and therefore preserve existing behavior.

Concretely:

  • Edit .github/workflows/release-v3.yml.
  • Under jobs:, inside the notify-release-start: job, insert:
    permissions:
      contents: read

between needs: validate-branch and runs-on: ubuntu-latest. No imports or additional definitions are needed.

Suggested changeset 1
.github/workflows/release-v3.yml

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/.github/workflows/release-v3.yml b/.github/workflows/release-v3.yml
--- a/.github/workflows/release-v3.yml
+++ b/.github/workflows/release-v3.yml
@@ -17,6 +17,8 @@
   notify-release-start:
     name: Notify Slack - Release Started
     needs: validate-branch
+    permissions:
+      contents: read
     runs-on: ubuntu-latest
     continue-on-error: true
     steps:
EOF
@@ -17,6 +17,8 @@
notify-release-start:
name: Notify Slack - Release Started
needs: validate-branch
permissions:
contents: read
runs-on: ubuntu-latest
continue-on-error: true
steps:
Copilot is powered by AI and may make mistakes. Always verify output.
Comment on lines +40 to +46
name: Build
needs: validate-branch
uses: ./.github/workflows/build-and-upload.yml
secrets:
npm_token: ${{ secrets.npm_token }}

test:

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {}

Copilot Autofix

AI 9 days ago

In general, the fix is to add an explicit permissions block that grants only the minimal required scopes to each job or to the workflow as a whole. Non-mutating jobs should get read-only (or even contents: read only), and only the releasing job should receive write permissions needed to create tags, releases, or other changes.

The best minimal change here is:

  • Add a root-level permissions: contents: read so that all jobs default to read-only.
  • Add a job-level permissions block to the release job granting the write access it actually needs. Because lerna version --create-release github will create git tags and GitHub releases, we should grant contents: write and packages: write (for publishing) and pull-requests: write only if needed; nothing in the snippet shows PR modifications, so we can omit that. If your release process only needs repo contents and releases, contents: write is sufficient; including packages: write is a safe complement for publishing workflows, though npm publishing itself uses NODE_AUTH_TOKEN, not GITHUB_TOKEN.

Concretely:

  • In .github/workflows/release-v3.yml, insert a root-level permissions: block after the on: section so all jobs get contents: read by default.
  • In the release job definition, add a permissions: block setting contents: write (and optionally packages: write if your policy is to allow it there). No imports or external dependencies are required; this is purely a YAML configuration change.
Suggested changeset 1
.github/workflows/release-v3.yml

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/.github/workflows/release-v3.yml b/.github/workflows/release-v3.yml
--- a/.github/workflows/release-v3.yml
+++ b/.github/workflows/release-v3.yml
@@ -3,6 +3,9 @@
 on:
   workflow_dispatch:
 
+permissions:
+  contents: read
+
 jobs:
   validate-branch:
     name: Validate Branch
@@ -57,6 +60,8 @@
     needs: [build, test]
     if: ${{ needs.build.outputs.has_changes == 'true' }}
     runs-on: ubuntu-latest
+    permissions:
+      contents: write
     env:
       NODE_AUTH_TOKEN: ${{ secrets.npm_token }}
     steps:
EOF
@@ -3,6 +3,9 @@
on:
workflow_dispatch:

permissions:
contents: read

jobs:
validate-branch:
name: Validate Branch
@@ -57,6 +60,8 @@
needs: [build, test]
if: ${{ needs.build.outputs.has_changes == 'true' }}
runs-on: ubuntu-latest
permissions:
contents: write
env:
NODE_AUTH_TOKEN: ${{ secrets.npm_token }}
steps:
Copilot is powered by AI and may make mistakes. Always verify output.
Comment on lines +47 to +55
name: Test
needs: build
uses: ./.github/workflows/test.yml
with:
has_changes: ${{ needs.build.outputs.has_changes }}
secrets:
npm_token: ${{ secrets.npm_token }}

release:

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {}

Copilot Autofix

AI 9 days ago

In general: Add an explicit permissions: block to the workflow to limit the default GITHUB_TOKEN permissions to read-only, and then selectively grant write permissions only to jobs that actually need them (here, the release job, which creates GitHub releases and likely needs contents: write and pull-requests: write).

Best concrete fix for this file:

  1. Add a root-level permissions: block near the top of .github/workflows/release-v3.yml, just after name: (before on:), to apply to all jobs by default:

    • Set contents: read as the baseline.
    • Optionally add other read-only scopes if needed in the future; based on the visible steps, read-only contents is sufficient for validate-branch, notify-release-start, build, and test.
  2. Add a job-level permissions: block to the release job because it:

    • Checks out code (uses contents permissions; read is sufficient for checkout).
    • Runs yarn lerna version ... --create-release github, which creates GitHub releases and possibly interacts with tags/releases via the GitHub API. This typically requires contents: write and often pull-requests: write when interacting with PR metadata.
    • To avoid breaking existing behavior, give release the necessary write scopes:
      • contents: write
      • pull-requests: write
  3. Leave test (and the other jobs) inheriting the new root-level minimal permissions: to satisfy CodeQL’s concern on the test job while keeping them least-privilege.

All needed changes are within .github/workflows/release-v3.yml; no imports or additional definitions are required.

Suggested changeset 1
.github/workflows/release-v3.yml

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/.github/workflows/release-v3.yml b/.github/workflows/release-v3.yml
--- a/.github/workflows/release-v3.yml
+++ b/.github/workflows/release-v3.yml
@@ -1,5 +1,8 @@
 name: Release v3 version
 
+permissions:
+  contents: read
+
 on:
   workflow_dispatch:
 
@@ -57,6 +60,9 @@
     needs: [build, test]
     if: ${{ needs.build.outputs.has_changes == 'true' }}
     runs-on: ubuntu-latest
+    permissions:
+      contents: write
+      pull-requests: write
     env:
       NODE_AUTH_TOKEN: ${{ secrets.npm_token }}
     steps:
EOF
@@ -1,5 +1,8 @@
name: Release v3 version

permissions:
contents: read

on:
workflow_dispatch:

@@ -57,6 +60,9 @@
needs: [build, test]
if: ${{ needs.build.outputs.has_changes == 'true' }}
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
env:
NODE_AUTH_TOKEN: ${{ secrets.npm_token }}
steps:
Copilot is powered by AI and may make mistakes. Always verify output.
Comment on lines +56 to +85
name: Release
needs: [build, test]
if: ${{ needs.build.outputs.has_changes == 'true' }}
runs-on: ubuntu-latest
env:
NODE_AUTH_TOKEN: ${{ secrets.npm_token }}
steps:
- uses: actions/checkout@v4
with:
token: ${{ secrets.VIBE_GITHUB_TOKEN }}
fetch-depth: 0
- name: Run Setup
uses: ./.github/actions/setup
with:
npm_token: ${{ secrets.npm_token }}
- uses: ./.github/actions/git-creds
- uses: ./.github/actions/download-builds
- name: Generate new versions
run: yarn lerna version --exact --conventional-commits --message "Publish [skip ci]" -y --create-release github
env:
GH_TOKEN: ${{ secrets.VIBE_GITHUB_TOKEN }}
- run: yarn config set registry https://registry.npmjs.org/
- name: Setup .npmrc for publish
id: setup-npmrc
run: echo "//registry.npmjs.org/:_authToken=$NODE_AUTH_TOKEN" > .npmrc
- name: Publish to npm with v3 dist-tag
run: yarn lerna publish from-package --dist-tag v3 --dry-run -y
- name: Remove .npmrc
if: steps.setup-npmrc.outcome == 'success'
run: rm .npmrc

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {contents: read}

Copilot Autofix

AI 9 days ago

To fix the problem, explicitly define permissions for the workflow so that GITHUB_TOKEN has only the minimal scopes required. Since this is a release workflow that creates GitHub releases and likely pushes tags/commits, the release job needs contents: write. The other jobs (validate-branch, notify-release-start, build, test) only read repository metadata and/or call sub‑workflows and external services; they can use contents: read or inherit a conservative default.

The simplest and safest change without altering functionality is:

  • Add a top-level permissions: block after name: (before on:) setting contents: read so all jobs default to read-only repo access.
  • Add a job-level permissions: block under the release job with contents: write to allow it to create tags/commits/releases as it already does via CLI tools and GitHub APIs.

No additional imports or dependencies are required; this is purely a YAML configuration change within .github/workflows/release-v3.yml.

Suggested changeset 1
.github/workflows/release-v3.yml

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/.github/workflows/release-v3.yml b/.github/workflows/release-v3.yml
--- a/.github/workflows/release-v3.yml
+++ b/.github/workflows/release-v3.yml
@@ -1,5 +1,8 @@
 name: Release v3 version
 
+permissions:
+  contents: read
+
 on:
   workflow_dispatch:
 
@@ -57,6 +60,8 @@
     needs: [build, test]
     if: ${{ needs.build.outputs.has_changes == 'true' }}
     runs-on: ubuntu-latest
+    permissions:
+      contents: write
     env:
       NODE_AUTH_TOKEN: ${{ secrets.npm_token }}
     steps:
EOF
@@ -1,5 +1,8 @@
name: Release v3 version

permissions:
contents: read

on:
workflow_dispatch:

@@ -57,6 +60,8 @@
needs: [build, test]
if: ${{ needs.build.outputs.has_changes == 'true' }}
runs-on: ubuntu-latest
permissions:
contents: write
env:
NODE_AUTH_TOKEN: ${{ secrets.npm_token }}
steps:
Copilot is powered by AI and may make mistakes. Always verify output.
@qodo-free-for-open-source-projects
Copy link
Copy Markdown
Contributor

qodo-free-for-open-source-projects bot commented Mar 24, 2026

Persistent review updated to latest commit 39c0646

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 24, 2026

📦 Bundle Size Analysis

✅ No bundle size changes detected.

Unchanged Components
Component Base PR Diff
@vibe/button 17.3KB 17.27KB -37B 🟢
@vibe/clickable 5.97KB 5.96KB -8B 🟢
@vibe/dialog 52.17KB 52.13KB -40B 🟢
@vibe/icon-button 66.07KB 66.08KB +5B 🔺
@vibe/icon 12.92KB 12.93KB +6B 🔺
@vibe/layer 2.96KB 2.96KB 0B ➖
@vibe/layout 9.83KB 9.83KB 0B ➖
@vibe/loader 5.64KB 5.66KB +19B 🔺
@vibe/tooltip 61.31KB 61.31KB -3B 🟢
@vibe/typography 63.41KB 63.48KB +73B 🔺
Accordion 6.3KB 6.31KB +8B 🔺
AccordionItem 66.47KB 66.44KB -24B 🟢
AlertBanner 70.81KB 70.74KB -64B 🟢
AlertBannerButton 18.76KB 18.79KB +30B 🔺
AlertBannerLink 15.23KB 15.21KB -16B 🟢
AlertBannerText 63.91KB 63.92KB +7B 🔺
AttentionBox 74.28KB 74.29KB +13B 🔺
Avatar 66.68KB 66.73KB +52B 🔺
AvatarGroup 93.25KB 93.2KB -54B 🟢
Badge 43.2KB 43.18KB -12B 🟢
BreadcrumbItem 64.66KB 64.61KB -54B 🟢
BreadcrumbMenu 68.58KB 68.57KB -7B 🟢
BreadcrumbMenuItem 77.07KB 76.99KB -82B 🟢
BreadcrumbsBar 5.66KB 5.68KB +16B 🔺
ButtonGroup 68.23KB 68.27KB +43B 🔺
Checkbox 66.84KB 66.87KB +33B 🔺
Chips 75.02KB 74.93KB -88B 🟢
ColorPicker 74.3KB 74.29KB -14B 🟢
ColorPickerContent 73.57KB 73.59KB +18B 🔺
Combobox 84.01KB 84KB -7B 🟢
Counter 42.2KB 42.23KB +36B 🔺
DatePicker 112.39KB 112.27KB -124B 🟢
Divider 5.45KB 5.46KB +8B 🔺
Dropdown 95.23KB 95.08KB -149B 🟢
EditableHeading 66.43KB 66.41KB -20B 🟢
EditableText 66.34KB 66.31KB -29B 🟢
EmptyState 70.35KB 70.3KB -57B 🟢
ExpandCollapse 66.18KB 66.17KB -17B 🟢
FormattedNumber 5.81KB 5.82KB +11B 🔺
GridKeyboardNavigationContext 4.65KB 4.65KB -4B 🟢
HiddenText 5.41KB 5.39KB -18B 🟢
Info 72.01KB 71.98KB -33B 🟢
Label 68.57KB 68.63KB +54B 🔺
Link 14.9KB 14.89KB -14B 🟢
List 72.85KB 72.84KB -7B 🟢
ListItem 65.53KB 65.48KB -59B 🟢
ListItemAvatar 66.93KB 66.9KB -29B 🟢
ListItemIcon 14KB 13.97KB -31B 🟢
ListTitle 64.92KB 64.96KB +46B 🔺
Menu 8.67KB 8.63KB -41B 🟢
MenuDivider 5.55KB 5.59KB +43B 🔺
MenuGridItem 7.16KB 7.19KB +36B 🔺
MenuItem 76.96KB 76.8KB -163B 🟢
MenuItemButton 70.09KB 69.99KB -100B 🟢
MenuTitle 65.32KB 65.3KB -19B 🟢
MenuButton 66.07KB 66.09KB +18B 🔺
Modal 79.05KB 79.02KB -32B 🟢
ModalContent 4.72KB 4.71KB -1B 🟢
ModalHeader 65.85KB 65.84KB -10B 🟢
ModalMedia 7.51KB 7.49KB -18B 🟢
ModalFooter 67.65KB 67.64KB -11B 🟢
ModalFooterWizard 68.65KB 68.54KB -119B 🟢
ModalBasicLayout 8.92KB 8.91KB -10B 🟢
ModalMediaLayout 8.06KB 8.08KB +17B 🔺
ModalSideBySideLayout 6.3KB 6.31KB +8B 🔺
MultiStepIndicator 52.97KB 52.93KB -40B 🟢
NumberField 72.77KB 72.78KB +10B 🔺
ProgressBar 7.36KB 7.34KB -15B 🟢
RadioButton 65.87KB 65.88KB +10B 🔺
Search 70.59KB 70.57KB -21B 🟢
Skeleton 6KB 5.98KB -15B 🟢
Slider 73.91KB 73.85KB -59B 🟢
SplitButton 66.42KB 66.56KB +141B 🔺
SplitButtonMenu 8.79KB 8.8KB +16B 🔺
Steps 71.28KB 71.32KB +36B 🔺
Table 7.25KB 7.28KB +31B 🔺
TableBody 66.73KB 66.69KB -47B 🟢
TableCell 65.23KB 65.2KB -33B 🟢
TableContainer 5.31KB 5.31KB +8B 🔺
TableHeader 5.65KB 5.66KB +10B 🔺
TableHeaderCell 72.19KB 72.18KB -11B 🟢
TableRow 5.56KB 5.56KB 0B ➖
TableRowMenu 68.79KB 68.84KB +55B 🔺
TableVirtualizedBody 71.44KB 71.35KB -86B 🟢
Tab 63.93KB 63.96KB +24B 🔺
TabList 8.86KB 8.86KB -6B 🟢
TabPanel 5.32KB 5.29KB -34B 🟢
TabPanels 5.87KB 5.84KB -35B 🟢
TabsContext 5.48KB 5.51KB +29B 🔺
TextArea 66.29KB 66.37KB +79B 🔺
TextField 69.38KB 69.43KB +52B 🔺
TextWithHighlight 64.34KB 64.25KB -101B 🟢
ThemeProvider 4.36KB 4.36KB -1B 🟢
Tipseen 71.12KB 71.11KB -14B 🟢
TipseenContent 71.58KB 71.65KB +76B 🔺
TipseenMedia 71.29KB 71.29KB 0B ➖
TipseenWizard 73.78KB 73.86KB +81B 🔺
Toast 73.97KB 73.97KB -5B 🟢
ToastButton 18.64KB 18.6KB -34B 🟢
ToastLink 15.08KB 15.07KB -8B 🟢
Toggle 66.59KB 66.61KB +14B 🔺
TransitionView 5.45KB 5.43KB -18B 🟢
VirtualizedGrid 12.57KB 12.53KB -36B 🟢
VirtualizedList 12.31KB 12.25KB -57B 🟢
List (Next) 8.15KB 8.17KB +17B 🔺
ListItem (Next) 69.9KB 69.92KB +19B 🔺
ListTitle (Next) 65.31KB 65.29KB -16B 🟢

📊 Summary:

  • Total Base Size: 4.75MB
  • Total PR Size: 4.75MB
  • Total Difference: 1009B

@qodo-free-for-open-source-projects
Copy link
Copy Markdown
Contributor

qodo-free-for-open-source-projects bot commented Mar 30, 2026

Persistent review updated to latest commit 39b4f99

@talkor talkor closed this Mar 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants