著者プロフィールの拡充
このスキルは、Web検索を利用して著者プロフィールの不足フィールド(bio、アバター、ウェブサイト、ソーシャルリンク)を補完します。
ワークフロー概要
フェーズ 1: 著者の特定
└─ 著者ファイルの検索と検証
フェーズ 2: 並列調査(不足フィールドのみ)
├─ WebSearchエージェント 1: bio/経歴
├─ WebSearchエージェント 2: アバターURL
└─ WebSearchエージェント 3: ウェブサイト + ソーシャルリンク
フェーズ 3: ユーザーレビュー(BLOCKING GATE)
└─ 結果を提示し、承認を待機
フェーズ 4: 拡充した著者情報の保存
└─ フロントマターの更新
フェーズ 5: 品質チェック
└─ pnpm lint:fix && pnpm typecheck の実行
フェーズ 1: 著者の特定
1.1 著者ファイルを検索
著者のスラッグ、名前、部分的な名前を引数として受け付けます:
- まず完全一致のスラッグを試す:
content/authors/{slug}.mdの存在確認(スペースはハイフンに変換、小文字化) - 一致しない場合: Grep を使用して著者ファイル内で名前を検索:
Grep パターン: "name:.*{検索語}" グロブ: "content/authors/*.md"
結果:
- 単一一致 → そのファイルで続行
- 複数一致 → ユーザーに選択肢を表示
- 一致なし → 利用可能な著者を一覧表示
1.2 不足フィールドを特定
著者ファイルを読み込み、不足または空のフィールドを確認:
必須フィールド(常に存在):
nameslug
拡充対象の任意フィールド:
bio- 専門的な経歴と専門知識avatar- プロフィール画像のURLwebsite- 個人ウェブサイトURLsocials.twitter- Twitter/X ハンドルsocials.github- GitHub ユーザー名socials.linkedin- LinkedIn ユーザー名socials.youtube- YouTube チャンネル
フィールドは以下の場合に「不足」とみなします:
- フロントマターに存在しない
- 存在するが空(
""またはnull)
すべてのフィールドが既に入力されている場合は、その旨をユーザーに通知し、特定フィールドの更新を提案します。
フェーズ 2: 並列調査
不足フィールドに基づいて、最大3つのWebSearchエージェントを並列に起動します:
**エージェント 1 - Bio/経歴:**
Task ツール、subagent_type: "general-purpose"
prompt: "Use WebSearch to find professional background info for [著者名].
Query: '[著者名]' bio background expertise
Extract: 役職、会社、専門分野、注目プロジェクト。
Return: 1〜2文のプロフェッショナルな経歴。"
**エージェント 2 - アバターURL:**
Task ツール、subagent_type: "general-purpose"
prompt: "Use WebSearch to find a profile picture URL for [著者名].
Query: '[著者名]' site:github.com OR site:twitter.com
Extract: GitHub ユーザー名または Twitter ハンドルからアバターURLを構築。
Return: アバターURL(優先: GitHub形式 https://github.com/{ユーザー名}.png)"
**エージェント 3 - ウェブサイト & ソーシャルリンク:**
Task ツール、subagent_type: "general-purpose"
prompt: "Use WebSearch to find social media profiles for [著者名].
Query: '[著者名]' twitter github linkedin youtube
Extract: 個人ウェブサイト、Twitterハンドル、GitHubユーザー名、LinkedInプロフィール、YouTubeチャンネル。
Return: 見つかったプロフィールのURL/ハンドルのリスト。"
不足フィールドに対応するエージェントのみを起動します。bioが既に存在する場合はエージェント1をスキップします。
すべての結果は TaskOutput 経由で収集します(ブロッキング)。
フェーズ 3: ユーザーレビュー(BLOCKING GATE)
これは必須の承認ステップです。 保存する前に、提案された変更を提示します。
3.1 変更を提示
変更案を比較表として表示:
## [著者名] の提案更新内容
| フィールド | 現在 | 提案 |
|-----------|------|------|
| bio | (空) | "Xの創業者、Yの開発者..." |
| avatar | (空) | "https://github.com/ユーザー名.png" |
| website | (空) | "https://example.com" |
| socials.twitter | (空) | "ユーザー名" |
| socials.github | (空) | "ユーザー名" |
| socials.linkedin | (空) | "ユーザー名" |
| socials.youtube | (空) | (見つかりませんでした) |
3.2 承認を要求
AskUserQuestion ツールを使用:
question: "これらの変更を著者プロフィールに保存しますか?"
header: "レビュー"
multiSelect: false
options:
- label: "保存"
description: "これらの値で著者ファイルを更新"
- label: "編集"
description: "変更点を指示する"
- label: "キャンセル"
description: "ファイルを変更しない"
3.3 応答の処理
- 保存: フェーズ4に進む
- 編集: ユーザーフィードバックを適用し、更新プレビューを表示
- キャンセル: 変更せず終了
明示的なユーザー承認なしにフェーズ4に進まないでください。
フェーズ 4: 拡充した著者情報の保存
4.1 フロントマターの更新
Edit ツールを使用して、承認されたフィールドのみを更新:
更新前:
---
name: "John Doe"
slug: "john-doe"
bio: ""
avatar: ""
website: ""
socials:
twitter: ""
github: ""
linkedin: ""
youtube: ""
---
更新後:
---
name: "John Doe"
slug: "john-doe"
bio: "Software engineer specializing in distributed systems..."
avatar: "https://github.com/johndoe.png"
website: "https://johndoe.dev"
socials:
twitter: "johndoe"
github: "johndoe"
linkedin: "johndoe"
youtube: ""
---
4.2 既存の値を保持
重要: 明示的に要求されない限り、既存の空でない値を決して上書きしないでください:
- 既存の
nameとslugは変更しない - 空/不足フィールドのみ更新
- 追加のカスタムフィールドは保持
4.3 確認
ユーザーに報告:
更新: content/authors/{slug}.md
- bio: 追加
- avatar: 追加
- website: 追加
- socials.twitter: 追加
- socials.github: 追加
フェーズ 5: 品質チェック
リンターと型チェックを実行して問題を検出:
pnpm lint:fix && pnpm typecheck
エラーが見つかった場合は、タスク完了前に修正します。
エラーリカバリ
| エラー | リカバリ |
|---|---|
| 著者未検出 | content/authors/ 内の利用可能な著者一覧を表示 |
| 不足フィールドなし | ユーザーに通知し、特定フィールドの更新を提案 |
| WebSearch失敗 | 代替クエリパターンを試行 |
| ユーザーによる変更拒否 | 編集またはキャンセルを許可 |
| 情報が見つからない | フィールドを "(見つかりませんでした)" としてマーク、他のフィールドは続行 |
品質チェックリスト
保存前に以下を確認:
- 著者ファイルが
content/authors/に存在する - 空/不足フィールドのみ更新している
- Bioは1〜2文、プロフェッショナルなトーン
- アバターURLが有効(GitHub形式を優先)
- ソーシャルリンクハンドルはユーザー名のみ(URLを含まない)
- 既存の空でない値が保持されている
- ユーザーが明示的に変更を承認した