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
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.yml${{ github.workspace }}inline in arun:block with$GITHUB_WORKSPACEinapollo-vertex-registry-check.ymltimeout-minutes: 30to the release job inrelease.ymlconcurrency:blocks topr-labeler.ymlandcommit-lint.ymlScripts
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 pathpublish-to-registries.sh:NPM_AUTH_TOKENis now cleared when publishing to GitHub Packages; npm publish tag moved from inline shell interpolation to a validated$TAG_NAMEenv variable.releaserc.jsonfiles updated to pass the tag viaTAG_NAME=prefix instead of inline in the bash commandcheck-licenses.ts: replacedexecSync(shell form) withexecFileSynccreate-dev-comment.tsandupdate-dev-comment-row.ts: added bot-type guard to thejqfilter to prevent comment-plantingSupply chain config
pnpm-workspace.yaml: addedminimumReleaseAgeStrict: falseto work around a pnpm 11.0.4 regression where packages with missing registrytimemetadata fail with a hard error instead of a warning; added@next/swc-*platform binary entries alongside the existingnextexemptionpackage.json: pinnedsemantic-release-monorepoto an exact versionCODEOWNERS: added explicit entry forturbo.jsonDocs
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 for bot verification and maintainer-change signals; added new code review block itemsNotes on pnpm 10 → 11 and
minimumReleaseAgeDuring this work we discovered that
minimumReleaseAgebehaves significantly differently in pnpm 11 compared to pnpm 10.pnpm 10:
pnpm add pkg@latestwherelatestis too new was blocked and fell back to the last mature version. The quarantine applied to all resolution paths.pnpm 11: The maintainer explicitly made exact versions and dist-tags (
@latest,@1.2.3) an intentional escape hatch — they bypassminimumReleaseAgeentirely. Only automatic range resolution (pnpm update,pnpm add pkgwith no version) is still gated. Relevant issues:ERR_PNPM_MISSING_TIMEhard error introduced in 11.0.4 for packages with missing registry metadata (open); mitigated here withminimumReleaseAgeStrict: falseWe verified that
pnpm add pkg(no version) still correctly falls back — tested withzod@4.4.3(9 days old at time of writing), which resolved to4.3.5instead. So the quarantine still provides passive protection against accidentalpnpm updatepulls.We stayed on pnpm 11.1.1 rather than downgrading to 11.0.3 because the intermediate releases include
pnpm audit signatures(11.1.0), git dep integrity pinning in lockfiles (11.0.7), and an OIDC token priority fix (11.0.7) — all directly relevant to supply chain security. The real gate for explicit version installs remains CODEOWNERS onpnpm-lock.yamland lockfile review.