研发协作
需要把 GitHub Copilot CLI/VS…
当你希望把 GitHub Copilot CLI 会话、checkpoint、turn、memory artifact 等捕获到 Obsidian 个人 wiki,并提炼架构决策、调试笔记和可复用模式时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
需要把 GitHub Copilot C特定
解决思路
- 可直接调用本技能,或通过 `wiki-history-ingest` 路由(`/wiki-history-ingest copilot`)调用。
- 起草或重写自然语言 Markdown 前,读取并应用 `llm-wiki/SKILL.md` 的 `Writing Profile Resolution` 部分;框架 schema、provenance、safety 和操作特定要求优先;`WRITING.md` 偏好只适用于新起草或重写的自然语言 Markdown,保留源内容与结构化记录。
- 按 `llm-wiki/SKILL.md` 的 Config Resolution Protocol 解析配置:inline `@name` override → 从 CWD 向上查找 `.env` → 全局配置 → 提示设置;获得 `OBSIDIAN_VAULT_PATH`、`COPILOT_HISTORY_PATH`(默认 `~/.copilot/session-state`)、`COPILOT_VSCODE_STORAGE_PATH`(VS Code `workspaceStorage`;平台相关,缺失时询问用户)。
- 读取 vault 根目录的 `.manifest.json`,检查已摄入内容。
- 读取 vault 根目录的 `index.md`,了解 wiki 已包含内容。
- 默认使用 Append Mode:检查 `.manifest.json` 中每个源文件(events JSONL、transcript JSONL、checkpoint、session-store DB),只处理 manifest 中没有的 session,以及 `updated_at` 比 `ingested_at` 新的 session。
- 需要时使用 Full Mode:无论 manifest 都处理所有内容;在 `wiki-rebuild` 后或用户明确要求时使用。
- 扫描全部三个 Copilot 数据位置:`~/.copilot/session-state/`、`~/.copilot/session-store.db`、VS Code `<workspaceStorage>/<hash>/GitHub.copilot-chat/`。
- 对 Source 1,检查 `~/.copilot/session-state/<session-uuid>/` 下的 `workspace.yaml`、`vscode.metadata.json`、`events.jsonl`、`session.db`(摄入时跳过)、`index.md`、`checkpoints/<uuid>.json`、`files/`、`research/`。
- 对 Source 2,查询 `~/.copilot/session-store.db` 全局 SQLite;这是最高价值来源;使用 `sessions`、`turns`、`checkpoints`、`session_files`、`session_refs`、`search_index` 表。
- 对 Source 3,检查 VS Code workspace storage 中按 workspace hash 分组的 `transcripts/<session-uuid>.jsonl`、`memory-tool/memories/<base64-session-id>/` 下如 `plan.md` 的每会话保存产物;跳过 `codebase-external.sqlite`。
- 按价值排序处理数据:1) checkpoints(`session-store.db` 的 `checkpoints` 表 + 每会话 `checkpoints/*.json`)中的 `overview`、`work_done`、`technical_details`、`important_files`、`next_steps`;2) session summaries(`session-store.db` 的 `sessions.summary` + `index.md`);3) turns(`session-store.db` 的 `turns` 表 + `events.jsonl` / transcript JSONL);4) memory artifacts;5) file access patterns;6) session refs;7) `vscode.metadata.json` 的 workspace folder path、branch、`customTitle`。
- Step 1:扫描三个数据位置并与 `.manifest.json` 比较;对 Source 1 运行 `ls ~/.copilot/session-state/`,对每个 session 读取 `workspace.yaml` 的 id/cwd/updated_at 和 `vscode.metadata.json` 的 customTitle/repositoryProperties。
- Step 1:对 Source 2 用 sqlite3 或 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;`。
- Step 1:对 Source 3 遍历 workspaceStorage 下每个 `<hash>`,检查 `GitHub.copilot-chat/`,运行 `ls <workspaceStorage>/<hash>/GitHub.copilot-chat/transcripts/`。
- Step 1:构建统一 inventory,每个 session UUID 一条,分类为 New、Modified、Unchanged。
- Step 1:向用户报告: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:先摄入 checkpoints 和 summaries,再处理原始 turns。
- Step 2:从 `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;`。
- Step 2:从每会话 `checkpoints/*.json` 读取 `title`、`overview`、`history`、`work_done`、`technical_details`、`important_files`、`next_steps`。
- Step 2:如存在,读取 `index.md` 作为 session-level summary;它通常在 session 结束时写入且已简洁。
- Step 2:提取映射:`overview` → 高层描述;`work_done` → 已完成具体任务;`technical_details` → 实现细节;`important_files` → 高价值文件;`next_steps` → 未决线程。
- Step 3:从 `session-store.db`(优先)或 `events.jsonl` / transcript JSONL 读取 turns。
- Step 3:从 DB 执行查询 `SELECT turn_index, user_message, assistant_response, timestamp FROM turns WHERE session_id = '<uuid>' ORDER BY turn_index ASC;`。
- Step 3:从 JSONL 读取时,每个文件一个 session,每行一个 JSON event;参见 `references/copilot-data-format.md` 获取完整 schema。
- Step 3:相关事件类型:`session.start` 读,建立项目上下文;`user.message` 读 `data.content`;`assistant.message` 读 `data.content`(文本)+ `data.toolRequests`;`tool.execution_start` 略读,揭示使用文件/命令;`tool.execution_end` 通常噪音,不读。
- Step 3:对 `assistant.message`,提取 `data.content`;跳过 `data.reasoningText`(内部推理,即 `reasoningOpaque` 展开);略读 `data.toolRequests` 的工具名和参数以获取文件访问模式;完全跳过 `type: tool.execution_end`。
- Step 3b:对每个在 VS Code workspace storage 中有 `memory-tool/memories/<base64-id>/` 的 session,读取保存的 markdown 文件(通常 `plan.md`);视为高质量用户撰写内容。
- Step 3b:解码 base64 目录名得到 session UUID:`import base64; session_id = base64.b64decode(dir_name).decode('utf-8')`。
- Step 3b:将 memory artifacts 映射到项目 `skills/` 或 `concepts/` 页面,取决于内容类型。
- Step 3c:从 `session-store.db` 执行查询 `SELECT repository, file_path, COUNT(*) AS touch_count FROM session_files GROUP BY repository, file_path ORDER BY touch_count DESC;`。
- Step 3c:从 `session-store.db` 执行查询 `SELECT session_id, ref_type, ref_value, turn_index FROM session_refs ORDER BY session_id, turn_index;`。
- Step 3c:文件访问模式揭示架构重要文件,记到项目页面;session refs 连接 Copilot 会话与 git 历史,把 wiki 知识与具体代码变更关联。
- Step 4:不要每个 session 创建一页;按主题跨 session 聚类提取的知识。
- Step 4:单 session 关于 debugging auth + setting up CI → 拆成两个主题;多天三个 session 关于 React performance → 合并成一个主题。
- Step 4:`cwd` / `repository` 提供自然一级分组;`vscode.metadata.json` 的 `customTitle` 提供人类可读 session 标签。
- Step 5:每个 Copilot 项目映射到 vault 中一个项目目录;从 `cwd` 或 `repository` 派生项目名,例如 `C:\Users\name\git\my-project` → `my-project`,`/Users/name/code/another-app` → `another-app`。
- Step 5:优先使用 `session-store.db` 的 `repository`(如 `owner/repo`)而非原始 `cwd`。
- Step 5:按映射归档:项目架构决策 → `projects/<name>/concepts/`;项目特定调试模式 → `projects/<name>/skills/`;用户学到的一般概念 → `concepts/`(全局);跨项目重复问题 → `skills/`(全局);使用的工具/服务 → `entities/`(全局);跨多个 session 的模式 → `synthesis/`(全局)。
- Step 5:对每个有内容的项目,创建或更新项目总览页 `projects/<name>/<name>.md`——以项目命名,不是 `_project.md`;Obsidian 图谱视图用文件名作为节点标签,`_project.md` 会让所有项目显示为 `_project`,用 `<name>.md` 给每个项目清晰可读节点名。
- Step 5:提炼知识而非对话;不要写 In a session on March 15, the user asked about X.;写知识本身,并把 session 作为来源归因。
- Step 5:每个新建/更新页面写 `summary:` frontmatter 字段——1–2 句,≤200 字符,回答 what is this page about?;`wiki-query` 的廉价检索路径读取该字段以避免打开页面正文。
- Step 5:每个新页面 frontmatter 添加 confidence 和 lifecycle 字段:`base_confidence: 0.42`、`lifecycle: draft`、`lifecycle_changed: <ISO date today>`;更新时保持 `lifecycle` 不变。
- Step 5:按 `llm-wiki` 的 Provenance Markers 标注 provenance:checkpoints 和 index.md 由系统预提炼,checkpoint 衍生声明视为 extracted;memory artifacts 用户撰写,视为 extracted;conversation turn distillation 大多是 inferred;对综合模式、跨 session 泛化、用户真正意思解释大量使用 `^[inferred]`;当用户中途改变方向或 session 未解决时使用 `^[ambiguous]`;每个新建/更新页面写 `provenance:` frontmatter 块总结大致混合。
- Step 6:更新 `.manifest.json`:每个处理过的 session 添加/更新 `ingested_at`、`session_id`、`updated_at`、`source_type`(`copilot_session`、`copilot_checkpoint`、`copilot_transcript`、`copilot_memory_artifact` 之一)、`project`(解码后的项目名)、`pages_created` 和 `pages_updated` 列表。
- Step 6:更新 manifest 的 `projects` 段,包含 `repository`、`cwd`、`vault_path`、`last_ingested`、`sessions_ingested`、`sessions_total`、`checkpoints_ingested`、`memory_artifacts_ingested` 等字段。
- Step 6:创建 journal entry 并更新特殊文件:按标准流程更新 `index.md` 和 `log.md`,写入 `- [TIMESTAMP] COPILOT_HISTORY_INGEST projects=N sessions=M checkpoints=C pages_updated=X pages_created=Y mode=append|full`。
- Step 6:读取 `$OBSIDIAN_VAULT_PATH/hot.md`(如果缺失,从 `wiki-ingest` 模板创建);用一行摘要更新 Recent Activity,例如 Ingested 5 Copilot sessions across 2 projects; surfaced patterns in API design and testing strategy.;保留最近 3 次操作;如果有进行中项目理解更好,更新 Active Threads;更新 `updated` 时间戳。
- Privacy:提炼和综合——不要逐字复制原始对话文本;跳过看似 secrets、API keys、passwords、tokens 的内容;`data.reasoningOpaque` / `data.reasoningText` 是内部推理,完全跳过,绝不复制到 wiki;遇到个人/敏感内容,先询问用户再纳入;用户对话可能引用其他人,谨慎决定放入 wiki 的内容。
- Reference:查看 `references/copilot-data-format.md` 获取详细数据结构文档。
- QMD Refresh:QMD 是搜索索引不是事实来源;如果 `$QMD_WIKI_COLLECTION` 为空或未设置,跳过;仅在本技能写入或重写 vault markdown 后运行;如果 QMD 刷新失败,不要回滚 vault 更改;单独报告 QMD 状态。
- QMD Refresh:如果设置了 `$QMD_CLI` 则使用它,否则使用 `qmd`;运行 `${QMD_CLI:-qmd} update`。
- QMD Refresh:如果输出说需要 vectors 或 embeddings 可能过期,运行 `${QMD_CLI:-qmd} embed`。
- QMD Refresh:用 `${QMD_CLI:-qmd} ls "$QMD_WIKI_COLLECTION"` 验证集合,或在已知具体页面路径时用 `${QMD_CLI:-qmd} get "qmd://$QMD_WIKI_COLLECTION/<page>.md" -l 5`。
- QMD Refresh:记录以下之一:`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>`。
适用边界 · 注意事项
- 不适用于一般 Copilot 使用问题、搜索会话或备份历史。
- 没有 Obsidian vault、未配置 Copilot 历史路径,或没有可摄入的 Copilot CLI/VS Code 会话历史时不要用。
- 用户只想查询/检索已有 wiki 而非摄入新会话历史时不要用。