Dashboard › cli › Distillation
920d58a5-4552-4450-a060-a735287d2b87["lore_tm_v1_p6x2bg4TNdjOf8tw6NRwc90krm2kU1KYwxvFWm2Bs0c","lore_tm_v1_ZfqmA0Xv-Zfk0_LHreWbn9QgTMpI899x-QoUt0DPgJg","lore_tm_v1_5x243QS2QESVGJ0b3Ag1LHaA8MWTyVYsAKDw8HYw2Sk","lore_tm_v1_L2ffSgUyJc6sBJUFz7WoN3LmIxOEz5W-mPWMEwqRVMg","lore_tm_v1_L-zYgnESHR0VfkX6GAS9KRpNpZICcaamygNDMq3hWm4","lore_tm_v1_1QKNiQ4_0QkZl97tkti8cP5Ww43qdFhL9uwNSJ6t610"]
packages/cli/script/check-fragments.ts changed subcommand-coverage validation so commands with canonical metadata examples (cmd.examples.length > 0) are skipped; fragments are now required only for commands lacking canonical examples.packages/cli/script/generate-command-docs.ts documentation now describes generated pages as combining: 1. auto-generated reference and examples from CLI metadata or the environment registry, and 2. hand-written guides and tips from docs/src/fragments/; fragments are the source of truth only for content that cannot live in command definitions.packages/cli/script/generate-command-docs.ts now imports formatCommandExamples from ./generate-skill-markdown.js and appends its non-empty output in generateCommandSection(cmd), making canonical command examples appear in generated website command documentation.formatPositionalsTable() in packages/cli/script/generate-command-docs.ts now renders required positionals as `<placeholder>` and optional positionals as `[<placeholder>]`; previously all positionals were rendered as required.packages/cli/script/generate-skill-markdown.ts added exported formatCommandExamples(examples: readonly string[]); it returns "" for no examples, otherwise produces an **Examples:** section with one bash fenced block and examples separated by blank lines via examples.join("\n\n").packages/cli/script/generate-skill.ts now imports and uses shared formatCommandExamples() in generateFullCommandDoc(cmd) instead of constructing the canonical examples section inline; output structure remains **Examples:** followed by a bash fenced block with blank lines between examples.packages/cli/src/commands/agent-conversation/list.ts is 231 lines and defines sentry agent-conversation list, which lists recent agent conversations for an organization.packages/cli/src/commands/agent-conversation/list.ts introduced reusable POSITIONAL: an optional tuple positional named org, brief Organization slug, parsed with String; USAGE_HINT is generated as sentry ${COMMAND_NAME} ${getPositionalString(POSITIONAL)} and is passed to ContextError when organization resolution fails.agent-conversation list canonical metadata examples, in order, are: 1. sentry agent-conversation list — “List recent agent conversations”; 2. sentry agent-conversation list my-org — “Explicit organization”; 3. sentry agent-conversation list --limit 50 --period 24h — “Show more, last 24 hours”; 4. sentry agent-conversation list -q "has:errors" — “Filter conversations”; 5. sentry agent-conversation list my-org -c next — “Paginate through results”.agent-conversation list full description now says the organization is auto-detected when omitted; examples were moved out of fullDescription into structured docs.examples.agent-conversation list supports optional org, limit, query, and period; aliases include n: "limit", q: "query", and ...PERIOD_ALIASES. DEFAULT_PERIOD is "7d" and PAGINATION_KEY is "agent-conversation-list".agent-conversation list resolves the organization with resolveOrg({ org: target, cwd }), creates pagination context from resource "agent-conversation", resolved org, query key q, and serializeTimeRange(flags.period), then calls listConversations(org, { query, limit, cursor, ...timeRangeToApiParams(period) }).agent-conversation list JSON output has envelope fields data, hasMore, and boolean hasPrev, conditionally adding nextCursor; --fields filtering maps each conversation through filterFields(c, fields).agent-conversation list human output is "No conversations on this page." when the current page is empty but hasMore, "No agent conversations found." when empty without more pages, otherwise Agent conversations in ${org}:\n\n${formatConversationTable(conversations)}.agent-conversation list progress text is Fetching conversations (up to ${flags.limit})...; pagination state is advanced with advancePaginationState(PAGINATION_KEY, contextKey, direction, nextCursor), and next/previous hints preserve -q "${flags.query}" plus a non-default period through appendPeriodHint(parts, flags.period, DEFAULT_PERIOD)./.packages/cli/src/commands/agent-conversation/view.ts is 142 lines and defines sentry agent-conversation view with custom usage [<org>/]<conversation-id>.parseConversationTarget(target) in packages/cli/src/commands/agent-conversation/view.ts trims the target; with no slash it returns the entire value as conversationId, while one slash separates the organization before it from the conversation ID after it.parseConversationTarget(target) rejects multiple slashes using validationError("Conversation target must contain at most one '/'.", [USAGE_HINT], "conversation-id"); it rejects empty organization or conversation-ID segments using validationError("Conversation target must include both an organization and conversation ID when using '/'.", [USAGE_HINT], "conversation-id").agent-conversation view retains a missing-target check: blank or absent input throws new ContextError("Conversation ID", USAGE_HINT, []); failure to resolve the optional organization throws new ContextError("Organization", USAGE_HINT).agent-conversation view canonical metadata examples, in order, are: 1. sentry agent-conversation view conv-123 — “View full transcript (organization auto-detected)”; 2. sentry agent-conversation view my-org/conv-123 — “Explicit organization”; 3. sentry agent-conversation view my-org/conv-123 --json — “JSON output”.agent-conversation view moved examples out of fullDescription into structured docs.examples; its description says the organization is optional, auto-detected from project context when omitted, and can be explicitly supplied by prefixing the ID with an organization slug.agent-conversation view positional metadata uses placeholder "org/conversation-id" and brief "[<org>/]<conversation-id> - Org (optional) and conversation ID"; it supports FRESH_FLAG with FRESH_ALIASES and calls applyFreshFlag(flags) before target resolution.agent-conversation view resolves the organization with resolveOrg({ org: orgArg, cwd }), displays progress message "Fetching conversation spans...", calls getConversationSpans(org, conversationId), builds output with buildTranscriptResult(conversationId, org, spans, title), copies truncated onto the result, and yields CommandOutput<TranscriptResult>.packages/cli/src/lib/api/conversations.ts, re-exported by packages/cli/src/lib/api-client.ts, and consumed by packages/cli/src/commands/agent-conversation/list.ts and packages/cli/src/commands/agent-conversation/view.ts: listConversations and getConversationSpans.packages/cli/src/lib/api/conversations.ts is 177 lines and uses private /organizations/{org}/agents/conversations/ endpoints not yet available in @sentry/api / getsentry/sentry-api-schema; it uses apiRequestToRegion, local Valibot schemas, and parseLinkHeader, following the logs.ts / traces.ts pattern.fetchConversationsPage(regionUrl, orgSlug, options, perPage) sends per_page plus optional statsPeriod, start, end, cursor, query, and project to /organizations/${orgSlug}/agents/conversations/; response validation is array(ConversationListItemSchema), and its return is { data, nextCursor }.listConversations(orgSlug, options = {}) accepts optional query, limit, cursor, statsPeriod, start, end, and project; it resolves the organization region with resolveOrgRegion(orgSlug) and uses paginate() to transparently fetch multiple pages when the limit exceeds API_MAX_PER_PAGE, bounded by MAX_PAGINATION_PAGES.getConversationSpans(orgSlug, conversationId, options = {}) accepts optional statsPeriod, project, and perPage; defaults are per_page: "1000" and statsPeriod: "30d".getConversationSpans() requests /organizations/${orgSlug}/agents/conversations/${encodeURIComponent(conversationId)}/ with AgentConversationDetailsSchema, accumulates data.spans, captures data.title only from page 0, and follows link-header cursors for at most MAX_PAGINATION_PAGES.getConversationSpans() returns { spans, truncated, title }, where truncated is !!cursor after pagination; when truncated it logs Pagination limit reached (${MAX_PAGINATION_PAGES} pages, ${spans.length} spans). Conversation transcript may be incomplete. through logger tag "api.conversations".