[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-folke--sidekick.nvim":3,"tool-folke--sidekick.nvim":64},[4,17,25,39,48,56],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":16},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",140436,2,"2026-04-05T23:32:43",[13,14,15],"开发框架","Agent","语言模型","ready",{"id":18,"name":19,"github_repo":20,"description_zh":21,"stars":22,"difficulty_score":10,"last_commit_at":23,"category_tags":24,"status":16},3704,"NextChat","ChatGPTNextWeb\u002FNextChat","NextChat 是一款轻量且极速的 AI 助手，旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性，以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发，NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。\n\n这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言，它也提供了便捷的自托管方案，支持一键部署到 Vercel 或 Zeabur 等平台。\n\nNextChat 的核心亮点在于其广泛的模型兼容性，原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型，让用户在一个界面即可自由切换不同 AI 能力。此外，它还率先支持 MCP（Model Context Protocol）协议，增强了上下文处理能力。针对企业用户，NextChat 提供专业版解决方案，具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能，满足公司对数据隐私和个性化管理的高标准要求。",87618,"2026-04-05T07:20:52",[13,15],{"id":26,"name":27,"github_repo":28,"description_zh":29,"stars":30,"difficulty_score":10,"last_commit_at":31,"category_tags":32,"status":16},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",84991,"2026-04-05T10:45:23",[33,34,35,36,14,37,15,13,38],"图像","数据工具","视频","插件","其他","音频",{"id":40,"name":41,"github_repo":42,"description_zh":43,"stars":44,"difficulty_score":45,"last_commit_at":46,"category_tags":47,"status":16},3128,"ragflow","infiniflow\u002Fragflow","RAGFlow 是一款领先的开源检索增强生成（RAG）引擎，旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体（Agent）能力相结合，不仅支持从各类文档中高效提取知识，还能让模型基于这些知识进行逻辑推理和任务执行。\n\n在大模型应用中，幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构（如表格、图表及混合排版），显著提升了信息检索的准确度，从而有效减少模型“胡编乱造”的现象，确保回答既有据可依又具备时效性。其内置的智能体机制更进一步，使系统不仅能回答问题，还能自主规划步骤解决复杂问题。\n\n这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统，还是致力于探索大模型在垂直领域落地的创新者，都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口，既降低了非算法背景用户的上手门槛，也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目，它正成为连接通用大模型与行业专有知识之间的重要桥梁。",77062,3,"2026-04-04T04:44:48",[14,33,13,15,37],{"id":49,"name":50,"github_repo":51,"description_zh":52,"stars":53,"difficulty_score":45,"last_commit_at":54,"category_tags":55,"status":16},519,"PaddleOCR","PaddlePaddle\u002FPaddleOCR","PaddleOCR 是一款基于百度飞桨框架开发的高性能开源光学字符识别工具包。它的核心能力是将图片、PDF 等文档中的文字提取出来，转换成计算机可读取的结构化数据，让机器真正“看懂”图文内容。\n\n面对海量纸质或电子文档，PaddleOCR 解决了人工录入效率低、数字化成本高的问题。尤其在人工智能领域，它扮演着连接图像与大型语言模型（LLM）的桥梁角色，能将视觉信息直接转化为文本输入，助力智能问答、文档分析等应用场景落地。\n\nPaddleOCR 适合开发者、算法研究人员以及有文档自动化需求的普通用户。其技术优势十分明显：不仅支持全球 100 多种语言的识别，还能在 Windows、Linux、macOS 等多个系统上运行，并灵活适配 CPU、GPU、NPU 等各类硬件。作为一个轻量级且社区活跃的开源项目，PaddleOCR 既能满足快速集成的需求，也能支撑前沿的视觉语言研究，是处理文字识别任务的理想选择。",74939,"2026-04-05T23:16:38",[15,33,13,37],{"id":57,"name":58,"github_repo":59,"description_zh":60,"stars":61,"difficulty_score":45,"last_commit_at":62,"category_tags":63,"status":16},2181,"OpenHands","OpenHands\u002FOpenHands","OpenHands 是一个专注于 AI 驱动开发的开源平台，旨在让智能体（Agent）像人类开发者一样理解、编写和调试代码。它解决了传统编程中重复性劳动多、环境配置复杂以及人机协作效率低等痛点，通过自动化流程显著提升开发速度。\n\n无论是希望提升编码效率的软件工程师、探索智能体技术的研究人员，还是需要快速原型验证的技术团队，都能从中受益。OpenHands 提供了灵活多样的使用方式：既可以通过命令行（CLI）或本地图形界面在个人电脑上轻松上手，体验类似 Devin 的流畅交互；也能利用其强大的 Python SDK 自定义智能体逻辑，甚至在云端大规模部署上千个智能体并行工作。\n\n其核心技术亮点在于模块化的软件智能体 SDK，这不仅构成了平台的引擎，还支持高度可组合的开发模式。此外，OpenHands 在 SWE-bench 基准测试中取得了 77.6% 的优异成绩，证明了其解决真实世界软件工程问题的能力。平台还具备完善的企业级功能，支持与 Slack、Jira 等工具集成，并提供细粒度的权限管理，适合从个人开发者到大型企业的各类用户场景。",70626,"2026-04-05T22:51:36",[15,14,13,36],{"id":65,"github_repo":66,"name":67,"description_en":68,"description_zh":69,"ai_summary_zh":70,"readme_en":71,"readme_zh":72,"quickstart_zh":73,"use_case_zh":74,"hero_image_url":75,"owner_login":76,"owner_name":77,"owner_avatar_url":78,"owner_bio":79,"owner_company":79,"owner_location":80,"owner_email":79,"owner_twitter":76,"owner_website":81,"owner_url":82,"languages":83,"stars":92,"forks":93,"last_commit_at":94,"license":95,"difficulty_score":96,"env_os":97,"env_gpu":98,"env_ram":98,"env_deps":99,"category_tags":109,"github_topics":110,"view_count":10,"oss_zip_url":79,"oss_zip_packed_at":79,"status":16,"created_at":120,"updated_at":121,"faqs":122,"releases":152},4069,"folke\u002Fsidekick.nvim","sidekick.nvim","Your Neovim AI sidekick","sidekick.nvim 是专为 Neovim 打造的 AI 编程助手，旨在让开发者在不离开编辑器的情况下，高效利用人工智能提升编码体验。它主要解决了传统 AI 插件功能单一、上下文切换频繁以及代码建议不够直观的问题。\n\n该工具的核心亮点在于深度集成了 GitHub Copilot LSP 的“下一步编辑建议”（NES）功能。与普通行内补全不同，NES 能主动提供跨越多行的重构方案或大范围代码修改，并通过基于 Treesitter 的高亮差分视图，让用户逐块预览和确认变更。此外，sidekick.nvim 内置了智能终端，支持直接调用 Claude、Gemini、Codex 等主流 AI 命令行工具。它能自动感知当前文件内容、光标位置及错误信息作为上下文，并预设了丰富的提示词库，方便用户快速执行代码解释、故障修复或测试生成等任务。\n\nsidekick.nvim 特别适合习惯使用 Neovim 的软件开发者和技术研究人员。如果你希望将 AI 的大局观建议与灵活的命令行交互无缝融入日常编码流，同时保持对代码变更的完全掌控，这款插件将极大优化你的工作流。其高度可配置的架构也允许高级用户根据","sidekick.nvim 是专为 Neovim 打造的 AI 编程助手，旨在让开发者在不离开编辑器的情况下，高效利用人工智能提升编码体验。它主要解决了传统 AI 插件功能单一、上下文切换频繁以及代码建议不够直观的问题。\n\n该工具的核心亮点在于深度集成了 GitHub Copilot LSP 的“下一步编辑建议”（NES）功能。与普通行内补全不同，NES 能主动提供跨越多行的重构方案或大范围代码修改，并通过基于 Treesitter 的高亮差分视图，让用户逐块预览和确认变更。此外，sidekick.nvim 内置了智能终端，支持直接调用 Claude、Gemini、Codex 等主流 AI 命令行工具。它能自动感知当前文件内容、光标位置及错误信息作为上下文，并预设了丰富的提示词库，方便用户快速执行代码解释、故障修复或测试生成等任务。\n\nsidekick.nvim 特别适合习惯使用 Neovim 的软件开发者和技术研究人员。如果你希望将 AI 的大局观建议与灵活的命令行交互无缝融入日常编码流，同时保持对代码变更的完全掌控，这款插件将极大优化你的工作流。其高度可配置的架构也允许高级用户根据需求定制界面与功能，打造个性化的智能开发环境。","# 🤖 `sidekick.nvim`\n\n**sidekick.nvim** is your Neovim AI sidekick that integrates Copilot LSP's\n\"Next Edit Suggestions\" with a built-in terminal for any AI CLI.\nReview and apply diffs, chat with AI assistants, and streamline your coding,\nwithout leaving your editor.\n\n\u003Cimg width=\"2311\" height=\"1396\" alt=\"image\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Ffolke_sidekick.nvim_readme_270f2913e3b0.png\" \u002F>\n\n## ✨ Features\n\n- **🤖 Next Edit Suggestions (NES) powered by Copilot LSP**\n  - 🪄 **Automatic Suggestions**: Fetches suggestions automatically when you pause typing or move the cursor.\n  - 🎨 **Rich Diffs**: Visualizes changes with inline and block-level diffs, featuring Treesitter-based syntax highlighting with granular diffing down to the word or character level.\n  - 🧭 **Hunk-by-Hunk Navigation**: Jump through edits to review them one by one before applying.\n  - 📊 **Statusline Integration**: Shows Copilot LSP's status, request progress, and preview text in your statusline.\n\n- **💬 Integrated AI CLI Terminal**\n  - 🚀 **Direct Access to AI CLIs**: Interact with your favorite AI command-line tools without leaving Neovim.\n  - 📦 **Pre-configured for Popular Tools**: Out-of-the-box support for Claude, Gemini, Grok, Codex, Copilot CLI, and more.\n  - ✨ **Context-Aware Prompts**: Automatically include file content, cursor position, and diagnostics in your prompts.\n  - 📝 **Prompt Library**: A library of pre-defined prompts for common tasks like explaining code, fixing issues, or writing tests.\n  - 🔄 **Session Persistence**: Keep your CLI sessions alive with `tmux` and `zellij` integration.\n  - 📂 **Automatic File Watching**: Automatically reloads files in Neovim when they are modified by AI tools.\n\n- **🔌 Extensible and Customizable**\n  - ⚙️ **Flexible Configuration**: Fine-tune every aspect of the plugin to your liking.\n  - 🧩 **Plugin-Friendly API**: A rich API for integrating with other plugins and building custom workflows.\n  - 🎨 **Customizable UI**: Change the appearance of diffs, signs, and more.\n\n## 📋 Requirements\n\n- **Neovim** `>= 0.11.2` or newer\n- The official [copilot-language-server](https:\u002F\u002Fgithub.com\u002Fgithub\u002Fcopilot-language-server-release) LSP server,\n  enabled with `vim.lsp.enable`. Can be installed in multiple ways:\n  1. install using `npm` or your OS's package manager\n  2. install with [mason-lspconfig.nvim](https:\u002F\u002Fgithub.com\u002Fmason-org\u002Fmason-lspconfig.nvim)\n  3. [copilot.lua](https:\u002F\u002Fgithub.com\u002Fzbirenbaum\u002Fcopilot.lua) and [copilot.vim](https:\u002F\u002Fgithub.com\u002Fgithub\u002Fcopilot.vim)\n     both bundle the LSP Server in their plugin.\n- A working `lsp\u002Fcopilot.lua` configuration.\n  - **TIP:** Included in [nvim-lspconfig](https:\u002F\u002Fgithub.com\u002Fneovim\u002Fnvim-lspconfig)\n- [snacks.nvim](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsnacks.nvim) for better prompt\u002Ftool selection **_(optional)_**\n- [nvim-treesitter-textobjects](https:\u002F\u002Fgithub.com\u002Fnvim-treesitter\u002Fnvim-treesitter-textobjects) **_(`main` branch)_** for `{function}` and `{class}` context variables **_(optional)_**\n- AI cli tools, such as Codex, Claude, Copilot, Gemini, … **_(optional)_**\n  see the [🤖 AI CLI Integration](#-ai-cli-integration) section for details.\n- [lsof](https:\u002F\u002Fman7.org\u002Flinux\u002Fman-pages\u002Fman8\u002Flsof.8.html) and [ps](https:\u002F\u002Fman7.org\u002Flinux\u002Fman-pages\u002Fman1\u002Fps.1.html) are used\n  on Unix-like systems to detect running AI CLI tool sessions. **_(optional, but recommended)_**\n\n## 🚀 Quick Start\n\n1. **Install** the plugin with your package manager (see below)\n2. **Configure Copilot LSP** - must be enabled with `vim.lsp.enable`\n3. **Check health**: `:checkhealth sidekick`\n4. **Sign in to Copilot**: `:LspCopilotSignIn`\n5. **Try it out**:\n   - Type some code and pause - watch for Next Edit Suggestions appearing\n   - Press `\u003CTab>` to navigate through or apply suggestions\n   - Use `\u003Cleader>aa` to open AI CLI tools\n\n> [!NOTE]\n> **New to Next Edit Suggestions?** Unlike inline completions, NES suggests entire refactorings or multi-line changes anywhere in your file - think of it as Copilot's \"big picture\" suggestions.\n\n## 📦 Installation\n\nInstall with your favorite manager. With [lazy.nvim](https:\u002F\u002Fgithub.com\u002Ffolke\u002Flazy.nvim):\n\n\u003C!-- setup_base:start -->\n\n```lua\n{\n  \"folke\u002Fsidekick.nvim\",\n  opts = {\n    -- add any options here\n    cli = {\n      mux = {\n        backend = \"zellij\",\n        enabled = true,\n      },\n    },\n  },\n  keys = {\n    {\n      \"\u003Ctab>\",\n      function()\n        -- if there is a next edit, jump to it, otherwise apply it if any\n        if not require(\"sidekick\").nes_jump_or_apply() then\n          return \"\u003CTab>\" -- fallback to normal tab\n        end\n      end,\n      expr = true,\n      desc = \"Goto\u002FApply Next Edit Suggestion\",\n    },\n    {\n      \"\u003Cc-.>\",\n      function() require(\"sidekick.cli\").focus() end,\n      desc = \"Sidekick Focus\",\n      mode = { \"n\", \"t\", \"i\", \"x\" },\n    },\n    {\n      \"\u003Cleader>aa\",\n      function() require(\"sidekick.cli\").toggle() end,\n      desc = \"Sidekick Toggle CLI\",\n    },\n    {\n      \"\u003Cleader>as\",\n      function() require(\"sidekick.cli\").select() end,\n      -- Or to select only installed tools:\n      -- require(\"sidekick.cli\").select({ filter = { installed = true } })\n      desc = \"Select CLI\",\n    },\n    {\n      \"\u003Cleader>ad\",\n      function() require(\"sidekick.cli\").close() end,\n      desc = \"Detach a CLI Session\",\n    },\n    {\n      \"\u003Cleader>at\",\n      function() require(\"sidekick.cli\").send({ msg = \"{this}\" }) end,\n      mode = { \"x\", \"n\" },\n      desc = \"Send This\",\n    },\n    {\n      \"\u003Cleader>af\",\n      function() require(\"sidekick.cli\").send({ msg = \"{file}\" }) end,\n      desc = \"Send File\",\n    },\n    {\n      \"\u003Cleader>av\",\n      function() require(\"sidekick.cli\").send({ msg = \"{selection}\" }) end,\n      mode = { \"x\" },\n      desc = \"Send Visual Selection\",\n    },\n    {\n      \"\u003Cleader>ap\",\n      function() require(\"sidekick.cli\").prompt() end,\n      mode = { \"n\", \"x\" },\n      desc = \"Sidekick Select Prompt\",\n    },\n    -- Example of a keybinding to open Claude directly\n    {\n      \"\u003Cleader>ac\",\n      function() require(\"sidekick.cli\").toggle({ name = \"claude\", focus = true }) end,\n      desc = \"Sidekick Toggle Claude\",\n    },\n  },\n}\n```\n\n\u003C!-- setup_base:end -->\n\n> [!TIP]\n> It's a good idea to run `:checkhealth sidekick` after install.\n\n\u003Cdetails>\n  \u003Csummary>Integrate \u003Ccode>&lt;Tab&gt;\u003C\u002Fcode> in insert mode with \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsaghen\u002Fblink.cmp\">blink.cmp\u003C\u002Fa>\u003C\u002Fsummary>\n\n\u003C!-- setup_blink:start -->\n\n```lua\n{\n  \"saghen\u002Fblink.cmp\",\n  ---@module 'blink.cmp'\n  ---@type blink.cmp.Config\n  opts = {\n\n    keymap = {\n      [\"\u003CTab>\"] = {\n        \"snippet_forward\",\n        function() -- sidekick next edit suggestion\n          return require(\"sidekick\").nes_jump_or_apply()\n        end,\n        function() -- if you are using Neovim's native inline completions\n          return vim.lsp.inline_completion.get()\n        end,\n        \"fallback\",\n      },\n    },\n  },\n}\n```\n\n\u003C!-- setup_blink:end -->\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n  \u003Csummary>Custom \u003Ccode>&lt;Tab&gt;\u003C\u002Fcode> integration for \u003Cb>insert mode\u003C\u002Fb>\u003C\u002Fsummary>\n\n\u003C!-- setup_custom:start -->\n\n```lua\n{\n  \"folke\u002Fsidekick.nvim\",\n  opts = {\n    -- add any options here\n  },\n  keys = {\n    {\n      \"\u003Ctab>\",\n      function()\n        -- if there is a next edit, jump to it, otherwise apply it if any\n        if require(\"sidekick\").nes_jump_or_apply() then\n          return -- jumped or applied\n        end\n\n        -- if you are using Neovim's native inline completions\n        if vim.lsp.inline_completion.get() then\n          return\n        end\n\n        -- any other things (like snippets) you want to do on \u003Ctab> go here.\n\n        -- fall back to normal tab\n        return \"\u003Ctab>\"\n      end,\n      mode = { \"i\", \"n\" },\n      expr = true,\n      desc = \"Goto\u002FApply Next Edit Suggestion\",\n    },\n  },\n}\n```\n\n\u003C!-- setup_custom:end -->\n\n\u003C\u002Fdetails>\n\nAfter installation sign in with `:LspCopilotSignIn` if prompted.\n\n## ⚙️ Configuration\n\nThe module ships with safe defaults and exposes everything through\n`require(\"sidekick\").setup({ ... })`.\n\n\u003Cdetails>\n\u003Csummary>Default settings\u003C\u002Fsummary>\n\n\u003C!-- config:start -->\n\n```lua\n---@class sidekick.Config\nlocal defaults = {\n  nes = {\n    ---@type boolean|fun(buf:integer):boolean?\n    enabled = function(buf)\n      return vim.g.sidekick_nes ~= false and vim.b.sidekick_nes ~= false\n    end,\n    debounce = 100,\n    trigger = {\n      -- events that trigger sidekick next edit suggestions\n      events = { \"ModeChanged i:n\", \"TextChanged\", \"User SidekickNesDone\" },\n    },\n    clear = {\n      -- events that clear the current next edit suggestion\n      events = { \"TextChangedI\", \"InsertEnter\" },\n      esc = true, -- clear next edit suggestions when pressing \u003CEsc>\n    },\n    ---@class sidekick.diff.Opts\n    ---@field inline? \"words\"|\"chars\"|false Enable inline diffs\n    ---@field show? \"always\"|\"cursor\" `cursor` will only show the diff when the cursor is at the edit position.\n    diff = {\n      inline = \"words\",\n      show = \"always\",\n    },\n    signs = true, -- show signs for next edit suggestions\n    jumplist = true, -- add an entry to the jumplist\n  },\n  -- Work with AI cli tools directly from within Neovim\n  cli = {\n    watch = true, -- notify Neovim of file changes done by AI CLI tools\n    ---@class sidekick.win.Opts\n    win = {\n      --- This is run when a new terminal is created, before starting it.\n      --- Here you can change window options `terminal.opts`.\n      ---@param terminal sidekick.cli.Terminal\n      config = function(terminal) end,\n      wo = {}, ---@type vim.wo\n      bo = {}, ---@type vim.bo\n      layout = \"right\", ---@type \"float\"|\"left\"|\"bottom\"|\"top\"|\"right\"\n      --- Options used when layout is \"float\"\n      ---@type vim.api.keyset.win_config\n      float = {\n        width = 0.9,\n        height = 0.9,\n      },\n      -- Options used when layout is \"left\"|\"bottom\"|\"top\"|\"right\"\n      ---@type vim.api.keyset.win_config\n      split = {\n        width = 80, -- set to 0 for default split width\n        height = 20, -- set to 0 for default split height\n      },\n      --- CLI Tool Keymaps (default mode is `t`)\n      ---@type table\u003Cstring, sidekick.cli.Keymap|false>\n      keys = {\n        buffers       = { \"\u003Cc-b>\", \"buffers\"   , mode = \"nt\", desc = \"open buffer picker\" },\n        files         = { \"\u003Cc-f>\", \"files\"     , mode = \"nt\", desc = \"open file picker\" },\n        hide_n        = { \"q\"    , \"hide\"      , mode = \"n\" , desc = \"hide the terminal window\" },\n        hide_ctrl_q   = { \"\u003Cc-q>\", \"hide\"      , mode = \"n\" , desc = \"hide the terminal window\" },\n        hide_ctrl_dot = { \"\u003Cc-.>\", \"hide\"      , mode = \"nt\", desc = \"hide the terminal window\" },\n        hide_ctrl_z   = { \"\u003Cc-z>\", \"blur\"      , mode = \"nt\", desc = \"go back to the previous window without hiding the terminal\" },\n        prompt        = { \"\u003Cc-p>\", \"prompt\"    , mode = \"t\" , desc = \"insert prompt or context\" },\n        stopinsert    = { \"\u003Cc-q>\", \"stopinsert\", mode = \"t\" , desc = \"enter normal mode\" },\n        -- Navigate windows in terminal mode. Only active when:\n        -- * layout is not \"float\"\n        -- * there is another window in the direction\n        -- With the default layout of \"right\", only `\u003Cc-h>` will be mapped\n        nav_left      = { \"\u003Cc-h>\", \"nav_left\"  , expr = true, desc = \"navigate to the left window\" },\n        nav_down      = { \"\u003Cc-j>\", \"nav_down\"  , expr = true, desc = \"navigate to the below window\" },\n        nav_up        = { \"\u003Cc-k>\", \"nav_up\"    , expr = true, desc = \"navigate to the above window\" },\n        nav_right     = { \"\u003Cc-l>\", \"nav_right\" , expr = true, desc = \"navigate to the right window\" },\n      },\n      ---@type fun(dir:\"h\"|\"j\"|\"k\"|\"l\")?\n      --- Function that handles navigation between windows.\n      --- Defaults to `vim.cmd.wincmd`. Used by the `nav_*` keymaps.\n      nav = nil,\n    },\n    ---@class sidekick.cli.Mux\n    ---@field backend? \"tmux\"|\"zellij\" Multiplexer backend to persist CLI sessions\n    mux = {\n      backend = vim.env.ZELLIJ and \"zellij\" or \"tmux\", -- default to tmux unless zellij is detected\n      enabled = false,\n      -- terminal: new sessions will be created for each CLI tool and shown in a Neovim terminal\n      -- window: when run inside a terminal multiplexer, new sessions will be created in a new tab\n      -- split: when run inside a terminal multiplexer, new sessions will be created in a new split\n      -- NOTE: zellij only supports `terminal`\n      create = \"terminal\", ---@type \"terminal\"|\"window\"|\"split\"\n      split = {\n        vertical = true, -- vertical or horizontal split\n        size = 0.5, -- size of the split (0-1 for percentage)\n      },\n    },\n    --- Actual cli tool config is loaded from the runtime path `sk\u002Fcli\u002F{tool}.lua` and merged with the config below.\n    --- For default configs, see https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Ftree\u002Fmain\u002Fsk\u002Fcli\n    ---@type table\u003Cstring, sidekick.cli.Config|{}>\n    tools = {\n      aider    = {},\n      amazon_q = {},\n      claude   = {},\n      codex    = {},\n      copilot  = {},\n      crush    = {},\n      cursor   = {},\n      gemini   = {},\n      grok     = {},\n      opencode = {},\n      pi       = {},\n      qwen     = {},\n    },\n    --- Add custom context. See `lua\u002Fsidekick\u002Fcontext\u002Finit.lua`\n    ---@type table\u003Cstring, sidekick.context.Fn>\n    context = {},\n    ---@type table\u003Cstring, sidekick.Prompt|string|fun(ctx:sidekick.context.ctx):(string?)>\n    prompts = {\n      changes         = \"Can you review my changes?\",\n      diagnostics     = \"Can you help me fix the diagnostics in {file}?\\n{diagnostics}\",\n      diagnostics_all = \"Can you help me fix these diagnostics?\\n{diagnostics_all}\",\n      document        = \"Add documentation to {function|line}\",\n      explain         = \"Explain {this}\",\n      fix             = \"Can you fix {this}?\",\n      optimize        = \"How can {this} be optimized?\",\n      review          = \"Can you review {file} for any issues or improvements?\",\n      tests           = \"Can you write tests for {this}?\",\n      -- simple context prompts\n      buffers         = \"{buffers}\",\n      file            = \"{file}\",\n      line            = \"{line}\",\n      position        = \"{position}\",\n      quickfix        = \"{quickfix}\",\n      selection       = \"{selection}\",\n      [\"function\"]    = \"{function}\",\n      class           = \"{class}\",\n    },\n    -- preferred picker for selecting files\n    ---@alias sidekick.picker \"snacks\"|\"telescope\"|\"fzf-lua\"\n    picker = \"snacks\", ---@type sidekick.picker\n  },\n  copilot = {\n    -- track copilot's status with `didChangeStatus`\n    status = {\n      enabled = true,\n      level = vim.log.levels.WARN,\n      -- set to vim.log.levels.OFF to disable notifications\n      -- level = vim.log.levels.OFF,\n    },\n  },\n  ui = {\n    icons = {\n      nes               = \" \",\n      attached          = \" \",\n      started           = \" \",\n      installed         = \" \",\n      missing           = \" \",\n      external_attached = \"󰖩 \",\n      external_started  = \"󰖪 \",\n      terminal_attached = \" \",\n      terminal_started  = \" \",\n    },\n  },\n  debug = false, -- enable debug logging\n}\n```\n\n\u003C!-- config:end -->\n\n\u003C\u002Fdetails>\n\n## ✏️ Next Edit Suggestions (NES)\n\nCopilot NES requests run automatically when you leave insert mode,\nmodify text in normal mode, or after applying an edit.\n\n\u003C!-- api_nes:start -->\n\n\u003Ctable>\u003Ctr>\u003Cth>Cmd\u003C\u002Fth>\u003Cth>Lua\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick nes apply\u003C\u002Fcode> Apply active text edits\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@return boolean applied\nrequire(\"sidekick.nes\").apply()\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick nes clear\u003C\u002Fcode> Clear all active edits\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\nrequire(\"sidekick.nes\").clear()\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick nes disable\u003C\u002Fcode> \u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n\nrequire(\"sidekick.nes\").disable()\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick nes enable\u003C\u002Fcode> \u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param enable? boolean\nrequire(\"sidekick.nes\").enable(enable)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd> Check if any edits are active in the current buffer\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\nrequire(\"sidekick.nes\").have()\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick nes jump\u003C\u002Fcode> Jump to the start of the active edit\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@return boolean jumped\nrequire(\"sidekick.nes\").jump()\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick nes toggle\u003C\u002Fcode> \u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n\nrequire(\"sidekick.nes\").toggle()\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick nes update\u003C\u002Fcode> Request new edits from the LSP server (if any)\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\nrequire(\"sidekick.nes\").update()\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n\u003C!-- api_nes:end -->\n\n## 🤖 AI CLI Integration\n\nSidekick ships with a lightweight terminal wrapper so you can talk to local AI CLI\ntools without leaving Neovim. Each tool runs in its own scratch terminal window and\nshares helper prompts that bundle buffer context, the current cursor position, and\ndiagnostics when requested.\n\n\u003C!-- api_cli:start -->\n\n\u003Ctable>\u003Ctr>\u003Cth>Cmd\u003C\u002Fth>\u003Cth>Lua\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick cli close\u003C\u002Fcode> \u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param opts? sidekick.cli.Hide\n---@overload fun(name: string)\nrequire(\"sidekick.cli\").close(opts)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick cli focus\u003C\u002Fcode> Toggle focus of the terminal window if it is already open\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param opts? sidekick.cli.Show\n---@overload fun(name: string)\nrequire(\"sidekick.cli\").focus(opts)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick cli hide\u003C\u002Fcode> \u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param opts? sidekick.cli.Hide\n---@overload fun(name: string)\nrequire(\"sidekick.cli\").hide(opts)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick cli prompt\u003C\u002Fcode> Select a prompt to send\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param opts? sidekick.cli.Prompt|{cb:nil}\n---@overload fun(cb:fun(msg?:string))\nrequire(\"sidekick.cli\").prompt(opts)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd> Render a message template or prompt\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param opts? sidekick.cli.Message|string\nrequire(\"sidekick.cli\").render(opts)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick cli select\u003C\u002Fcode> Start or attach to a CLI tool\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param opts? sidekick.cli.Select|{cb:nil}|{focus?:boolean}\n---@overload fun(cb:fun(state?:sidekick.cli.State))\nrequire(\"sidekick.cli\").select(opts)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick cli send\u003C\u002Fcode> Send a message or prompt to a CLI\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param opts? sidekick.cli.Send\n---@overload fun(msg:string)\nrequire(\"sidekick.cli\").send(opts)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick cli show\u003C\u002Fcode> \u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param opts? sidekick.cli.Show\n---@overload fun(name: string)\nrequire(\"sidekick.cli\").show(opts)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick cli toggle\u003C\u002Fcode> \u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param opts? sidekick.cli.Show\n---@overload fun(name: string)\nrequire(\"sidekick.cli\").toggle(opts)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n\u003C!-- api_cli:end -->\n\n### Prompts & Context\n\nSidekick comes with a set of predefined prompts that you can use with your AI tools.\nYou can also use context variables in your prompts to include information about the\ncurrent file, selection, diagnostics, and more.\n\n\u003Cimg width=\"1431\" height=\"723\" alt=\"image\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Ffolke_sidekick.nvim_readme_39d0f0da4e69.png\" \u002F>\n\n\u003Cdetails>\u003Csummary>\u003Cstrong>Available Prompts\u003C\u002Fstrong>\u003C\u002Fsummary>\n\n- **changes**: `Can you review my changes?`\n- **diagnostics**: `Can you help me fix the diagnostics in {file}?\\n{diagnostics}`\n- **diagnostics_all**: `Can you help me fix these diagnostics?\\n{diagnostics_all}`\n- **document**: `Add documentation to {position}`\n- **explain**: `Explain {this}`\n- **fix**: `Can you fix {this}?`\n- **optimize**: `How can {this} be optimized?`\n- **review**: `Can you review {file} for any issues or improvements?`\n- **tests**: `Can you write tests for {this}?`\n- **quickfix**: `{quickfix}` (current quickfix entries).\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\u003Csummary>\u003Cstrong>Available Context Variables\u003C\u002Fstrong>\u003C\u002Fsummary>\n\n- `{buffers}`: A list of all open buffers.\n- `{file}`: The current file path.\n- `{position}`: The cursor position in the current file.\n- `{line}`: The current line.\n- `{selection}`: The visual selection.\n- `{diagnostics}`: The diagnostics for the current buffer.\n- `{diagnostics_all}`: All diagnostics in the workspace.\n- `{quickfix}`: The current quickfix list, including title and formatted items.\n- `{function}`: The function at cursor (Tree-sitter) - returns location like `function foo @file:10:5`.\n- `{class}`: The class\u002Fstruct at cursor (Tree-sitter) - returns location.\n- `{this}`: A special context variable. If the current buffer is a file, it resolves to `{position}`. Otherwise, it resolves to the literal string \"this\" and appends the current `{selection}` to the prompt.\n\n\u003C\u002Fdetails>\n\n### Snacks.nvim Picker Integration\n\nIf you're using [snacks.nvim](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsnacks.nvim), you can send picker selections directly to Sidekick's AI CLI tools. This is useful for sending search results, grep matches, or file selections as context.\n\n\u003Cdetails>\u003Csummary>Example Snacks picker configuration\u003C\u002Fsummary>\n\n\u003C!-- snacks_picker:start -->\n\n```lua\n{\n  \"folke\u002Fsnacks.nvim\",\n  optional = true,\n  opts = {\n    picker = {\n      actions = {\n        sidekick_send = function(...)\n          return require(\"sidekick.cli.picker.snacks\").send(...)\n        end,\n      },\n      win = {\n        input = {\n          keys = {\n            [\"\u003Ca-a>\"] = {\n              \"sidekick_send\",\n              mode = { \"n\", \"i\" },\n            },\n          },\n        },\n      },\n    },\n  },\n}\n```\n\n\u003C!-- snacks_picker:end -->\n\nWith this configuration, pressing `\u003Ca-a>` in any Snacks picker will send the selected items to your current AI CLI session. The integration automatically handles:\n\n- File selections with full paths\n- Grep results with line numbers and positions\n- Multiple selections (sends all selected items)\n- Position ranges for precise context\n\n\u003C\u002Fdetails>\n\n### CLI Keymaps\n\nYou can customize the keymaps for the CLI window by setting the `cli.win.keys` option.\nThe default keymaps are:\n\n- `q` (in normal mode): Hide the terminal window.\n- `\u003Cc-q>` (in terminal mode): Hide the terminal window.\n- `\u003Cc-z>`: Leave the CLI window.\n- `\u003Cc-p>`: Insert prompt or context.\n\n\u003Cdetails>\u003Csummary>Example of how to override the default keymaps\n\u003C\u002Fsummary>\n\n```lua\n{\n  \"folke\u002Fsidekick.nvim\",\n  opts = {\n    cli = {\n      win = {\n        keys = {\n          -- override the default hide keymap\n          hide_n = { \"\u003Cleader>q\", \"hide\", mode = \"n\" },\n          -- add a new keymap to say hi\n          say_hi = {\n            \"\u003Cc-h>\",\n            function(t)\n              t:send(\"hi!\")\n            end,\n          },\n        },\n      },\n    },\n  },\n}\n```\n\n\u003C\u002Fdetails>\n\n### Default CLI tools\n\nSidekick preconfigures popular AI CLIs. Run `:checkhealth sidekick` to see which ones are installed.\n\n| Tool                                                        | Description          | Installation                                                                                                           |\n| ----------------------------------------------------------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------- |\n| [`aider`](https:\u002F\u002Fgithub.com\u002FAider-AI\u002Faider)                | AI pair programmer   | `pip install aider-chat` or `pipx install aider-chat`                                                                  |\n| [`amazon_q`](https:\u002F\u002Fgithub.com\u002Faws\u002Famazon-q-developer-cli) | Amazon Q Developer   | [Install guide](https:\u002F\u002Fdocs.aws.amazon.com\u002Famazonq\u002Flatest\u002Fqdeveloper-ug\u002Fcommand-line-getting-started-installing.html) |\n| [`claude`](https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-code)       | Claude Code CLI      | [See Claude Code docs](https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Foverview#get-started)\n| [`codex`](https:\u002F\u002Fgithub.com\u002Fopenai\u002Fcodex)                  | OpenAI Codex CLI     | See [OpenAI docs](https:\u002F\u002Fgithub.com\u002Fopenai\u002Fcodex)                                                                     |\n| [`copilot`](https:\u002F\u002Fgithub.com\u002Fgithub\u002Fcopilot-cli)          | GitHub Copilot CLI   | `npm install -g @githubnext\u002Fgithub-copilot-cli`                                                                        |\n| [`crush`](https:\u002F\u002Fgithub.com\u002Fcharmbracelet\u002Fcrush)           | Charm's AI assistant | See [installation](https:\u002F\u002Fgithub.com\u002Fcharmbracelet\u002Fcrush)                                                             |\n| [`cursor`](https:\u002F\u002Fcursor.com\u002Fcli)                          | Cursor CLI agent     | See [Cursor docs](https:\u002F\u002Fcursor.com\u002Fcli)                                                                              |\n| [`gemini`](https:\u002F\u002Fgithub.com\u002Fgoogle-gemini\u002Fgemini-cli)     | Google Gemini CLI    | See [repo](https:\u002F\u002Fgithub.com\u002Fgoogle-gemini\u002Fgemini-cli)                                                                |\n| [`grok`](https:\u002F\u002Fgithub.com\u002Fsuperagent-ai\u002Fgrok-cli)         | xAI Grok CLI         | See [repo](https:\u002F\u002Fgithub.com\u002Fsuperagent-ai\u002Fgrok-cli)                                                                  |\n| [`opencode`](https:\u002F\u002Fgithub.com\u002Fsst\u002Fopencode)               | OpenCode CLI         | `npm install -g opencode`                                                                                              |\n| [`qwen`](https:\u002F\u002Fgithub.com\u002FQwenLM\u002Fqwen-code)               | Alibaba Qwen Code    | See [repo](https:\u002F\u002Fgithub.com\u002FQwenLM\u002Fqwen-code)                                                                        |\n\n> [!TIP]\n> After installing tools, restart Neovim or run `:Sidekick cli select` to see them available.\n\n## 🚀 Commands\n\nSidekick provides a `:Sidekick` command that allows you to interact with the plugin\nfrom the command line. The command is a thin wrapper around the Lua API, so you\ncan use it to do anything that the Lua API can do.\n\n### Command Structure\n\nThe command structure is simple:\n\n```\n:Sidekick \u003Cmodule> \u003Ccommand> [args]\n```\n\n- `\u003Cmodule>`: The name of the module you want to use (e.g., `nes`, `cli`).\n- `\u003Ccommand>`: The name of the command you want to execute.\n- `[args]`: Optional arguments for the command. The arguments are parsed as a Lua\n  table.\n\nFor example, to show the CLI window for the `claude` tool, you can use the\nfollowing command:\n\n```\n:Sidekick cli show name=claude\n```\n\nThis is equivalent to the following Lua code:\n\n```lua\nrequire(\"sidekick.cli\").show({ name = \"claude\" })\n```\n\n\u003Cdetails>\u003Csummary>\n\u003Cstrong>Available Commands\u003C\u002Fstrong>\u003C\u002Fsummary>\n\nHere's a list of the available commands:\n\n**NES (`nes`)**\n\n- `enable`: Enable Next Edit Suggestions.\n- `disable`: Disable Next Edit Suggestions.\n- `toggle`: Toggle Next Edit Suggestions.\n- `update`: Trigger a new suggestion.\n- `clear`: Clear the current suggestion.\n\n**CLI (`cli`)**\n\n- `show`: Show the CLI window.\n- `toggle`: Toggle the CLI window.\n- `hide`: Hide the CLI window.\n- `close`: Close the CLI window.\n- `focus`: Focus the CLI window.\n- `select`: Select a CLI tool to open.\n- `send`: Send a message to the current CLI tool.\n- `prompt`: Select a prompt to send to the current CLI tool.\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\u003Csummary>\n\u003Cstrong>Examples\u003C\u002Fstrong>\u003C\u002Fsummary>\n\nHere are some examples of how to use the `:Sidekick` command:\n\n- Toggle the CLI window:\n\n  ```\n  :Sidekick cli toggle\n  ```\n\n  Lua equivalent:\n\n  ```lua\n  require(\"sidekick.cli\").toggle()\n  ```\n\n- Send the visual selection to the current CLI tool:\n\n  ```\n  :'\u003C,'>Sidekick cli send msg=\"{selection}\"\n  ```\n\n  Lua equivalent:\n\n  ```lua\n  require(\"sidekick.cli\").send({ msg = \"{selection}\" })\n  ```\n\n- Show the CLI window for the `grok` tool and focus it:\n\n  ```\n  :Sidekick cli show name=grok focus=true\n  ```\n\n  Lua equivalent:\n\n  ```lua\n  require(\"sidekick.cli\").show({ name = \"grok\", focus = true })\n  ```\n\n  \u003C\u002Fdetails>\n\n## 📟 Statusline Integration\n\nUsing the `require(\"sidekick.status\")` API, you can easily integrate **Copilot LSP**\nand **CLI sessions** in your statusline.\n\n\u003Cdetails>\n\u003Csummary>Example for \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnvim-lualine\u002Flualine.nvim\">lualine.nvim\u003C\u002Fa>\u003C\u002Fsummary>\n\n\u003C!-- setup_lualine:start -->\n\n```lua\n{\n  \"nvim-lualine\u002Flualine.nvim\",\n  opts = function(_, opts)\n    opts.sections = opts.sections or {}\n    opts.sections.lualine_c = opts.sections.lualine_c or {}\n\n    -- Copilot status\n    table.insert(opts.sections.lualine_c, {\n      function()\n        return \" \"\n      end,\n      color = function()\n        local status = require(\"sidekick.status\").get()\n        if status then\n          return status.kind == \"Error\" and \"DiagnosticError\" or status.busy and \"DiagnosticWarn\" or \"Special\"\n        end\n      end,\n      cond = function()\n        local status = require(\"sidekick.status\")\n        return status.get() ~= nil\n      end,\n    })\n\n    -- CLI session status\n    table.insert(opts.sections.lualine_x, 2, {\n      function()\n        local status = require(\"sidekick.status\").cli()\n        return \" \" .. (#status > 1 and #status or \"\")\n      end,\n      cond = function()\n        return #require(\"sidekick.status\").cli() > 0\n      end,\n      color = function()\n        return \"Special\"\n      end,\n    })\n  end,\n}\n```\n\n\u003C!-- setup_lualine:end -->\n\n\u003C\u002Fdetails>\n\n## ❓ FAQ\n\n### Does sidekick.nvim replace Copilot's inline suggestions?\n\nNo! NES complements inline suggestions. They serve different purposes:\n\n- **Inline completions**: Quick, as-you-type suggestions (use copilot.lua or native `vim.lsp.inline_completion`)\n- **NES**: Larger refactorings and multi-line changes after you pause\n\nYou'll want both for the best experience.\n\n### How is this different from copilot.lua or copilot.vim?\n\n`copilot.lua` and `copilot.vim` provide **inline completions** (suggestions as you type). `sidekick.nvim` adds:\n\n- **Next Edit Suggestions (NES)**: Multi-line refactorings and context-aware edits across your file\n- **AI CLI Integration**: Built-in terminal for Claude, Gemini, and other AI tools\n\nUse them together for the complete experience!\n\n### NES not showing suggestions?\n\n1. Run `:checkhealth sidekick` to verify your setup\n2. Check Copilot is signed in: `:LspCopilotSignIn`\n3. Verify the LSP is attached: `:lua vim.print(require(\"sidekick.config\").get_client())`\n4. Try manually triggering: `:Sidekick nes update`\n\n### CLI tools not starting?\n\n1. Verify the tool is installed: `which claude` (or your tool name)\n2. Check `:checkhealth sidekick` for tool installation status\n3. Try running the tool directly in your terminal first\n4. Check for errors with `:messages` after attempting to start\n\n### Terminal sessions not persisting?\n\nMake sure you have tmux or zellij installed and enable the multiplexer:\n\n```lua\nopts = {\n  cli = {\n    mux = {\n      enabled = true,\n      backend = \"tmux\", -- or \"zellij\"\n    },\n  },\n}\n```\n\n### Do I need a GitHub Copilot subscription?\n\nYes, but only for the **NES feature** (Next Edit Suggestions). The **AI CLI integration** works independently with any CLI tool (Claude, Gemini, etc.) and doesn't require Copilot.\n\n### Can I use this without NES, just for CLI tools?\n\nAbsolutely! Just disable NES:\n\n```lua\nopts = {\n  nes = { enabled = false },\n}\n```\n\n### Will this work with Neovim 0.10?\n\nNo, Neovim **>= 0.11.2** is required for the LSP features and API used by sidekick.nvim.\n\n### How do I add my own AI tool?\n\nAdd it to the `cli.tools` configuration:\n\n```lua\nopts = {\n  cli = {\n    tools = {\n      my_tool = {\n        cmd = { \"my-ai-cli\", \"--flag\" },\n        -- Optional: custom keymaps for this tool\n        keys = {\n          submit = { \"\u003Cc-s>\", function(t) t:send(\"\\n\") end },\n        },\n      },\n    },\n  },\n}\n```\n\n### How do I create custom prompts?\n\nAdd them to your config:\n\n```lua\nopts = {\n  cli = {\n    prompts = {\n      refactor = \"Please refactor {this} to be more maintainable\",\n      security = \"Review {file} for security vulnerabilities\",\n      custom = function(ctx)\n        return \"Current file: \" .. ctx.buf .. \" at line \" .. ctx.row\n      end,\n    },\n  },\n}\n```\n\nThen use with `\u003Cleader>ap` or `:Sidekick cli prompt`.\n","# 🤖 `sidekick.nvim`\n\n**sidekick.nvim** 是你的 Neovim AI 小助手，它将 Copilot LSP 的“下一次编辑建议”与内置终端集成，适用于任何 AI 命令行工具。你可以在不离开编辑器的情况下，审查并应用差异、与 AI 助手对话，从而简化编码流程。\n\n\u003Cimg width=\"2311\" height=\"1396\" alt=\"image\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Ffolke_sidekick.nvim_readme_270f2913e3b0.png\" \u002F>\n\n## ✨ 功能\n\n- **🤖 由 Copilot LSP 提供支持的下一次编辑建议 (NES)**\n  - 🪄 **自动建议**：当你暂停输入或移动光标时，会自动获取建议。\n  - 🎨 **丰富的差异显示**：通过内联和块级差异可视化更改，采用 Treesitter 基础的语法高亮，并可精确到单词或字符级别的差异。\n  - 🧭 **逐块导航**：逐个跳转查看编辑内容，确认后再应用。\n  - 📊 **状态栏集成**：在状态栏中显示 Copilot LSP 的状态、请求进度以及预览文本。\n\n- **💬 集成的 AI 命令行终端**\n  - 🚀 **直接访问 AI 命令行工具**：无需离开 Neovim 即可与你喜欢的 AI 命令行工具交互。\n  - 📦 **为常用工具预配置**：开箱即用支持 Claude、Gemini、Grok、Codex、Copilot CLI 等。\n  - ✨ **上下文感知提示**：自动将文件内容、光标位置和诊断信息包含在提示中。\n  - 📝 **提示库**：提供用于常见任务的预定义提示库，例如解释代码、修复问题或编写测试。\n  - 🔄 **会话持久化**：通过与 `tmux` 和 `zellij` 集成，保持 CLI 会话持续运行。\n  - 📂 **自动文件监听**：当 AI 工具修改文件时，Neovim 会自动重新加载该文件。\n\n- **🔌 可扩展且可定制**\n  - ⚙️ **灵活配置**：可根据个人喜好微调插件的各个方面。\n  - 🧩 **插件友好的 API**：丰富的 API 便于与其他插件集成及构建自定义工作流。\n  - 🎨 **可自定义 UI**：更改差异显示、标志等外观。\n\n## 📋 要求\n\n- **Neovim** `>= 0.11.2` 或更高版本\n- 官方 [copilot-language-server](https:\u002F\u002Fgithub.com\u002Fgithub\u002Fcopilot-language-server-release) LSP 服务器，需启用 `vim.lsp.enable`。可通过以下方式安装：\n  1. 使用 `npm` 或操作系统的包管理器安装\n  2. 使用 [mason-lspconfig.nvim](https:\u002F\u002Fgithub.com\u002Fmason-org\u002Fmason-lspconfig.nvim) 安装\n  3. [copilot.lua](https:\u002F\u002Fgithub.com\u002Fzbirenbaum\u002Fcopilot.lua) 和 [copilot.vim](https:\u002F\u002Fgithub.com\u002Fgithub\u002Fcopilot.vim) 均在其插件中捆绑了 LSP 服务器。\n- 有效的 `lsp\u002Fcopilot.lua` 配置。\n  - **提示**：包含在 [nvim-lspconfig](https:\u002F\u002Fgithub.com\u002Fneovim\u002Fnvim-lspconfig) 中。\n- [snacks.nvim](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsnacks.nvim) 用于更好地选择提示\u002F工具 **_(可选)_**\n- [nvim-treesitter-textobjects](https:\u002F\u002Fgithub.com\u002Fnvim-treesitter\u002Fnvim-treesitter-textobjects) **_(`main` 分支)_** 用于 `{function}` 和 `{class}` 上下文变量 **_(可选)_**\n- AI 命令行工具，如 Codex、Claude、Copilot、Gemini 等 **_(可选)_**\n  详情请参阅 [🤖 AI 命令行集成](#-ai-cli-integration) 部分。\n- 在类 Unix 系统上，使用 [lsof](https:\u002F\u002Fman7.org\u002Flinux\u002Fman-pages\u002Fman8\u002Flsof.8.html) 和 [ps](https:\u002F\u002Fman7.org\u002Flinux\u002Fman-pages\u002Fman1\u002Fps.1.html) 来检测正在运行的 AI 命令行工具会话。 **_(可选，但推荐)_**\n\n## 🚀 快速入门\n\n1. 使用你的包管理器安装插件（见下文）\n2. **配置 Copilot LSP** — 必须启用 `vim.lsp.enable`\n3. **检查健康状况**：`:checkhealth sidekick`\n4. **登录 Copilot**：`:LspCopilotSignIn`\n5. **试用**：\n   - 输入一些代码并暂停——观察下一次编辑建议是否出现\n   - 按 `\u003CTab>` 键浏览或应用建议\n   - 使用 `\u003Cleader>aa` 打开 AI 命令行工具\n\n> [!NOTE]\n> **初次接触下一次编辑建议？** 与内联补全不同，NES 会在文件中的任意位置建议完整的重构或多行更改——可以将其视为 Copilot 的“全局视角”建议。\n\n## 📦 安装\n\n使用您喜欢的包管理器进行安装。使用 [lazy.nvim](https:\u002F\u002Fgithub.com\u002Ffolke\u002Flazy.nvm)：\n\n\u003C!-- setup_base:start -->\n\n```lua\n{\n  \"folke\u002Fsidekick.nvim\",\n  opts = {\n    -- 在这里添加任何选项\n    cli = {\n      mux = {\n        backend = \"zellij\",\n        enabled = true,\n      },\n    },\n  },\n  keys = {\n    {\n      \"\u003Ctab>\",\n      function()\n        -- 如果有下一个编辑建议，跳转到它；否则应用第一个建议（如果有）\n        if not require(\"sidekick\").nes_jump_or_apply() then\n          return \"\u003CTab>\" -- 回退到正常的 Tab 键行为\n        end\n      end,\n      expr = true,\n      desc = \"前往\u002F应用下一个编辑建议\",\n    },\n    {\n      \"\u003Cc-.>\",\n      function() require(\"sidekick.cli\").focus() end,\n      desc = \"聚焦 Sidekick CLI\",\n      mode = { \"n\", \"t\", \"i\", \"x\" },\n    },\n    {\n      \"\u003Cleader>aa\",\n      function() require(\"sidekick.cli\").toggle() end,\n      desc = \"切换 Sidekick CLI 界面\",\n    },\n    {\n      \"\u003Cleader>as\",\n      function() require(\"sidekick.cli\").select() end,\n      -- 或者仅选择已安装的工具：\n      -- require(\"sidekick.cli\").select({ filter = { installed = true } })\n      desc = \"选择 CLI 工具\",\n    },\n    {\n      \"\u003Cleader>ad\",\n      function() require(\"sidekick.cli\").close() end,\n      desc = \"断开当前 CLI 会话连接\",\n    },\n    {\n      \"\u003Cleader>at\",\n      function() require(\"sidekick.cli\").send({ msg = \"{this}\" }) end,\n      mode = { \"x\", \"n\" },\n      desc = \"发送当前内容\",\n    },\n    {\n      \"\u003Cleader>af\",\n      function() require(\"sidekick.cli\").send({ msg = \"{file}\" }) end,\n      desc = \"发送当前文件\",\n    },\n    {\n      \"\u003Cleader>av\",\n      function() require(\"sidekick.cli\").send({ msg = \"{selection}\" }) end,\n      mode = { \"x\" },\n      desc = \"发送可视选区内容\",\n    },\n    {\n      \"\u003Cleader>ap\",\n      function() require(\"sidekick.cli\").prompt() end,\n      mode = { \"n\", \"x\" },\n      desc = \"Sidekick 选择提示界面\",\n    },\n    -- 示例：直接打开 Claude 的快捷键\n    {\n      \"\u003Cleader>ac\",\n      function() require(\"sidekick.cli\").toggle({ name = \"claude\", focus = true }) end,\n      desc = \"切换 Claude CLI 界面\",\n    },\n  },\n}\n```\n\n\u003C!-- setup_base:end -->\n\n> [!TIP]\n> 安装完成后，建议运行 `:checkhealth sidekick` 检查健康状态。\n\n\u003Cdetails>\n  \u003Csummary>在插入模式中集成 \u003Ccode>&lt;Tab&gt;\u003C\u002Fcode> 键与 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsaghen\u002Fblink.cmp\">blink.cmp\u003C\u002Fa>\u003C\u002Fsummary>\n\n\u003C!-- setup_blink:start -->\n\n```lua\n{\n  \"saghen\u002Fblink.cmp\",\n  ---@module 'blink.cmp'\n  ---@type blink.cmp.Config\n  opts = {\n\n    keymap = {\n      [\"\u003CTab>\"] = {\n        \"snippet_forward\",\n        function() -- Sidekick 下一个编辑建议\n          return require(\"sidekick\").nes_jump_or_apply()\n        end,\n        function() -- 如果您正在使用 Neovim 原生内联补全\n          return vim.lsp.inline_completion.get()\n        end,\n        \"fallback\",\n      },\n    },\n  },\n}\n```\n\n\u003C!-- setup_blink:end -->\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n  \u003Csummary>自定义 \u003Ccode>&lt;Tab&gt;\u003C\u002Fcode> 集成用于\u003Cb>插入模式\u003C\u002Fb>\u003C\u002Fsummary>\n\n\u003C!-- setup_custom:start -->\n\n```lua\n{\n  \"folke\u002Fsidekick.nvim\",\n  opts = {\n    -- 在这里添加任何选项\n  },\n  keys = {\n    {\n      \"\u003Ctab>\",\n      function()\n        -- 如果有下一个编辑建议，跳转到它；否则应用第一个建议（如果有）\n        if require(\"sidekick\").nes_jump_or_apply() then\n          return -- 跳转或应用成功\n        end\n\n        -- 如果您正在使用 Neovim 原生内联补全\n        if vim.lsp.inline_completion.get() then\n          return\n        end\n\n        -- 您希望在按下 Tab 键时执行的其他操作（例如代码片段）可以放在这里。\n\n        -- 最后回退到正常的 Tab 键行为\n        return \"\u003Ctab>\"\n      end,\n      mode = { \"i\", \"n\" },\n      expr = true,\n      desc = \"前往\u002F应用下一个编辑建议\",\n    },\n  },\n}\n```\n\n\u003C!-- setup_custom:end -->\n\n\u003C\u002Fdetails>\n\n安装完成后，如果提示，请使用 `:LspCopilotSignIn` 登录。\n\n## ⚙️ 配置\n\n该模块提供了安全的默认配置，并通过 `require(\"sidekick\").setup({ ... })` 暴露所有可配置项。\n\n\u003Cdetails>\n\u003Csummary>默认设置\u003C\u002Fsummary>\n\n\u003C!-- config:start -->\n\n```lua\n---@class sidekick.Config\nlocal defaults = {\n  nes = {\n    ---@type boolean|fun(buf:integer):boolean?\n    enabled = function(buf)\n      return vim.g.sidekick_nes ~= false and vim.b.sidekick_nes ~= false\n    end,\n    debounce = 100,\n    trigger = {\n      -- 触发侧边栏下一个编辑建议的事件\n      events = { \"ModeChanged i:n\", \"TextChanged\", \"User SidekickNesDone\" },\n    },\n    clear = {\n      -- 清除当前下一个编辑建议的事件\n      events = { \"TextChangedI\", \"InsertEnter\" },\n      esc = true, -- 按下 \u003CEsc> 键时清除下一个编辑建议\n    },\n    ---@class sidekick.diff.Opts\n    ---@field inline? \"words\"|\"chars\"|false 启用内联差异\n    ---@field show? \"always\"|\"cursor\" `cursor` 只有当光标位于编辑位置时才会显示差异。\n    diff = {\n      inline = \"words\",\n      show = \"always\",\n    },\n    signs = true, -- 为下一个编辑建议显示标志\n    jumplist = true, -- 将条目添加到跳转列表\n  },\n  -- 直接从 Neovim 内部使用 AI 命令行工具\n  cli = {\n    watch = true, -- 当 AI 命令行工具对文件进行更改时，通知 Neovim\n    ---@class sidekick.win.Opts\n    win = {\n      --- 这会在创建新终端之前运行，在启动终端之前执行。\n      --- 在这里可以修改窗口选项 `terminal.opts`。\n      ---@param terminal sidekick.cli.Terminal\n      config = function(terminal) end,\n      wo = {}, ---@type vim.wo\n      bo = {}, ---@type vim.bo\n      layout = \"right\", ---@type \"float\"|\"left\"|\"bottom\"|\"top\"|\"right\"\n      --- 当布局为 \"float\" 时使用的选项\n      ---@type vim.api.keyset.win_config\n      float = {\n        width = 0.9,\n        height = 0.9,\n      },\n      -- 当布局为 \"left\"|\"bottom\"|\"top\"|\"right\" 时使用的选项\n      ---@type vim.api.keyset.win_config\n      split = {\n        width = 80, -- 设置为 0 以使用默认的分割宽度\n        height = 20, -- 设置为 0 以使用默认的分割高度\n      },\n      --- CLI 工具快捷键（默认模式为 `t`）\n      ---@type table\u003Cstring, sidekick.cli.Keymap|false>\n      keys = {\n        buffers       = { \"\u003Cc-b>\", \"buffers\"   , mode = \"nt\", desc = \"打开缓冲区选择器\" },\n        files         = { \"\u003Cc-f>\", \"files\"     , mode = \"nt\", desc = \"打开文件选择器\" },\n        hide_n        = { \"q\"    , \"hide\"      , mode = \"n\" , desc = \"隐藏终端窗口\" },\n        hide_ctrl_q   = { \"\u003Cc-q>\", \"hide\"      , mode = \"n\" , desc = \"隐藏终端窗口\" },\n        hide_ctrl_dot = { \"\u003Cc-.>\", \"hide\"      , mode = \"nt\", desc = \"隐藏终端窗口\" },\n        hide_ctrl_z   = { \"\u003Cc-z>\", \"blur\"      , mode = \"nt\", desc = \"返回上一个窗口而不隐藏终端\" },\n        prompt        = { \"\u003Cc-p>\", \"prompt\"    , mode = \"t\" , desc = \"插入提示或上下文\" },\n        stopinsert    = { \"\u003Cc-q>\", \"stopinsert\", mode = \"t\" , desc = \"进入普通模式\" },\n        -- 在终端模式下导航窗口。仅在以下情况下生效：\n        -- * 布局不是 \"float\"\n        -- * 方向上有另一个窗口\n        -- 使用默认的 \"right\" 布局时，只有 `\u003Cc-h>` 会被映射\n        nav_left      = { \"\u003Cc-h>\", \"nav_left\"  , expr = true, desc = \"导航到左侧窗口\" },\n        nav_down      = { \"\u003Cc-j>\", \"nav_down\"  , expr = true, desc = \"导航到下方窗口\" },\n        nav_up        = { \"\u003Cc-k>\", \"nav_up\"    , expr = true, desc = \"导航到上方窗口\" },\n        nav_right     = { \"\u003Cc-l>\", \"nav_right\" , expr = true, desc = \"导航到右侧窗口\" },\n      },\n      ---@type fun(dir:\"h\"|\"j\"|\"k\"|\"l\")?\n      --- 处理窗口之间导航的函数。\n      --- 默认为 `vim.cmd.wincmd`。由 `nav_*` 快捷键使用。\n      nav = nil,\n    },\n    ---@class sidekick.cli.Mux\n    ---@field backend? \"tmux\"|\"zellij\" 多路复用器后端，用于持久化 CLI 会话\n    mux = {\n      backend = vim.env.ZELLIJ and \"zellij\" or \"tmux\", -- 默认使用 tmux，除非检测到 zellij\n      enabled = false,\n      -- terminal: 为每个 CLI 工具创建新会话，并在 Neovim 终端中显示\n      -- window: 在终端多路复用器中运行时，新会话将在新标签页中创建\n      -- split: 在终端多路复用器中运行时，新会话将在新的分割窗口中创建\n      -- 注意：zellij 只支持 `terminal`\n      create = \"terminal\", ---@type \"terminal\"|\"window\"|\"split\"\n      split = {\n        vertical = true, -- 垂直或水平分割\n        size = 0.5, -- 分割大小（0-1 表示百分比）\n      },\n    },\n    --- 实际的 CLI 工具配置从运行时路径 `sk\u002Fcli\u002F{tool}.lua` 加载，并与下面的配置合并。\n    --- 默认配置请参见 https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Ftree\u002Fmain\u002Fsk\u002Fcli\n    ---@type table\u003Cstring, sidekick.cli.Config|{}>\n    tools = {\n      aider    = {},\n      amazon_q = {},\n      claude   = {},\n      codex    = {},\n      copilot  = {},\n      crush    = {},\n      cursor   = {},\n      gemini   = {},\n      grok     = {},\n      opencode = {},\n      pi       = {},\n      qwen     = {},\n    },\n    --- 添加自定义上下文。请参阅 `lua\u002Fsidekick\u002Fcontext\u002Finit.lua`\n    ---@type table\u003Cstring, sidekick.context.Fn>\n    context = {},\n    ---@type table\u003Cstring, sidekick.Prompt|string|fun(ctx:sidekick.context.ctx):(string?)>\n    prompts = {\n      changes         = \"你能审查我的更改吗？\",\n      diagnostics     = \"你能帮我修复 {file} 中的诊断信息吗？\\n{diagnostics}\",\n      diagnostics_all = \"你能帮我修复这些诊断信息吗？\\n{diagnostics_all}\",\n      document        = \"为 {function|line} 添加文档\",\n      explain         = \"解释 {this}\",\n      fix             = \"你能修复 {this} 吗？\",\n      optimize        = \"如何优化 {this}？\",\n      review          = \"你能审查 {file} 是否有任何问题或改进建议吗？\",\n      tests           = \"你能为 {this} 编写测试吗？\",\n      -- 简单的上下文提示\n      buffers         = \"{buffers}\",\n      file            = \"{file}\",\n      line            = \"{line}\",\n      position        = \"{position}\",\n      quickfix        = \"{quickfix}\",\n      selection       = \"{selection}\",\n      [\"function\"]    = \"{function}\",\n      class           = \"{class}\",\n    },\n    -- 用于选择文件的首选选择器\n    ---@alias sidekick.picker \"snacks\"|\"telescope\"|\"fzf-lua\"\n    picker = \"snacks\", ---@type sidekick.picker\n  },\n  copilot = {\n    -- 使用 `didChangeStatus` 跟踪 Copilot 的状态\n    status = {\n      enabled = true,\n      level = vim.log.levels.WARN,\n      -- 设置为 vim.log.levels.OFF 以禁用通知\n      -- level = vim.log.levels.OFF,\n    },\n  },\n  ui = {\n    icons = {\n      nes               = \" \",\n      attached          = \" \",\n      started           = \" \",\n      installed         = \" \",\n      missing           = \" \",\n      external_attached = \"󰖩 \",\n      external_started  = \"󰖪 \",\n      terminal_attached = \" \",\n      terminal_started  = \" \",\n    },\n  },\n  debug = false, -- 启用调试日志\n}\n```\n\n\u003C!-- config:end -->\n\n\u003C\u002Fdetails>\n\n## ✏️ 下一步编辑建议 (NES)\n\nCopilot NES 请求会在您离开插入模式、在普通模式下修改文本或应用编辑后自动运行。\n\n\u003C!-- api_nes:start -->\n\n\u003Ctable>\u003Ctr>\u003Cth>命令\u003C\u002Fth>\u003Cth>Lua\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick nes apply\u003C\u002Fcode> 应用当前活动的文本编辑\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@return boolean applied\nrequire(\"sidekick.nes\").apply()\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick nes clear\u003C\u002Fcode> 清除所有当前活动的编辑\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\nrequire(\"sidekick.nes\").clear()\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick nes disable\u003C\u002Fcode> \u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n\nrequire(\"sidekick.nes\").disable()\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick nes enable\u003C\u002Fcode> \u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param enable? boolean\nrequire(\"sidekick.nes\").enable(enable)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd> 检查当前缓冲区中是否有活动编辑\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\nrequire(\"sidekick.nes\").have()\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick nes jump\u003C\u002Fcode> 跳转到当前活动编辑的起始位置\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@return boolean jumped\nrequire(\"sidekick.nes\").jump()\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick nes toggle\u003C\u002Fcode> \u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n\nrequire(\"sidekick.nes\").toggle()\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick nes update\u003C\u002Fcode> 向 LSP 服务器请求新的编辑（如果有的话）\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\nrequire(\"sidekick.nes\").update()\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n\u003C!-- api_nes:end -->\n\n## 🤖 AI CLI 集成\n\nSidekick 自带一个轻量级的终端封装，让您无需离开 Neovim 即可与本地 AI CLI 工具交互。每个工具都在独立的临时终端窗口中运行，并共享辅助提示，这些提示会根据请求打包缓冲区上下文、当前光标位置以及诊断信息。\n\n\u003C!-- api_cli:start -->\n\n\u003Ctable>\u003Ctr>\u003Cth>命令\u003C\u002Fth>\u003Cth>Lua\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick cli close\u003C\u002Fcode> \u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param opts? sidekick.cli.Hide\n---@overload fun(name: string)\nrequire(\"sidekick.cli\").close(opts)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick cli focus\u003C\u002Fcode> 如果终端窗口已打开，则切换其焦点\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param opts? sidekick.cli.Show\n---@overload fun(name: string)\nrequire(\"sidekick.cli\").focus(opts)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick cli hide\u003C\u002Fcode> \u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param opts? sidekick.cli.Hide\n---@overload fun(name: string)\nrequire(\"sidekick.cli\").hide(opts)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick cli prompt\u003C\u002Fcode> 选择要发送的提示\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param opts? sidekick.cli.Prompt|{cb:nil}\n---@overload fun(cb:fun(msg?:string))\nrequire(\"sidekick.cli\").prompt(opts)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd> 渲染消息模板或提示\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param opts? sidekick.cli.Message|string\nrequire(\"sidekick.cli\").render(opts)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick cli select\u003C\u002Fcode> 启动或附加到一个 CLI 工具\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param opts? sidekick.cli.Select|{cb:nil}|{focus?:boolean}\n---@overload fun(cb:fun(state?:sidekick.cli.State))\nrequire(\"sidekick.cli\").select(opts)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick cli send\u003C\u002Fcode> 向 CLI 发送消息或提示\u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param opts? sidekick.cli.Send\n---@overload fun(msg:string)\nrequire(\"sidekick.cli\").send(opts)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick cli show\u003C\u002Fcode> \u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param opts? sidekick.cli.Show\n---@overload fun(name: string)\nrequire(\"sidekick.cli\").show(opts)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>:Sidekick cli toggle\u003C\u002Fcode> \u003C\u002Ftd>\u003Ctd>\n\n\n```lua\n---@param opts? sidekick.cli.Show\n---@overload fun(name: string)\nrequire(\"sidekick.cli\").toggle(opts)\n```\n\n\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n\u003C!-- api_cli:end -->\n\n### 提示与上下文\n\nSidekick 自带一组预定义的提示，您可以将其与 AI 工具一起使用。此外，您还可以在提示中使用上下文变量，以包含有关当前文件、选区、诊断等信息。\n\n\u003Cimg width=\"1431\" height=\"723\" alt=\"image\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Ffolke_sidekick.nvim_readme_39d0f0da4e69.png\" \u002F>\n\n\u003Cdetails>\u003Csummary>\u003Cstrong>可用提示\u003C\u002Fstrong>\u003C\u002Fsummary>\n\n- **changes**: `你能 review 我的更改吗？`\n- **diagnostics**: `你能帮我修复 {file} 中的诊断问题吗？\\n{diagnostics}`\n- **diagnostics_all**: `你能帮我修复这些诊断问题吗？\\n{diagnostics_all}`\n- **document**: `为 {position} 添加文档`\n- **explain**: `解释 {this}`\n- **fix**: `你能修复 {this} 吗？`\n- **optimize**: `如何优化 {this}？`\n- **review**: `你能 review {file} 是否有任何问题或改进之处吗？`\n- **tests**: `你能为 {this} 编写测试吗？`\n- **quickfix**: `{quickfix}`（当前 quickfix 条目）。\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\u003Csummary>\u003Cstrong>可用上下文变量\u003C\u002Fstrong>\u003C\u002Fsummary>\n\n- `{buffers}`: 所有打开的缓冲区列表。\n- `{file}`: 当前文件路径。\n- `{position}`: 当前文件中的光标位置。\n- `{line}`: 当前行。\n- `{selection}`: 可视化选区。\n- `{diagnostics}`: 当前缓冲区的诊断信息。\n- `{diagnostics_all}`: 工作区中的所有诊断信息。\n- `{quickfix}`: 当前 quickfix 列表，包括标题和格式化后的条目。\n- `{function}`: 光标处的函数（Tree-sitter）——返回类似 `function foo @file:10:5` 的位置。\n- `{class}`: 光标处的类\u002F结构体（Tree-sitter）——返回位置。\n- `{this}`: 一个特殊的上下文变量。如果当前缓冲区是文件，则解析为 `{position}`；否则，解析为字面字符串“this”，并将当前 `{selection}` 追加到提示中。\n\n\u003C\u002Fdetails>\n\n### Snacks.nvim 选取器集成\n\n如果您正在使用 [snacks.nvim](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsnacks.nvim)，您可以将选取器中的选择直接发送到 Sidekick 的 AI CLI 工具中。这对于将搜索结果、grep 匹配项或文件选择作为上下文发送非常有用。\n\n\u003Cdetails>\u003Csummary>Snacks 选取器配置示例\u003C\u002Fsummary>\n\n\u003C!-- snacks_picker:start -->\n\n```lua\n{\n  \"folke\u002Fsnacks.nvim\",\n  optional = true,\n  opts = {\n    picker = {\n      actions = {\n        sidekick_send = function(...)\n          return require(\"sidekick.cli.picker.snacks\").send(...)\n        end,\n      },\n      win = {\n        input = {\n          keys = {\n            [\"\u003Ca-a>\"] = {\n              \"sidekick_send\",\n              mode = { \"n\", \"i\" },\n            },\n          },\n        },\n      },\n    },\n  },\n}\n```\n\n\u003C!-- snacks_picker:end -->\n\n通过此配置，在任何 Snacks 选取器中按下 `\u003Ca-a>` 键，都会将所选内容发送到您当前的 AI CLI 会话中。该集成会自动处理：\n\n- 带完整路径的文件选择\n- 带行号和位置的 grep 结果\n- 多重选择（发送所有选中的内容）\n- 精确位置范围以提供更详细的上下文\n\n\u003C\u002Fdetails>\n\n### CLI 键位映射\n\n你可以通过设置 `cli.win.keys` 选项来自定义 CLI 窗口的键位映射。\n默认的键位映射如下：\n\n- `q`（在普通模式下）：隐藏终端窗口。\n- `\u003Cc-q>`（在终端模式下）：隐藏终端窗口。\n- `\u003Cc-z>`：退出 CLI 窗口。\n- `\u003Cc-p>`：插入提示或上下文。\n\n\u003Cdetails>\u003Csummary>如何覆盖默认键位映射的示例\u003C\u002Fsummary>\n\n```lua\n{\n  \"folke\u002Fsidekick.nvim\",\n  opts = {\n    cli = {\n      win = {\n        keys = {\n          -- 覆盖默认的隐藏键位\n          hide_n = { \"\u003Cleader>q\", \"hide\", mode = \"n\" },\n          -- 添加一个新的键位用于打招呼\n          say_hi = {\n            \"\u003Cc-h>\",\n            function(t)\n              t:send(\"hi!\")\n            end,\n          },\n        },\n      },\n    },\n  },\n}\n```\n\n\u003C\u002Fdetails>\n\n### 默认 CLI 工具\n\nSidekick 预配置了一些流行的 AI CLI 工具。运行 `:checkhealth sidekick` 可以查看哪些工具已安装。\n\n| 工具                                                        | 描述          | 安装方法                                                                                                           |\n| ----------------------------------------------------------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------- |\n| [`aider`](https:\u002F\u002Fgithub.com\u002FAider-AI\u002Faider)                | AI 配对程序员   | `pip install aider-chat` 或 `pipx install aider-chat`                                                                  |\n| [`amazon_q`](https:\u002F\u002Fgithub.com\u002Faws\u002Famazon-q-developer-cli) | Amazon Q 开发者 | [安装指南](https:\u002F\u002Fdocs.aws.amazon.com\u002Famazonq\u002Flatest\u002Fqdeveloper-ug\u002Fcommand-line-getting-started-installing.html) |\n| [`claude`](https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-code)       | Claude Code CLI      | [参见 Claude Code 文档](https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Foverview#get-started)\n| [`codex`](https:\u002F\u002Fgithub.com\u002Fopenai\u002Fcodex)                  | OpenAI Codex CLI     | 参见 [OpenAI 文档](https:\u002F\u002Fgithub.com\u002Fopenai\u002Fcodex)                                                                     |\n| [`copilot`](https:\u002F\u002Fgithub.com\u002Fgithub\u002Fcopilot-cli)          | GitHub Copilot CLI   | `npm install -g @githubnext\u002Fgithub-copilot-cli`                                                                        |\n| [`crush`](https:\u002F\u002Fgithub.com\u002Fcharmbracelet\u002Fcrush)           | Charm 的 AI 助手 | 参见 [安装说明](https:\u002F\u002Fgithub.com\u002Fcharmbracelet\u002Fcrush)                                                             |\n| [`cursor`](https:\u002F\u002Fcursor.com\u002Fcli)                          | Cursor CLI 代理     | 参见 [Cursor 文档](https:\u002F\u002Fcursor.com\u002Fcli)                                                                              |\n| [`gemini`](https:\u002F\u002Fgithub.com\u002Fgoogle-gemini\u002Fgemini-cli)     | Google Gemini CLI    | 参见 [仓库](https:\u002F\u002Fgithub.com\u002Fgoogle-gemini\u002Fgemini-cli)                                                                |\n| [`grok`](https:\u002F\u002Fgithub.com\u002Fsuperagent-ai\u002Fgrok-cli)         | xAI Grok CLI         | 参见 [仓库](https:\u002F\u002Fgithub.com\u002Fsuperagent-ai\u002Fgrok-cli)                                                                  |\n| [`opencode`](https:\u002F\u002Fgithub.com\u002Fsst\u002Fopencode)               | OpenCode CLI         | `npm install -g opencode`                                                                                              |\n| [`qwen`](https:\u002F\u002Fgithub.com\u002FQwenLM\u002Fqwen-code)               | Alibaba Qwen Code    | 参见 [仓库](https:\u002F\u002Fgithub.com\u002FQwenLM\u002Fqwen-code)                                                                        |\n\n> [!TIP]\n> 安装工具后，重启 Neovim 或运行 `:Sidekick cli select` 即可看到可用的工具。\n\n## 🚀 命令\n\nSidekick 提供了一个 `:Sidekick` 命令，允许你从命令行与插件交互。\n该命令是 Lua API 的一个轻量级封装，因此你可以使用它来执行 Lua API 能够完成的任何操作。\n\n### 命令结构\n\n命令结构很简单：\n\n```\n:Sidekick \u003C模块> \u003C命令> [参数]\n```\n\n- `\u003C模块>`：你要使用的模块名称（例如 `nes`、`cli`）。\n- `\u003C命令>`：你要执行的命令名称。\n- `[参数]`：命令的可选参数。这些参数会被解析为一个 Lua 表。\n\n例如，要显示 `claude` 工具的 CLI 窗口，可以使用以下命令：\n\n```\n:Sidekick cli show name=claude\n```\n\n这等同于以下 Lua 代码：\n\n```lua\nrequire(\"sidekick.cli\").show({ name = \"claude\" })\n```\n\n\u003Cdetails>\u003Csummary>\n\u003Cstrong>可用命令\u003C\u002Fstrong>\u003C\u002Fsummary>\n\n以下是可用命令的列表：\n\n**NES (`nes`)**\n\n- `enable`: 启用下一步编辑建议。\n- `disable`: 禁用下一步编辑建议。\n- `toggle`: 切换下一步编辑建议的启用状态。\n- `update`: 触发新的建议。\n- `clear`: 清除当前建议。\n\n**CLI (`cli`)**\n\n- `show`: 显示 CLI 窗口。\n- `toggle`: 切换 CLI 窗口的显示状态。\n- `hide`: 隐藏 CLI 窗口。\n- `close`: 关闭 CLI 窗口。\n- `focus`: 将焦点切换到 CLI 窗口。\n- `select`: 选择要打开的 CLI 工具。\n- `send`: 向当前 CLI 工具发送消息。\n- `prompt`: 选择要发送给当前 CLI 工具的提示。\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\u003Csummary>\n\u003Cstrong>示例\u003C\u002Fstrong>\u003C\u002Fsummary>\n\n以下是一些使用 `:Sidekick` 命令的示例：\n\n- 切换 CLI 窗口的显示状态：\n\n  ```\n  :Sidekick cli toggle\n  ```\n\n  Lua 等价代码：\n\n  ```lua\n  require(\"sidekick.cli\").toggle()\n  ```\n\n- 将可视选区发送到当前 CLI 工具：\n\n  ```\n  :'\u003C,'>Sidekick cli send msg=\"{selection}\"\n  ```\n\n  Lua 等价代码：\n\n  ```lua\n  require(\"sidekick.cli\").send({ msg = \"{selection}\" })\n  ```\n\n- 显示 `grok` 工具的 CLI 窗口并将其置为焦点：\n\n  ```\n  :Sidekick cli show name=grok focus=true\n  ```\n\n  Lua 等价代码：\n\n  ```lua\n  require(\"sidekick.cli\").show({ name = \"grok\", focus = true })\n  ```\n\n  \u003C\u002Fdetails>\n\n## 📟 状态栏集成\n\n通过 `require(\"sidekick.status\")` API，你可以轻松地将 **Copilot LSP** 和 **CLI 会话** 集成到你的状态栏中。\n\n\u003Cdetails>\n\u003Csummary>适用于 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnvim-lualine\u002Flualine.nvim\">lualine.nvim\u003C\u002Fa> 的示例\u003C\u002Fsummary>\n\n\u003C!-- setup_lualine:start -->\n\n```lua\n{\n  \"nvim-lualine\u002Flualine.nvim\",\n  opts = function(_, opts)\n    opts.sections = opts.sections or {}\n    opts.sections.lualine_c = opts.sections.lualine_c or {}\n\n    -- Copilot 状态\n    table.insert(opts.sections.lualine_c, {\n      function()\n        return \" \"\n      end,\n      color = function()\n        local status = require(\"sidekick.status\").get()\n        if status then\n          return status.kind == \"Error\" and \"DiagnosticError\" or status.busy and \"DiagnosticWarn\" or \"Special\"\n        end\n      end,\n      cond = function()\n        local status = require(\"sidekick.status\")\n        return status.get() ~= nil\n      end,\n    })\n\n    -- CLI 会话状态\n    table.insert(opts.sections.lualine_x, 2, {\n      function()\n        local status = require(\"sidekick.status\").cli()\n        return \" \" .. (#status > 1 and #status or \"\")\n      end,\n      cond = function()\n        return #require(\"sidekick.status\").cli() > 0\n      end,\n      color = function()\n        return \"Special\"\n      end,\n    })\n  end,\n}\n```\n\n\u003C!-- setup_lualine:end -->\n\n\u003C\u002Fdetails>\n\n## ❓ 常见问题解答\n\n### sidekick.nvim 会取代 Copilot 的内联建议吗？\n\n不会！NES 是对内联建议的补充。它们服务于不同的目的：\n\n- **内联补全**：即时、边打字边提供的快速建议（使用 copilot.lua 或原生的 `vim.lsp.inline_completion`）\n- **NES**：在你暂停编辑后进行的大规模重构和多行更改\n\n为了获得最佳体验，你可能需要同时使用两者。\n\n### 这与 copilot.lua 或 copilot.vim 有何不同？\n\n`copilot.lua` 和 `copilot.vim` 提供的是 **内联补全**（即边输入边提供建议）。而 `sidekick.nvim` 则增加了：\n\n- **Next Edit Suggestions (NES)**：跨文件的多行重构和上下文感知编辑\n- **AI CLI 集成**：内置终端，支持 Claude、Gemini 等 AI 工具\n\n将它们结合使用，可以获得完整的体验！\n\n### NES 没有显示建议怎么办？\n\n1. 运行 `:checkhealth sidekick` 来验证你的配置是否正确。\n2. 确保 Copilot 已登录：`:LspCopilotSignIn`。\n3. 检查 LSP 是否已连接：`:lua vim.print(require(\"sidekick.config\").get_client())`。\n4. 尝试手动触发：`:Sidekick nes update`。\n\n### CLI 工具无法启动怎么办？\n\n1. 确认工具已安装：`which claude`（或你使用的工具名称）。\n2. 使用 `:checkhealth sidekick` 检查工具的安装状态。\n3. 先尝试在终端中直接运行该工具。\n4. 尝试启动后查看 `:messages` 中是否有错误信息。\n\n### 终端会话无法持久化怎么办？\n\n确保你已安装 tmux 或 zellij，并启用多路复用器：\n\n```lua\nopts = {\n  cli = {\n    mux = {\n      enabled = true,\n      backend = \"tmux\", -- 或 \"zellij\"\n    },\n  },\n}\n```\n\n### 我需要 GitHub Copilot 订阅吗？\n\n是的，但仅限于 **NES 功能**（Next Edit Suggestions）。而 **AI CLI 集成** 可以独立使用任何 CLI 工具（如 Claude、Gemini 等），并不需要 Copilot。\n\n### 如果我只想使用 CLI 工具，而不使用 NES，可以吗？\n\n当然可以！只需禁用 NES 即可：\n\n```lua\nopts = {\n  nes = { enabled = false },\n}\n```\n\n### 这个插件能在 Neovim 0.10 上运行吗？\n\n不能。由于 sidekick.nvim 使用了 LSP 功能和 API，因此需要 Neovim **>= 0.11.2**。\n\n### 如何添加我自己的 AI 工具？\n\n将它添加到 `cli.tools` 配置中：\n\n```lua\nopts = {\n  cli = {\n    tools = {\n      my_tool = {\n        cmd = { \"my-ai-cli\", \"--flag\" },\n        -- 可选：为该工具自定义快捷键\n        keys = {\n          submit = { \"\u003Cc-s>\", function(t) t:send(\"\\n\") end },\n        },\n      },\n    },\n  },\n}\n```\n\n### 如何创建自定义提示？\n\n将其添加到你的配置中：\n\n```lua\nopts = {\n  cli = {\n    prompts = {\n      refactor = \"请将 {this} 重构得更易于维护\",\n      security = \"检查 {file} 中是否存在安全漏洞\",\n      custom = function(ctx)\n        return \"当前文件：\" .. ctx.buf .. \" 在第 \" .. ctx.row 行\"\n      end,\n    },\n  },\n}\n```\n\n然后可以通过 `\u003Cleader>ap` 或 `:Sidekick cli prompt` 来使用这些提示。","# sidekick.nvim 快速上手指南\n\n`sidekick.nvim` 是 Neovim 的 AI 助手插件，它将 GitHub Copilot LSP 的“下一步编辑建议”（Next Edit Suggestions, NES）与内置的 AI CLI 终端完美结合。你可以在编辑器内直接审查代码差异、与应用 AI 生成的修改，或与各类 AI 命令行工具（如 Claude、Gemini 等）对话。\n\n## 环境准备\n\n在开始之前，请确保满足以下系统和软件要求：\n\n*   **Neovim**: 版本需 `>= 0.11.2`。\n*   **Copilot LSP 服务器**: 必须安装并启用官方的 `copilot-language-server`。\n    *   可通过 `npm`、系统包管理器或 `mason-lspconfig.nvim` 安装。\n    *   若使用 `copilot.lua` 或 `copilot.vim` 插件，它们通常已 bundled 该服务器。\n*   **LSP 配置**: 确保已在 Neovim 中通过 `vim.lsp.enable` 启用了 Copilot LSP。\n*   **可选依赖** (提升体验):\n    *   `snacks.nvim`: 用于更好的提示词和工具选择界面。\n    *   `nvim-treesitter-textobjects` (main 分支): 支持 `{function}` 和 `{class}` 等上下文变量。\n    *   **AI CLI 工具**: 如 Claude Code, Codex, Copilot CLI, Gemini CLI 等。\n    *   **会话管理**: 推荐安装 `tmux` 或 `zellij` 以持久化 CLI 会话；安装 `lsof` 和 `ps` 以便插件检测运行中的会话。\n\n## 安装步骤\n\n推荐使用 [`lazy.nvim`](https:\u002F\u002Fgithub.com\u002Ffolke\u002Flazy.nvim) 进行安装。请将以下配置添加到你的插件配置文件中：\n\n```lua\n{\n  \"folke\u002Fsidekick.nvim\",\n  opts = {\n    -- 在此添加自定义选项\n    cli = {\n      mux = {\n        backend = \"zellij\", -- 或 \"tmux\"\n        enabled = true,     -- 启用会话持久化\n      },\n    },\n  },\n  keys = {\n    -- 核心快捷键：跳转或应用下一个编辑建议\n    {\n      \"\u003Ctab>\",\n      function()\n        if not require(\"sidekick\").nes_jump_or_apply() then\n          return \"\u003CTab>\" -- 若无建议，回退到普通 Tab 行为\n        end\n      end,\n      expr = true,\n      desc = \"Goto\u002FApply Next Edit Suggestion\",\n    },\n    -- 聚焦\u002F打开 AI CLI 终端\n    {\n      \"\u003Cc-.>\",\n      function() require(\"sidekick.cli\").focus() end,\n      desc = \"Sidekick Focus\",\n      mode = { \"n\", \"t\", \"i\", \"x\" },\n    },\n    -- 切换 CLI 终端显示\n    {\n      \"\u003Cleader>aa\",\n      function() require(\"sidekick.cli\").toggle() end,\n      desc = \"Sidekick Toggle CLI\",\n    },\n    -- 选择要使用的 AI CLI 工具\n    {\n      \"\u003Cleader>as\",\n      function() require(\"sidekick.cli\").select() end,\n      desc = \"Select CLI\",\n    },\n    -- 发送当前文件内容给 AI\n    {\n      \"\u003Cleader>af\",\n      function() require(\"sidekick.cli\").send({ msg = \"{file}\" }) end,\n      desc = \"Send File\",\n    },\n    -- 发送可视选区内容给 AI\n    {\n      \"\u003Cleader>av\",\n      function() require(\"sidekick.cli\").send({ msg = \"{selection}\" }) end,\n      mode = { \"x\" },\n      desc = \"Send Visual Selection\",\n    },\n  },\n}\n```\n\n> **注意**: 如果你使用 `blink.cmp` 或其他补全插件，可能需要调整 `\u003CTab>` 键的映射逻辑以避免冲突（参考原文中的集成示例）。\n\n### 初始化配置\n\n安装完成后，执行以下步骤完成初始化：\n\n1.  **健康检查**: 在 Neovim 中运行 `:checkhealth sidekick` 确保所有依赖就绪。\n2.  **登录 Copilot**: 运行 `:LspCopilotSignIn` 按照提示完成 GitHub Copilot 登录。\n\n## 基本使用\n\n### 1. 体验智能编辑建议 (NES)\n\n不同于普通的行内补全，NES 会提供跨多行的重构建议或大块代码修改。\n\n*   **触发**: 在编写代码时暂停输入或移动光标，插件会自动获取建议。\n*   **查看**: 屏幕上会以高亮差异（Diff）形式展示建议修改的内容。\n*   **导航与应用**:\n    *   按下 `\u003CTab>` 键：如果有多个修改块，会在块之间跳转；如果位于最后一个块或只有一个块，则应用该修改。\n    *   你可以逐块审查（Hunk-by-Hunk），确认无误后再应用。\n\n### 2. 使用内置 AI 终端\n\n无需离开 Neovim 即可与强大的 AI CLI 工具交互。\n\n*   **打开终端**: 按下 `\u003Cleader>aa` 或 `\u003Cc-.>` 打开\u002F聚焦 AI 终端窗口。\n*   **选择工具**: 首次使用或切换工具时，按 `\u003Cleader>as` 选择已安装的 AI 工具（如 `claude`, `gemini` 等）。\n*   **发送上下文**:\n    *   选中一段代码，按 `\u003Cleader>av` 将选区内容发送给 AI 并自动附带提示。\n    *   按 `\u003Cleader>af` 发送整个当前文件。\n*   **文件监听**: 当 AI 工具在终端中修改了文件，Neovim 会自动重新加载这些更改，保持同步。\n\n### 3. 常用工作流示例\n\n**场景：让 AI 优化当前函数**\n\n1.  将光标移至函数内部或使用可视模式选中该函数。\n2.  按下 `\u003Cc-.>` 打开终端。\n3.  输入提示词，例如：\"Refactor this function to improve readability\"（若已选中代码，插件会自动注入上下文）。\n4.  AI 生成代码并直接写入文件。\n5.  回到代码编辑窗口，你会看到 NES 高亮显示了 AI 做出的修改。\n6.  按 `\u003CTab>` 审查并应用这些修改。","资深后端工程师正在重构一个遗留的 Python 微服务模块，需要批量优化异步逻辑并修复潜在的竞态条件。\n\n### 没有 sidekick.nvim 时\n- **上下文频繁切换**：为了获取大段重构建议，必须离开编辑器打开浏览器或独立终端与 AI 对话，复制粘贴代码不仅打断心流，还容易出错。\n- **审查效率低下**：面对 AI 返回的大段代码差异，缺乏精细化的逐词高亮和分块导航，只能肉眼逐行比对，极易遗漏细微的逻辑变更。\n- **手动应用繁琐**：将 AI 生成的多行修改应用到现有文件中时，需手动定位、删除旧代码并粘贴新内容，操作过程机械且耗时。\n- **状态感知缺失**：无法在编辑器状态栏直观看到 Copilot LSP 的请求进度或建议就绪状态，常常需要盲目等待或反复检查。\n\n### 使用 sidekick.nvim 后\n- **沉浸式智能协作**：暂停打字即可自动触发“下一步编辑建议（NES）”，直接在编辑器内通过 `\u003CTab>` 键预览并应用整块重构方案，无需切换窗口。\n- **精细化差异审查**：利用基于 Treesitter 的词级差异高亮和分块（Hunk）导航功能，可以逐个审查变更细节，确保每一处逻辑修改都符合预期。\n- **一键安全应用**：支持逐块跳转审查确认，确认无误后一键应用所有更改，将原本繁琐的手动合并过程简化为流畅的键盘操作。\n- **实时状态反馈**：状态栏实时显示 Copilot 建议的生成进度和预览文本，让开发者对 AI 辅助状态一目了然，掌控感更强。\n\nsidekick.nvim 通过将强大的 AI 建议与精细的代码审查流程无缝融入 Neovim，让开发者在不中断思维流的情况下高效完成复杂重构。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Ffolke_sidekick.nvim_270f2913.png","folke","Folke Lemaitre","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Ffolke_9823d316.jpg",null,"Ghent, Belgium","https:\u002F\u002Ffolke.io","https:\u002F\u002Fgithub.com\u002Ffolke",[84,88],{"name":85,"color":86,"percentage":87},"Lua","#000080",99.9,{"name":89,"color":90,"percentage":91},"Shell","#89e051",0.1,2488,109,"2026-04-05T08:14:23","Apache-2.0",4,"Linux, macOS, Windows","未说明",{"notes":100,"python":98,"dependencies":101},"该工具是 Neovim 插件，核心依赖是 GitHub Copilot LSP 服务器。AI CLI 功能支持 Claude、Gemini、Grok、Codex 等外部工具，需用户自行安装这些 CLI 工具。在类 Unix 系统上建议安装 lsof 和 ps 以检测运行中的 AI CLI 会话。配置 Copilot LSP 时必须使用 vim.lsp.enable 启用。",[102,103,104,105,106,107,108],"Neovim >= 0.11.2","copilot-language-server","snacks.nvim (可选)","nvim-treesitter-textobjects (可选，需 main 分支)","lsof (Unix-like 系统推荐)","ps (Unix-like 系统推荐)","tmux 或 zellij (用于会话持久化，可选)",[15,36],[111,112,113,114,115,116,117,118,119],"copilot","neovim","neovim-plugin","nvim","nvim-plugin","claude-code","codex-cli","copilot-cli","gemini-cli","2026-03-27T02:49:30.150509","2026-04-06T09:04:29.764904",[123,128,133,138,143,147],{"id":124,"question_zh":125,"answer_zh":126,"source_url":127},18531,"使用 Copilot 聊天模式时，终端打印了大量重复信息导致卡顿，如何解决？","该问题通常由旧版本插件引起。请尝试以下解决方案：\n1. 将 Copilot 插件更新至 1.0.9 或更高版本，并同步更新 sidekick 插件。\n2. 如果问题依旧，可以尝试在配置中启用实验性功能：`\u002Fexperimental on`。","https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F258",{"id":129,"question_zh":130,"answer_zh":131,"source_url":132},18532,"发送给 Claude Code 的代码片段位置格式不正确，导致需要额外的工具调用来读取文件，如何修复？","这是一个已知问题，维护者已在新版本中修复。现在工具支持自定义 `format` 函数来正确处理不同 CLI 的位置格式。\n对于 Claude Code，插件现在会自动将行范围转换为它理解的格式（例如 `@\u003Cfilename>#L\u003Cstart>-\u003Cend>`），而不再使用旧的格式。请确保将 sidekick.nvim 更新到最新版本即可生效。","https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F59",{"id":134,"question_zh":135,"answer_zh":136,"source_url":137},18533,"AI 建议的代码位置不正确（例如建议出现在错误的行号），即使建议内容本身是正确的，怎么办？","这通常是一个已修复的 Bug。如果您遇到此问题，请直接更新 sidekick 插件到最新版本。维护者确认该问题在近几天的提交中已被修复。如果更新后问题仍偶尔出现，可能是特定场景下的偶发问题，建议尝试重启 Neovim 或手动触发更新命令。","https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F125",{"id":139,"question_zh":140,"answer_zh":141,"source_url":142},18534,"在 Neovim 中启动 opencode 会话时出现渲染问题（如显示错乱），如何解决？","如果您禁用了多路复用器（例如设置 `opts.cli.mux = false`）但仍遇到渲染问题，这是因为某些 CLI 工具在没有 tmux\u002Fzellij 环境下渲染不稳定。\n目前的临时解决方案是重新启用多路复用器支持，或者等待官方针对非 mux 环境的进一步修复。维护者曾添加过临时变通方案，但在某些配置下（如禁用 mux）问题可能复现。","https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F16",{"id":144,"question_zh":145,"answer_zh":146,"source_url":137},18535,"Sidekick 生成的代码建议缺少末尾的换行符，导致下一行代码被挤到同一行，有办法自动补充吗？","这是一个已知的行为差异。目前插件没有内置钩子来强制输入缺失的 `\\n` 字符。\n变通方法包括：\n1. 接受建议后手动按下回车键。\n2. 关注后续版本更新，维护者可能会针对特定模型（如 NES）的输出格式进行后处理优化。",{"id":148,"question_zh":149,"answer_zh":150,"source_url":151},18536,"是否支持将 CLI 工具运行在独立的窗格中，而不是嵌入在 Neovim 内部？","Sidekick 设计初衷是利用 tmux 或 zellij 进行会话持久化和集成。虽然用户提出了在独立窗格运行并随时附加的需求（类似 IDE 集成模式），但目前主要依赖外部多路复用器来实现分离视图。\n您可以配置 sidekick 使用 tmux\u002Fzellij 创建独立窗格，从而实现“分离但可附加”的效果。纯粹的无 mux 独立进程运行且保持完整上下文同步的功能尚在探索或需借助其他插件（如 nvim-gemini-companion）的思路参考。","https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F26",[153,158,163,168,173,178,183,188],{"id":154,"version":155,"summary_zh":156,"released_at":157},109096,"v2.3.0","## [2.3.0](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcompare\u002Fv2.2.0...v2.3.0) (2026-03-20)\n\n\n### 功能\n\n* **配置:** ctrl+x 现在会模糊处理，而不是再次隐藏 ([122c1ca](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F122c1ca62fa27b4c2213879bbb04d890a16468ce))\n\n\n### 错误修复\n\n* **CLI:** 当光标在同一行时，范围计算错误。关闭 [#186](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F186)。修复 [#184](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F184) ([ff8ef47](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fff8ef479ff6b2f560cfbca0d8b4b8b4593969ab0))\n* **文档:** 更新 Claude 的安装说明 ([#255](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F255)) ([43c7a11](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F43c7a11b397afc7cc3c14113a52811a0d32ef6bf))","2026-03-20T10:10:41",{"id":159,"version":160,"summary_zh":161,"released_at":162},109097,"v2.2.0","## [2.2.0](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcompare\u002Fv2.1.0...v2.2.0) (2026-03-20)\n\n\n### 功能\n\n* **agents:** 添加 pi 代理 ([#247](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F247)) ([7e9da9b](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F7e9da9b12a5da46c6abd57ebf650e9d32c483ce7))\n* **nes:** 设置 `nes.diff.show = \"cursor\"`，仅在光标处显示 nes 差异。关闭 [#266](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F266) ([b1568d3](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fb1568d37ca0842eb772c86b3e9f214d075bfbf8d))\n* **terminal:** 在选择器中添加带空格的文件\u002F缓冲区内联显示。关闭 [#133](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F133) ([e743ac7](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fe743ac74b90826d0b3a33f44c9906baa306e46b9))\n* **terminal:** 使重新进入终端\u002F普通模式更加合理 ([9eb6530](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F9eb653079f9055fe62ff63e918c36c7c4c92e0a9))\n\n\n### 错误修复\n\n* **codex:** 更新已弃用的搜索选项 ([#166](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F166)) ([88cb6dd](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F88cb6dd487ddf35134987654eec91e20fddc1e54))\n* **config:** 从 codex 命令中移除网页搜索选项 ([#257](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F257)) ([f8b4f58](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Ff8b4f58c3b8b2cf8ddffa8d6c23b95c9010ae158))\n* **config:** 更新 codex 搜索选项 ([#167](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F167)) ([c302dba](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fc302dbaf0fcbde909838b296719bbf84e3db6e20))\n* **nes:** 修正在行尾追加内容时出现的内联差异错误 ([#250](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F250)) ([f95ba54](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Ff95ba541970c41a631d480062afedb0ebc455e19))\n* **nes:** 不再处理已取消（或顺序错乱）的请求 ([f8eac10](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Ff8eac1017ee6a13b9b9a827ca7708b52c00c1e72))\n* **opencode:** 使用 alt+p 代替 ctrl+p。修复 [#175](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F175) ([a6fe80f](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fa6fe80fc9d0a1db2bb7a55e8f313ed9e17282e3e))\n* **terminal:** 如果 CLI 窗口关闭，就绪检查不应失败。修复 [#252](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F252) ([6b69c42](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F6b69c42031950164b208b1abf78018ab4a86cdec))\n* **treesitter:** 不再使用 treesitter 字符串缓冲区 ([317ada1](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F317ada137f2b34cccc872b68f0a29d987cbce438))","2026-03-20T09:24:40",{"id":164,"version":165,"summary_zh":166,"released_at":167},109098,"v2.1.0","## [2.1.0](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcompare\u002Fv2.0.0...v2.1.0) (2025-10-23)\n\n\n### 功能特性\n\n* **cli:** 添加了 snacks 选择器动作，用于通过 sidekick 发送文件。关闭 [#134](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F134) ([96b84ff](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F96b84ff4fca047dd561219e92060c5a16d4a6e20))\n* **cli:** 为选择要发送的文件\u002F缓冲区添加了 snacks\u002Ftelescope\u002Ffzf-lua 选择器。([0da0e16](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F0da0e16089d62b882d2a7b2d8c9809a6185bf644))\n* **cli:** 添加了终端快捷键 `\u003Cc-f>` 用于选择文件，`\u003Cc-b>` 用于选择缓冲区以进行发送。([c827ad2](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fc827ad2826bd7fe444cddae8474e0bfe05ad3d93))\n* **diagnostics:** 诊断现在会在需要时使用可视选区。关闭 [#146](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F146) ([fb0cbaa](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Ffb0cbaa700006edc3318a026a14adb03f41d99a5))\n* **snacks:** 使 `vim.ui.select` 的 snacks 选项可配置。关闭 [#149](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F149) ([7568825](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F756882545e4fcb50185e3089ee77a67706951139))\n* **status:** 添加了可在状态行中使用的 cli 状态。关闭 [#143](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F143) ([e291b6b](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fe291b6b3cc66abf04c120e50a502e18323dfedd2))\n* **terminal:** 更智能的方式用于判断 cli 工具是否已准备好接受输入。关闭 [#150](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F150) ([04265f7](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F04265f7c1419bfcbb3b98b6d99bd3f5bd9cebd9b))\n\n\n### Bug 修复\n\n* **cli.loc:** 允许行\u002F列为 `nil` ([bb87f41](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fbb87f419dd56a7fabe0de017e18ace243a2d7aee))\n* **cli.picker:** 执行停止\u002F开始插入操作，以确保选择器和终端正常工作。([9941a1c](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F9941a1cf4eb7ca1cb9c155207a4249ff45e6123d))\n* **cli.status:** 安排分离事件以防止循环。关闭 [#144](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F144) ([9390cb7](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F9390cb72de62e6ae27dbd98dfda32059662290f1))\n* **cli:** 使用过滤选项进行发送。关闭 [#138](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F138) ([d0ee1ef](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fd0ee1ef6a8257d8b66be66a5797ae6451385ea0b))\n* **nes.edit:** 在访问位置之前添加缓冲区验证。([#147](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F147)) ([2cb7359](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F2cb7359b0908f52dd07ee8200f904ccf975f7679))\n* **nes:** ModeChanged: *:n -&gt; i:n，仅在从插入模式切换到普通模式时触发。关闭 [#151](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F151) ([9e29145](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F9e29145965b138d65f3d071663b1313f881d3d39))\n* **opencode:** opencode 原生实现了滚动功能，因此不再使用回滚缓冲区。参见 [#152](","2025-10-23T19:47:15",{"id":169,"version":170,"summary_zh":171,"released_at":172},109099,"v2.0.0","## [2.0.0](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcompare\u002Fv1.3.0...v2.0.0) (2025-10-17)\n\n\n### ⚠ 破坏性变更\n\n* **config:** 更改了默认的键位映射。请查看更新后的文档和示例映射。\n\n### 功能\n\n* **cli.claude:** 将行范围转换为 Claude 可以理解的格式。关闭 [#59](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F59) ([4a492da](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F4a492da6e863d06b15e887be97dd43c50b76f11d))\n* **cli.select:** 更好地区分附加到终端或外部进程的情况 ([48d0bf6](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F48d0bf66459f2fab8d917fea961bbe95c5d829c1))\n* **cli:** 对外部会话调用 `close()` 时，现在会从该会话中分离。关闭 [#98](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F98) ([d2e6c64](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fd2e6c6447e750a5f565ae1a832f1ca7fd8e6e8dd))\n* **cli:** 在普通模式下添加了 `\u003Cc-q>` 键用于隐藏窗口，因此在终端中双击 `\u003Cc-q>` 即可隐藏窗口 ([358804c](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F358804c71cd988b1ce7efc7a91e3d265df530a83))\n* **cli:** 添加了健康检查，并在文档中增加了对 `lsof` 和 `ps` 的可选依赖项说明。修复 [#89](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F89) ([d403ec3](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fd403ec3e695e17859e03aa0e6b4fe865140f7155))\n* **cli:** 增加了一些配置选项的验证 ([c236b38](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fc236b389819a3a11ada7234cd2a7a1be358b0785))\n* **cli:** 添加了使用 `\u003Cc-hjkl>` 进行终端导航的功能。仅在非浮动窗口且目录中存在窗口时才会映射。参见 [#51](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F51) ([b48e177](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fb48e177b20aeb422d3ea6838d8f2ca985ee6a21a))\n* **cli:** 去除了重复的 CLI 工具会话。关闭 [#92](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F92) ([e5bcf17](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fe5bcf171b13a99e53a8ac6b584baebf7c435584a))\n* **cli:** 处理 Claude、Gemini 和 Qwen 的特殊文件名。修复 [#130](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F130) ([19b5985](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F19b59854782837430ae297ed4690660b7aa254d5))\n* **config:** 更改了默认的键位映射。请查看更新后的文档和示例映射 ([6608705](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F6608705fc6bd949efafbdeca879c63a5f933730c))\n* **context:** 现在可以使用上下文回退功能，例如 `{function|line}` ([076147a](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F076147a6046836955712dcfc2702fc02c66684c9))\n* **copilot:** 允许配置 Copilot LSP 消息的最低级别 ([4b6750b](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F4b6750bb5218c0d8be2f006e41894a1655b1dd27))\n* **opencode:** 向外部 opencode 会话中添加了进程 ID ([3d9d519](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F3d9d519c90a2a071f56067a750840e6113359480))\n* **terminal:** 回滚缓冲区得到了极大改善。不再出现闪烁现象，并且应在所有模式下正常工作 ([3aa2fe5](https:\u002F\u002Fgithub.com\u002Ffolke","2025-10-17T13:11:05",{"id":174,"version":175,"summary_zh":176,"released_at":177},109100,"v1.3.0","## [1.3.0](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcompare\u002Fv1.2.0...v1.3.0) (2025-10-08)\n\n\n### 功能\n\n* **context:** 在 CLI 提示中添加了 quickfix 上下文提供者 ([#61](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F61)) ([6c24d47](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F6c24d47646ad3191a425bf646c0fe9396805d10a))\n* **context:** 添加了 treesitter 上下文 `class`、`function`。你可以在配置中添加更多。([8fb70e0](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F8fb70e025a3dfd144944be7a1fa74b2af0e0f07d))\n* **mux:** 默认使用 `tmux`，除非在 `zellij` 会话中运行 ([2110966](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F2110966b5a2b76cb187b9bf80e23dd0b5327c8c7))\n* **session:** 挂载到其他 tmux 会话中正在运行的工具 ([#74](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F74)) ([1de752c](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F1de752c7c098e587928b193299c8a259f3499533))\n* **tmux:** 在新窗口中启动 CLI 工具时发出通知。([c3d7572](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fc3d7572c2dc0bb3d108debda5736c30909133433))\n* **util:** Util.emit ([b0f3762](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fb0f37629ac424cbde37d97066402506ea14dc1fa))\n\n\n### 错误修复\n\n* **cli:** 修复提示操作的插入模式。关闭 [#50](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F50) ([8ebbd75](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F8ebbd7578bcdd345b81ab0d3e6776133d6b0d140))\n* **cli:** 启动时打开 CLI 窗口。关闭 [#78](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F78) ([b3560df](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fb3560df49bd0a6d02a404a7a3ec8c57507861a3f))\n* **cli:** 正确传播工具过滤器用于显示\u002F切换\u002F聚焦。关闭 [#57](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F57) ([bc44db0](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fbc44db09bbd5bd18551273d9349582b6e0f24bbc))\n* **copilot-cli:** 排除 copilot-language-server 进程。关闭 [#75](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F75) ([ce85284](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fce852849344f3ef0410d2b3f6e5465819603e41f))\n* **mux:** 缩短会话名称。修复 [#56](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F56) ([a4e62ce](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fa4e62cef32b6404bcbe4ef568d8a9d206b3cdaa8))\n* **opencode:** 仅在非 Windows 系统上挂载到现有的 opencode 会话。关闭 [#76](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F76) ([063457e](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F063457e154693ed532fb3c440b31066dde4d06b5))\n* **opencode:** 恢复为系统主题，因为目前仍对部分用户无效 ([b2818ec](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fb2818ec5edffe061ce10ec3ca19c9896e418b32f))\n* **session:** 为会话后端添加可选的 detach() 方法 ([3aa531e](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F3aa531e449965f5455b203c8356eb2f4e430adee))\n* **session:** 添加了 detach 方法 ([7e88fa5](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F7e88fa5672c4288c61548fe43e004dcd25ca4f84))\n* **sessions:** 更好的挂载","2025-10-08T12:27:46",{"id":179,"version":180,"summary_zh":181,"released_at":182},109101,"v1.2.0","## [1.2.0](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcompare\u002Fv1.1.0...v1.2.0) (2025-10-02)\n\n\n### 功能\n\n* 新增 `:Sidekick` 命令 ([2f17d6b](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F2f17d6bdf245381149b2515401a37ee67364904f))\n* **cli.prompts:** 在查看提示选择时，使用零食功能，可在插入\u002F普通模式下通过 `\u003Cc-y>` 和 `y` 进行复制 ([f2098d9](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Ff2098d978dbf19a64283ebe98c901cae8c986960))\n* **cli:** 新增 Amazon Q 支持 ([e84c5d0](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fe84c5d0df454ded38d6cd1982c8f689ebdde8b4e))\n* **cli:** 添加了完善的多会话管理功能。现在也可以从其他目录恢复 mux 会话 ([605c26b](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F605c26b72eca9e310a67cb3ab8a4feaae4ca416f))\n* **cli:** 允许动态配置终端。关闭 [#25](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F25) ([6b265fa](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F6b265faa39a182fb3fe0e92166232a330ed26d60))\n* **cli:** 全面优化提示\u002F上下文显示及发送逻辑 ([75b1897](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F75b189707d087e8b142b10fd5dec8be03ef23ff4))\n* **config:** 新增 Aider 支持 ([5144187](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F514418756189083767177099d85768d72c21f103))\n* **context:** 对上下文功能进行了大量改进，包括视觉选区支持和更准确的预览 ([7877322](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F78773228c05461f40737680177de695e579b1ace))\n* **health:** 增加了对重复 Copilot LSP 服务器的额外检查 ([0b89f04](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F0b89f04999065e8917eb480c9243a70e7ccdf147))\n* **nes:** 新增 NES 的启用\u002F禁用\u002F切换功能 ([2d280e9](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F2d280e931e02a44cb65c35d58ae42f55538866bc))\n* **nes:** 当 `enabled=false` 时，完全禁用 NES ([11428c1](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F11428c1e9890056136329dd4c0451dcb81feb830))\n* **nes:** 更新后触发 SidekickNesShow 和 SidekickNesHide 事件。关闭 [#19](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F19) ([302cec7](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F302cec770ca0a4b7dfafd7879034d33320592b33))\n* **terminal:** 完全支持分屏和浮动布局 ([c93c0cb](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fc93c0cbc2177a0eef19cf81adfe20329e4a90e83))\n* **terminal:** 设置文件类型为 `ft=sidekick_terminal` ([03366cc](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F03366ccdcb9a58c140ad1c68c0da644d5d264f2f))\n* **tmux:** 在 Sidekick 窗口中禁用状态栏 ([#42](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fissues\u002F42)) ([832165b](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F832165bf84f40e3dd3a86c8d66835903e036013f))\n* **tmux:** 传递自定义配置","2025-10-02T17:19:26",{"id":184,"version":185,"summary_zh":186,"released_at":187},109102,"v1.1.0","## [1.1.0](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcompare\u002Fv1.0.0...v1.1.0) (2025-09-29)\n\n\n### 功能特性\n\n* **cli:** 新增 AI 工具 URL ([51431b1](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F51431b158c2cf76d65fcfd4166d29b7486b0999f))\n* **cli:** 新增 blur\u002Fis_focused 选项 ([614c08c](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F614c08c00b71b56f2b2e99189ebf2a41e7127951))\n* **cli:** 新增 cli.blur 命令，用于取消终端窗口的焦点 ([4e465c0](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F4e465c0113166f43467c55ca1a5e42cd58b5eb45))\n* **cli:** 为 `vim.ui.select` 添加了自定义提示音选项 ([8e8677c](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F8e8677c2ea53feeb47f05bdcb3d02e1038a32dbb))\n* **cli:** 增加了在 zellij 或 tmux 会话中启动 AI CLI 工具的支持 ([0385dbf](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F0385dbf7f597a27c14de99ee594670008fdf9b7a))\n* **cli:** 新增切换焦点功能 ([c83ebd5](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fc83ebd52501a230276c9fa8b86657d044517a379))\n* **cli:** 添加了监视器，使 Neovim 能够感知 AI 工具何时更新了任何缓冲区 ([c1083fa](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fc1083faba3e9f4b5cc53c610564c43bbb9bbfc4f))\n* **cli:** 集成 AI CLI 工具 ([ab5da08](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fab5da081ae5ba579c306f20de5e3598c7045151f))\n* **cli:** CLI 工具快捷键映射 ([ac353d4](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fac353d4be53a44cc05350c35f4d2bd41e116f328))\n* **config:** 新增 `enabled` 选项，默认检查 `vim.g|b.copilot.nes == false` ([9ab4458](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F9ab44589492ae06639d1af2bf5be674a95e70460))\n* **config:** 为工具添加 opencode 和 cursor 选项 ([c11c1b9](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fc11c1b98e364b4c28c8a940526b8118663555f05))\n* **health:** 添加多路复用器检查 ([a903fb1](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fa903fb1ecaec153c3975a6de204c7f9da22e739e))\n* **util:** 调试日志记录 ([6315c92](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F6315c927a7c7913c8c9954c6d23b4e7830ddcc1e))\n* **util:** 调试通知 ([9454ee7](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F9454ee78ecbbaf416682ccf24830912cb7e3b153))\n* **watch:** 新增配置标志，用于启用或禁用监视功能 ([8a8c1ae](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F8a8c1aeda4c98c434e109cd6a96b1aafd9957627))\n\n\n### 错误修复\n\n* **cli:** 为上下文标记缓冲区 ([08e67b8](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F08e67b8d724a2a29bda89a6c3e97e8875c84a594))\n* **cli:** 默认以聚焦状态切换 ([c8e60d7](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fc8e60d7802372f28761b5da189224ea20c4337ae))\n* **context:** 边界情况处理 ([ee09859](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fee09859a5e68bebfdfe890a15a889455070d2c54))\n* **diff:** 增加对 Neovim \u003C 0.12 的支持 ([9166a6b](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F9166a6b8bc2e3316cf404b76864d9cba84abb588))\n* **diff:** 改进了差异渲染，使扩展标记能够正常显示 ([90f693b](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F90f6","2025-09-29T21:57:09",{"id":189,"version":190,"summary_zh":191,"released_at":192},109103,"v1.0.0","## 1.0.0 (2025-09-27)\n\n\n### 功能特性\n\n* 添加了触发\u002F清除配置项 ([55beb96](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F55beb9626bcbe7277d8aee15aca075e6befad138))\n* **配置:** 通过 Lsp 事件配置 Copilot。无需再使用 `vim.lsp.config` 来实现这一点 ([3fe1f3d](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F3fe1f3da260f870cd0e93b5ecc02a4140cdedc4d))\n* **diff:** 更好的内联差异显示 ([23ca2c6](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F23ca2c6b89ccad93ed3a1aa9c1f559fcc8ed0df2))\n* **diff:** 差异配置选项 ([ac5f9b8](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fac5f9b844fc998360fba7b8458517c8db8ca06aa))\n* **diff:** 差异选项 ([d606531](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fd606531f617f1346551e1f840c6af03300d5cfb9))\n* **diff:** 差异重构 ([ef2884e](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fef2884e513f45cca69e99fb3d39cca54e4bc8cae))\n* **健康检查:** 添加了健康检查功能 ([1f72350](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F1f7235019511b04c4482d870966f2261955a1654))\n* 初始提交 ([9464193](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F94641937514c21c657128e76f474c03bd971ba58))\n* **nes:** 应用后跳转到文本编辑的末尾 ([77ab4b2](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F77ab4b2815bb65e462155ba11c79e62477a1feee))\n* **treesitter.slice:** 允许为 nil ([0bb097e](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F0bb097ec52b88f2b67ea91ccef472709f72d8761))\n* **treesitter:** 更新了首尾及行尾空白的高亮组 ([6cf8067](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F6cf8067fdb7aa4721d16fceade93936a37d42c37))\n* **ui:** 可选的符号标记 ([59abe52](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F59abe526852fd3e56532452dfa49793b4d5e1b8b))\n* **util:** split_words \u002F split_chars ([5335ad9](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F5335ad94baca9463dc02a6c767bda057dcf99992))\n\n\n### 错误修复\n\n* **配置:** 将 result_type 移至 diff 部分 ([489834c](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F489834c0a7d58110b008043f2215369a66a90328))\n* **diff:** 差异修复 ([c816758](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002Fc816758ae0f5698fc682c372313daa1cbefd2a2f))\n* 偏移编码问题 ([11b38ae](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F11b38ae68f0557c15e082d93c43e8eca40686fac))\n* **状态:** 在 Copilot 出现错误或警告时发出通知 ([765c8e3](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F765c8e3afe6b9c171403666171f03d983274df74))\n* **ui:** 每个补丁块只显示一个符号标记 ([5a16ea8](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim\u002Fcommit\u002F5a16ea84e983a4d5c6edaaa1a6662db2d138bf82))","2025-09-27T16:41:40"]