Skip to content

Commit 5d9bf02

Browse files
committed
Merge PR #2554: fix: reject path separators in rig names (GH#2544)
Adds / and \ to invalid rig name characters and defensively strips paths in deriveBeadsPrefix. PR: #2554 Author: DreadPirateRobertz
2 parents 04e79ef + e26cc40 commit 5d9bf02

2 files changed

Lines changed: 16 additions & 6 deletions

File tree

internal/rig/manager.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -285,10 +285,11 @@ func (m *Manager) AddRig(opts AddRigOptions) (*Rig, error) {
285285

286286
// Validate rig name: reject characters that break agent ID parsing
287287
// Agent IDs use format <prefix>-<rig>-<role>[-<name>] with hyphens as delimiters
288-
if strings.ContainsAny(opts.Name, "-. ") {
289-
sanitized := strings.NewReplacer("-", "_", ".", "_", " ", "_").Replace(opts.Name)
288+
if strings.ContainsAny(opts.Name, "-. /\\") {
289+
sanitized := strings.NewReplacer("-", "_", ".", "_", " ", "_", "/", "_", "\\", "_").Replace(opts.Name)
290+
sanitized = strings.TrimLeft(sanitized, "_")
290291
sanitized = strings.ToLower(sanitized)
291-
return nil, fmt.Errorf("rig name %q contains invalid characters; hyphens, dots, and spaces are reserved for agent ID parsing. Try %q instead (underscores are allowed)", opts.Name, sanitized)
292+
return nil, fmt.Errorf("rig name %q contains invalid characters; hyphens, dots, spaces, and path separators are not allowed. Try %q instead (underscores are allowed)", opts.Name, sanitized)
292293
}
293294

294295
// Reject reserved names that collide with town-level infrastructure.
@@ -1063,6 +1064,10 @@ func (m *Manager) ensureGitignoreEntry(gitignorePath, entry string) error {
10631064
// deriveBeadsPrefix generates a beads prefix from a rig name.
10641065
// Examples: "gastown" -> "gt", "my-project" -> "mp", "foo" -> "foo"
10651066
func deriveBeadsPrefix(name string) string {
1067+
// Strip path separators — callers should validate names, but be defensive
1068+
name = filepath.Base(name)
1069+
name = strings.TrimLeft(name, "/\\")
1070+
10661071
// Remove common suffixes
10671072
name = strings.TrimSuffix(name, "-py")
10681073
name = strings.TrimSuffix(name, "-go")
@@ -1291,10 +1296,11 @@ func (m *Manager) RegisterRig(opts RegisterRigOptions) (*RegisterRigResult, erro
12911296
return nil, ErrRigExists
12921297
}
12931298

1294-
if strings.ContainsAny(opts.Name, "-. ") {
1295-
sanitized := strings.NewReplacer("-", "_", ".", "_", " ", "_").Replace(opts.Name)
1299+
if strings.ContainsAny(opts.Name, "-. /\\") {
1300+
sanitized := strings.NewReplacer("-", "_", ".", "_", " ", "_", "/", "_", "\\", "_").Replace(opts.Name)
1301+
sanitized = strings.TrimLeft(sanitized, "_")
12961302
sanitized = strings.ToLower(sanitized)
1297-
return nil, fmt.Errorf("rig name %q contains invalid characters; hyphens, dots, and spaces are reserved for agent ID parsing. Try %q instead (underscores are allowed)", opts.Name, sanitized)
1303+
return nil, fmt.Errorf("rig name %q contains invalid characters; hyphens, dots, spaces, and path separators are not allowed. Try %q instead (underscores are allowed)", opts.Name, sanitized)
12981304
}
12991305

13001306
for _, reserved := range reservedRigNames {

internal/rig/manager_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,10 @@ func TestDeriveBeadsPrefix(t *testing.T) {
731731
// With language suffixes stripped
732732
{"myproject-py", "my"},
733733
{"myproject-go", "my"},
734+
735+
// Path-like names (slashes stripped)
736+
{"/my_app", "ma"},
737+
{"/some/deep/path", "pa"},
734738
}
735739

736740
for _, tt := range tests {

0 commit comments

Comments
 (0)