From 1dd6170dd41b367079b5e99ae1471cdcd274b5c6 Mon Sep 17 00:00:00 2001 From: Virgil Date: Thu, 2 Apr 2026 06:54:05 +0000 Subject: [PATCH] refactor(agentic): validate forge command inputs Co-Authored-By: Virgil --- pkg/agentic/commands_forge.go | 19 +++++++++++++++++++ pkg/agentic/commands_forge_test.go | 11 +++++++++++ 2 files changed, 30 insertions(+) diff --git a/pkg/agentic/commands_forge.go b/pkg/agentic/commands_forge.go index f74176d..99aa1e0 100644 --- a/pkg/agentic/commands_forge.go +++ b/pkg/agentic/commands_forge.go @@ -87,6 +87,18 @@ func parseForgeArgs(options core.Options) (org, repo string, num int64) { if v := options.String("number"); v != "" { num, _ = strconv.ParseInt(v, 10, 64) } + + if orgResult := core.ValidateName(org); orgResult.OK { + org = orgResult.Value.(string) + } else { + org = "" + } + + if repoResult := core.ValidateName(repo); repoResult.OK { + repo = repoResult.Value.(string) + } else { + repo = "" + } return } @@ -492,6 +504,13 @@ func (s *PrepSubsystem) cmdRepoList(options core.Options) core.Result { if org == "" { org = "core" } + orgResult := core.ValidateName(org) + if !orgResult.OK { + err, _ := orgResult.Value.(error) + core.Print(nil, "usage: core-agent repo list [--org=core]") + return core.Result{Value: core.E("agentic.cmdRepoList", "invalid org name", err), OK: false} + } + org = orgResult.Value.(string) repos, err := s.forge.Repos.ListOrgRepos(ctx, org) if err != nil { core.Print(nil, "error: %v", err) diff --git a/pkg/agentic/commands_forge_test.go b/pkg/agentic/commands_forge_test.go index bc1d425..bad742f 100644 --- a/pkg/agentic/commands_forge_test.go +++ b/pkg/agentic/commands_forge_test.go @@ -84,6 +84,17 @@ func TestCommandsforge_ParseForgeArgs_Ugly_NegativeNumber(t *testing.T) { assert.Equal(t, int64(-5), num, "negative numbers parse but are semantically invalid") } +func TestCommandsforge_ParseForgeArgs_Ugly_InvalidNames(t *testing.T) { + opts := core.NewOptions( + core.Option{Key: "org", Value: "bad/org"}, + core.Option{Key: "_arg", Value: "repo/with/slashes"}, + ) + org, repo, num := parseForgeArgs(opts) + assert.Empty(t, org) + assert.Empty(t, repo) + assert.Equal(t, int64(0), num) +} + // --- formatIndex Bad/Ugly --- func TestCommandsforge_FormatIndex_Bad_Negative(t *testing.T) {