chore(repo): supply-chain and CI/CD hardening -- part 2 [PLT-103649]#698
Open
CalinaCristian wants to merge 5 commits into
Open
chore(repo): supply-chain and CI/CD hardening -- part 2 [PLT-103649]#698CalinaCristian wants to merge 5 commits into
CalinaCristian wants to merge 5 commits into
Conversation
There was a problem hiding this comment.
Pull request overview
This PR hardens repository supply-chain and CI/CD behavior across release, dev publish/cleanup, dependency policy, and workflow guidance.
Changes:
- Upgrades repo tooling guidance/configuration toward pnpm 11 and expands pnpm supply-chain controls.
- Hardens publishing scripts and release workflows with stricter validation, token isolation, SBOM/provenance steps, and safer output delimiters.
- Updates CI governance, action pins, Dependabot policy, CODEOWNERS, and monitoring for npm publish/release mismatches.
Reviewed changes
Copilot reviewed 32 out of 33 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
web-packages/ap-chat/.releaserc.json |
Passes release channel through TAG_NAME for publishing. |
packages/apollo-core/.releaserc.json |
Updates publish command tag handling. |
packages/apollo-react/.releaserc.json |
Updates publish command tag handling. |
packages/apollo-wind/.releaserc.json |
Updates publish command tag handling. |
scripts/publish-to-registries.sh |
Adds stricter shell mode, tag validation, arg filtering, and token isolation. |
scripts/publish-dev.ts |
Adds package validation and token-isolation changes for dev publish. |
scripts/unpublish-dev.ts |
Adds fetch timeouts and stricter package validation. |
scripts/create-dev-comment.ts |
Filters existing dev package comments to bot-authored comments. |
scripts/update-dev-comment-row.ts |
Filters existing dev package comments to bot-authored comments. |
scripts/check-licenses.ts |
Replaces shell command execution with execFileSync. |
pnpm-workspace.yaml |
Moves peer settings, adds pnpm 11 supply-chain/build-script settings, and extends release-age exemptions. |
package.json |
Pins semantic-release-monorepo and updates package manager to pnpm 11. |
apps/apollo-vertex/package.json |
Updates package manager to pnpm 11. |
.npmrc |
Removes pnpm behavior settings now moved to workspace config. |
CONTRIBUTING.md |
Updates pnpm prerequisite to v11. |
CODEOWNERS |
Adds ownership coverage for turbo.json. |
.github/workflows/release.yml |
Adds timeout, credential handling changes, SBOM generation, artifacts, and attestations. |
.github/workflows/dev-publish.yml |
Hardens outputs, env handling, and publish/cleanup tokens. |
.github/workflows/dev-cleanup.yml |
Hardens multiline outputs and cleanup token usage. |
.github/workflows/monitor-npm-publishes.yml |
Adds scheduled npm publish/release mismatch monitoring. |
.github/workflows/vercel-deploy.yml |
Updates github-script pin and adjusts Vercel CLI cache keying. |
.github/workflows/support-branch-scope.yml |
Uses randomized GitHub output delimiters and updates github-script pin. |
.github/workflows/prune-release-age-exemptions.yml |
Disables checkout credential persistence and injects credentials later. |
.github/workflows/pr-labeler.yml |
Adds PR-scoped concurrency. |
.github/workflows/dependency-review.yml |
Updates github-script pin. |
.github/workflows/commit-lint.yml |
Adds PR-scoped concurrency. |
.github/workflows/codeql.yml |
Documents governance around auto-dismissing suppressed alerts. |
.github/workflows/close-stale-prs.yml |
Moves GH_TOKEN to step-scoped env. |
.github/workflows/apollo-vertex-registry-check.yml |
Uses shell environment variables for workspace paths. |
.github/dependabot.yml |
Ignores major updates and simplifies update grouping policy. |
.github/copilot-instructions.md |
Rewrites repo guidance with expanded CI/supply-chain review rules. |
.claude/skills/harden-github-action/SKILL.md |
Updates pnpm context to v11. |
a492cb8 to
47852d7
Compare
980f8cd to
bde338b
Compare
Dependency License Review
License distribution
Excluded packages
|
bde338b to
6044337
Compare
6044337 to
2717acc
Compare
8276926 to
1f1a200
Compare
1f1a200 to
2fc79e0
Compare
2fc79e0 to
3f83bd9
Compare
3f83bd9 to
2468724
Compare
snuziale
approved these changes
May 14, 2026
2468724 to
1767df3
Compare
1767df3 to
802b842
Compare
802b842 to
2d71f91
Compare
2d71f91 to
7ad8b04
Compare
7ad8b04 to
ebcc72f
Compare
ebcc72f to
0325867
Compare
0325867 to
c0a8dc3
Compare
Comment on lines
+6
to
+7
| # Intentionally excludes: packages:, minimumReleaseAge*, blockExoticSubdeps, | ||
| # auditConfig — those are irrelevant or break isolated installs. |
c0a8dc3 to
0c66b1f
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part 2 of #688
What this does
Workflows
support-branch-scope.yml—gh pr diffoutput (attacker-controlled file paths) was written using a literalEOFdelimiter; replaced with random delimiters viaopenssl randGH_TOKENfrom job-level to step-scoped env inclose-stale-prs.ymltimeout-minutes: 30to the release job; addedattestations: writepermission required byactions/attest-sbomandactions/attest-build-provenance; SBOMs now written to$RUNNER_TEMPinstead of the repo root (prevents them being committed by the version-bumpgit add --all)concurrency:blocks topr-labeler.ymlandcommit-lint.ymlmonitor-npm-publishes.yml— daily workflow that cross-references all@uipath/*dist-tag versions on npm against GitHub releases; opens a security issue on mismatch, closes it when resolved, fails hard on npm fetch errors so outages cannot silently auto-close alertsref_name); now both primary key and restore prefix includeref_namedependency-review.ymlpermissions cleanup —pull-requests: writewas unnecessary for the license check job (PR comments via the Issues API only needissues: write)install-node-deps/action.yml— switched fromNODE_AUTH_TOKENtoGH_NPM_REGISTRY_TOKENto fix 401s under pnpm 11, which reads both theactions/setup-nodetemp.npmrcand the repo.npmrcsimultaneouslyapollo-vertex-registry-check.yml— replaced${{ github.workspace }}inline inrun:with$GITHUB_WORKSPACE; registry test jobs now seed a dedicatedpnpm-workspace-registry-test.yamlinto temp dirs so pnpm 11 resolves packages identically to the main workspaceScripts
unpublish-dev.ts: added@uipath/scope validation inunpublishFromGitHub()andmain(); tightened package name regex to^@uipath/[a-z0-9-]+$publish-dev.ts: added package name validation before resolving the workspace path; GHP publish now correctly keepsGH_NPM_REGISTRY_TOKENand clearsNPM_AUTH_TOKEN(was reversed)publish-to-registries.sh:NPM_AUTH_TOKENcleared for GHP publish;--tagstripped from caller args and driven by validated$TAG_NAMEenv var;TAG_NAMEguard added.releaserc.jsonfiles:publishCmdchanged toTAG_NAME=${nextRelease.channel || 'latest'} bash ...so the tag passes throughpublish-to-registries.shvalidationcheck-licenses.ts:execSync(shell form) replaced withexecFileSynccreate-dev-comment.tsandupdate-dev-comment-row.ts: added bot-type guard to thejqfilter to prevent comment-plantingmonitor-npm-publishes.ymlscript: usesnpm view dist-tags --jsonto check all tagged versions (not justlatest); fetch failures increment a counter and block the auto-close path; skip pattern tightened to[[ "$version" =~ -pr[0-9]+(\..*)?$ ]]so-prereleaseversions are not incorrectly excludedSupply chain config
pnpm.*block inpackage.json. All overrides, packageExtensions, and onlyBuiltDependencies must live inpnpm-workspace.yaml. Moved the fullpnpmblock accordingly.pnpm-workspace.yaml: addedoverrides(including@standard-schema/spec: ^1.1.0) andpackageExtensionsfor@tanstack/ai— required for correct TypeScript type resolution under pnpm 11, which links packages differently and exposes a latent type inference issue with@tanstack/ai-reactand@tanstack/react-dbwhen@standard-schema/spec@1.0.0is hoisted instead of1.1.0package.json: pinnedsemantic-release-monorepoto exact8.0.2; removed the now-ignoredpnpm.*block; bumpedengines.pnpmto>=11CODEOWNERS: added explicit entry forturbo.json.github/scripts/test-registry/pnpm-workspace-registry-test.yaml— dedicated workspace config for isolated registry test environments (overrides + packageExtensions + allowBuilds, without supply-chain hardening settings that break ephemeral installs)Docs
copilot-instructions.md: extended the supply chain attack reference table with patterns from the TanStack incident (pnpm store cache poisoning, published package protocol injection, OIDC trusted-publisher scope,workflow_runguard, burst-publish detection, forged bot commit identity); expanded the cache and fork-safety checklists; added Dependabot review items; added new code review block items; added pnpm 11 breaking change note