fix(data): normalize a list working dir's trailing separator on write
A list working_dir stored as "C:\Dev\Tests\StaplerTracking\" broke every consumer that puts it on a Windows command line: argv rules read \" as an escaped quote, so the token never closes. "Open in terminal" passed wt.exe a starting directory of C:\Dev\Tests\StaplerTracking" and it failed with 0x8007010b; the same data had already corrupted the ConPTY list handler's arg list in August. Paths.TrimTrailingSeparator is now the single helper (replacing the copies in InteractiveLaunchSpecService and ClaudeHelpLauncher) and ListRepository applies it on Add/Update, which covers every writer: UI create, repo import, hub UpdateList, and MCP CreateList/UpdateList. OpenInTerminal also switches to ArgumentList so its quoting is correct regardless of what's stored.
This commit is contained in:
@@ -352,18 +352,12 @@ public sealed class InteractiveLaunchSpecService : IInteractiveLaunchSpecService
|
||||
return new LaunchSpec(repoDir, resolvedClaude, args, env);
|
||||
}
|
||||
|
||||
// Strips a trailing directory separator off a path bound for the CLI argument list. The ConPTY
|
||||
// host flattens Args into ONE Windows command line and quotes each token, so a token ending in
|
||||
// '\' escapes its own closing quote ("C:\repo\" parses as C:\repo" ...) and every following
|
||||
// argument is absorbed into the preceding variadic flag -- for a list handler that means
|
||||
// --add-dir swallows --append-system-prompt-file AND the positional kickoff, and the session
|
||||
// opens with no prompt at all. Only user-supplied list working dirs can carry one; the session
|
||||
// dirs we build never do. A bare root ("C:\", "/") is all separator and is left untouched.
|
||||
private static string TrimTrailingSeparator(string dir)
|
||||
{
|
||||
var trimmed = dir.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
|
||||
return trimmed.Length == 0 || trimmed.EndsWith(':') ? dir : trimmed;
|
||||
}
|
||||
// The ConPTY host flattens Args into ONE Windows command line and quotes each token, so a token
|
||||
// ending in '\' escapes its own closing quote and every following argument is absorbed into the
|
||||
// preceding variadic flag -- for a list handler that means --add-dir swallows
|
||||
// --append-system-prompt-file AND the positional kickoff, and the session opens with no prompt
|
||||
// at all. ListRepository normalizes on write now, but rows written before that still carry one.
|
||||
private static string TrimTrailingSeparator(string dir) => Paths.TrimTrailingSeparator(dir)!;
|
||||
|
||||
// Renders one task as a brief list item. A description can itself be arbitrary Markdown
|
||||
// (headings, lists, fenced code) — those must not merge into the brief's own task list, so
|
||||
|
||||
Reference in New Issue
Block a user