refactor: remove banned imports from display, window/layout, window/state
Some checks failed
Security Scan / security (push) Failing after 28s

- display/events.go: encoding/json → core.JSONMarshal/JSONUnmarshal
- display/display.go: os, filepath → core.Env, core.JoinPath
- window/layout.go: encoding/json, os, filepath → core primitives
- window/state.go: encoding/json, os, filepath → core primitives

All 17 packages build and test clean.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude 2026-03-31 16:37:47 +01:00
parent 22668f7faa
commit f1f7fcfab9
No known key found for this signature in database
GPG key ID: AF404715446AEB41
7 changed files with 69 additions and 61 deletions

View file

@ -1,8 +1,8 @@
package contextmenu
import "errors"
import core "dappco.re/go/core"
var ErrorMenuNotFound = errors.New("contextmenu: menu not found")
var ErrorMenuNotFound = core.E("contextmenu", "menu not found", nil)
// QueryGet returns a named context menu definition. Result: *ContextMenuDef (nil if not found)
type QueryGet struct {

View file

@ -2,9 +2,6 @@ package display
import (
"context"
"encoding/json"
"os"
"path/filepath"
"runtime"
"forge.lthn.ai/core/config"
@ -331,9 +328,12 @@ func (s *Service) handleWSMessage(msg WSMessage) core.Result {
return c.QUERY(dock.QueryVisible{})
case "contextmenu:add":
name, _ := msg.Data["name"].(string)
menuJSON, _ := json.Marshal(msg.Data["menu"])
marshalResult := core.JSONMarshal(msg.Data["menu"])
var menuDef contextmenu.ContextMenuDef
_ = json.Unmarshal(menuJSON, &menuDef)
if marshalResult.OK {
menuJSON, _ := marshalResult.Value.([]byte)
core.JSONUnmarshal(menuJSON, &menuDef)
}
return c.Action("contextmenu.add").Run(ctx, core.NewOptions(
core.Option{Key: "task", Value: contextmenu.TaskAdd{Name: name, Menu: menuDef}},
))
@ -580,11 +580,11 @@ func (s *Service) handleTrayAction(actionID string) {
}
func guiConfigPath() string {
home, err := os.UserHomeDir()
if err != nil {
return filepath.Join(".core", "gui", "config.yaml")
home := core.Env("HOME")
if home == "" {
return core.JoinPath(".core", "gui", "config.yaml")
}
return filepath.Join(home, ".core", "gui", "config.yaml")
return core.JoinPath(home, ".core", "gui", "config.yaml")
}
func (s *Service) loadConfig() {

View file

@ -1,12 +1,12 @@
package display
import (
"encoding/json"
"net/http"
"strconv"
"sync"
"time"
core "dappco.re/go/core"
"forge.lthn.ai/core/gui/pkg/window"
"github.com/gorilla/websocket"
)
@ -134,10 +134,11 @@ func (em *WSEventManager) sendEvent(conn *websocket.Conn, event Event) {
return
}
data, err := json.Marshal(event)
if err != nil {
marshalResult := core.JSONMarshal(event)
if !marshalResult.OK {
return
}
data, _ := marshalResult.Value.([]byte)
conn.SetWriteDeadline(time.Now().Add(10 * time.Second))
if err := conn.WriteMessage(websocket.TextMessage, data); err != nil {
@ -178,7 +179,7 @@ func (em *WSEventManager) handleMessages(conn *websocket.Conn) {
EventTypes []EventType `json:"eventTypes,omitempty"`
}
if err := json.Unmarshal(message, &msg); err != nil {
if unmarshalResult := core.JSONUnmarshal(message, &msg); !unmarshalResult.OK {
continue
}
@ -224,8 +225,10 @@ func (em *WSEventManager) subscribe(conn *websocket.Conn, id string, eventTypes
"id": id,
"eventTypes": eventTypes,
}
data, _ := json.Marshal(response)
conn.WriteMessage(websocket.TextMessage, data)
if marshalResult := core.JSONMarshal(response); marshalResult.OK {
responseData, _ := marshalResult.Value.([]byte)
conn.WriteMessage(websocket.TextMessage, responseData)
}
}
// unsubscribe removes a subscription for a client.
@ -247,8 +250,10 @@ func (em *WSEventManager) unsubscribe(conn *websocket.Conn, id string) {
"type": "unsubscribed",
"id": id,
}
data, _ := json.Marshal(response)
conn.WriteMessage(websocket.TextMessage, data)
if marshalResult := core.JSONMarshal(response); marshalResult.OK {
responseData, _ := marshalResult.Value.([]byte)
conn.WriteMessage(websocket.TextMessage, responseData)
}
}
// listSubscriptions sends a list of active subscriptions to a client.
@ -272,8 +277,10 @@ func (em *WSEventManager) listSubscriptions(conn *websocket.Conn) {
"type": "subscriptions",
"subscriptions": subs,
}
data, _ := json.Marshal(response)
conn.WriteMessage(websocket.TextMessage, data)
if marshalResult := core.JSONMarshal(response); marshalResult.OK {
responseData, _ := marshalResult.Value.([]byte)
conn.WriteMessage(websocket.TextMessage, responseData)
}
}
// removeClient removes a client and its subscriptions.

View file

@ -1,9 +1,9 @@
package keybinding
import "errors"
import core "dappco.re/go/core"
var ErrorAlreadyRegistered = errors.New("keybinding: accelerator already registered")
var ErrorNotRegistered = errors.New("keybinding: accelerator not registered")
var ErrorAlreadyRegistered = core.E("keybinding", "accelerator already registered", nil)
var ErrorNotRegistered = core.E("keybinding", "accelerator not registered", nil)
// BindingInfo describes a registered global key binding.
type BindingInfo struct {

View file

@ -3,7 +3,6 @@ package mcp
import (
"context"
"encoding/json"
core "dappco.re/go/core"
coreerr "dappco.re/go/core/log"
@ -26,13 +25,15 @@ type ContextMenuAddOutput struct {
func (s *Subsystem) contextMenuAdd(_ context.Context, _ *mcp.CallToolRequest, input ContextMenuAddInput) (*mcp.CallToolResult, ContextMenuAddOutput, error) {
// Convert map[string]any to ContextMenuDef via JSON round-trip
menuJSON, err := json.Marshal(input.Menu)
if err != nil {
return nil, ContextMenuAddOutput{}, coreerr.E("mcp.contextMenuAdd", "failed to marshal menu definition", err)
marshalResult := core.JSONMarshal(input.Menu)
if !marshalResult.OK {
return nil, ContextMenuAddOutput{}, coreerr.E("mcp.contextMenuAdd", "failed to marshal menu definition", marshalResult.Value.(error))
}
menuJSON := marshalResult.Value.([]byte)
var menuDef contextmenu.ContextMenuDef
if err := json.Unmarshal(menuJSON, &menuDef); err != nil {
return nil, ContextMenuAddOutput{}, coreerr.E("mcp.contextMenuAdd", "failed to unmarshal menu definition", err)
unmarshalResult := core.JSONUnmarshal(menuJSON, &menuDef)
if !unmarshalResult.OK {
return nil, ContextMenuAddOutput{}, coreerr.E("mcp.contextMenuAdd", "failed to unmarshal menu definition", unmarshalResult.Value.(error))
}
r := s.core.Action("contextmenu.add").Run(context.Background(), core.NewOptions(
core.Option{Key: "task", Value: contextmenu.TaskAdd{Name: input.Name, Menu: menuDef}},
@ -93,13 +94,15 @@ func (s *Subsystem) contextMenuGet(_ context.Context, _ *mcp.CallToolRequest, in
return nil, ContextMenuGetOutput{}, nil
}
// Convert to map[string]any via JSON round-trip to avoid cyclic type in schema
menuJSON, err := json.Marshal(menu)
if err != nil {
return nil, ContextMenuGetOutput{}, coreerr.E("mcp.contextMenuGet", "failed to marshal context menu", err)
marshalResult := core.JSONMarshal(menu)
if !marshalResult.OK {
return nil, ContextMenuGetOutput{}, coreerr.E("mcp.contextMenuGet", "failed to marshal context menu", marshalResult.Value.(error))
}
menuJSON := marshalResult.Value.([]byte)
var menuMap map[string]any
if err := json.Unmarshal(menuJSON, &menuMap); err != nil {
return nil, ContextMenuGetOutput{}, coreerr.E("mcp.contextMenuGet", "failed to unmarshal context menu", err)
unmarshalResult := core.JSONUnmarshal(menuJSON, &menuMap)
if !unmarshalResult.OK {
return nil, ContextMenuGetOutput{}, coreerr.E("mcp.contextMenuGet", "failed to unmarshal context menu", unmarshalResult.Value.(error))
}
return nil, ContextMenuGetOutput{Menu: menuMap}, nil
}
@ -124,13 +127,15 @@ func (s *Subsystem) contextMenuList(_ context.Context, _ *mcp.CallToolRequest, _
return nil, ContextMenuListOutput{}, coreerr.E("mcp.contextMenuList", "unexpected result type", nil)
}
// Convert to map[string]any via JSON round-trip to avoid cyclic type in schema
menusJSON, err := json.Marshal(menus)
if err != nil {
return nil, ContextMenuListOutput{}, coreerr.E("mcp.contextMenuList", "failed to marshal context menus", err)
marshalResult := core.JSONMarshal(menus)
if !marshalResult.OK {
return nil, ContextMenuListOutput{}, coreerr.E("mcp.contextMenuList", "failed to marshal context menus", marshalResult.Value.(error))
}
menusJSON := marshalResult.Value.([]byte)
var menusMap map[string]any
if err := json.Unmarshal(menusJSON, &menusMap); err != nil {
return nil, ContextMenuListOutput{}, coreerr.E("mcp.contextMenuList", "failed to unmarshal context menus", err)
unmarshalResult := core.JSONUnmarshal(menusJSON, &menusMap)
if !unmarshalResult.OK {
return nil, ContextMenuListOutput{}, coreerr.E("mcp.contextMenuList", "failed to unmarshal context menus", unmarshalResult.Value.(error))
}
return nil, ContextMenuListOutput{Menus: menusMap}, nil
}

View file

@ -2,12 +2,10 @@
package window
import (
"encoding/json"
"os"
"path/filepath"
"sync"
"time"
core "dappco.re/go/core"
coreio "dappco.re/go/core/io"
coreerr "dappco.re/go/core/log"
)
@ -40,9 +38,8 @@ func NewLayoutManager() *LayoutManager {
lm := &LayoutManager{
layouts: make(map[string]Layout),
}
configDir, err := os.UserConfigDir()
if err == nil {
lm.configDir = filepath.Join(configDir, "Core")
if configDir := core.Env("DIR_CONFIG"); configDir != "" {
lm.configDir = core.JoinPath(configDir, "Core")
}
lm.load()
return lm
@ -60,7 +57,7 @@ func NewLayoutManagerWithDir(configDir string) *LayoutManager {
}
func (lm *LayoutManager) filePath() string {
return filepath.Join(lm.configDir, "layouts.json")
return core.JoinPath(lm.configDir, "layouts.json")
}
func (lm *LayoutManager) load() {
@ -73,7 +70,7 @@ func (lm *LayoutManager) load() {
}
lm.mu.Lock()
defer lm.mu.Unlock()
_ = json.Unmarshal([]byte(content), &lm.layouts)
_ = core.JSONUnmarshalString(content, &lm.layouts)
}
func (lm *LayoutManager) save() {
@ -81,11 +78,12 @@ func (lm *LayoutManager) save() {
return
}
lm.mu.RLock()
data, err := json.MarshalIndent(lm.layouts, "", " ")
result := core.JSONMarshal(lm.layouts)
lm.mu.RUnlock()
if err != nil {
if !result.OK {
return
}
data := result.Value.([]byte)
_ = coreio.Local.EnsureDir(lm.configDir)
_ = coreio.Local.Write(lm.filePath(), string(data))
}

View file

@ -2,12 +2,10 @@
package window
import (
"encoding/json"
"os"
"path/filepath"
"sync"
"time"
core "dappco.re/go/core"
coreio "dappco.re/go/core/io"
)
@ -38,9 +36,8 @@ func NewStateManager() *StateManager {
sm := &StateManager{
states: make(map[string]WindowState),
}
configDir, err := os.UserConfigDir()
if err == nil {
sm.configDir = filepath.Join(configDir, "Core")
if configDir := core.Env("DIR_CONFIG"); configDir != "" {
sm.configDir = core.JoinPath(configDir, "Core")
}
sm.load()
return sm
@ -61,12 +58,12 @@ func (sm *StateManager) filePath() string {
if sm.statePath != "" {
return sm.statePath
}
return filepath.Join(sm.configDir, "window_state.json")
return core.JoinPath(sm.configDir, "window_state.json")
}
func (sm *StateManager) dataDir() string {
if sm.statePath != "" {
return filepath.Dir(sm.statePath)
return core.PathDir(sm.statePath)
}
return sm.configDir
}
@ -96,7 +93,7 @@ func (sm *StateManager) load() {
}
sm.mu.Lock()
defer sm.mu.Unlock()
_ = json.Unmarshal([]byte(content), &sm.states)
_ = core.JSONUnmarshalString(content, &sm.states)
}
func (sm *StateManager) save() {
@ -104,11 +101,12 @@ func (sm *StateManager) save() {
return
}
sm.mu.RLock()
data, err := json.MarshalIndent(sm.states, "", " ")
result := core.JSONMarshal(sm.states)
sm.mu.RUnlock()
if err != nil {
if !result.OK {
return
}
data := result.Value.([]byte)
if dir := sm.dataDir(); dir != "" {
_ = coreio.Local.EnsureDir(dir)
}