feat(agentic): expose completion pipeline as MCP tool

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Virgil 2026-04-01 20:22:00 +00:00
parent daf4611bfc
commit dfd1640d37
3 changed files with 65 additions and 0 deletions

View file

@ -11,6 +11,7 @@ import (
"dappco.re/go/agent/pkg/lib"
"dappco.re/go/agent/pkg/messages"
core "dappco.re/go/core"
"github.com/modelcontextprotocol/go-sdk/mcp"
)
// result := c.Action("agentic.dispatch").Run(ctx, core.NewOptions(
@ -154,6 +155,33 @@ func (s *PrepSubsystem) handleComplete(ctx context.Context, options core.Options
return s.Core().Task("agent.completion").Run(ctx, s.Core(), options)
}
// input := agentic.CompleteInput{Workspace: "/srv/.core/workspace/core/go-io/task-42"}
type CompleteInput struct {
Workspace string `json:"workspace"`
}
// out := agentic.CompleteOutput{Success: true, Workspace: "core/go-io/task-42"}
type CompleteOutput struct {
Success bool `json:"success"`
Workspace string `json:"workspace"`
}
func (s *PrepSubsystem) completeTool(ctx context.Context, _ *mcp.CallToolRequest, input CompleteInput) (*mcp.CallToolResult, CompleteOutput, error) {
if input.Workspace == "" {
return nil, CompleteOutput{}, core.E("agentic.complete", "workspace is required", nil)
}
result := s.handleComplete(ctx, core.NewOptions(core.Option{Key: "workspace", Value: input.Workspace}))
if !result.OK {
return nil, CompleteOutput{}, resultErrorValue("agentic.complete", result)
}
return nil, CompleteOutput{
Success: true,
Workspace: input.Workspace,
}, nil
}
// result := c.Action("agentic.qa").Run(ctx, core.NewOptions(
//
// core.Option{Key: "workspace", Value: "/path/to/workspace"},

View file

@ -357,6 +357,10 @@ func (s *PrepSubsystem) RegisterTools(server *mcp.Server) {
s.registerDispatchTool(server)
s.registerStatusTool(server)
s.registerResumeTool(server)
mcp.AddTool(server, &mcp.Tool{
Name: "agentic_complete",
Description: "Run the completion pipeline (QA → PR → Verify → Ingest → Poke) in the background.",
}, s.completeTool)
s.registerCreatePRTool(server)
s.registerListPRsTool(server)
s.registerClosePRTool(server)

View file

@ -12,6 +12,7 @@ import (
core "dappco.re/go/core"
"dappco.re/go/core/forge"
mcpsdk "github.com/modelcontextprotocol/go-sdk/mcp"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@ -609,6 +610,38 @@ func TestPrep_OnStartup_Good_RegistersPlatformCommandAlias(t *testing.T) {
assert.Contains(t, c.Commands(), "fleet/events")
}
func TestPrep_RegisterTools_Good_RegistersCompletionTool(t *testing.T) {
server := mcpsdk.NewServer(&mcpsdk.Implementation{Name: "test", Version: "0.1.0"}, &mcpsdk.ServerOptions{
Capabilities: &mcpsdk.ServerCapabilities{
Tools: &mcpsdk.ToolCapabilities{ListChanged: true},
},
})
subsystem := &PrepSubsystem{}
subsystem.RegisterTools(server)
client := mcpsdk.NewClient(&mcpsdk.Implementation{Name: "test", Version: "0.1.0"}, nil)
clientTransport, serverTransport := mcpsdk.NewInMemoryTransports()
serverSession, err := server.Connect(context.Background(), serverTransport, nil)
require.NoError(t, err)
t.Cleanup(func() { _ = serverSession.Close() })
clientSession, err := client.Connect(context.Background(), clientTransport, nil)
require.NoError(t, err)
t.Cleanup(func() { _ = clientSession.Close() })
result, err := clientSession.ListTools(context.Background(), nil)
require.NoError(t, err)
var toolNames []string
for _, tool := range result.Tools {
toolNames = append(toolNames, tool.Name)
}
assert.Contains(t, toolNames, "agentic_complete")
}
func TestPrep_OnStartup_Good_RegistersGenerateCommand(t *testing.T) {
t.Setenv("CORE_WORKSPACE", t.TempDir())
t.Setenv("CORE_AGENT_DISPATCH", "")