ARTICLE DETAIL

资讯详情

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

Kilo JetBrains 插件 Context 设置页实现:基于共享 kilo.json 的压缩与文件监视配置 UI

Kilo JetBrains 插件 Context 设置页实现:基于共享 kilo.json 的压缩与文件监视配置 UI Kilo JetBrains 插件 Context 设置页实现基于共享 kilo.json 的压缩与文件监视配置 UI【免费下载链接】kilocodeKilo is the all-in-one agentic engineering platform. Build, ship, and iterate faster with the most popular open source coding agent.项目地址: https://gitcode.com/GitHub_Trending/ki/kilocode导读本文完整讲解 Kilo 开源仓库中 JetBrains 插件新增Context 设置页Settings - Tools - Kilo Code - Context的实现方案。该页面围绕共享配置kilo.json中的compaction自动压缩与watcher文件监视忽略两组键为 JetBrains 端补齐与 VS Code 对齐的 UI 入口。读完本文你将掌握Context 四个配置项在共享 DTO、后端 CLI 解析器、前端草稿状态与 Swing 设置页之间的完整数据流以及显式null清空、布尔false序列化、字符串数组编辑等易错细节的处理方式。一、背景JetBrains ↔ VS Code 设置对齐中的“轻松赢项”Kilo 的双端VS Code 与 JetBrains客户端都通过 CLI 编辑同一份共享kilo.json。这意味着只要某项设置的行为完全由 CLI 承担JetBrains 端就只需要一个写配置键的 UI 行即可无需改动 CLI也无需新增运行时特性。源码层面这一思路完整记录在 docs/jetbrains-vscode-settings-parity.md 中其实现三件套是使用既有settings/base/原语BaseSettingsUi、SettingsRow、SettingsToggle、SettingsListPanel新增一个Configurable页面并在 kilo.jetbrains.frontend.xml 注册扩展 KiloCliDataParser.kt 中buildConfigPatch的键白名单此前仅支持model、small_model、subagent_model、subagent_variant、default_agent五个字符串键并补充布尔/数字的 JSON 序列化能力在KiloBundle.properties中补充本地化文案。Context 页属于 parity 文档中的Tier 1真正轻松档位CLI 已完成所有工作JetBrains 只需加 UI 与配置键。parity 文档同时划清了边界——索引indexing、沙箱sandboxing等“隐含启用新特性”的项不属于 easy winsnapshot检查点按建议放独立的 Checkpoints 页本页也不包含 VS Code Context 标签页中的 memory/indexing 控件因为 JetBrains 尚无对应的 memory/indexing 设置服务。二、目标与范围四个配置项本计划在Settings - Tools - Kilo Code - Context下提供四个设置项设置项配置键类型自动压缩 Auto-compactioncompaction.autoboolean压缩阈值百分比 Compaction threshold percentcompaction.threshold_percentnumber 或 null压缩时剪枝 Prune on compactioncompaction.pruneboolean文件监视忽略模式 Watcher ignore patternswatcher.ignorestring array设计约束明确首次实现只走全局配置写路径复用既有 app 级设置写通道不引入项目级配置不为非字符串值重载ConfigPatchDto.values而是新增类型化 DTO 字段watcher.ignore使用共享列表原语而不是自造增删控件。三、Part A共享 DTO——类型化读取与补丁配置文件KiloAppStateDto.kt。该文件当前已包含计划中定义的读取与补丁 DTOConfigDto已在 60-74 行接入watcher/compaction字段。读取侧 DTOSerializable data class WatcherConfigDto( val ignore: ListString emptyList(), ) Serializable data class CompactionConfigDto( val auto: Boolean? null, val threshold_percent: Double? null, val prune: Boolean? null, )补丁侧 DTOConfigPatchDto中对应字段为watcher: WatcherPatchDto? null、compaction: CompactionPatchDto? nullSerializable data class WatcherPatchDto( val ignore: ListString? null, ) Serializable data class CompactionPatchDto( val clear: ListString emptyList(), val auto: Boolean? null, val threshold_percent: Double? null, val prune: Boolean? null, )这套 DTO 形态背后是四个容易踩坑的语义约定务必理解watcher.ignore null表示不修改watcher.ignore emptyList()表示显式保存为空列表删除最后一个模式时依赖此语义compaction.threshold_percent null单独出现表示不修改compaction.clear listOf(threshold_percent)才表示真正清空——因为Double?无法区分“未提供”与“显式 null”所以必须用独立的clear列表来发射 JSONthreshold_percent: null布尔false必须被序列化绝不能把false当作“未提供”而省略。四、Part B后端解析器与序列化器配置文件KiloCliDataParser.kt。4.1 解析 parseConfigparseConfig(raw)读取GET /global/config响应现已解析watcher.ignore、compaction.auto、compaction.threshold_percent、compaction.prune。私有助手沿用既有风格见 566-582 行字符串用str(...)布尔用flagOrNull(...)并包一层runCatching容错数字用num(...)字符串数组用arr()?.mapNotNull { it.jsonPrimitive.contentOrNull }。parseConfig整体包在runCatching中解析失败回退ConfigDto()保证坏配置不会阻塞插件启动。4.2 序列化 buildConfigPatchbuildConfigPatch(patch)生成PATCH /global/config请求体。Context 相关补丁的期望输出{ watcher: { ignore: [**/node_modules/**] }, compaction: { auto: true, threshold_percent: 80, prune: false } }显式清空阈值时的输出{ compaction: { threshold_percent: null } }实现要点compaction块先按clear列表逐项写入JsonNull再写入非空的新值watcher块在ignore ! null时整体发射数组。既有的values白名单继续只服务字符串模型键model等五个Context 值不经过values通道。4.3 写路径调用链Context 页的保存沿用的是既有全局配置写路径从源码结构可以梳理出完整调用链前端KiloAppService.updateConfigAsync(...)见 ContextSettingsUi.kt 第 79 行调用RPCKiloAppRpcApi.updateConfig(patch: ConfigPatchDto)后端KiloBackendAppService.updateConfig(...)HTTPPATCH /global/config随后GET /global/config刷新回读。五、Part C前端状态模型——字符串化阈值草稿状态文件ContextSettingsState.kt。internal data class ContextDraft( val auto: Boolean false, val threshold: String , val prune: Boolean false, val editor: Boolean KiloPluginSettings.getAutoEditorContext(), val ignore: ListString emptyList(), )关键设计阈值在草稿中保持字符串这样 UI 可以承载空串/非法中间输入而不丢失用户文本只在构建补丁时才转换为数字。实际实现比计划多了一个本地editor字段自动编辑器上下文它走KiloPluginSettings本地持久化而非全局配置。核心函数均已实现contextDraft(config: ConfigDto?): ContextDraft——从回读配置生成基线草稿formatThreshold会把整数 80.0 格式化为80patch(from, to): ConfigPatchDto?——只发射变化字段阈值非法时返回nullsavedMatches(base, draft): Boolean——通过normalizeThreshold归一化后比较thresholdStatus(value)——空串合法非数字、非有限数或超出0..100判为INVALIDcompactionPatch(from, to)——内部按字段差异逐个生成补丁。补丁行为约定计划文档要求、实现已覆盖用户关闭自动压缩 → 发射CompactionPatchDto(auto false)用户关闭剪枝 → 发射CompactionPatchDto(prune false)输入合法的非空数字 → 发射CompactionPatchDto(threshold_percent 80.0)清空既有阈值 → 发射CompactionPatchDto(clear listOf(threshold_percent))删除最后一个忽略模式 → 发射WatcherPatchDto(ignore emptyList())所有字段与基线一致 → 页面不产生任何变更。六、Part D前端 UI 页面6.1 Configurable 注册类ContextConfigurable.kt 镜像ModelsConfigurable继承DraftReadyConfigurableJComponentID ai.kilocode.jetbrains.settings.contextgetDisplayName()返回KiloBundle.message(settings.context.displayName)create(cs)返回ContextSettingsUi(cs)。6.2 设置 UIContextSettingsUi.kt 继承BaseSettingsUiContextSettingsContent, ContextDraft, ConfigPatchDto, KiloAppStateDto, Unit职责映射save(change, done)→app.updateConfigAsync(change, done)成功回调里同步写本地editor设置base(result)/draft(state)→contextDraft(state.config)saved(base, draft)→savedMatches(...)pendingText()/failedText()→ 对应settings.context.save.pending/settings.context.save.failedloadWorkspace(root)/applyWorkspace(result)→Unitmodels(state)→Unit本页不涉及工作区与模型状态syncContent()→ 根据 app 状态READY与saving标志更新控件可用性、字段值、保存进度遮罩与校验提示。页面布局Compaction 分区自动压缩开关、阈值数字行、剪枝开关 Watcher ignore patterns 分区列表编辑器。控件选择遵循 AGENTS.md 的 UI 规则布尔用SettingsToggle阈值用JBTextField配合DocumentFilter限制输入忽略模式列表用JBListCollectionListModelScrollingUtil.installActions全部是 IntelliJ 平台组件而非裸 Swing。页面在 app 状态为 ready 且无保存挂起时可编辑保存期间禁用控件。6.3 校验规则空阈值合法含义是“清空/复位该配置值”若与基线不同则发射 clear非数字阈值非法阻止apply()发送补丁patch()返回null建议接受范围0..100与 CLI 行为保持一致校验信息通过既有设置消息机制呈现不引入临时标签。七、Part E设置注册与根页导航7.1 XML 注册kilo.jetbrains.frontend.xml 中已注册子配置项76-80 行applicationConfigurable parentIdai.kilocode.jetbrains.settings idai.kilocode.jetbrains.settings.context groupWeight-1 instanceai.kilocode.client.settings.context.ContextConfigurable bundlemessages.KiloBundle keysettings.context.displayName/计划建议通过权重稳定顺序User Profile5、Models4、Context3、Providers2、Agent Behavior1实际落地的 XML 以既有各页的groupWeight为准Models4、Providers2、Agent Behavior1Context 取 -1位于两者之间且紧随 Providers 之后。若需调整显示顺序改groupWeight即可。7.2 根页导航KiloSettingsConfigurable.kt 在根页 Models 与 Providers 之间新增指向ContextConfigurable.ID的ActionLink文案使用settings.context.displayName。KiloSettingsSelection.kt无需改动因为子页面 ID 已共享根前缀ai.kilocode.jetbrains.settings。八、Part F本地化字符串基础文案位于 KiloBundle.propertiessettings.context.displayNameContext settings.context.descriptionConfigure compaction and file-watcher context behavior. settings.context.save.pendingSaving context settings... settings.context.save.failedFailed to save context settings settings.context.compaction.titleCompaction settings.context.compaction.descriptionControl when Kilo summarizes long sessions to reduce context usage. settings.context.compaction.auto.titleAuto-compaction settings.context.compaction.auto.descriptionAutomatically compact long conversations before they exceed the model context window. settings.context.compaction.threshold.titleCompaction threshold settings.context.compaction.threshold.descriptionPercent of the context window to use before auto-compaction starts. Leave blank to use the default. settings.context.compaction.threshold.invalidEnter a number from 0 to 100, or leave the field blank. settings.context.compaction.prune.titlePrune on compaction settings.context.compaction.prune.descriptionDrop older raw conversation details after compaction to keep the session context smaller. settings.context.watcher.titleWatcher ignore patterns settings.context.watcher.descriptionGlob patterns Kilo should ignore when watching repository file changes. settings.context.watcher.addAdd pattern settings.context.watcher.emptyNo ignore patterns configured. settings.context.watcher.placeholdere.g. **/dist/** settings.context.watcher.removeRemove {0}当前仓库中这些键已同步复制进KiloBundle_zh_CN、KiloBundle_ja、KiloBundle_de等多语言 bundle资源包检查要求每键在每语言包存在时先复制英文值翻译工作留给后续 i18n 批次。用户可见字符串一律走*.properties符合 AGENTS.md 的 UI 规则。九、Part G测试覆盖计划与实现均强调“每个写设置的页面都需要 fake-RPC 前端测试 MockCliServer 后端断言”这一仓库测试模式见 packages/kilo-jetbrains/AGENTS.md 的 Settings Test Coverage Pattern。9.1 前端状态测试ContextSettingsStateTest.kt 覆盖草稿正确读取ConfigDto.watcher/compaction未变更草稿不发射补丁布尔变更正确发射false/true设置阈值发射threshold_percent清空阈值发射clear listOf(threshold_percent)忽略列表增删发射完整新列表含空列表非法阈值在保存前被拒绝。9.2 前端 UI 测试ContextSettingsUiTest.kt 以ModelsSettingsUiTest为模板BasePlatformTestCase 真实 EDT FakeAppRpcApiKiloAppServiceflushUntil助手断言交互后的rpc.configPatches、保存挂起期间控件禁用、保存失败后页面保持 modified 并显示settings.context.save.failed。配套 FakeAppRpcApi.kt 需要应用patch.watcher/patch.compaction到假配置状态保留显式空列表与布尔false并按compaction.clear将对应字段置null。9.3 后端解析器与 app 服务测试KiloCliDataParserTest.kt 增加精确 JSON 断言parseConfig读取 watcher/compaction 字段buildConfigPatch发射 ignore 数组、autofalse、prunefalse、数字threshold_percent、以及clear含该字段时的显式threshold_percent: null。KiloBackendAppServiceTest.kt 则调用updateConfig(ConfigPatchDto(watcher ..., compaction ...))断言MockCliServer.lastConfigPatchBody与期望嵌套 JSON 完全一致且回读的ConfigDto包含已保存的 Context 值。9.4 根页测试KiloSettingsConfigurableTest.kt 断言ContextConfigurable.ID ai.kilocode.jetbrains.settings.context、根页包含 Context 链接、链接顺序与 XML 顺序一致。十、构建验证与手动验收在packages/kilo-jetbrains/下运行./gradlew typecheck ./gradlew test迭代期间的聚焦检查./gradlew :shared:test --tests *ContextSettingsStateTest ./gradlew :frontend:test --tests *ContextSettingsUiTest ./gradlew :backend:test --tests *KiloCliDataParserTest ./gradlew :backend:test --tests *KiloBackendAppServiceTest手动验收流程在packages/kilo-jetbrains/下运行./gradlew runIde启动沙箱 IDE打开Settings - Tools - Kilo Code - Context切换自动压缩与剪枝开关设置阈值数字 → Apply → 重开设置页确认持久化清空阈值 → Apply → 重开设置页确认复位增删 watcher 忽略模式 → Apply → 重开设置页确认列表持久化必要时通过既有Open: global ...动作直接检查全局 Kilo 配置文件内容。十一、风险与后续事项全局 vs 项目级配置本方案复用全局配置写路径若未来要做项目级 Context 设置需要新增 workspace 配置 RPC 管道。阈值 null 语义必须实现显式 clear 处理否则清空字段会静默无效。字符串数组 UI复用共享列表原语即使需要小适配器类型避免一次性列表控件。VS Code memory/indexing 对齐延迟处理因为它不是纯配置且已被 easy-win 标准排除。Checkpoints 页snapshot单独实现除非产品明确要求与 Context 合并。Changeset作为用户可见的 JetBrains 设置特性落地时需按仓库发布指引为kilo-code/JetBrains 添加补丁 changeset。小结Context 设置页是“CLI 承担逻辑、客户端只补 UI”这一 parity 策略的典型落地共享 DTO 提供类型化读写、后端解析器扩展布尔/数字/数组序列化、前端草稿状态用字符串兜住阈值输入、UI 复用BaseSettingsUi与平台组件测试沿用 fake-RPC MockCliServer 双端断言模式。对希望为 Kilo JetBrains 插件新增纯配置类设置页的开发者.kilo/plans/jetbrains-context-settings-page.md 与上述实现文件构成了可直接照搬的七步参考流程。【免费下载链接】kilocodeKilo is the all-in-one agentic engineering platform. Build, ship, and iterate faster with the most popular open source coding agent.项目地址: https://gitcode.com/GitHub_Trending/ki/kilocode创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表