fix: replace shell-quote with literal arg splitter to handle # in claude_args values#982
Conversation
Fixes anthropics#980 shell-quote's parse() treats # as a shell comment character, returning a {comment: '...'} object. The .filter(arg => typeof arg === 'string') call drops this, leaving the preceding flag with no value. The parser then sets that flag to null, which fails AJV schema validation and crashes the action. Replacement: splitArgString() splits on whitespace, respects double-quoted strings, and never interprets shell metacharacters. claude_args is a list of CLI flags, not a shell command — # should never be treated as a comment.
|
Hi, just checking in on this PR — wanted to make sure it hadn't slipped through the cracks. Happy to rebase, add tests, or make any changes needed to move it forward. Thanks for your time! |
|
pinging for review — |
|
Hi! It's been about 5 days since any activity on this fix. The |
|
Closing in favor of #1055 |
Fixes #980
Problem
shell-quote'sparse()treats#as a shell comment character, returning a{comment: "..."}object instead of a string. The.filter(arg => typeof arg === "string")call drops this object, leaving the preceding flag with no value. The parser then sets that flag tonull, which fails AJV schema validation and crashes the action before any API call is made.Reproduction:
→
append-system-prompt: null→ AJV validation crashSolution
Replace
shell-quotewith a purpose-builtsplitArgString()that:#,!,~,$are all treated as literal charactersclaude_argsis a list of CLI flags, not a shell command. There's no reason for#to be interpreted as a comment.Changes
base-action/src/parse-sdk-options.ts: AddsplitArgString(), replaceparseShellArgs(claudeArgs).filter(...)withsplitArgString(claudeArgs)Workaround for users (until merged)
Double-quote values containing
#:Testing
Manually verified against the reproduction case. Happy to add unit tests to the test suite if you can point me to the right test file — I see
__tests__/referenced but wasn't sure of the exact conventions here.