claw-release について
claw-releaseは、ClawSecカタログを管理する内部メンテナー向けのスキルリリースツールです。スクリプトでバージョンを更新してGitタグを作成し、GitHub Releasesで公開する手順と成果物の検証方法を扱います。
主な機能
- 01スキルのリリース手順を実行
- 02パッケージと説明ファイルの版を更新
- 03Gitタグの作成とプッシュ
- 04署名済みマニフェストと成果物の検証
活用シーン
- 01スキルの修正・機能版の公開
- 02プレリリース版の準備
- 03GitHub Releaseの状態確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ prompt-security/ clawsec --skill claw-releaseインストール後、Claude Code で/claw-releaseを入力して読み込まれたか確認します。
詳細
Claw Release
スキルのリリースと ClawSec カタログの管理を行う内部ツールです。
Prompt Security の内部ツール
Vercel Skills のインストール
このハーネスには、Vercel Skills CLI を使ってインストールします。
npx skills add prompt-security/clawsec --skill claw-release -a openclaw -y
運用上の注意
- 内部のメンテナー向けワークフローのみを対象としています。
- 必要なランタイム:
bash、git、jq、gh - 必要な認証情報:リリースを作成する権限を持つ、認証済みの GitHub CLI
- 副作用:コミット、タグの作成、リモートへのプッシュ、GitHub Releases への公開を行います。
- 信頼モデル:信頼できるチェックアウトからのみ、作業ツリーがクリーンで、メンテナーの承認を得ている場合に実行してください。
リリース成果物の検証
スタンドアロンでインストールする場合は、SKILL.md、skill.json、またはアーカイブを信頼する前に、署名済みリリースマニフェストを検証してください。skill.json ファイルはパッケージのメタデータ/SBOM のソースであり、リリースパイプラインは ClawSec リリースキーを使って checksums.json に署名します。
set -euo pipefail
SKILL_NAME="claw-release"
VERSION="0.0.4"
REPO="prompt-security/clawsec"
TAG="${SKILL_NAME}-v${VERSION}"
BASE="https://github.com/${REPO}/releases/download/${TAG}"
ZIP_NAME="${SKILL_NAME}-v${VERSION}.zip"
TMP_DIR="$(mktemp -d)"
trap 'rm -rf "$TMP_DIR"' EXIT
RELEASE_PUBKEY_SHA256="711424e4535f84093fefb024cd1ca4ec87439e53907b305b79a631d5befba9c8"
curl -fsSL "$BASE/checksums.json" -o "$TMP_DIR/checksums.json"
curl -fsSL "$BASE/checksums.sig" -o "$TMP_DIR/checksums.sig"
curl -fsSL "$BASE/signing-public.pem" -o "$TMP_DIR/signing-public.pem"
curl -fsSL "$BASE/$ZIP_NAME" -o "$TMP_DIR/$ZIP_NAME"
curl -fsSL "$BASE/SKILL.md" -o "$TMP_DIR/SKILL.md"
curl -fsSL "$BASE/skill.json" -o "$TMP_DIR/skill.json"
ACTUAL_PUBKEY_SHA256="$(openssl pkey -pubin -in "$TMP_DIR/signing-public.pem" -outform DER | shasum -a 256 | awk '{print $1}')"
if [ "$ACTUAL_PUBKEY_SHA256" != "$RELEASE_PUBKEY_SHA256" ]; then
echo "ERROR: signing-public.pem fingerprint mismatch" >&2
exit 1
fi
openssl base64 -d -A -in "$TMP_DIR/checksums.sig" -out "$TMP_DIR/checksums.sig.bin"
openssl pkeyutl -verify -rawin -pubin \
-inkey "$TMP_DIR/signing-public.pem" \
-sigfile "$TMP_DIR/checksums.sig.bin" \
-in "$TMP_DIR/checksums.json" >/dev/null
hash_file() {
if command -v shasum >/dev/null 2>&1; then
shasum -a 256 "$1" | awk '{print $1}'
else
sha256sum "$1" | awk '{print $1}'
fi
}
verify_manifest_file() {
asset="$1"
path="$2"
expected="$(jq -r --arg asset "$asset" '.files[$asset].sha256 // empty' "$TMP_DIR/checksums.json")"
if [ -z "$expected" ]; then
echo "ERROR: checksums.json missing $asset" >&2
exit 1
fi
actual="$(hash_file "$path")"
if [ "$actual" != "$expected" ]; then
echo "ERROR: checksum mismatch for $asset" >&2
exit 1
fi
}
expected_archive="$(jq -r '.archive.sha256 // empty' "$TMP_DIR/checksums.json")"
if [ -z "$expected_archive" ]; then
echo "ERROR: checksums.json missing archive.sha256" >&2
exit 1
fi
actual_archive="$(hash_file "$TMP_DIR/$ZIP_NAME")"
if [ "$actual_archive" != "$expected_archive" ]; then
echo "ERROR: archive checksum mismatch" >&2
exit 1
fi
verify_manifest_file "SKILL.md" "$TMP_DIR/SKILL.md"
verify_manifest_file "skill.json" "$TMP_DIR/skill.json"
echo "Signed release manifest, archive, SKILL.md, and skill.json verified."
この検証が成功した場合にのみ、アーカイブをインストールまたは展開してください。
クイックリファレンス
| リリースタイプ | コマンド | タグ形式 |
|---|---|---|
| スキルのリリース | ./scripts/release-skill.sh <name> <version> | <name>-v<version> |
| プレリリース | ./scripts/release-skill.sh <name> 1.0.0-beta1 | <name>-v1.0.0-beta1 |
リリースワークフロー
ステップ 1:バージョンの種類を決める
変更内容を確認します。
- バグ修正のみ → パッチ(1.0.0 → 1.0.1)
- 新機能、後方互換性あり → マイナー(1.0.0 → 1.1.0)
- 破壊的変更 → メジャー(1.0.0 → 2.0.0)
- テスト中/不安定 → プレリリース(1.0.0-beta1、1.0.0-rc1)
ステップ 2:リリース前の確認
# Check for uncommitted changes
git status
# Verify skill directory exists
ls skills/<skill-name>/skill.json
# Get current version
jq -r '.version' skills/<skill-name>/skill.json
ステップ 3:リリーススクリプトを実行
./scripts/release-skill.sh <skill-name> <new-version>
スクリプトは以下を行います。
- バージョン形式を検証します(semver)。
- タグがすでに存在しないことを確認します。
- skill.json のバージョンを更新します。
- SKILL.md のフロントマターのバージョンを更新します(ファイルが存在する場合)。
- ハードコードされたバージョン URL(feed_url)を更新します。
- 変更をコミットします。
- 注釈付き git タグを作成します。
ステップ 4:リリースをプッシュ
git push && git push origin <skill-name>-v<version>
ステップ 5:リリースを検証
プッシュ後、CI/CD パイプラインは以下を行います。
- スキルが存在することを検証します。
- バージョンが skill.json と一致することを確認します。
- バージョンが SKILL.md のフロントマターと一致することを確認します(存在する場合)。
- SBOM からチェックサムを生成します。
- .skill パッケージ(ZIP)を作成します。
- GitHub Release を作成します。
- ウェブサイトの再ビルドを開始します(内部向けではないスキルの場合)。
以下で確認してください。
- GitHub Releases:
https://github.com/prompt-security/clawsec/releases/tag/<skill-name>-v<version> - GitHub Actions: ワークフローの実行ステータスを確認します。
リリースを取り消す(プッシュ前)
プッシュ前に取り消す必要がある場合:
git tag -d <skill-name>-v<version>
git reset --soft HEAD~1
git reset --soft はリリースの変更を作業ツリーに保持するため、データを破棄せずに確認したり、修正したりできます。
プレリリースバージョン
ベータ版、アルファ版、またはリリース候補版の場合:
./scripts/release-skill.sh <skill-name> 1.2.0-beta1
./scripts/release-skill.sh <skill-name> 1.2.0-alpha1
./scripts/release-skill.sh <skill-name> 1.2.0-rc1
プレリリースは GitHub Releases で自動的にプレリリースとしてマークされます。
よくある問題
| エラー | 解決策 |
|---|---|
Tag already exists | 別のバージョン番号を選んでください。 |
Version mismatch in CI | 手動でタグを付けず、リリーススクリプトを使用したことを確認してください。 |
SKILL.md version mismatch | skill.json と SKILL.md の両方を更新するリリーススクリプトを使用したことを確認してください。 |
Uncommitted changes | 先にコミットまたはスタッシュしてください:git stash または git add . && git commit |
skill.json not found | スキルのディレクトリパスが正しいことを確認してください。 |
内部スキル
openclaw セクションに "internal": true が設定されたスキルは、以下のとおりです。
- 通常どおり GitHub Releases からリリースされます。
- 公開スキルカタログのウェブサイトには表示されません。
- リリース URL から直接ダウンロードできます。
このスキル(claw-release)は内部スキルです。
既存のスキル
| スキル | カテゴリ | 内部 |
|---|---|---|
| clawsec-feed | セキュリティ | いいえ |
| clawtributor | セキュリティ | いいえ |
| openclaw-audit-watchdog | セキュリティ | いいえ |
| soul-guardian | セキュリティ | いいえ |
| claw-release | ユーティリティ | はい |
検証チェックリスト
リリース後、以下を確認してください。
- GitHub リリースが正しいタグで作成されている
- リリースに次のものが含まれている:skill.json、SKILL.md、checksums.json、.skill パッケージ
- 該当する場合、リリースがプレリリースとしてマークされている
- GitHub Actions のワークフローが正常に完了している
- ウェブサイトが更新されている(内部向けスキルを除く)
ライセンス
GNU AGPL v3.0 or later - 詳細はリポジトリをご覧ください。
Prompt Security チームによって構築されました。