fix: resolve vercel CLI v41 scope error for personal accounts#297
fix: resolve vercel CLI v41 scope error for personal accounts#297
Conversation
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.
Summary of ChangesHello, 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
🧠 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
Using Gemini Code AssistThe 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
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 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
|
|
Deploy preview for express-basic-auth ready! ✅ Preview Built with commit b4e6b79. |
There was a problem hiding this comment.
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.
Nest vercelProjectId check inside vercelOrgId block for better readability
There was a problem hiding this comment.
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_IDunlessVERCEL_ORG_IDis also provided. - For personal accounts (no org ID), pass the project via
--projectinstead ofVERCEL_PROJECT_ID. - Re-add
vercel-org-idusage 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.
Check if --project was already provided by the user in vercel-args before automatically appending it, avoiding duplicated/ambiguous flags.
|
- 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)
- 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)
- 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: 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>



Summary
VERCEL_ORG_IDwheneverVERCEL_PROJECT_IDis set, which breaks personal-account deployments that have no org IDindex.js) and re-added missingvercel-org-idinputs to the example and deploy workflowsChanges
Action code (
index.js+dist/index.js)--projectflag for project identification whenVERCEL_ORG_IDis not provided, instead of relying solely on environment variablesVERCEL_PROJECT_IDenv var whenVERCEL_ORG_IDis also present, preventing the scope-validation error introduced in CLI v41Workflows (
.github/workflows/)deploy.yml— re-addedvercel-org-idinputexample-static.yml— re-addedvercel-org-idinputexample-angular.yml— re-addedvercel-org-idinputexample-nextjs.yml— re-addedvercel-org-idinputTest Plan
--projectflag logicdist/index.jsmatches the updatedindex.jslogicSummary by cubic
Fixes failures with
vercelCLI v41+ that required an org ID when a project ID was set. Personal-account deployments work again; org/team flows are unchanged.Bug Fixes
--projectwhen no org ID is provided, and skip adding--projectif it’s already invercel-args.vercel-org-idinput to deploy and examples; set VERCEL_ORG_ID in Next.js pull/build/deploy steps. Rebuiltdist/index.js.Refactors
index.jsfor clearer logic.Written for commit b4e6b79. Summary will update on new commits.