Files
gh-code-yeongyu-cc-plus-cla…/skills/share-session/SKILL.md
2025-11-29 18:14:49 +08:00

229 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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 `<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 `/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 <query>
```
**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`