Skip to content

Commit 94a9e88

Browse files
gcmsgclaude
andcommitted
fix: fix CI for golangci-lint v2 and resolve all errcheck warnings
- Upgrade golangci-lint to v2.11.1 with action v7 - Fix frontend build path (vite outputs directly to dashboard_dist) - Update go.sum for peerclaw-core v0.1.0 - Add .golangci.yml (v2 format) with errcheck, staticcheck, unused - Suppress unchecked error return values across the codebase Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 99146a6 commit 94a9e88

File tree

26 files changed

+140
-106
lines changed

26 files changed

+140
-106
lines changed

.github/workflows/ci.yaml

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ jobs:
2626
cd web/app
2727
npm ci
2828
npm run build
29-
cp -r dist ../../internal/server/dashboard_dist
3029
3130
- name: Install dependencies
3231
run: sudo apt-get update && sudo apt-get install -y gcc libsqlite3-dev
@@ -52,7 +51,18 @@ jobs:
5251
with:
5352
go-version: "1.26"
5453

54+
- name: Setup Node.js
55+
uses: actions/setup-node@v4
56+
with:
57+
node-version: '20'
58+
59+
- name: Build frontend
60+
run: |
61+
cd web/app
62+
npm ci
63+
npm run build
64+
5565
- name: golangci-lint
56-
uses: golangci/golangci-lint-action@v6
66+
uses: golangci/golangci-lint-action@v7
5767
with:
58-
version: latest
68+
version: v2.11.1

.golangci.yml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
version: "2"
2+
3+
linters:
4+
enable:
5+
- errcheck
6+
- staticcheck
7+
- unused
8+
9+
exclusions:
10+
rules:
11+
# Exclude errcheck in test files – test helpers rarely need error checking.
12+
- path: _test\.go
13+
linters:
14+
- errcheck
15+
16+
# nhooyr.io/websocket is deprecated in favour of github.com/coder/websocket.
17+
# Migration is tracked separately; suppress SA1019 for the signaling package.
18+
- path: internal/signaling/
19+
linters:
20+
- staticcheck
21+
text: "SA1019"
22+
23+
# QF1002 (convert if/else-if chain to tagged switch) is a style suggestion.
24+
- linters:
25+
- staticcheck
26+
text: "QF1002"

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ WORKDIR /app
1111
COPY go.mod go.sum ./
1212
RUN go mod download
1313
COPY . .
14-
COPY --from=frontend /app/dist ./internal/server/dashboard_dist/
14+
COPY --from=frontend /internal/server/dashboard_dist ./internal/server/dashboard_dist/
1515
RUN CGO_ENABLED=1 go build -o /peerclawd ./cmd/peerclawd
1616

1717
FROM alpine:3.20

cmd/peerclawd/main.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func main() {
6464
logger.Error("failed to initialize OpenTelemetry", "error", err)
6565
os.Exit(1)
6666
}
67-
defer otelProvider.Shutdown(context.Background())
67+
defer func() { _ = otelProvider.Shutdown(context.Background()) }()
6868

6969
// Initialize metrics.
7070
otelMetrics, err := observability.NewMetrics(observability.Meter("peerclaw-gateway"))
@@ -79,7 +79,7 @@ func main() {
7979
logger.Error("failed to open database", "error", err, "driver", cfg.Database.Driver)
8080
os.Exit(1)
8181
}
82-
defer store.Close()
82+
defer func() { _ = store.Close() }()
8383

8484
// Extract the underlying *sql.DB for shared use by reputation and verification modules.
8585
sqlDB, _ := store.GetDB().(*sql.DB)
@@ -116,13 +116,13 @@ func main() {
116116

117117
// Register protocol bridges.
118118
if cfg.Bridge.A2A.Enabled {
119-
bridgeManager.RegisterBridge(a2a.New(logger, nil))
119+
_ = bridgeManager.RegisterBridge(a2a.New(logger, nil))
120120
}
121121
if cfg.Bridge.ACP.Enabled {
122-
bridgeManager.RegisterBridge(acp.New(logger, nil))
122+
_ = bridgeManager.RegisterBridge(acp.New(logger, nil))
123123
}
124124
if cfg.Bridge.MCP.Enabled {
125-
bridgeManager.RegisterBridge(mcp.New(logger, nil))
125+
_ = bridgeManager.RegisterBridge(mcp.New(logger, nil))
126126
}
127127

128128
// Initialize signaling hub.
@@ -228,7 +228,7 @@ func main() {
228228
broker := signaling.NewRedisBroker(redisClient, sigHub, logger)
229229
if _, err := broker.Subscribe(ctx); err != nil {
230230
logger.Error("Redis subscribe failed", "error", err)
231-
redisClient.Close()
231+
_ = redisClient.Close()
232232
sigHub.SetBroker(signaling.NewLocalBroker(sigHub))
233233
} else {
234234
sigHub.SetBroker(broker)
@@ -263,10 +263,10 @@ func main() {
263263
if err := rows.Scan(&agentID); err != nil {
264264
continue
265265
}
266-
repEngine.RecordEvent(ctx, agentID, "heartbeat_miss", "")
266+
_ = repEngine.RecordEvent(ctx, agentID, "heartbeat_miss", "")
267267
logger.Debug("heartbeat miss recorded", "agent_id", agentID)
268268
}
269-
rows.Close()
269+
_ = rows.Close()
270270
}
271271
}
272272
}()
@@ -311,15 +311,15 @@ func main() {
311311
// stop the servers and wait for goroutines to finish.
312312
cancel()
313313
grpcServer.Stop()
314-
httpServer.Stop()
314+
_ = httpServer.Stop()
315315

316316
// Wait for server goroutines to complete before tearing down
317317
// remaining services, ensuring a clean shutdown.
318318
wg.Wait()
319319

320320
if fedService != nil {
321-
fedService.Close()
321+
_ = fedService.Close()
322322
}
323-
bridgeManager.Close()
323+
_ = bridgeManager.Close()
324324
logger.Info("PeerClaw gateway stopped")
325325
}

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ github.com/lib/pq v1.11.2 h1:x6gxUeu39V0BHZiugWe8LXZYZ+Utk7hSJGThs8sdzfs=
3333
github.com/lib/pq v1.11.2/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA=
3434
github.com/mattn/go-sqlite3 v1.14.34 h1:3NtcvcUnFBPsuRcno8pUtupspG/GM+9nZ88zgJcp6Zk=
3535
github.com/mattn/go-sqlite3 v1.14.34/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
36+
github.com/peerclaw/peerclaw-core v0.1.0 h1:en8gU287cZYrnx5vFHQjxxKtIQM4HK1UbuLp1CMvqmc=
37+
github.com/peerclaw/peerclaw-core v0.1.0/go.mod h1:nlxhZV5ClCDDAh11ubrTLFluae1fK7bLj3uyUk/Gc4A=
3638
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
3739
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
3840
github.com/redis/go-redis/v9 v9.18.0 h1:pMkxYPkEbMPwRdenAzUNyFNrDgHx9U+DrBabWNfSRQs=

internal/audit/audit_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func TestLogDeregistration(t *testing.T) {
8181
l.LogDeregistration(context.Background(), "agent-1", "1.2.3.4")
8282

8383
var entry map[string]any
84-
json.Unmarshal(buf.Bytes(), &entry)
84+
_ = json.Unmarshal(buf.Bytes(), &entry)
8585
if entry["audit_type"] != string(EventAgentDeregistered) {
8686
t.Errorf("audit_type = %v, want %v", entry["audit_type"], EventAgentDeregistered)
8787
}
@@ -95,7 +95,7 @@ func TestLogMessageRouted(t *testing.T) {
9595
l.LogMessageRouted(context.Background(), "agent-a", "agent-b", "a2a")
9696

9797
var entry map[string]any
98-
json.Unmarshal(buf.Bytes(), &entry)
98+
_ = json.Unmarshal(buf.Bytes(), &entry)
9999
if entry["audit_type"] != string(EventMessageRouted) {
100100
t.Errorf("audit_type = %v, want %v", entry["audit_type"], EventMessageRouted)
101101
}
@@ -109,7 +109,7 @@ func TestLogSecurityEvent(t *testing.T) {
109109
l.LogSecurityEvent(context.Background(), EventRateLimited, "1.2.3.4", map[string]string{"reason": "exceeded"})
110110

111111
var entry map[string]any
112-
json.Unmarshal(buf.Bytes(), &entry)
112+
_ = json.Unmarshal(buf.Bytes(), &entry)
113113
if entry["audit_type"] != string(EventRateLimited) {
114114
t.Errorf("audit_type = %v, want %v", entry["audit_type"], EventRateLimited)
115115
}

internal/bridge/a2a/adapter.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ func (a *Adapter) Send(ctx context.Context, env *envelope.Envelope) error {
108108
if err != nil {
109109
return fmt.Errorf("a2a: http post: %w", err)
110110
}
111-
defer httpResp.Body.Close()
111+
defer func() { _ = httpResp.Body.Close() }()
112112

113113
respBody, err := io.ReadAll(io.LimitReader(httpResp.Body, maxResponseBodySize))
114114
if err != nil {
@@ -189,7 +189,7 @@ func (a *Adapter) Handshake(ctx context.Context, card *agentcard.Card) error {
189189
if err != nil {
190190
return fmt.Errorf("a2a: fetch agent card: %w", err)
191191
}
192-
defer resp.Body.Close()
192+
defer func() { _ = resp.Body.Close() }()
193193

194194
if resp.StatusCode != http.StatusOK {
195195
return fmt.Errorf("a2a: agent card status %d", resp.StatusCode)

internal/bridge/a2a/adapter_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func init() {
2222

2323
func TestAdapterProtocol(t *testing.T) {
2424
a := New(nil, nil)
25-
defer a.Close()
25+
defer func() { _ = a.Close() }()
2626
if a.Protocol() != "a2a" {
2727
t.Errorf("Protocol() = %q", a.Protocol())
2828
}

internal/bridge/a2a/handler.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ func (a *Adapter) HandleAgentCard(w http.ResponseWriter, r *http.Request) {
147147
}
148148

149149
w.Header().Set("Content-Type", "application/json")
150-
json.NewEncoder(w).Encode(card)
150+
_ = json.NewEncoder(w).Encode(card)
151151
}
152152

153153
// HandleGetTask handles GET /a2a/tasks/{id}.
@@ -165,7 +165,7 @@ func (a *Adapter) HandleGetTask(w http.ResponseWriter, r *http.Request) {
165165
}
166166

167167
w.Header().Set("Content-Type", "application/json")
168-
json.NewEncoder(w).Encode(task)
168+
_ = json.NewEncoder(w).Encode(task)
169169
}
170170

171171
// KindNotification is used for checking parsed message kind.
@@ -179,12 +179,12 @@ func writeJSONRPCResult(w http.ResponseWriter, id any, result any) {
179179
return
180180
}
181181
w.Header().Set("Content-Type", "application/json")
182-
json.NewEncoder(w).Encode(resp)
182+
_ = json.NewEncoder(w).Encode(resp)
183183
}
184184

185185
func writeJSONRPCError(w http.ResponseWriter, id any, code int, message string) {
186186
resp := jsonrpc.NewErrorResponse(id, code, message)
187187
w.Header().Set("Content-Type", "application/json")
188188
w.WriteHeader(http.StatusOK) // JSON-RPC errors still use 200
189-
json.NewEncoder(w).Encode(resp)
189+
_ = json.NewEncoder(w).Encode(resp)
190190
}

internal/bridge/acp/adapter.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func (a *Adapter) Send(ctx context.Context, env *envelope.Envelope) error {
8282
if err != nil {
8383
return fmt.Errorf("acp: http post: %w", err)
8484
}
85-
defer httpResp.Body.Close()
85+
defer func() { _ = httpResp.Body.Close() }()
8686

8787
respBody, err := io.ReadAll(io.LimitReader(httpResp.Body, maxResponseBodySize))
8888
if err != nil {
@@ -153,7 +153,7 @@ func (a *Adapter) Handshake(ctx context.Context, card *agentcard.Card) error {
153153
if err != nil {
154154
return fmt.Errorf("acp: fetch manifest: %w", err)
155155
}
156-
defer resp.Body.Close()
156+
defer func() { _ = resp.Body.Close() }()
157157

158158
if resp.StatusCode != http.StatusOK {
159159
return fmt.Errorf("acp: manifest status %d", resp.StatusCode)

0 commit comments

Comments
 (0)