// This file implements shell-style argument tokenization for prompt templates // (US-001, #331). A template invocation like // // /component Button "click handler" // // arrives at the expander as the raw string `Button "click handler"`; the // expander needs positional args ($1, $@, ...), so the string must be split into // ["Button", "click handler"] honoring shell quoting rules: double and single // quotes group a single argument, surrounding quotes are stripped, and internal // whitespace is preserved. // // Rather than hand-roll a tokenizer, we reuse a mature shell-quoting library // (github.com/kballard/go-shellquote), per the project's "reuse rather than reinvent" rule. package runtime import "github.com/kballard/go-shellquote" // SplitArgs tokenizes a raw argument string using shell-style quoting rules. // Double quotes ("a b") and single quotes ('a b') each group one argument; // surrounding quotes are stripped and internal whitespace is preserved. An empty // (or all-whitespace) input yields an empty non-nil slice with no error. An // unterminated quote yields an error, so the caller can fall back to treating // the whole string as $ARGUMENTS rather than feeding a malformed arg list to the // template engine. func SplitArgs(s string) ([]string, error) { parts, err := shellquote.Split(s) if err != nil { return nil, err } if parts == nil { return []string{}, nil } return parts, nil }