You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Consolidate target parsing into positional parsers #1564
parseOrgTarget and parseOrgProjectTarget (packages/cli/src/lib/completion-target.ts, added in #1557) are identity parsers. They only mark a positional's completion kind. Each command still parses and validates the raw string itself inside func, using parseOrgProjectArg, parseSlashSeparatedArg, parseIssueArg, and similar helpers from src/lib/arg-parsing.ts.
Commands that share a target syntax repeat the same parse call, and the positional definition and its parsing live in different places.
Some flows depend on the raw string reaching func today: buildListCommand rewrites the first positional to catch plural-alias subcommand typos, maybeRecoverWithHelp treats a literal help argument as --help, and some commands auto-recover from the wrong entity type. Parse failures currently surface as CliError subclasses with specific exit codes. Errors thrown from a Stricli parser go through Stricli's argument-error handling instead.
Fixed by #1594 (merged 2026-10-23), which adds the target positional parser and moves trace list, replay list, feedback list, project view and project delete onto it. The PR used Refs #1564, so it didn't close this automatically. Closing per @BYK.
Reopening: #1594 landed the lazy parsed/resolved positional mechanism and migrated trace list, replay list, feedback list, project view and project delete, but the migration and some hardening are still open.
Harden destructive checks: right now the guard only runs when a destructive command reads .resolved. A command that reads .parsed and then mutates skips it. buildListCommand's re-wrap also drops the destructive mark (no destructive list commands exist today, so this can't trigger yet). The require-target-resolution lint rule is easy to get around.
LazyPositional: memoize parse failures (a failing .parsed re-parses on every read) and avoid unhandled rejections when .resolved is read but never awaited.
Migrate any remaining unblocked positionals. log list, replay view and replay download are variadic or depend on the number of arguments, so they stay in func.
ref(cli): Parse target positionals in Stricli's argument scanner #1655 (new): target positionals now parse in Stricli's argument scanner. Every argument parse error exits 252, positionals included, and the exit code docs say so. Pasting a Sentry URL as a target no longer switches the CLI to that URL's server during parsing; that now happens when the target resolves, after the auth guard. The destructive-command check runs in buildCommand, so it no longer depends on the command reading target.resolved. ref(cli): Parse target positionals in Stricli's argument scanner #1655 also replaces the parse-memoization and destructive-guard hardening I mentioned earlier.
Still to do: migrate LIST_TARGET_POSITIONAL users, including agent-conversation list, once #1575 lands, and look at the issue and dashboard targets after #1572. log list, replay view and replay download keep parsing in func.
Activity
linear-code commentedon Oct 20, 2026
MCP-1099
ref(cli): Hand commands parsed targets instead of a lazy wrapper
ref(cli): Parse target positionals lazily behind the parsed type
ref(cli): Bind target resolution to the positional as a lazy promise
ref(cli): Derive target command names and guard destructive targets
ref(cli): Replace the target Proxy with a LazyPositional class
feat(cli): Parse and resolve org/project targets in their positional (#…
sentry-junior commentedon Oct 23, 2026
Fixed by #1594 (merged 2026-10-23), which adds the target positional parser and moves
trace list,replay list,feedback list,project viewandproject deleteonto it. The PR usedRefs #1564, so it didn't close this automatically. Closing per @BYK.fix(cli): Keep CliError exit codes for argument parser failures
sentry-junior commentedon Oct 23, 2026
Reopening: #1594 landed the lazy parsed/resolved positional mechanism and migrated
trace list,replay list,feedback list,project viewandproject delete, but the migration and some hardening are still open.Open PRs that this issue depends on
LIST_TARGET_POSITIONALusers, includingagent-conversation listNew PRs
exploreontoorgOptionalTarget, with org/project shell completionCliErrorexit code when a flag or positional parser throws (it used to exit with 252)Next, in priority order
.resolved. A command that reads.parsedand then mutates skips it.buildListCommand's re-wrap also drops the destructive mark (no destructive list commands exist today, so this can't trigger yet). Therequire-target-resolutionlint rule is easy to get around.LazyPositional: memoize parse failures (a failing.parsedre-parses on every read) and avoid unhandled rejections when.resolvedis read but never awaited.log list,replay viewandreplay downloadare variadic or depend on the number of arguments, so they stay infunc.I'll link the new PRs here as I open them.
ref(cli): Move explore onto the org-optional target positional (#1650)
sentry-junior commentedon Oct 25, 2026
Status update:
exploreonorgOptionalTarget): merged.CliError's exit code when an argument fails to parse.buildCommand, so it no longer depends on the command readingtarget.resolved. ref(cli): Parse target positionals in Stricli's argument scanner #1655 also replaces the parse-memoization and destructive-guard hardening I mentioned earlier.Still to do: migrate
LIST_TARGET_POSITIONALusers, includingagent-conversation list, once #1575 lands, and look at the issue and dashboard targets after #1572.log list,replay viewandreplay downloadkeep parsing infunc.feat(cli): Report argument parse errors to Sentry
ref(cli): Parse target positionals in Stricli's argument scanner (#1655)