
Ruminate
- 9 installs
- 218 repo stars
- Updated February 27, 2026
- poteto/brainmaxxing
ruminate is a Claude Code skill for ai & agent building.
About
ruminate is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.
- ruminate
- AI & Agent Building
- AI-coding skill
Ruminate by the numbers
- 9 all-time installs (skills.sh)
- Ranked #12,152 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/poteto/brainmaxxing --skill ruminateAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 9 |
|---|---|
| repo stars | ★ 218 |
| Last updated | February 27, 2026 |
| Repository | poteto/brainmaxxing ↗ |
How do I helps with ai & agent building tasks.?
Helps with ai & agent building tasks.
Who is it for?
Best when you're working on ai & agent building and need structured help with ruminate.
Skip if: Teams with no ai & agent building needs, or anyone wanting a generic chat assistant without this specific workflow.
When should I use this skill?
When you need to helps with ai & agent building tasks., or when ruminate is a claude code skill for ai & agent building.
What you get
Structured output aligned to ruminate: ruminate, AI & Agent Building.
Files
Ruminate
Mine conversation history for brain-worthy knowledge that was never captured. Complements reflect (current session) and meditate (brain vault audit) by looking at the full archive of past conversations.
Process
1. Read the brain
Build a brain snapshot: sh .agents/skills/meditate/scripts/snapshot.sh brain/ /tmp/brain-snapshot-ruminate.md. Pass the snapshot path to each analysis agent. This avoids loading the full brain into the ruminate orchestrator's context.
2. Locate conversations
Find the project conversation directory:
~/.claude/projects/-<cwd-with-dashes-replacing-slashes>/3. Extract conversations
Run the extraction script to parse JSONL conversation files into readable text and split into batches:
python3 .agents/skills/ruminate/scripts/extract-conversations.py "$CONV_DIR" "$OUT_DIR" --batches NChoose N based on the number of conversations found: ~1 batch per 20 conversations, minimum 2, maximum 10.
4. Spawn analysis team
Create an agent team (TeamCreate) with N agents (one per batch), each with subagent_type: general-purpose and model: opus. Run all N in parallel.
Each agent's prompt should include:
- The batch manifest path (
$OUT_DIR/batches/batch_N.txt) - The output path (
$OUT_DIR/findings_N.md) - The list of topics already captured in the brain (compiled from step 1) — so agents skip known knowledge
- Instructions to extract from each conversation:
- User corrections: times the user corrected the assistant's approach, code, or understanding
- Recurring preferences: things the user explicitly asked for or pushed back on repeatedly
- Technical learnings: codebase-specific knowledge, gotchas, patterns discovered
- Workflow patterns: how the user prefers to work
- Frustrations: friction points, wasted effort, things that went wrong
- Skills wished for: capabilities the user expressed wanting
Agents write structured findings to their output files.
5. Synthesize
After all agents complete, read all findings files. Cross-reference with existing brain content. Deduplicate across batches.
Filter by frequency and impact. Most findings won't be worth adding. Apply these filters before presenting:
- Frequency: Did this come up in multiple conversations, or was the user correcting the same mistake repeatedly? One-off corrections are usually not worth a brain entry — the brain should capture patterns, not incidents.
- Factual accuracy: Is something in the brain now wrong? These are always worth fixing regardless of frequency.
- Impact: Would failing to capture this cause repeated wasted effort in future sessions?
Discard aggressively. It's better to present 3 high-signal findings than 9 that include noise.
6. Present and apply
Present findings to the user in a table with columns: finding, frequency/evidence, and proposed action. Be honest about which findings are one-offs vs. recurring patterns — let the user decide what's worth adding.
Route skill-specific learnings. Check if any findings are about how a specific skill should work — its process, prompts, edge cases, or troubleshooting. Update the skill's SKILL.md directly. Read the skill first to avoid duplicating or contradicting existing content.
Apply only the changes the user approves. Follow brain writing conventions:
- One topic per file, organized in directories
- Use
[[wikilinks]]to connect related notes - Update
brain/index.mdafter all changes - Default to updating existing notes over creating new ones
7. Clean up
Remove the temporary extraction directory:
rm -rf "$OUT_DIR"Guidelines
- Filter aggressively. Most conversations will have low signal — automated tasks, trivial exchanges, already-captured knowledge. Only surface what's genuinely new and impactful.
- Prefer reduction. If a finding is a special case of an existing brain principle, update the existing note rather than creating a new one.
- Quote the user. When a finding stems from a direct user correction, include the user's words — they carry the most signal about what matters.
- Shut down agents when analysis is complete. Don't leave them idle.
#!/usr/bin/env python3
"""Extract user and assistant messages from Claude Code conversation JSONL files.
Usage: extract-conversations.py <project-dir> <output-dir> [options]
Options:
--batches N Number of batch manifests to create (default: 5)
--from YYYY-MM-DD Include conversations modified on or after this date
--to YYYY-MM-DD Include conversations modified on or before this date
--min-size BYTES Minimum file size in bytes (default: 500)
Date filters are composable:
--from 2026-02-13 --to 2026-02-13 Exactly Feb 13
--from 2026-02-13 Feb 13 onwards
--to 2026-02-13 Up to and including Feb 13
Output:
<output-dir>/000_<uuid>.txt — extracted messages per conversation
<output-dir>/batches/batch_0.txt ... batch_N.txt — file lists for each batch
"""
import argparse
import json
import os
import sys
import glob
from datetime import date, datetime
def extract_messages(fpath: str) -> list[str]:
"""Extract user and assistant text messages from a JSONL conversation file."""
messages = []
with open(fpath) as f:
for line in f:
try:
d = json.loads(line)
except (json.JSONDecodeError, ValueError):
continue
msg_type = d.get("type", "")
msg = d.get("message", {})
if not isinstance(msg, dict):
continue
content = msg.get("content", "")
texts = []
if isinstance(content, str):
texts.append(content)
elif isinstance(content, list):
for c in content:
if isinstance(c, dict) and c.get("type") == "text":
texts.append(c["text"])
for t in texts:
clean = t.strip()
if not clean or len(clean) <= 10:
continue
# Skip system-reminder-only messages
if clean.startswith("<system-reminder>") and clean.endswith("</system-reminder>"):
continue
if msg_type == "user" and not d.get("isMeta"):
messages.append(f"[USER]: {t[:3000]}")
elif msg_type == "assistant":
messages.append(f"[ASSISTANT]: {t[:800]}")
return messages
def file_mod_date(fpath: str) -> date:
"""Return the modification date of a file."""
return datetime.fromtimestamp(os.path.getmtime(fpath)).date()
def main():
parser = argparse.ArgumentParser(
description="Extract messages from Claude Code conversation JSONL files."
)
parser.add_argument("project_dir", help="Directory containing .jsonl conversation files")
parser.add_argument("output_dir", help="Directory to write extracted conversations")
parser.add_argument("--batches", type=int, default=5, help="Number of batch manifests (default: 5)")
parser.add_argument("--from", dest="from_date", type=date.fromisoformat,
help="Include conversations modified on or after this date (YYYY-MM-DD)")
parser.add_argument("--to", dest="to_date", type=date.fromisoformat,
help="Include conversations modified on or before this date (YYYY-MM-DD)")
parser.add_argument("--min-size", type=int, default=500,
help="Minimum file size in bytes (default: 500)")
args = parser.parse_args()
os.makedirs(args.output_dir, exist_ok=True)
# Find conversation files, applying size and date filters
files = []
for f in glob.glob(f"{args.project_dir}/*.jsonl"):
if os.path.getsize(f) < args.min_size:
continue
if args.from_date or args.to_date:
mod = file_mod_date(f)
if args.from_date and mod < args.from_date:
continue
if args.to_date and mod > args.to_date:
continue
files.append(f)
files.sort(key=os.path.getmtime, reverse=True)
date_desc = ""
if args.from_date and args.to_date:
date_desc = f" (from {args.from_date} to {args.to_date})"
elif args.from_date:
date_desc = f" (from {args.from_date})"
elif args.to_date:
date_desc = f" (to {args.to_date})"
print(f"Found {len(files)} non-empty conversations{date_desc}", file=sys.stderr)
# Extract messages
extracted = []
for idx, fpath in enumerate(files):
fname = os.path.basename(fpath).replace(".jsonl", "")
out_path = f"{args.output_dir}/{idx:03d}_{fname}.txt"
messages = extract_messages(fpath)
if messages:
with open(out_path, "w") as out:
out.write("\n\n".join(messages))
extracted.append(out_path)
print(f"Extracted {len(extracted)} conversations with content", file=sys.stderr)
# Create batch manifests
batch_dir = f"{args.output_dir}/batches"
os.makedirs(batch_dir, exist_ok=True)
batch_size = max(1, (len(extracted) + args.batches - 1) // args.batches)
for b in range(args.batches):
batch_files = extracted[b * batch_size : (b + 1) * batch_size]
if not batch_files:
continue
manifest = f"{batch_dir}/batch_{b}.txt"
with open(manifest, "w") as mf:
mf.write("\n".join(batch_files) + "\n")
print(f"Batch {b}: {len(batch_files)} conversations", file=sys.stderr)
# Print output dir for the caller
print(args.output_dir)
if __name__ == "__main__":
main()
Related skills
FAQ
What does ruminate do?
ruminate is a Claude Code skill for ai & agent building.
When should I use ruminate?
When you need to helps with ai & agent building tasks., or when ruminate is a claude code skill for ai & agent building.
What are the main capabilities?
ruminate; AI & Agent Building; AI-coding skill.