mcpField
A
asciinema-analyzer

asciinema-analyzer

github.com/terrylicaデータ・データベース2126 回インストール1 日前に更新
リポジトリ

asciinema-analyzer について

変換済み asciinema .txt 録画を分析する Claude Code 向けスキルです。ripgrep によるキーワード検索を基本とし、YAKE による語句抽出や TF-IDF によるトピック分析も選択でき、ファイルや分析方法、レポート形式の選択を案内します。

主な機能

  1. 01ripgrep による指定語句の検索
  2. 02オプションの YAKE による語句抽出
  3. 03オプションの TF-IDF トピック分析
  4. 04セクションごとのキーワード密度分析
  5. 05ファイルとレポート形式の選択案内

活用シーン

  1. 01セッション記録からコマンドやエラーを探す
  2. 02変換済み録画からテーマを抽出
  3. 03キーワードが集中する記録箇所を特定
  4. 04録画内容の分析レポートを作成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/terrylica/cc-skills --skill asciinema-analyzer

インストール後、Claude Code で/asciinema-analyzerを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
analysis-tiers.md
domain-keywords.md
evolution-log.md

詳細

asciinema-analyzer

Claude Code で使用するために、変換済みの .txt 録画を意味的に分析します。段階的な分析を使用します:ripgrep(主要、50-200ms)-> YAKE(副次、1-5s)-> TF-IDF(任意)。

プラットフォーム:macOS、Linux(ripgrep が必要、YAKE は任意)

自己進化型スキル:このスキルは使用を通じて改善されます。指示が誤っている、パラメーターが変化している、または回避策が必要になった場合は、先延ばしにせず、すぐにこのファイルを修正してください。実際に再現できる問題がある場合にのみ更新してください。

このスキルを使用するタイミング

次の場合にこのスキルを使用してください:

  • 変換済みの録画からキーワードやパターンを検索する
  • セッションのトランスクリプトからトピックやテーマを抽出する
  • セッション履歴から特定のコマンドやエラーを見つける
  • 録画内の予期しない用語を自動検出する
  • ドキュメント作成やレビューのためにセッションの内容を分析する

分析レベル

レベルツール速度(4MB)使用するタイミング
1ripgrep50-200ms常にここから開始(厳選キーワード)
2YAKE1-5s予期しない用語を自動検出する場合
3TF-IDF5-30sトピックモデリング(任意)

判断:レベル 1(ripgrep + 厳選キーワード)から開始します。レベル 2(YAKE)は、自動検出が明示的に求められた場合にのみ使用してください。


要件

コンポーネント必須インストール方法備考
ripgrepはいbrew install ripgrep主要な検索ツール
YAKE任意uv run --with yake自動検出レベル用

ワークフローのフェーズ(すべて必須)

重要:すべてのフェーズが必須です。フェーズを省略しないでください。各判断ポイントで AskUserQuestion を必ず使用してください。

フェーズ 0:事前チェック

目的:入力ファイルの存在を確認し、.txt(変換済み)形式かどうかを確認します。

/usr/bin/env bash << 'PREFLIGHT_EOF'
INPUT_FILE="${1:-}"

if [[ -z "$INPUT_FILE" ]]; then
  echo "NO_FILE_PROVIDED"
elif [[ ! -f "$INPUT_FILE" ]]; then
  echo "FILE_NOT_FOUND: $INPUT_FILE"
elif [[ "$INPUT_FILE" == *.cast ]]; then
  echo "WRONG_FORMAT: Convert to .txt first with /asciinema-tools:convert"
elif [[ "$INPUT_FILE" == *.txt ]]; then
  SIZE=$(ls -lh "$INPUT_FILE" | awk '{print $5}')
  LINES=$(wc -l < "$INPUT_FILE" | tr -d ' ')
  echo "READY: $INPUT_FILE ($SIZE, $LINES lines)"
else
  echo "UNKNOWN_FORMAT: Expected .txt file"
fi
PREFLIGHT_EOF

.txt ファイルが見つからない場合は、まず /asciinema-tools:convert の実行を提案してください。


フェーズ 1:ファイル選択(必須)

目的:.txt ファイルを見つけ、分析するファイルをユーザーに選択してもらいます。

ステップ 1.1:.txt ファイルを見つける
/usr/bin/env bash << 'DISCOVER_TXT_EOF'
# Find .txt files that look like converted recordings
for file in $(fd -e txt . --max-depth 3 2>/dev/null | head -10); do
  SIZE=$(ls -lh "$file" 2>/dev/null | awk '{print $5}')
  LINES=$(wc -l < "$file" 2>/dev/null | tr -d ' ')
  BASENAME=$(basename "$file")
  echo "FILE:$file|SIZE:$SIZE|LINES:$LINES|NAME:$BASENAME"
done
DISCOVER_TXT_EOF
ステップ 1.2:ファイル選択を提示する(AskUserQuestion 必須)
Question: "Which file would you like to analyze?"
Header: "File"
Options:
  - Label: "{filename}.txt ({size})"
    Description: "{line_count} lines"
  - Label: "{filename2}.txt ({size2})"
    Description: "{line_count2} lines"
  - Label: "Enter path"
    Description: "Provide a custom path to a .txt file"
  - Label: "Convert first"
    Description: "Run /asciinema-tools:convert before analysis"

フェーズ 2:分析タイプ(必須)

目的:分析の詳細度をユーザーに選択してもらいます。

Question: "What type of analysis do you need?"
Header: "Type"
Options:
  - Label: "Curated keywords (Recommended)"
    Description: "Fast search (50-200ms) with domain-specific keyword sets"
  - Label: "Auto-discover keywords"
    Description: "YAKE unsupervised extraction (1-5s) - finds unexpected patterns"
  - Label: "Full analysis"
    Description: "Both curated + auto-discovery for comprehensive results"
  - Label: "Density analysis"
    Description: "Find high-concentration sections (peak activity windows)"

フェーズ 3:ドメイン選択(必須)

目的:検索するキーワードのドメインをユーザーに選択してもらいます。

Question: "Which domain keywords to search?"
Header: "Domain"
multiSelect: true
Options:
  - Label: "Trading/Quantitative"
    Description: "sharpe, sortino, calmar, backtest, drawdown, pnl, cagr, alpha, beta"
  - Label: "ML/AI"
    Description: "epoch, loss, accuracy, sota, training, model, validation, inference"
  - Label: "Development"
    Description: "iteration, refactor, fix, test, deploy, build, commit, merge"
  - Label: "Claude Code"
    Description: "Skill, TodoWrite, Read, Edit, Bash, Grep, iteration complete"

キーワードの一覧については、ドメインキーワードリファレンスを参照してください。


フェーズ 4:厳選キーワードによる分析を実行する

目的:選択されたドメインのキーワードを Grep で検索します。

ステップ 4.1:トレーディングドメイン
/usr/bin/env bash << 'TRADING_EOF'
INPUT_FILE="${1:?}"
echo "=== Trading/Quantitative Keywords ==="

KEYWORDS="sharpe sortino calmar backtest drawdown pnl cagr alpha beta roi volatility"
for kw in $KEYWORDS; do
  COUNT=$(rg -c -i "$kw" "$INPUT_FILE" 2>/dev/null || echo "0")
  if [[ "$COUNT" -gt 0 ]]; then
    echo "  $kw: $COUNT"
  fi
done
TRADING_EOF
ステップ 4.2:ML/AI ドメイン
/usr/bin/env bash << 'ML_EOF'
INPUT_FILE="${1:?}"
echo "=== ML/AI Keywords ==="

KEYWORDS="epoch loss accuracy sota training model validation inference tensor gradient"
for kw in $KEYWORDS; do
  COUNT=$(rg -c -i "$kw" "$INPUT_FILE" 2>/dev/null || echo "0")
  if [[ "$COUNT" -gt 0 ]]; then
    echo "  $kw: $COUNT"
  fi
done
ML_EOF
ステップ 4.3:開発ドメイン
/usr/bin/env bash << 'DEV_EOF'
INPUT_FILE="${1:?}"
echo "=== Development Keywords ==="

KEYWORDS="iteration refactor fix test deploy build commit merge debug error"
for kw in $KEYWORDS; do
  COUNT=$(rg -c -i "$kw" "$INPUT_FILE" 2>/dev/null || echo "0")
  if [[ "$COUNT" -gt 0 ]]; then
    echo "  $kw: $COUNT"
  fi
done
DEV_EOF
ステップ 4.4:Claude Code ドメイン
/usr/bin/env bash << 'CLAUDE_EOF'
INPUT_FILE="${1:?}"
echo "=== Claude Code Keywords ==="

KEYWORDS="Skill TodoWrite Read Edit Bash Grep Write"
for kw in $KEYWORDS; do
  COUNT=$(rg -c "$kw" "$INPUT_FILE" 2>/dev/null || echo "0")
  if [[ "$COUNT" -gt 0 ]]; then
    echo "  $kw: $COUNT"
  fi
done

# Special patterns
ITERATION=$(rg -c "iteration complete" "$INPUT_FILE" 2>/dev/null || echo "0")
echo "  'iteration complete': $ITERATION"
CLAUDE_EOF

フェーズ 5:YAKE による自動検出(選択された場合)

目的:教師なしのキーワード抽出を実行します。

/usr/bin/env bash << 'YAKE_EOF'
INPUT_FILE="${1:?}"
echo "=== Auto-discovered Keywords (YAKE) ==="

uv run --with yake python3 -c "
import yake

kw = yake.KeywordExtractor(
    lan='en',
    n=2,           # bi-grams
    dedupLim=0.9,  # dedup threshold
    top=20         # top keywords
)

with open('$INPUT_FILE') as f:
    text = f.read()

keywords = kw.extract_keywords(text)
for score, keyword in keywords:
    print(f'{score:.4f}  {keyword}')
"
YAKE_EOF

フェーズ 6:密度分析(選択された場合)

目的:キーワードの密度が最も高いセクションを見つけます。

/usr/bin/env bash << 'DENSITY_EOF'
INPUT_FILE="${1:?}"
KEYWORD="${2:-sharpe}"
WINDOW_SIZE=100  # lines

echo "=== Density Analysis: '$KEYWORD' ==="
echo "Window size: $WINDOW_SIZE lines"
echo ""

TOTAL_LINES=$(wc -l < "$INPUT_FILE" | tr -d ' ')
TOTAL_MATCHES=$(rg -c -i "$KEYWORD" "$INPUT_FILE" 2>/dev/null || echo "0")

echo "Total matches: $TOTAL_MATCHES in $TOTAL_LINES lines"
echo "Overall density: $(echo "scale=4; $TOTAL_MATCHES / $TOTAL_LINES * 1000" | bc) per 1000 lines"
echo ""

# Find peak windows
echo "Top 5 densest windows:"
awk -v ws="$WINDOW_SIZE" -v kw="$KEYWORD" '
BEGIN { IGNORECASE=1 }
{
  lines[NR] = $0
  if (tolower($0) ~ tolower(kw)) matches[NR] = 1
}
END {
  for (start = 1; start <= NR - ws; start += ws/2) {
    count = 0
    for (i = start; i < start + ws && i <= NR; i++) {
      if (matches[i]) count++
    }
    if (count > 0) {
      printf "Lines %d-%d: %d matches (%.1f per 100)\n", start, start+ws-1, count, count*100/ws
    }
  }
}
' "$INPUT_FILE" | sort -t: -k2 -rn | head -5
DENSITY_EOF

フェーズ 7:レポート形式(必須)

目的:出力形式をユーザーに選択してもらいます。

Question: "How should results be presented?"
Header: "Output"
Options:
  - Label: "Summary table (Recommended)"
    Description: "Keyword counts + top 5 peak sections"
  - Label: "Detailed report"
    Description: "Full analysis with timestamps and surrounding context"
  - Label: "JSON export"
    Description: "Machine-readable output for further processing"
  - Label: "Markdown report"
    Description: "Save formatted report to file"

フェーズ 8:フォローアップアクション(必須)

目的:次のアクションをユーザーに案内します。

Question: "Analysis complete. What's next?"
Header: "Next"
Options:
  - Label: "Jump to peak section"
    Description: "Read the highest-density section in the file"
  - Label: "Search for specific keyword"
    Description: "Grep for a custom term with context"
  - Label: "Cross-reference with .cast"
    Description: "Map findings back to original timestamps"
  - Label: "Done"
    Description: "Exit - no further action needed"

TodoWrite タスクテンプレート

1. [Preflight] Check input file exists and is .txt format
2. [Preflight] Suggest /convert if .cast file provided
3. [Discovery] Find .txt files with line counts
4. [Selection] AskUserQuestion: file to analyze
5. [Type] AskUserQuestion: analysis type (curated/auto/full/density)
6. [Domain] AskUserQuestion: keyword domains (multi-select)
7. [Curated] Run Grep searches for selected domains
8. [Auto] Run YAKE if auto-discovery selected
9. [Density] Calculate density windows if requested
10. [Format] AskUserQuestion: report format
11. [Next] AskUserQuestion: follow-up actions

変更後のチェックリスト

このスキルを変更した後は、次の項目を確認してください:

  1. すべての bash ブロックで heredoc ラッパーを使用している
  2. 厳選キーワードが references/domain-keywords.md の内容と一致している
  3. 分析レベルが references/analysis-tiers.md の内容と一致している
  4. YAKE の呼び出しで uv run --with yake を使用している
  5. AskUserQuestion を使用するすべてのフェーズが含まれている
  6. TodoWrite テンプレートが実際のワークフローと一致している

リファレンスドキュメント


トラブルシューティング

問題原因解決策
"WRONG_FORMAT" エラー.cast ファイルが指定されていますまず /asciinema-tools:convert を実行して .txt を作成します
ripgrep が見つかりませんインストールされていませんbrew install ripgrep
YAKE のインポートエラーパッケージがインストールされていませんuv run --with yake が自動的に処理します
キーワードが見つかりませんドメインの選択が間違っています別のドメインまたは自動検出モードを試してください
密度分析の結果が空ですキーワードがファイルにありませんまずキュレーション検索を使って有効なキーワードを見つけてください
YAKE に対してファイルが大きすぎますメモリの制約大きなファイルには Tier 1(ripgrep)のみを使ってください
すべてのドメインで一致がありませんファイルがバイナリまたは破損していますfile コマンドでファイルがプレーンテキストであることを確認してください
fd コマンドが見つかりませんインストールされていませんbrew install fd を実行するか、代わりに find を使ってください

実行後の振り返り

このスキルの実行が完了したら、タスクを終了する前に振り返ってください。

  1. 現在地を確認します。 — 編集する前に、この SKILL.md の正式なパスを確認します。
  2. 何が失敗しましたか? — 原因となった指示を修正します。
  3. 予想以上にうまくいったことは何ですか? — 推奨されるプラクティスとして取り入れます。
  4. 何が現状とずれましたか? — 現実と一致しなくなったスクリプト、リファレンス、依存関係を修正します。
  5. 記録します。 — きっかけ、修正、根拠を含む進化ログのエントリーを追加します。

先送りしないでください。次回の実行では、あなたが残した状態が引き継がれます。

コメント