From 2802aef6b4492d2847ec7c6f974e3474f22da4f3 Mon Sep 17 00:00:00 2001 From: Virgil Date: Wed, 1 Apr 2026 22:57:37 +0000 Subject: [PATCH] feat(agentic): accept variables alias for flow preview Co-Authored-By: Virgil --- pkg/agentic/commands.go | 4 +-- pkg/agentic/commands_flow_test.go | 60 +++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/pkg/agentic/commands.go b/pkg/agentic/commands.go index 664a4e5..ebc7c8f 100644 --- a/pkg/agentic/commands.go +++ b/pkg/agentic/commands.go @@ -94,12 +94,12 @@ func (s *PrepSubsystem) cmdFlowPreview(options core.Options) core.Result { func (s *PrepSubsystem) runFlowCommand(options core.Options, commandLabel string) core.Result { flowPath := optionStringValue(options, "_arg", "path", "slug") if flowPath == "" { - core.Print(nil, "usage: core-agent %s [--dry-run] [--var=key=value] [--vars='{\"key\":\"value\"}']", commandLabel) + core.Print(nil, "usage: core-agent %s [--dry-run] [--var=key=value] [--vars='{\"key\":\"value\"}'] [--variables='{\"key\":\"value\"}']", commandLabel) return core.Result{Value: core.E("agentic.cmdRunFlow", "flow path or slug is required", nil), OK: false} } dryRun := optionBoolValue(options, "dry_run", "dry-run") - variables := optionStringMapValue(options, "var", "vars") + variables := optionStringMapValue(options, "var", "vars", "variables") flowResult := readFlowDocument(flowPath, variables) if !flowResult.OK { diff --git a/pkg/agentic/commands_flow_test.go b/pkg/agentic/commands_flow_test.go index ca92533..fc99a50 100644 --- a/pkg/agentic/commands_flow_test.go +++ b/pkg/agentic/commands_flow_test.go @@ -4,6 +4,7 @@ package agentic import ( "testing" + "time" core "dappco.re/go/core" "github.com/stretchr/testify/assert" @@ -105,3 +106,62 @@ func TestCommandsFlow_CmdRunFlow_Ugly_InvalidYaml(t *testing.T) { require.True(t, ok) assert.Contains(t, err.Error(), "invalid flow definition") } + +func TestCommandsFlow_CmdFlowPreview_Good_VariablesAlias(t *testing.T) { + root := t.TempDir() + flowPath := core.JoinPath(root, "preview.yaml") + fs.Write(flowPath, ""+ + "name: \"{{NAME}} deployment\"\n"+ + "description: \"Preview flow\"\n"+ + "steps:\n"+ + " - name: \"{{STEP}}\"\n"+ + " run: \"echo {{VALUE}}\"\n", + ) + + s := &PrepSubsystem{ + ServiceRuntime: core.NewServiceRuntime(core.New(), AgentOptions{}), + backoff: make(map[string]time.Time), + failCount: make(map[string]int), + } + + output := captureStdout(t, func() { + r := s.cmdFlowPreview(core.NewOptions( + core.Option{Key: "_arg", Value: flowPath}, + core.Option{Key: "variables", Value: map[string]any{ + "NAME": "release", + "STEP": "lint", + "VALUE": "ok", + }}, + )) + assert.True(t, r.OK) + }) + + assert.Contains(t, output, "name: release deployment") + assert.Contains(t, output, "1. lint") +} + +func TestCommandsFlow_CmdFlowPreview_Bad_MissingPath(t *testing.T) { + s := &PrepSubsystem{ + ServiceRuntime: core.NewServiceRuntime(core.New(), AgentOptions{}), + backoff: make(map[string]time.Time), + failCount: make(map[string]int), + } + + r := s.cmdFlowPreview(core.NewOptions()) + assert.False(t, r.OK) +} + +func TestCommandsFlow_CmdFlowPreview_Ugly_InvalidYaml(t *testing.T) { + root := t.TempDir() + flowPath := core.JoinPath(root, "broken.yaml") + fs.Write(flowPath, "name: [broken\nsteps:\n - name: test\n") + + s := &PrepSubsystem{ + ServiceRuntime: core.NewServiceRuntime(core.New(), AgentOptions{}), + backoff: make(map[string]time.Time), + failCount: make(map[string]int), + } + + r := s.cmdFlowPreview(core.NewOptions(core.Option{Key: "_arg", Value: flowPath})) + assert.False(t, r.OK) +}