refactor: extract commands.go closures into methods — agentic 65.1%

Extract run/task, orchestrator, prep, status, prompt, extract closures
into standalone methods on PrepSubsystem. Extract shared parseIntStr helper.

Coverage: agentic 61.4% → 65.1% (+3.7pp)
Total: 512 agentic tests

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Snider 2026-03-25 00:54:07 +00:00
parent b5cb294b25
commit 3d7adb91eb
2 changed files with 322 additions and 248 deletions

View file

@ -15,252 +15,238 @@ import (
// registerCommands adds agentic CLI commands to Core's command tree.
func (s *PrepSubsystem) registerCommands(ctx context.Context) {
c := s.core
c.Command("run/task", core.Command{
Description: "Run a single task end-to-end",
Action: func(opts core.Options) core.Result {
repo := opts.String("repo")
agent := opts.String("agent")
task := opts.String("task")
issueStr := opts.String("issue")
org := opts.String("org")
if repo == "" || task == "" {
core.Print(nil, "usage: core-agent run task --repo=<repo> --task=\"...\" --agent=codex [--issue=N] [--org=core]")
return core.Result{OK: false}
}
if agent == "" {
agent = "codex"
}
if org == "" {
org = "core"
}
issue := 0
if issueStr != "" {
for _, ch := range issueStr {
if ch >= '0' && ch <= '9' {
issue = issue*10 + int(ch-'0')
}
}
}
core.Print(os.Stderr, "core-agent run task")
core.Print(os.Stderr, " repo: %s/%s", org, repo)
core.Print(os.Stderr, " agent: %s", agent)
if issue > 0 {
core.Print(os.Stderr, " issue: #%d", issue)
}
core.Print(os.Stderr, " task: %s", task)
core.Print(os.Stderr, "")
result := s.DispatchSync(ctx, DispatchSyncInput{
Org: org,
Repo: repo,
Agent: agent,
Task: task,
Issue: issue,
})
if !result.OK {
core.Print(os.Stderr, "FAILED: %v", result.Error)
return core.Result{Value: result.Error, OK: false}
}
core.Print(os.Stderr, "DONE: %s", result.Status)
if result.PRURL != "" {
core.Print(os.Stderr, " PR: %s", result.PRURL)
}
return core.Result{OK: true}
},
})
c.Command("run/orchestrator", core.Command{
Description: "Run the queue orchestrator (standalone, no MCP)",
Action: func(opts core.Options) core.Result {
core.Print(os.Stderr, "core-agent orchestrator running (pid %s)", core.Env("PID"))
core.Print(os.Stderr, " workspace: %s", WorkspaceRoot())
core.Print(os.Stderr, " watching queue, draining on 30s tick + completion poke")
<-ctx.Done()
core.Print(os.Stderr, "orchestrator shutting down")
return core.Result{OK: true}
},
})
c.Command("prep", core.Command{
Description: "Prepare a workspace: clone repo, build prompt",
Action: func(opts core.Options) core.Result {
repo := opts.String("_arg")
if repo == "" {
core.Print(nil, "usage: core-agent prep <repo> --issue=N|--pr=N|--branch=X --task=\"...\"")
return core.Result{OK: false}
}
input := PrepInput{
Repo: repo,
Org: opts.String("org"),
Task: opts.String("task"),
Template: opts.String("template"),
Persona: opts.String("persona"),
DryRun: opts.Bool("dry-run"),
}
if v := opts.String("issue"); v != "" {
n := 0
for _, ch := range v {
if ch >= '0' && ch <= '9' {
n = n*10 + int(ch-'0')
}
}
input.Issue = n
}
if v := opts.String("pr"); v != "" {
n := 0
for _, ch := range v {
if ch >= '0' && ch <= '9' {
n = n*10 + int(ch-'0')
}
}
input.PR = n
}
if v := opts.String("branch"); v != "" {
input.Branch = v
}
if v := opts.String("tag"); v != "" {
input.Tag = v
}
if input.Issue == 0 && input.PR == 0 && input.Branch == "" && input.Tag == "" {
input.Branch = "dev"
}
_, out, err := s.TestPrepWorkspace(context.Background(), input)
if err != nil {
core.Print(nil, "error: %v", err)
return core.Result{Value: err, OK: false}
}
core.Print(nil, "workspace: %s", out.WorkspaceDir)
core.Print(nil, "repo: %s", out.RepoDir)
core.Print(nil, "branch: %s", out.Branch)
core.Print(nil, "resumed: %v", out.Resumed)
core.Print(nil, "memories: %d", out.Memories)
core.Print(nil, "consumers: %d", out.Consumers)
if out.Prompt != "" {
core.Print(nil, "")
core.Print(nil, "--- prompt (%d chars) ---", len(out.Prompt))
core.Print(nil, "%s", out.Prompt)
}
return core.Result{OK: true}
},
})
c.Command("status", core.Command{
Description: "List agent workspace statuses",
Action: func(opts core.Options) core.Result {
wsRoot := WorkspaceRoot()
fsys := c.Fs()
r := fsys.List(wsRoot)
if !r.OK {
core.Print(nil, "no workspaces found at %s", wsRoot)
return core.Result{OK: true}
}
entries := r.Value.([]os.DirEntry)
if len(entries) == 0 {
core.Print(nil, "no workspaces")
return core.Result{OK: true}
}
for _, e := range entries {
if !e.IsDir() {
continue
}
statusFile := core.JoinPath(wsRoot, e.Name(), "status.json")
if sr := fsys.Read(statusFile); sr.OK {
core.Print(nil, " %s", e.Name())
}
}
return core.Result{OK: true}
},
})
c.Command("prompt", core.Command{
Description: "Build and display an agent prompt for a repo",
Action: func(opts core.Options) core.Result {
repo := opts.String("_arg")
if repo == "" {
core.Print(nil, "usage: core-agent prompt <repo> --task=\"...\"")
return core.Result{OK: false}
}
org := opts.String("org")
if org == "" {
org = "core"
}
task := opts.String("task")
if task == "" {
task = "Review and report findings"
}
repoPath := core.JoinPath(core.Env("DIR_HOME"), "Code", org, repo)
input := PrepInput{
Repo: repo,
Org: org,
Task: task,
Template: opts.String("template"),
Persona: opts.String("persona"),
}
prompt, memories, consumers := s.TestBuildPrompt(context.Background(), input, "dev", repoPath)
core.Print(nil, "memories: %d", memories)
core.Print(nil, "consumers: %d", consumers)
core.Print(nil, "")
core.Print(nil, "%s", prompt)
return core.Result{OK: true}
},
})
c.Command("extract", core.Command{
Description: "Extract a workspace template to a directory",
Action: func(opts core.Options) core.Result {
tmpl := opts.String("_arg")
if tmpl == "" {
tmpl = "default"
}
target := opts.String("target")
if target == "" {
target = core.Path("Code", ".core", "workspace", "test-extract")
}
data := &lib.WorkspaceData{
Repo: "test-repo",
Branch: "dev",
Task: "test extraction",
Agent: "codex",
}
core.Print(nil, "extracting template %q to %s", tmpl, target)
if err := lib.ExtractWorkspace(tmpl, target, data); err != nil {
return core.Result{Value: err, OK: false}
}
fsys := c.Fs()
r := fsys.List(target)
if r.OK {
for _, e := range r.Value.([]os.DirEntry) {
marker := " "
if e.IsDir() {
marker = "/"
}
core.Print(nil, " %s%s", e.Name(), marker)
}
}
core.Print(nil, "done")
return core.Result{OK: true}
},
})
c.Command("run/task", core.Command{Description: "Run a single task end-to-end", Action: s.cmdRunTaskFactory(ctx)})
c.Command("run/orchestrator", core.Command{Description: "Run the queue orchestrator (standalone, no MCP)", Action: s.cmdOrchestratorFactory(ctx)})
c.Command("prep", core.Command{Description: "Prepare a workspace: clone repo, build prompt", Action: s.cmdPrep})
c.Command("status", core.Command{Description: "List agent workspace statuses", Action: s.cmdStatus})
c.Command("prompt", core.Command{Description: "Build and display an agent prompt for a repo", Action: s.cmdPrompt})
c.Command("extract", core.Command{Description: "Extract a workspace template to a directory", Action: s.cmdExtract})
}
// cmdRunTaskFactory returns the run/task action closure (needs ctx for DispatchSync).
func (s *PrepSubsystem) cmdRunTaskFactory(ctx context.Context) func(core.Options) core.Result {
return func(opts core.Options) core.Result { return s.cmdRunTask(ctx, opts) }
}
func (s *PrepSubsystem) cmdRunTask(ctx context.Context, opts core.Options) core.Result {
repo := opts.String("repo")
agent := opts.String("agent")
task := opts.String("task")
issueStr := opts.String("issue")
org := opts.String("org")
if repo == "" || task == "" {
core.Print(nil, "usage: core-agent run task --repo=<repo> --task=\"...\" --agent=codex [--issue=N] [--org=core]")
return core.Result{OK: false}
}
if agent == "" {
agent = "codex"
}
if org == "" {
org = "core"
}
issue := parseIntStr(issueStr)
core.Print(os.Stderr, "core-agent run task")
core.Print(os.Stderr, " repo: %s/%s", org, repo)
core.Print(os.Stderr, " agent: %s", agent)
if issue > 0 {
core.Print(os.Stderr, " issue: #%d", issue)
}
core.Print(os.Stderr, " task: %s", task)
core.Print(os.Stderr, "")
result := s.DispatchSync(ctx, DispatchSyncInput{
Org: org, Repo: repo, Agent: agent, Task: task, Issue: issue,
})
if !result.OK {
core.Print(os.Stderr, "FAILED: %v", result.Error)
return core.Result{Value: result.Error, OK: false}
}
core.Print(os.Stderr, "DONE: %s", result.Status)
if result.PRURL != "" {
core.Print(os.Stderr, " PR: %s", result.PRURL)
}
return core.Result{OK: true}
}
// cmdOrchestratorFactory returns the orchestrator action closure (needs ctx for blocking).
func (s *PrepSubsystem) cmdOrchestratorFactory(ctx context.Context) func(core.Options) core.Result {
return func(opts core.Options) core.Result { return s.cmdOrchestrator(ctx, opts) }
}
func (s *PrepSubsystem) cmdOrchestrator(ctx context.Context, _ core.Options) core.Result {
core.Print(os.Stderr, "core-agent orchestrator running (pid %s)", core.Env("PID"))
core.Print(os.Stderr, " workspace: %s", WorkspaceRoot())
core.Print(os.Stderr, " watching queue, draining on 30s tick + completion poke")
<-ctx.Done()
core.Print(os.Stderr, "orchestrator shutting down")
return core.Result{OK: true}
}
func (s *PrepSubsystem) cmdPrep(opts core.Options) core.Result {
repo := opts.String("_arg")
if repo == "" {
core.Print(nil, "usage: core-agent prep <repo> --issue=N|--pr=N|--branch=X --task=\"...\"")
return core.Result{OK: false}
}
input := PrepInput{
Repo: repo,
Org: opts.String("org"),
Task: opts.String("task"),
Template: opts.String("template"),
Persona: opts.String("persona"),
DryRun: opts.Bool("dry-run"),
}
if v := opts.String("issue"); v != "" {
input.Issue = parseIntStr(v)
}
if v := opts.String("pr"); v != "" {
input.PR = parseIntStr(v)
}
if v := opts.String("branch"); v != "" {
input.Branch = v
}
if v := opts.String("tag"); v != "" {
input.Tag = v
}
if input.Issue == 0 && input.PR == 0 && input.Branch == "" && input.Tag == "" {
input.Branch = "dev"
}
_, out, err := s.TestPrepWorkspace(context.Background(), input)
if err != nil {
core.Print(nil, "error: %v", err)
return core.Result{Value: err, OK: false}
}
core.Print(nil, "workspace: %s", out.WorkspaceDir)
core.Print(nil, "repo: %s", out.RepoDir)
core.Print(nil, "branch: %s", out.Branch)
core.Print(nil, "resumed: %v", out.Resumed)
core.Print(nil, "memories: %d", out.Memories)
core.Print(nil, "consumers: %d", out.Consumers)
if out.Prompt != "" {
core.Print(nil, "")
core.Print(nil, "--- prompt (%d chars) ---", len(out.Prompt))
core.Print(nil, "%s", out.Prompt)
}
return core.Result{OK: true}
}
func (s *PrepSubsystem) cmdStatus(opts core.Options) core.Result {
wsRoot := WorkspaceRoot()
fsys := s.core.Fs()
r := fsys.List(wsRoot)
if !r.OK {
core.Print(nil, "no workspaces found at %s", wsRoot)
return core.Result{OK: true}
}
entries := r.Value.([]os.DirEntry)
if len(entries) == 0 {
core.Print(nil, "no workspaces")
return core.Result{OK: true}
}
for _, e := range entries {
if !e.IsDir() {
continue
}
statusFile := core.JoinPath(wsRoot, e.Name(), "status.json")
if sr := fsys.Read(statusFile); sr.OK {
core.Print(nil, " %s", e.Name())
}
}
return core.Result{OK: true}
}
func (s *PrepSubsystem) cmdPrompt(opts core.Options) core.Result {
repo := opts.String("_arg")
if repo == "" {
core.Print(nil, "usage: core-agent prompt <repo> --task=\"...\"")
return core.Result{OK: false}
}
org := opts.String("org")
if org == "" {
org = "core"
}
task := opts.String("task")
if task == "" {
task = "Review and report findings"
}
repoPath := core.JoinPath(core.Env("DIR_HOME"), "Code", org, repo)
input := PrepInput{
Repo: repo,
Org: org,
Task: task,
Template: opts.String("template"),
Persona: opts.String("persona"),
}
prompt, memories, consumers := s.TestBuildPrompt(context.Background(), input, "dev", repoPath)
core.Print(nil, "memories: %d", memories)
core.Print(nil, "consumers: %d", consumers)
core.Print(nil, "")
core.Print(nil, "%s", prompt)
return core.Result{OK: true}
}
func (s *PrepSubsystem) cmdExtract(opts core.Options) core.Result {
tmpl := opts.String("_arg")
if tmpl == "" {
tmpl = "default"
}
target := opts.String("target")
if target == "" {
target = core.Path("Code", ".core", "workspace", "test-extract")
}
data := &lib.WorkspaceData{
Repo: "test-repo",
Branch: "dev",
Task: "test extraction",
Agent: "codex",
}
core.Print(nil, "extracting template %q to %s", tmpl, target)
if err := lib.ExtractWorkspace(tmpl, target, data); err != nil {
return core.Result{Value: err, OK: false}
}
fsys := s.core.Fs()
r := fsys.List(target)
if r.OK {
for _, e := range r.Value.([]os.DirEntry) {
marker := " "
if e.IsDir() {
marker = "/"
}
core.Print(nil, " %s%s", e.Name(), marker)
}
}
core.Print(nil, "done")
return core.Result{OK: true}
}
// parseIntStr extracts digits from a string and returns the integer value.
func parseIntStr(s string) int {
n := 0
for _, ch := range s {
if ch >= '0' && ch <= '9' {
n = n*10 + int(ch-'0')
}
}
return n
}

View file

@ -355,6 +355,94 @@ func TestCmdWorkspaceDispatch_Good_Stub(t *testing.T) {
assert.True(t, r.OK)
}
// --- commands.go extracted methods ---
func TestCmdPrep_Bad_MissingRepo(t *testing.T) {
s, _ := testPrepWithCore(t, nil)
r := s.cmdPrep(core.NewOptions())
assert.False(t, r.OK)
}
func TestCmdPrep_Good_DefaultsToDev(t *testing.T) {
s, _ := testPrepWithCore(t, nil)
// Will fail (no local clone) but exercises the default branch logic
r := s.cmdPrep(core.NewOptions(core.Option{Key: "_arg", Value: "nonexistent-repo"}))
assert.False(t, r.OK) // expected — no local repo
}
func TestCmdStatus_Good_Empty(t *testing.T) {
s, _ := testPrepWithCore(t, nil)
r := s.cmdStatus(core.NewOptions())
assert.True(t, r.OK)
}
func TestCmdStatus_Good_WithWorkspaces(t *testing.T) {
s, _ := testPrepWithCore(t, nil)
wsRoot := WorkspaceRoot()
ws := filepath.Join(wsRoot, "ws-1")
os.MkdirAll(ws, 0o755)
data, _ := json.Marshal(WorkspaceStatus{Status: "completed", Repo: "test", Agent: "codex"})
os.WriteFile(filepath.Join(ws, "status.json"), data, 0o644)
r := s.cmdStatus(core.NewOptions())
assert.True(t, r.OK)
}
func TestCmdPrompt_Bad_MissingRepo(t *testing.T) {
s, _ := testPrepWithCore(t, nil)
r := s.cmdPrompt(core.NewOptions())
assert.False(t, r.OK)
}
func TestCmdPrompt_Good_DefaultTask(t *testing.T) {
s, _ := testPrepWithCore(t, nil)
r := s.cmdPrompt(core.NewOptions(core.Option{Key: "_arg", Value: "go-io"}))
assert.True(t, r.OK)
}
func TestCmdExtract_Good(t *testing.T) {
s, _ := testPrepWithCore(t, nil)
target := filepath.Join(t.TempDir(), "extract-test")
r := s.cmdExtract(core.NewOptions(
core.Option{Key: "_arg", Value: "default"},
core.Option{Key: "target", Value: target},
))
assert.True(t, r.OK)
}
func TestCmdRunTask_Bad_MissingArgs(t *testing.T) {
s, _ := testPrepWithCore(t, nil)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
r := s.cmdRunTask(ctx, core.NewOptions())
assert.False(t, r.OK)
}
func TestCmdRunTask_Bad_MissingTask(t *testing.T) {
s, _ := testPrepWithCore(t, nil)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
r := s.cmdRunTask(ctx, core.NewOptions(core.Option{Key: "repo", Value: "go-io"}))
assert.False(t, r.OK)
}
func TestCmdOrchestrator_Good_CancelledCtx(t *testing.T) {
s, _ := testPrepWithCore(t, nil)
ctx, cancel := context.WithCancel(context.Background())
cancel() // cancel immediately
r := s.cmdOrchestrator(ctx, core.NewOptions())
assert.True(t, r.OK)
}
func TestParseIntStr_Good(t *testing.T) {
assert.Equal(t, 42, parseIntStr("42"))
assert.Equal(t, 123, parseIntStr("issue-123"))
assert.Equal(t, 0, parseIntStr(""))
assert.Equal(t, 0, parseIntStr("abc"))
assert.Equal(t, 7, parseIntStr("#7"))
}
// --- Registration verification ---
func TestRegisterCommands_Good_AllRegistered(t *testing.T) {