Files
MyGoNavi/docs/需求追踪/需求进度追踪-JVM缓存可视化编辑-20260422.md
Syngnat 6f14e827ab feat(jvm): 完成资源治理与诊断增强
- 新增 JMX/Endpoint/Agent 三种 JVM 连接模式与配置归一化链路
- 支持资源浏览、变更预览、写入应用、审计记录与只读约束
- 接入 AI 结构化写入计划与诊断计划回填能力
- 新增 Agent Bridge、Arthas Tunnel、JMX Helper 诊断传输实现
- 增加诊断控制台、命令模板、输出历史与自动补全交互
- 补齐前后端契约、运行夹具与 JVM 相关回归测试
2026-04-24 16:45:34 +08:00

17 KiB
Raw Blame History

需求进度追踪 - 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 1JVM 共享契约与配置归一化
    • 已完成 Task 2Provider 注册、连接测试与能力探测 API
    • 已完成 Task 3JVM 连接表单、图标与展示文案接入
    • 已完成 Task 4只读资源浏览与 JVM Tab
    • 已完成 Task 5写入预览、Guard 和审计记录
    • 已完成 Task 6AI 结构化变更计划
    • 已完成 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 浏览、attribute set、operation invoke
    • 已完成 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后续推荐方向转为“多接入模式 + 能力协商”
  • 决策 5AI 在 JVM 场景中只负责分析与生成结构化计划,不直接执行运行时写入
  • 决策 6AI 计划应用入口只回填 JVM 预览草稿,后续仍必须经过 JVMPreviewChange、Guard 校验和人工确认
  • 决策 7当前 MVP 中 updateValue 会映射到现有 JVM 变更 contract 的 put,且 payload 仅接受 JSON 对象
  • 决策 8JVM AI 计划必须绑定生成时的 JVM 上下文,只允许投递到匹配的 tabId + connectionId + providerMode + resourcePath
  • 决策 9JMX helper 采用 Java 8 兼容的预编译 runtime jar 内嵌分发,运行时只依赖本地 java
  • 决策 10Agent 模式按“预埋 GoNavi Java Agent + 独立 Agent Base URL 接入”落地,不在当前版本实现动态 attach

7. 验证记录

  • 验证项:
    • GoNavi 驱动代理机制核查
    • GoNavi 现有 Redis/编辑器/UI 复用能力核查
    • JVM Connector 正式设计文档自检
    • JVM Connector 实施计划文档自检
    • Task 1JVM 共享契约与配置归一化
    • Task 2Provider 注册、连接测试与能力探测 API
    • Task 6AI 计划解析、资源定位解析、契约映射与页签上下文隔离
    • Task 7Java Endpoint fixture 真实集成验证
    • Task 7JMX helper 内嵌分发与运行时缓存验证
    • Task 7Agent provider 与真实 Java Agent 集成验证
    • Task 7后端全量测试
    • Task 7前端全量测试
    • Task 7前端生产构建
    • Task 7Wails 生产构建
  • 结果:
    • 已确认存在可复用的连接桥接与编辑器基础设施
    • 已完成正式设计文档落盘与自检,未发现占位词和明显范围冲突
    • 已完成正式实施计划落盘与自检,已补齐共享 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-resource tab 与侧边栏 JVM 模式/资源节点
    • Task 4 已完成规格复审;代码质量复审确认真实 provider 浏览能力仍为后续任务范围,另外已修正 JVM 资源 tab 同名问题
    • 已完成 Task 5后端新增 JVMPreviewChange / JVMApplyChange / JVMListAuditRecords,补齐 Guard、审计 JSONL 落盘与审计读取能力
    • Task 5 已补齐只读拦截、prod 环境确认、provider preview 错误透出、审计写入失败显式回传、连接 allowedModes 约束和局部快照合并保底
    • 前端已完成 JVM 变更草稿区、预览弹窗、执行确认、审计记录页签与按 provider mode 的审计过滤
    • 已完成 Task 6AI 计划解析、资源定位解析、updateValue -> put 显式映射、JSON 对象 payload 约束和上下文绑定单测
    • 已完成 Task 6AI 聊天消息与 JVM 来源页签绑定AI 气泡应用按钮不再依赖点击时的 activeTabId,避免跨 JVM 页签误投递
    • 已完成 Task 7Java Endpoint fixture可真实验证 resources / value / preview / apply 四个 endpoint contract
    • go test ./internal/jvm -run 'TestHTTPProvider' -count=1 通过
    • 已完成 Task 7JMX helper 改为预编译 jar 内嵌分发,并补齐 classpath 覆盖与缓存落盘单测
    • go test ./internal/jvm -run 'TestEnsureJMXHelperRuntime|TestJMXProvider' -count=1 通过
    • 已完成 Task 7Agent 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 files259 tests
    • cd frontend && npm run build 通过;构建中存在既有 chunk size / dynamic import 警告,但未阻塞产物生成
    • wails build -clean 通过,成功生成 macOS 应用包
    • 已完成 JVM 收口优化:模式能力探测现在按当前 mode 做业务化错误翻译,避免概览页继续回显 non-JRMP serverbaseURL 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.go
    • internal/db/database.go
    • frontend/src/components/RedisViewer.tsx
    • frontend/src/components/RedisCommandEditor.tsx
    • frontend/src/components/QueryEditor.tsx
    • docs/superpowers/specs/2026-04-22-jvm-cache-visual-editing-design.md
    • docs/superpowers/plans/2026-04-22-jvm-connector-mvp.md
    • internal/connection/types.go
    • internal/jvm/types.go
    • internal/jvm/config.go
    • internal/jvm/config_test.go
    • frontend/src/types.ts
    • frontend/src/utils/jvmConnectionConfig.ts
    • frontend/src/utils/jvmConnectionConfig.test.ts
    • go test ./internal/jvm -count=1
    • go test ./...
    • cd frontend && npm test -- src/utils/jvmConnectionConfig.test.ts
    • cd frontend && npm test -- --run
    • cd frontend && npm run build
    • internal/jvm/provider.go
    • internal/jvm/jmx_provider.go
    • internal/jvm/http_provider.go
    • internal/jvm/http_provider_test.go
    • internal/jvm/jmx_helper.go
    • internal/jvm/jmx_helper_test.go
    • internal/jvm/provider_contract_test.go
    • internal/jvm/jmxhelper_assets/jmx-helper-runtime.jar
    • internal/jvm/jmxhelper_assets/README.md
    • internal/jvm/testdata/endpointfixture/src/com/gonavi/fixture/EndpointTestServer.java
    • internal/jvm/testdata/endpointfixture/src/com/gonavi/fixture/MiniJson.java
    • tools/jmx-helper/src/com/gonavi/jmxhelper/JmxHelperMain.java
    • internal/app/methods_jvm.go
    • internal/app/methods_jvm_test.go
    • frontend/wailsjs/go/app/App.d.ts
    • frontend/wailsjs/go/app/App.js
    • frontend/wailsjs/go/models.ts
    • go test ./internal/app -run 'Test(TestJVMConnection|JVMProbeCapabilities)' -count=1
    • go test ./internal/jvm ./internal/app -count=1
    • wails build -clean
    • frontend/src/components/DatabaseIcons.tsx
    • frontend/src/components/ConnectionModal.tsx
    • frontend/src/utils/jvmRuntimePresentation.ts
    • frontend/src/utils/jvmRuntimePresentation.test.ts
    • frontend/src/utils/jvmConnectionConfig.ts
    • frontend/src/utils/jvmConnectionConfig.test.ts
    • cd frontend && npm test -- src/utils/jvmRuntimePresentation.test.ts
    • cd frontend && npm test -- src/utils/jvmConnectionConfig.test.ts
    • cd frontend && npm run build
    • internal/app/methods_jvm.go
    • internal/app/methods_jvm_test.go
    • frontend/src/components/Sidebar.tsx
    • frontend/src/components/TabManager.tsx
    • frontend/src/components/JVMOverview.tsx
    • frontend/src/components/JVMResourceBrowser.tsx
    • frontend/src/components/jvm/JVMModeBadge.tsx
    • frontend/src/store.ts
    • frontend/src/types.ts
    • go test ./internal/app -run 'TestJVM(ListResources|GetValue)' -count=1
    • go test ./internal/app -run 'TestJVMProbeCapabilities|TestTestJVMConnection' -count=1
    • cd frontend && npm test -- src/utils/jvmRuntimePresentation.test.ts
    • cd frontend && npm run build
    • internal/jvm/guard.go
    • internal/jvm/guard_test.go
    • internal/jvm/audit_store.go
    • internal/jvm/audit_store_test.go
    • internal/app/methods_jvm.go
    • internal/app/methods_jvm_test.go
    • frontend/src/components/JVMAuditViewer.tsx
    • frontend/src/components/jvm/JVMChangePreviewModal.tsx
    • go test ./internal/jvm ./internal/app -run 'TestPreviewChangeBlocksReadOnlyConnection|TestPreviewChangeReturnsProviderPreviewErrorWhenWriteAllowed|TestPreviewChangeMarksProdWritesAsConfirmationRequired|TestPreviewChangeMergesProviderSnapshotsWithoutDroppingDefaults|TestJVMApplyChangeReturnsProviderPayload|TestJVMPreviewChangeRejectsModeOutsideAllowedModes|TestJVMListAuditRecordsReturnsLatestRecords|TestJVMApplyChangeSurfacesAuditWriteFailure' -count=1
    • go test ./internal/jvm ./internal/app -count=1
    • cd frontend && npm run build
    • frontend/src/utils/jvmAiPlan.ts
    • frontend/src/utils/jvmAiPlan.test.ts
    • frontend/src/components/AIChatPanel.tsx
    • frontend/src/components/ai/AIMessageBubble.tsx
    • frontend/src/components/JVMResourceBrowser.tsx
    • frontend/src/types.ts
    • cd frontend && npm test -- --run src/utils/jvmAiPlan.test.ts
    • go test ./... -count=1
    • go test ./internal/jvm -run 'TestHTTPProvider' -count=1
    • go test ./internal/jvm -run 'TestEnsureJMXHelperRuntime|TestJMXProvider' -count=1
    • cd frontend && npm test -- --run src/components/JVMResourceBrowser.layout.test.tsx
    • cd frontend && npm test -- --run src/utils/jvmResourcePresentation.test.ts
    • cd frontend && npm test -- --run
    • wails build -clean

8. 下一步

  • 下一步行动:由用户按真实 JVM / endpoint 场景执行验收验证;若验收通过,再决定是否提交、推送或继续扩展高级类型写入
  • 负责人Codex