chore: fmt.Errorf(static) → errors.New

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Claude 2026-02-24 16:01:43 +00:00
parent 6dcb39e0ae
commit 23d8cb4824
No known key found for this signature in database
GPG key ID: AF404715446AEB41
12 changed files with 58 additions and 49 deletions

View file

@ -1,13 +1,14 @@
package security
import (
"errors"
"fmt"
"os/exec"
"strings"
"time"
"forge.lthn.ai/core/go-ai/ai"
"forge.lthn.ai/core/cli/pkg/cli"
"forge.lthn.ai/core/go-ai/ai"
"forge.lthn.ai/core/go/pkg/i18n"
)
@ -68,7 +69,7 @@ func runJobs() error {
func createJobForTarget(target string) error {
parts := strings.SplitN(target, "/", 2)
if len(parts) != 2 {
return fmt.Errorf("invalid target format: use owner/repo")
return errors.New("invalid target format: use owner/repo")
}
// Gather findings

View file

@ -146,7 +146,7 @@ func runGHAPI(endpoint string) ([]byte, error) {
return []byte("[]"), nil // Return empty array for not found
}
if strings.Contains(stderr, "403") {
return nil, fmt.Errorf("access denied (check token permissions)")
return nil, errors.New("access denied (check token permissions)")
}
}
return nil, cli.Wrap(err, "run gh api")

View file

@ -3,6 +3,7 @@ package ide
import (
"context"
"encoding/json"
"errors"
"fmt"
"log"
"net/http"
@ -73,7 +74,7 @@ func (b *Bridge) Send(msg BridgeMessage) error {
b.mu.Lock()
defer b.mu.Unlock()
if b.conn == nil {
return fmt.Errorf("bridge: not connected")
return errors.New("bridge: not connected")
}
msg.Timestamp = time.Now()
data, err := json.Marshal(msg)

View file

@ -2,7 +2,7 @@ package ide
import (
"context"
"fmt"
"errors"
"time"
"github.com/modelcontextprotocol/go-sdk/mcp"
@ -74,7 +74,7 @@ func (s *Subsystem) registerBuildTools(server *mcp.Server) {
// Stub implementation: sends request via bridge, returns "unknown" status. Awaiting Laravel backend.
func (s *Subsystem) buildStatus(_ context.Context, _ *mcp.CallToolRequest, input BuildStatusInput) (*mcp.CallToolResult, BuildStatusOutput, error) {
if s.bridge == nil {
return nil, BuildStatusOutput{}, fmt.Errorf("bridge not available")
return nil, BuildStatusOutput{}, errors.New("bridge not available")
}
_ = s.bridge.Send(BridgeMessage{
Type: "build_status",
@ -89,7 +89,7 @@ func (s *Subsystem) buildStatus(_ context.Context, _ *mcp.CallToolRequest, input
// Stub implementation: sends request via bridge, returns empty list. Awaiting Laravel backend.
func (s *Subsystem) buildList(_ context.Context, _ *mcp.CallToolRequest, input BuildListInput) (*mcp.CallToolResult, BuildListOutput, error) {
if s.bridge == nil {
return nil, BuildListOutput{}, fmt.Errorf("bridge not available")
return nil, BuildListOutput{}, errors.New("bridge not available")
}
_ = s.bridge.Send(BridgeMessage{
Type: "build_list",
@ -102,7 +102,7 @@ func (s *Subsystem) buildList(_ context.Context, _ *mcp.CallToolRequest, input B
// Stub implementation: sends request via bridge, returns empty lines. Awaiting Laravel backend.
func (s *Subsystem) buildLogs(_ context.Context, _ *mcp.CallToolRequest, input BuildLogsInput) (*mcp.CallToolResult, BuildLogsOutput, error) {
if s.bridge == nil {
return nil, BuildLogsOutput{}, fmt.Errorf("bridge not available")
return nil, BuildLogsOutput{}, errors.New("bridge not available")
}
_ = s.bridge.Send(BridgeMessage{
Type: "build_logs",

View file

@ -2,6 +2,7 @@ package ide
import (
"context"
"errors"
"fmt"
"time"
@ -117,7 +118,7 @@ func (s *Subsystem) registerChatTools(server *mcp.Server) {
// Stub implementation: delegates to bridge, real response arrives via WebSocket subscription.
func (s *Subsystem) chatSend(_ context.Context, _ *mcp.CallToolRequest, input ChatSendInput) (*mcp.CallToolResult, ChatSendOutput, error) {
if s.bridge == nil {
return nil, ChatSendOutput{}, fmt.Errorf("bridge not available")
return nil, ChatSendOutput{}, errors.New("bridge not available")
}
err := s.bridge.Send(BridgeMessage{
Type: "chat_send",
@ -139,7 +140,7 @@ func (s *Subsystem) chatSend(_ context.Context, _ *mcp.CallToolRequest, input Ch
// Stub implementation: sends request via bridge, returns empty messages. Real data arrives via WebSocket.
func (s *Subsystem) chatHistory(_ context.Context, _ *mcp.CallToolRequest, input ChatHistoryInput) (*mcp.CallToolResult, ChatHistoryOutput, error) {
if s.bridge == nil {
return nil, ChatHistoryOutput{}, fmt.Errorf("bridge not available")
return nil, ChatHistoryOutput{}, errors.New("bridge not available")
}
// Request history via bridge; for now return placeholder indicating the
// request was forwarded. Real data arrives via WebSocket subscription.
@ -158,7 +159,7 @@ func (s *Subsystem) chatHistory(_ context.Context, _ *mcp.CallToolRequest, input
// Stub implementation: sends request via bridge, returns empty sessions. Awaiting Laravel backend.
func (s *Subsystem) sessionList(_ context.Context, _ *mcp.CallToolRequest, _ SessionListInput) (*mcp.CallToolResult, SessionListOutput, error) {
if s.bridge == nil {
return nil, SessionListOutput{}, fmt.Errorf("bridge not available")
return nil, SessionListOutput{}, errors.New("bridge not available")
}
_ = s.bridge.Send(BridgeMessage{Type: "session_list"})
return nil, SessionListOutput{Sessions: []Session{}}, nil
@ -168,7 +169,7 @@ func (s *Subsystem) sessionList(_ context.Context, _ *mcp.CallToolRequest, _ Ses
// Stub implementation: sends request via bridge, returns placeholder session. Awaiting Laravel backend.
func (s *Subsystem) sessionCreate(_ context.Context, _ *mcp.CallToolRequest, input SessionCreateInput) (*mcp.CallToolResult, SessionCreateOutput, error) {
if s.bridge == nil {
return nil, SessionCreateOutput{}, fmt.Errorf("bridge not available")
return nil, SessionCreateOutput{}, errors.New("bridge not available")
}
_ = s.bridge.Send(BridgeMessage{
Type: "session_create",
@ -187,7 +188,7 @@ func (s *Subsystem) sessionCreate(_ context.Context, _ *mcp.CallToolRequest, inp
// Stub implementation: sends request via bridge, returns "unknown" status. Awaiting Laravel backend.
func (s *Subsystem) planStatus(_ context.Context, _ *mcp.CallToolRequest, input PlanStatusInput) (*mcp.CallToolResult, PlanStatusOutput, error) {
if s.bridge == nil {
return nil, PlanStatusOutput{}, fmt.Errorf("bridge not available")
return nil, PlanStatusOutput{}, errors.New("bridge not available")
}
_ = s.bridge.Send(BridgeMessage{
Type: "plan_status",

View file

@ -2,7 +2,7 @@ package ide
import (
"context"
"fmt"
"errors"
"time"
"github.com/modelcontextprotocol/go-sdk/mcp"
@ -103,7 +103,7 @@ func (s *Subsystem) dashboardOverview(_ context.Context, _ *mcp.CallToolRequest,
// Stub implementation: sends request via bridge, returns empty events. Awaiting Laravel backend.
func (s *Subsystem) dashboardActivity(_ context.Context, _ *mcp.CallToolRequest, input DashboardActivityInput) (*mcp.CallToolResult, DashboardActivityOutput, error) {
if s.bridge == nil {
return nil, DashboardActivityOutput{}, fmt.Errorf("bridge not available")
return nil, DashboardActivityOutput{}, errors.New("bridge not available")
}
_ = s.bridge.Send(BridgeMessage{
Type: "dashboard_activity",
@ -116,7 +116,7 @@ func (s *Subsystem) dashboardActivity(_ context.Context, _ *mcp.CallToolRequest,
// Stub implementation: sends request via bridge, returns zero metrics. Awaiting Laravel backend.
func (s *Subsystem) dashboardMetrics(_ context.Context, _ *mcp.CallToolRequest, input DashboardMetricsInput) (*mcp.CallToolResult, DashboardMetricsOutput, error) {
if s.bridge == nil {
return nil, DashboardMetricsOutput{}, fmt.Errorf("bridge not available")
return nil, DashboardMetricsOutput{}, errors.New("bridge not available")
}
period := input.Period
if period == "" {

View file

@ -6,6 +6,7 @@ package mcp
import (
"context"
"errors"
"fmt"
"iter"
"net/http"
@ -471,7 +472,7 @@ func (s *Service) getSupportedLanguages(ctx context.Context, req *mcp.CallToolRe
func (s *Service) editDiff(ctx context.Context, req *mcp.CallToolRequest, input EditDiffInput) (*mcp.CallToolResult, EditDiffOutput, error) {
if input.OldString == "" {
return nil, EditDiffOutput{}, fmt.Errorf("old_string cannot be empty")
return nil, EditDiffOutput{}, errors.New("old_string cannot be empty")
}
content, err := s.medium.Read(input.Path)
@ -484,12 +485,12 @@ func (s *Service) editDiff(ctx context.Context, req *mcp.CallToolRequest, input
if input.ReplaceAll {
count = strings.Count(content, input.OldString)
if count == 0 {
return nil, EditDiffOutput{}, fmt.Errorf("old_string not found in file")
return nil, EditDiffOutput{}, errors.New("old_string not found in file")
}
content = strings.ReplaceAll(content, input.OldString, input.NewString)
} else {
if !strings.Contains(content, input.OldString) {
return nil, EditDiffOutput{}, fmt.Errorf("old_string not found in file")
return nil, EditDiffOutput{}, errors.New("old_string not found in file")
}
content = strings.Replace(content, input.OldString, input.NewString, 1)
count = 1

View file

@ -2,6 +2,7 @@ package mcp
import (
"context"
"errors"
"fmt"
"strconv"
"strings"
@ -79,7 +80,7 @@ func (s *Service) metricsRecord(ctx context.Context, req *mcp.CallToolRequest, i
// Validate input
if input.Type == "" {
return nil, MetricsRecordOutput{}, fmt.Errorf("type cannot be empty")
return nil, MetricsRecordOutput{}, errors.New("type cannot be empty")
}
// Create the event
@ -178,7 +179,7 @@ func convertMetricCounts(data any) []MetricCount {
// parseDuration parses a duration string like "7d", "24h", "30m".
func parseDuration(s string) (time.Duration, error) {
if s == "" {
return 0, fmt.Errorf("duration cannot be empty")
return 0, errors.New("duration cannot be empty")
}
s = strings.TrimSpace(s)

View file

@ -2,6 +2,7 @@ package mcp
import (
"context"
"errors"
"fmt"
"strings"
@ -141,7 +142,7 @@ func (m *MLSubsystem) mlGenerate(ctx context.Context, req *mcp.CallToolRequest,
m.logger.Info("MCP tool execution", "tool", "ml_generate", "backend", input.Backend, "user", log.Username())
if input.Prompt == "" {
return nil, MLGenerateOutput{}, fmt.Errorf("prompt cannot be empty")
return nil, MLGenerateOutput{}, errors.New("prompt cannot be empty")
}
opts := ml.GenOpts{
@ -166,7 +167,7 @@ func (m *MLSubsystem) mlScore(ctx context.Context, req *mcp.CallToolRequest, inp
m.logger.Info("MCP tool execution", "tool", "ml_score", "suites", input.Suites, "user", log.Username())
if input.Prompt == "" || input.Response == "" {
return nil, MLScoreOutput{}, fmt.Errorf("prompt and response cannot be empty")
return nil, MLScoreOutput{}, errors.New("prompt and response cannot be empty")
}
suites := input.Suites
@ -184,7 +185,7 @@ func (m *MLSubsystem) mlScore(ctx context.Context, req *mcp.CallToolRequest, inp
case "semantic":
judge := m.service.Judge()
if judge == nil {
return nil, MLScoreOutput{}, fmt.Errorf("semantic scoring requires a judge backend")
return nil, MLScoreOutput{}, errors.New("semantic scoring requires a judge backend")
}
s, err := judge.ScoreSemantic(ctx, input.Prompt, input.Response)
if err != nil {
@ -192,7 +193,7 @@ func (m *MLSubsystem) mlScore(ctx context.Context, req *mcp.CallToolRequest, inp
}
output.Semantic = s
case "content":
return nil, MLScoreOutput{}, fmt.Errorf("content scoring requires a ContentProbe — use ml_probe instead")
return nil, MLScoreOutput{}, errors.New("content scoring requires a ContentProbe — use ml_probe instead")
}
}

View file

@ -2,6 +2,7 @@ package mcp
import (
"context"
"errors"
"fmt"
"time"
@ -144,7 +145,7 @@ func (s *Service) processStart(ctx context.Context, req *mcp.CallToolRequest, in
s.logger.Security("MCP tool execution", "tool", "process_start", "command", input.Command, "args", input.Args, "dir", input.Dir, "user", log.Username())
if input.Command == "" {
return nil, ProcessStartOutput{}, fmt.Errorf("command cannot be empty")
return nil, ProcessStartOutput{}, errors.New("command cannot be empty")
}
opts := process.RunOptions{
@ -175,7 +176,7 @@ func (s *Service) processStop(ctx context.Context, req *mcp.CallToolRequest, inp
s.logger.Security("MCP tool execution", "tool", "process_stop", "id", input.ID, "user", log.Username())
if input.ID == "" {
return nil, ProcessStopOutput{}, fmt.Errorf("id cannot be empty")
return nil, ProcessStopOutput{}, errors.New("id cannot be empty")
}
proc, err := s.processService.Get(input.ID)
@ -203,7 +204,7 @@ func (s *Service) processKill(ctx context.Context, req *mcp.CallToolRequest, inp
s.logger.Security("MCP tool execution", "tool", "process_kill", "id", input.ID, "user", log.Username())
if input.ID == "" {
return nil, ProcessKillOutput{}, fmt.Errorf("id cannot be empty")
return nil, ProcessKillOutput{}, errors.New("id cannot be empty")
}
if err := s.processService.Kill(input.ID); err != nil {
@ -256,7 +257,7 @@ func (s *Service) processOutput(ctx context.Context, req *mcp.CallToolRequest, i
s.logger.Info("MCP tool execution", "tool", "process_output", "id", input.ID, "user", log.Username())
if input.ID == "" {
return nil, ProcessOutputOutput{}, fmt.Errorf("id cannot be empty")
return nil, ProcessOutputOutput{}, errors.New("id cannot be empty")
}
output, err := s.processService.Output(input.ID)
@ -276,10 +277,10 @@ func (s *Service) processInput(ctx context.Context, req *mcp.CallToolRequest, in
s.logger.Security("MCP tool execution", "tool", "process_input", "id", input.ID, "user", log.Username())
if input.ID == "" {
return nil, ProcessInputOutput{}, fmt.Errorf("id cannot be empty")
return nil, ProcessInputOutput{}, errors.New("id cannot be empty")
}
if input.Input == "" {
return nil, ProcessInputOutput{}, fmt.Errorf("input cannot be empty")
return nil, ProcessInputOutput{}, errors.New("input cannot be empty")
}
proc, err := s.processService.Get(input.ID)

View file

@ -2,10 +2,11 @@ package mcp
import (
"context"
"errors"
"fmt"
"forge.lthn.ai/core/go/pkg/log"
"forge.lthn.ai/core/go-rag"
"forge.lthn.ai/core/go/pkg/log"
"github.com/modelcontextprotocol/go-sdk/mcp"
)
@ -107,7 +108,7 @@ func (s *Service) ragQuery(ctx context.Context, req *mcp.CallToolRequest, input
// Validate input
if input.Question == "" {
return nil, RAGQueryOutput{}, fmt.Errorf("question cannot be empty")
return nil, RAGQueryOutput{}, errors.New("question cannot be empty")
}
// Call the RAG query function
@ -150,7 +151,7 @@ func (s *Service) ragIngest(ctx context.Context, req *mcp.CallToolRequest, input
// Validate input
if input.Path == "" {
return nil, RAGIngestOutput{}, fmt.Errorf("path cannot be empty")
return nil, RAGIngestOutput{}, errors.New("path cannot be empty")
}
// Check if path is a file or directory using the medium

View file

@ -3,6 +3,7 @@ package mcp
import (
"context"
"encoding/base64"
"errors"
"fmt"
"time"
@ -203,7 +204,7 @@ func (s *Service) webviewConnect(ctx context.Context, req *mcp.CallToolRequest,
s.logger.Security("MCP tool execution", "tool", "webview_connect", "debug_url", input.DebugURL, "user", log.Username())
if input.DebugURL == "" {
return nil, WebviewConnectOutput{}, fmt.Errorf("debug_url is required")
return nil, WebviewConnectOutput{}, errors.New("debug_url is required")
}
// Close existing connection if any
@ -265,11 +266,11 @@ func (s *Service) webviewNavigate(ctx context.Context, req *mcp.CallToolRequest,
s.logger.Info("MCP tool execution", "tool", "webview_navigate", "url", input.URL, "user", log.Username())
if webviewInstance == nil {
return nil, WebviewNavigateOutput{}, fmt.Errorf("not connected; use webview_connect first")
return nil, WebviewNavigateOutput{}, errors.New("not connected; use webview_connect first")
}
if input.URL == "" {
return nil, WebviewNavigateOutput{}, fmt.Errorf("url is required")
return nil, WebviewNavigateOutput{}, errors.New("url is required")
}
if err := webviewInstance.Navigate(input.URL); err != nil {
@ -288,11 +289,11 @@ func (s *Service) webviewClick(ctx context.Context, req *mcp.CallToolRequest, in
s.logger.Info("MCP tool execution", "tool", "webview_click", "selector", input.Selector, "user", log.Username())
if webviewInstance == nil {
return nil, WebviewClickOutput{}, fmt.Errorf("not connected; use webview_connect first")
return nil, WebviewClickOutput{}, errors.New("not connected; use webview_connect first")
}
if input.Selector == "" {
return nil, WebviewClickOutput{}, fmt.Errorf("selector is required")
return nil, WebviewClickOutput{}, errors.New("selector is required")
}
if err := webviewInstance.Click(input.Selector); err != nil {
@ -308,11 +309,11 @@ func (s *Service) webviewType(ctx context.Context, req *mcp.CallToolRequest, inp
s.logger.Info("MCP tool execution", "tool", "webview_type", "selector", input.Selector, "user", log.Username())
if webviewInstance == nil {
return nil, WebviewTypeOutput{}, fmt.Errorf("not connected; use webview_connect first")
return nil, WebviewTypeOutput{}, errors.New("not connected; use webview_connect first")
}
if input.Selector == "" {
return nil, WebviewTypeOutput{}, fmt.Errorf("selector is required")
return nil, WebviewTypeOutput{}, errors.New("selector is required")
}
if err := webviewInstance.Type(input.Selector, input.Text); err != nil {
@ -328,11 +329,11 @@ func (s *Service) webviewQuery(ctx context.Context, req *mcp.CallToolRequest, in
s.logger.Info("MCP tool execution", "tool", "webview_query", "selector", input.Selector, "all", input.All, "user", log.Username())
if webviewInstance == nil {
return nil, WebviewQueryOutput{}, fmt.Errorf("not connected; use webview_connect first")
return nil, WebviewQueryOutput{}, errors.New("not connected; use webview_connect first")
}
if input.Selector == "" {
return nil, WebviewQueryOutput{}, fmt.Errorf("selector is required")
return nil, WebviewQueryOutput{}, errors.New("selector is required")
}
if input.All {
@ -386,7 +387,7 @@ func (s *Service) webviewConsole(ctx context.Context, req *mcp.CallToolRequest,
s.logger.Info("MCP tool execution", "tool", "webview_console", "clear", input.Clear, "user", log.Username())
if webviewInstance == nil {
return nil, WebviewConsoleOutput{}, fmt.Errorf("not connected; use webview_connect first")
return nil, WebviewConsoleOutput{}, errors.New("not connected; use webview_connect first")
}
messages := webviewInstance.GetConsole()
@ -418,11 +419,11 @@ func (s *Service) webviewEval(ctx context.Context, req *mcp.CallToolRequest, inp
s.logger.Security("MCP tool execution", "tool", "webview_eval", "user", log.Username())
if webviewInstance == nil {
return nil, WebviewEvalOutput{}, fmt.Errorf("not connected; use webview_connect first")
return nil, WebviewEvalOutput{}, errors.New("not connected; use webview_connect first")
}
if input.Script == "" {
return nil, WebviewEvalOutput{}, fmt.Errorf("script is required")
return nil, WebviewEvalOutput{}, errors.New("script is required")
}
result, err := webviewInstance.Evaluate(input.Script)
@ -445,7 +446,7 @@ func (s *Service) webviewScreenshot(ctx context.Context, req *mcp.CallToolReques
s.logger.Info("MCP tool execution", "tool", "webview_screenshot", "format", input.Format, "user", log.Username())
if webviewInstance == nil {
return nil, WebviewScreenshotOutput{}, fmt.Errorf("not connected; use webview_connect first")
return nil, WebviewScreenshotOutput{}, errors.New("not connected; use webview_connect first")
}
format := input.Format
@ -471,11 +472,11 @@ func (s *Service) webviewWait(ctx context.Context, req *mcp.CallToolRequest, inp
s.logger.Info("MCP tool execution", "tool", "webview_wait", "selector", input.Selector, "timeout", input.Timeout, "user", log.Username())
if webviewInstance == nil {
return nil, WebviewWaitOutput{}, fmt.Errorf("not connected; use webview_connect first")
return nil, WebviewWaitOutput{}, errors.New("not connected; use webview_connect first")
}
if input.Selector == "" {
return nil, WebviewWaitOutput{}, fmt.Errorf("selector is required")
return nil, WebviewWaitOutput{}, errors.New("selector is required")
}
if err := webviewInstance.WaitForSelector(input.Selector); err != nil {