Help us improve
Share bugs, ideas, or general feedback.
From evolve-lite
Saves Claude Code conversation history as OpenAI chat completion JSON trajectory to .evolve/trajectories/ for analysis, fine-tuning data, and session review.
npx claudepluginhub agenttoolkit/altk-evolve --plugin evolve-liteHow this skill is triggered — by the user, by Claude, or both
Slash command
/evolve-lite:save-trajectoryThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill saves the current Claude Code session's conversation history as a JSON file in OpenAI chat completion format. The trajectory is saved to `.evolve/trajectories/` in the project root. This enables trajectory analysis, fine-tuning data collection, and session review.
Records Claude Code conversations as paired markdown files (clean and raw transcripts) in $HOME/cclogs/{slug}/ for memos, blogs, or reuse. Supports start/refresh/end via /log-conversation [N|-a|-e].
Parses Claude Code JSONL conversation transcripts to extract signal from user/assistant messages, filter noise entries, link subagent files, detect session boundaries, and understand storage format.
Analyzes Claude Code session history JSONL files to extract insights, summaries, and patterns from conversations. Processes current project or all sessions with bash, jq, and subagents.
Share bugs, ideas, or general feedback.
This skill saves the current Claude Code session's conversation history as a JSON file in OpenAI chat completion format. The trajectory is saved to .evolve/trajectories/ in the project root. This enables trajectory analysis, fine-tuning data collection, and session review.
Review all messages in the current conversation from start to finish. For each message, identify its type:
Convert each message to the appropriate format:
User text message:
{"role": "user", "content": "the user's message text"}
Assistant text response (no thinking):
{"role": "assistant", "content": "the assistant's response text"}
Assistant text response (with thinking):
{"role": "assistant", "content": "the assistant's response text", "thinking": "the thinking/reasoning text"}
Assistant tool call (no visible text):
{
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "tool_call_id_here",
"type": "function",
"function": {
"name": "ToolName",
"arguments": "{\"param\": \"value\"}"
}
}
]
}
Assistant tool call with text:
{
"role": "assistant",
"content": "text before/after the tool call",
"tool_calls": [
{
"id": "tool_call_id_here",
"type": "function",
"function": {
"name": "ToolName",
"arguments": "{\"param\": \"value\"}"
}
}
]
}
Tool result:
{"role": "tool", "tool_call_id": "tool_call_id_here", "content": "the tool output text"}
json.dumps() on the arguments object.call_001, call_002, etc.tool_calls array, followed by separate tool result messages for each.content and thinking fields.Strip <system-reminder>...</system-reminder> tags and their contents from all message content. Use a non-greedy multiline match (e.g., re.sub(r'<system-reminder>[\s\S]*?</system-reminder>', '', text).strip()). If after stripping, a message has empty content and no tool calls, omit it.
Wrap the messages array in a trajectory envelope:
{
"model": "<model-id-from-session>",
"timestamp": "2025-01-15T10:30:00Z",
"messages": [...]
}
Write the trajectory JSON to a temporary file using the Write tool, then pass the file path to the helper script:
.evolve/tmp/trajectory_input.json using the Write tool (create the directory if needed)tmp=.evolve/tmp/trajectory_input.json; mkdir -p .evolve/tmp; trap 'rm -f "$tmp"' EXIT; python3 "${CLAUDE_PLUGIN_ROOT}/skills/save-trajectory/scripts/save_trajectory.py" "$tmp"
Important: Do NOT use inline Python scripts, heredocs, or stdin piping to pass the trajectory JSON. Always use the Write tool to create a temp file first. This avoids escaping issues with backslashes, quotes, and newlines in conversation content.
The script will:
.evolve/trajectories/ directory if neededtrajectory_YYYY-MM-DDTHH-MM-SS.json)After saving, you should see output like:
Trajectory saved: /path/to/project/.evolve/trajectories/trajectory_2025-01-15T10-30-00.json
Messages: 12
role: "user" or role: "assistant" as appropriate — do not skip them, since they preserve the conversation flow..evolve/trajectories/ and can be version-controlled or gitignored as preferred.