
Procedure Extractor
- 4 installs
- Updated July 30, 2026
- naoterumaker/manabi-skills
Helps with ai & agent building tasks.
About
procedure-extractor is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.
- procedure-extractor
- AI & Agent Building
- AI-coding skill
Procedure Extractor by the numbers
- 4 all-time installs (skills.sh)
- Ranked #13,372 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/naoterumaker/manabi-skills --skill procedure-extractorAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 4 |
|---|---|
| Last updated | July 30, 2026 |
| Repository | naoterumaker/manabi-skills ↗ |
What it does
Helps with ai & agent building tasks.
Files
Procedure Extractor
推奨実行モデル & 並列化
モデル: sonnet 必須(opusはコスト3-5倍。精度差は小さい) haiku禁止: 手順の意味的な紐付けにはsonnet以上が必要
並列化: 章をN分割してN Agent並列起動
| 章数 | 推奨並列度 | 各Agent担当章数 |
|---|---|---|
| ~12章 | 2 Agent | 6章ずつ |
| ~24章 | 4 Agent | 6章ずつ |
| ~36章 | 4-6 Agent | 6-9章ずつ |
| 36章+ | 6 Agent | 6-10章ずつ |
Agent起動テンプレート:
Agent(
model: "sonnet",
mode: "bypassPermissions",
run_in_background: true,
prompt: "Process chapters NN-NN of [bundle_path]..."
)注意: visual-indexerは画像を全Read するため最もコスト重い。必ずsonnet+並列。opusで全章順次は禁じ手。
前提: visual-indexerが完了していること。procedure-extractorはvisual-index.jsonのフレーム情報を参照して手順とスクショを紐付ける。
---
WHAT
講座トランスクリプトからUIウォークスルー・操作手順を抽出し、visual-indexerが分類したスクリーンショットと紐付けて procedures.json を生成する。
WHY
- 講座動画には「概念の説明」と「操作の実演」が混在している
- concept-extractorは概念・定義・名言を抽出するが、操作手順は対象外
- 手順はスクリーンショットと紐付けることで初めて再現可能になる
- 本スキルはマルチモーダル(スクショを実際に読む)である点がconcept-extractorと異なる
concept-extractorとの境界
| 対象 | 担当スキル | 例 |
|---|---|---|
| 概念・定義・理論 | concept-extractor | 「壁打ちとは〜」 |
| 名言・引用 | concept-extractor | 「AIは道具です」 |
| 画面操作・設定手順 | procedure-extractor | 「ここをクリックして〜」 |
| ツール操作のデモ | procedure-extractor | 「noteで検索欄に入力して〜」 |
---
入力の優先順位
| 優先度 | ソース | 用途 |
|---|---|---|
| 1 | chapters/{id}/manual.md | 手順の文脈理解(編集済みで構造化されている) |
| 2 | chapters/{id}/transcript.txt | 手順の詳細(操作の言い回しが残っている) |
| 3 | chapters/{id}/visual-index.json | スクショ紐付け(必須) |
| 4 | resources-manifest.json | リソース参照の紐付け |
マニュアルとトランスクリプトの両方を読むのがベスト。 マニュアルで手順の構造を把握し、トランスクリプトで具体的な操作の言い回しを拾う。
---
BLOCKER gates
以下を満たさない場合は処理を中断し、ユーザーに報告する。
| Gate | チェック内容 | 中断時メッセージ |
|---|---|---|
| B1 | manifest.jsonが存在する | manifest.jsonが見つかりません。course-bundleを先に実行してください。 |
| B2 | 対象チャプターのvisual-index.jsonが存在する | visual-index.jsonが見つかりません。visual-indexerを先に実行してください。 |
| B3 | 対象チャプターのtranscript.txtが存在する | transcript.txtが見つかりません。 |
---
処理フロー
1. manifest.json を読む
2. 対象チャプターの visual-index.json を読む ← BLOCKER B2
3. 対象チャプターの transcript.txt を読む ← BLOCKER B3
4. 対象チャプターの manual.md があれば読む(構造化済みマニュアル)
5. transcript_ts.json があれば読む(タイムスタンプ付きセグメント)
6. resources-manifest.json があれば読む(リソース参照用)
7. トランスクリプト(+マニュアル)から手順的言語パターンをスキャン
8. 関連するアクションをprocedureにグルーピング
9. 各ステップをスクリーンショットと紐付け(→ Screenshot Correlation)
10. 各ステップのリソース参照を紐付け(→ リソース参照の紐付け)
11. procedures.json を生成
12. 自己検証を実行---
Step 5: 手順的言語パターンの検出
トランスクリプトから以下のパターンを検出する。詳細は references/visual-correlation.md を参照。
アクション動詞パターン
| カテゴリ | パターン例 |
|---|---|
| クリック系 | クリック、タップ、押す、押して、ポチッと |
| 入力系 | 入力、入れて、打って、書いて、貼り付け |
| 選択系 | 選択、選んで、チェック、オン/オフ |
| 移動系 | 開く、アクセス、移動、飛んで、遷移 |
| 設定系 | 設定、変更、切り替え、オンにして |
| 指示語+動詞 | 「ここを〜」「この画面で〜」「こちらの〜」 |
グルーピングルール
| NG | OK | 理由 |
|---|---|---|
| 1つの巨大procedure(20ステップ) | 5-8ステップの小さなprocedureに分割 | 長い手順は理解しにくい |
| 概念説明を手順として抽出 | 明確なアクション(動詞+対象)のみ抽出 | 概念はconcept-extractorの領域 |
| 文脈なしにステップを列挙 | titleとoutcomeで手順の目的を明示 | 手順だけでは「何のために」がわからない |
| リソース参照を無視してaction文だけ記録 | resource_refで外部リソースを紐付け | スキル化時にリソースをassets/に含められる |
| マニュアルがあるのにトランスクリプトだけから抽出 | マニュアル+トランスクリプト両方を活用 | マニュアルは構造化済みで手順の把握が容易 |
分割の目安:
- 画面が変わるタイミング
- 目的が変わるタイミング(「検索する」→「購入する」)
- 8ステップを超えたら分割を検討
---
Step 7: Screenshot Correlation
スクリーンショットとの紐付けロジック。
紐付けフロー
1. transcript_ts.json からアクション動詞の出現タイムスタンプを特定
2. visual-index.json で該当タイムスタンプ付近のフレームを検索
- 対象: type が browser_screenshot または terminal_screenshot のフレーム
- 範囲: アクション前後 ±5秒
3. 候補フレームを Read ツールで実際に読み、内容を確認
4. トランスクリプトの操作内容と画面内容が一致するフレームを screenshot_ref に設定紐付けルール
| NG | OK | 理由 |
|---|---|---|
| screenshot_refに存在しないファイルを指定 | visual-indexから実在するフレームのみ参照 | 壊れた参照はスキル合成時にエラーになる |
| 全ステップにscreenshot_refを強制 | スクショなしのステップは screenshot_ref: null | すべてのアクションに画面があるわけではない |
| 1枚のスクショを無理に1ステップに限定 | 複数ステップが同一スクショを参照してもよい | 同じ画面での連続操作は自然 |
| タイムスタンプだけで機械的にマッチ | 画像の中身を実際に読んで確認 | タイムスタンプのずれは頻繁に発生する |
transcript_ts.json がない場合
タイムスタンプ情報がない場合は以下で代替する: 1. トランスクリプト内の位置(先頭からの割合)でチャプター全体の時間軸を推定 2. visual-index.json のフレーム順序と照合 3. 画像内容を実際に読んで、トランスクリプトの文脈と照合
---
Step 10: リソース参照の紐付け
手順内で外部リソースを使用するステップには resource_ref を設定する。
検知パターン
- 「Notionからコピー」「テンプレートを使って」「PDFを参照」
- 「ここにあるプロンプトを」「ダウンロードして」
紐付け方法
1. resources-manifest.json を読む 2. 手順内のリソース言及を検知 3. manifest内の該当リソースとマッチング 4. resource_ref にパスを設定(マッチしない場合は null)
---
出力フォーマット: procedures.json
チャプターごとに procedures.json を生成する。
{
"chapter_id": "06",
"procedures": [
{
"id": "p06-01",
"title": "noteでプロンプトを検索する方法",
"steps": [
{ "step": 1, "action": "NotionからPredictionXプロンプトをコピー", "screenshot_ref": "frame_011.jpg", "resource_ref": "prompts/prediction-x.md" },
{ "step": 2, "action": "note.comにアクセス", "screenshot_ref": "frame_012.jpg", "resource_ref": null },
{ "step": 3, "action": "検索欄に「プロンプト」と入力", "screenshot_ref": "frame_013.jpg", "resource_ref": null },
{ "step": 4, "action": "有料のみフィルタを選択", "screenshot_ref": "frame_014.jpg", "resource_ref": null }
],
"outcome": "有料のプロンプト一覧が表示される",
"tags": ["note", "プロンプト検索", "壁打ち"],
"prerequisites": ["c03-02"],
"difficulty": "beginner"
}
]
}フィールド仕様
| フィールド | 必須 | 説明 |
|---|---|---|
| chapter_id | Yes | チャプター番号(manifest.jsonと一致) |
| procedures[].id | Yes | p{chapter_id}-{連番} 形式 |
| procedures[].title | Yes | 手順の目的を表す簡潔なタイトル |
| procedures[].steps[].step | Yes | ステップ番号(1始まり) |
| procedures[].steps[].action | Yes | 具体的な操作内容 |
| procedures[].steps[].screenshot_ref | Yes | フレームファイル名 or null |
| procedures[].steps[].resource_ref | No | リソースファイルパス or null(resources-manifest.jsonと対応) |
| procedures[].outcome | Yes | この手順を完了すると何が起きるか |
| procedures[].tags | Yes | 具体的なタグ(ツール名・機能名) |
| procedures[].prerequisites | No | 前提となるconcept ID(c{xx}-{yy}形式) |
| procedures[].difficulty | Yes | beginner / intermediate / advanced |
difficulty 判定基準
| レベル | 基準 |
|---|---|
| beginner | 1画面で完結、特別な知識不要 |
| intermediate | 複数画面遷移、設定項目の理解が必要 |
| advanced | 外部連携、API設定、条件分岐あり |
---
Step 9: 自己検証
生成後に以下をすべてチェックする。1つでも失敗したら修正する。
- [ ] 各procedureに明確なtitleとoutcomeがあるか
- [ ] screenshot_refが全てvisual-index.jsonに存在するフレームを指しているか
- [ ] stepsの順序が論理的か(前提なしに後段のステップが来ていないか)
- [ ] tagsが具体的か(「その他」のような曖昧タグがないか)
- [ ] 概念的な内容が混入していないか(それはconcept-extractorの仕事)
- [ ] 1つのprocedureが8ステップ以下か
- [ ] procedures.jsonが
schemas/procedures.schema.jsonに準拠しているか - [ ] 全screenshot_refのファイルが実際に存在するか(Bashで確認)
- [ ] resource_refが設定されたステップのパスがresources-manifest.jsonに存在するか
- [ ] マニュアルがある章でマニュアルを参照したか
screenshot_ref 検証コマンド
# procedures.jsonから全screenshot_refを抽出し、存在チェック
jq -r '.procedures[].steps[].screenshot_ref // empty' procedures.json | while read f; do
[ -f "$FRAMES_DIR/$f" ] || echo "MISSING: $f"
done---
ユーザーへの提示
処理完了後、以下の形式で報告する:
## 手順抽出完了: Chapter {id}
- 抽出数: {n} procedures, {m} total steps
- スクショ紐付け: {linked}/{total} steps にスクショあり
- 難易度分布: beginner={b}, intermediate={i}, advanced={a}
### 抽出した手順一覧
| ID | タイトル | ステップ数 | スクショ数 |
|----|---------|----------|----------|
| p{id}-01 | ... | 5 | 3 |
| p{id}-02 | ... | 4 | 4 |
出力先: {path}/procedures.json---
このスキルがやらないこと
| やらないこと | 理由 | 代わりに使うスキル |
|---|---|---|
| 概念・定義の抽出 | テキストのみの作業 | concept-extractor |
| 動画のフレーム切り出し | 前処理 | video-to-frames |
| スクショの分類・インデックス作成 | 前処理 | visual-indexer |
| 動画ダウンロード | 前処理 | video-downloader |
| マニュアル文書の生成 | 後工程 | (別スキル) |
Visual Correlation ガイド
トランスクリプトのアクション記述とスクリーンショットを紐付けるための詳細ガイド。
---
1. アクション動詞パターン(日本語)
トランスクリプトから手順を検出する際に使うパターン。
クリック・タップ系
| パターン | 例文 |
|---|---|
| クリック | 「ここをクリックします」 |
| タップ | 「タップしてください」 |
| 押す / 押して | 「このボタンを押して」 |
| ポチッと | 「ポチッと押すだけ」 |
| ダブルクリック | 「ダブルクリックで開きます」 |
入力・記述系
| パターン | 例文 |
|---|---|
| 入力 | 「ここに入力してください」 |
| 入れて / 入れる | 「キーワードを入れて」 |
| 打って / 打つ | 「URLを打ってください」 |
| 書いて / 書く | 「名前を書いてください」 |
| 貼り付け / ペースト | 「コピーして貼り付けて」 |
| コピー | 「このURLをコピーします」 |
選択・チェック系
| パターン | 例文 |
|---|---|
| 選択 / 選んで | 「こちらを選択してください」 |
| チェック | 「チェックを入れて」 |
| オン / オフ | 「ここをオンにします」 |
| 切り替え / トグル | 「トグルを切り替えて」 |
| ドロップダウン | 「ドロップダウンから選んで」 |
移動・遷移系
| パターン | 例文 |
|---|---|
| 開く / 開いて | 「設定画面を開いてください」 |
| アクセス | 「このURLにアクセスします」 |
| 移動 / 行って | 「次のページに移動します」 |
| 飛んで / 飛ぶ | 「リンクに飛んでください」 |
| 遷移 | 「画面が遷移します」 |
| 戻って / 戻る | 「前の画面に戻ります」 |
| スクロール | 「下にスクロールして」 |
設定・変更系
| パターン | 例文 |
|---|---|
| 設定 | 「以下のように設定します」 |
| 変更 | 「名前を変更してください」 |
| 登録 | 「情報を登録します」 |
| 保存 | 「保存ボタンを押します」 |
| 削除 | 「不要なものを削除して」 |
| 更新 | 「ページを更新します」 |
指示語+動詞(高確率で画面操作)
| パターン | 理由 |
|---|---|
| 「ここを〜」 | 画面上の特定箇所を指している |
| 「この画面で〜」 | 現在表示中の画面を参照 |
| 「こちらの〜」 | 画面上の要素を指示 |
| 「右上の〜」「左下の〜」 | 画面位置の指定 |
| 「赤い(青い)ボタン〜」 | UI要素の視覚的特徴 |
---
2. タイムスタンプの推定
transcript_ts.json がある場合
transcript_ts.json にはセグメントごとのタイムスタンプがある:
[
{ "start": 120.5, "end": 125.3, "text": "ここをクリックしてください" },
{ "start": 125.3, "end": 130.1, "text": "次に検索欄に入力します" }
]アクション動詞が含まれるセグメントの start を基準に、visual-index.json のフレームを検索する。
transcript_ts.json がない場合
位置ベースの推定を使う:
推定タイムスタンプ = (アクション出現位置 / トランスクリプト全文字数) × チャプター総時間チャプター総時間は manifest.json の duration、または visual-index.json の最後のフレームのタイムスタンプから推定する。
精度は低いため、候補を広めに(±15秒)取り、画像内容で最終判断する。
---
3. フレームとのマッチング
visual-index.json のフレーム構造
{
"frame": "frame_012.jpg",
"timestamp": 123.4,
"type": "browser_screenshot",
"description": "noteの検索画面"
}マッチング手順
1. タイムスタンプで候補を絞る: アクションのタイムスタンプ ±5秒(ts.jsonなしなら±15秒)のフレームを候補にする 2. typeでフィルタ: browser_screenshot または terminal_screenshot を優先。talking_head や slide は手順には使わない 3. 画像を実際に読む: Read ツールで候補フレームを表示し、内容を確認する 4. 照合判断: トランスクリプトの操作内容と画像内容が一致するか判断する
照合の判断基準
| 一致と判断する場合 | 不一致と判断する場合 |
|---|---|
| 「noteの検索画面」→ 画像にnoteのUIが映っている | 「noteの検索画面」→ 画像はスライド資料 |
| 「入力して」→ テキスト入力欄がアクティブ | 「入力して」→ 結果一覧画面 |
| 「クリック」→ 操作前の画面(これからクリックする対象が見える) | 「クリック」→ 全く別の画面 |
原則: screenshot_ref は「操作を行う直前の画面」または「操作中の画面」のフレームを指す。「操作後の結果画面」はそのステップではなく、次のステップや outcome の参考にする。
---
4. エッジケース
4.1 複数ステップが同一スクリーンショットを共有
同じ画面内で複数の操作を行う場合(例: フォームの複数フィールドに入力)、同じ screenshot_ref を複数ステップで参照してよい。
{ "step": 1, "action": "名前欄に入力", "screenshot_ref": "frame_020.jpg" },
{ "step": 2, "action": "メール欄に入力", "screenshot_ref": "frame_020.jpg" },
{ "step": 3, "action": "送信ボタンをクリック", "screenshot_ref": "frame_020.jpg" }4.2 スクリーンショットがないステップ
口頭での説明のみで画面操作がない、またはカメラが講師を映しているときは null にする。
{ "step": 2, "action": "別タブでGmailを開く", "screenshot_ref": null }無理にスクショを付けない。存在しないファイルを参照するよりは null のほうが安全。
4.3 手順が複数チャプターにまたがる
1つの操作手順が2つのチャプターにまたがる場合:
- 各チャプターで独立した procedure として記録する
- 前チャプターの procedure を prerequisites に含める
- title に「(続き)」等を付けて関連を示す
{
"id": "p07-01",
"title": "LINE公式アカウントの設定(続き: メッセージ配信設定)",
"prerequisites": ["p06-03"],
...
}注意: prerequisites の形式は concept ID (c{xx}-{yy}) だが、procedure 間の依存は title と tags で表現する。スキーマ上 prerequisites は concept への参照に限定されている。
4.4 スクリーンショットの画質が悪い / 判読不能
画像を読んでも内容が判別できない場合は screenshot_ref: null にし、action の記述をより詳細にする。
4.5 同一タイムスタンプに複数フレーム
visual-index.json で同タイムスタンプに複数フレームがある場合は、type が browser_screenshot / terminal_screenshot のものを優先し、さらに description がトランスクリプトの文脈に近いものを選ぶ。
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "procedures.schema.json",
"title": "Procedures",
"description": "チャプターごとのUIウォークスルー・操作手順の定義",
"type": "object",
"required": ["chapter_id", "procedures"],
"properties": {
"chapter_id": {
"type": "string",
"description": "チャプター番号(例: \"06\")",
"pattern": "^[0-9]{2}$"
},
"procedures": {
"type": "array",
"items": {
"$ref": "#/$defs/procedure"
}
}
},
"additionalProperties": false,
"$defs": {
"procedure": {
"type": "object",
"required": ["id", "title", "steps", "outcome", "tags", "difficulty"],
"properties": {
"id": {
"type": "string",
"description": "手順ID。p{chapter_id}-{連番} 形式",
"pattern": "^p[0-9]{2}-[0-9]{2}$"
},
"title": {
"type": "string",
"description": "手順の目的を表す簡潔なタイトル",
"minLength": 1
},
"steps": {
"type": "array",
"items": {
"$ref": "#/$defs/step"
},
"minItems": 1,
"maxItems": 8
},
"outcome": {
"type": "string",
"description": "この手順を完了すると何が起きるか",
"minLength": 1
},
"tags": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"minItems": 1,
"description": "具体的なタグ(ツール名・機能名)"
},
"prerequisites": {
"type": "array",
"items": {
"type": "string",
"pattern": "^c[0-9]{2}-[0-9]{2}$"
},
"description": "前提となるconcept ID"
},
"difficulty": {
"type": "string",
"enum": ["beginner", "intermediate", "advanced"],
"description": "難易度レベル"
}
},
"additionalProperties": false
},
"step": {
"type": "object",
"required": ["step", "action", "screenshot_ref"],
"properties": {
"step": {
"type": "integer",
"minimum": 1,
"description": "ステップ番号(1始まり)"
},
"action": {
"type": "string",
"description": "具体的な操作内容",
"minLength": 1
},
"screenshot_ref": {
"type": ["string", "null"],
"description": "対応するフレームファイル名。スクショなしの場合はnull"
},
"resource_ref": {
"type": ["string", "null"],
"description": "外部リソースファイルパス(resources-manifest.jsonと対応)。リソース参照なしの場合はnull"
}
},
"additionalProperties": false
}
}
}