.cursor/skills/write-zenn-dialogue-article/SKILL.md
Zenn 記事を A先輩と B後輩の対話形式で執筆する。 Q&A のように疑問点にピンポイントで答える構成で、 初心者がつまずきやすいポイントを自然に解消する。 "対話形式で記事を書いて", "会話形式の記事", "dialogue article", "対話記事", "先輩後輩の会話で記事" などで起動する。
npx skillsauth add otomatty/zedi write-zenn-dialogue-articleInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
A先輩と B後輩の会話で技術トピックを解説する Zenn 記事を書く。 AI臭のない自然な会話で、初心者の「あるある」な疑問に答える形式。 対象読者はプログラミング初心者〜入門者。専門用語は必ず噛み砕いて説明する。
| | A先輩 | B後輩 | | ---------- | -------------------------------------------- | -------------------------------------------- | | 役割 | 解説・改善例を示す | 質問・初心者にありがちなコードを出す | | 話し方 | 的確・結論ファースト。専門用語は必ず噛み砕く | 素朴・ストレート | | 知識レベル | 実務経験豊富 | 完全初心者。プログラミングを学び始めたばかり |
詳細は dialogue-guide.md を参照。
Zenn のメッセージ記法(:::message)を使い分ける。
:::message で囲む(質問として目立たせる):::message
**B後輩**: SOLIDの「S」って何ですか? 名前は聞いたことあるんですけど…
:::
**A先輩**: 単一責任の原則だね。ひとつのコンポーネントには、ひとつの役割だけ持たせようっていう考え方。
B後輩が初心者にありがちなコードを出す → A先輩が改善版を示す。 コードは発言の直後に配置し、Before/After を会話の流れで自然に見せる。
:::message
**B後輩**: 自分はこんな感じで書いてるんですけど、これってどうですか?
:::
```tsx
const UserPage = () => {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch(`/api/users/${id}`)
.then((res) => res.json())
.then((data) => {
setUser(data);
setLoading(false);
});
}, [id]);
if (loading) return <Spinner />;
if (!user) return <NotFound />;
return (
<div>
<h1>{user.name}</h1>
<p>{user.email}</p>
{/* ... validation, formatting, etc. 全部ここに */}
</div>
);
};
```
**A先輩**: 動くけど、この 1 コンポーネントにやらせすぎだね。fetch・表示・エラー処理が全部混ざってる。分けてみよう。
```tsx
const UserPage = () => {
const user = useUser(userId);
return <UserProfile user={user} />;
};
```
---
title: "(B後輩の疑問が伝わる具体的なタイトル)"
emoji: "(内容に合った絵文字 1 つ)"
type: "tech"
topics: ["トピック1", "トピック2", "トピック3"]
published: false
---
## はじめに
(2〜3 文でテーマと対象読者を書く)
(この記事が対話形式であることを伝える)
---
## テーマ 1: 〜
:::message
**B後輩**: (素朴な疑問。セクションは必ず B後輩の質問から始める)
:::
**A先輩**: (結論 → 理由 → 具体例の順で回答)
:::message
**B後輩**: (追加の疑問、または自分のコードを見せる)
:::
**A先輩**: (改善案をコード例つきで示す)
:::message
**B後輩**: (理解を自分の言葉で言い直す、または次の疑問へ橋渡し)
:::
---
## テーマ 2: 〜
(同様の対話パターン。テーマ間は `---` で区切る)
---
## テーマ N: 〜
---
## まとめ
:::message
**B後輩**: (学んだことを自分の言葉で振り返る)
:::
**A先輩**: (補足やネクストステップを簡潔に)
## 参考
(引用した記事・ツールへのリンク)
読者が B後輩に感情移入し、自分の疑問が解消される体験を作る。
1 回のやり取りで伝えるポイントは 1 つだけ。詰め込まない。 ポイントが複数あるなら、B後輩に追加の質問をさせて分ける。
理解したら自分の言葉で言い直す。または次の疑問につなげる。
<!-- ❌ -->
:::message
**B後輩**: わかりました!
:::
<!-- ✅ -->
:::message
**B後輩**: なるほど、つまり 1 コンポーネント 1 役割ってことですね。でもそうすると、コンポーネントの数がすごく増えませんか?
:::
長い前置きをせず、まず答えてから理由を補足する。
❌ A先輩: そもそもSOLIDっていうのはロバート・C・マーティンが提唱した…
✅ A先輩: 結論から言うと、1コンポーネントに責務を詰め込むと壊れやすくなる。理由は…
教科書にならないよう、先輩の体験談や軽い脱線を挟む。
✅ A先輩: 自分も最初は全部1ファイルに書いてたよ。3ヶ月後に見返して絶望した。
初心者が読むことを前提に、専門用語が出たら必ず平易な言葉で言い換える。
❌ A先輩: これは SRP 違反だね。
✅ A先輩: 1 つのコンポーネントにいろんな仕事をさせすぎてる。
これ「単一責任の原則」っていって、1 つにつき 1 つの役割だけにしようねって考え方なんだよね。
初心者が書きがちなコードを出す。動くが設計上の問題があるコード、 または「とりあえず動かした」段階のコード。 初心者が「え、これダメなんですか?」と思うレベルが理想。
:::message の記法が正しく使われている(B後輩のみ)docs/plan/ 配下に Markdown ファイルとして出力する(Git 追跡外)。
ファイル名は zenn-dialogue-<slug>.md(例: zenn-dialogue-react-solid.md)。
documentation
Zenn 記事の執筆・推敲を、体験ベースで読みやすいトーンに仕上げる。 AIっぽい定型表現を排除し、実践報告として説得力のある文章を生成する。 "Zenn記事を書いて", "記事の下書き", "ブログ記事を書く", "記事を推敲して", "write a Zenn article", "draft a blog post" などで起動する。
development
Runs Stryker mutation tests only on git-changed production files under `src/` via `scripts/stryker-mutate-changed.mjs` and `bun run test:mutation:changed`. Uses `stryker.config.mutation-changed.mjs` so partial runs do not fail on global `thresholds.break`. Use when the user asks for mutation testing on changed files only, incremental mutation test, diff-based Stryker, or "差分だけミューテーション" / "mutation test for current changes". After a run, use `bun run mutation:report:summary` and attach `reports/mutation/mutation-summary.md` for AI explanation (not HTML).
development
手元の実装変更、または現在ブランチとターゲットブランチの差分を、 関連コード(テスト・依存先・呼び出し元)も含めて AI レビューし、結果をマークダウンファイルに出力する。 "レビューして", "実装をレビュー", "変更をチェック", "review my changes", "self review", "セルフレビュー", "develop との差分をレビュー", "ブランチの差分をチェック", "review branch diff" などで起動する。
development
PR レビューコメントを仕様に照らして分析し、対応方針を提案・実行する。 コメントをそのまま受け入れるのではなく、TSDoc/テスト/型定義に基づいて 妥当性を検証し、修正・代替案・対応不要を判断する。 "レビュー対応して", "PRコメントに対応", "review PR comments", "レビューコメントを確認", "PRのレビューを処理" などで起動する。 Cursor / Claude Code 共通で使用可能。