Repository navigation
ci: single CI gate and contribution docs - #474
Conversation
Remove the changesets versioning workflow (changesets/action without a publish input, which only added a Release check to every commit on main), the generated .changeset/README.md and the root CHANGELOG.md stub. changeset publish stays the publish command. Refs #465 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The builder stage of the docs image copies the whole build context. Send only what the build needs (allow list: workspaces, build scripts, root manifests), so that local .env* files and other local files never reach the image, and drop dependencies and build output within. Closes #463 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pin every action to a full commit SHA on its current major version (checkout v7, setup-node v7, cache v6, semantic PR title v6, ssh-agent v0.10, push action v1.3.0 instead of master), with Dependabot keeping the pins up to date. Replace the node_modules caches, whose key hashed a file that doesn't exist and which used ::set-output, by the npm cache of setup-node in CI; releases use no dependency cache. Drop the force-with-lease input of the push action, which doesn't exist (the input is force_with_lease) and so never had an effect. Refs #465 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Give Dependabot pull requests a ci: prefix, so that their titles pass the PR title check. Keep the commented-out release tests job as it was and state the release cache comment once. Refs #465 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ubuntu-latest now is Ubuntu 26.04, on which Playwright 1.56 can't install its browsers, so every test job fails (unrelated to the other changes). Pin the test job to ubuntu-24.04 until Playwright is upgraded. Refs #465 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Node.js 18 and 20 are end of life. Test on 22 and 24, lint and release on 24 (npm 11, needed for trusted publishing), build the docs image on node:24-alpine and update the development prerequisites in the README. engines and packageManager stay as they are. Closes #466 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rename publish.yml to release.yml (Release), as in the organization's other repositories, with job names Lint release, Bump version, Publish packages. The publish job gets id-token: write (and only it), checks for npm 11.5.1 or later and publishes through OIDC with provenance. NPM_TOKEN stays as a fallback: npm tries OIDC first and uses the token only if the exchange fails; remove it after the first OIDC release. A new job creates a GitHub release with generated notes from the previous version tag, as a prerelease for versions with a suffix. Closes #467 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Order version tags by semver when looking up the previous tag for the release notes (sort -V puts v2.0.0 before v2.0.0-alpha.1). Configure the NPM_TOKEN fallback only right before publishing, say in the log when it is configured, and warn about released versions without provenance (published with the token). Name the jobs Release packages and Release on GitHub. Refs #467 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rename pr_evaluation.yml to ci.yml (CI), as in the organization's other repositories, with the jobs Conflict markers, Lint, Test (Node 22), Test (Node 24) and the gate CI passed, which fails unless all of them passed; branch rules need to require only the gate. CI also runs on pushes to main. The PR title check moves to pr-title.yml (PR title), so that title or description edits no longer create CI runs with all jobs skipped. Read-only token, no persisted credentials, timeouts, and superseded pull request runs are cancelled. Refs #468 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add CONTRIBUTING.md, which the PR template and the README link: the pull request flow (branch off main, Conventional Commit titles, squash merge, checks, reviews, no changesets, AI-assisted pull requests) and the release flow (lockstep versions, tag on main, Release workflow with trusted publishing and GitHub releases, frozen packages). Point the README to it instead of the org guide's old URL, which is gone. Refs #468 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Request reviews from the maintainer automatically. Closes #468 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Use the issue keyword of the PR template, mention direct pushes by maintainers, drop the documentation preview (none is posted by this repository), say what frozen packages means and that an npm token remains as a fallback for now. Install dependencies with npm ci in the Lint job, as in the other jobs. Refs #468 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Reviewer's GuideThis PR replaces the prior PR-evaluation setup with a single, security-conscious CI workflow and explicit Sequence diagram for pull request validationsequenceDiagram
actor Contributor
participant GitHub
participant CI
participant PRTitle as PR title
participant Gate as CI passed
Contributor->>GitHub: Open or update pull request
GitHub->>PRTitle: Run title check
PRTitle-->>GitHub: Report PR title result
GitHub->>CI: Run CI workflow
CI->>CI: Run Conflict markers
CI->>CI: Run Lint
CI->>CI: Run Test Node 22 and 24
CI->>Gate: Check all job results
Gate-->>GitHub: Report CI passed result
Sequence diagram for tag-driven releasesequenceDiagram
actor Maintainer
participant GitHub
participant Release
participant Main
participant NPM
Maintainer->>GitHub: Push version tag on main
GitHub->>Release: Start Release workflow
Release->>Release: Run lint
Release->>Main: Commit and push version bump
Release->>NPM: Publish packages with OIDC trusted publishing
NPM-->>Release: Return publication and provenance status
Release->>GitHub: Create GitHub release
File-Level Changes
Assessment against linked issues
Possibly linked issues
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
Hey - I've found 2 issues
Prompt for AI Agents
Please address the comments from this code review:
## Individual Comments
### Comment 1
<location path=".github/workflows/ci.yml" line_range="35" />
<code_context>
+ with:
+ persist-credentials: false
+ - name: List files with merge conflict markers
+ run: git --no-pager grep "<<<<<<<" ":(exclude).github/" || true
+ - name: Fail or succeed job if any files with merge conflict markers have been checked in
+ # Find lines containing "<<<<<<<", then count the number of lines.
</code_context>
<issue_to_address>
**Conflict markers pass CI**
When a conflict marker is checked into a `.github/` file, or the number of matching lines outside `.github/` is a positive multiple of 256, `git grep` excludes `.github/`, and `exit $(... | wc --lines)` truncates a positive multiple of 256 to status 0. The conflict job succeeds and CI reports green despite checked-in conflict markers.
Scan files under `.github/` too, and make the job fail whenever the match count is nonzero without using that count as an exit status.
Also at `.github/workflows/ci.yml:39`.
</issue_to_address>
### Comment 2
<location path=".github/dependabot.yml" line_range="9" />
<code_context>
+ directory: /
+ # Pull request titles must be Conventional Commits (PR title check)
+ commit-message:
+ prefix: ci
+ schedule:
+ interval: monthly
</code_context>
<issue_to_address>
**Dependabot PRs fail title checks**
When dependabot opens an update pull request with its generated `Bump ...` subject, or a grouped Actions-update subject exceeds 50 characters, the `ci` prefix leaves the generated subject starting with uppercase `Bump`, which the required PR-title check rejects; grouped Actions-update subjects can also exceed its 50-character limit. Dependabot update PRs cannot pass the required check without manual title edits.
Configure Dependabot-generated titles or the PR-title check so those titles satisfy the required format and length.
Also at `.github/workflows/pr-title.yml:44`.
</issue_to_address>Sourcery assessment
Needs a human reviewer. 2 findings to address first, and if the changed release workflow builds or selects the wrong package contents, it can publish them to npm under a version that cannot be published again; reverting the workflow would not retract that release from users or downstream consumers. The CI and documentation changes are otherwise reversible.
Blocking findings: .github/workflows/ci.yml:35, .github/dependabot.yml:9
Fail the conflict marker check on any match instead of using the match count as exit status (a multiple of 256 passed). Skip the PR title check for Dependabot, whose titles can't be configured to fit the lowercase and 50-character rules; a skipped job passes branch rules. Refs #468 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add scripts/release.js, which sets and checks the shared version of the root and of all public packages in packages/*, prints their dist-tag and pins their internal dependencies for publishing (with tests). @elixir-cloud/tes is deprecated (no build, so a release would have no code): mark it private, so that it is no longer released. Give @elixir-cloud/eslint-config a repository URL for provenance. Drop the unused `release` script (changeset publish). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rework release.yml for the branch model of the other repositories: the version bump is a pull request to `dev`, a maintainer tags `v<version>` on `dev`, and the workflow builds from the tag and pushes nothing (no bump job, no deploy key). It checks that all package versions match the tag and that the tag is on the default branch before anything else. The publish job runs in the `npm` environment and stages each public package with `npm stage publish --provenance --tag <dist-tag>` (trusted publishing; npm 11.15.0 or later); maintainers approve the staged versions on npmjs.com. The NPM_TOKEN fallback and the provenance check are gone. Outside the main repository, staging is a dry run. PR Evaluation now runs on pull requests to `dev`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`dev` is the default branch now and `main` points at the latest release: run CI on pushes and pull requests to `dev`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Releases set versions in a version bump pull request and no longer use changesets: remove .changeset/ (its config still named `main` and an outdated package list) and @changesets/cli. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From the review: check out the tagged commit (github.sha) in all jobs, check the tag against `dev`, fail if the package list is empty or an npm lookup fails for another reason than "not found", and warn in the summary not to approve versions while others failed to stage. Test the command line of scripts/release.js and clean up test fixtures. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keep Node.js 24 (and 22/24 in the test matrix) in the conflicting setup-node steps, and run PR Evaluation on pull requests to `dev`, the default branch now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From the second review: `npm view` doesn't see staged versions, so a re-run tried to stage them again and failed on the conflict (E409) forever. Count those as staged (the same commit, as tags are immutable), keep stdin away from npm in the loop, and say in the header that tags must be on `dev`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Run node --test scripts/release.test.js in the lint job. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`dev` is the development branch and `main` the latest release. Releases go: version bump pull request (scripts/release.js set), signed tag on `dev`, approval of the `npm` environment, approval of the staged versions on npm, fast-forward of `main`. Also describe the dist-tags and how to recover from failed staging. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Decided by the maintainer: as before, the 2.0.0 alphas go to `latest`. Prereleases of a major version without a release yet (no tag v<major>.x.y without suffix) get `latest`; once the major is released, prereleases get their identifier (`rc` for 2.1.0-rc.1). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From the review: without any release tag (e.g. a clone without tags), every prerelease would get `latest`. Fail instead, also in the workflow (the dist-tag is no longer computed inside `echo`), wrap git errors, and tidy the tests and comments. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Summary
Last of the stacked pull requests for #464. Stacked on #473 (on #470): merge those first; until then this diff also shows their commits.
ci.yml/CI(renamed frompr_evaluation.yml/PR Evaluation), with the organization's job names:Conflict markers,Lint,Test (Node 22),Test (Node 24)and the gateCI passed, which fails unless all other jobs passed. Runs on pull requests and on pushes todev, the default branch. Read-only token, no persisted credentials, timeouts, superseded PR runs cancelled,fail-fast: falsefor the test matrix.Lintalso runs the tests ofscripts/release.js(ci: npm trusted publishing and GitHub releases #473).pr-title.yml/PR title: the Conventional Commit title check (same rules), in its own workflow, so that editing a title or description reruns only this check. Runs on pull requests todev.Changesets removed (
.changeset/,@changesets/cli): its config still namedmainand an outdated package list; releases set versions in a version bump pull request now.CONTRIBUTING.md: what's specific to this repository (PR flow againstdev,main= latest release, title rules, checks, reviews, AI-assisted PRs) and the release steps in order:dev(node scripts/release.js set <version>);v<version>ondev;npmenvironment of theReleaserun;latestfor releases and for the 2.0.0 alphas (prereleases of a major without a release yet), the prerelease identifier after that;mainto the tag.Plus what to do when a release fails (no re-tagging; re-run after partial staging; reject staged versions). General rules link to the org guide. The PR template's link now resolves; the README's contributing link (old org guide URL, 404) points to it.
.github/CODEOWNERS:* @anuragxxd.Closes #468
Verification
actionlint1.7.12 andzizmor1.31.1 (offline): no findings for all workflows.node --test scripts/release.test.js: 8 tests pass.npm run lintpasses locally (on ci: npm trusted publishing and GitHub releases #473's tree).dev, which now has build: move CI and Docker to Node.js 22 and 24 #470 and test: drop test scripts of packages without tests #478; head 92cd777):Conflict markers,Lint(with the release script tests),Test (Node 22),Test (Node 24),CI passedandPR titlepass. The RTD check fails here because.readthedocs.yamlcomes with docs: host the docs on Read the Docs #476.dev, changesets removal, CI test step, release docs) are CI, dependency removal and docs: light lane, reviewed by hand; the release workflow they document was fully reviewed in ci: npm trusted publishing and GitHub releases #473.Declined review findings
editedevent): otherwise a push or close/reopen triggers CI. Listening toeditedwould rerun CI on every description edit, which this PR removes.CONTRIBUTING.mdwas questioned as a new policy: it is part of the agreed contribution flow.Maintainer steps (after merge)
CI passedandPR title(source: GitHub Actions) as required status checks to thedevruleset, once both have reported on a PR.🤖 Generated with Claude Code
Summary by Sourcery
Streamline contribution and release management around a unified CI gate, dedicated title validation, and documented repository workflows.
New Features:
Bug Fixes:
Enhancements:
CI:
Documentation: