copilot-history-ingest
Skill3.7k starsChanged 10 days agoMITView on GitHub
Ingest GitHub Copilot CLI/session history into Obsidian as distilled knowledge. Use for importing or mining Copilot history; not for general Copilot help, simple session search, or backup.
- Reads credentials
Adopted by
Steady: 0 new projects took it in the last 4 weeks, none the 4 weeks before.thin data
Who's talking about Ar9av/obsidian-wiki
- @ar9av.bsky.social“github.com/Ar9av/obsidi...”Bluesky · Oct 8, 2026 · 1 likes
- @pythonhub.dev“obsidian-wiki Framework for AI agents to build and maintain a digital brain through Obsidian wiki using …”Bluesky · Jun 23, 2026 · 1 likes
- sudosubin/agents.nix“claude-code-marketplaces.github.ar9av.obsidian-wiki: 2026.10.4 → 2026.11.2”GitHub · Nov 4, 2026
- sudosubin/agents.nix“claude-code-plugins.github.ar9av.obsidian-wiki: 2026.10.4 → 2026.11.2”GitHub · Nov 4, 2026
- sudosubin/agents.nix“agent-skills.github.ar9av.obsidian-wiki: 2026.10.4 → 2026.11.2”GitHub · Nov 4, 2026
The biggest 5 of 27 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 27
Talked about on GitHub and Bluesky (27 times).
On GitHub · 25
- Nov 4, 2026claude-code-marketplaces.github.ar9av.obsidian-wiki: 2026.10.4 → 2026.11.2 — sudosubin/agents.nix0 reactions
- Nov 4, 2026claude-code-plugins.github.ar9av.obsidian-wiki: 2026.10.4 → 2026.11.2 — sudosubin/agents.nix0 reactions
- Nov 4, 2026agent-skills.github.ar9av.obsidian-wiki: 2026.10.4 → 2026.11.2 — sudosubin/agents.nix0 reactions
- Nov 2, 2026fix(deps): update dependency obsidian-wiki to v2026.10.4 — lkshrk/agent-stack0 reactions · 2 comments
- Nov 1, 2026chore(deps): update dependency pipx:obsidian-wiki to v2026.10.4 — lkshrk/agent-stack0 reactions · 2 comments
20 more on GitHub
- Oct 28, 2026claude-code-plugins.github.ar9av.obsidian-wiki: init at 2026.10.4 — sudosubin/agents.nix0 reactions
- Oct 28, 2026claude-code-marketplaces.github.ar9av.obsidian-wiki: init at 2026.10.4 — sudosubin/agents.nix0 reactions
- Oct 27, 2026agent-skills.github.ar9av.obsidian-wiki: 2026.10.3 → 2026.10.4 — sudosubin/agents.nix0 reactions
- Oct 21, 2026agent-skills.github.ar9av.obsidian-wiki: 2026.10.2 → 2026.10.3 — sudosubin/agents.nix0 reactions
- Oct 13, 2026agent-skills.github.ar9av.obsidian-wiki: 2026.10.1 → 2026.10.2 — sudosubin/agents.nix0 reactions
- Oct 3, 2026agent-skills.github.ar9av.obsidian-wiki: init at 2026.10.1 — sudosubin/agents.nix0 reactions
- Sep 27, 2026[Candidate] ar9av/obsidian-wiki/.skills/llm-wiki - llm-wiki — ProSkillsMD/proskills0 reactions · 2 comments
- Sep 27, 2026[Candidate] ar9av/obsidian-wiki/.skills/impl-validator - impl-validator — ProSkillsMD/proskills0 reactions · 2 comments
- Sep 27, 2026[Candidate] ar9av/obsidian-wiki/.skills/hermes-history-ingest - hermes-history-ingest — ProSkillsMD/proskills0 reactions · 2 comments
- Sep 26, 2026[Candidate] ar9av/obsidian-wiki/.skills/graph-colorize - graph-colorize — ProSkillsMD/proskills0 reactions · 2 comments
- Sep 26, 2026[Candidate] ar9av/obsidian-wiki/.skills/cross-linker - cross-linker — ProSkillsMD/proskills0 reactions · 2 comments
- Sep 26, 2026[Candidate] ar9av/obsidian-wiki/.skills/copilot-history-ingest - copilot-history-ingest — ProSkillsMD/proskills0 reactions · 2 comments
- Sep 26, 2026[Candidate] ar9av/obsidian-wiki/.skills/codex-history-ingest - codex-history-ingest — ProSkillsMD/proskills0 reactions · 2 comments
- Sep 26, 2026[Candidate] ar9av/obsidian-wiki/.skills/code-understand - code-understand — ProSkillsMD/proskills0 reactions · 2 comments
- Sep 26, 2026[Candidate] ar9av/obsidian-wiki/.skills/claude-history-ingest - claude-history-ingest — ProSkillsMD/proskills0 reactions · 1 comment
- Jul 12, 2026Add obsidian-wiki as a local workspace — aristoapp/awesome-second-brain0 reactions
- Jun 20, 2026feat: Obsidian-compatible wiki.md output from compiled graph — manhhailua/lorekeep0 reactions · 1 comment
- Jun 15, 2026Daily tribute 2026-06-15: obsidian-wiki by @_ar9av — Talonsturgill/signalsniper0 reactions
- May 15, 2026Tracking: AI workflow patterns & companion plugins — brenthaertlein/universal-skills0 reactions · 1 comment
- Apr 9, 2026wiki 生成质量提高 — nashsu/llm_wiki0 reactions · 2 comments
On Bluesky · 2
- Oct 8, 2026github.com/Ar9av/obsidi... — @ar9av.bsky.social1 likes and repost
- Jun 23, 2026obsidian-wiki Framework for AI agents to build and maintain a digital brain through Obsidian wiki using Karpathy's LLM Wiki pattern.… — @pythonhub.dev1 likes and repost · 1 reply
In this repository43 other files it gives its agents.
- AGENTS.mdAGENTS.md
- docs/agents.mdAGENTS.md
- .github/copilot-instructions.mdCopilot instructions
- .cursor/rules/obsidian-wiki.mdcCursor rule
- claude-history-ingestSkill
- code-understandSkill
- codex-history-ingestSkill
- cross-linkerSkill
- daily-updateSkill
- graph-colorizeSkill
- hermes-history-ingestSkill
- impl-validatorSkill
- llm-wikiSkill
- memory-bridgeSkill
- obsidian-layout-adjustmentSkill
- openclaw-history-ingestSkill
- pi-history-ingestSkill
- session-brainSkill
- session-searchSkill
- skill-creatorSkill
- tag-taxonomySkill
- vault-skill-factorySkill
- wiki-agentSkill
- wiki-captureSkill
- wiki-context-packSkill
- wiki-dashboardSkill
- wiki-dedupSkill
- wiki-digestSkill
- wiki-exportSkill
- wiki-history-ingestSkill
- wiki-importSkill
- wiki-ingestSkill
- wiki-lintSkill
- wiki-narrateSkill
- wiki-querySkill
- wiki-rebuildSkill
- wiki-researchSkill
- wiki-setupSkill
- wiki-stage-commitSkill
- wiki-statusSkill
- wiki-switchSkill
- wiki-synthesizeSkill
- wiki-updateSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
18 rules. About 0 are common, 4 are distinctive, and 14 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈4
Distinctive · estimate
This author's own choices. Worth a look.
14
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 15
Writing profile: Before drafting or rewriting natural-language Markdown, read and apply the Writing Profile Resolution section in …
- Very specific: line 19
Read .manifest.json at the vault root to check what's already been ingested
- Very specific: line 20
Read index.md at the vault root to know what the wiki already contains
- Very specific: line 26
Check .manifest.json for each source file (events JSONL, transcript JSONL, checkpoint, session-store DB).
- Very specific: line 155
Read index.md (if present) as a session-level summary — it's typically written at session end and is already concise.
- Very specific: line 167
Read turns from session-store.db (preferred — already parsed) or from events.jsonl / transcript JSONL.
- Distinctive: line 235
Don't create one wiki page per session.
- Very specific: line 251
Prefer repository (e.g., owner/repo) from session-store.db over raw cwd when available.
- Very specific: line 276
Leave lifecycle unchanged on update.
- Very specific: line 283
Use ^[ambiguous] when the user changed direction mid-session or when the session ended unresolved.
- Very specific: line 284
Write a provenance: frontmatter block on every new/updated page summarizing the rough mix.
- Very specific: line 316
Update index.md, log.md, and hot.md with one locked call:
- Very specific: line 326
Never hand-edit index.md, log.md, or hot.md — the command takes the lock that keeps a parallel writer from dropping your update.
- Very specific: line 329
If an ongoing project is now better understood, record the thread so the next session picks it up: obsidian-wiki memory todo add "<thread>" …
- Distinctive: line 339
If you encounter personal/sensitive content, ask the user before including it
- Very specific: line 350
Use $QMD_CLI if set; otherwise use qmd.
- Distinctive: line 356
If the output says vectors are needed or embeddings may be stale, run:
- Distinctive: line 362
Verify the collection with either:
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Copilot History Ingest — Conversation Mining
You are extracting knowledge from the user's past GitHub Copilot CLI conversations and distilling it into the Obsidian wiki. Conversations are rich but messy — your job is to find the signal and compile it.
This skill can be invoked directly or via the wiki-history-ingest router (/wiki-history-ingest copilot).
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.
- Resolve config — follow the Config Resolution Protocol in
llm-wiki/SKILL.md(inline@nameoverride → walk up CWD for.env→ global config → prompt setup). This givesOBSIDIAN_VAULT_PATH,COPILOT_HISTORY_PATH(defaults to~/.copilot/session-state), andCOPILOT_VSCODE_STORAGE_PATH(VS CodeworkspaceStorage; platform-specific — ask the user if absent) - Read
.manifest.jsonat the vault root to check what's already been ingested - Read
index.mdat the vault root to know what the wiki already contains
Ingest Modes
Append Mode (default)
Check .manifest.json for each source file (events JSONL, transcript JSONL, checkpoint, session-store DB). Only process:
- Sessions not in the manifest (new sessions)
- Sessions whose
updated_atis newer than theiringested_atin the manifest
This is usually what you want — the user ran a few new sessions and wants to capture the delta.
Full Mode
Process everything regardless of manifest. Use after a wiki-rebuild or if the user explicitly asks.
GitHub Copilot Data Layout
Copilot stores data in three locations. Scan all three.
Source 1: ~/.copilot/session-state/ (CLI sessions)
~/.copilot/session-state/
├── <session-uuid>/
│ ├── workspace.yaml # Session metadata (id, cwd, summary_count, created_at, updated_at)
│ ├── vscode.metadata.json # VS Code context (workspaceFolder, repositoryProperties, customTitle)
│ ├── events.jsonl # Full event log — all turns, tool calls, reasoning
│ ├── session.db # Per-session SQLite (todos/todo_deps only — skip for ingestion)
│ ├── index.md # Session summary written at session end
│ ├── checkpoints/ # Checkpoint JSON files (mid-session summaries)
│ │ └── <uuid>.json # title, overview, history, work_done, technical_details,
│ │ # important_files, next_steps
│ ├── files/ # Artifacts produced during session (plans, diagrams, etc.)
│ └── research/ # Research artifacts
└── ...Source 2: ~/.copilot/session-store.db (Global SQLite)
The canonical cross-session database. This is the highest-value source: structured, queryable, and pre-summarised.
sessions — id, cwd, repository, branch, summary, created_at, updated_at, host_type
turns — session_id, turn_index, user_message, assistant_response, timestamp
checkpoints — session_id, checkpoint_number, title, overview, history, work_done,
technical_details, important_files, next_steps, created_at
session_files — session_id, file_path, tool_name, turn_index, first_seen_at
session_refs — session_id, ref_type (commit/pr/issue), ref_value, turn_index, created_at
search_index — FTS5 virtual table (content, session_id, source_type, source_id)Source 3: VS Code Workspace Storage (<workspaceStorage>/<hash>/GitHub.copilot-chat/)
VS Code extension data, keyed by workspace hash. The path is platform-specific and must come from .env or user input.
<hash>/GitHub.copilot-chat/
├── transcripts/
│ └── <session-uuid>.jsonl # Conversation transcripts (same JSONL format as events.jsonl)
├── memory-tool/
│ └── memories/
│ └── <base64-session-id>/ # Per-session saved artifacts (plan.md, etc.)
│ └── plan.md
└── codebase-external.sqlite # Codebase index (skip — no conversation knowledge)Key data sources ranked by value:
- Checkpoints (
session-store.dbcheckpointstable + per-sessioncheckpoints/*.json) — Pre-distilled summaries withoverview,work_done,technical_details,important_files,next_steps. Gold. - Session summaries (
session-store.dbsessions.summary+index.md) — One-paragraph synopsis per session. - Turns (
session-store.dbturnstable +events.jsonl/ transcript JSONL) — Full conversation. Rich but verbose. - Memory artifacts (
memory-tool/memories/<id>/plan.mdetc.) — Pre-written plans and structured notes the user saved explicitly. Worth importing verbatim (or lightly summarised). - File access patterns (
session_filestable +tool.execution_*events) — Which files the agent repeatedly touched — reveals high-value project files. - Session refs (
session_refstable) — Commits, PRs, and issues linked to sessions. vscode.metadata.json— Workspace folder path, branch,customTitle(user-set session label). Useful for grouping and naming.
Step 1: Survey and Compute Delta
Scan all three data locations and compare against .manifest.json:
# --- Source 1: per-session directories ---
# Find all session directories (each has workspace.yaml)
ls ~/.copilot/session-state/
# For each session, read workspace.yaml for id/cwd/updated_at
# and vscode.metadata.json for customTitle / repositoryProperties
# --- Source 2: global database ---
# Query session-store.db with sqlite3 (or Python sqlite3)
SELECT s.id, s.cwd, s.repository, s.branch, s.summary, s.updated_at,
COUNT(DISTINCT t.turn_index) AS turn_count,
COUNT(DISTINCT c.id) AS checkpoint_count
FROM sessions s
LEFT JOIN turns t ON t.session_id = s.id
LEFT JOIN checkpoints c ON c.session_id = s.id
GROUP BY s.id
ORDER BY s.updated_at DESC;
# --- Source 3: VS Code workspace storage ---
# For each <hash> directory under workspaceStorage, check for GitHub.copilot-chat/
# Find transcript files
ls <workspaceStorage>/<hash>/GitHub.copilot-chat/transcripts/Build a unified inventory — one entry per session UUID — and classify:
- New — not in manifest → needs ingesting
- Modified — in manifest but
updated_atis newer → needs re-ingesting - Unchanged — in manifest and not modified → skip in append mode
Report to the user: "Found X sessions in session-state, Y in session-store.db, Z VS Code transcript files. Checkpoints: A. Delta: B new, C modified."
Step 2: Ingest Checkpoints and Summaries First
Checkpoints are already distilled — process them before touching raw turns.
From session-store.db:
SELECT s.id, s.cwd, s.repository, s.branch, s.summary,
c.checkpoint_number, c.title, c.overview, c.work_done,
c.technical_details, c.important_files, c.next_steps,
c.created_at
FROM checkpoints c
JOIN sessions s ON c.session_id = s.id
ORDER BY s.updated_at DESC, c.checkpoint_number ASC;From per-session checkpoints/*.json:
Each checkpoint file has: title, overview, history, work_done, technical_details, important_files, next_steps.
Read index.md (if present) as a session-level summary — it's typically written at session end and is already concise.
What to extract:
overview→ high-level description of what the session accomplishedwork_done→ concrete tasks completed (good for skills / project pages)technical_details→ implementation specifics (good for concepts pages)important_files→ high-value files in the project (good for project pages)next_steps→ open threads (good for linking to ongoing project work)
Step 3: Parse Session Turns
Read turns from session-store.db (preferred — already parsed) or from events.jsonl / transcript JSONL.
From session-store.db:
SELECT turn_index, user_message, assistant_response, timestamp
FROM turns
WHERE session_id = '<uuid>'
ORDER BY turn_index ASC;From events.jsonl / transcript JSONL:
Each file is one session. Each line is a JSON event. See references/copilot-data-format.md for the full schema.
Relevant event types:
type | What it is | Worth reading? |
session.start | Session metadata (cwd, branch, version) | Yes — establishes project context |
user.message | User turn | Yes — data.content |
assistant.message | Assistant turn | Yes — data.content (text) + data.toolRequests |
tool.execution_start | Tool call | Skim — reveals what files/commands were used |
tool.execution_end | Tool result | No — usually noise |
Extraction strategy for assistant.message:
data.contentis the assistant's text response — extract thisdata.reasoningTextis internal reasoning — skip (it's the unpackedreasoningOpaquefield)data.toolRequestslists tool calls — skim tool names and arguments for file access patterns- Skip
type: "tool.execution_end"entirely
Step 3b: Process Memory Artifacts
For each session that has a memory-tool/memories/<base64-id>/ directory in VS Code workspace storage, read any markdown files saved there (typically plan.md). These are documents the user explicitly saved — treat them as high-quality, user-authored content.
Decode the base64 directory name to get the session UUID:
import base64
session_id = base64.b64decode(dir_name).decode('utf-8')Memory artifacts map to project skills/ or concepts/ pages, depending on content type.
Step 3c: Extract File and Ref Patterns
From session-store.db:
-- Most-touched files per project
SELECT repository, file_path, COUNT(*) AS touch_count
FROM session_files
GROUP BY repository, file_path
ORDER BY touch_count DESC;
-- Linked commits/PRs/issues per session
SELECT session_id, ref_type, ref_value, turn_index
FROM session_refs
ORDER BY session_id, turn_index;File access patterns reveal which files are architecturally important — note them on project pages.
Session refs link Copilot sessions to git history — useful for connecting wiki knowledge to concrete code changes.
Step 4: Cluster by Topic
Don't create one wiki page per session. Instead:
- Group extracted knowledge by topic across sessions
- A single session about "debugging auth + setting up CI" → two separate topics
- Three sessions across different days about "React performance" → one merged topic
cwd/repositorygive you a natural first-level grouping;vscode.metadata.json'scustomTitlegives a human-readable session label
Step 5: Distill into Wiki Pages
Each Copilot project maps to a project directory in the vault. Derive the project name from cwd or repository:
C:\Users\name\git\my-project → my-project
/Users/name/code/another-app → another-appPrefer repository (e.g., owner/repo) from session-store.db over raw cwd when available.
Project-specific vs. global knowledge
| What you found | Where it goes | Example |
| Project architecture decisions | projects/<name>/concepts/ | projects/my-project/concepts/main-architecture.md |
| Project-specific debugging patterns | projects/<name>/skills/ | projects/my-project/skills/api-rate-limiting.md |
| General concept the user learned | concepts/ (global) | concepts/react-server-components.md |
| Recurring problem across projects | skills/ (global) | skills/debugging-hydration-errors.md |
| A tool/service used | entities/ (global) | entities/vercel-functions.md |
| Patterns across many sessions | synthesis/ (global) | synthesis/common-debugging-patterns.md |
For each project with content, create or update the project overview page at projects/<name>/<name>.md — named after the project, not _project.md. Obsidian's graph view uses the filename as the node label, so _project.md makes every project show up as _project in the graph. Naming it <name>.md gives each project a distinct, readable node name.
Important: Distill the knowledge, not the conversation. Don't write "In a session on March 15, the user asked about X." Write the knowledge itself, with the session as a source attribution.
Write a summary: frontmatter field on every new/updated page — 1–2 sentences, ≤200 chars, answering "what is this page about?" for a reader who hasn't opened it. wiki-query's cheap retrieval path reads this field to avoid opening page bodies.
Add confidence and lifecycle fields to every new page's frontmatter:
base_confidence: 0.42
lifecycle: draft
lifecycle_changed: <obsidian-wiki memory now --date>Leave lifecycle unchanged on update.
Mark provenance per the convention in llm-wiki (Provenance Markers section):
- Checkpoints and index.md are pre-distilled by the system — treat checkpoint-derived claims as extracted (the system wrote them from observed actions).
- Memory artifacts are user-authored — treat as extracted.
- Conversation turn distillation is mostly inferred. You're synthesizing a coherent claim from many turns. Apply
^[inferred]liberally to synthesized patterns, generalizations across sessions, and "what the user really meant" interpretations. - Use
^[ambiguous]when the user changed direction mid-session or when the session ended unresolved. - Write a
provenance:frontmatter block on every new/updated page summarizing the rough mix.
Step 6: Update Manifest, Journal, and Special Files
Update .manifest.json
For each session processed, add/update its entry with:
ingested_at,session_id,updated_atsource_type: one of"copilot_session","copilot_checkpoint","copilot_transcript","copilot_memory_artifact"project: the decoded project namepages_createdandpages_updatedlists
Also update the projects section of the manifest:
{
"project-name": {
"repository": "owner/repo",
"cwd": "C:\\Users\\name\\git\\project-name",
"vault_path": "projects/project-name",
"last_ingested": "TIMESTAMP",
"sessions_ingested": 5,
"sessions_total": 8,
"checkpoints_ingested": 12,
"memory_artifacts_ingested": 3
}
}Create journal entry + update special files
Update index.md, log.md, and hot.md with one locked call:
obsidian-wiki memory sync COPILOT_HISTORY_INGEST \
projects=<projects> sessions=<sessions> checkpoints=<checkpoints> \
pages_updated=<pages_updated> pages_created=<pages_created> \
mode=<mode> \
--takeaways "Ingested 5 Copilot sessions across 2 projects; surfaced patterns in API design and testing strategy."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.
If an ongoing project is now better understood, record the thread so the next
session picks it up: obsidian-wiki memory todo add "<thread>" --origin projects/<name>.md.
See skills/llm-wiki/references/MEMORY.md for the full procedure.
Privacy
- Distill and synthesize — don't copy raw conversation text verbatim
- Skip anything that looks like secrets, API keys, passwords, tokens
data.reasoningOpaque/data.reasoningTextin assistant events is internal reasoning — skip entirely, never copy to wiki- If you encounter personal/sensitive content, ask the user before including it
- The user's conversations may reference other people — be thoughtful about what goes in the wiki
Reference
See references/copilot-data-format.md for detailed data structure documentation.
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.
${QMD_CLI:-qmd} updateIf the output says vectors are needed or embeddings may be stale, run:
${QMD_CLI:-qmd} embedVerify the collection with either:
${QMD_CLI:-qmd} ls "$QMD_WIKI_COLLECTION"or, when a specific page path is known:
${QMD_CLI:-qmd} get "qmd://$QMD_WIKI_COLLECTION/<page>.md" -l 5Record one of:
QMD refreshed: update + embed + verifiedQMD refreshed: update only + verifiedQMD skipped: QMD_WIKI_COLLECTION unsetQMD skipped: qmd CLI unavailableQMD failed: <short error summary>
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

