
Suggest Agent Rules
- 378 installs
- 3 repo stars
- Updated January 23, 2026
- dotneet/claude-code-marketplace
suggest-agent-rules is a Claude Code skill that generates tailored agent rules, constraints, and guardrails from repository context to improve Claude or Cursor behavior for developers standardizing AI coding assistants.
About
suggest-agent-rules is a Claude Code skill from dotneet/claude-code-marketplace that analyzes repository context and produces tailored agent rules, constraints, and guardrails. It helps developers codify project conventions, forbidden patterns, and workflow boundaries so Claude Code or Cursor agents follow team standards. Developers invoke it when onboarding AI assistants to an existing repo, replacing ad-hoc prompt instructions with durable rule files. The skill turns codebase signals into actionable agent configuration rather than generic best-practice lists.
- Repo-aware rule drafts
- Guardrail recommendations
- Stack-specific constraints
- Agent instruction tuning
Suggest Agent Rules by the numbers
- 378 all-time installs (skills.sh)
- Ranked #2,058 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Jul 29, 2026 (Skillselion catalog sync)
npx skills add https://github.com/dotneet/claude-code-marketplace --skill suggest-agent-rulesAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 378 |
|---|---|
| repo stars | ★ 3 |
| Last updated | January 23, 2026 |
| Repository | dotneet/claude-code-marketplace ↗ |
How do you generate agent rules from repo context?
Generate tailored agent rules, constraints, and guardrails from repo context to improve Claude or Cursor behavior.
Who is it for?
Developers configuring Claude Code or Cursor with project-specific rules derived from an existing repository.
Skip if: Runtime application security scanning, generic prompt templates without repo analysis, or non-agent CI configuration.
When should I use this skill?
A developer wants agent rules, guardrails, or Cursor constraints generated from repository structure and conventions.
What you get
Tailored agent rule files, constraint definitions, and guardrail documentation for Claude or Cursor.
- agent rule files
- guardrail definitions
- constraint documentation
Files
Suggest Agent Rules
あなたは「このリポジトリ専用のCoding Agentルール」を設計するテックリードです。 以下の情報を根拠に、エージェントが将来の作業で迷わず高品質に動けるよう、実務的で検証可能なルールを提案してください。
セッション情報へのアクセス
セッションファイルの場所
| Agent | Path | File Format |
|---|---|---|
| Claude Code | ~/.claude/projects/<project-path-encoded>/ | <UUID>.jsonl |
| Codex CLI | ~/.codex/sessions/YYYY/MM/DD/ | rollout-<datetime>-<UUID>.jsonl |
プロジェクトパスのエンコード: /Users/username/projects/myapp → -Users-username-projects-myapp
提供ツール
このスキルでは以下のツールを利用できます(tools/ディレクトリ参照):
1. list-sessions.sh - セッション一覧を取得
./tools/list-sessions.sh -p /path/to/project -n 102. analyze-session.sh - 単一セッションを詳細分析
./tools/analyze-session.sh <session-file> --allオプション: --summary, --user-messages, --tools, --errors, --preferences
3. extract-patterns.sh - 複数セッションからパターンを抽出
./tools/extract-patterns.sh -p /path/to/project -n 5セッションデータ構造の詳細
詳細は references/session-structure.md を参照。主要なポイント:
- Claude Code:
parentUuid/uuidで会話ツリーを構築、typeフィールドでuser/assistantを判別 - message.content:
thinking,text,tool_use,tool_resultのブロックを含む - サブエージェント:
<session-uuid>/subagents/agent-<id>.jsonlに保存、isSidechain: true
セッション解析で抽出すべき情報
1. ユーザーの明示的な指示・好み - 「必ず〜」「〜しないで」などのパターン 2. 繰り返し発生した手戻り - エラー→修正の連続パターン 3. よく使用されるツールとファイル - 作業パターンの把握 4. エラーパターン - tool_resultでのエラー応答
利用できる情報源(優先順)
1. Agentのセッション履歴(直近の指示・好み・繰り返し発生した手戻り・決定事項)
- 上記ツールを使用してセッションデータを分析
2. 現在のリポジトリの内容(README/CONTRIBUTING/ディレクトリ構造/設定ファイル/CI設定/テスト構成) 3. ローカルGit履歴(コミットメッセージ規約・変更頻度の高い領域・リバート/ホットフィックス傾向) 4. GitHub履歴(PR/Issue/レビューコメントの傾向、指摘が多い論点、CI落ちパターン)
ghが使えるならgh pr list/view,gh issue list/view等を用いて良い- 使えない場合はローカルで取れる範囲(git log等)で推定し、不確実性を明示する
ゴール
- “一般論”ではなく このリポジトリ固有の ルールにする
- ルールは「守れば成果が上がる」ものだけに絞り、過剰に増やさない
- すべてのルールに 根拠 と 確認方法(verify) を付ける
- 不明点は断定せず、最小の追加調査で確かめる手順を添える
---
作業手順(必ずこの順で)
1) リポジトリ概観の把握
- 主要言語/フレームワーク/ビルドツール/パッケージマネージャを推定
- ルート直下、
README/CONTRIBUTING/CODEOWNERS/Makefile/package.json/pyproject.toml/go.mod/Cargo.toml/.github/workflows等を優先して確認 - 既に「ルール」「コーディング規約」「レビュー観点」があるならそれを最優先で尊重(重複ルールは作らない)
2) 失敗パターン・手戻りパターンの抽出
- セッション履歴:繰り返し注意された点、好み(例:テスト先行、差分最小、ログ方針、命名規約)を抽出
- Git/PR/レビュー:同じ種類の指摘が複数回出る領域を優先(lint、境界条件、例外、型、N+1、依存更新、Migration等)
3) “エージェント向け”に翻訳してルール化
- 人間向け規約を、エージェントが実行できる行動(Do/Don’t)へ落とす
- ルールは次のいずれかに分類する:
- 安全(破壊的操作・秘密情報・本番影響)
- 変更方針(差分最小、リファクタ範囲、互換性、移行)
- 品質(テスト、静的解析、型、例外、境界条件)
- リポジトリ慣習(命名、ディレクトリ、レイヤー、依存、ログ)
- PR運用(粒度、説明、チェックリスト、レビュー対応)
4) ルールの優先度付け
- 最重要(Must): 破ると事故/大幅手戻りになる
- 重要(Should): 品質や速度に効く
- 任意(Could): 余裕がある時に
---
出力フォーマット(厳守)
以下の順番でMarkdownを出力してください。
A. リポジトリの前提(短く)
- 推定スタック / 実行すべき基本コマンド(分かる範囲)
- CIの主要チェック(分かる範囲)
- 不明点(あれば)
B. 観測された傾向(箇条書き・最大10個)
- セッション履歴由来 / Git由来 / PRレビュー由来 を区別して書く
C. 提案ルール(最大12個、優先度順)
各ルールは必ず次のテンプレで書く:
- [Priority: Must/Should/Could] ルール名(短く)
- Rule:(エージェントが取るべき行動を命令形で。曖昧語を避ける)
- Why (evidence):(観測された根拠。ファイル名/設定/レビュー傾向など。推測なら推測と明記)
- Verify:(実行コマンド、見るべきファイル、CIで確認、再現手順のいずれか)
- Scope:(常に/特定条件のとき。例:DB変更時、API変更時、依存更新時)
- Confidence:(High/Medium/Low)
D. “貼り付け用”の最終ルール本文
.claude/agent-rules.md等に貼れる体裁で、Cのルールを簡潔版に再掲する- 余計な解説は入れず、Do/Don’t中心にする
---
制約・禁止事項
- リポジトリで確認できないコマンドや規約を断定しない(例:存在しない
npm testを推奨しない) - 破壊的操作(reset/force push/大量削除/マイグレーション適用等)は “事前確認ルール” を必ず含める
- 秘密情報(鍵、トークン、顧客情報)を出力しない。ログや設定値を貼る場合はマスキングする
- ルール数は増やしすぎない(最大12)。必要なら「次点ルール(Optional)」として別枠にする
---
Usage
このSkillは次のタイミングで使う:
- 初回オンボーディング時
- レビュー指摘が増えたとき
- リファクタや大規模移行の前
- CI/運用ルールが変わったとき
実行後、出力の「貼り付け用ルール本文」をリポジトリの所定ファイルに反映して運用する。
Session File Structure Reference
このドキュメントはClaude CodeとCodex CLIのセッションファイル構造を説明します。
1. Claude Code
ファイル保存場所
~/.claude/projects/<project-path-encoded>/プロジェクトパスは-区切りでエンコードされます。 例: /Users/username/projects/myapp → -Users-username-projects-myapp
ファイルフォーマット
- 形式: JSONL (JSON Lines)
- ファイル名:
<UUID>.jsonlまたはagent-<hash>.jsonl - 例:
7fdbec67-bddd-4dcf-960b-14fa16a2fb44.jsonl
レコードタイプ
各行は独立したJSONオブジェクトで、typeフィールドで種類を判別。
user (ユーザーメッセージ)
{
"type": "user",
"parentUuid": null,
"uuid": "c3b9f6d5-50da-44b0-ac5b-1bb9614b724e",
"sessionId": "7fdbec67-bddd-4dcf-960b-14fa16a2fb44",
"timestamp": "2026-01-14T09:18:22.684Z",
"isSidechain": false,
"userType": "external",
"cwd": "/Users/username/projects/myapp",
"version": "2.1.7",
"gitBranch": "main",
"message": {
"role": "user",
"content": "ユーザーの入力テキスト"
},
"todos": []
}assistant (アシスタントレスポンス)
{
"type": "assistant",
"parentUuid": "c3b9f6d5-50da-44b0-ac5b-1bb9614b724e",
"uuid": "3c825d7c-eeaf-4ce6-9009-cbc22fc7990d",
"sessionId": "7fdbec67-bddd-4dcf-960b-14fa16a2fb44",
"timestamp": "2026-01-14T09:18:26.300Z",
"message": {
"model": "claude-opus-4-5-20251101",
"role": "assistant",
"content": [
{
"type": "thinking",
"thinking": "思考プロセス..."
},
{
"type": "text",
"text": "応答テキスト"
},
{
"type": "tool_use",
"id": "toolu_01GkFFLi3j5PxyAnQmRgbs3v",
"name": "Read",
"input": { "file_path": "/path/to/file" }
}
],
"usage": {
"input_tokens": 10,
"output_tokens": 155
}
}
}message.content のブロックタイプ
| タイプ | 説明 |
|---|---|
thinking | モデルの思考プロセス |
text | テキスト出力 |
tool_use | ツール呼び出し |
tool_result | ツール実行結果(userロールで返される) |
会話ツリー構造
parentUuidとuuidで会話ツリーを構築:
user (uuid: A, parentUuid: null)
└── assistant (uuid: B, parentUuid: A)
└── user (uuid: C, parentUuid: B) ← tool_result
└── assistant (uuid: D, parentUuid: C)サブエージェントデータ
サブエージェントは専用ディレクトリに保存:
~/.claude/projects/<project-path-encoded>/
├── <session-uuid>.jsonl # メインセッション
└── <session-uuid>/
└── subagents/
└── agent-<agent-id>.jsonl # サブエージェントファイルサブエージェントの特徴:
agentIdフィールドを持つisSidechain: true- 親セッションと同じ
sessionIdを共有
---
2. Codex CLI (新形式)
ファイル保存場所
~/.codex/sessions/YYYY/MM/DD/ファイルフォーマット
- 形式: JSONL
- ファイル名:
rollout-YYYY-MM-DDThh-mm-ss-<UUID>.jsonl
レコードタイプ
session_meta (セッションメタデータ)
{
"timestamp": "2026-01-15T15:42:48.449Z",
"type": "session_meta",
"payload": {
"id": "019bc252-da71-7dc3-9acb-55c6b5993c62",
"cwd": "/Users/username/projects/myapp",
"cli_version": "0.80.0",
"model_provider": "openai",
"git": {
"commit_hash": "eb88330",
"branch": "main"
}
}
}response_item (メッセージ)
{
"timestamp": "2026-01-15T15:43:38.571Z",
"type": "response_item",
"payload": {
"type": "message",
"role": "user",
"content": [{ "type": "input_text", "text": "ユーザー入力" }]
}
}function_call / function_call_output
{
"type": "response_item",
"payload": {
"type": "function_call",
"name": "shell_command",
"arguments": "{\"command\":\"ls\"}",
"call_id": "call_xxx"
}
}---
3. 比較表
| 項目 | Claude Code | Codex CLI |
|---|---|---|
| ファイル形式 | JSONL | JSONL |
| 保存場所 | ~/.claude/projects/<project>/ | ~/.codex/sessions/YYYY/MM/DD/ |
| メッセージ構造 | ネスト(content blocks) | フラット(payload) |
| 会話ツリー | parentUuid / uuid | なし(時系列順) |
| 思考プロセス | thinking content block | reasoning item |
| ツール呼び出し | tool_use / tool_result | function_call / function_call_output |
---
4. 解析のポイント
ルール提案に有用な情報
1. 繰り返しパターン: 同じツールの使用回数、同じファイルへのアクセス頻度 2. エラーと修正: tool_resultでエラーが返り、その後修正が行われたパターン 3. ユーザーの好み: 特定の指示パターン、拒否された提案 4. 作業フロー: ファイル読み取り→編集→テスト のような作業順序
抽出すべきデータ
- ユーザーの明示的な指示・好み
- 繰り返し発生した修正(手戻り)
- 使用されたツールとその結果
- プロジェクトのコンテキスト(cwd, gitBranch)
#!/bin/bash
# analyze-session.sh - セッションファイルを解析してルール提案に有用な情報を抽出
#
# Usage: ./analyze-session.sh <session-file> [OPTIONS]
# -s, --summary 概要のみ表示(デフォルト)
# -u, --user-messages ユーザーメッセージを抽出
# -t, --tools ツール使用状況を分析
# -e, --errors エラーと修正パターンを抽出
# -p, --preferences ユーザーの好み・指示パターンを抽出
# -j, --json JSON形式で出力
# -a, --all 全ての分析を実行
#
# Examples:
# ./analyze-session.sh ~/.claude/projects/-Users-xxx/session.jsonl --summary
# ./analyze-session.sh ~/.claude/projects/-Users-xxx/session.jsonl --all --json
set -euo pipefail
if [[ $# -lt 1 ]]; then
echo "Usage: $0 <session-file> [OPTIONS]" >&2
exit 1
fi
SESSION_FILE="$1"
shift
if [[ ! -f "$SESSION_FILE" ]]; then
echo "Error: Session file not found: $SESSION_FILE" >&2
exit 1
fi
# オプション解析
MODE="summary"
JSON_OUTPUT=false
ALL_MODE=false
while [[ $# -gt 0 ]]; do
case $1 in
-s|--summary) MODE="summary"; shift ;;
-u|--user-messages) MODE="user"; shift ;;
-t|--tools) MODE="tools"; shift ;;
-e|--errors) MODE="errors"; shift ;;
-p|--preferences) MODE="preferences"; shift ;;
-j|--json) JSON_OUTPUT=true; shift ;;
-a|--all) ALL_MODE=true; shift ;;
*) echo "Unknown option: $1" >&2; exit 1 ;;
esac
done
# ファイルタイプを検出
detect_file_type() {
# ファイル内にuserまたはassistantタイプのメッセージがあるか確認
if grep -q -m 1 -E '"type":"(user|assistant)"' "$SESSION_FILE" 2>/dev/null; then
echo "claude"
elif head -1 "$SESSION_FILE" | jq -e '.type == "session_meta"' > /dev/null 2>&1; then
echo "codex"
else
echo "unknown"
fi
}
FILE_TYPE=$(detect_file_type)
# Claude Codeセッションの解析
analyze_claude_summary() {
local total_lines
total_lines=$(wc -l < "$SESSION_FILE" | tr -d ' ')
local user_count
user_count=$(grep -c '"type":"user"' "$SESSION_FILE" 2>/dev/null || echo "0")
local assistant_count
assistant_count=$(grep -c '"type":"assistant"' "$SESSION_FILE" 2>/dev/null || echo "0")
local tool_uses
tool_uses=$(grep -o '"type":"tool_use"' "$SESSION_FILE" 2>/dev/null | wc -l | tr -d ' ')
# 最初と最後のタイムスタンプ
local first_ts
first_ts=$(head -10 "$SESSION_FILE" | grep '"timestamp"' | head -1 | jq -r '.timestamp // empty' 2>/dev/null || echo "N/A")
local last_ts
last_ts=$(tail -10 "$SESSION_FILE" | grep '"timestamp"' | tail -1 | jq -r '.timestamp // empty' 2>/dev/null || echo "N/A")
# プロジェクト情報
local cwd
cwd=$(head -10 "$SESSION_FILE" | grep '"cwd"' | head -1 | jq -r '.cwd // empty' 2>/dev/null || echo "N/A")
local branch
branch=$(head -10 "$SESSION_FILE" | grep '"gitBranch"' | head -1 | jq -r '.gitBranch // empty' 2>/dev/null || echo "N/A")
if [[ "$JSON_OUTPUT" == "true" ]]; then
cat << EOF
{
"file_type": "claude",
"total_records": $total_lines,
"user_messages": $user_count,
"assistant_messages": $assistant_count,
"tool_uses": $tool_uses,
"first_timestamp": "$first_ts",
"last_timestamp": "$last_ts",
"project": "$cwd",
"branch": "$branch"
}
EOF
else
echo "=== Session Summary (Claude Code) ==="
echo "File: $SESSION_FILE"
echo "Project: $cwd"
echo "Branch: $branch"
echo "Start: $first_ts"
echo "End: $last_ts"
echo ""
echo "Records: $total_lines"
echo "User messages: $user_count"
echo "Assistant messages: $assistant_count"
echo "Tool uses: $tool_uses"
fi
}
# ユーザーメッセージを抽出
extract_user_messages() {
echo "=== User Messages ==="
grep '"type":"user"' "$SESSION_FILE" | while read -r line; do
local ts
ts=$(echo "$line" | jq -r '.timestamp // "N/A"' 2>/dev/null)
local content
content=$(echo "$line" | jq -r '.message.content // ""' 2>/dev/null)
# contentが文字列の場合
if [[ -n "$content" ]] && [[ "$content" != "null" ]]; then
echo ""
echo "[$ts]"
echo "$content" | head -5
if [[ $(echo "$content" | wc -l) -gt 5 ]]; then
echo "... (truncated)"
fi
fi
done
}
# ツール使用状況を分析
analyze_tools() {
echo "=== Tool Usage Analysis ==="
# ツール名ごとの使用回数
echo ""
echo "Tool usage count:"
grep -o '"name":"[^"]*"' "$SESSION_FILE" 2>/dev/null | \
grep -v '"name":"message"' | \
sed 's/"name":"//g; s/"//g' | \
sort | uniq -c | sort -rn | head -20
# 最も読まれたファイル
echo ""
echo "Most accessed files (Read tool):"
grep '"name":"Read"' "$SESSION_FILE" 2>/dev/null | \
jq -r '.input.file_path // empty' 2>/dev/null | \
sort | uniq -c | sort -rn | head -10
# 最も編集されたファイル
echo ""
echo "Most edited files (Edit/Write tool):"
grep -E '"name":"(Edit|Write)"' "$SESSION_FILE" 2>/dev/null | \
jq -r '.input.file_path // empty' 2>/dev/null | \
sort | uniq -c | sort -rn | head -10
}
# エラーパターンを抽出
extract_errors() {
echo "=== Error Patterns ==="
# tool_resultでエラーを含むもの
echo ""
echo "Tool errors found:"
grep -i '"type":"tool_result"' "$SESSION_FILE" 2>/dev/null | \
grep -i -E '(error|failed|exception|denied|not found|permission)' | \
jq -r '.content // .text // ""' 2>/dev/null | head -20
}
# ユーザーの好みパターンを抽出
extract_preferences() {
echo "=== User Preferences & Instructions ==="
# 特定のキーワードを含むユーザーメッセージ
echo ""
echo "Explicit preferences/instructions found:"
grep '"type":"user"' "$SESSION_FILE" | while read -r line; do
local content
content=$(echo "$line" | jq -r '.message.content // ""' 2>/dev/null | tr '[:upper:]' '[:lower:]')
# 好みや指示を示すパターンをチェック
if echo "$content" | grep -q -E '(必ず|常に|always|never|しない|prefer|好み|rule|ルール|規約|convention|don.t|do not|やめて|止めて)'; then
local ts
ts=$(echo "$line" | jq -r '.timestamp // "N/A"' 2>/dev/null)
local orig_content
orig_content=$(echo "$line" | jq -r '.message.content // ""' 2>/dev/null)
echo ""
echo "[$ts]"
echo "$orig_content" | head -3
fi
done | head -50
}
# 実行
if [[ "$FILE_TYPE" == "claude" ]]; then
if [[ "$ALL_MODE" == "true" ]]; then
analyze_claude_summary
echo ""
extract_user_messages
echo ""
analyze_tools
echo ""
extract_errors
echo ""
extract_preferences
else
case "$MODE" in
summary) analyze_claude_summary ;;
user) extract_user_messages ;;
tools) analyze_tools ;;
errors) extract_errors ;;
preferences) extract_preferences ;;
esac
fi
elif [[ "$FILE_TYPE" == "codex" ]]; then
echo "Codex session analysis - Summary only"
meta=$(head -1 "$SESSION_FILE")
echo "$meta" | jq '{
id: .payload.id,
cwd: .payload.cwd,
cli_version: .payload.cli_version,
branch: .payload.git.branch
}' 2>/dev/null || echo "Failed to parse Codex session"
else
echo "Unknown session file format" >&2
exit 1
fi
#!/bin/bash
# extract-patterns.sh - 複数セッションからルール提案に有用なパターンを抽出
#
# Usage: ./extract-patterns.sh [OPTIONS]
# -p, --project <path> 特定プロジェクトのセッションを分析
# -n, --limit <num> 分析するセッション数(デフォルト: 5)
# -j, --json JSON形式で出力
#
# 出力内容:
# - 繰り返し発生したエラーパターン
# - よく使用されるツールとファイル
# - ユーザーの明示的な好み・指示
# - 手戻りパターン(エラー→修正の繰り返し)
set -euo pipefail
LIMIT=5
PROJECT=""
JSON_OUTPUT=false
CLAUDE_DIR="$HOME/.claude/projects"
while [[ $# -gt 0 ]]; do
case $1 in
-p|--project)
PROJECT="$2"
shift 2
;;
-n|--limit)
LIMIT="$2"
shift 2
;;
-j|--json)
JSON_OUTPUT=true
shift
;;
*)
echo "Unknown option: $1" >&2
exit 1
;;
esac
done
# セッションファイルを収集
collect_sessions() {
local search_dir="$CLAUDE_DIR"
if [[ -n "$PROJECT" ]]; then
local encoded_project="${PROJECT//\//-}"
search_dir="$CLAUDE_DIR/*${encoded_project}*"
fi
# shellcheck disable=SC2086 # Intentional glob expansion for search_dir
find $search_dir -maxdepth 2 -name "*.jsonl" -type f 2>/dev/null | \
grep -v '/subagents/' | \
head -n "$LIMIT"
}
SESSIONS=$(collect_sessions)
if [[ -z "$SESSIONS" ]]; then
echo "No sessions found" >&2
exit 1
fi
# 一時ファイル
TMP_DIR=$(mktemp -d)
trap 'rm -rf "$TMP_DIR"' EXIT
# 全セッションからツール使用を集計
echo "Analyzing $(echo "$SESSIONS" | wc -l | tr -d ' ') sessions..."
TOOL_COUNTS="$TMP_DIR/tool_counts.txt"
FILE_READS="$TMP_DIR/file_reads.txt"
FILE_EDITS="$TMP_DIR/file_edits.txt"
USER_PREFS="$TMP_DIR/user_prefs.txt"
ERRORS="$TMP_DIR/errors.txt"
touch "$TOOL_COUNTS" "$FILE_READS" "$FILE_EDITS" "$USER_PREFS" "$ERRORS"
for session in $SESSIONS; do
# ツール使用を集計
grep -o '"name":"[^"]*"' "$session" 2>/dev/null | \
sed 's/"name":"//g; s/"//g' >> "$TOOL_COUNTS" || true
# 読み取りファイル
grep '"name":"Read"' "$session" 2>/dev/null | \
grep -o '"file_path":"[^"]*"' | \
sed 's/"file_path":"//g; s/"//g' >> "$FILE_READS" || true
# 編集ファイル
grep -E '"name":"(Edit|Write)"' "$session" 2>/dev/null | \
grep -o '"file_path":"[^"]*"' | \
sed 's/"file_path":"//g; s/"//g' >> "$FILE_EDITS" || true
# ユーザーの好み(特定キーワードを含む)
grep '"type":"user"' "$session" 2>/dev/null | while read -r line; do
content=$(echo "$line" | jq -r '.message.content // ""' 2>/dev/null)
if echo "$content" | grep -q -i -E '(必ず|常に|always|never|しない|prefer|好み|rule|ルール|規約|convention|don.t|do not)'; then
echo "$content" | head -2
fi
done >> "$USER_PREFS" || true
# エラー
grep -i '"type":"tool_result"' "$session" 2>/dev/null | \
grep -i -E '(error|failed|exception|denied)' | \
jq -r '.content // ""' 2>/dev/null | \
head -3 >> "$ERRORS" || true
done
# 結果を出力
if [[ "$JSON_OUTPUT" == "true" ]]; then
cat << EOF
{
"sessions_analyzed": $(echo "$SESSIONS" | wc -l | tr -d ' '),
"top_tools": [
$(sort "$TOOL_COUNTS" | uniq -c | sort -rn | head -10 | awk '{printf " {\"count\": %d, \"tool\": \"%s\"},\n", $1, $2}' | sed '$ s/,$//')
],
"frequently_read_files": [
$(sort "$FILE_READS" | uniq -c | sort -rn | head -10 | awk '{printf " {\"count\": %d, \"file\": \"%s\"},\n", $1, $2}' | sed '$ s/,$//')
],
"frequently_edited_files": [
$(sort "$FILE_EDITS" | uniq -c | sort -rn | head -10 | awk '{printf " {\"count\": %d, \"file\": \"%s\"},\n", $1, $2}' | sed '$ s/,$//')
],
"user_preferences_sample": [
$(head -10 "$USER_PREFS" | while read -r line; do printf ' "%s",\n' "$(echo "$line" | sed 's/"/\\"/g' | head -c 200)"; done | sed '$ s/,$//')
],
"common_errors_sample": [
$(head -5 "$ERRORS" | while read -r line; do printf ' "%s",\n' "$(echo "$line" | sed 's/"/\\"/g' | head -c 200)"; done | sed '$ s/,$//')
]
}
EOF
else
echo ""
echo "=== Analysis Results ($(echo "$SESSIONS" | wc -l | tr -d ' ') sessions) ==="
echo ""
echo "--- Top 10 Tools Used ---"
sort "$TOOL_COUNTS" | uniq -c | sort -rn | head -10
echo ""
echo "--- Frequently Read Files ---"
sort "$FILE_READS" | uniq -c | sort -rn | head -10
echo ""
echo "--- Frequently Edited Files ---"
sort "$FILE_EDITS" | uniq -c | sort -rn | head -10
echo ""
echo "--- User Preferences Found ---"
head -10 "$USER_PREFS" | while read -r line; do
if [[ -n "$line" ]]; then
echo " • $(echo "$line" | head -c 100)"
fi
done
echo ""
echo "--- Common Errors ---"
head -5 "$ERRORS" | while read -r line; do
if [[ -n "$line" ]]; then
echo " • $(echo "$line" | head -c 150)"
fi
done
fi
#!/bin/bash
# list-sessions.sh - Claude CodeとCodexのセッション一覧を取得
#
# Usage: ./list-sessions.sh [OPTIONS]
# -p, --project <path> 特定のプロジェクトのセッションのみ表示
# -n, --limit <num> 表示するセッション数(デフォルト: 10)
# -a, --all 全エージェントのセッションを表示(デフォルト: Claude Codeのみ)
# -j, --json JSON形式で出力
#
# 出力例:
# 2026-01-17 09:30:00 | claude | /Users/xxx/project | 7fdbec67-xxx.jsonl
# 2026-01-16 15:00:00 | codex | /Users/xxx/project | rollout-xxx.jsonl
set -euo pipefail
LIMIT=10
PROJECT=""
ALL_AGENTS=false
JSON_OUTPUT=false
while [[ $# -gt 0 ]]; do
case $1 in
-p|--project)
PROJECT="$2"
shift 2
;;
-n|--limit)
LIMIT="$2"
shift 2
;;
-a|--all)
ALL_AGENTS=true
shift
;;
-j|--json)
JSON_OUTPUT=true
shift
;;
*)
echo "Unknown option: $1" >&2
exit 1
;;
esac
done
CLAUDE_DIR="$HOME/.claude/projects"
CODEX_DIR="$HOME/.codex/sessions"
# Claude Codeセッションを取得
get_claude_sessions() {
if [[ ! -d "$CLAUDE_DIR" ]]; then
return
fi
find "$CLAUDE_DIR" -maxdepth 2 -name "*.jsonl" -type f 2>/dev/null | while read -r file; do
# サブエージェントファイルを除外
if [[ "$file" == *"/subagents/"* ]]; then
continue
fi
local filename
filename=$(basename "$file")
local dir
dir=$(dirname "$file")
local project_encoded
project_encoded=$(basename "$dir")
# プロジェクトパスをデコード(-- は /. に、- は / に変換)
local project_path
project_path="${project_encoded//--//.}"
project_path="${project_path//-//}"
# プロジェクトフィルタリング
if [[ -n "$PROJECT" ]] && [[ "$project_path" != *"$PROJECT"* ]]; then
continue
fi
# タイムスタンプを取得(最初のuserメッセージから)
local timestamp
timestamp=$(head -10 "$file" 2>/dev/null | grep '"type":"user"' | head -1 | jq -r '.timestamp // empty' 2>/dev/null || echo "")
if [[ -z "$timestamp" ]]; then
timestamp=$(stat -f "%Sm" -t "%Y-%m-%dT%H:%M:%S" "$file" 2>/dev/null || stat -c "%y" "$file" 2>/dev/null | cut -d. -f1)
fi
echo "${timestamp}|claude|${project_path}|${filename}|${file}"
done
}
# Codexセッションを取得
get_codex_sessions() {
if [[ ! -d "$CODEX_DIR" ]] || [[ "$ALL_AGENTS" != "true" ]]; then
return
fi
find "$CODEX_DIR" -name "rollout-*.jsonl" -type f 2>/dev/null | while read -r file; do
local filename
filename=$(basename "$file")
# session_metaからcwdを取得
local cwd
cwd=$(head -1 "$file" 2>/dev/null | jq -r '.payload.cwd // empty' 2>/dev/null || echo "unknown")
local timestamp
timestamp=$(head -1 "$file" 2>/dev/null | jq -r '.payload.timestamp // .timestamp // empty' 2>/dev/null || echo "")
if [[ -n "$PROJECT" ]] && [[ "$cwd" != *"$PROJECT"* ]]; then
continue
fi
echo "${timestamp}|codex|${cwd}|${filename}|${file}"
done
}
# 結果を収集してソート
results=$( (get_claude_sessions; get_codex_sessions) | sort -r | head -n "$LIMIT")
if [[ "$JSON_OUTPUT" == "true" ]]; then
echo "["
first=true
while IFS='|' read -r timestamp agent project filename filepath; do
if [[ -z "$timestamp" ]]; then continue; fi
if [[ "$first" == "true" ]]; then
first=false
else
echo ","
fi
echo " {"
echo " \"timestamp\": \"$timestamp\","
echo " \"agent\": \"$agent\","
echo " \"project\": \"$project\","
echo " \"filename\": \"$filename\","
echo " \"filepath\": \"$filepath\""
echo -n " }"
done <<< "$results"
echo ""
echo "]"
else
printf "%-20s | %-6s | %-40s | %s\n" "TIMESTAMP" "AGENT" "PROJECT" "FILENAME"
echo "-------------------------------------------------------------------------------------"
while IFS='|' read -r timestamp agent project filename filepath; do
if [[ -z "$timestamp" ]]; then continue; fi
# タイムスタンプを短縮形式に変換
short_ts=$(echo "$timestamp" | sed 's/T/ /' | cut -c1-19)
# プロジェクトパスを短縮
short_project="${project/$HOME/~}"
if [[ ${#short_project} -gt 40 ]]; then
short_project="...${short_project: -37}"
fi
printf "%-20s | %-6s | %-40s | %s\n" "$short_ts" "$agent" "$short_project" "$filename"
done <<< "$results"
fi
Related skills
How it compares
Use suggest-agent-rules for repo-derived agent configuration; manual rule authoring skills apply when no codebase context exists.
FAQ
What does suggest-agent-rules output?
suggest-agent-rules outputs tailored agent rules, constraints, and guardrails derived from repository context. The skill targets Claude Code and Cursor behavior improvement for project-specific conventions.
Does suggest-agent-rules replace security audits?
suggest-agent-rules configures AI assistant behavior from repo context; it does not perform security vulnerability scanning. Developers needing SQLi or XSS audits should use dedicated security validation skills.