first-fluke/oma-recap
Analyze conversation histories from multiple AI tools (Grok, Claude, Codex, Gemini, Qwen, Cursor, Antigravity) and generate themed daily/period work summaries. Filter by date or time window.
npx skills add https://github.com/first-fluke/oh-my-agent --skill oma-recap
Analyze AI tool conversation histories for a given period and generate themed work summaries.
Collect AI tool conversation history for a date or window and synthesize it into a themed, project-oriented recap with saved Markdown output.
oma retrooma dashboardoma statsoma recap --json or fallback sources.agents/results/recap/{date}.md or range filenameoma recap --json~/.claude/history.jsonl.agents/oma-config.yaml for language behavior--date (bare --window is a rolling window ending now, not calendar-aligned).| Action | SSL primitive | Evidence |
|--------|---------------|----------|
| Resolve date/window | INFER | Natural-language date rules |
| Collect history | CALL_TOOL | oma recap --json or jq fallback |
| Read extracted records | READ | Conversation history |
| Group themes/projects | INFER | Time/content grouping rules |
| Validate output shape | VALIDATE | Daily or multi-day template |
| Write recap | WRITE | .agents/results/recap/ |
| Report summary | NOTIFY | Displayed recap |
oma recap --jsonjq fallback for Claude historyoma recap --date YYYY-MM-DD --json
oma recap --window 7d --json
oma recap --json # rolling last 24h, not "today"
| Scope | Resource target |
|-------|-----------------|
| LOCAL_FS | Conversation history and recap output files |
| PROCESS | oma recap, jq, date commands |
| USER_DATA | Conversation prompts and project activity |
| MEMORY | Theme grouping and summary notes |
.agents/results/recap/.(AM/PM/Evening HH:MM~HH:MM). AM: ~12:00, PM: 12:00~18:00, Evening: 18:00~..agents/results/recap/.language setting in .agents/oma-config.yaml if configured.10. No em dashes: Use commas, periods, or parentheses instead of — (em dash).
Determine the target date or window from the user's natural language input. Default is today.
Resolution rules:
--date YYYY-MM-DD--date YYYY-MM-DD--window Nd--date YYYY-MM-DD (bare --window 1d is a rolling 24-hour window ending now, not the calendar day)Extract normalized conversation history via CLI.
# Today (calendar day, all tools)
oma recap --date $(date +%F) --json
# Last 24 hours (rolling window ending now)
oma recap --json
# Time window (rolling, ends now; capped at 30d)
oma recap --window 7d --json
# Specific date
oma recap --date 2026-04-10 --json
# Tool filter (supported: grok, claude, codex, gemini, qwen, cursor, antigravity)
oma recap --tool claude,codex --json
Fallback when CLI is not installed: process Claude history only via inline jq:
# Uses the system timezone; export TZ=<zone> first to override, and state the
# timezone assumption in the recap (per the Failure and recovery rules).
TARGET_DATE=$(date +%Y-%m-%d)
# macOS/BSD date:
start_ts=$(date -j -f "%Y-%m-%d %H:%M:%S" "${TARGET_DATE} 00:00:00" +%s)000
# Linux/GNU date alternative:
# start_ts=$(date -d "${TARGET_DATE} 00:00:00" +%s)000
end_ts=$((start_ts + 86400000))
jq -r --argjson start "$start_ts" --argjson end "$end_ts" '
select(.timestamp >= $start and .timestamp < $end and .display != null and .display != "") |
{
time: (.timestamp / 1000 | localtime | strftime("%H:%M")),
project: (.project | split("/") | .[-1]),
prompt: (.display | gsub("\n"; " ") | if length > 150 then .[0:150] + "..." else . end)
}
' ~/.claude/history.jsonl
Read all extracted data and analyze with the following criteria:
Grouping rules:
Cross-tool analysis:
Extract from each theme:
Save results to .agents/results/recap/{date}.md and display simultaneously.
Use the markdown templates in resources/output-formats.md:
Response language follows language setting in .agents/oma-config.yaml.
Save to .agents/results/recap/{date}.md.
For window ranges, use {start-date}~{end-date}.md format.
# Example paths
.agents/results/recap/2026-04-12.md
.agents/results/recap/2026-04-06~2026-04-12.md
resources/output-formats.mdoma recap --json.agents/results/recap/.agents/oma-config.yaml~/.claude/history.jsonlTake first-fluke/oma-recap from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.