UNPKG

creevey

Version:

Cross-browser screenshot testing tool for Storybook with fancy UI Runner

320 lines (216 loc) 9.45 kB
# Release Please Migration Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use **superpowers:subagent-driven-development** (recommended) or **superpowers:executing-plans** to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Replace the manual direct-push release workflow with a protected-branch-compatible release-please setup. **Architecture:** Google's release-please-action runs on every push to master, automatically opening/updating a Release PR. Merging the PR creates the tag and GitHub Release via API no direct push to protected branch. The existing `publish.yml` triggers on tags as before. **Tech Stack:** GitHub Actions, release-please-action@v4, Node.js (project already uses Node 20) --- ## Files Changed | File | Action | Purpose | | ------------------------------- | ------- | --------------------------------------------------------- | | `.release-please-manifest.json` | Create | Tracks last released version for release-please | | `release-please-config.json` | Create | Configures release-please packages and changelog sections | | `.github/workflows/release.yml` | Replace | Old manual workflow release-please automatic workflow | | `memories/workflow.md` | Modify | Update documentation to describe new release process | --- ### Task 1: Create `.release-please-manifest.json` **Files:** - Create: `.release-please-manifest.json` - [ ] **Step 1: Write the manifest file** ```json { ".": "0.10.35" } ``` - [ ] **Step 2: Verify the version matches package.json** Run: ```bash node -p "require('./package.json').version" ``` Expected output: `0.10.35` The manifest value MUST match. If it doesn't, update the manifest. - [ ] **Step 3: Commit** ```bash git add .release-please-manifest.json git commit -m "chore(release): add release-please manifest" ``` --- ### Task 2: Create `release-please-config.json` **Files:** - Create: `release-please-config.json` - [ ] **Step 1: Write the config file** ```json { "packages": { ".": { "release-type": "node", "package-name": "creevey", "changelog-sections": [ { "type": "feat", "section": "Features", "hidden": false }, { "type": "fix", "section": "Bug Fixes", "hidden": false }, { "type": "docs", "section": "Documentation", "hidden": false }, { "type": "perf", "section": "Performance Improvements", "hidden": false }, { "type": "refactor", "section": "Code Refactoring", "hidden": false }, { "type": "test", "section": "Tests", "hidden": false }, { "type": "chore", "section": "Miscellaneous", "hidden": true } ], "include-component-in-tag": false } } } ``` - [ ] **Step 2: Validate JSON syntax** Run: ```bash node --check release-please-config.json 2>/dev/null || node -e "JSON.parse(require('fs').readFileSync('release-please-config.json', 'utf8')); console.log('Valid JSON')" ``` Expected output: `Valid JSON` - [ ] **Step 3: Commit** ```bash git add release-please-config.json git commit -m "chore(release): add release-please config" ``` --- ### Task 3: Replace `.github/workflows/release.yml` **Files:** - Modify: `.github/workflows/release.yml` (full replacement) - [ ] **Step 1: Replace the workflow file** Write `.github/workflows/release.yml`: ```yaml name: Release on: push: branches: - master permissions: contents: write pull-requests: write jobs: release-please: runs-on: ubuntu-latest steps: - uses: googleapis/release-please-action@v4 id: release with: token: ${{ secrets.RELEASE_PLEASE_TOKEN }} release-type: node ``` - [ ] **Step 2: Validate YAML syntax** Run: ```bash node -e "require('yaml')" 2>/dev/null && node -e "const yaml = require('yaml'); console.log('YAML module found')" || echo "Install yaml globally: npm install -g yaml" # Alternative validation: python3 -c "import yaml; yaml.safe_load(open('.github/workflows/release.yml')); print('Valid YAML')" ``` Expected output: `Valid YAML` - [x] **Step 3: Verify old git-cliff steps are removed** Run: ```bash grep -E "git-cliff|bump_type|workflow_dispatch|manual" .github/workflows/release.yml || echo "Old patterns not found — good" ``` Expected output: `Old patterns not found good` (the file should have no references to the old workflow) - [ ] **Step 4: Commit** ```bash git add .github/workflows/release.yml git commit -m "chore(release): migrate to release-please workflow" ``` --- ### Task 4: Update `memories/workflow.md` **Files:** - Read first: `memories/workflow.md` - Modify: `memories/workflow.md` (release section) - [ ] **Step 1: Read current memories/workflow.md** Run: ```bash cat memories/workflow.md ``` - [ ] **Step 2: Update the release process documentation** Insert or replace the release process section. If no release section exists, add one near the top or in a "Release Process" section. Add to `memories/workflow.md`: ```markdown ## Release Process The project uses [release-please](https://github.com/googleapis/release-please) for automated releases. ### How it works 1. When a `feat:` or `fix:` commit is pushed to `master`, the release-please workflow (`.github/workflows/release.yml`) automatically creates or updates a Release PR. 2. The Release PR bumps `package.json` version, updates `CHANGELOG.md`, and tracks the version in `.release-please-manifest.json`. 3. A maintainer reviews and merges the Release PR through the normal PR review process. 4. On merge, release-please creates a git tag and GitHub Release via GitHub API. 5. The tag push triggers `.github/workflows/publish.yml` to build and publish to npm. ### Setup - Requires a `RELEASE_PLEASE_TOKEN` repository secret (PAT with `repo` scope, or GitHub App token). - Enable: `Settings Actions General Allow GitHub Actions to create and approve pull requests`. ### Legacy release workflow The previous manual release workflow (using `git-cliff` and `workflow_dispatch`) has been replaced. The `git-cliff` configuration (`cliff.toml`) and related scripts were removed during the cleanup. ``` - [ ] **Step 3: Commit** ```bash git add memories/workflow.md git commit -m "docs: update release process in memories" ``` --- ## Verification Steps After all commits are complete: ### Pre-merge checks - [ ] Verify all three config files exist: ```bash ls -la .release-please-manifest.json release-please-config.json .github/workflows/release.yml ``` Expected: All three files exist. - [ ] Verify the manifest version matches package.json: ```bash jq -r '.["."]' .release-please-manifest.json node -p "require('./package.json').version" ``` Expected: Both output `0.10.35`. - [ ] Lint the YAML workflow: ```bash yamllint .github/workflows/release.yml 2>/dev/null || echo "yamllint not installed, skipping" ``` Or use Python yaml check. ### Post-deployment (after merging to master) - [ ] Push the changes to a new branch and open a PR: ```bash git checkout -b chore/release-please-migration git push origin chore/release-please-migration ``` Then open a PR manually or: ```bash gh pr create --title "chore(release): migrate to release-please" --body "Migrates the release workflow to use Google release-please for protected branch compatibility." ``` - [ ] After the PR merges to `master`, verify: - A Release PR is created automatically (within a few minutes) - The Release PR includes the correct version bump - Merging the Release PR creates a tag `v0.10.36` - The `publish.yml` workflow triggers and publishes successfully --- ## Spec Coverage Checklist | Spec Requirement | Task | | -------------------------------------------------------------------- | ------------------------ | | Create `.release-please-manifest.json` with version 0.10.35 | Task 1 | | Create `release-please-config.json` with node release-type | Task 2 | | Replace `.github/workflows/release.yml` with release-please workflow | Task 3 | | Update project documentation (memories) | Task 4 | | Trigger on push to master (not manual) | Task 3 | | Use `RELEASE_PLEASE_TOKEN` (not `GITHUB_TOKEN`) | Task 3 | | Keep `publish.yml` unchanged | Not modified in any task | | `include-component-in-tag: false` for clean tags | Task 2 | --- ## Placeholder Scan - No "TBD", "TODO", or "implement later" strings in any task. - All file paths are exact. - All commands include expected output. - No steps reference undefined variables. --- ## Rollback Instructions If the migration causes issues after deployment: ```bash # Revert the three commits git revert HEAD~2 # manifest commit git revert HEAD~1 # config commit git revert HEAD # workflow commit # Note: memories commit is last, revert manually if needed ``` Then restore the old `release.yml` from git history: ```bash git show <old-commit>:.github/workflows/release.yml > .github/workflows/release.yml git commit -m "revert: restore old release workflow" ```