--- 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:** ```python 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:** 1. You create todo with **session description** 2. Claude Code saves todo as: `~/.claude/todos/{SESSION-ID}.json` 3. Script searches todo **content** using fuzzy matching (60% threshold) 4. Script extracts SESSION-ID from the matching todo **filename** 5. 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: ```bash 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 `
` 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 `/share` command (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:** ```bash uv run --script /Users/yeongyu/local-workspaces/advanced-claude-code/claude-code-plugins/cc-plus/skills/share-session/scripts/share_session.py ``` **Dependencies (auto-installed by uv):** - `orjson`: Fast JSON parsing - `thefuzz`: Fuzzy string matching for todo search - `rich`: 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 `/share` command - ✅ 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**: 1. Verify you called `TodoWrite` in Step 1 2. Check query matches todo content (60% fuzzy threshold) 3. Try exact session ID if known **Transcript not found:** - ❌ **Cause**: Session ID extracted but transcript missing - ✅ **Solution**: 1. Confirm session ID is correct 2. Check `~/.claude/projects/` directory exists 3. Look for `{session-id}.jsonl` file 4. 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**: 1. `ccusage` command not available (check `bunx --bun ccusage --version`) 2. Session ID not found in ccusage database 3. 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**: 1. Check transcript file is valid JSONL (each line = valid JSON) 2. Review error message from stderr 3. Check for corrupted transcript data **Clipboard copy failed:** - ⚠️ **Symptom**: "Warning: Could not copy to clipboard" - ❌ **Cause**: `pbcopy` command 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:** ```bash # 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:** ```bash # 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`