# Crowi Release Discord Nits

> リリース後、CI が Discord に自動投稿する告知に添える一言コメント(カテゴリ別・ 1 行ずつの簡潔な箇条書き)を、CHANGELOG 差分から生成する skill。投稿はしない (テキスト生成まで — 貼り付けは人間が行う)。 キーワード: discord, リリース告知, 一言コメント, release notes, changelog

- Skill: `crowi/crowi-release-discord-nits` (Agent Skill)
- Install (CLI): `npx skillmds@latest add crowi/crowi-release-discord-nits`
- Raw SKILL.md: https://api.skillmd.com/api/skills/crowi/crowi-release-discord-nits/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: crowi (https://skillmd.com/u/crowi)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/crowi/crowi-release-discord-nits

---


# Crowi Release Discord Nits (リリース後の一言コメント生成)

CI がリリースごとに Discord へ自動投稿する告知(`Crowi Releases` bot — release notes
リンク + `docker pull` コマンド)に対して、人間(sotarok)がスレッド内で返信として
載せる一言コメントを生成する skill。「今回のリリースで特に触れておきたい点」を、
カテゴリ別・1 カテゴリ 1 行の簡潔な箇条書きにまとめる。

**投稿はしない**。生成したテキストを提示するところまでが本 skill の責務で、Discord
への貼り付けは人間が行う。理由は 2 つ:このセッションから Discord へ投稿する経路
(webhook・bot トークン等)がそもそも用意されていないことと、たとえ用意されていても
「公開コンテンツの投稿」は常に人間の明示確認を要る行為だから(CLAUDE.md の行動区分)。

## 起動構文

```
/crowi-release-discord-nits                    # 直近リリース(最新の v* tag)を対象
/crowi-release-discord-nits v2.0.0-alpha.10     # 対象 tag を明示指定
```

## ワークフロー

### Step 1: 対象リリースと比較起点の解決

- 引数が無ければ対象 tag = `git describe --tags --abbrev=0 --match 'v*'`(最新)。
- 比較起点(1 つ前のリリース)は `git tag --list 'v*' --sort=-creatordate` で対象 tag の
  直前の 1 件を取る。

### Step 2: 実際に出荷された変更点の収集(CHANGELOG 差分が正)

`.changeset/*.md` は `pnpm changeset version` の時点で消費されて消えるため、「その回に
何が実際に入ったか」の正本はその version 化コミットが書いた各パッケージの
`CHANGELOG.md` — spec や changeset 原文の言い回しではなく、最終的にユーザーに見える
単位でまとまっている。

```bash
git diff <比較起点>..<対象 tag> -- 'packages/*/CHANGELOG.md' 'apps/*/CHANGELOG.md'
```

**フィルタなしの生の diff をそのまま読むこと** — `grep '^+- '` のような 1 行抽出は
使わない。各エントリは `+- <hash>: ...` で始まるが、元の changeset 本文が手動改行を
含んでいると **後続行が `+- ` を伴わず折り返して続く**(実測: `ce69b4a` の BREAKING
エントリが `v2 never` で切れて次行に続いていた — 先頭行だけ拾うと文が壊れる)。
1 エントリの終わりは次の `+- <hash>: ` 行・次の `+### ` 見出し・空行のいずれかで判断し、
全文を読んでから要約する。

`+- Updated dependencies [<hash>]` 行(内部の workspace 依存バンプに伴う自動生成
エントリ)はユーザー向けの実質情報を持たないので無視する。

**同一 changeset は複数パッケージの CHANGELOG に重複して現れる**(1 つの changeset が
`api` と `api-contract` の両方を bump すれば、ほぼ同じ文面が両方の CHANGELOG.md に
1 エントリずつ載る)。`<hash>:` の値でユニーク化し、同じ hash は 1 件として扱う
(実測: 直近リリースで最大 8 回まで重複した changeset があった)。

### Step 3: カテゴリ分けして 1 行に凝縮

集めたエントリを、その回の内容に応じて動的にカテゴリ分けする(固定 4 分類ではない —
該当が無いカテゴリはそもそも出さない)。よく使うカテゴリ:

- **破壊的変更**: 運用者・クライアント側の対応が要るもの
- **セキュリティ**: 脆弱性修正・認証境界の変更。主語に注意 — 依存パッケージの脆弱性を「脆弱性 N 件を解消」と書くと Crowi 自体にあったように読める (`crowi-changesets` の「依存パッケージの脆弱性対応の書き方」が正本)
- **設計/基盤**: アーキ変更・内部契約の変更(ユーザー影響は薄いが技術的に重要なもの)
- **機能**: 新しい挙動・UI 変更
- **修正**: バグ修正(クラッシュ・不整合・データ破損 等)
- **docs**: ドキュメントの新規/陳腐化修正(まとまった量があるときだけ独立させる)

各カテゴリ 1 行、項目は読点区切りで詰め込む(改行しない — Discord の返信として読みやすい
密度を優先)。文体は過去ログの実例に合わせる: 体言止め寄り・技術的に具体的・補足は
括弧で短く添える。severity が高いもの(クラッシュ・脆弱性・データ消失)は各カテゴリ内で
先頭に置く。

**CHANGELOG の文章をそのまま並べない** — あの文体は npm パッケージの利用者向けで、
Discord は社内(仲間内)向けの温度感。エンジニアが実際に話す密度まで凝縮し直す。
実装していない・確認していない話を憶測で書き足さない(CHANGELOG に無い事実は書かない)。

### Step 4: 出力

生成したテキストをそのまま会話に提示する(コピペしてそのまま Discord に貼れる形。
Discord の記法に合わせる — **各カテゴリ行は必ず行頭 `- ` で始める**(Discord は
行頭 `- ` を箇条書きとして認識してレンダリングする。付けないと単なる太字の段落に
なり箇条書きにならない)。`**太字**` の見出し + `- ` の行頭 + 項目は `、` 区切り、が
基本形:

```
- **カテゴリ**: 項目1(補足)、項目2、項目3
```

## 鉄則

- **投稿はしない**。人間がコピペして貼る前提のテキスト生成に徹する。
- **CHANGELOG 由来の事実だけを書く**。裏取りできない話を書き足さない。
- 1 カテゴリ 1 行を守る。
- 固定カテゴリ数に無理に当てはめない — 該当が無いカテゴリは省く。

