Skip to content

Commit e840b53

Browse files
author
SqlRush
committed
Apply LSP diagnostics updates
1 parent 666cfb2 commit e840b53

4 files changed

Lines changed: 51 additions & 2 deletions

File tree

docs/cc-100-roadmap.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1456,7 +1456,7 @@ M7 补充:terminal input parser 和 configurable keybinding name parser 现在
14561456
- Chrome/computer-use/voice/native integrations。
14571457
- enterprise/gated/platform-specific behavior。
14581458

1459-
当前状态:已新增 `advanced` settings gate 地基,覆盖 bridge/LSP/telemetry/Chrome/voice/computer-use/native integrations 的独立 bool 开关解析、settings merge、headless `/config show advanced` 和 `/config search` 审计;`advanced.telemetry=true` 时会在 session 目录写入安全摘要 JSONL 诊断事件,记录事件类型、session/model、tool/progress keys、token/compact/error 摘要,不写入用户/助手正文或工具结果内容;`advanced.lsp=true` 时才向模型暴露只读 `LSPDiagnostics` 工具,用于读取 session-scoped diagnostics snapshot,并支持 file/severity/limit 过滤,底层已能解析 LSP `textDocument/publishDiagnostics` params/notification payload;`advanced.bridge=true` 时会写出 session-scoped bridge manifest,列出 bridge-safe slash/local command 元数据,并提供 command/display/alias 安全解析;未启用时仍不注册或泄露 gated 工具 schema。实际 repl bridge server、session websocket/direct connect、LSP server manager、diagnostic producer、telemetry exporter/tracing、Chrome/voice/computer-use/native runtime 仍未完成。
1459+
当前状态:已新增 `advanced` settings gate 地基,覆盖 bridge/LSP/telemetry/Chrome/voice/computer-use/native integrations 的独立 bool 开关解析、settings merge、headless `/config show advanced` 和 `/config search` 审计;`advanced.telemetry=true` 时会在 session 目录写入安全摘要 JSONL 诊断事件,记录事件类型、session/model、tool/progress keys、token/compact/error 摘要,不写入用户/助手正文或工具结果内容;`advanced.lsp=true` 时才向模型暴露只读 `LSPDiagnostics` 工具,用于读取 session-scoped diagnostics snapshot,并支持 file/severity/limit 过滤,底层已能解析 LSP `textDocument/publishDiagnostics` params/notification payload 并按文件替换 snapshot;`advanced.bridge=true` 时会写出 session-scoped bridge manifest,列出 bridge-safe slash/local command 元数据,并提供 command/display/alias 安全解析;未启用时仍不注册或泄露 gated 工具 schema。实际 repl bridge server、session websocket/direct connect、LSP server manager、diagnostic producer、telemetry exporter/tracing、Chrome/voice/computer-use/native runtime 仍未完成。
14601460

14611461
## Recommended Next Steps
14621462

docs/claude-code-go-rewrite-plan.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,7 @@ test/parity/ # golden tests against TS/official behavior
745745
- 每个 gated feature 独立开关测试。
746746
- 不启用 feature 时二进制行为和可见 schema 不泄露 gated 工具/命令。
747747

748-
- 本轮补充:新增 `advanced` settings gate 地基,覆盖 bridge/LSP/telemetry/Chrome/voice/computer-use/native integrations 的独立 bool 开关解析、settings merge、headless `/config show advanced` 和 `/config search` 审计;`advanced.telemetry=true` 时会在 session 目录写入安全摘要 JSONL 诊断事件,记录事件类型、session/model、tool/progress keys、token/compact/error 摘要,不写入用户/助手正文或工具结果内容;`advanced.lsp=true` 时才向模型暴露只读 `LSPDiagnostics` 工具,用于读取 session-scoped diagnostics snapshot,并支持 file/severity/limit 过滤,底层已能解析 LSP `textDocument/publishDiagnostics` params/notification payload;`advanced.bridge=true` 时会写出 session-scoped bridge manifest,列出 bridge-safe slash/local command 元数据,并提供 command/display/alias 安全解析;未启用时仍不注册或泄露 gated 工具 schema。实际 repl bridge server、session websocket/direct connect、LSP server manager、diagnostic producer、telemetry exporter/tracing、Chrome/voice/computer-use/native runtime 仍未完成。
748+
- 本轮补充:新增 `advanced` settings gate 地基,覆盖 bridge/LSP/telemetry/Chrome/voice/computer-use/native integrations 的独立 bool 开关解析、settings merge、headless `/config show advanced` 和 `/config search` 审计;`advanced.telemetry=true` 时会在 session 目录写入安全摘要 JSONL 诊断事件,记录事件类型、session/model、tool/progress keys、token/compact/error 摘要,不写入用户/助手正文或工具结果内容;`advanced.lsp=true` 时才向模型暴露只读 `LSPDiagnostics` 工具,用于读取 session-scoped diagnostics snapshot,并支持 file/severity/limit 过滤,底层已能解析 LSP `textDocument/publishDiagnostics` params/notification payload 并按文件替换 snapshot;`advanced.bridge=true` 时会写出 session-scoped bridge manifest,列出 bridge-safe slash/local command 元数据,并提供 command/display/alias 安全解析;未启用时仍不注册或泄露 gated 工具 schema。实际 repl bridge server、session websocket/direct connect、LSP server manager、diagnostic producer、telemetry exporter/tracing、Chrome/voice/computer-use/native runtime 仍未完成。
749749

750750
### M12: Parity hardening
751751

internal/lsp/diagnostics.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,26 @@ func DiagnosticsFromPublishDiagnostics(data []byte) ([]Diagnostic, error) {
127127
return NormalizeDiagnostics(out), nil
128128
}
129129

130+
func ApplyDiagnosticsUpdate(existing []Diagnostic, update []Diagnostic) []Diagnostic {
131+
normalizedUpdate := NormalizeDiagnostics(update)
132+
if len(normalizedUpdate) == 0 {
133+
return NormalizeDiagnostics(existing)
134+
}
135+
updatedFiles := map[string]struct{}{}
136+
for _, diagnostic := range normalizedUpdate {
137+
updatedFiles[diagnostic.FilePath] = struct{}{}
138+
}
139+
out := make([]Diagnostic, 0, len(existing)+len(normalizedUpdate))
140+
for _, diagnostic := range NormalizeDiagnostics(existing) {
141+
if _, ok := updatedFiles[diagnostic.FilePath]; ok {
142+
continue
143+
}
144+
out = append(out, diagnostic)
145+
}
146+
out = append(out, normalizedUpdate...)
147+
return NormalizeDiagnostics(out)
148+
}
149+
130150
func URIToPath(raw string) string {
131151
raw = strings.TrimSpace(raw)
132152
parsed, err := url.Parse(raw)

internal/lsp/diagnostics_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,32 @@ func TestDiagnosticsFromPublishDiagnosticsRequiresURI(t *testing.T) {
117117
t.Fatalf("err = %v", err)
118118
}
119119
}
120+
121+
func TestApplyDiagnosticsUpdateReplacesUpdatedFiles(t *testing.T) {
122+
existing := []Diagnostic{
123+
{FilePath: "a.go", Severity: "error", Message: "old a"},
124+
{FilePath: "b.go", Severity: "warning", Message: "old b"},
125+
}
126+
update := []Diagnostic{
127+
{FilePath: "./a.go", Severity: "2", Message: "new a"},
128+
{FilePath: "", Severity: "error", Message: "ignored"},
129+
}
130+
got := ApplyDiagnosticsUpdate(existing, update)
131+
if len(got) != 2 {
132+
t.Fatalf("updated diagnostics = %#v", got)
133+
}
134+
if got[0].FilePath != "a.go" || got[0].Severity != "warning" || got[0].Message != "new a" {
135+
t.Fatalf("updated diagnostics = %#v", got)
136+
}
137+
if got[1].FilePath != "b.go" || got[1].Message != "old b" {
138+
t.Fatalf("updated diagnostics = %#v", got)
139+
}
140+
}
141+
142+
func TestApplyDiagnosticsUpdateIgnoresEmptyUpdate(t *testing.T) {
143+
existing := []Diagnostic{{FilePath: "a.go", Severity: "error", Message: "old a"}}
144+
got := ApplyDiagnosticsUpdate(existing, nil)
145+
if len(got) != 1 || got[0].Message != "old a" {
146+
t.Fatalf("updated diagnostics = %#v", got)
147+
}
148+
}

0 commit comments

Comments
 (0)