release-code について
release-codeは、研究コードのリポジトリを一般公開する準備を支援するスキルです。セキュリティとリポジトリの監査、不足ファイルの作成、バージョンタグ付け、任意のGitHub Release公開を、確認手順を設けて進めます。
主な機能
- 01シークレットと機密ファイルの検査
- 02リポジトリ構成とツールチェーンの確認
- 03不足するREADME・ライセンス・引用ファイルの作成
- 04公開前チェックリストの確認
- 05バージョンタグ付けと任意のGitHub Release公開
活用シーン
- 01公開前の研究リポジトリ監査
- 02不足している公開文書とメタデータの追加
- 03匿名の学会投稿用コードパッケージの準備
- 04確認後のバージョンタグとGitHub Release作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ a-green-hand-jack/ ml-research-skills --skill release-codeインストール後、Claude Code で/release-codeを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
checklist.mdtemplates/CITATION.cffREADME_ml_paper.md詳細
コードをリリースする
研究用コードリポジトリを一般公開できるように準備します。セキュリティ上の問題を監査し、不足しているアセット(README、引用情報、ライセンス)を生成して、バージョンにタグを付け、GitHub リリースを作成します。
リリースでは、プロジェクトのツールチェーンのチェックを証拠として扱い、飾りとして扱わないでください。まず、変更を加えないチェックを優先します。変更を加えるフォーマットや修正のコマンドは、依頼された場合、またはプロジェクトのポリシーで必須の場合にのみ実行し、その後、差分を確認してください。
スキルのディレクトリ構成
<installed-skill-dir>/
├── SKILL.md
├── checklist.md # Detailed item-by-item checklist reference
└── templates/
├── README_ml_paper.md # README template for ML paper repos
└── CITATION.cff # Citation file template
実行手順
1. リリースの状況を把握する
ユーザーに1回のメッセージで次の情報を尋ねてください。
- 論文の情報:タイトル、著者、会議名/掲載年(例:「CVPR 2025」)、arXiv ID または URL(あれば)
- リリースの種類:コード一式のリリース/最小限の再現パッケージ/匿名の会議投稿?
- ライセンス:MIT/Apache-2.0/CC-BY-4.0/その他(デフォルト:コードには MIT、モデル/データには CC-BY-4.0)
- 含めるもの:学習コード?評価?事前学習済みの重み?データセット?デモ?
- バージョンタグ:例:
v1.0.0(初回リリースのデフォルト:v1.0.0) - GitHub リリース?:リリースノート付きで GitHub リリースを作成しますか?(はい/いいえ)
- モデルの重み:事前学習済みの重みはありますか?ある場合、どこでホストしますか?(HuggingFace Hub/Google Drive/プロジェクトページ)
2. リポジトリを監査する
次のチェックを実行します(出力を読み、ユーザーには要約を報告します)。
2a. セキュリティスキャン — シークレットと認証情報
# Check for common secret patterns
git -C "$(git rev-parse --show-toplevel)" log --all --oneline | head -5
grep -rI --include="*.py" --include="*.yaml" --include="*.json" --include="*.env" \
-E "(password|secret|api_key|token|credential|private_key)\s*=\s*['\"][^'\"]{6}" \
"$(git rev-parse --show-toplevel)" 2>/dev/null | head -20
# Prefer dedicated scanners when available
command -v gitleaks >/dev/null && gitleaks dir --no-banner --redact "$(git rev-parse --show-toplevel)"
command -v detect-secrets >/dev/null && detect-secrets scan "$(git rev-parse --show-toplevel)"
2b. 大容量ファイルのチェック
# Find large files that shouldn't be in the repo
find "$(git rev-parse --show-toplevel)" -type f -size +50M \
! -path "*/.git/*" ! -path "*/outputs/*" ! -path "*/wandb/*" 2>/dev/null
2c. 機密ファイルのパターン
# Check for files that should not be public
find "$(git rev-parse --show-toplevel)" -type f \( \
-name ".env" -o -name "*.pem" -o -name "*.key" -o \
-name "secrets.yaml" -o -name "credentials.json" \
\) ! -path "*/.git/*" 2>/dev/null
2d. 既存ファイルの確認
ROOT="$(git rev-parse --show-toplevel)"
for f in README.md LICENSE CITATION.cff .gitignore requirements.txt pyproject.toml setup.py; do
[ -f "$ROOT/$f" ] && echo "EXISTS: $f" || echo "MISSING: $f"
done
2e. Git の状態
git -C "$(git rev-parse --show-toplevel)" status --short
git -C "$(git rev-parse --show-toplevel)" log --oneline -5
2f. ツールチェーンとソースコードの衛生チェック
利用可能な、変更を加えないチェックを実行し、スキップしたツールを明示します。
ROOT="$(git rev-parse --show-toplevel)"
command -v pre-commit >/dev/null && pre-commit run --all-files || true
command -v shellcheck >/dev/null && find "$ROOT" -name "*.sh" -not -path "*/.git/*" -print0 | xargs -0 shellcheck || true
command -v shfmt >/dev/null && shfmt -d "$ROOT" || true
command -v actionlint >/dev/null && actionlint "$ROOT/.github/workflows"/*.yml "$ROOT/.github/workflows"/*.yaml 2>/dev/null || true
command -v nbstripout >/dev/null && find "$ROOT" -name "*.ipynb" -not -path "*/.git/*" -print0 | xargs -0 nbstripout --dry-run || true
command -v lychee >/dev/null && lychee --no-progress "$ROOT/README.md" "$ROOT/docs/**/*.md" || true
command -v taplo >/dev/null && find "$ROOT" -name "*.toml" -not -path "*/.git/*" -print0 | xargs -0 taplo fmt --check || true
command -v yamllint >/dev/null && yamllint "$ROOT" || true
必須チェックの失敗はリリースを妨げるものとして扱います。プロジェクトのポリシーで必須とされていない場合、不足している任意のツールはスキップとして扱います。
監査結果をチェックリストとしてユーザーに報告します。
- 🔴 ブロッカー — リリース前に必ず修正(シークレット、認証情報、大容量のバイナリが見つかった場合)
- 🟡 警告 — 対応を推奨(README がない、ライセンスがない、.gitignore がない、任意の衛生チェックをスキップした場合)
- 🟢 OK — 問題なし
ブロッカーがあれば、続行する前に修正するようユーザーに依頼してください。
3. 不足しているファイルを生成する
2d の監査結果に基づき、不足しているファイルを生成します。既存ファイルを上書きする前に、ユーザーに希望を確認してください。
LICENSE
ファイルがない場合、適切なライセンスファイルを生成します。
- MIT(ML コードで最も一般的):
MIT License Copyright (c) {YEAR} {AUTHORS} [standard MIT text] - Apache-2.0:標準の Apache 2.0 ライセンステキストを使用
- CC-BY-4.0:ユーザーが指定した場合のデータ/モデル用
{PROJECT_ROOT}/LICENSE に書き込みます。
CITATION.cff
<installed-skill-dir>/templates/CITATION.cff からテンプレートを読み込みます。
プレースホルダーに値を入力します。
| プレースホルダー | 値 |
|---|---|
{TITLE} | 論文のタイトル |
{AUTHORS_LIST} | YAML リスト形式の著者(テンプレートの形式を参照) |
{YEAR} | 公開年 |
{VENUE} | 会議名/ジャーナル名 |
{ARXIV_ID} | arXiv ID(あれば) |
{GITHUB_REPO} | github.com/username/repo |
{DATE_RELEASED} | 今日の日付(YYYY-MM-DD) |
{PROJECT_ROOT}/CITATION.cff に書き込みます。
README.md
README がない、または簡素すぎる場合(50 行未満):
<installed-skill-dir>/templates/README_ml_paper.md からテンプレートを読み込みます。
すべてのプレースホルダーに値を入力します。ユーザーが内容を提供する必要がある箇所(正確な性能数値、データセットのダウンロードリンクなど)には、[TODO: ...] マーカーを残します。
十分な内容がある既存の README は上書きしないでください。代わりに、不足しているセクションを特定し、追記を提案してください。
.gitignore
ファイルがない場合、Python/ML 用の .gitignore を生成します。
# Python
__pycache__/
*.py[cod]
*.egg-info/
.eggs/
dist/
build/
.venv/
venv/
# ML outputs (keep jobs/ but ignore outputs/)
outputs/
wandb/
*.ckpt
*.pt
*.pth
*.pkl
runs/
lightning_logs/
# Data (large files)
data/
datasets/
# Secrets
.env
*.pem
*.key
secrets.yaml
credentials.json
# IDE
.vscode/settings.json
.idea/
*.DS_Store
4. リリース前チェックリストの確認
項目の全一覧を確認するため、<installed-skill-dir>/checklist.md を読みます。
カテゴリごとにまとめた簡潔なチェックリストをユーザーに提示します。各項目の状態を報告してください(✅ 完了/⚠️ 要対応/❌ 未対応)。
📁 Repository hygiene
✅ .gitignore covers outputs/, wandb/, *.ckpt
⚠️ outputs/ directory exists — confirm not committed
📄 Documentation
✅ README.md present (142 lines)
❌ No CITATION.cff — will generate
⚠️ README missing "Pre-trained Models" section
🔐 Security
✅ No secrets detected
✅ No large files in git history
🧰 Toolchain gates
✅ pre-commit / ruff / pytest release gates passed
⚠️ lychee skipped — not installed
❌ gitleaks found possible secret in config.yaml
📦 Reproducibility
✅ requirements.txt / pyproject.toml present
⚠️ No environment.yml for conda users
⚠️ No Dockerfile
⚖️ Legal
✅ LICENSE (MIT) present
次のように尋ねます。「タグ付けと公開に進む準備はできていますか? それとも、先に上記の項目を修正しますか?」
5. コミットとタグ付け
ユーザーが確認したら:
ROOT="$(git rev-parse --show-toplevel)"
# Stage only new/modified tracked files (not untracked outputs)
git -C "$ROOT" add LICENSE CITATION.cff README.md .gitignore 2>/dev/null || true
git -C "$ROOT" diff --staged --stat
ステージされた変更を確認するようユーザーに依頼してから、コミットします:
git -C "$ROOT" commit -m "chore: prepare code for public release ({VERSION})"
注釈付きタグを作成します:
git -C "$ROOT" tag -a "{VERSION}" -m "$(cat <<'EOF'
Release {VERSION} — {PAPER_TITLE}
Published at {VENUE}
Paper: {PAPER_URL}
Includes: {WHAT_INCLUDED}
EOF
)"
次のように尋ねます:「コミットとタグを origin にプッシュしますか?」
CURRENT_BRANCH="$(git -C "$ROOT" branch --show-current)"
git -C "$ROOT" push origin "$CURRENT_BRANCH"
git -C "$ROOT" push origin "{VERSION}"
6. GitHub リリース(任意)
ユーザーが GitHub リリースを希望した場合:
gh が利用可能か確認します:
gh --version 2>/dev/null && echo "gh available" || echo "gh not found"
利用可能な場合は、リリースノートを作成し、リリースを作成します:
gh release create "{VERSION}" \
--title "{PAPER_TITLE} ({VERSION})" \
--notes "$(cat <<'EOF'
## {PAPER_TITLE}
**{VENUE}** | [Paper]({PAPER_URL}) | [Project Page]({PROJECT_PAGE_URL})
### What's included
{INCLUDED_ITEMS}
### Installation
\`\`\`bash
pip install -r requirements.txt
\`\`\`
### Citation
\`\`\`bibtex
{BIBTEX}
\`\`\`
EOF
)"
gh が利用できない場合は、ユーザーが GitHub に貼り付けられるよう、リリースノートをテキストで出力します。
7. まとめと次のステップ
最終的なまとめを出力します:
✅ Release {VERSION} complete!
Files generated/updated:
• LICENSE
• CITATION.cff
• README.md
• .gitignore
Git:
• Commit: {COMMIT_HASH}
• Tag: {VERSION} → pushed to origin
GitHub:
• Release: https://github.com/{REPO}/releases/tag/{VERSION}
Recommended next steps:
□ Upload pre-trained weights to HuggingFace Hub / project page
□ Add repo link to the paper's arXiv abstract page
□ Tweet / post about the release
□ Email the mailing list / post to r/MachineLearning
□ Add a "Code" badge to the paper PDF (camera-ready only)
匿名投稿への対応
ユーザーが、これが匿名の学会投稿用だと言った場合:
- 公開 GitHub リリースを作成しないでください。
- コミットするファイルに著者名を含めないでください。
- 代わりに匿名化した zip パッケージを生成します:
ROOT="$(git rev-parse --show-toplevel)" PROJ=$(basename "$ROOT") git -C "$ROOT" archive --format=zip HEAD -o "/tmp/${PROJ}-anonymous.zip" echo "Anonymous zip: /tmp/${PROJ}-anonymous.zip" - 投稿前に、zip の内容に著者を特定できる情報が含まれていないか確認します。
- ユーザーに、
git logで確認できるコミットメッセージ、設定ファイル内の個人用パス、コードコメント内のメールアドレスを匿名化するよう注意を促します。
よくあるパターン
HuggingFace Hub へのモデルのアップロード
ユーザーが HuggingFace に重みをプッシュしたい場合:
# Requires: pip install huggingface_hub
python -c "
from huggingface_hub import HfApi
api = HfApi()
api.upload_folder(
folder_path='checkpoints/',
repo_id='username/model-name',
repo_type='model',
)
"
README への「Code」バッジの追加
[](https://github.com/username/repo)
[](https://arxiv.org/abs/2401.00000)
[](LICENSE)
論文の Code リンク
リリース後、paperswithcode.com に投稿して、リポジトリを論文に自動でリンクします。