
Copilot History Ingest
Parse GitHub Copilot CLI session-state on disk and turn events.jsonl transcripts into structured Obsidian wiki pages with meaningful session titles.
Install
npx skills add https://github.com/ar9av/obsidian-wiki --skill copilot-history-ingestWhat is this skill?
- Maps ~/.copilot/session-state/<uuid> layout: workspace.yaml, vscode.metadata.json, events.jsonl
- Uses customTitle from vscode.metadata.json as the human-readable session heading when present
- Documents session.start and full JSONL event types for faithful ingestion pipelines
- Handles summary_count and zero-checkpoint sessions by still scanning events.jsonl
- Pairs with obsidian-wiki config resolution for vault-targeted ingest
Adoption & trust: 899 installs on skills.sh; 1.8k GitHub stars; 3/3 security scanners passed (skills.sh audits).
Recommended Skills
Journey fit
Primary shelf is Build docs because the skill materializes agent session logs into durable wiki documentation, though it also supports Operate iteration retrospectives. Docs captures turning ~/.copilot/session-state UUID folders into human-readable vault artifacts—not runtime Copilot configuration.
Common Questions / FAQ
Is Copilot History Ingest safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.
SKILL.md
READMESKILL.md - Copilot History Ingest
# GitHub Copilot CLI Data Format — Detailed Reference ## Session-State Directory `~/.copilot/session-state/` contains one directory per session the user has run with GitHub Copilot CLI. Each directory is named with a UUID. ### `workspace.yaml` Minimal session metadata file, always present: ```yaml id: <session-uuid> cwd: /path/to/project summary_count: 3 created_at: 2026-04-02T14:28:13.304Z updated_at: 2026-04-29T12:00:00.000Z ``` `summary_count` reflects how many checkpoints were written. Sessions with `summary_count: 0` were either very short or completed without checkpointing — check `events.jsonl` for content anyway. ### `vscode.metadata.json` VS Code context, written when the session is associated with a VS Code workspace: ```json { "workspaceFolder": { "folderPath": "c:\\Users\\name\\git\\my-project", "timestamp": 1773245818098 }, "writtenToDisc": true, "repositoryProperties": { "repositoryPath": "c:\\Users\\name\\git\\my-project", "branchName": "feature/my-branch", "baseBranchName": "origin/main" }, "customTitle": "User-written session label or system-set title" } ``` `customTitle` is the most human-readable session label — use it as a heading when creating session-derived wiki content. May be absent on older sessions. ### `events.jsonl` The full event log for one session. Each line is a JSON object representing one event in the session. #### Event: `session.start` ```json { "type": "session.start", "data": { "sessionId": "09371a50-9a50-484a-8743-5c696de1623a", "version": 1, "producer": "copilot-agent", "copilotVersion": "0.0.420", "startTime": "2026-03-02T15:10:04.678Z", "context": { "cwd": "C:\\Users\\name\\git\\my-project", "gitRoot": "C:\\Users\\name\\git\\my-project", "branch": "master" } }, "id": "<event-uuid>", "timestamp": "2026-03-02T15:10:04.817Z", "parentId": null } ``` `data.context.cwd` and `data.context.branch` establish the project context. Always read `session.start` first. #### Event: `user.message` ```json { "type": "user.message", "data": { "content": "review my staged but uncommitted changes for issues", "transformedContent": "<current_datetime>...</current_datetime>\n\nreview my staged...", "attachments": [], "interactionId": "9352571e-a0b9-4774-8ecb-40bc58f86e94" }, "id": "<event-uuid>", "timestamp": "2026-03-02T15:10:45.058Z", "parentId": "<parent-event-uuid>" } ``` Use `data.content` (not `data.transformedContent`) — the transformed version includes injected system context that's noise for wiki purposes. #### Event: `assistant.message` ```json { "type": "assistant.message", "data": { "messageId": "<uuid>", "content": "I'll review the staged changes in those three files.", "toolRequests": [ { "toolCallId": "tooluse_...", "name": "report_intent", "arguments": { "intent": "Reviewing staged changes" }, "type": "function" }, { "toolCallId": "tooluse_...", "name": "powershell", "arguments": { "command": "git --no-pager diff --cached --stat", "description": "Show staged diff" }, "type": "function" } ], "interactionId": "9352571e-a0b9-4774-8ecb-40bc58f86e94", "reasoningOpaque": "<base64-encrypted-reasoning>", "reasoningText": "The user wants me to review staged git changes..." }, "id": "<event-uuid>", "timestamp": "2026-03-02T15:10:50.235Z", "parentId": "<parent-event-uuid>" } ``` **Extraction strategy:** - Extract `data.content` — the assistant's visible text response - `data.toolRequests` — skim tool names and description arguments for file/command patterns; ignore `report_intent` calls - **Skip `data.reasoningOpaque` entirely** — encrypted/encoded internal reasoning - **Skip `data.reasoningText` entirely** — decrypted reasoning; internal only, never user-visible #### Event: `assistant.turn_start` ```json {