| name | share-session |
| description | Convert and share Claude Code conversation sessions as readable markdown files. Use when user wants to share a session transcript, export conversation history, or create a shareable markdown document from a Claude Code session. Triggered by requests like "share this session", "export conversation", "convert session to markdown". |
Share Session
Overview
Convert Claude Code sessions into readable markdown format for easy sharing. This skill finds sessions by fuzzy matching todo items and generates well-formatted markdown documents. If this is loaded by user's explicit request but no comments there, just execute followings.
Workflow
Step 1: CRITICAL - Create Todo for Session Identification
MANDATORY: You MUST use TodoWrite tool to create a todo item that describes what this session is about.
IMPORTANT: You do NOT need to know the session ID. Describe the session content instead.
CORRECT Usage:
TodoWrite(todos=[{
"content": "share this session about ccusage integration and time tracking",
"status": "in_progress",
"activeForm": "Sharing session"
}])
Good Examples (describe session topic):
- ✅ "share this session about ccusage integration"
- ✅ "export conversation on implementing time tracking"
- ✅ "share current session with share-session improvements"
Bad Examples (using session ID directly):
- ❌ "get session id of 62d3a2b2-102c-43d3-8414-0a30d7a5e5e0" (you don't know session ID yet!)
- ❌ "export 62d3a2b2" (session ID unknown)
How it works:
- You create todo with session description
- Claude Code saves todo as:
~/.claude/todos/{SESSION-ID}.json - Script searches todo content using fuzzy matching (60% threshold)
- Script extracts SESSION-ID from the matching todo filename
- Script uses that SESSION-ID to find transcript
Why this is required:
- Without a todo, the script has no way to identify which session to export
- The todo file name is the ONLY place where session ID is stored
- Fuzzy matching allows flexible queries ("share this session" matches multiple variations)
Common mistakes:
- ❌ Forgetting to call TodoWrite before running the script
- ❌ Using session ID in todo content (you don't know it yet!)
- ❌ Query in Step 2 doesn't match todo content at all
Step 2: Run share_session.py
IMPORTANT: Always use the ABSOLUTE path to the script:
uv run --script /Users/yeongyu/local-workspaces/advanced-claude-code/claude-code-plugins/cc-plus/skills/share-session/scripts/share_session.py "your search query"
The search query should match your todo content from Step 1.
The script automatically:
- Searches todos using fuzzy matching (60% threshold)
- Locates transcript at
~/.claude/projects/*/{session-id}.jsonl - Merges pre-compact backups if they exist
- Fetches accurate cost/token data from ccusage (NOT LiteLLM)
- Converts to markdown with full statistics
- Truncates before /share command (excludes the share request itself)
- Saves to
/tmp/claude-code-sessions/{session-id}-{timestamp}.md - Copies the file path to clipboard
- Displays success message with cost breakdown
Step 3: Output
The script displays:
✅ Markdown saved to:
/tmp/claude-code-sessions/{session-id}-{timestamp}.md
💰 Total Session Cost: $X.XXXXXX
📋 The path has been copied to your clipboard.
Generated Markdown Format
The script generates comprehensive markdown with:
Session Metadata:
- 📊 Session ID, generation timestamp, message count
- 🔄 Models used (from ccusage data)
Content:
- 💬 User messages with timestamps (meta messages filtered)
- 🤖 Assistant responses with timestamps
- 🧠 Thinking process (when available, shown as nested quotes)
- 🔧 Tool usage details (collapsed in
<details>tags) - 🚀 Subagent calls (Task tool usage)
Cost & Token Statistics (from ccusage):
- 💰 Total session cost (accurate calculation from ccusage)
- 📊 Token breakdown:
- Input tokens
- Output tokens
- Cache creation tokens
- Cache read tokens
- Total tokens
- 🎯 Cache hit rate percentage
- 📉 Average cost per message
Session Timeline (NEW):
- ⏱️ Total Session Time: First message → Last message
- 🟢 LLM Active Time: User question → Last assistant response (per turn)
- 🟡 LLM Idle Time: Last assistant → Next user question
- 📊 LLM Utilization: (Active Time / Total Time) × 100%
Special Features:
- 📦 Compact markers shown for merged pre-compact backups
- 🔪 Auto-truncates before
/sharecommand (excludes the export request itself) - 🔄 Multi-model support (tracks different models per message)
Script
share_session.py
The only script you need. Does everything from search to markdown generation.
Usage:
uv run --script /Users/yeongyu/local-workspaces/advanced-claude-code/claude-code-plugins/cc-plus/skills/share-session/scripts/share_session.py <query>
Dependencies (auto-installed by uv):
orjson: Fast JSON parsingthefuzz: Fuzzy string matching for todo searchrich: Terminal formatting and progress display
Complete features:
- ✅ Fuzzy search through todo files (60% threshold)
- ✅ Automatic pre-compact backup merging
- ✅ Accurate cost/token data from ccusage (via
bunx --bun ccusage session -i) - ✅ Turn-based time tracking:
- LLM Active Time (user → last assistant per turn)
- LLM Idle Time (last assistant → next user)
- Utilization percentage
- ✅ Auto-truncation before
/sharecommand - ✅ Multi-model session support (from ccusage data)
- ✅ Clipboard integration (macOS
pbcopy) - ✅ Rich terminal output with colored progress
- ✅ TypedDict-based type safety
Output: File path (stdout) + clipboard
Exit codes:
- 0: Success
- 1: Session not found or conversion failed
Performance:
- Typical execution: 2-5 seconds
- Timeout: 30 seconds (for ccusage call)
Error Handling
No session found:
- ❌ Cause: Todo item not created or query doesn't match
- ✅ Solution:
- Verify you called
TodoWritein Step 1 - Check query matches todo content (60% fuzzy threshold)
- Try exact session ID if known
- Verify you called
Transcript not found:
- ❌ Cause: Session ID extracted but transcript missing
- ✅ Solution:
- Confirm session ID is correct
- Check
~/.claude/projects/directory exists - Look for
{session-id}.jsonlfile - Check pre-compact backups at
~/.claude/pre-compact-session-histories/
ccusage data fetch failed:
- ⚠️ Symptom: "Could not fetch session usage data from ccusage"
- ❌ Possible causes:
ccusagecommand not available (checkbunx --bun ccusage --version)- Session ID not found in ccusage database
- JSON parsing error from ccusage output
- ✅ Impact: Markdown still generated but without cost/token statistics
- ✅ Fallback: Warning message displayed, conversion continues
Conversion failed:
- ❌ Cause: JSONL parsing or markdown generation error
- ✅ Solution:
- Check transcript file is valid JSONL (each line = valid JSON)
- Review error message from stderr
- Check for corrupted transcript data
Clipboard copy failed:
- ⚠️ Symptom: "Warning: Could not copy to clipboard"
- ❌ Cause:
pbcopycommand failed (macOS only) - ✅ Impact: Non-critical - file path still shown in stdout
- ✅ Workaround: Manually copy the displayed path
Troubleshooting
Script says "No session found" even though todo exists:
# Check if todo file exists
ls -la ~/.claude/todos/ | grep $(date +%Y-%m-%d)
# Verify todo content
cat ~/.claude/todos/{session-id}*.json | jq .
Want to export specific session by ID:
# Create todo with exact session ID
TodoWrite(todos=[{"content": "export {exact-session-id}", "status": "in_progress", "activeForm": "Exporting"}])
# Then run with session ID
uv run --script ... "{exact-session-id}"
ccusage returns wrong data:
- Verify ccusage version:
bunx --bun ccusage --version - Test ccusage directly:
bunx --bun ccusage session -i {session-id} --json - Check if session exists:
bunx --bun ccusage session