Skip to content

fix: resolve vercel CLI v41 scope error for personal accounts#297

Merged
amondnet merged 3 commits intomasterfrom
amondnet/profuse-nasturtium
Mar 25, 2026
Merged

fix: resolve vercel CLI v41 scope error for personal accounts#297
amondnet merged 3 commits intomasterfrom
amondnet/profuse-nasturtium

Conversation

@amondnet
Copy link
Copy Markdown
Owner

@amondnet amondnet commented Mar 25, 2026

Summary

  • Fixes CI failures caused by Vercel CLI v41+ requiring VERCEL_ORG_ID whenever VERCEL_PROJECT_ID is set, which breaks personal-account deployments that have no org ID
  • Two-pronged fix: updated action code (index.js) and re-added missing vercel-org-id inputs to the example and deploy workflows

Changes

Action code (index.js + dist/index.js)

  • Disable Vercel CLI telemetry at startup
  • Use --project flag for project identification when VERCEL_ORG_ID is not provided, instead of relying solely on environment variables
  • Only set VERCEL_PROJECT_ID env var when VERCEL_ORG_ID is also present, preventing the scope-validation error introduced in CLI v41

Workflows (.github/workflows/)

  • deploy.yml — re-added vercel-org-id input
  • example-static.yml — re-added vercel-org-id input
  • example-angular.yml — re-added vercel-org-id input
  • example-nextjs.yml — re-added vercel-org-id input

Test Plan

  • Verify CI passes on this PR for all four example workflows
  • Confirm personal-account deployments (no org ID) succeed with updated --project flag logic
  • Confirm team/org deployments (with org ID) continue to work unchanged
  • Smoke-test the bundled dist/index.js matches the updated index.js logic

Summary by cubic

Fixes failures with vercel CLI v41+ that required an org ID when a project ID was set. Personal-account deployments work again; org/team flows are unchanged.

  • Bug Fixes

    • Action: disable telemetry, only export VERCEL_PROJECT_ID when VERCEL_ORG_ID is set, use --project when no org ID is provided, and skip adding --project if it’s already in vercel-args.
    • Workflows: re-add vercel-org-id input to deploy and examples; set VERCEL_ORG_ID in Next.js pull/build/deploy steps. Rebuilt dist/index.js.
  • Refactors

    • Nest VERCEL_PROJECT_ID check inside the VERCEL_ORG_ID block in index.js for clearer logic.

Written for commit b4e6b79. Summary will update on new commits.

Vercel CLI v41+ requires VERCEL_ORG_ID when VERCEL_PROJECT_ID is set,
breaking deployments for personal accounts that do not have an org ID.

Two-pronged fix:
- index.js: use --project flag when org ID is absent, disable telemetry,
  and only set VERCEL_PROJECT_ID env var when VERCEL_ORG_ID is also provided
- workflows: re-add vercel-org-id input to deploy, example-static,
  example-angular, and example-nextjs workflows

Rebuilt dist/index.js to include the updated action code.
Copilot AI review requested due to automatic review settings March 25, 2026 22:16
@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request addresses critical CI failures introduced by Vercel CLI v41 and later versions, specifically impacting deployments for personal accounts. It implements a robust solution within the action's core logic to correctly handle project identification and environment variable configuration, ensuring seamless deployments regardless of whether an organization ID is present.

Highlights

  • Vercel CLI v41+ Compatibility: Resolved CI failures caused by Vercel CLI v41+ requiring 'VERCEL_ORG_ID' when 'VERCEL_PROJECT_ID' is set, which previously broke personal account deployments without an organization ID.
  • Action Code Updates: Modified the core action logic in 'index.js' to disable Vercel CLI telemetry, conditionally set 'VERCEL_PROJECT_ID' only when 'VERCEL_ORG_ID' is also present, and utilize the '--project' flag for project identification when no organization ID is provided.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Ignored Files
  • Ignored by pattern: .github/workflows/** (4)
    • .github/workflows/deploy.yml
    • .github/workflows/example-angular.yml
    • .github/workflows/example-nextjs.yml
    • .github/workflows/example-static.yml
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 25, 2026

Deploy preview for express-basic-auth ready!

✅ Preview
https://express-basic-auth-kj9v0g57z-minsu-lees-projects-b1e388b7.vercel.app

Built with commit b4e6b79.
This pull request is being automatically deployed with vercel-action

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request disables Vercel telemetry and refines the logic for setting Vercel environment variables and command-line arguments. It ensures VERCEL_PROJECT_ID is only exported when VERCEL_ORG_ID is also present, and adds a --project flag to the Vercel deploy command when a project ID is provided without an organization ID. A readability improvement was suggested for nesting the vercelProjectId check within the vercelOrgId block.

Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

No issues found across 6 files

Requires human review: This PR modifies the core deployment logic (CLI flag construction and environment variable exports) and includes a massive rebuild of the dist/index.js file, which requires human review.

Nest vercelProjectId check inside vercelOrgId block for better readability
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Updates the GitHub Action’s Vercel CLI invocation to avoid the v41+ “scope/org required when VERCEL_PROJECT_ID is set” failure, especially for personal-account deployments, and reintroduces vercel-org-id wiring in example/deploy workflows.

Changes:

  • In the action, disable Vercel CLI telemetry and avoid exporting VERCEL_PROJECT_ID unless VERCEL_ORG_ID is also provided.
  • For personal accounts (no org ID), pass the project via --project instead of VERCEL_PROJECT_ID.
  • Re-add vercel-org-id usage in example/deploy workflows.

Reviewed changes

Copilot reviewed 5 out of 6 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
index.js Adjusts env var export and adds --project flag path for no-org deployments.
.github/workflows/deploy.yml Re-adds vercel-org-id input to the deploy workflow.
.github/workflows/example-static.yml Re-adds vercel-org-id input in both staging/production jobs.
.github/workflows/example-angular.yml Re-adds vercel-org-id input in both staging/production jobs.
.github/workflows/example-nextjs.yml Re-adds org ID usage in env and action inputs for Next.js example pipeline.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

0 issues found across 1 file (changes from recent commits).

Requires human review: Modifies deployment logic and CI/CD workflows to accommodate Vercel CLI v41 breaking changes; touches core execution paths.

Check if --project was already provided by the user in vercel-args
before automatically appending it, avoiding duplicated/ambiguous flags.
@sonarqubecloud
Copy link
Copy Markdown

@amondnet amondnet merged commit b591ac8 into master Mar 25, 2026
7 of 14 checks passed
@amondnet amondnet deleted the amondnet/profuse-nasturtium branch March 25, 2026 22:27
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

0 issues found across 2 files (changes from recent commits).

Requires human review: Modifies core deployment logic, including environment variable handling and CLI argument construction, which impacts the deployment workflow across all users.

amondnet added a commit that referenced this pull request Mar 26, 2026
- Add core.setSecret for vercel token to prevent log exposure
- Disable telemetry with VERCEL_TELEMETRY_DISABLED env var
- Require both org and project IDs together (v41+ compat)
- Auto-retry deployment on personal account scope error
- Sanitize commit message newlines and quotes in metadata
- Add ignoreReturnCode for proper exit code handling
- Update tests for new behavior (105 total)
amondnet added a commit that referenced this pull request Mar 26, 2026
- Add core.setSecret for vercel token to prevent log exposure
- Disable telemetry with VERCEL_TELEMETRY_DISABLED env var
- Require both org and project IDs together (v41+ compat)
- Auto-retry deployment on personal account scope error
- Sanitize commit message newlines and quotes in metadata
- Add ignoreReturnCode for proper exit code handling
- Update tests for new behavior (105 total)
amondnet added a commit that referenced this pull request Mar 26, 2026
- Add core.setSecret for vercel token to prevent log exposure
- Disable telemetry with VERCEL_TELEMETRY_DISABLED env var
- Require both org and project IDs together (v41+ compat)
- Auto-retry deployment on personal account scope error
- Sanitize commit message newlines and quotes in metadata
- Add ignoreReturnCode for proper exit code handling
- Update tests for new behavior (105 total)
amondnet added a commit that referenced this pull request Mar 26, 2026
* refactor: migrate to TypeScript with Vitest and modern tooling

BREAKING CHANGE: @actions/github upgraded from v2 to v6

- Convert index.js to src/index.ts with strict TypeScript mode
- Extract pure utility functions to src/utils.ts for testability
- Add tsconfig.json with strict compiler options

- Replace Jest with Vitest for faster, ESM-native testing
- Add comprehensive unit tests for utility functions (43 tests)
- Add integration tests for GitHub Action structure (12 tests)
- Target: 80%+ code coverage

- Migrate from deprecated `new github.GitHub(token)` to `github.getOctokit(token)`
- Update all API calls from `octokit.repos.*` to `octokit.rest.repos.*`
- Update all API calls from `octokit.issues.*` to `octokit.rest.issues.*`
- Update all API calls from `octokit.git.*` to `octokit.rest.git.*`

- Enable TypeScript support in @antfu/eslint-config
- Replace Jest globals with Vitest globals (vi instead of jest)
- Add lib/ to ignore patterns

- Update ncc build to compile TypeScript directly
- Add source maps and licenses to dist output
- Add typecheck script for standalone type checking
- Update all npm scripts for TypeScript workflow

- index.js (migrated to src/index.ts)
- index.test.js (migrated to src/__tests__/*.test.ts)
- jest.config.js (replaced by vitest.config.ts)
- now.js (unused legacy file)

Closes #291

* chore: apply AI code review suggestions

- Move PullRequestPayload and ReleasePayload interfaces to top of file
- Use PullRequestPayload type instead of inline type assertion
- Simplify parseArgs regex match logic (remove redundant fallback)

* refactor: split index.ts into smaller modules

- Extract types to src/types.ts
- Extract config and initialization to src/config.ts
- Extract Vercel functions to src/vercel.ts
- Extract GitHub comment functions to src/github-comments.ts
- Refactor run() into smaller focused functions (< 50 LOC each)
- Add try-catch around execSync for git log with descriptive error
- Add error handling for GitHub API calls
- Make alias failures explicit with warning messages
- Extract magic numbers to named constants (RETRY_DELAY_MS, ALIAS_RETRY_COUNT)
- Use buildCommentPrefix() consistently in both comment functions

All files now under 300 LOC limit, all functions under 50 LOC limit.

* build: rebuild dist after refactoring

* build: update vercel to v50

* fix: improve error handling in vercel deploy and comment functions

- Extract and validate deployment URL from vercel CLI stdout
- Wrap vercelInspect exec in try-catch to prevent action failure
- Expand try-catch scope in comment functions to cover API lookups
- Route stderr to core.warning for better error visibility

* test: add tests for vercel, config, and github-comments modules

- Add vercel.test.ts: URL extraction, inspect regex, alias retry
- Add config.test.ts: alias domain substitution, env export
- Add github-comments.test.ts: comment create/update, error handling
- Total tests: 55 → 100

* fix: port personal account scope error handling from PR #297/#298

- Add core.setSecret for vercel token to prevent log exposure
- Disable telemetry with VERCEL_TELEMETRY_DISABLED env var
- Require both org and project IDs together (v41+ compat)
- Auto-retry deployment on personal account scope error
- Sanitize commit message newlines and quotes in metadata
- Add ignoreReturnCode for proper exit code handling
- Update tests for new behavior (105 total)

* refactor: use DeploymentContext object in vercelDeploy signature

Reduce parameter count from 6 to 2 by passing DeploymentContext
object instead of individual ref, commit, sha, commitOrg, commitRepo
arguments. Aligns with AGENTS.md parameter limit of 5.

* fix: port alias retry without --scope for personal accounts (#310)

Capture stderr in alias exec and retry without --scope when Vercel CLI
rejects personal account scope, matching the deploy retry pattern.
Add tests for alias scope retry, retry failure, and non-scope failures.

* fix: remove declaration maps to fix check-dist CI failure

Source map files (.d.ts.map) contain absolute local paths that differ
between local builds and CI runners, causing check-dist to fail.
Disable declarationMap in tsconfig.json since these files are not
needed for GitHub Action runtime execution.

* chore: apply AI code review suggestions

- Implement exponential backoff in retry function (was constant delay)
- Fix debug log for head_commit to use JSON.stringify
- Change vercelInspect stderr logging from warning to info level
- Fix retry after PERSONAL_ACCOUNT_SCOPE_ERROR to omit --scope
- Bump @types/node from ^20.0.0 to ^24.0.0 to match Node 24 runtime
- Add setSecret to @actions/core mock in index.test.ts
- Fix mock path in config.test.ts from ../package.json to ../../package.json
- Update test expectation to match mocked vercel version (30.0.0)
- Remove pull_request_target from PullRequestPayload (always undefined)
- Add per_page: 100 to comment listing API calls to reduce duplicate risk
- Fix Node version in session-summary.md (20 → 24)

* fix: make vercelScope optional to clean up retry cast in vercelDeploy

Co-authored-by: amondnet <1964421+amondnet@users.noreply.github.com>
Agent-Logs-Url: https://github.com/amondnet/vercel-action/sessions/16d171b4-3be8-43f8-a736-b5f3ff13deba

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: amondnet <1964421+amondnet@users.noreply.github.com>
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.

2 participants