Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions .claude/rules/ruby/smalruby3.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,50 @@ paths:

smalruby3 は scratch-vm の Ruby 実装。smalruby3-editor で生成した Ruby スクリプトをデスクトップでネイティブ実行する。

## RubyGems 公開

- **gem 名**: `smalruby3`(https://rubygems.org/gems/smalruby3)
- **所有者**: Kouji Takao

### バージョニング: YY.MR.DDR

semantic versioning 互換かつリリース日推測可能な形式:

| フィールド | 意味 | 例 |
|-----------|------|-----|
| `YY` (MAJOR) | 年の下2桁 | `26` = 2026 |
| `MR` (MINOR) | 月 × 10 + 月内リリース番号 | `31` = 3月1回目, `32` = 3月2回目 |
| `DDR` (PATCH) | 日 × 10 + 日内リリース番号 | `291` = 29日1回目, `292` = 29日2回目 |

**例**:
- `26.31.291` — 2026年3月29日、月内1回目、日内1回目
- `26.31.292` — 同日2回目
- `26.32.301` — 3月30日、月内2回目(機能追加)
- `26.41.11` — 4月1日、月内1回目

**CRITICAL**: MINOR を上げても月が変わったことを意味しない。月内の機能リリース回数を表す。

### ライセンス

- **smalruby3 本体**: MIT
- **依存ライブラリ**(LICENSE の Third-Party Notices に記載):
- ruby-sdl2: LGPL-3.0(gem 依存、動的リンク)
- resvg: MPL-2.0(Rust crate、smalruby3_imageutil にコンパイル)
- rsdl: Ruby's License(smalruby3_launcher の元コード)

### gem ビルド・公開

```bash
# ビルド
cd ruby/smalruby3
gem build smalruby3.gemspec

# 公開
gem push smalruby3-YY.MR.DDR.gem
```

**注意**: `spec.files` は `Dir[...]` で列挙し、`ext/smalruby3_imageutil/target/` を除外する。

## Tech Stack

- **Ruby**: 3.3+ (`rbenv local 3.3.9` が設定済み)
Expand Down
98 changes: 98 additions & 0 deletions .claude/skills/gem-release/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
---
name: gem-release
description: "Build and release the smalruby3 gem to RubyGems. Handles version bump, gem build, and push."
argument-hint: "[version e.g. 26.31.291]"
---

# /gem-release - smalruby3 gem リリース

smalruby3 gem をビルドして RubyGems に公開する。

## 引数

- `$ARGUMENTS` — リリースバージョン(例: `26.31.291`)

バージョン未指定の場合は `ruby/smalruby3/lib/smalruby3/version.rb` の現在のバージョンを使用する。

## バージョニング: YY.MR.DDR

| フィールド | 意味 | 例 |
|-----------|------|-----|
| YY (MAJOR) | 年の下2桁 | 26 = 2026 |
| MR (MINOR) | 月 × 10 + 月内リリース番号 | 31 = 3月1回目 |
| DDR (PATCH) | 日 × 10 + 日内リリース番号 | 291 = 29日1回目 |

## 手順

### Step 1: バージョン確認・更新

1. `ruby/smalruby3/lib/smalruby3/version.rb` の現在のバージョンを読む
2. 引数でバージョンが指定されている場合:
- `version.rb` を更新する
- YY.MR.DDR 形式であることを検証する
3. 引数がない場合:
- 現在のバージョンをそのまま使用する
- ユーザーに確認: 「バージョン X.XX.XXX でリリースしますか?」

### Step 2: テスト・lint

```bash
docker compose run --rm smalruby3 bash -c "bundle exec standardrb && bundle exec rake test"
```

テストが失敗した場合はリリースを中止する。

### Step 3: gem ビルド

```bash
cd ruby/smalruby3
gem build smalruby3.gemspec
```

ビルド成功を確認し、`gem specification smalruby3-VERSION.gem` で metadata を表示する。

### Step 4: ユーザーに最終確認

以下を表示してユーザーに確認を求める:
- バージョン
- gem ファイル名
- gem に含まれるファイル数
- 依存関係

「`gem push` を実行してよいですか?」と確認する。

### Step 5: gem push

**IMPORTANT**: この手順はユーザーの明示的な承認後のみ実行する。

```bash
cd ruby/smalruby3
gem push smalruby3-VERSION.gem
```

初回は認証情報の入力が必要。ユーザーに `! gem push smalruby3-VERSION.gem` の実行を案内する(インタラクティブ認証が必要なため)。

### Step 6: タグ付け・コミット・プッシュ

1. バージョン更新がある場合はコミット:
```bash
git add ruby/smalruby3/lib/smalruby3/version.rb
git commit -m "release: smalruby3 vVERSION"
```

2. タグを作成:
```bash
git tag smalruby3-vVERSION
```

3. プッシュ:
```bash
git push origin HEAD
git push origin smalruby3-vVERSION
```

### Step 7: 完了報告

- RubyGems の URL: https://rubygems.org/gems/smalruby3/versions/VERSION
- タグ: `smalruby3-vVERSION`
- 次回リリース時のバージョン例を提示
8 changes: 6 additions & 2 deletions .github/workflows/ci-ruby.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,12 @@ jobs:
run: bundle exec standardrb

unit-test:
name: "[smalruby3] Unit Tests"
name: "[smalruby3] Unit Tests (Ruby ${{ matrix.ruby }})"
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
ruby: ['3.3', '3.4', '4.0']
defaults:
run:
working-directory: ruby/smalruby3
Expand All @@ -51,7 +55,7 @@ jobs:
uses: dtolnay/rust-toolchain@stable
- uses: ruby/setup-ruby@v1
with:
ruby-version-file: ruby/smalruby3/.ruby-version
ruby-version: ${{ matrix.ruby }}
bundler-cache: true
working-directory: ruby/smalruby3
- name: Compile native extension
Expand Down
124 changes: 124 additions & 0 deletions .github/workflows/gem-build-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
name: Gem Build Check (cross-platform)

on:
workflow_dispatch:
inputs:
ruby-version:
description: 'Ruby version to test'
required: false
default: '3.4'
type: choice
options:
- '3.3'
- '3.4'
- '4.0'

concurrency:
group: "${{ github.workflow }} @ ${{ github.head_ref || github.ref }}"
cancel-in-progress: true

jobs:
build-linux:
name: "Build gem (Linux / Ruby ${{ inputs.ruby-version || '3.4' }})"
runs-on: ubuntu-latest
defaults:
run:
working-directory: ruby/smalruby3
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5

- name: Install SDL2 development libraries
run: |
sudo apt-get update
sudo apt-get install -y libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ inputs.ruby-version || '3.4' }}
bundler-cache: true
working-directory: ruby/smalruby3

- name: Build gem
run: gem build smalruby3.gemspec

- name: Install gem locally
run: gem install --local smalruby3-*.gem --no-document

- name: Compile native extension
run: bundle exec rake compile

- name: Run tests
run: bundle exec rake test

- name: Verify smalruby3 loads
run: ruby -r smalruby3 -e 'puts "smalruby3 v#{Smalruby3::VERSION} loaded OK"'

- name: Upload gem artifact
uses: actions/upload-artifact@v4
with:
name: smalruby3-gem-linux
path: ruby/smalruby3/smalruby3-*.gem

build-windows:
name: "Build gem (Windows / Ruby ${{ inputs.ruby-version || '3.4' }})"
runs-on: windows-latest
defaults:
run:
working-directory: ruby/smalruby3
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5

- name: Install SDL2 via MSYS2
uses: msys2/setup-msys2@v2
with:
msystem: UCRT64
update: true
install: >-
mingw-w64-ucrt-x86_64-SDL2
mingw-w64-ucrt-x86_64-SDL2_image
mingw-w64-ucrt-x86_64-SDL2_mixer
mingw-w64-ucrt-x86_64-SDL2_ttf

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ inputs.ruby-version || '3.4' }}
bundler-cache: true
working-directory: ruby/smalruby3

- name: Add MSYS2 to PATH
shell: bash
run: echo "C:/msys64/ucrt64/bin" >> "$GITHUB_PATH"

- name: Build gem
run: gem build smalruby3.gemspec

- name: Compile native extension
shell: bash
env:
CPATH: C:/msys64/ucrt64/include
LIBRARY_PATH: C:/msys64/ucrt64/lib
PKG_CONFIG_PATH: C:/msys64/ucrt64/lib/pkgconfig
run: bundle exec rake compile

- name: Run tests
shell: bash
env:
CPATH: C:/msys64/ucrt64/include
LIBRARY_PATH: C:/msys64/ucrt64/lib
PKG_CONFIG_PATH: C:/msys64/ucrt64/lib/pkgconfig
run: bundle exec rake test

- name: Verify smalruby3 loads
run: ruby -r smalruby3 -e "puts \"smalruby3 v#{Smalruby3::VERSION} loaded OK\""

- name: Upload gem artifact
uses: actions/upload-artifact@v4
with:
name: smalruby3-gem-windows
path: ruby/smalruby3/smalruby3-*.gem
98 changes: 98 additions & 0 deletions .github/workflows/release-gem.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
name: Release - smalruby3 gem

on:
push:
tags:
- 'smalruby3-v*'

permissions:
contents: write
id-token: write

jobs:
test:
name: "[smalruby3] Test before release"
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
ruby: ['3.3', '3.4', '4.0']
defaults:
run:
working-directory: ruby/smalruby3
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
- name: Install SDL2 development libraries
run: |
sudo apt-get update
sudo apt-get install -y libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}
bundler-cache: true
working-directory: ruby/smalruby3
- name: Compile native extension
run: bundle exec rake compile
- name: Run lint
if: matrix.ruby == '4.0'
run: bundle exec standardrb
- name: Run unit tests
run: bundle exec rake test

release:
name: "[smalruby3] Publish to RubyGems"
needs: test
runs-on: ubuntu-latest
environment: rubygems
defaults:
run:
working-directory: ruby/smalruby3
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5

- name: Extract version from tag
id: version
run: |
VERSION="${GITHUB_REF_NAME#smalruby3-v}"
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
echo "Releasing smalruby3 v${VERSION}"

- name: Verify version matches
run: |
GEM_VERSION=$(ruby -r ./lib/smalruby3/version -e 'puts Smalruby3::VERSION')
TAG_VERSION="${{ steps.version.outputs.version }}"
if [ "$GEM_VERSION" != "$TAG_VERSION" ]; then
echo "::error::Version mismatch: gem=$GEM_VERSION tag=$TAG_VERSION"
exit 1
fi

- name: Install SDL2 development libraries
run: |
sudo apt-get update
sudo apt-get install -y libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev

- uses: ruby/setup-ruby@v1
with:
ruby-version-file: ruby/smalruby3/.ruby-version
bundler-cache: true
working-directory: ruby/smalruby3

- name: Build gem
run: gem build smalruby3.gemspec

- name: Push to RubyGems (Trusted Publishing)
uses: rubygems/release-gem@v1
with:
working-directory: ruby/smalruby3

- name: Create GitHub Release
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release create "$GITHUB_REF_NAME" \
--repo "$GITHUB_REPOSITORY" \
--title "smalruby3 v${{ steps.version.outputs.version }}" \
--generate-notes \
smalruby3-${{ steps.version.outputs.version }}.gem
Loading
Loading