Skip to content

Commit 40d031b

Browse files
feat: enhance permissions and error handling in configuration files
1 parent 33d8356 commit 40d031b

File tree

8 files changed

+48
-47
lines changed

8 files changed

+48
-47
lines changed

.claude/settings.local.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
"allow": [
44
"Bash(go build:*)",
55
"Bash(go vet:*)",
6-
"Bash(make build:*)"
6+
"Bash(make build:*)",
7+
"Bash(brew install:*)",
8+
"Bash(go install:*)",
9+
"Bash(golangci-lint run:*)",
10+
"Bash(golangci-lint help:*)"
711
]
812
},
913
"enableAllProjectMcpServers": true,

.golangci.yml

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
1+
version: "2"
2+
13
run:
24
timeout: 5m
3-
modules-download-mode: readonly
45

56
linters:
67
enable:
78
- errcheck
8-
- gosimple
99
- govet
1010
- ineffassign
1111
- staticcheck
1212
- unused
13+
14+
formatters:
15+
enable:
1316
- gofmt
1417
- goimports
1518

16-
linters-settings:
19+
settings:
1720
errcheck:
1821
check-type-assertions: true
1922
check-blank: false
@@ -23,19 +26,11 @@ linters-settings:
2326
disable:
2427
- fieldalignment
2528

26-
gofmt:
27-
simplify: true
28-
2929
goimports:
30-
local-prefixes: devir
30+
local-prefixes:
31+
- devir
3132

3233
issues:
3334
exclude-use-default: false
3435
max-issues-per-linter: 0
3536
max-same-issues: 0
36-
37-
exclude-rules:
38-
# Ignore long lines in generated files
39-
- path: _test\.go
40-
linters:
41-
- errcheck

cmd/devir/main.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ func runMCPMode(cfg *config.Config, socketPath string) {
7777
fmt.Fprintf(os.Stderr, "Failed to connect to daemon: %v\n", err)
7878
os.Exit(1)
7979
}
80-
defer client.Close()
80+
defer func() { _ = client.Close() }()
8181

8282
mcpServer := mcp.NewWithClient(cfg, client, Version)
8383
if err := mcpServer.Run(); err != nil {
@@ -101,7 +101,7 @@ func runMCPMode(cfg *config.Config, socketPath string) {
101101
fmt.Fprintf(os.Stderr, "Failed to connect to daemon: %v\n", err)
102102
os.Exit(1)
103103
}
104-
defer client.Close()
104+
defer func() { _ = client.Close() }()
105105

106106
mcpServer := mcp.NewWithClient(cfg, client, Version)
107107
if err := mcpServer.Run(); err != nil {
@@ -137,7 +137,7 @@ func runTUIMode(cfg *config.Config, socketPath string) {
137137
fmt.Fprintf(os.Stderr, "Failed to connect to daemon: %v\n", err)
138138
os.Exit(1)
139139
}
140-
defer client.Close()
140+
defer func() { _ = client.Close() }()
141141

142142
// Start TUI with client
143143
p := tea.NewProgram(
@@ -187,7 +187,7 @@ func runTUIMode(cfg *config.Config, socketPath string) {
187187
fmt.Fprintf(os.Stderr, "Failed to connect to daemon: %v\n", err)
188188
os.Exit(1)
189189
}
190-
defer client.Close()
190+
defer func() { _ = client.Close() }()
191191

192192
// Start services via daemon
193193
_, err = client.StartAndWait(services, killPorts, 10*1e9) // 10 seconds timeout

internal/daemon/client.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ import (
1111

1212
// Client connects to a daemon
1313
type Client struct {
14-
conn net.Conn
15-
sendCh chan Message
16-
recvCh chan Message
17-
closeCh chan struct{}
18-
wg sync.WaitGroup
19-
mu sync.Mutex
20-
closed bool
21-
handlers map[string]func(Message)
14+
conn net.Conn
15+
sendCh chan Message
16+
recvCh chan Message
17+
closeCh chan struct{}
18+
wg sync.WaitGroup
19+
mu sync.Mutex
20+
closed bool
21+
handlers map[string]func(Message)
2222
handlerMu sync.RWMutex
2323
}
2424

@@ -129,7 +129,7 @@ func (c *Client) Close() error {
129129
c.mu.Unlock()
130130

131131
close(c.closeCh)
132-
c.conn.Close()
132+
_ = c.conn.Close()
133133
c.wg.Wait()
134134
return nil
135135
}

internal/daemon/daemon.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ func Exists(socketPath string) bool {
4646
conn, err := net.Dial("unix", socketPath)
4747
if err != nil {
4848
// Socket file might exist but daemon not running
49-
os.Remove(socketPath)
49+
_ = os.Remove(socketPath)
5050
return false
5151
}
52-
conn.Close()
52+
_ = conn.Close()
5353
return true
5454
}
5555

@@ -84,7 +84,7 @@ func New(cfg *config.Config, socketPath string) *Daemon {
8484
// Start starts the daemon
8585
func (d *Daemon) Start() error {
8686
// Remove stale socket
87-
os.Remove(d.socketPath)
87+
_ = os.Remove(d.socketPath)
8888

8989
listener, err := net.Listen("unix", d.socketPath)
9090
if err != nil {
@@ -119,17 +119,17 @@ func (d *Daemon) Stop() {
119119
}
120120

121121
if d.listener != nil {
122-
d.listener.Close()
122+
_ = d.listener.Close()
123123
}
124124

125125
d.clientsMu.Lock()
126126
for c := range d.clients {
127-
c.conn.Close()
127+
_ = c.conn.Close()
128128
}
129129
d.clientsMu.Unlock()
130130

131131
d.wg.Wait()
132-
os.Remove(d.socketPath)
132+
_ = os.Remove(d.socketPath)
133133
}
134134

135135
func (d *Daemon) acceptLoop() {
@@ -194,7 +194,7 @@ func (c *clientConn) cleanup() {
194194
delete(c.daemon.clients, c)
195195
c.daemon.clientsMu.Unlock()
196196
close(c.sendCh)
197-
c.conn.Close()
197+
_ = c.conn.Close()
198198
}
199199

200200
func (c *clientConn) send(msg Message) {
@@ -260,7 +260,7 @@ func (d *Daemon) handleStart(c *clientConn, msg Message) {
260260
if runner.IsPortInUse(svc.Port) {
261261
pid, _ := runner.GetPortPID(svc.Port)
262262
if pid > 0 {
263-
runner.KillProcess(pid)
263+
_ = runner.KillProcess(pid)
264264
}
265265
}
266266
}
@@ -328,7 +328,7 @@ func (d *Daemon) handleRestart(c *clientConn, msg Message) {
328328

329329
d.runner.RestartService(req.Service)
330330

331-
resp, _ := NewMessage(MsgRestarted, RestartedResponse{Service: req.Service})
331+
resp, _ := NewMessage(MsgRestarted, RestartedResponse(req))
332332
c.send(resp)
333333
}
334334

@@ -479,7 +479,7 @@ func (d *Daemon) StartServices(services []string, killPorts bool) error {
479479
if runner.IsPortInUse(svc.Port) {
480480
pid, _ := runner.GetPortPID(svc.Port)
481481
if pid > 0 {
482-
runner.KillProcess(pid)
482+
_ = runner.KillProcess(pid)
483483
}
484484
}
485485
}

internal/mcp/mcp.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func (m *Server) Run() error {
9090

9191
go func() {
9292
<-sigCh
93-
m.client.Stop()
93+
_ = m.client.Stop()
9494
cancel()
9595
}()
9696

@@ -235,10 +235,10 @@ func (m *Server) handleStop(ctx context.Context, req *mcp.CallToolRequest, input
235235
func (m *Server) handleStatus(ctx context.Context, req *mcp.CallToolRequest, input struct{}) (*mcp.CallToolResult, StatusOutput, error) {
236236
statuses, err := m.client.StatusSync(5 * time.Second)
237237
if err != nil {
238-
return nil, StatusOutput{}, err
238+
return nil, StatusOutput{Services: []ServiceStatus{}}, err
239239
}
240240

241-
var result []ServiceStatus
241+
result := make([]ServiceStatus, 0, len(statuses))
242242
for _, s := range statuses {
243243
result = append(result, ServiceStatus{
244244
Name: s.Name,

internal/tui/model.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func NewWithClient(client *daemon.Client, services []string, cfg *config.Config)
8181
func (m Model) Init() tea.Cmd {
8282
if m.clientMode {
8383
// Request initial status
84-
m.client.Status()
84+
_ = m.client.Status()
8585
return tickCmd()
8686
}
8787

@@ -121,7 +121,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
121121
case "q", "ctrl+c":
122122
m.quitting = true
123123
if m.clientMode {
124-
m.client.Stop()
124+
_ = m.client.Stop()
125125
} else {
126126
m.Runner.Stop()
127127
}
@@ -160,7 +160,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
160160
case "r":
161161
if m.activeTab >= 0 && m.activeTab < len(m.services) {
162162
if m.clientMode {
163-
m.client.Restart(m.services[m.activeTab])
163+
_ = m.client.Restart(m.services[m.activeTab])
164164
} else {
165165
m.Runner.RestartService(m.services[m.activeTab])
166166
}
@@ -217,7 +217,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
217217
if m.clientMode {
218218
m.collectClientLogs()
219219
// Periodically request status
220-
m.client.Status()
220+
_ = m.client.Status()
221221
} else {
222222
m.collectLogs()
223223
}
@@ -247,7 +247,8 @@ func (m *Model) collectClientLogs() {
247247
for {
248248
select {
249249
case msg := <-m.client.Receive():
250-
if msg.Type == daemon.MsgLogEntry {
250+
switch msg.Type {
251+
case daemon.MsgLogEntry:
251252
logData, err := daemon.ParsePayload[daemon.LogEntryData](msg)
252253
if err == nil {
253254
m.logs = append(m.logs, types.LogEntry{
@@ -260,7 +261,7 @@ func (m *Model) collectClientLogs() {
260261
m.logs = m.logs[len(m.logs)-2000:]
261262
}
262263
}
263-
} else if msg.Type == daemon.MsgStatusResponse {
264+
case daemon.MsgStatusResponse:
264265
resp, _ := daemon.ParsePayload[daemon.StatusResponse](msg)
265266
for _, s := range resp.Services {
266267
m.statuses[s.Name] = s

playground/.claude/settings.local.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
"allow": [
44
"mcp__devir__devir_status",
55
"mcp__devir__devir_start",
6-
"mcp__devir__devir_restart"
6+
"mcp__devir__devir_restart",
7+
"mcp__devir__devir_stop"
78
]
89
},
910
"enableAllProjectMcpServers": true,

0 commit comments

Comments
 (0)