Guide non-interactive search skill install · Entire

Guide non-interactive search skill install

69a50e4→main·

dipree·3w ago·3 files·+45 added/-6 removed

Sessions

f03bc8b51457View transcript

Changes

3

435 unmodified lines

436
437
438
439
440
441
442
443
439
440
441
442
443
444
445
446
447
445
448
449
450
451
452

435 unmodified lines

// When no selectFn is provided, check if we can prompt interactively.
    // A selectFn (e.g. from --yes) bypasses the interactive prompt entirely.
    if selectFn == nil && !interactive.CanPromptInteractively() {
        if opts.SearchSkill && len(installedNames) > 0 {
            external.DiscoverAndRegisterAlways(ctx)
            selectedAgentNames := make([]string, 0, len(installedNames))
            for _, name := range installedNames {
                selectedAgentNames = append(selectedAgentNames, string(name))
            }
            if opts.SearchSkill {
                if len(installedNames) > 0 {
                    external.DiscoverAndRegisterAlways(ctx)
                    selectedAgentNames := make([]string, 0, len(installedNames))
                    for _, name := range installedNames {
                        selectedAgentNames = append(selectedAgentNames, string(name))
                    }
                    return applyAgentChanges(ctx, w, selectedAgentNames, installedNames, opts)
                }
                return applyAgentChanges(ctx, w, selectedAgentNames, installedNames, opts)
                printSearchSkillNonInteractiveNoAgentsGuidance(w)
                return NewSilentError(errors.New("search skill requires an agent in non-interactive mode"))
            }
            fmt.Fprintln(w, "Cannot show agent selection in non-interactive mode.")
            fmt.Fprintln(w, "Use: entire agent add <name>")
    }

Mcmd/entire/cli/setup.go+10/-6

135 unmodified lines

136
137
138
139
140
141
142
143
144
145
146
147
148
149

135 unmodified lines

bytes.Contains(data, []byte(legacyEntireManagedSearchSubagentMarker))
}

func printSearchSkillNonInteractiveNoAgentsGuidance(w io.Writer) {
    fmt.Fprintln(w, "Cannot install the search skill in non-interactive mode because no agents are enabled.")
    fmt.Fprintln(w, "Install it for a specific agent with:")
    fmt.Fprintln(w, "  entire enable --agent <name> --search-skill")
    fmt.Fprintln(w, "or:")
    fmt.Fprintln(w, "  entire agent add <name> --search-skill")
}

func reportSearchSkillScaffold(w io.Writer, ag agent.Agent, result searchSkillScaffoldResult) {
    switch result.Status {
    case searchSkillCreated:

Mcmd/entire/cli/setup_search_skill.go+8

2 unmodified lines

3
4
5
6
7
8
9
183 unmodified lines

193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224

2 unmodified lines

import (
    "bytes"
    "context"
    "errors"
    "os"
    "path/filepath"
    "strings"
183 unmodified lines

}
}

func TestManageAgentsNonInteractive_SearchSkillWithoutAgentsShowsInstallGuidance(t *testing.T) {
    setupTestRepo(t)
    writeSettings(t, testSettingsEnabled)

var out bytes.Buffer
    err := runManageAgents(context.Background(), &out, EnableOptions{SearchSkill: true}, nil)
    if err == nil {
        t.Fatal("expected error when --search-skill cannot choose an agent non-interactively")
    }
    var silentErr *SilentError
    if !errors.As(err, &silentErr) {
        t.Fatalf("error = %T %v, want SilentError", err, err)
    }

output := out.String()
    for _, want := range []string{
        "Cannot install the search skill in non-interactive mode because no agents are enabled.",
        "entire enable --agent <name> --search-skill",
        "entire agent add <name> --search-skill",
    } {
        if !strings.Contains(output, want) {
            t.Fatalf("output missing %q, got: %s", want, output)
        }
    }
}

func assertStrictJSONSearchInstructions(t *testing.T, content string) {
    t.Helper()