Agent skill

Pi History Ingest

by Ar9av in Ar9av/obsidian-wiki

Ingest Pi coding-agent session history into Obsidian as distilled knowledge.

MITAuto-check: notesKnowledge Management

Install Pi History Ingest

skills CLI
$ npx skills add Ar9av/obsidian-wiki --skill pi-history-ingest -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install Ar9av/obsidian-wiki pi-history-ingest --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/Ar9av/obsidian-wiki.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.skills/pi-history-ingest .claude/skills/pi-history-ingest && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
pi-history-ingest
GitHub stars
3.5k
Token cost
~3.5k tokens
SKILL.md length
1,668 words
Files
1
Skills in repo
39
Repo updated
First seen
Licence
MIT

At a glance

Ingest Pi coding-agent session history into Obsidian as distilled knowledge.

  • Works in 5 steps: Survey and Compute Delta → Parse Session JSONL → Cluster by Topic → …
  • Mining ~/.pi/agent/sessions
  • SKILL.md covers Before You Start, Ingest Modes, Pi Data Layout and Step 1: Survey and Compute Delta, plus 7 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Pi History Ingest is an agent skill from Ar9av/obsidian-wiki. Ingest Pi coding-agent session history into Obsidian as distilled knowledge. Use for importing or mining ~/.pi/agent/sessions or Pi conversation logs; use wiki-agent for targeted topic-only recall.

Its SKILL.md is about 3.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Knowledge Management, covering LLM wikis. It works with Obsidian. The repository describes itself as: Framework for AI agents to build and maintain a digital brain through Obsidian wiki | Memory System for Agents. The licence is MIT.

When your agent uses it

  • Mining ~/.pi/agent/sessions
  • Pi conversation logs
  • Use wiki-agent for targeted topic-only recall

Example prompts

  • “/pi-history-ingest”

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Survey and Compute Delta
  2. Parse Session JSONL
  3. Cluster by Topic
  4. Distill into Wiki Pages
  5. Update Manifest, Log, and Index

What it can do on your machine

Read from SKILL.md and the folder at commit df54595. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are bash, yaml, markdown and json).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Pi History Ingest loads about 3.5k tokens when it runs. Until then it costs about 54 tokens; SKILL.md has 1,668 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~54
When it runs · the whole SKILL.md, loaded when a task matches
~3.5k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NoteMentions a .env fileSKILL.md:20
    line `@name` override → walk up CWD for `.env` → global config → prompt setup). This gives `OBSIDIAN_VAULT_PATH` and `PI

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from Ar9av/obsidian-wiki at commit df54595, republished under its MIT licence (© Ar9av). 1,668 words, ~3,541 tokens.

Download SKILL.mdSave it as .claude/skills/pi-history-ingest/SKILL.md (or your agent's skills folder).
name
pi-history-ingest
description
Ingest Pi coding-agent session history into Obsidian as distilled knowledge. Use for importing or mining ~/.pi/agent/sessions or Pi conversation logs; use wiki-agent for targeted topic-only recall.

Pi History Ingest — Session Mining

You are extracting knowledge from the user's Pi coding agent sessions and distilling it into the Obsidian wiki. Pi sessions are stored as structured JSONL with a tree layout — your job is to follow the active branch, extract durable knowledge, and compile it.

Session knowledge closure: Pi session files are the only factual source for this skill. Do not add background knowledge from model training, other tools, package docs, local files, or the current conversation unless that fact appears in the selected session entries. If outside context seems useful, mark it as an open question or skip it — never present it as extracted session knowledge.

This skill can be invoked directly or via the wiki-history-ingest router (/wiki-history-ingest pi).

Before You Start

Writing profile: Before drafting or rewriting natural-language Markdown, read and apply the Writing Profile Resolution section in llm-wiki/SKILL.md. Framework schema, provenance, safety, and operation-specific requirements take precedence. WRITING.md preferences apply only to newly drafted or rewritten natural-language Markdown; preserve source content and structured records.

  1. Resolve config — follow the Config Resolution Protocol in llm-wiki/SKILL.md (inline @name override → walk up CWD for .env → global config → prompt setup). This gives OBSIDIAN_VAULT_PATH and PI_HISTORY_PATH (defaults to ~/.pi/agent/sessions)
  2. Read .manifest.json at the vault root to check what has already been ingested
  3. Read index.md at the vault root to understand what the wiki already contains

Ingest Modes

Append Mode (default)

Check .manifest.json for each source file. Only process:

  • Files not in the manifest (new sessions)
  • Files whose modification time is newer than ingested_at in the manifest

Use this mode for regular syncs.

Full Mode

Process everything regardless of manifest. Use after wiki-rebuild or if the user explicitly asks for a full re-ingest.

Pi Data Layout

Pi stores sessions under ~/.pi/agent/sessions/ (or the path set by PI_CODING_AGENT_SESSION_DIR).

~/.pi/agent/sessions/
├── --<cwd-path>--/                    # Working directory with / replaced by -
│   └── <timestamp>_<uuid>.jsonl       # Session JSONL file
└── ...

The session filename contains an ISO timestamp and UUID. The parent directory encodes the working directory where the session was created.

Session JSONL Format

Each .jsonl file is a sequence of JSON objects. The first line is always a session header; subsequent lines are tree entries with id and parentId.

Key entry types:

typePurposeIngest?
sessionHeader with cwd, version, id, timestampMetadata only
messageConversation turn (user, assistant, toolResult, bashExecution, etc.)Primary source
session_infoDisplay name set via /nameFor session title
compactionContext compaction summaryHigh signal
branch_summarySummary when switching branches via /treeHigh signal
model_changeModel switch eventSkip
thinking_level_changeThinking level changeSkip
customExtension state (not in LLM context)Skip
custom_messageExtension-injected messageContext only
labelUser bookmark/labelSkip
Message roles inside message entries
  • user — user input; content is string or (TextContent \| ImageContent)[]
  • assistant — assistant response; content is (TextContent \| ThinkingContent \| ToolCall)[]
  • toolResult — tool execution result; content is (TextContent \| ImageContent)[]
  • bashExecution — bash command + output; command, output, exitCode
  • branchSummary — branch switch summary; summary string
  • compactionSummary — compaction summary; summary string
Key data sources ranked by value
  1. message entries (user + assistant) — full conversation transcripts; rich but noisy
  2. compaction entries — pre-synthesized summaries of older context; gold
  3. branch_summary entries — summaries of abandoned branches; good signal
  4. bashExecution entries — concrete commands run; useful for workflow patterns
  5. session_info entries — session name for topic inference

Skip model_change, thinking_level_change, custom (extension state), and label entries.

Step 1: Survey and Compute Delta

Scan PI_HISTORY_PATH and compare against .manifest.json:

bash
# List all session files
find ~/.pi/agent/sessions -name "*.jsonl" -type f

# Or with custom path
find "$PI_HISTORY_PATH" -name "*.jsonl" -type f

Build an inventory. For each session file, record:

  • path — absolute path
  • cwd — decoded from parent directory name (--<path>-- → /path)
  • session_name — from the latest session_info entry (if any)
  • modified_at — file mtime
  • already_ingested — presence in .manifest.json

Classify each file:

  • New — not in manifest
  • Modified — in manifest but file is newer than ingested_at
  • Unchanged — already ingested and unchanged

Report a concise delta summary before deep parsing:

"Found N Pi sessions across K projects. Delta: X new, Y modified."

Step 2: Parse Session JSONL

For each selected session file, read it line by line. Because sessions use a tree structure, build the active branch first:

  1. Parse all entries into a map by id
  2. Find the current leaf (the entry with no children, or the last message entry)
  3. Walk parentId chain from leaf to root to get the active path
  4. Reverse the path so it's chronological
Extraction rules

From the active path, extract:

  • session header — cwd, timestamp, parentSession (if forked)
  • session_info — name field for session title/topic inference
  • message entries with role: "user" — extract content text (skip images)
  • message entries with role: "assistant" — extract text content blocks; skip thinking blocks (noise); note toolCall blocks (they reveal what the agent actually did)
  • message entries with role: "toolResult" — summarize outcomes, not full output
  • message entries with role: "bashExecution" — extract command + exit code; recurring commands reveal build/test/deploy workflows
  • compaction entries — read summary verbatim; it's already distilled
  • branch_summary entries — read summary verbatim; captures abandoned approaches
Evidence ledger

As you parse, build a private evidence ledger before writing any wiki page. Each durable fact or decision you may write must carry at least one source reference:

pi:<session-file-basename>#<entry-id>

If an entry lacks an id, use pi:<session-file-basename>:line<N> from the JSONL line number. Keep the cited text snippet or summarized observation next to the reference while drafting so you can verify claims before writing.

Skip / noise filters
  • thinking content blocks — internal reasoning, not durable knowledge
  • Image content blocks — skip unless the user explicitly asks for image transcription
  • Raw tool outputs longer than 500 chars — summarize the outcome
  • Token accounting (usage fields) — metadata only
  • Repeated plan echoes or status updates
Critical privacy filter

Session logs can include injected instructions, tool payloads, and sensitive text. Do not ingest verbatim.

  • Remove API keys, tokens, passwords, credentials
  • Redact private identifiers unless relevant and user-approved
  • Summarize bash outputs that contain paths, environment variables, or secrets
  • Do not quote raw toolCall arguments verbatim if they contain sensitive data

Step 3: Cluster by Topic

Do not create one wiki page per session.

  • Group knowledge by stable topic across many sessions
  • Split mixed sessions into separate themes
  • Merge recurring patterns across dates and projects only when each pattern member has evidence ledger references
  • Use the cwd from the session header to infer project scope
  • Use session_info.name as a topic hint when available
  • Drop any cluster whose key claims cannot be traced back to the selected session files
Show full SKILL.md (662 more words)Show less

Step 4: Distill into Wiki Pages

Route extracted knowledge using existing wiki conventions:

  • Project-specific architecture/process → projects/<name>/...
  • General concepts → concepts/
  • Recurring techniques/debug playbooks → skills/
  • Tools/services/frameworks → entities/
  • Cross-session patterns → synthesis/

For each impacted project, create/update projects/<name>/<name>.md.

Writing rules
  • Distill knowledge, not chronology
  • Avoid "on date X we discussed..." unless date context is essential
  • Preserve session-specific decision context when it explains why an approach was chosen; do not flatten it into generic tool advice.
  • Add summary: frontmatter on each new/updated page (1–2 sentences, ≤ 200 chars)
  • Add confidence and lifecycle fields to every new page:
    yaml
    base_confidence: 0.42
    lifecycle: draft
    lifecycle_changed: <ISO date today>
    Leave lifecycle unchanged on update.
  • Add provenance markers using the convention in llm-wiki:
    • Extracted claims use no inline marker by default, but must have a nearby source reference comment.
    • ^[inferred] when synthesizing patterns across multiple sessions or inferring from tool calls.
    • ^[ambiguous] when sessions conflict or a compaction summary contradicts later turns.
  • Add a source reference comment near every extracted paragraph or bullet:
    markdown
    - Durable fact from the session. <!-- source: pi:2026-06-01T120000_abcd.jsonl#entry-123 -->
    Multiple sources are comma-separated. These comments are the audit trail; do not omit them for extracted claims.
  • Add/update provenance: frontmatter mix for each changed page.

Mark provenance per the convention in llm-wiki:

  • compaction and branch_summary entries are pre-distilled — treat as mostly extracted, with source reference comments.
  • Conversation distillation is mostly ^[inferred] — you're synthesizing from dialogue, and it still needs source references to the turns that support the synthesis.
  • Use ^[ambiguous] when the user changed their mind across sessions or when compaction summaries disagree with later conversation turns.
Source verification gate

Before writing any page, verify the draft against the evidence ledger:

  1. Every claim (extracted / ^[inferred] / ^[ambiguous]) has at least one pi:... source reference; extracted claims must use a nearby <!-- source: pi:... --> comment.
  2. Every source reference points to a selected session file and an entry on the active branch (or a cited compaction / branch_summary).
  3. Proper nouns, tool names, command names, filenames, URLs, package names, and error strings in claims appear in the cited entry text or command fields. Use literal search (grep/rg) on the session file for distinctive strings when in doubt.
  4. If a claim cannot be verified, either delete it or mark it ^[inferred] / ^[ambiguous] with the supporting source refs; never leave unverifiable content without one of these markers (unmarked implies extracted).
  5. Do not write facts learned from the model's training data or the current agent session unless they are explicitly present in the Pi session evidence.

Step 5: Update Manifest, Log, and Index

Update .manifest.json

For each processed source file:

  • ingested_at, size_bytes, modified_at
  • source_type: pi_session
  • project: inferred project name from decoded cwd
  • pages_created, pages_updated

Add/update a top-level summary block:

json
{
  "pi": {
    "source_path": "~/.pi/agent/sessions/",
    "last_ingested": "TIMESTAMP",
    "sessions_ingested": 12,
    "sessions_total": 40,
    "pages_created": 5,
    "pages_updated": 12
  }
}
Update special files

Update index.md, log.md, and hot.md with one locked call:

bash
obsidian-wiki memory sync PI_HISTORY_INGEST \
  sessions=<sessions> pages_updated=<pages_updated> \
  pages_created=<pages_created> mode=<mode> \
  --takeaways "Ingested 12 Pi sessions across 3 projects; surfaced patterns in CLI tooling and API design."

Never hand-edit index.md, log.md, or hot.md — the command takes the lock that keeps a parallel writer from dropping your update. --takeaways is the one-line conceptual summary that used to go in Recent Activity; omit it to leave the previous takeaways untouched.

See .skills/llm-wiki/references/MEMORY.md for the full procedure.

Privacy and Compliance

  • Distill and synthesize; avoid raw transcript dumps
  • Default to redaction for anything that looks sensitive
  • Ask the user before storing personal or sensitive details
  • Keep references to other people minimal and purpose-bound

Reference

See references/pi-data-format.md for field-level parsing notes and extraction guidance.

QMD Refresh After Vault Writes

QMD is a search index, not the source of truth. If $QMD_WIKI_COLLECTION is empty or unset, skip this step. Run it only after this skill has written or rewritten vault markdown. If QMD refresh fails, do not roll back the vault changes; report the QMD status separately.

Use $QMD_CLI if set; otherwise use qmd.

bash
${QMD_CLI:-qmd} update

If the output says vectors are needed or embeddings may be stale, run:

bash
${QMD_CLI:-qmd} embed

Verify the collection with either:

bash
${QMD_CLI:-qmd} ls "$QMD_WIKI_COLLECTION"

or, when a specific page path is known:

bash
${QMD_CLI:-qmd} get "qmd://$QMD_WIKI_COLLECTION/<page>.md" -l 5

Record one of:

  • QMD refreshed: update + embed + verified
  • QMD refreshed: update only + verified
  • QMD skipped: QMD_WIKI_COLLECTION unset
  • QMD skipped: qmd CLI unavailable
  • QMD failed: <short error summary>

© Ar9av, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .skills/pi-history-ingest of Ar9av/obsidian-wiki.

Open the folder on GitHubat commit df54595

Compare with similar skills

Pi History Ingest next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Pi History Ingest compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Pi History Ingest this skillAr9av/obsidian-wiki3.5k—~3.5kAutomated safety check: NotesMIT
LLM Wikilewislulu/llm-wiki-skill655—~3.7kAutomated safety check: PassNone
LLM Wikizosmaai/pi-llm-wiki608—~4.4kAutomated safety check: PassMIT
LLM Wikipraneybehl/llm-wiki-plugin118—~5.7kAutomated safety check: PassMIT
Karpathy WikiSherwinQ/karpathy-wiki114—~967Automated safety check: PassMIT
My LLM WikiMartinLwx/dotfiles140—~2.7kAutomated safety check: PassNone

Similar skills

  • LLM Wiki

    lewislulu/llm-wiki-skill

    Build and maintain a Karpathy-style LLM knowledge base — a self-compiling Obsidian markdown wiki where an Agent ingests raw sources, compiles cross-linked concept/entity/summary pages, answers…

    655 GitHub stars~3.7k tokensUpdated 5 mo ago
    Knowledge ManagementAuto-check passed
  • LLM Wiki

    zosmaai/pi-llm-wiki

    Build and maintain a persistent, interlinked Obsidian-compatible markdown wiki using Karpathy's LLM Wiki pattern.

    608 GitHub stars~4.4k tokensUpdated yesterday
    Knowledge ManagementAuto-check passed
  • LLM Wiki

    praneybehl/llm-wiki-plugin

    Build and maintain an LLM-curated knowledge base from papers, articles, transcripts, notes and project findings.

    118 GitHub stars~5.7k tokensUpdated 28 days ago
    Knowledge ManagementAuto-check passed
  • Karpathy Wiki

    SherwinQ/karpathy-wiki

    A skill your agent uses when building or maintaining a personal knowledge base with LLM assistance.

    114 GitHub stars~967 tokensUpdated 5 mo ago
    Knowledge ManagementAuto-check passed
  • My LLM Wiki

    MartinLwx/dotfiles

    Provides access to the user's personal wiki, including notes, research, project documentation, decisions, and archived knowledge.

    140 GitHub stars~2.7k tokensUpdated 2 days ago
    Knowledge ManagementAuto-check passed
  • Sage Wiki

    xoai/sage-wiki

    Reference skill for sage-wiki — local-first knowledge graph with MCP server, REST API, compiled wiki, and Obsidian-compatible output.

    623 GitHub stars~2.4k tokensUpdated 5 days ago
    Knowledge ManagementAuto-check passed

More from Ar9av/obsidian-wiki

All 39 skills in this repo
  • Codex History Ingest

    Ar9av/obsidian-wiki

    Ingest Codex CLI conversation/session history into Obsidian as distilled knowledge.

    3.5k GitHub stars~2.2k tokensUpdated yesterday
    Auto-check: notes
  • Copilot History Ingest

    Ar9av/obsidian-wiki

    Ingest GitHub Copilot CLI/session history into Obsidian as distilled knowledge.

    3.5k GitHub stars~4.4k tokensUpdated yesterday
    Auto-check: notes
  • Hermes History Ingest

    Ar9av/obsidian-wiki

    Ingest Hermes agent history into Obsidian as distilled knowledge.

    3.5k GitHub stars~2.2k tokensUpdated yesterday
    Auto-check: notes
  • Obsidian Layout Adjustment

    Ar9av/obsidian-wiki

    Adjust the user's Obsidian visual layout with CSS snippets. An agent skill from Ar9av/obsidian-wiki.

    3.5k GitHub stars~2.5k tokensUpdated yesterday
    Auto-check passed
  • Openclaw History Ingest

    Ar9av/obsidian-wiki

    Ingest OpenClaw session/history data into Obsidian as distilled knowledge.

    3.5k GitHub stars~2.5k tokensUpdated yesterday
    Auto-check: notes
  • Wiki Capture

    Ar9av/obsidian-wiki

    Turn the current conversation or finding into a structured permanent wiki note.

    3.5k GitHub stars~4.3k tokensUpdated yesterday
    Auto-check: notes

Works with

Questions about Pi History Ingest

What does Pi History Ingest do?

Ingest Pi coding-agent session history into Obsidian as distilled knowledge. Pi History Ingest is an agent skill from Ar9av/obsidian-wiki. Ingest Pi coding-agent session history into Obsidian as distilled knowledge.

When should I use Pi History Ingest?

Pi History Ingest fits situations like: mining ~/.pi/agent/sessions; pi conversation logs; use wiki-agent for targeted topic-only recall.

How do I install Pi History Ingest in Claude Code?

Run `npx skills add Ar9av/obsidian-wiki --skill pi-history-ingest -a claude-code`. Or copy the skill folder (.skills/pi-history-ingest in Ar9av/obsidian-wiki) into .claude/skills/pi-history-ingest in your project. Claude Code loads it when a task matches its description.

How do I install Pi History Ingest in Codex?

Run `npx skills add Ar9av/obsidian-wiki --skill pi-history-ingest -a codex`. Or copy the skill folder (.skills/pi-history-ingest in Ar9av/obsidian-wiki) into .agents/skills/pi-history-ingest in your project. Codex loads it when a task matches its description.

Can I use Pi History Ingest in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Ar9av/obsidian-wiki --skill pi-history-ingest -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/pi-history-ingest, .gemini/skills/pi-history-ingest, .github/skills/pi-history-ingest and .opencode/skills/pi-history-ingest in your project.

What does Pi History Ingest need to run?

SKILL.md names no scripts, command-line tools or credentials: Pi History Ingest is instructions for the agent only.

Does Pi History Ingest access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Pi History Ingest safe to install?

Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Pi History Ingest use?

Pi History Ingest is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Pi History Ingest use?

About 3.5k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Pi History Ingest?

Skills that share tags, products or a category with Pi History Ingest: LLM Wiki (lewislulu/llm-wiki-skill, 655 stars), LLM Wiki (zosmaai/pi-llm-wiki, 608 stars), LLM Wiki (praneybehl/llm-wiki-plugin, 118 stars) and Karpathy Wiki (SherwinQ/karpathy-wiki, 114 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Pi History Ingest?

Ar9av (a GitHub user) maintains it in Ar9av/obsidian-wiki, which has 3,547 GitHub stars. The repository holds 39 skills in this directory. The repository was last updated on October 10, 2026.

Source: Ar9av/obsidian-wiki on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.