mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-05-06 20:03:05 +08:00
- 新增 JMX/Endpoint/Agent 三种 JVM 连接模式与配置归一化链路 - 支持资源浏览、变更预览、写入应用、审计记录与只读约束 - 接入 AI 结构化写入计划与诊断计划回填能力 - 新增 Agent Bridge、Arthas Tunnel、JMX Helper 诊断传输实现 - 增加诊断控制台、命令模板、输出历史与自动补全交互 - 补齐前后端契约、运行夹具与 JVM 相关回归测试
17 KiB
17 KiB
需求进度追踪 - JVM缓存可视化编辑
1. 需求摘要
- 需求名称:JVM缓存可视化编辑
- 提出日期:2026-04-22
- 负责人:Codex
- 目标:完成 GoNavi 连接 Java JVM、可视化查看并修改 JVM 内缓存/对象值的通用能力交付,降低“改缓存只能写接口或重启应用”的运维与排障成本
- 非目标:不承诺覆盖所有 Java 框架/所有对象类型,不绕过目标应用现有安全控制,不在首期开放脚本式任意表达式执行
2. 范围与验收
- 范围:
- 交付 JVM 共享契约、连接配置、provider 注册、连接测试与能力探测
- 交付 Endpoint / JMX / Agent 三种接入模式及其资源浏览、读值、预览、执行链路
- 交付 JVM 资源页、预览弹窗、审计查看、AI 草稿生成与回填能力
- 交付 Guard、审计、来源标记、真实集成测试与构建验证
- 验收标准:
- 可以在 GoNavi 中新增 JVM 连接并完成连接测试
- 可以按资源树浏览 JVM 对象并查看结构化快照
- 可以对支持写入的资源执行预览和确认写入,且带 Guard 与审计
- 可以通过 AI 生成结构化修改草稿,但不会跳过人工确认直接执行
- 可以通过真实 JMX 与真实 HTTP contract 完成端到端验证,并通过前后端构建回归
- 依赖与约束:
- 需复用 GoNavi 当前 Wails + React + driver-agent 架构
- 新能力不得破坏现有数据库/Redis 工作流
- 高风险写操作必须具备明确鉴权、审计与回滚思路
- JMX 模式要求 GoNavi 运行机器本地可用
java可执行文件
3. 里程碑与进度
- 阶段 1(需求澄清):完成
- 阶段 2(影响分析):完成
- 阶段 3(方案设计):完成(已形成正式设计文档)
- 阶段 4(实施计划):完成(已形成正式实施计划)
- 阶段 5(实现与自检):完成(Task 1 至 Task 7 已完成,代码与构建回归通过)
- 阶段 6(评审与交付):完成(已完成契约复核、上下文隔离修正、文档回填与交付检查)
- 阶段 7(发布与观察):未开始
4. 变更清单
- 已完成:
- 确认 GoNavi 当前存在统一驱动接口与可选 driver-agent 机制
- 确认前端已有 Redis 结构化浏览、命令编辑器、Monaco 编辑器、DataGrid 编辑能力可复用
- 初步判断 JVM 运行时对象编辑不适合直接复用 SQL/Database 抽象,需新增非数据库协议层
- 用户已确认目标方向为“通用型 JVM 接入”
- 用户已确认升级到完整模式,开始高风险架构评估
- 用户明确目标 Java 服务大概率不允许
-javaagent或运行时动态 attach - 已形成 JVM 缓存可视化编辑正式设计文档
- 已形成 JVM Connector MVP 正式实施计划文档
- 已完成 Task 1:JVM 共享契约与配置归一化
- 已完成 Task 2:Provider 注册、连接测试与能力探测 API
- 已完成 Task 3:JVM 连接表单、图标与展示文案接入
- 已完成 Task 4:只读资源浏览与 JVM Tab
- 已完成 Task 5:写入预览、Guard 和审计记录
- 已完成 Task 6:AI 结构化变更计划
- 已完成 Task 7:全量回归、文档回填与交付检查
- 已完成 JVM AI 计划解析、资源定位解析、AI 计划到当前 JVM 变更草稿的显式映射,避免把
payload.format/value包装层直接透传到现有 JVM 写入契约 - 已完成 AI 聊天面板 JVM 上下文注入、AI 气泡“应用到 JVM 预览”入口以及 JVM 资源页草稿回填闭环
- 已完成 JVM AI 计划来源上下文绑定:消息现在绑定生成时的
tabId + connectionId + providerMode + resourcePath,避免切换 JVM 页签后误投递到当前激活页 - 已完成 Endpoint provider 真实 HTTP contract 与补测,支持资源浏览、读值、预览和执行
- 已完成可手工启动的 Java Endpoint fixture 与真实集成补测,可直接验证 Endpoint 模式端到端行为
- 已完成 JMX provider 真实 helper 接入与补测,支持
domain -> mbean -> attribute/operation浏览、attributeset、operationinvoke - 已完成 JMX helper 预编译 runtime jar 内嵌分发,运行时不再依赖仓库源码目录,也不再要求本地
javac - 已完成 JVM 快照动作提示与 payload 模板回填,前端可直接根据
supportedActions生成草稿 - 已完成 AI 参与来源写入 JVM 审计记录,审计页可区分“手工”与“AI 辅助”
- 已完成 Agent provider、Agent 连接表单与概览展示,支持通过独立 Agent Base URL 接入 GoNavi Java Agent
- 已完成真实 Java Agent fixture 与集成验证,可通过
-javaagent方式真实验证 Agent 模式资源浏览、预览与执行 - 已完成 JVM 收口优化:Endpoint 能力探测遵循只读配置,概览页能力矩阵补齐模式能力探测与多行错误展示,能力探测失败与风险/结果状态文案统一收口为中文业务语义
- 待处理:
- 无阻塞性交付项;后续仅保留复杂对象参数、
CompositeData/TabularData等高级类型写入扩展作为增强项
- 无阻塞性交付项;后续仅保留复杂对象参数、
5. 风险与阻塞
- 风险:
- 直接修改 JVM 内对象属于高风险运行时操作,误改可能造成业务状态污染
- 不同缓存框架(Caffeine/Ehcache/Guava/自研 Map)缺少统一标准协议
- 若依赖 attach agent 或表达式执行,需严格控制安全边界与可观测性
- 若目标 JVM 不允许预埋或动态注入 Agent,则“通用型”能力边界会明显收缩
- 多接入模式会带来能力不一致问题,UI 与权限模型必须显式展示“当前模式支持什么/不支持什么”
- 当前 AI 能力边界仍是“分析 + 生成结构化计划 + 回填预览草稿”,不直接执行 JVM 写入,真实执行仍取决于 Guard、人工确认和 provider 能力
- 当前 AI 计划若只提供
namespace + key,仍更适合 endpoint/cache 风格资源;JMX 复杂 target 仍建议优先使用resourcePath - JMX helper 已改为内嵌 jar 分发,但操作者机器仍需本地存在可用
java - Agent 模式要求目标 Java 服务显式以
-javaagent方式启动 GoNavi Java Agent,并额外暴露管理端口 - JMX operation preview 仅做参数/签名校验和预览快照,不预测真实副作用
- JMX 参数转换当前覆盖基础类型、
ObjectName和部分数组;复杂对象写入仍是后续扩展项 - 历史旧 AI 消息不包含 JVM 来源上下文,若需要应用到预览,需在目标 JVM 资源页重新生成计划
- 阻塞:
- 当前开发收口阶段无新增阻塞
- 缓解措施:
- 优先收敛到标准接入面(JMX / Spring Actuator / Java Agent 三选一)
- 首期只支持白名单对象类型与受控写操作
- 要求变更审计、预览、确认与失败回滚路径
- 在交付说明中明确“AI 只生成草稿,不直接执行 JVM 写入”
- JMX helper 改为内嵌 runtime jar,默认写入用户缓存目录;必要时允许通过
GONAVI_JMX_HELPER_CLASSPATH覆盖 classpath - 对复杂参数调用保持白名单和人工确认,不开放脚本式自由执行
6. 决策记录
- 决策 1:先做可行性评估与方案设计,不直接进入实现
- 决策 2:默认优先复用 GoNavi 现有 driver-agent 与前端编辑器能力,避免侵入式重构主流程
- 决策 3:已按完整模式推进,后续方案将优先评估通用 Agent 路径是否成立
- 决策 4:由于目标服务大概率不允许 agent/attach,后续推荐方向转为“多接入模式 + 能力协商”
- 决策 5:AI 在 JVM 场景中只负责分析与生成结构化计划,不直接执行运行时写入
- 决策 6:AI 计划应用入口只回填 JVM 预览草稿,后续仍必须经过
JVMPreviewChange、Guard 校验和人工确认 - 决策 7:当前 MVP 中
updateValue会映射到现有 JVM 变更 contract 的put,且 payload 仅接受 JSON 对象 - 决策 8:JVM AI 计划必须绑定生成时的 JVM 上下文,只允许投递到匹配的
tabId + connectionId + providerMode + resourcePath - 决策 9:JMX helper 采用 Java 8 兼容的预编译 runtime jar 内嵌分发,运行时只依赖本地
java - 决策 10:Agent 模式按“预埋 GoNavi Java Agent + 独立 Agent Base URL 接入”落地,不在当前版本实现动态 attach
7. 验证记录
- 验证项:
- GoNavi 驱动代理机制核查
- GoNavi 现有 Redis/编辑器/UI 复用能力核查
- JVM Connector 正式设计文档自检
- JVM Connector 实施计划文档自检
- Task 1:JVM 共享契约与配置归一化
- Task 2:Provider 注册、连接测试与能力探测 API
- Task 6:AI 计划解析、资源定位解析、契约映射与页签上下文隔离
- Task 7:Java Endpoint fixture 真实集成验证
- Task 7:JMX helper 内嵌分发与运行时缓存验证
- Task 7:Agent provider 与真实 Java Agent 集成验证
- Task 7:后端全量测试
- Task 7:前端全量测试
- Task 7:前端生产构建
- Task 7:Wails 生产构建
- 结果:
- 已确认存在可复用的连接桥接与编辑器基础设施
- 已完成正式设计文档落盘与自检,未发现占位词和明显范围冲突
- 已完成正式实施计划落盘与自检,已补齐共享 DTO、provider factory 和审计落盘等关键实现细节
- 已完成 JVM 连接共享契约、默认只读/默认 JMX 归一化、前端配置收敛与补测
- Task 1 已完成规格审查与代码质量审查,结论均通过
- 已完成 JVM Provider 工厂、JMX/Endpoint provider 骨架、App 层连接测试与能力探测 API
- Task 2 已完成规格审查与代码质量审查,结论均通过
- 已完成 JVM 连接类型卡片、最小表单字段、连接测试分发与展示文案接入
- Task 3 已完成规格审查与代码质量审查;过程中修复了 JVM 标题文案偏差、模式选项暴露范围、编辑态模式静默降级和 endpoint timeout 失真问题
- 已完成 JVM 只读资源浏览链路:后端新增
JVMListResources/JVMGetValue,前端新增jvm-overview/jvm-resourcetab 与侧边栏 JVM 模式/资源节点 - Task 4 已完成规格复审;代码质量复审确认真实 provider 浏览能力仍为后续任务范围,另外已修正 JVM 资源 tab 同名问题
- 已完成 Task 5:后端新增
JVMPreviewChange/JVMApplyChange/JVMListAuditRecords,补齐 Guard、审计 JSONL 落盘与审计读取能力 - Task 5 已补齐只读拦截、
prod环境确认、provider preview 错误透出、审计写入失败显式回传、连接allowedModes约束和局部快照合并保底 - 前端已完成 JVM 变更草稿区、预览弹窗、执行确认、审计记录页签与按 provider mode 的审计过滤
- 已完成 Task 6:AI 计划解析、资源定位解析、
updateValue -> put显式映射、JSON 对象 payload 约束和上下文绑定单测 - 已完成 Task 6:AI 聊天消息与 JVM 来源页签绑定,AI 气泡应用按钮不再依赖点击时的
activeTabId,避免跨 JVM 页签误投递 - 已完成 Task 7:Java Endpoint fixture,可真实验证
resources / value / preview / apply四个 endpoint contract go test ./internal/jvm -run 'TestHTTPProvider' -count=1通过- 已完成 Task 7:JMX helper 改为预编译 jar 内嵌分发,并补齐 classpath 覆盖与缓存落盘单测
go test ./internal/jvm -run 'TestEnsureJMXHelperRuntime|TestJMXProvider' -count=1通过- 已完成 Task 7:Agent provider、Java agent fixture 与真实
-javaagent集成测试 go test ./internal/jvm -run 'TestAgentProvider' -count=1通过cd frontend && npm test -- --run src/utils/jvmAiPlan.test.ts通过(11 tests)go test ./... -count=1通过cd frontend && npm test -- --run通过(61 files,259 tests)cd frontend && npm run build通过;构建中存在既有 chunk size / dynamic import 警告,但未阻塞产物生成wails build -clean通过,成功生成 macOS 应用包- 已完成 JVM 收口优化:模式能力探测现在按当前 mode 做业务化错误翻译,避免概览页继续回显
non-JRMP server、baseURL is required这类原始报错 go test ./internal/jvm -run 'TestHTTPProvider' -count=1再次通过(Endpoint 能力探测只读语义回归)go test ./internal/app -run 'Test(TestJVMConnection|JVMProbeCapabilities)' -count=1再次通过(能力探测模式透传与中文错误翻译回归)cd frontend && npm test -- --run src/components/JVMResourceBrowser.layout.test.tsx通过(JVM 资源页布局回归)cd frontend && npm test -- --run src/utils/jvmResourcePresentation.test.ts通过(风险等级、审计结果等本地化展示回归)cd frontend && npm run build再次通过wails build -clean再次通过,成功生成最新可验收桌面包
- 证据(日志/截图/链接):
cmd/optional-driver-agent/main.gointernal/db/database.gofrontend/src/components/RedisViewer.tsxfrontend/src/components/RedisCommandEditor.tsxfrontend/src/components/QueryEditor.tsxdocs/superpowers/specs/2026-04-22-jvm-cache-visual-editing-design.mddocs/superpowers/plans/2026-04-22-jvm-connector-mvp.mdinternal/connection/types.gointernal/jvm/types.gointernal/jvm/config.gointernal/jvm/config_test.gofrontend/src/types.tsfrontend/src/utils/jvmConnectionConfig.tsfrontend/src/utils/jvmConnectionConfig.test.tsgo test ./internal/jvm -count=1go test ./...cd frontend && npm test -- src/utils/jvmConnectionConfig.test.tscd frontend && npm test -- --runcd frontend && npm run buildinternal/jvm/provider.gointernal/jvm/jmx_provider.gointernal/jvm/http_provider.gointernal/jvm/http_provider_test.gointernal/jvm/jmx_helper.gointernal/jvm/jmx_helper_test.gointernal/jvm/provider_contract_test.gointernal/jvm/jmxhelper_assets/jmx-helper-runtime.jarinternal/jvm/jmxhelper_assets/README.mdinternal/jvm/testdata/endpointfixture/src/com/gonavi/fixture/EndpointTestServer.javainternal/jvm/testdata/endpointfixture/src/com/gonavi/fixture/MiniJson.javatools/jmx-helper/src/com/gonavi/jmxhelper/JmxHelperMain.javainternal/app/methods_jvm.gointernal/app/methods_jvm_test.gofrontend/wailsjs/go/app/App.d.tsfrontend/wailsjs/go/app/App.jsfrontend/wailsjs/go/models.tsgo test ./internal/app -run 'Test(TestJVMConnection|JVMProbeCapabilities)' -count=1go test ./internal/jvm ./internal/app -count=1wails build -cleanfrontend/src/components/DatabaseIcons.tsxfrontend/src/components/ConnectionModal.tsxfrontend/src/utils/jvmRuntimePresentation.tsfrontend/src/utils/jvmRuntimePresentation.test.tsfrontend/src/utils/jvmConnectionConfig.tsfrontend/src/utils/jvmConnectionConfig.test.tscd frontend && npm test -- src/utils/jvmRuntimePresentation.test.tscd frontend && npm test -- src/utils/jvmConnectionConfig.test.tscd frontend && npm run buildinternal/app/methods_jvm.gointernal/app/methods_jvm_test.gofrontend/src/components/Sidebar.tsxfrontend/src/components/TabManager.tsxfrontend/src/components/JVMOverview.tsxfrontend/src/components/JVMResourceBrowser.tsxfrontend/src/components/jvm/JVMModeBadge.tsxfrontend/src/store.tsfrontend/src/types.tsgo test ./internal/app -run 'TestJVM(ListResources|GetValue)' -count=1go test ./internal/app -run 'TestJVMProbeCapabilities|TestTestJVMConnection' -count=1cd frontend && npm test -- src/utils/jvmRuntimePresentation.test.tscd frontend && npm run buildinternal/jvm/guard.gointernal/jvm/guard_test.gointernal/jvm/audit_store.gointernal/jvm/audit_store_test.gointernal/app/methods_jvm.gointernal/app/methods_jvm_test.gofrontend/src/components/JVMAuditViewer.tsxfrontend/src/components/jvm/JVMChangePreviewModal.tsxgo test ./internal/jvm ./internal/app -run 'TestPreviewChangeBlocksReadOnlyConnection|TestPreviewChangeReturnsProviderPreviewErrorWhenWriteAllowed|TestPreviewChangeMarksProdWritesAsConfirmationRequired|TestPreviewChangeMergesProviderSnapshotsWithoutDroppingDefaults|TestJVMApplyChangeReturnsProviderPayload|TestJVMPreviewChangeRejectsModeOutsideAllowedModes|TestJVMListAuditRecordsReturnsLatestRecords|TestJVMApplyChangeSurfacesAuditWriteFailure' -count=1go test ./internal/jvm ./internal/app -count=1cd frontend && npm run buildfrontend/src/utils/jvmAiPlan.tsfrontend/src/utils/jvmAiPlan.test.tsfrontend/src/components/AIChatPanel.tsxfrontend/src/components/ai/AIMessageBubble.tsxfrontend/src/components/JVMResourceBrowser.tsxfrontend/src/types.tscd frontend && npm test -- --run src/utils/jvmAiPlan.test.tsgo test ./... -count=1go test ./internal/jvm -run 'TestHTTPProvider' -count=1go test ./internal/jvm -run 'TestEnsureJMXHelperRuntime|TestJMXProvider' -count=1cd frontend && npm test -- --run src/components/JVMResourceBrowser.layout.test.tsxcd frontend && npm test -- --run src/utils/jvmResourcePresentation.test.tscd frontend && npm test -- --runwails build -clean
8. 下一步
- 下一步行动:由用户按真实 JVM / endpoint 场景执行验收验证;若验收通过,再决定是否提交、推送或继续扩展高级类型写入
- 负责人:Codex