diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000000..6ae2762c40 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,10 @@ +{ + "permissions": { + "allow": [ + "Bash(gh repo view:*)", + "Bash(gh release list:*)", + "Bash(gh pr list:*)", + "Bash(gh api repos/*/releases/*)" + ] + } +} diff --git a/.claude/skills/release-check/SKILL.md b/.claude/skills/release-check/SKILL.md new file mode 100644 index 0000000000..06d6282939 --- /dev/null +++ b/.claude/skills/release-check/SKILL.md @@ -0,0 +1,94 @@ +--- +name: release-check +description: Audit PRs since a release tag, verify labels, and recommend a version bump +--- + +# Release Check + +Audit PRs merged since a given version tag, verify labels, and recommend a version bump. + +## Steps + +### 1. Determine repo and latest release tag + +Detect the repo and latest release tag automatically. If the user provides a specific tag or compare URL, use that instead. + +```bash +# Get repo from git remote (e.g. "ruby/rdoc") +gh repo view --json nameWithOwner --jq '.nameWithOwner' + +# Get latest release tag +gh release list --limit 1 --json tagName --jq '.[0].tagName' + +# Get the release date +gh api repos/{repo}/releases/tags/{tag} --jq '.published_at' +``` + +If the user provides a specific tag or compare URL, use that instead. + +### 2. Fetch PRs merged since the tag + +```bash +gh pr list --repo {repo} --state merged --base master \ + --search "merged:>={release_date}" \ + --json number,title,body,labels,mergedAt,url --limit 100 +``` + +Filter out the version-bump commit for the tag itself (e.g., "Bump version to v7.1.0"). + +### 3. Identify release-relevant labels + +Read `.github/release.yml` to find which labels map to changelog categories (currently `bug`, `enhancement`, `documentation`). PRs outside these categories appear under "Other Changes" and do not need labels. + +### 4. Report: PRs missing release-relevant labels + +List PRs that look like they **should** have a release-relevant label but don't. Use the PR title and description to judge: + +- Titles starting with "Fix" or describing a fix → likely needs `bug` +- Titles describing new features or capabilities → likely needs `enhancement` +- Titles about docs → likely needs `documentation` + +PRs that are clearly CI, dependency bumps, refactors, or test-only changes do **not** need these labels. + +**Format each PR as a clickable URL** (not just a number), followed by its title and current labels: + +``` +### PRs that may need labels + +- https://github.com/ruby/rdoc/pull/1547 — Expand GitHub style references in ChangeLog to URL + Suggested: `enhancement` + +### PRs without release-relevant labels (OK) + +- https://github.com/ruby/rdoc/pull/1577 — Fix a test that uses invalid syntax +- https://github.com/ruby/rdoc/pull/1586 — Removed truffleruby from CI +``` + +### 5. Full PR list grouped by label + +Show all PRs grouped by their release-relevant label, with URLs: + +``` +### Enhancements +- https://github.com/ruby/rdoc/pull/1544 — Highlight bash commands + +### Bug Fixes +- https://github.com/ruby/rdoc/pull/1559 — Replace attribute_manager with new parser +... + +### Documentation +... + +### Other Changes +- (dependency bumps, CI, refactors, test fixes) +``` + +### 6. Version bump recommendation + +Apply semver reasoning: + +- **Major** — breaking changes to public API or behavior users depend on +- **Minor** — new features, significant internal rewrites that change behavior, enhancements +- **Patch** — only bug fixes, documentation, and maintenance + +Explain the reasoning, highlighting the most impactful changes by URL. diff --git a/.github/workflows/cloudflare-preview.yml b/.github/workflows/cloudflare-preview.yml index 3d3ad26d72..a44cf2b3ee 100644 --- a/.github/workflows/cloudflare-preview.yml +++ b/.github/workflows/cloudflare-preview.yml @@ -19,7 +19,7 @@ jobs: ref: ${{ github.event.client_payload.pr_head_sha }} - name: Setup Ruby - uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c # v1.287.0 + uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0 with: ruby-version: '3.4' bundler-cache: true diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 8c7d4271f7..543334d054 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -22,7 +22,7 @@ jobs: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Setup Ruby - uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c # v1.287.0 + uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0 with: ruby-version: '3.2' bundler-cache: true diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index fc05ba5b9f..eb008f86f5 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -21,7 +21,7 @@ jobs: - if: ${{ matrix.os == 'ubuntu-latest' }} run: sudo apt install libyaml-dev - name: Set up Ruby - uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c # v1.287.0 + uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0 with: ruby-version: 3.3 bundler-cache: true diff --git a/.github/workflows/push_gem.yml b/.github/workflows/push_gem.yml index 6a80256cb0..08c0cb6f36 100644 --- a/.github/workflows/push_gem.yml +++ b/.github/workflows/push_gem.yml @@ -23,14 +23,14 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up Ruby - uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c # v1.287.0 + uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0 with: bundler-cache: true ruby-version: ruby diff --git a/.github/workflows/ruby-core.yml b/.github/workflows/ruby-core.yml index 6afc27d9b8..7bacb4452c 100644 --- a/.github/workflows/ruby-core.yml +++ b/.github/workflows/ruby-core.yml @@ -22,7 +22,7 @@ jobs: timeout-minutes: 30 steps: - name: Set up latest ruby head - uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c # v1.287.0 + uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0 with: ruby-version: head bundler: none diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7d3c22c638..347ac54eff 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -43,7 +43,7 @@ jobs: - if: ${{ matrix.os == 'ubuntu-latest' }} run: sudo apt install libyaml-dev - name: Set up Ruby - uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c # v1.287.0 + uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0 with: ruby-version: ${{ matrix.ruby }} bundler-cache: true # 'bundle install' and cache diff --git a/lib/rdoc/generator/template/aliki/class.rhtml b/lib/rdoc/generator/template/aliki/class.rhtml index 7c571bc88b..39c303279a 100644 --- a/lib/rdoc/generator/template/aliki/class.rhtml +++ b/lib/rdoc/generator/template/aliki/class.rhtml @@ -40,10 +40,10 @@ <%- klass.each_section do |section, constants, attributes| %> -