十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Awesome Copilot 的 where-was-i 插件:用 Git 上下文画布实现开发中断快速恢复

Awesome Copilot 的 where-was-i 插件:用 Git 上下文画布实现开发中断快速恢复 Awesome Copilot 的 where-was-i 插件用 Git 上下文画布实现开发中断快速恢复【免费下载链接】awesome-copilotCommunity-contributed instructions, agents, skills, and configurations to help you make the most of GitHub Copilot.项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-copilot本篇文章深入解析 GitHub Copilot 插件市场 Awesome Copilot 社区中的 where-was-i 插件它是一款面向「中断恢复」场景的交互式 Canvas 扩展能自动重建你离开时的开发上下文当前分支、工作区提交、未提交改动、打开中的 PR/Issue 线索并在画布上一键把完整上下文发送给 Copilot Agent生成针对性的续接提示。读完本文你将掌握该插件的安装方法、四个核心 Agent 动作的职责、底层 Git 上下文采集的实现原理、安全设计以及测试验证方式并可直接在 Copilot CLI 中投入使用。一、插件定位给中断的开发状态拍一张「快照」在日常开发中中断随时发生——开会、处理告警、切换任务回来时往往要花很长时间回忆「我刚才在哪个分支、改到哪了、还有哪些事没做完」。where-was-i 插件解决的正是这一痛点。根据 插件元数据它的官方描述是Reconstruct your dev context (branch, commits, uncommitted work, PR clues) and trigger a resume prompt to continue quickly.即重建你的开发上下文分支、提交、未提交工作、PR 线索并触发一个续接提示以快速继续。该插件由 Aaron Powell 维护当前版本 1.1.0关键词覆盖branch-state、developer-context、git-history、interrupt-recovery、pull-request-context、resume-work等场景标签。从结构上看它是一个典型的 Copilot Extension Canvas 组合扩展入口位于 extensions/where-was-i/extension.mjs核心的 Git 采集逻辑独立在 extensions/where-was-i/git-context.mjs并有配套测试 extensions/where-was-i/git-context.test.mjs。插件目录 plugins/where-was-i/README.md 则面向使用者提供安装说明。二、安装与启用Awesome Copilot 本身是 Copilot CLI 与 VS Code 的默认插件市场详见 docs/README.plugins.md无需额外配置市场源。where-was-i 的安装与所有 Awesome Copilot 插件一致使用 Copilot CLI 执行copilot plugin install where-was-iawesome-copilot安装完成后在 Copilot CLI 会话中即可找到并使用该插件。也可以在 VS Code 中打开扩展搜索视图输入agentPlugins或通过命令面板运行Chat: Plugins浏览并启用。插件本身以 MIT 协议开源。三、工作流程从「重建上下文」到「一键续接」整个插件的交互流程可以概括为四个阶段均可以在 extension.mjs 中找到对应实现打开画布open回调启动一个本地 HTTP 服务器并调用gatherContext()立即采集一次当前工作区的 Git 上下文返回画布 URLextension.mjs。渲染上下文浏览器端通过/context接口获取上下文 JSON渲染出分支栏、提交列表/Git 图、未提交变更列表、打开的 PR/Issue 卡片。按需刷新点击画布中的 Refresh 按钮或触发refreshAgent 动作会重新采集并推送最新数据。一键续接点击「Resume where I left off」按钮或点击某张 PR/Issue 卡片插件把完整上下文或该线程上下文组装成一段续接提示通过sessionRef.send(prompt)直接发送给当前 Copilot 会话让 Agent 基于真实状态给出「接下来先做什么」的建议。四、Git 上下文采集四个 Agent 动作与数据模型插件在 Canvas 上注册了四个 Agent 动作actions外部 Agent 或模型可以随时调用动作名职责关键实现refresh重新采集全部 git/项目上下文并推送更新到画布调gatherContext(cwd)更新缓存并broadcastget_context返回当前已组装的开发上下文JSON直接返回contextCache中缓存的数据get_file_diff返回某个变更文件的 staged / unstaged / untracked 补丁调getFileDiff(cwd, path, code)resume向 Agent 发送带开发状态的「续接」消息组装提示词并sessionRef.send(prompt)4.1 上下文数据结构gatherContext()在 extension.mjs 中把两部分数据合并为一份完整上下文一部分来自gatherGitContext()Git 仓库状态另一部分通过ghCLI 并发查询当前用户打开的 PR 与指派给自己的 Issue各取前 10 条分别调用gh pr list --authorme --stateopen --limit10与gh issue list --assigneeme --stateopen --limit10。即使gh未安装或未登录PR/Issue 查询失败也不会阻断 Git 上下文采集——这里使用Promise.allSettled容错失败信息会汇总进warnings数组最终以 JSON 形式返回包含worktreeRoot/worktreeName仓库根目录与目录名branch当前分支detached HEAD时为 nullhead当前 HEAD 短哈希空仓库时为 nullbaseRef基准分支依次尝试origin/HEAD、origin/main、origin/master、main、master见 git-context.mjsahead/behind与基准分支的分叉计数branchCommits当前分支领先于 merge-base 的提交recentCommits最近 10 条提交commitGraph带 ASCII 图形的提交历史最多 40 条含--decorate引用标注uncommitted/changes解析后的未提交变更含状态码、路径、重命名原路径diffStat/stagedDiffStat/unstagedDiffStatdiff 统计openPrs/assignedIssues打开的 PR 与指派 IssuegatheredAt采集时间戳。4.2 状态解析porcelain -z 与重命名处理未提交变更的解析是上下文可靠性的关键。git-context.mjs 中定义了采集命令git status --porcelainv1 -z --untracked-filesall随后由parseStatusOutput()按 NUL 分隔解析。使用-z模式的核心收益是路径永远不会被引号包裹含空格、特殊字符的文件名都能被准确还原同时对重命名/复制条目状态码含R/C会顺带读取紧随其后的ORIG_PATH字段git-context.mjs从而保留旧路径 - 新路径的完整信息。测试 git-context.test.mjs 专门验证了含空格的路径与git mv重命名的解析断言 diff 中必须出现rename from/rename to。4.3 边界情况空仓库、SHA-256 与基准分支未出生分支freshgit init没有 HEAD 提交时head为空、baseRef为 null、提交相关字段为空数组但暂存与未跟踪文件仍会采集diff 统计则以空树对象hash-object -t tree --stdin输入空串为基线计算git-context.mjs。对应测试见 git-context.test.mjs。SHA-256 对象格式仓库不会硬编码 SHA-1 空树哈希而是动态计算测试覆盖了git init --object-formatsha256场景git-context.test.mjs。基准分支探测resolveBaseRef()会逐一对候选 ref 执行rev-parse --verify --quiet只返回真实存在的引用避免在只有main没有origin的本地仓库中误判。4.4 Git 图的可折叠历史为让画布聚焦当前分支的提交splitCommitGraph()计算「基准历史折叠点」由于--topo-order可能把更新的基准提交穿插在分支提交之上折叠点必须取最后一个分支提交之后的第一个基准提交行git-context.mjs。测试断言了分叉图上分支提交永远不会落入折叠区git-context.test.mjs保证用户始终能一眼看到自己分支的提交而早期基准历史被收进可展开的details区域。五、画布界面与交互插件的 HTML 界面由 renderHtml() 渲染采用 DM Sans 与 IBM Plex Mono 字体白底浅色卡片风格。界面从上到下依次展示状态区标题「Where was I?」、基于gatheredAt计算的中断时长标签如 Youre still in the zone、Away for 2h 15m以及 Refresh 按钮分支栏当前 Worktree 名称、分支名、以及相对基准分支的N ahead · M behind分叉信息Git 图 / 最近提交优先展示带装饰引用的 Git 提交图工作区提交高亮无图时降级为最近提交列表未提交变更每个文件一行带状态徽章Modified / Staged / Added / Deleted / Renamed / Untracked / Conflicted点击「View diff」可弹出右侧抽屉查看该文件的完整补丁打开中的线程当前用户打开的 PRPR 徽章与指派给自己的 IssueIssue 徽章点击即可针对该线程发起续接续接区醒目的「↩ Resume where I left off」按钮。前端通过 SSE/events接口订阅上下文推送refresh动作或服务端广播会实时更新画布内容无需手动刷新页面extension.mjs。六、续接提示的组装点击「Resume」或某张线程卡片时服务端在/resume接口中根据当前上下文动态组装提示词extension.mjs普通续接包含 Worktree、Branch、Worktree commits、Uncommitted changes、Diff stat、Open PRs、Assigned issues结尾明确要求 Agent「Help me pick up where I left off. What should I focus on first?」线程续接以I was working on #123: 标题 and got interrupted...开头聚焦指定 PR/Issue让 Agent 优先处理该线程。组装完成后调用sessionRef.send(prompt)把提示注入当前 Copilot 会话从而把「人肉回忆上下文」变成「Agent 基于事实数据给出续接建议」。resumeAgent 动作内部也实现了同样的组装逻辑可供 Agent 程序化调用extension.mjs。七、安全设计本地服务、令牌校验与路径防护Canvas 界面运行在插件启动的本地 HTTP 服务器上仅监听127.0.0.1并对每个实例生成 32 字节随机令牌randomBytes(32).toString(base64url)。所有请求必须携带该令牌URL 查询参数k并用timingSafeEqual进行恒定时间比较同时校验Host与Origin头杜绝跨站请求伪造extension.mjs。页面本身使用严格的 CSPdefault-src none、脚本仅允许 nonce、connect-src self防止注入。文件 diff 接口则有路径穿越防护assertRepositoryPath()会把请求路径解析后重新relative()回仓库根目录任何逃逸出工作区的路径都会抛出「The requested file must be inside the current worktree」错误git-context.mjs。此外未跟踪文件预览拒绝跟随符号链接——lstat检查到 symlink 时只展示链接目标文本本身而不是解引用读取目标文件测试用指向仓库外secret.txt的链接验证了敏感内容不会被泄露git-context.test.mjs。未跟踪文件还有 512 KB 的大小上限与二进制内容检测防止把超大或二进制文件渲染进 diff。八、测试与质量保障插件对最容易出错的 Git 解析逻辑编写了完整测试套件运行方式为node --test extensions/where-was-i/git-context.test.mjs测试覆盖的关键场景包括分支提交、staged/unstaged/untracked 变更的完整采集与 diff 正确性git-context.test.mjs含空格路径与重命名的解析特殊字符文件名如[ab].txt使用--literal-pathspecs作为字面量处理避免被误当作 globgit-context.test.mjs..notes这类以双点开头的合法仓库文件名未出生分支与 SHA-256 仓库未跟踪符号链接不解引用、可执行位保留100755同一路径同时出现 staged 删除与 untracked 重建时可按状态码精确选取对应 diff 记录git-context.test.mjs。九、典型使用场景中断后快速续接开会、处理紧急事务回来打开 where-was-i 画布即可一眼看到分支、提交与未提交改动点击 Resume 让 Agent 直接给出下一步行动建议多任务切换通过打开中的 PR/Issue 卡片定位到多个并行任务的各自线程按线索逐条续接交接与自检在开始新任务或提交前用画布核对当前工作区是否有遗漏的未提交改动、是否有被遗忘的分支提交尚未推送。十、小结where-was-i 是 Awesome Copilot 插件生态中一个聚焦「上下文恢复」的轻量而完整的范例它以 Git 仓库为单一事实来源通过精心设计的 porcelain 解析、基准分支探测、图折叠与容错查询把开发中断时的散落状态汇总成结构化上下文再通过 Canvas 界面与resume动作把这份上下文无缝注入 Agent 会话实现从「回忆状态」到「直接续接」的工作流闭环。无论你是想在日常开发中提升中断恢复效率还是想参考一个完整的 Copilot Canvas 扩展实现本地服务、SSE 推送、令牌鉴权、Agent 动作注册这个插件都值得直接上手尝试。【免费下载链接】awesome-copilotCommunity-contributed instructions, agents, skills, and configurations to help you make the most of GitHub Copilot.项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-copilot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表