Dashboard › cli › Distillation
f9e3efa7-10cc-453a-aa4c-46b899e49c31["lore_tm_v1_CQtK1y7x1v59IIqIml9Zf6tkk0AYSKpJ9r3ro1qhF3M","lore_tm_v1_rtKIiEbtldtF9y3KvrYRAjc6KD6-rUPvV0sX5xp7mqc","lore_tm_v1_byVwwO8PZb2n_tJSzrQoS3y2AXnJ7ZKtE92JjdtV8Vg","lore_tm_v1_dUvw6vujveTX8Pdmw0ph6b3BFbr9flyaCXYENUdX73s","lore_tm_v1_M_nB9-RKTC_WTFkXDSOMI3HsGl5gefD8654l-c6tNE8","lore_tm_v1_spW2AqkE3iSqU17WTQGVAkyX1ZE4lsN2Pp-NiXMywfU","lore_tm_v1_3L8w4iFXq43NVJqQeXalyC_TRgOrWyVfbzfXPlzeEbY","lore_tm_v1_uXvI3Y_LHNxwgE2BalcXJZQo8Su6eUbkuWE3Xr_XJt8","lore_tm_v1_WuWFfQqvtN43Rb8ZY6DKQuWe9_xJ2ktTFMCOMZ8o2HA","lore_tm_v1_5P36rM-8rJCZUNK4ow7BzdIfVbt5VHmRrRyZv1jhBVM","lore_tm_v1_EL5iDcfovzpd08LgKsd-sjHi8vkDICi-SG4_7ncYH-0","lore_tm_v1_fBQEaj1p4nEducfwuhEMuRpWjCFdKee4qEoezqUDwvk","lore_tm_v1_0OXBOEyH_cqWfdXOXQE8X_0jiyg-6eH6yfR8N2Xd75o","lore_tm_v1_r8h_gdpNu0WPR2xJYPw-U0idbJfA-QeUUkfvibqhZqY","lore_tm_v1_tvr4OcLB1psx6AZKZg8vVIi-CaruExLmZR59JsYJN0A","lore_tm_v1_nOqdMpnpwVx8IJwSFFjg6VZa7kETEjUZ8YrdMXI4FJM"]
Date: Sep 8, 2026
ALWAYS_STRIP are βalways stripped (command never sees them).β In packages/cli/src/lib/command.ts, ALWAYS_STRIP currently contains LOG_LEVEL_KEY.buildDeleteCommand() rule: βAlways inject --yes unless the command already defines it.β packages/cli/src/lib/mutate-command.ts also injects --force unless options?.noForceFlag or already defined, injects --dry-run unless options?.noDryRunFlag or already defined, and adds alias -y β --yes unless y already exists./. Therefore [<org>/]<conversation-id> has at most one slash: before the first slash is the org, the remainder is the conversation ID; without a slash, the entire value is the conversation ID and the org is auto-detected.packages/cli/src/lib/list-command.ts, the first positional argument is always the target using the org/project pattern.packages/cli/src/lib/which.ts, the command is passed as positional argument $1 so it is never interpolated.packages/cli/src/lib/command.ts defines global defaults for LOG_LEVEL_KEY, verbose, org, and project. mergeGlobalFlags() preserves command-owned flags, injects missing globals, strips injected keys before invoking the command, tracks commandOwnsOrg and commandOwnsProject, injects json when an output config exists and the command does not own it, and always builds fields from the output config.packages/cli/src/lib/command.ts derives short aliases from GLOBAL_FLAGS; a short alias is injected only when the command does not define the corresponding full flag and the short alias is not already present.enrichDocsWithSchema() in packages/cli/src/lib/command.ts appends formatted JSON field names and types to docs.fullDescription when outputConfig.schema exists and yields fields; it uses docs.fullDescription ?? docs.brief as the base so schema details appear in Stricli --help.apps/cli-docs/src/content/docs/commands/agent-conversation.md documents: sentry agent-conversation list [<org>] with --limit default "25" and range 1-1000, --query, --period default "7d", --fresh, and --cursor; and sentry agent-conversation view [<org>/]<conversation-id> with --fresh. Both support --json and --fields.sentry agent-conversation view conv-123, sentry agent-conversation view my-org/conv-123, and sentry agent-conversation view my-org/conv-123 --json. Git blame showed the earlier examples from commit f1966f6e1f used two positional tokens, sentry agent-conversation view my-org conv-123, before the command adopted the compound [<org>/]<conversation-id> target.parseConversationTarget() in packages/cli/src/commands/agent-conversation/view.ts trims its input, splits at the first /, auto-detects the org when no slash exists, and throws ContextError("Conversation ID", USAGE_HINT, []) if either segment of a slash-containing target is empty. USAGE_HINT is exactly "sentry agent-conversation view [<org>/]<conversation-id>".packages/cli/src/app.ts derives routesWithDefaultCommand dynamically from the route map. For a bare default-command route such as sentry issue, detectBareRouteGroup() returns Usage: sentry ${route} <command> [args]\nRun "sentry ${route} --help" to see available commands rather than exposing an UnsatisfiedPositionalError.packages/cli/src/app.ts handles plural-alias misuse by suggesting the singular form, and handles known command synonyms across three paths: UnexpectedPositionalError, domain-level CliError after a default view command consumes the synonym as a positional, and noCommandRegisteredForInput for routes without a default command. Known user mistakes skip Sentry capture.packages/cli/src/app.ts rethrows OutputError, AuthError with reason "not_authenticated" or "expired", and ApiError status 401 or 403 to outer middleware. Other command failures go through reportCliError(); comments specify that expected 401β499 API errors are silenced while 400 Bad Request is treated as a CLI bug.packages/cli/src/app.ts uses caseStyle: "allow-kebab-for-camel", allowArgumentEscapeSequence: true, and topLevelFlags: buildTopLevelFlags(). JSON help is rendered through renderJsonHelp(prefix, unprocessedInputs) rather than the former argv rewrite from --help --json to the help command.derivePositional() in packages/cli/script/generate-sdk.ts maps no positional parameters to null, an array positional to { name, variadic: true }, and each tuple entry to a separate PositionalEntry after cleaning its placeholder. A compound placeholder such as "org/version" remains one SDK parameter whose parser splits it, while separate tuple entries remain separate argv tokens.argv[0] and all remaining arguments were missing, making every multi-positional command unusable. The implemented design maps one SDK parameter per tuple entry.