はじめに
初めまして。 『DApps開発入門』という本や色々記事を書いているかるでねです。
以下でも情報発信しているので、興味ある記事があればぜひ読んでみてください!
今回は、Claude Code SkillとSubagentで自身の過去記事を分析して、記事生成を自動化した仕組み「article-writer」についてまとめていきます。
背景・作った理由
記事を書くのは楽しいですが、時間がかかる作業でもあります。 記事の構成を毎回ゼロから考えたり、過去記事との一貫性を保つのが難しかったりします。 また、QiitaとZennでは記法が異なるため、プラットフォームごとのルールも覚えておく必要があります。
そこで、自分の過去記事を分析して、記事作成を支援する「article-writer」というSkillを、Claude Codeで作成しました。
解決したかった問題
- テンプレートを使って素早く記事のベースとなる構成を作成したい
- 過去記事のパターンをもとに統一感のある記事を作成したい
- QiitaやZennなど複数のプラットフォームに対応した柔軟な記事作成を実現したい
- 自身が知りたい技術やサービスについて記事にまとめて理解しやすくしたい
例えば自身が作成したアプリケーションの解説記事や特定の技術やサービスに関する記事を書きたいときに、AIにベース部分を書かせて、その後人の手で足りない部分の補強や修正を行うことで記事の執筆効率を上げることができます。 また、過去に執筆した記事がいくつかあれば、その記事の特徴をAIを用いて記事に反映できるのではと思い試してみました。
「自身が知りたい技術やサービスについて記事にまとめて理解しやすくしたい」ですが、これはあくまで自分の学習のためであり、下書きとして書いて公開するかどうかは別の話だと思っています。
ただし、必ず最後は人の手で確認することが重要です。
Claude Code Skillとは
Claude Skillについては以下を参考にしてください。
Claude Code Skillは、Claudeに特定の領域やタスクに特化した知識やワークフローを提供するモジュール型のパッケージです。 Skillは専門的なワークフロー(特定ドメインのための多段階の手順)、ツール統合(特定のファイル形式やAPIを扱うための指示)、ドメイン知識(企業固有の知識、スキーマ、ビジネスロジック)、バンドルされたリソース(複雑で繰り返しタスクのためのスクリプト、参照資料、アセット)を提供します。
Skillの構造
すべてのSkillは必須の SKILL.md ファイルと、オプションでバンドルされたリソースで構成されます。
skill-name/
├── SKILL.md - 必須
├── scripts/ - 実行可能コード(Python/Bash等)
├── references/ - 必要に応じてコンテキストに読み込むドキュメント
└── assets/ - 出力に使用するファイル(テンプレート等)SKILL.md はSkillの中核となるファイルで、YAMLメタデータに name と description を記述します。
この description が重要で、いつSkillを使用すべきかをClaudeが判断する基準になります。
---
name: skill-name
description: This skill should be used when...
---
# Skill Name
Instructions for Claude...Skillの呼び出し方
Skillは /<skill名> の形式で呼び出します。
/article-writer EASについて記事を書いてくださいプログレッシブディスクロージャー
Skillは、コンテキストを効率的に管理するために、3段階の読み込みシステムを使用します。
flowchart LR
A[メタデータ<br>name + description] --> B[SKILL.md本文]
B --> C[バンドルリソース<br>scripts/references/assets]最初にメタデータ(name + description)が常にコンテキスト内に読み込まれます(約100語)。
次にSkillがトリガーされたときに SKILL.md の本文が読み込まれます(5000語未満推奨)。
最後にClaude Codeが必要に応じてバンドルされたリソースを読み込みます。
この設計により、Skillは軽量でありながら、必要に応じて豊富な情報とツールを提供できます。
Claude Code Subagentとは
Subagentについては以下を参考にしてください。
Subagent(サブエージェント) は、Claude Codeのメインセッションから独立したコンテキストで実行される専用のAIワーカーです。
なぜSubagentが必要か
Claude Codeのメインセッションにはコンテキストウィンドウ(会話履歴やファイル読み込みで使えるトークン数)の制限があります。 大量の記事を分析したり、長文を執筆したりすると、メインのコンテキストがすぐに埋まってしまい、他の処理ができなくなります。
Subagentは独立したコンテキストで動作するため、以下のメリットがあります。
-
メインコンテキストを圧迫しない 数百〜数千の記事を読み込んでもメインセッションに影響せず、長文記事の執筆でもメインの会話履歴を保持できる。
-
並列処理が可能 複数のSubagentを同時に起動でき、分析と執筆を並行して実行することができる。
-
処理の分離と再利用 特定のタスクに特化したSubagentを定義でき、同じSubagentを何度でも呼び出せる。
-
バックグラウンドでの起動 バックグラウンドでの起動ができ、実行完了後にメインセッションを呼び出して処理完了を通知できる。
MainとSubagentの違い
| 項目 | Main(メインセッション) | Subagent |
|---|---|---|
| コンテキスト | ユーザーとの会話全体を保持 | タスクごとに独立したコンテキスト |
| 役割 | ワークフロー管理、ユーザー対話 | 重い処理の実行(分析、執筆、生成) |
| 処理内容 | Skill選択、アウトライン設計、品質チェック | 記事分析、スキル生成、記事執筆 |
| 入出力 | ユーザーと対話 | 軽量なJSON/Markdownで結果を返す |
| トークン使用 | 会話履歴で消費 | タスク実行時のみ消費(独立) |
flowchart TB
User[ユーザー] <--> Main[Main<br>メインセッション]
Main --> |タスク委譲| Sub1[Subagent<br>pattern-extractor]
Main --> |タスク委譲| Sub2[Subagent<br>skill-writer]
Sub1 --> |JSON| Main
Sub2 --> |ファイル生成| MainSubagentの配置場所と定義
SubagentはAgent定義ファイルとして .claude/agents/ ディレクトリに配置します。
ディレクトリ構造
.claude/
└── agents/
├── pattern-extractor.md # パターン抽出Subagent
└── skill-writer.md # スキル生成SubagentSubagent定義ファイルの構造
---
name: skill-writer
description: パターンJSONからarticle-writerスキルのstyle/とcategories/を生成/更新
tools: Read, Write, Bash, Grep, Glob
model: opus
permissionMode: bypassPermissions
---
skill-writerサブエージェントを起動して、以下のタスクを実行してください:
...frontmatterで以下が定義されています。
nameSubagent名。description何をするSubagentか。tools使用するツール(Read、Write、Bash等)。model使用するモデル(sonnet、opus、haiku)。permissionModeファイル操作の権限設定。
permissionMode: bypassPermissionsを設定することで、ユーザーの承認なしでファイル操作が可能になります。
Subagentの呼び出し方法
Subagentはスラッシュコマンド経由で呼び出します。
/pattern-extractor articles/このコマンドを実行すると、以下の処理が実行されます。
.claude/commands/pattern-extractor.mdが読み込まれる- Commandが
pattern-extractorSubagentをバックグラウンドで起動 - Subagentが独立したコンテキストで記事分析を実行
- JSON形式で結果を返す
article-writerスキルの紹介
article-writerとは
article-writerは、Claude Code Skillとして実装された記事執筆支援システムです。
このスキルは以下の2つの機能を提供します。
-
新規執筆 参考資料(URL、ドキュメント)を元に、アウトライン設計から執筆までを自動化。 過去記事から抽出したスタイルガイドに従って、一貫したトーンで記事を生成。
-
既存記事の更新 変更箇所を特定し、ユーザー承認を得てから編集。 スタイルガイドに従って一貫性を保ちながら更新。
仕組み
article-writerは3つのコンポーネントで構成されています。
スタイルガイド
執筆・編集時に参照するルールをstyle/style_guide.mdに格納しています。
見出し、文章、リスト、コードブロック、図などの記述ルールが定義されています。
カテゴリテンプレート
プラットフォーム別・カテゴリ別の記事構成テンプレートです。
/generate-templatesで過去記事を分析して自動生成されます。
記事のカテゴリ(チュートリアル、解説、紹介等)ごとに適した構成が定義されており、新規執筆時にカテゴリを判定してテンプレートを選択します。
ユーザー編集用テンプレート
templates/ディレクトリには、スタイルガイドと履歴ファイルの雛形が格納されています。
手動でルールを追加したい場合や、履歴ファイルの形式をカスタマイズする場合に編集します。
| ファイル | 役割 |
|---|---|
style_guide.md |
スタイルガイドの雛形 |
intro_outro.md |
イントロ/アウトロの雛形 |
history_template.md |
記事単位の履歴テンプレート |
history_template_book.md |
本単位の履歴テンプレート |
article-writerの特徴
-
統合されたシンプルな構造 1つのSkillで新規執筆と更新の両方に対応。
-
重い処理のSubagent化 大量の記事分析などの重い処理を独立したコンテキストで実行するため、メインセッションを圧迫しない。
-
圧縮されたスタイルガイド トークン消費を抑えるため、スタイルファイルは箇条書き形式で簡潔に記述。
-
品質の一貫性 過去記事から抽出されたスタイルガイドラインに従って執筆するため、記事の品質とトーンが一貫。
ディレクトリ構造
.claude/
├── commands/ # スラッシュコマンド
│ ├── pattern-extractor.md # パターン抽出コマンド
│ └── skill-writer.md # スキル生成コマンド
├── skills/
│ ├── article-writer/ # 記事執筆スキル(メイン)
│ │ ├── SKILL.md # スキル定義
│ │ ├── templates/ # ユーザー編集用テンプレート
│ │ │ ├── style_guide.md
│ │ │ ├── intro_outro.md
│ │ │ ├── history_template.md
│ │ │ └── history_template_book.md
│ │ ├── style/ # スタイルガイド
│ │ │ └── style_guide.md
│ │ ├── history/ # 編集履歴(自動生成)
│ │ │ └── {platform}/ # プラットフォーム別
│ │ │ └── {filename}.md # 記事単位または本単位
│ │ └── categories/ # カテゴリ別テンプレート(/generate-templatesで更新)
│ │ └── {platform}/ # プラットフォーム別(自動生成)
│ │ └── {category}.md # カテゴリ別テンプレート
│ └── generate-templates/ # テンプレート生成スキル
│ ├── SKILL.md
│ └── templates/
│ ├── format_rules.md
│ ├── wordings.md
│ ├── intro_outro.md
│ └── category.md
└── agents/
├── pattern-extractor.md # パターン抽出Subagent
└── skill-writer.md # スキル生成Subagent構成要素
- article-writer Skill
記事の新規執筆と既存記事の更新を行うメインスキル。
/article-writer 〇〇について記事を書いてのように呼び出す。
- generate-templates Skill
過去記事を分析して
style/とcategories/を自動生成するスキル。/generate-templates articles/のように記事ディレクトリを指定して呼び出す。
- Subagents
独立したコンテキストで重い処理を実行するワーカー。
pattern-extractorは記事からパターンを抽出してJSONを出力。skill-writerはJSONからstyle/とcategories/を生成。
- Commands
Subagentを起動するスラッシュコマンド。
/pattern-extractorと/skill-writerがあり、generate-templatesから内部的に呼び出される。
処理フロー
新規執筆フロー
/article-writer で新規記事を作成する場合のフローです。
| フェーズ | 目的 | 処理内容 |
|---|---|---|
| Phase 0 | ルール読み込み | style/style_guide.mdを読み込む |
| Phase 1 | 情報収集 | 参考資料がある場合、WebSearchで情報を収集 |
| Phase 2 | アウトライン設計 | カテゴリ判定、アウトライン作成、ユーザー承認 |
| Phase 3 | 執筆・書き込み | スタイルガイドに従って執筆、ファイル書き込み |
| Phase 4 | 履歴記録 | 履歴ファイルを作成し、意思決定の背景を記録 |
| Phase 5 | レビュー | 参考資料・ユーザー指示の反映を確認、不足があれば修正 |
flowchart LR
P0[Phase 0<br>ルール読み込み] --> P1[Phase 1<br>情報収集]
P1 --> P2[Phase 2<br>アウトライン設計]
P2 --> P3[Phase 3<br>執筆・書き込み]
P3 --> P4[Phase 4<br>履歴記録]
P4 --> P5[Phase 5<br>レビュー]更新フロー
/article-writer で既存記事を更新する場合のフローです。
| フェーズ | 目的 | 処理内容 |
|---|---|---|
| Phase 0 | ルール読み込み | style/style_guide.mdを読み込む |
| Phase 1 | 既存記事読み込み | 対象記事と履歴ファイルを読み込む |
| Phase 2 | 変更計画 | 変更箇所を特定、変更内容を提示、ユーザー承認 |
| Phase 3 | 編集・書き込み | スタイルガイドに従って編集、ユーザー承認後に反映 |
| Phase 4 | 履歴追記 | 履歴ファイルに変更内容と意思決定の背景を追記 |
| Phase 5 | レビュー | 参考資料・ユーザー指示・履歴との整合性を確認 |
flowchart LR
P0[Phase 0<br>ルール読み込み] --> P1[Phase 1<br>既存記事読み込み]
P1 --> P2[Phase 2<br>変更計画]
P2 --> P3[Phase 3<br>編集・書き込み]
P3 --> P4[Phase 4<br>履歴追記]
P4 --> P5[Phase 5<br>レビュー]スタイルガイド
article-writerはstyle/style_guide.mdを参照して執筆します。
このファイルには、記事の品質と一貫性を保つためのルールが定義されています。
主なルールカテゴリ
| カテゴリ | 内容 |
|---|---|
| 見出し | h2から始める、括弧やコロンを含めない、見出し後は1行空ける |
| 文章 | です/ます調で統一、句点で文を終える、技術用語の初出時は英語とカタカナを併記 |
| コロン禁止 | コードブロック外での半角/全角コロン使用禁止(URL、時刻、記法は例外) |
| リスト | 手順は数字付き、それ以外は通常のリスト、リスト内リストは不使用 |
| コードブロック | 言語タグ必須、前後に説明を記載、連続させない |
| 図 | 前後に説明を入れる、図だけで終わらせない |
| 表とリスト | 並列的な情報は表形式を優先 |
スタイルガイドの例
## 見出し
- h2から始める(h2 → h3)
- 見出しに括弧やコロンを含めない
- 見出しの後は1行空ける
## 文章
- 文体はです/ます調で統一する
- 句点(。)で文を終える
- 技術用語の初出時は英語とカタカナを併記するスタイルガイドに従うことで、記事間の品質とトーンが一貫したものになります。
カテゴリテンプレート
categories/ ディレクトリにはプラットフォーム別・カテゴリ別のテンプレートが格納されます。
categories/
└── {platform}/ # プラットフォーム別ディレクトリ
└── {category}.md # カテゴリ別テンプレート(自動生成)各テンプレートにはそのカテゴリに適した記事構成が定義されています。
/generate-templatesを実行すると、過去記事を分析してプラットフォームとカテゴリが自動で生成されます。
履歴管理
article-writerは、記事の編集履歴を自動的に記録します。 これにより、過去の意思決定を参照しながら一貫性のある更新が可能になります。
履歴の役割
-
意思決定の追跡 なぜその変更を行ったか、どのような判断基準で決定したかを記録します。
-
更新時の参照 既存記事を更新する際に、過去の意思決定と矛盾しないよう確認できます。
-
参考情報の保存 参照したURL、関連ファイル、ユーザー指示を記録します。
履歴のディレクトリ構造
履歴はhistory/{platform}/ディレクトリに保存されます。
記事形式と本形式で管理単位が異なります。
history/
└── {platform}/ # プラットフォーム別
├── {filename}.md # 記事単位(記事形式)
└── {book-name}/ # 本単位(本形式)
└── *.md # 章ごとの詳細履歴記事形式と本形式の違い
| 形式 | 管理単位 | 使用例 |
|---|---|---|
| 記事形式 | 記事単位 | Zenn記事、Qiita記事 |
| 本形式 | 本単位 | Zenn Book |
本形式では、本全体の履歴ファイルと、章ごとの詳細履歴を分けて管理します。
履歴に記録される内容
履歴ファイルには以下の情報が記録されます。
-
メタ情報 対象記事パス、プラットフォーム、作成日、最終更新日。
-
記事の目的・方針 記事の目的、想定読者、執筆方針。
-
編集履歴 日時、変更概要、意思決定の背景、ユーザー指示、参考情報。
プラットフォーム対応
QiitaとZennではメッセージボックスやコードブロックの記法が異なります。 article-writerは執筆時にプラットフォームを判定し、適切な記法を使用します。
各プラットフォームの記法詳細は公式ドキュメントを参照してください。
- Qiita Markdown記法
- Zenn Markdown記法
generate-templatesスキル
/generate-templates は、既存の記事を分析してarticle-writerのstyle/とcategories/を自動生成するスキルです。
パイプラインフェーズ
| フェーズ | 目的 | 使用Subagent | 出力 |
|---|---|---|---|
| Phase 1 | ディレクトリパス解析 | - | ディレクトリパス |
| Phase 2 | パターン抽出 | pattern-extractor |
パターン抽出JSON |
| Phase 3 | ユーザー確認 | - | カテゴリ分類の承認 |
| Phase 4 | スキル生成/更新 | skill-writer |
style/、categories/ |
| Phase 5 | 完了報告 | - | 生成完了レポート |
flowchart LR
A[Phase 1<br>パス解析] --> B[Phase 2<br>pattern-extractor]
B --> C[Phase 3<br>ユーザー確認]
C --> D[Phase 4<br>skill-writer]
D --> E[Phase 5<br>完了報告]Phase 2では、/pattern-extractor articles/のようなコマンドを実行します。
pattern-extractor Subagentが独立したコンテキストで数百〜数千記事を読み込み、パターンを抽出してJSON形式で返します。
Phase 4では、/skill-writer '{json}'コマンドを実行します。
skill-writer Subagentが独立したコンテキストでJSONからstyle/とcategories/を生成/更新します。
使用例
/generate-templates articles/このスキル1つでstyle/とcategories/が自動生成されます。 途中でユーザー確認が入り、カテゴリ分類の結果を確認してからスキル生成に進みます。
更新モード
既存のファイルが存在する場合は、更新モードで動作します。
- 既存ファイルを読み込み
- 新しいルール/パターンを既存の末尾に追加
- 重複するルールは追加しない
- 既存のルールは削除しない
作成手順
flowchart LR
S1[Step 1<br>テンプレート<br>クローン] --> S2[Step 2<br>既存記事<br>収集]
S2 --> S3[Step 3<br>スタイル<br>ファイル生成]
S3 --> S4[Step 4<br>intro_outro<br>カスタマイズ]
S4 --> S5[Step 5<br>動作確認]Step 1: テンプレートのクローン
GitHubからテンプレート一式をコピーします。
.claudeディレクトリをプロジェクトルートにコピーしてください。
ディレクトリ構造は以下のようになっています。
.claude/
├── commands/
│ ├── pattern-extractor.md
│ └── skill-writer.md
├── skills/
│ ├── article-writer/
│ │ ├── SKILL.md
│ │ ├── templates/
│ │ │ ├── style_guide.md
│ │ │ ├── intro_outro.md
│ │ │ ├── history_template.md
│ │ │ └── history_template_book.md
│ │ ├── style/
│ │ │ └── style_guide.md
│ │ ├── history/
│ │ │ └── {platform}/
│ │ └── categories/
│ │ └── {platform}/
│ └── generate-templates/
│ ├── SKILL.md
│ └── templates/
│ ├── format_rules.md
│ ├── wordings.md
│ ├── intro_outro.md
│ └── category.md
└── agents/
├── pattern-extractor.md
└── skill-writer.mdすべてのAgentファイル(.claude/agents/*.md)のfrontmatterに以下の設定が必要です。
permissionMode: bypassPermissionsこの設定がないと、Agentがファイル操作を実行できず、スキル生成が失敗します。
Step 2: 既存記事の収集
自分の記事をMarkdownファイルとして収集します。 ディレクトリ構造は自由ですが、プラットフォームごとに分けると管理しやすいです。
articles/
└── {platform}/ # プラットフォーム別
└── *.md # 記事ファイルZennは公式エクスポート機能があります。
Step 3: スタイルファイルの生成
/generate-templates を実行して、style/とcategories/を自動生成します。
/generate-templates articles/以下のファイルが自動生成されます。
.claude/skills/article-writer/
├── style/
│ └── style_guide.md # スタイルガイド
└── categories/
└── {platform}/ # プラットフォーム別(自動生成)
└── {category}.md # カテゴリ別テンプレートStep 4: style_guide.mdのカスタマイズ
style/style_guide.md を編集して、自分の執筆スタイルに合わせてルールを追加・修正します。
見出しの使い方、文章のトーン、コードブロックの記述方法などをカスタマイズできます。
Step 5: 動作確認
/article-writer を実行して、生成したSkillが正しく動作するか確認します。
/article-writer 〇〇について簡単な記事を書いてください以下の点を確認してください。
- style/style_guide.mdのルールが適用されるか
- 見出し、文章、リストなどの記述がガイドに従っているか
- categories/のテンプレートが正しく選択されるか
使い方と実例
新規記事の作成
/article-writer EASについて記事を書いてください。ドキュメントはこちらです。
https://docs.attest.org//article-writer が以下を実行します。
- Phase 0で
style/style_guide.mdを読み込み - Phase 1でWebSearchにより情報を収集
- Phase 2でカテゴリ判定とアウトライン設計を行い、ユーザー承認を取得
- Phase 3でスタイルガイドに従って執筆、ファイル書き込み
- Phase 4で履歴ファイルを作成
- Phase 5で参考資料・ユーザー指示の反映を確認
既存記事の更新
/article-writer articles/react-hooks.md の「useEffect」セクションを最新情報に更新してくださいファイルパスを検出して更新フローに切り替わります。
スタイルファイルの更新
新しい記事を追加した場合、/generate-templates を再実行することで、style/とcategories/を更新できます。
/generate-templates articles/更新モードでは、既存の内容を保持し、新規追加のみ行います。
最後に
今回は『Claude Codeで過去記事を分析して記事生成を自動化』についてまとめてきました。 他でも色々記事を書いているのでぜひよろしければ読んでいってください!



