Dashboard › cli › Session 1NxZeEvDC2YX
1NxZeEvDC2YXtn9tkConduct a fresh, independent, read-only correctness review in /home/byk/Code/getsentry/cli-pr-1558. Do not change files, refs, commits, branches, worktrees, generated files, or GitHub state. This is a mandatory merge-gate review and your final response must never be empty.
Immutable revision to verify before AND after review:
git diff --binary ec83887a16f780f32fba4b7d710bad262dba3a22...ac72db51b18bb3e23999483233c9ad02d72ea531: e24b72e24667e4605f6e839f22c9df55f4d6662c4aaff28ed126b8e1637bcbc6Review every changed file and relevant surrounding source/tests. Check behavior, compatibility, type contracts, generated docs/skills, Stricli parsing and help, metadata precedence/fallback, tuple optionality, array/variadic semantics, target parsing/errors, and test quality. Explicitly verify the prior defects:
sentry agent-conversation view with no target reaches ContextError and exit 22 through actual Stricli dispatch; a supplied blank target remains fielded ValidationError/exit 21.sentry agent-conversation --help renders canonical sentry agent-conversation view [<org>/]<conversation-id> and never raw <org/conversation-id>.<issue...> rather than [<issue...>], while optional tuples remain bracketed and required tuples remain unbracketed.
Look independently for any other regression. Safe read-only test commands are allowed; do not run generators/formatters or commands that mutate files.Required output: findings first, ordered by severity. Label each PASS, CONCERN, or MUST-FIX and cite exact file:line evidence. Every defect must include a concrete fix and deterministic regression. If no defects exist, explicitly say PASS: no correctness findings and provide concrete evidence for each prior defect plus residual test risks. ...
No files found
<path>/home/byk/Code/getsentry/cli-pr-1558/AGENTS.md</path> <type>file</type> <content> 1: # Jared (Outpost agent) 2: 3: Autonomous GitHub coding agent. Work in `/workspace/repo`. 4: 5: ## Model tiers 6: 7: The primary model is chosen per event (see `src/agents/models.ts`): heavy for 8: code-producing situations, cheaper for lightweight ones. 9: 10: | Role | Subagent | Model | 11: | --- | --- | --- | 12: | Triage / plan / review (heavy) | (primary Jared) | Claude Opus 4.8 | 13: | Triage / plan / review (light) | (primary Jared) | xAI Grok 4.3 | 14: | Explore | `explore` | OpenAI gpt-5-mini | 15: | Implement | `implement` | Moonshot kimi-k2.7-code | 16: | Ship (commit/push/PR) | `ship` | xAI Grok (`grok-build-0.1`) | 17: 18: Pipeline: triage → explore → plan → implement → review → ship. 19: (`worker` is a deprecated alias of `implement`.) 20: 21: Operators also talk to Jared directly from the Outpost dashboard. ...
No files found
No files found
No files found
<path>/home/byk/Code/getsentry/cli-pr-1558</path> <type>directory</type> <entries> .craft.yml .git .github/ .gitignore .lore.md .nojekyll .npmrc AGENTS.md apps/ CHANGELOG.md codemods/ docs/ LICENSE.md node_modules/ package.json packages/ pnpm-lock.yaml pnpm-workspace.yaml README.md (19 entries) </entries>
ac72db51b18bb3e23999483233c9ad02d72ea531 ec83887a16f780f32fba4b7d710bad262dba3a22 ac72db51b18bb3e23999483233c9ad02d72ea531 92109205f179b9b3cad90ca4df73a855d75d64ba 92109205f179b9b3cad90ca4df73a855d75d64ba
ec83887a16f780f32fba4b7d710bad262dba3a22 e24b72e24667e4605f6e839f22c9df55f4d6662c4aaff28ed126b8e1637bcbc6 -
# branch.oid ac72db51b18bb3e23999483233c9ad02d72ea531 # branch.head fix/agent-conversation-reference-root-cause # branch.upstream origin/pr-1558
M apps/cli-docs/src/fragments/commands/agent-conversation.md M packages/cli/plugins/sentry-cli/skills/sentry-cli/SKILL.md M packages/cli/plugins/sentry-cli/skills/sentry-cli/references/agent-conversation.md M packages/cli/plugins/sentry-cli/skills/sentry-cli/references/alert.md M packages/cli/plugins/sentry-cli/skills/sentry-cli/references/cli.md M packages/cli/plugins/sentry-cli/skills/sentry-cli/references/explore.md M packages/cli/plugins/sentry-cli/skills/sentry-cli/references/feedback.md M packages/cli/plugins/sentry-cli/skills/sentry-cli/references/init.md M packages/cli/plugins/sentry-cli/skills/sentry-cli/references/issue.md M packages/cli/plugins/sentry-cli/skills/sentry-cli/references/monitor.md M packages/cli/plugins/sentry-cli/skills/sentry-cli/references/org.md M packages/cli/plugins/sentry-cli/skills/sentry-cli/references/project.md M packages/cli/plugins/sentry-cli/skills/sentry-cli/references/release.md M packages/cli/plugins/sentry-cli/skills/sentry-cli/references/repl...
/home/byk/Code/getsentry/cli-pr-1558/AGENTS.md /home/byk/Code/getsentry/cli-pr-1558/packages/cli/CONTRIBUTING.md /home/byk/Code/getsentry/cli-pr-1558/packages/cli/AGENTS.md
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/AGENTS.md</path> <type>file</type> <content> 1: # AGENTS.md 2: 3: Guidelines for AI agents working in this codebase. 4: 5: ## Project Overview 6: 7: **Sentry CLI** is a command-line interface for [Sentry](https://sentry.io), built with Node.js, [pnpm](https://pnpm.io), and [Stricli](https://bloomberg.github.io/stricli/). It lives in `packages/cli` of a pnpm workspace; the docs site lives in `apps/cli-docs`. 8: 9: ### Goals 10: 11: - **Zero-config experience** - Auto-detect project context from DSNs in source code and env files 12: - **AI-powered debugging** - Integrate Seer AI for root cause analysis and fix plans 13: - **Developer-friendly** - Follow `gh` CLI conventions for intuitive UX 14: - **Agent-friendly** - JSON output and predictable behavior for AI coding agents 15: - **Fast** - Native binaries via Node SEA (fossilize), SQLite caching for API responses 16: 17: ### Key Features 18: 19: - **DSN Auto-Detection** - ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/CONTRIBUTING.md</path> <type>file</type> <content> 1: # Contributing to Sentry CLI 2: 3: This guide documents the patterns and conventions used in this CLI for consistency. 4: 5: ## Command Patterns 6: 7: We follow [gh CLI](https://cli.github.com/) conventions for best-in-class developer experience. 8: 9: ### List Commands 10: 11: List commands use **optional positional arguments** for context with smart auto-detection. 12: 13: ```bash 14: sentry org list [--limit N] [--json] 15: sentry project list [org] [--limit N] [--json] 16: sentry issue list [<org>/<project>] [--json] 17: ``` 18: 19: **Target syntax**: 20: - `<org>/<project>` - Explicit organization and project (e.g., `my-org/frontend`) 21: - `<org>/` - All projects in the specified organization 22: - `<project>` - Search for project by name across all accessible organizations 23: - *(omit)* - Auto-detect from DSN or config 24: 25: **Rationale**: Positional ...
No files found
...output truncated...
Full output saved to: /home/byk/.local/share/opencode/tool-output/tool_08b81049d001abuhMdBPXXA2s2
import { getEnv } from "./env.js";
import { AuthError, CliError, OutputError } from "./errors.js";
import { warning } from "./formatters/colors.js";
import { parseFieldsList } from "./formatters/json.js";
import {
ClearScreen,
CommandOutput,
type CommandReturn,
extractSchemaFields,
formatSchemaForHelp,
type HumanRenderer,
type OutputConfig,
renderCommandOutput,
resolveRenderer,
writeFooter,
} from "./formatters/output.js";
import { isPlainOutput } from "./formatters/plain-detect.js";
import { GLOBAL_FLAGS } from "./global-flags.js";
import { setInteractivePromptsAllowed } from "./interactive-prompts.js";
import {
LOG_LEVEL_NAMES,
type LogLevelName,
logger,
parseLogLevel,
setLogLevel,
} from "./logger.js";
import { setArgsContext, setFlagContext, withTracing } from "./telemetry.js";
/**
* Parse a string ...
<path>/home/byk/.local/share/opencode/tool-output/tool_08b81049d001abuhMdBPXXA2s2</path>
<type>file</type>
<content>
1: diff --git a/packages/cli/src/commands/agent-conversation/list.ts b/packages/cli/src/commands/agent-conversation/list.ts
2: index 009809093..806842e71 100644
3: --- a/packages/cli/src/commands/agent-conversation/list.ts
4: +++ b/packages/cli/src/commands/agent-conversation/list.ts
5: @@ -1,211 +1,231 @@
6: /**
7: * sentry agent-conversation list
8: *
9: * List recent agent conversations from Sentry projects.
10: */
11:
12: import type { SentryContext } from "../../context.js";
13: import { listConversations } from "../../lib/api-client.js";
14: import { validateLimit } from "../../lib/arg-parsing.js";
15: import {
16: advancePaginationState,
17: buildPaginationContextKey,
18: hasPreviousPage,
19: resolveCursor,
20: } from "../../lib/db/pagination.js";
21: import { ContextError } from "../../lib/errors.js";
22: import { ...
<path>/home/byk/.local/share/opencode/tool-output/tool_08b81049d001abuhMdBPXXA2s2</path>
<type>file</type>
<content>
1494: * Marked optional so the command falls back to auto-detection when omitted.
1495: */
1496: export const LIST_TARGET_POSITIONAL = {
1497: kind: "tuple" as const,
1498: parameters: [
1499: {
1500: placeholder: "org/project",
1501: brief: "<org>/ (all projects), <org>/<project>, or <project> (search)",
1502: parse: String,
1503: optional: true as const,
1504: },
1505: ],
1506: };
1507:
1508: /**
1509: * Short note for commands that accept a bare project name but do not support
1510: * org-all mode (e.g. trace list, log list, project view).
1511: *
1512: * Explains that a bare name triggers project-search, not org-scoped listing.
1513: */
1514: export const TARGET_PATTERN_NOTE =
1515: "A bare name (no slash) is treated as a project search. " +
1516: "Use <org>/<project> for an explicit ...
Found 34 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/introspect.ts:
Line 70: | { kind: "array"; parameter: PositionalParam };
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/trace/view.ts:
Line 484: kind: "array",
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/trace/logs.ts:
Line 130: kind: "array",
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/issue/merge.ts:
Line 276: kind: "array",
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/span/view.ts:
Line 384: kind: "array",
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/span/list.ts:
Line 575: kind: "array",
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/help.ts:
Line 36: kind: "array",
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/send-envelope.ts:
Line 26: kind: ...
Found 2 matches /home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/project/create.ts: Line 609: customUsage: ["[<org>/]<name>:<platform>..."], /home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/agent-conversation/view.ts: Line 75: customUsage: [USAGE],
Found 9 matches /home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/introspect.ts: Line 116: examples: string[]; Line 296: examples: string[] = [] Line 311: examples: cmd.__examples?.length /home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/formatters/local.ts: Line 270: * Output examples: /home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/errors.ts: Line 520: examples: string[], Line 542: examples: string[], /home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/dashboard/widget/index.ts: Line 47: "Row-filling examples:\n" + /home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/agent-conversation/view.ts: Line 80: examples: [ /home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/agent-conversation/list.ts: Line 117: examples: [
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/package.json</path>
<type>file</type>
<content>
1: {
2: "name": "sentry",
3: "version": "0.45.0-dev.0",
4: "description": "Sentry CLI - A command-line interface for using Sentry built by robots and humans for robots and humans",
5: "repository": {
6: "type": "git",
7: "url": "git+https://github.com/getsentry/cli.git"
8: },
9: "main": "./dist/index.cjs",
10: "type": "module",
11: "types": "./dist/index.d.cts",
12: "exports": {
13: ".": {
14: "import": {
15: "types": "./dist/index.d.mts",
16: "default": "./dist/index.mjs"
17: },
18: "require": {
19: "types": "./dist/index.d.cts",
20: "default": "./dist/index.cjs"
21: }
22: }
23: },
24: "bin": {
25: "sentry": "./dist/bin.cjs"
26: },
27: "files": [
28: "dist/bin.cjs",
29: "dist/index.cjs",
30: "dist/index.mjs",
31: "dist/index.d.cts",
32: "dist/index.d.mts",
33: ...
ripgrep execution failed
File not found: /home/byk/Code/getsentry/cli-pr-1558/node_modules/@stricli/core
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules</path> <type>directory</type> <entries> .bin/ .vite-temp/ .vite/ @anthropic-ai/ @biomejs/ @clack/ @hono/ @mastra/ @sentry/ @spotlightjs/ @stricli/ @types/ @vitest/ binpatch/ chalk/ cli-highlight/ consola/ esbuild/ fast-check/ fflate/ fossilize/ hono/ http-cache-semantics/ ignore/ ink-spinner/ ink/ jpeg-js/ marked/ node-sqlite3-wasm/ p-limit/ peggy/ picomatch/ pixelmatch/ pngjs/ pretty-ms/ qrcode-terminal/ react-devtools-core/ react/ semver/ string-width/ tinyglobby/ tsx/ typescript/ ultracite/ uuidv7/ valibot/ vitest/ wrap-ansi/ (48 entries) </entries>
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core</path> <type>directory</type> <entries> dist/ package.json README.md (3 entries) </entries>
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.d.ts /home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.js /home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.d.cts /home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.cjs
Found 15 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.d.ts:
Line 727: * Array of all possible enumerations supported by this flag.
Line 976: interface TypedCommandPositionalParameters_<ARGS extends BaseArgs, CONTEXT extends CommandContext> {
Line 980: readonly positional: TypedPositionalParameters<ARGS, CONTEXT>;
Line 982: type TypedCommandPositionalParameters<ARGS extends BaseArgs, CONTEXT extends CommandContext> = [] extends ARGS ? Partial<TypedCommandPositionalParameters_<ARGS, CONTEXT>> : TypedCommandPositionalParameters_<ARGS, CONTEXT>;
Line 986: type TypedCommandParameters<FLAGS extends BaseFlags, ARGS extends BaseArgs, CONTEXT extends CommandContext> = TypedCommandFlagParameters<FLAGS, CONTEXT> & TypedCommandPositionalParameters<ARGS, CONTEXT>;
Line 995: readonly positional?: PositionalParameters;
Line 1032: interface PositionalParameterArray<T, CONTEXT extends CommandContext> {
Line 1033: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.d.ts</path>
<type>file</type>
<content>
940: /**
941: * Generic function that synchronously or asynchronously parses a string to an arbitrary type.
942: */
943: type InputParser<T, CONTEXT extends CommandContext = CommandContext> = (this: CONTEXT, input: string) => T | Promise<T>;
944: interface ParsedParameter<T, CONTEXT extends CommandContext> {
945: /**
946: * Function to parse an input string to the type of this parameter.
947: */
948: readonly parse: InputParser<T, CONTEXT>;
949: /**
950: * Propose possible completions for a partial input string.
951: */
952: readonly proposeCompletions?: (this: CONTEXT, partial: string) => readonly string[] | Promise<readonly string[]>;
953: }
954: type LowercaseLetter = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.d.ts</path> <type>file</type> <content> 1380: 1381: /** 1382: * Parses input strings as booleans. 1383: * Transforms to lowercase and then checks against "true" and "false". 1384: */ 1385: declare const booleanParser: (input: string) => boolean; 1386: /** 1387: * Parses input strings as booleans (loosely). 1388: * Transforms to lowercase and then checks against the following values: 1389: * - `true`: `"true"`, `"t"`, `"yes"`, `"y"`, `"on"`, `"1"`, `""` 1390: * - `false`: `"false"`, `"f"`, `"no"`, `"n"`, `"off"`, `"0"` 1391: * 1392: * Parsers are only executed when an input is provided, 1393: * so the empty string is treated as a truthy value (i.e. a flag that is present but has no value is treated as `true`). ...
Found 16 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.js:
Line 434: var UnsatisfiedPositionalError = class extends ArgumentScannerError {
Line 440: * If specified, indicates the minimum number of arguments that are expected and the last argument count.
Line 821: if (typeof positional.minimum === "number" && positionalIndex < positional.minimum) {
Line 823: new UnsatisfiedPositionalError(getPlaceholder(positional.parameter), [
Line 824: positional.minimum,
Line 847: throw new UnsatisfiedPositionalError(placeholder);
Line 1798: function formatUsageLineForParameters(parameters, args) {
Line 2001: const { brief, fullDescription, customUsage } = docs;
Line 2005: if (customUsage) {
Line 2006: for (const usage of customUsage) {
Line 2016: yield ` ${formatUsageLineForParameters(parameters, args)}`;
Line 2116: formatUsageLine: (args) => {
...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.js</path>
<type>file</type>
<content>
785: );
786: } else {
787: storeInput(flagInputs, config.caseStyle, nextFlag.namedFlag, "1");
788: }
789: }
790: } else if (nextFlags.length > 1) {
791: const nextFlagExpectingArg = nextFlags.find((nextFlag) => !isNiladic(nextFlag));
792: const externalFlagName = asExternal(nextFlagExpectingArg.namedFlag[0], config.caseStyle);
793: throw new UnsatisfiedFlagError(externalFlagName);
794: } else {
795: activeFlag = nextFlags[0].namedFlag;
796: }
797: return;
798: }
799: }
800: if (activeFlag) {
801: storeInput(flagInputs, config.caseStyle, activeFlag, input);
802: activeFlag = void 0;
803: } else {
804: if (positional.kind === "tuple") {
805: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.js</path>
<type>file</type>
<content>
1760: return choices.includes(value);
1761: }
1762: function buildChoiceParser(choices) {
1763: return (input) => {
1764: if (!narrowString(choices, input)) {
1765: throw new SyntaxError(`${input} is not one of (${choices.join("|")})`);
1766: }
1767: return input;
1768: };
1769: }
1770:
1771: // src/parameter/flag/types.ts
1772: function hasDefault(flag) {
1773: return "default" in flag && typeof flag.default !== "undefined";
1774: }
1775: function isOptionalAtRuntime(flag) {
1776: return flag.optional ?? hasDefault(flag);
1777: }
1778:
1779: // src/parameter/formatting.ts
1780: function wrapRequiredFlag(text) {
1781: return `(${text})`;
1782: }
1783: function wrapOptionalFlag(text) {
1784: return `[${text}]`;
1785: }
1786: function wrapVariadicFlag(text) {
1787: return `${text}...`;
1788: }
1789: function ...
No files found
diff --git a/packages/cli/script/check-fragments.ts b/packages/cli/script/check-fragments.ts
index 36db22e1d..6384a649d 100644
--- a/packages/cli/script/check-fragments.ts
+++ b/packages/cli/script/check-fragments.ts
@@ -186,128 +186,131 @@ function fragmentMentionsSubcommand(
const proseOnly = stripCodeBlocks(content);
const escapedLeaf = leaf.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
const headingRe = new RegExp(`^#{1,4}\\s+.*\\b${escapedLeaf}\\b`, "im");
if (headingRe.test(proseOnly)) {
return true;
}
return false;
}
/**
* Build a map of route name → RouteInfo for routes with multiple subcommands.
* Standalone commands (single command matching `sentry <name>`) are skipped
* since there's nothing to check — the fragment covers the whole command. ...
...output truncated...
Full output saved to: /home/byk/.local/share/opencode/tool-output/tool_08b84bc16001PaswhW1mhmac5Z
...overrides,
};
@@ -179,120 +179,149 @@ describe("viewCommand.func", () => {
// Default: org resolves to ORG. Individual tests override for auto-detect
// or resolution-failure scenarios.
resolveOrgSpy.mockResolvedValue({ org: ORG });
withProgressSpy = vi
.spyOn(polling, "withProgress")
.mockImplementation(mockWithProgress);
});
afterEach(() => {
getConversationSpansSpy.mockRestore();
resolveOrgSpy.mockRestore();
withProgressSpy.mockRestore();
});
test("resolves org + conversationId from a slash-separated arg", async () => {
resolveOrgSpy.mockResolvedValue({ org: ORG });
getConversationSpansSpy.mockResolvedValue({
spans: sampleSpans,
truncated: false,
title: null,
});
const { context, stdoutWrite } = createMockContext();
const func = await ...
<path>/home/byk/.local/share/opencode/tool-output/tool_08b84bc16001PaswhW1mhmac5Z</path>
<type>file</type>
<content>
1: diff --git a/packages/cli/test/commands/agent-conversation/list.test.ts b/packages/cli/test/commands/agent-conversation/list.test.ts
2: index 21a26bd6c..e080697cc 100644
3: --- a/packages/cli/test/commands/agent-conversation/list.test.ts
4: +++ b/packages/cli/test/commands/agent-conversation/list.test.ts
5: @@ -223,120 +223,133 @@ describe("listCommand.func", () => {
6: });
7:
8: afterEach(() => {
9: listConversationsSpy.mockRestore();
10: resolveOrgSpy.mockRestore();
11: withProgressSpy.mockRestore();
12: resolveCursorSpy.mockRestore();
13: advancePaginationStateSpy.mockRestore();
14: hasPreviousPageSpy.mockRestore();
15: });
16:
17: test("resolves org from positional arg", async () => {
18: listConversationsSpy.mockResolvedValue({
19: data: sampleConversations,
20: nextCursor: undefined,
21: ...
<path>/home/byk/.local/share/opencode/tool-output/tool_08b84bc16001PaswhW1mhmac5Z</path> <type>file</type> <content> 1496: diff --git a/packages/cli/test/lib/scanner-flags.integration.test.ts b/packages/cli/test/lib/scanner-flags.integration.test.ts 1497: index 1c19391c1..af46aca7e 100644 1498: --- a/packages/cli/test/lib/scanner-flags.integration.test.ts 1499: +++ b/packages/cli/test/lib/scanner-flags.integration.test.ts 1500: @@ -1,149 +1,178 @@ 1501: /** 1502: * Integration tests for top-level flag handling by Stricli's patched route 1503: * scanner and application runner. 1504: * 1505: * The `@stricli/core` patch (see 1506: * `packages/cli/patches/@stricli%2Fcore@1.2.8.patch`) teaches `buildRouteScanner` 1507: * to accept a fixed allow-list of Sentry global flags (`--verbose`, `--json`, 1508: * `--org`, `--project`, `--log-level`, `--fields`, and the `-v` alias) at any 1509: * route depth, forwarding them to the leaf command instead of failing route 1510: * ...
diff --git a/apps/cli-docs/src/fragments/commands/agent-conversation.md b/apps/cli-docs/src/fragments/commands/agent-conversation.md index ca9b2b2e3..e69de29bb 100644 --- a/apps/cli-docs/src/fragments/commands/agent-conversation.md +++ b/apps/cli-docs/src/fragments/commands/agent-conversation.md @@ -1,33 +0,0 @@ - - - -## Examples - -### List conversations - -```bash -# List recent agent conversations -sentry agent-conversation list - -# Explicit organization -sentry agent-conversation list my-org - -# Show more, last 24 hours -sentry agent-conversation list --limit 50 --period 24h - -# Filter conversations -sentry agent-conversation list -q "has:errors" - -# Paginate through results -sentry agent-conversation list my-org -c next -``` - -### View a conversation transcript - -```bash -# View full transcript -sentry agent-conversation view my-org conv-123 - -# JSON output -sentry agent-conversation view my-org conv-123 --json -``` diff --git ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.js</path>
<type>file</type>
<content>
1970: const argName = args.ansiColor ? `\x1B[1m${name}...\x1B[22m` : `${name}...`;
1971: const brief = args.ansiColor ? `\x1B[3m${positional.parameter.brief}\x1B[23m` : positional.parameter.brief;
1972: return formatRowsWithColumns([[argName, brief]], [" "]);
1973: }
1974: const { keywords } = args.text;
1975: const atLeastOneOptional = positional.parameters.some((def) => def.optional);
1976: return formatRowsWithColumns(
1977: positional.parameters.map((def, i) => {
1978: let name = def.placeholder ?? `arg${i + 1}`;
1979: let suffix;
1980: if (def.optional) {
1981: name = `[${name}]`;
1982: } else if (atLeastOneOptional) {
1983: name = ` ${name}`;
1984: }
1985: if (def.default) {
1986: const defaultKeyword = args.ansiColor ? `\x1B[2m${keywords.default}\x1B[22m` : ...
diff --git a/packages/cli/src/lib/mutate-command.ts b/packages/cli/src/lib/mutate-command.ts
index 976f2890f..68419f0ce 100644
--- a/packages/cli/src/lib/mutate-command.ts
+++ b/packages/cli/src/lib/mutate-command.ts
@@ -1,62 +1,62 @@
/**
* Shared building blocks for mutation (create/delete) commands.
*
* Provides reusable Stricli parameter definitions, safety utilities, and a
* `buildDeleteCommand` wrapper — paralleling `list-command.ts` for list commands.
*
* Level A — shared constants (used by create and delete commands):
* DRY_RUN_FLAG, YES_FLAG, FORCE_FLAG,
* DESTRUCTIVE_FLAGS, DESTRUCTIVE_ALIASES, DRY_RUN_ALIASES
*
* Level B — shared utilities:
* isConfirmationBypassed, guardNonInteractive, confirmByTyping,
* requireExplicitTarget
*
* Level C — delete command builder:
* buildDeleteCommand
*/
import { isatty } from "node:tty";
import type { Command, CommandContext } from "@stricli/core";
import type { ParsedOrgProject } from ...
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/agent-conversation/view.ts /home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/agent-conversation/list.ts /home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/agent-conversation/index.ts
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/agent-conversation/index.ts</path>
<type>file</type>
<content>
1: /**
2: * sentry agent-conversation
3: *
4: * List and view agent conversations from Sentry Explore.
5: */
6:
7: import { buildRouteMap } from "../../lib/route-map.js";
8: import { listCommand } from "./list.js";
9: import { viewCommand } from "./view.js";
10:
11: export const conversationRoute = buildRouteMap({
12: routes: {
13: list: listCommand,
14: view: viewCommand,
15: },
16: defaultCommand: "list",
17: docs: {
18: brief: "List and view agent conversations",
19: fullDescription:
20: "List and view agent conversations from Sentry Explore.\n\n" +
21: "Commands:\n" +
22: " list List recent agent conversations\n" +
23: " view View a conversation transcript\n",
24: hideRoute: {},
25: },
26: });
(End of file - total 26 lines)
</content>
Found 1 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/app.ts:
Line 428: documentation: {
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/app.ts</path>
<type>file</type>
<content>
400: const prefix = ansiColor ? errorColor("Error:") : "Error:";
401: return `${prefix} ${exc.format()}`;
402: }
403: if (exc instanceof Error) {
404: return `Unexpected error: ${exc.stack ?? exc.message}`;
405: }
406: return `Unexpected error: ${stringifyUnknown(exc)}`;
407: },
408: };
409:
410: export const app = buildApplication(routes, {
411: name: "sentry",
412: versionInfo: {
413: currentVersion: CLI_VERSION,
414: },
415: scanner: {
416: caseStyle: "allow-kebab-for-camel",
417: // Allow `--` to stop flag parsing so wrapper commands (e.g.
418: // `sentry monitor run <slug> -- <command>`) can pass through flags
419: // like `-e` or `--verbose` to the wrapped command unambiguously. ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/help.ts</path>
<type>file</type>
<content>
1: /**
2: * Help Command
3: *
4: * Provides help information for the CLI.
5: * - `sentry help` or `sentry` (no args): Shows branded help with banner
6: * - `sentry help <command>`: Shows detailed help for that command
7: * - `sentry help --json`: Emits full command tree as structured JSON
8: * - `sentry help --json <command>`: Emits specific command/group metadata as JSON
9: */
10:
11: import type { SentryContext } from "../context.js";
12: import { buildCommand } from "../lib/command.js";
13: import { OutputError } from "../lib/errors.js";
14: import { CommandOutput } from "../lib/formatters/output.js";
15: import {
16: formatHelpHuman,
17: introspectAllCommands,
18: introspectCommand,
19: } from "../lib/help.js";
20:
21: export const helpCommand = buildCommand({
22: auth: false,
23: docs: {
24: brief: "Display help for a command",
25: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/cli/feedback.ts</path>
<type>file</type>
<content>
1: /**
2: * Feedback Command
3: *
4: * Allows users to submit feedback about the CLI.
5: * All arguments after 'feedback' are joined into a single message.
6: *
7: * @example sentry cli feedback i love this tool
8: * @example sentry cli feedback the issue view is confusing
9: */
10:
11: import { isatty } from "node:tty";
12: // biome-ignore lint/performance/noNamespaceImport: Sentry SDK recommends namespace import
13: import * as Sentry from "@sentry/node-core/light";
14: import type { SentryContext } from "../../context.js";
15: import { buildCommand } from "../../lib/command.js";
16: import { ConfigError, ValidationError } from "../../lib/errors.js";
17: import { formatFeedbackResult } from "../../lib/formatters/human.js";
18: import { CommandOutput } from "../../lib/formatters/output.js";
19: import { logger } from "../../lib/logger.js";
20:
21: /** ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/event/send.ts</path> <type>file</type> <content> 110: sentry event send ./event.json 111: \`\`\` 112: 113: Use --raw to skip JSON parsing and send the file bytes directly to the ingest endpoint. 114: This also supports sending pre-built Sentry envelope files. 115: 116: When file arguments are provided, flags like -m/--message are ignored — the event is 117: built entirely from the file contents. 118: 119: ## Common flags 120: 121: | Flag | Description | 122: |------|-------------| 123: | \`--dsn\` | DSN to send to (overrides SENTRY_DSN) | 124: | \`-m\` / \`--message\` | Event message (repeat for multi-line) | 125: | \`-l\` / \`--level\` | Severity: debug, info, warning, error, fatal | 126: | \`-r\` / \`--release\` | Release version | 127: | \`-E\` / \`--env\` | Environment name | 128: | \`-t\` / \`--tag\` | Tag as KEY:VALUE (repeat for multiple) | 129: | \`-e\` / \`--extra\` | Extra data as KEY:VALUE | 130: | ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/schema.ts</path>
<type>file</type>
<content>
285: type SchemaFlags = {
286: readonly all: boolean;
287: readonly search?: string;
288: };
289:
290: export const schemaCommand = buildCommand({
291: auth: false,
292: docs: {
293: brief: "Browse the Sentry API schema",
294: fullDescription:
295: "Browse and search the Sentry API schema. Shows available resources, " +
296: "operations, and endpoint details. Use with --json for machine-readable output.\n\n" +
297: "Examples:\n" +
298: " sentry schema List all API resources\n" +
299: " sentry schema issues Show endpoints for a resource\n" +
300: " sentry schema issues list Show details for one endpoint\n" +
301: " sentry schema --all Flat list of all endpoints\n" +
302: " sentry schema --search monitor Search endpoints by keyword",
303: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/docs/list.ts</path>
<type>file</type>
<content>
25: { header: "TITLE", value: (result) => result.title, truncate: true },
26: {
27: header: "DESCRIPTION",
28: value: (result) => result.description ?? "",
29: truncate: true,
30: },
31: { header: "URL", value: (result) => result.url, truncate: true },
32: ]);
33: }
34:
35: export const listCommand = buildCommand({
36: docs: {
37: brief: "Find Sentry documentation pages by keyword",
38: fullDescription:
39: "Search the Sentry documentation index without synthesizing an answer. Returns ranked page titles, descriptions, and URLs.\n\n" +
40: 'Examples:\n sentry docs list "nextjs tracing"\n sentry docs list "session replay privacy" --limit 5\n sentry docs list "source maps" --json',
41: },
42: output: { human: formatListHuman },
43: parameters: {
44: flags: {
45: limit: {
46: kind: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/docs/query.ts</path>
<type>file</type>
<content>
1: import type { SentryContext } from "../../context.js";
2: import { buildCommand } from "../../lib/command.js";
3: import { detectDocsContext } from "../../lib/docs-context.js";
4: import { queryDocs } from "../../lib/docs-service.js";
5: import { ValidationError } from "../../lib/errors.js";
6: import { CommandOutput } from "../../lib/formatters/output.js";
7: import { withProgress } from "../../lib/polling.js";
8:
9: type QueryFlags = { readonly fields?: string[]; readonly json: boolean };
10: type QueryOutput = {
11: answer: string;
12: detectedContext: Awaited<ReturnType<typeof detectDocsContext>>;
13: sources: string[];
14: };
15:
16: /** Friendly wait messages for a docs-MCP request without measurable stages. ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/trace/view.ts</path>
<type>file</type>
<content>
450: log.warn(
451: `Trace has ${totalCount} spans \u2014 this may take a moment. ` +
452: "Use 'sentry span view' for specific spans."
453: );
454: }
455:
456: return fetchMultiSpanDetails(flat, {
457: ...options,
458: onProgress:
459: flat.length > PROGRESS_THRESHOLD
460: ? (done, total) => {
461: log.info(`Fetching span data (${done}/${total})...`);
462: }
463: : undefined,
464: });
465: }
466:
467: export const viewCommand = buildCommand({
468: docs: {
469: brief: "View details of a specific trace",
470: fullDescription:
471: "View detailed information about a distributed trace by its ID.\n\n" +
472: "Target specification:\n" +
473: " sentry trace view <trace-id> # auto-detect from DSN or config\n" +
474: " sentry trace view ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/span/list.ts</path>
<type>file</type>
<content>
545: "Project mode (no trace ID):\n" +
546: " sentry span list # auto-detect from DSN or config\n" +
547: " sentry span list <org>/<project> # explicit org and project\n" +
548: " sentry span list <project> # find project across all orgs\n\n" +
549: `${TARGET_PATTERN_NOTE}\n\n` +
550: "Trace mode (provide a 32-char trace ID):\n" +
551: " sentry span list <trace-id> # auto-detect org/project\n" +
552: " sentry span list <org>/<project>/<trace-id> # explicit\n" +
553: " sentry span list <project> <trace-id> # find project + trace\n\n" +
554: "Pagination:\n" +
555: " sentry span list -c next # fetch next page (project mode)\n" +
556: " sentry span list -c prev # fetch previous page\n" ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/log/list.ts</path>
<type>file</type>
<content>
700: "log",
701: {
702: docs: {
703: brief: "List logs from a project",
704: fullDescription:
705: "List and stream logs from Sentry projects.\n\n" +
706: "Target patterns:\n" +
707: " sentry log list # auto-detect from DSN or config\n" +
708: " sentry log list <org>/<proj> # explicit org and project\n" +
709: " sentry log list <project> # find project across all orgs\n\n" +
710: `${TARGET_PATTERN_NOTE}\n\n` +
711: "Trace filtering:\n" +
712: " sentry log list <trace-id> # Filter by trace (auto-detect org)\n" +
713: " sentry log list <org>/<trace-id> # Filter by trace (explicit org)\n\n" +
714: "Examples:\n" +
715: " sentry log list # List last 100 logs\n" +
716: " sentry log list -f ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/dashboard/widget/add.ts</path>
<type>file</type>
<content>
80: docs: {
81: brief: "Add a widget to a dashboard",
82: fullDescription:
83: "Add a widget to an existing Sentry dashboard.\n\n" +
84: "The dashboard can be specified by numeric ID or title.\n\n" +
85: "Examples:\n" +
86: " sentry dashboard widget add 'My Dashboard' \"Error Count\" \\\n" +
87: " --display big_number --query count\n\n" +
88: " sentry dashboard widget add 'My Dashboard' \"Errors by Browser\" \\\n" +
89: " --display line --query count --group-by browser.name\n\n" +
90: " sentry dashboard widget add 'My Dashboard' \"Top Endpoints\" \\\n" +
91: " --display table --query count --query p95:span.duration \\\n" +
92: " --group-by transaction --sort -count --limit 10\n\n" +
93: "Query shorthand (--query flag):\n" +
94: " count → count() ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/dashboard/widget/edit.ts</path>
<type>file</type>
<content>
185: raw.limit = limit;
186: }
187:
188: return prepareWidgetQueries(parseWidgetInput(raw));
189: }
190:
191: export const editCommand = buildCommand({
192: docs: {
193: brief: "Edit a widget in a dashboard",
194: fullDescription:
195: "Edit a widget in an existing Sentry dashboard.\n\n" +
196: "The dashboard can be specified by numeric ID or title.\n" +
197: "Identify the widget by --index (0-based) or --title.\n" +
198: "Only provided flags are changed — omitted values are preserved.\n\n" +
199: "Layout flags (--col/-x, --row/-y, --width, --height) control widget position\n" +
200: "and size in the 6-column dashboard grid.\n\n" +
201: "Examples:\n" +
202: " sentry dashboard widget edit 12345 --title 'Error Rate' --display bar\n" +
203: " sentry dashboard widget edit 'My Dashboard' ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/dashboard/view.ts</path>
<type>file</type>
<content>
160: return dashboardPeriod ? parsePeriod(dashboardPeriod) : TIME_RANGE_24H;
161: }
162:
163: export const viewCommand = buildCommand({
164: docs: {
165: brief: "View a dashboard",
166: fullDescription:
167: "View a Sentry dashboard with rendered widget data.\n\n" +
168: "Fetches actual data for each widget and displays sparkline charts,\n" +
169: "tables, and big numbers in the terminal.\n\n" +
170: "The dashboard can be specified by numeric ID or title.\n\n" +
171: "Examples:\n" +
172: " sentry dashboard view 12345\n" +
173: " sentry dashboard view 'My Dashboard'\n" +
174: " sentry dashboard view my-org 12345\n" +
175: " sentry dashboard view my-org 'My Dashboard'\n" +
176: " sentry dashboard view my-org/my-project 12345\n" +
177: " sentry dashboard view 12345 --json\n" +
178: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/cli/defaults.ts</path> <type>file</type> <content> 280: "sentry cli defaults project my-proj # Set default project\n" + 281: "sentry cli defaults telemetry off # Disable telemetry\n" + 282: "sentry cli defaults agent-skills off # Stop installing agent skills on upgrade\n" + 283: "sentry cli defaults graphics off # Disable inline terminal images\n" + 284: "sentry cli defaults url https://... # Set Sentry URL (self-hosted)\n" + 285: "sentry cli defaults headers 'X-IAP: t' # Set custom headers (self-hosted)\n" + 286: "sentry cli defaults ca-cert /path/to/ca.pem # Trust a custom CA certificate\n" + 287: "sentry cli defaults org --clear # Clear a specific default\n" + 288: "sentry cli defaults --clear --yes # Clear all defaults\n" + 289: "```\n\n" + 290: "## Recognized keys\n\n" + 291: "| Key | Description |\n" + 292: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/issue/merge.ts</path>
<type>file</type>
<content>
250: }
251:
252: export const mergeCommand = buildCommand({
253: docs: {
254: brief: "Merge 2+ issues into a single canonical group",
255: fullDescription:
256: "Consolidate multiple issues into one. Useful when the same logical\n" +
257: "error was split into separate groups (e.g. by Sentry's default\n" +
258: "stack-trace grouping before fingerprint rules were applied).\n\n" +
259: "Sentry picks the canonical parent based on event count — typically\n" +
260: "the largest group. --into is a preference, not a guarantee: if your\n" +
261: "choice has fewer events, Sentry may still pick a different parent,\n" +
262: "in which case a warning is printed to stderr.\n\n" +
263: "All issues must belong to the same organization. ...
<path>/home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/agent-conversation.md</path> <type>file</type> <content> 1: --- 2: title: agent-conversation 3: description: Agent-conversation commands for the Sentry CLI 4: --- 5: 6: List and view agent conversations 7: 8: ## Commands 9: 10: ### `sentry agent-conversation list [<org>]` 11: 12: List recent agent conversations 13: 14: **Arguments:** 15: 16: | Argument | Description | 17: |----------|-------------| 18: | `[<org>]` | Organization slug | 19: 20: **Options:** 21: 22: | Option | Description | 23: |--------|-------------| 24: | `-n, --limit <limit>` | Number of conversations (1-1000) (default: "25") | 25: | `-q, --query <query>` | Search query | 26: | `-t, --period <period>` | Time range: "7d", "2026-08-01..2026-09-01", ">=2026-08-01" (default: "7d") | 27: | `-f, --fresh` | Bypass cache, re-detect projects, and fetch fresh data | 28: | `-c, --cursor <cursor>` | Navigate pages: "next", "prev", "first" ...
Found 9 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/api/conversations.ts:
Line 42: * Internal helper used by {@link listConversations} for both single-page and
Line 101: export async function listConversations(
Line 119: export async function getConversationSpans(
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/api-client.ts:
Line 42: getConversationSpans,
Line 43: listConversations,
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/agent-conversation/view.ts:
Line 8: import { getConversationSpans } from "../../lib/api-client.js";
Line 143: () => getConversationSpans(org, conversationId)
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/agent-conversation/list.ts:
Line 8: import { listConversations } from "../../lib/api-client.js";
Line 195: listConversations(org, {
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/api/conversations.ts</path>
<type>file</type>
<content>
90:
91: /**
92: * List agent conversations for an organization.
93: *
94: * When `limit` exceeds {@link API_MAX_PER_PAGE}, transparently fetches multiple
95: * pages using cursor-based pagination (bounded by {@link MAX_PAGINATION_PAGES}).
96: *
97: * @param orgSlug - Organization slug
98: * @param options - Query options (query, limit, cursor, statsPeriod, etc.)
99: * @returns Paginated response with conversation items and optional next cursor
100: */
101: export async function listConversations(
102: orgSlug: string,
103: options: {
104: query?: string;
105: limit?: number;
106: cursor?: string;
107: statsPeriod?: string;
108: start?: string;
109: end?: string;
110: project?: string;
111: } = {}
112: ): Promise<PaginatedResponse<ConversationListItem[]>> {
113: const regionUrl = await resolveOrgRegion(orgSlug);
114: ...
Found 4 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/errors.ts:
Line 407: export class ContextError extends CliError {
Line 540: export function validationError(
Line 558: export class ValidationError extends CliError {
Line 797: export function getExitCode(error: unknown): number {
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/errors.ts</path>
<type>file</type>
<content>
390: * instead. For malformed input, use {@link ValidationError}.
391: *
392: * When `alternatives` is omitted (using defaults), the error assumes auto-detection
393: * was attempted and produces a "Could not auto-detect ..." headline. When `alternatives`
394: * is explicitly provided (including `[]`), the error uses "... is/are required." instead.
395: *
396: * @param resource - What is required (e.g., "Organization", "Organization and project").
397: * Use " and " to join compound resources — triggers plural grammar ("are required").
398: * @param command - **Single-line** CLI usage example (e.g., "sentry org view <org-slug>").
399: * Must not contain newlines — multi-line messages indicate a resolution failure
400: * that should use {@link ResolutionError}.
401: * @param alternatives - Alternative ways to resolve (defaults to DSN/project detection hints). ...
Found 3 matches /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/release.md: Line 145: | `<environment>` | Deploy environment (e.g. production) | /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/issue.md: Line 155: | `<issue...>` | Issue IDs to merge (2 or more required) | /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/agent-conversation.md: Line 57: | `[<org/conversation-id>]` | [<org>/]<conversation-id> - Org (optional) and conversation ID |
Found 1 matches /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/project.md: Line 18: | `<name:platform...>` | One or more project name and platform pairs |
No files found
Found 1 matches /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/event.md: Line 57: | `<args...>` | Path(s) to JSON event file(s) to send |
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/script/check-fragments.ts</path>
<type>file</type>
<content>
1: #!/usr/bin/env tsx
2: /**
3: * Validate doc fragment files.
4: *
5: * Ensures fragment files stay consistent with the CLI route tree:
6: * 1. Every route has a corresponding fragment file (+ index.md)
7: * 2. Every fragment file corresponds to an existing route (or is index.md)
8: * 3. Fragment files don't accidentally contain frontmatter or the generated marker
9: * 4. Top-level fragments (e.g., configuration.md) exist
10: * 5. Fragment content covers all subcommands in a route (warnings only)
11: *
12: * Usage:
13: * tsx script/check-fragments.ts # Warnings for missing subcommands
14: * tsx script/check-fragments.ts --strict # Errors for missing subcommands
15: */
16:
17: import { mkdirSync, readdirSync } from "node:fs";
18: import { access, readFile, writeFile } from "node:fs/promises";
19: import type { RouteInfo, RouteMap ...
DEPRECATED `test.poolOptions` was removed in Vitest 4. All previous `poolOptions` are now top-level options. Please, refer to the migration guide: https://vitest.dev/guide/migration#pool-rework RUN v4.1.10 /home/byk/Code/getsentry/cli-pr-1558/packages/cli [debug] [compat-flags] --org flag → SENTRY_ORG=acme [debug] [compat-flags] --org flag → SENTRY_ORG=acme [debug] [compat-flags] --org flag → SENTRY_ORG=acme [debug] [compat-flags] --org flag → SENTRY_ORG=my-org [debug] [compat-flags] --project flag → SENTRY_PROJECT=my-proj [debug] [compat-flags] --org flag → SENTRY_ORG=my-org [debug] [compat-flags] --project flag → SENTRY_PROJECT=my-proj [debug] [compat-flags] --org flag → SENTRY_ORG=new [debug] [compat-flags] --org flag → SENTRY_ORG=my-org [debug] [compat-flags] --project flag → SENTRY_PROJECT=my-proj [debug] [compat-flags] --org flag → SENTRY_ORG=my-org [debug] [compat-flags] --project flag → SENTRY_PROJECT=my-project [debug] [compat-flags] --org flag → ...
{"usage":"<args...>","positionals":[{"placeholder":"args","brief":"Optional files","optional":false,"variadic":true}]}
<skill_content name="ast-grep"> # Skill: ast-grep # ast-grep Code Search ## Overview This skill helps translate natural language queries into ast-grep rules for structural code search. ast-grep uses Abstract Syntax Tree (AST) patterns to match code based on its structure rather than just text, enabling powerful and precise code search across large codebases. ## When to Use This Skill Use this skill when users: - Need to search for code patterns using structural matching (e.g., "find all async functions that don't have error handling") - Want to locate specific language constructs (e.g., "find all function calls with specific parameters") - Request searches that require understanding code structure rather than just text - Ask to search for code with particular AST characteristics - Need to perform complex code queries that traditional text search cannot handle ## General Workflow Follow this process to help users write effective ast-grep rules: ### Step 1: Understand the ...
(no output)
{"text":"{\n kind: \"array\",\n parameter: {\n placeholder: \"org/project/trace-id\",\n brief:\n \"[<org>/<project>/]<trace-id> - Target (optional) and trace ID (required)\",\n parse: String,\n },\n }","range":{"byteOffset":{"start":14750,"end":14975},"start":{"line":482,"column":16},"end":{"line":490,"column":5}},"file":"packages/cli/src/commands/trace/view.ts","lines":" positional: {\n kind: \"array\",\n parameter: {\n placeholder: \"org/project/trace-id\",\n brief:\n \"[<org>/<project>/]<trace-id> - Target (optional) and trace ID (required)\",\n parse: String,\n },\n },","charCount":{"leading":16,"trailing":1},"language":"TypeScript","metaVariables":{"single":{},"multi":{"REST":[{"text":"parameter: {\n placeholder: \"org/project/trace-id\",\n brief:\n \"[<org>/<project>/]<trace-id> - Target (optional) and trace ID (required)\",\n parse: String,\n ...
{"file":"packages/cli/src/commands/init.ts","range":{"byteOffset":{"start":10810,"end":11223},"start":{"line":312,"column":16},"end":{"line":328,"column":5}},"text":"{\n kind: \"tuple\",\n parameters: [\n {\n placeholder: \"target\",\n brief: \"<org>/<project>, <org>/, <project>, or a directory path\",\n parse: String,\n optional: true,\n },\n {\n placeholder: \"directory\",\n brief: \"Project directory (default: current directory)\",\n parse: String,\n optional: true,\n },\n ],\n }"}
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/tsconfig.json</path>
<type>file</type>
<content>
1: {
2: "compilerOptions": {
3: "lib": ["ESNext"],
4: "target": "ESNext",
5: "module": "ESNext",
6: "jsx": "react-jsx",
7: "moduleDetection": "force",
8: "allowJs": true,
9: "moduleResolution": "bundler",
10: "allowImportingTsExtensions": true,
11: "verbatimModuleSyntax": true,
12: "noEmit": true,
13: "resolveJsonModule": true,
14: "strict": true,
15: "skipLibCheck": true,
16: "noFallthroughCasesInSwitch": true,
17: "noUncheckedIndexedAccess": true,
18: "noImplicitOverride": true,
19: "esModuleInterop": true,
20: "forceConsistentCasingInFileNames": true,
21: "noUnusedLocals": false,
22: "noUnusedParameters": false,
23: "noPropertyAccessFromIndexSignature": false,
24: "strictNullChecks": true
25: },
26: "include": ["src/**/*.ts", "src/**/*.tsx"],
27: "exclude": ["node_modules", ...
(no output)
Checked 1030 files in 58s. No fixes applied.
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/generated/skill-content.ts</path> <type>file</type> <content> 1: /** 2: * Embedded skill file contents for agent skill installation. 3: * Auto-generated by script/generate-skill.ts — do not edit manually. 4: */ 5: (Showing lines 1-5 of 4225. Use offset=6 to continue.) </content>
error: pathspec 'packages/cli/src/generated/skill-content.ts' did not match any file(s) known to git Did you forget to 'git add'?
packages/cli/.gitignore:38:src/generated/ packages/cli/src/generated/skill-content.ts
Found 1 fragment validation error(s):
✗ Fragment missing subcommand coverage: ../../apps/cli-docs/src/fragments/commands/proguard.md
Not documented: upload
Hint: add a heading or code example for each (e.g., "sentry proguard upload")
1 subcommand coverage warning(s):
⚠ Fragment missing subcommand coverage: ../../apps/cli-docs/src/fragments/commands/proguard.md
Not documented: upload
Hint: add a heading or code example for each (e.g., "sentry proguard upload")
All 37 command fragment files valid (36 routes + index)
All 1 top-level fragment(s) valid
No files found
<path>/home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/event.md</path> <type>file</type> <content> 35: |----------|-------------| 36: | `<issue>` | Issue: @latest, @most_frequent, <org>/ID, <org>/<project>#ID, <project>-suffix, ID, or suffix | 37: 38: **Options:** 39: 40: | Option | Description | 41: |--------|-------------| 42: | `-n, --limit <limit>` | Number of events (1-1000) (default: "25") | 43: | `-q, --query <query>` | Search query (Sentry search syntax) | 44: | `--full` | Include full event body (stacktraces) | 45: | `-t, --period <period>` | Time range: "7d", "2026-08-01..2026-09-01", ">=2026-08-01" (default: "7d") | 46: | `-f, --fresh` | Bypass cache, re-detect projects, and fetch fresh data | 47: | `-c, --cursor <cursor>` | Navigate pages: "next", "prev", "first" (or raw cursor string) | 48: 49: ### `sentry event send <args...>` 50: 51: Send a Sentry event 52: 53: **Arguments:** 54: 55: | Argument | Description ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/event/send.ts</path>
<type>file</type>
<content>
250: kind: "boolean",
251: brief: "Parse 'CATEGORY: message' prefixes from logfile breadcrumbs",
252: default: false,
253: optional: true,
254: },
255: raw: {
256: kind: "boolean",
257: brief: "Send file contents as-is without parsing",
258: default: false,
259: optional: true,
260: },
261: },
262: aliases: {
263: m: "message",
264: a: "message-arg",
265: l: "level",
266: r: "release",
267: d: "dist",
268: E: "env",
269: p: "platform",
270: t: "tag",
271: e: "extra",
272: u: "user",
273: f: "fingerprint",
274: },
275: },
276: async *func(
277: this: SentryContext,
278: flags: SendEventFlags & {
279: dsn?: string;
280: raw?: boolean;
281: json?: boolean;
282: },
283: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/send-envelope.ts</path>
<type>file</type>
<content>
1: /**
2: * `sentry send-envelope` — Deprecated. Suggests `sentry event send --raw`.
3: *
4: * Kept as a hidden backward-compat alias that prints a deprecation notice
5: * and forwards to `sentry event send --raw`.
6: */
7:
8: import type { SentryContext } from "../context.js";
9: import { buildCommand } from "../lib/command.js";
10: import { CliError, EXIT } from "../lib/errors.js";
11:
12: export const sendEnvelopeCommand = buildCommand({
13: docs: {
14: brief: "Send a Sentry envelope file (deprecated)",
15: fullDescription:
16: "This command has been replaced by `sentry event send --raw <file>`.\n\n" +
17: "Use `sentry event send --raw ./captured.envelope` instead.",
18: },
19: auth: false,
20: skipRcUrlCheck: true,
21: output: {
22: human: () => "",
23: },
24: parameters: {
25: positional: {
26: kind: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/help.ts</path>
<type>file</type>
<content>
1: /**
2: * Custom Help Output
3: *
4: * Provides a branded, styled help output for the CLI.
5: * Shows custom formatting when running `sentry` with no arguments.
6: * Commands are auto-generated from Stricli's route structure.
7: */
8:
9: import { routes } from "../app.js";
10: import { formatBanner } from "./banner.js";
11: import { isAuthenticated } from "./db/auth.js";
12: import { TOP_LEVEL_ENV_VARS } from "./env-registry.js";
13: import { cyan, magenta, muted } from "./formatters/colors.js";
14: import {
15: filterFields,
16: formatJson,
17: parseFieldsList,
18: } from "./formatters/json.js";
19: import { GLOBAL_FLAGS } from "./global-flags.js";
20: import {
21: type CommandInfo,
22: extractAllRoutes,
23: getPositionalString,
24: isCommand,
25: isRouteMap,
26: type RouteInfo,
27: type RouteMap,
28: type RouteMapEntry,
29: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/introspect.ts</path>
<type>file</type>
<content>
45: brief: string;
46: fullDescription?: string;
47: parameters: {
48: positional?: PositionalParams;
49: flags?: Record<string, FlagDef>;
50: aliases?: Record<string, string>;
51: };
52: /**
53: * JSON output schema attached by `buildCommand` when `output.schema` is set.
54: * Non-standard property — Stricli doesn't know about it, but introspection
55: * reads it to populate {@link CommandInfo.jsonFields}.
56: */
57: __jsonSchema?: import("valibot").GenericSchema;
58: /**
59: * Primary Stricli custom usage line, retained by `buildCommand` for
60: * introspection because Stricli does not expose it on the built command.
61: */
62: __primaryUsage?: string;
63: /** Canonical documentation examples retained by `buildCommand`. */
64: __examples?: readonly CommandExample[];
65: };
66:
67: /** Positional parameter definitions — ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/introspect.ts</path>
<type>file</type>
<content>
220: }
221:
222: /**
223: * Extract structured positional parameter metadata from a command.
224: *
225: * Returns one entry per positional, with placeholder, brief, and whether
226: * the parameter is optional. Used by documentation generators to build
227: * argument tables.
228: *
229: * @param params - Stricli positional parameter definition
230: * @returns Array of positional info objects
231: */
232: export function extractPositionals(
233: params?: PositionalParams
234: ): PositionalInfo[] {
235: if (!params) {
236: return [];
237: }
238:
239: if (params.kind === "tuple") {
240: return params.parameters.map((p, i) => ({
241: placeholder: p.placeholder ?? `arg${i}`,
242: brief: p.brief ?? "",
243: optional: p.optional ?? false,
244: variadic: false,
245: }));
246: }
247:
248: if (params.kind === "array") ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/introspect.ts</path>
<type>file</type>
<content>
185: "parameters" in target &&
186: !("getAllEntries" in target)
187: );
188: }
189:
190: // ---------------------------------------------------------------------------
191: // Extraction Functions
192: // ---------------------------------------------------------------------------
193:
194: /**
195: * Build a positional parameter placeholder string from Stricli positional params.
196: *
197: * @param params - Stricli positional parameter definition
198: * @returns Human-readable placeholder like `<target>` or `<command...>`
199: */
200: export function getPositionalString(params?: PositionalParams): string {
201: if (!params) {
202: return "";
203: }
204:
205: if (params.kind === "tuple") {
206: return params.parameters
207: .map((p, i) => {
208: const placeholder = `<${p.placeholder ?? `arg${i}`}>`;
209: return ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/agent-conversation/view.ts</path>
<type>file</type>
<content>
60: const org = trimmed.slice(0, slashIdx);
61: const conversationId = trimmed.slice(slashIdx + 1);
62: if (!(org && conversationId)) {
63: throw validationError(
64: "Conversation target must include both an organization and conversation ID when using '/'.",
65: [USAGE_HINT],
66: "conversation-id"
67: );
68: }
69: return { org, conversationId };
70: }
71:
72: export const viewCommand = buildCommand({
73: docs: {
74: brief: "View an agent conversation transcript",
75: customUsage: [USAGE],
76: fullDescription:
77: "View the full transcript of an agent conversation.\n\n" +
78: "The org is optional and auto-detected from your project context when\n" +
79: "omitted. Prefix the ID with an org slug to target a specific org.",
80: examples: [
81: {
82: description: "View full ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/agent-conversation/view.ts</path>
<type>file</type>
<content>
24:
25: type ViewFlags = {
26: readonly json: boolean;
27: readonly fresh: boolean;
28: };
29:
30: const USAGE = "[<org>/]<conversation-id>";
31: const USAGE_HINT = `sentry agent-conversation view ${USAGE}`;
32:
33: /**
34: * Split a `[<org>/]<conversation-id>` positional into its parts.
35: *
36: * Conversation IDs are org-scoped (not org/project-scoped like trace/replay
37: * IDs) and never contain `/`, so the arg has at most one slash: everything
38: * before the first `/` is the org, the remainder is the conversation ID. With
39: * no slash the whole value is the conversation ID and the org is auto-detected.
40: *
41: * @throws {ValidationError} When the target contains empty segments or multiple
42: * slashes.
43: */
44: function parseConversationTarget(target: string): {
45: org?: string;
46: conversationId: string;
47: } {
48: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/script/generate-command-docs.ts</path>
<type>file</type>
<content>
115: let syntax = `--${flag.name}`;
116: if (alias) {
117: syntax = `-${alias}, ${syntax}`;
118: }
119: if ((flag.kind === "parsed" || flag.kind === "enum") && !flag.variadic) {
120: syntax += ` <${flag.name}>`;
121: } else if (flag.variadic) {
122: syntax += ` <${flag.name}>...`;
123: }
124:
125: let desc = flag.brief;
126: // Only append default if the brief doesn't already mention it
127: if (
128: flag.default !== undefined &&
129: flag.kind !== "boolean" &&
130: !desc.includes("default:")
131: ) {
132: desc += ` (default: ${JSON.stringify(flag.default)})`;
133: }
134:
135: return `| \`${syntax}\` | ${desc} |`;
136: }
137:
138: /**
139: * Escape angle brackets in text so they render as literal `<` / `>`
140: * in HTML output rather than being interpreted as HTML tags. ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/script/generate-command-docs.ts</path>
<type>file</type>
<content>
190: /** Generate the auto-generated reference section for a single command */
191: function generateCommandSection(cmd: CommandInfo): string {
192: const lines: string[] = [];
193:
194: // Command heading
195: const signature = cmd.positional ? `${cmd.path} ${cmd.positional}` : cmd.path;
196: lines.push(`### \`${signature}\``);
197: lines.push("");
198: lines.push(cmd.brief);
199:
200: // Arguments table
201: if (cmd.positionals.length > 0) {
202: lines.push("");
203: lines.push(formatPositionalsTable(cmd.positionals));
204: }
205:
206: // Options table
207: const visibleFlags = getVisibleFlags(cmd);
208: if (visibleFlags.length > 0) {
209: lines.push("");
210: lines.push(formatFlagsTable(visibleFlags, cmd.aliases));
211: }
212:
213: const examples = formatCommandExamples(cmd.examples);
214: if (examples) {
215: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/test/lib/introspect.property.test.ts</path>
<type>file</type>
<content>
125: const result = extractFlags(flags);
126: for (const flag of result) {
127: if (
128: flag.kind === "boolean" &&
129: flags[flag.name].optional === undefined
130: ) {
131: expect(flag.optional).toBe(true);
132: }
133: }
134: }),
135: { numRuns: DEFAULT_NUM_RUNS }
136: );
137: });
138: });
139:
140: describe("property: getPositionalString", () => {
141: test("tuple always produces angle-bracket placeholders", () => {
142: fcAssert(
143: property(
144: array(
145: record({
146: placeholder: oneof(string(), constantFrom(undefined)),
147: optional: boolean(),
148: })
149: ),
150: (params) => {
151: const result = getPositionalString({
152: kind: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/test/lib/introspect.property.test.ts</path>
<type>file</type>
<content>
170: });
171:
172: test("array always includes ellipsis", () => {
173: fcAssert(
174: property(string(), (placeholder) => {
175: const result = getPositionalString({
176: kind: "array",
177: parameter: { placeholder: placeholder || undefined },
178: });
179: expect(result).toContain("...");
180: }),
181: { numRuns: DEFAULT_NUM_RUNS }
182: );
183: });
184:
185: test("array extraction always remains required and variadic", () => {
186: fcAssert(
187: property(string(), (placeholder) => {
188: const [result] = extractPositionals({
189: kind: "array",
190: parameter: { placeholder: placeholder || undefined },
191: });
192: expect(result.optional).toBe(false);
193: expect(result.variadic).toBe(true);
194: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/test/script/generate-skill-markdown.test.ts</path>
<type>file</type>
<content>
95: )
96: ).toBe("sentry auth login");
97: });
98:
99: test("prefers longer command paths over shorter prefixes", () => {
100: expect(
101: matchExampleToCommand(
102: "sentry auth login --token TOKEN",
103: ["sentry auth login", "sentry auth status"],
104: "sentry auth",
105: "sentry auth login"
106: )
107: ).toBe("sentry auth login");
108: });
109:
110: test("the generated project reference retains create examples", async () => {
111: const reference = await readFile(
112: "plugins/sentry-cli/skills/sentry-cli/references/project.md",
113: "utf8"
114: );
115:
116: expect(reference).toContain(
117: "### `sentry project create [<org>/]<name>:<platform>...`"
118: );
119: expect(reference).not.toContain('sentry project create "My New ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/command.ts</path>
<type>file</type>
<content>
425: if (!outputConfig?.schema) {
426: return docs;
427: }
428: const schemaFields = extractSchemaFields(outputConfig.schema);
429: if (schemaFields.length === 0) {
430: return docs;
431: }
432: const jsonFieldsDoc = formatSchemaForHelp(schemaFields);
433: const baseFull = docs.fullDescription ?? docs.brief;
434: return {
435: ...docs,
436: fullDescription: `${baseFull}\n\n${jsonFieldsDoc}`,
437: };
438: }
439:
440: /** Convert extended command docs into native Stricli help documentation. */
441: function prepareNativeDocs(
442: docs: CommandDocumentation
443: ): StricliBuilderArgs<CommandContext>["docs"] {
444: const { examples, ...nativeDocs } = docs;
445: if (!examples?.length) {
446: return nativeDocs;
447: }
448:
449: const renderedExamples = examples
450: .map(({ description, command }) => ` ${command} # ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/agent-conversation.md</path> <type>file</type> <content> 1: --- 2: name: sentry-cli-agent-conversation 3: version: 0.45.0-dev.0 4: description: List and view agent conversations 5: requires: 6: bins: ["sentry"] 7: auth: true 8: --- 9: 10: # Agent-conversation Commands 11: 12: List and view agent conversations 13: 14: ### `sentry agent-conversation list [<org>]` 15: 16: List recent agent conversations 17: 18: **Flags:** 19: - `-n, --limit <value> - Number of conversations (1-1000) - (default: "25")` 20: - `-q, --query <value> - Search query` 21: - `-t, --period <value> - Time range: "7d", "2026-08-01..2026-09-01", ">=2026-08-01" - (default: "7d")` 22: - `-f, --fresh - Bypass cache, re-detect projects, and fetch fresh data` 23: - `-c, --cursor <value> - Navigate pages: "next", "prev", "first" (or raw cursor string)` 24: 25: **JSON Fields** (use `--json --fields` to select ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/test/lib/scanner-flags.integration.test.ts</path>
<type>file</type>
<content>
45: write(data: string | Uint8Array) {
46: stderr +=
47: typeof data === "string" ? data : new TextDecoder().decode(data);
48: return true;
49: },
50: };
51: const mockProcess = {
52: ...process,
53: // Route the underlying process streams into our buffers too — Stricli's
54: // argument-scanner errors write to context.process.stderr, not context.stderr.
55: stdout: {
56: write(data: string | Uint8Array) {
57: stdout +=
58: typeof data === "string" ? data : new TextDecoder().decode(data);
59: return true;
60: },
61: },
62: stderr: captureStderr,
63: exitCode: undefined,
64: } as unknown as typeof process;
65: const context: SentryContext = {
66: process: mockProcess,
67: env: { ...process.env },
68: cwd: emptyCwd,
69: homeDir: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/test/lib/help-positional.test.ts</path>
<type>file</type>
<content>
150: });
151:
152: describe("help recovery on ValidationError", () => {
153: test("sentry trace view help → shows help for trace view", async () => {
154: // "help" fails hex ID validation → ValidationError → recovery shows help
155: const { stdout, stderr } = await runCommand(["trace", "view", "help"]);
156:
157: expect(stdout).toContain("sentry trace view");
158: expect(stderr).toContain("--help");
159: });
160:
161: test("sentry log view help → shows help for log view", async () => {
162: const { stdout, stderr } = await runCommand(["log", "view", "help"]);
163:
164: expect(stdout).toContain("sentry log view");
165: expect(stderr).toContain("--help");
166: });
167: });
168:
169: describe("help command unchanged", () => {
170: test("sentry help still shows branded help", async () => {
171: const { stdout, stderr } ...
<path>/home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/issue.md</path> <type>file</type> <content> 145: | `-u, --until <until>` | Condition for unarchival: forever, auto, 30m, 10x, 10u, 10x/5m, etc. | 146: 147: ### `sentry issue merge <issue...>` 148: 149: Merge 2+ issues into a single canonical group 150: 151: **Arguments:** 152: 153: | Argument | Description | 154: |----------|-------------| 155: | `<issue...>` | Issue IDs to merge (2 or more required) | 156: 157: **Options:** 158: 159: | Option | Description | 160: |--------|-------------| 161: | `-i, --into <into>` | Prefer this issue as the canonical parent (included in the merge if not already listed) | 162: (Showing lines 145-162 of 463. Use offset=163 to continue.) </content>
<path>/home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/release.md</path> <type>file</type> <content> 135: 136: ### `sentry release deploy <org/version> <environment> [<name>]` 137: 138: Create a deploy for a release 139: 140: **Arguments:** 141: 142: | Argument | Description | 143: |----------|-------------| 144: | `<org/version>` | [<org>/]<version> - Release version | 145: | `<environment>` | Deploy environment (e.g. production) | 146: | `[<name>]` | Optional deploy name (quote multi-word names, e.g. ...
ac72db51b fix(docs): preserve public positional semantics packages/cli/script/generate-command-docs.ts | 3 +- .../cli/src/commands/agent-conversation/view.ts | 12 ++++- packages/cli/src/lib/command.ts | 8 ++- packages/cli/src/lib/introspect.ts | 11 +++- packages/cli/test/lib/help-positional.test.ts | 50 ++++++++++-------- packages/cli/test/lib/introspect.property.test.ts | 16 ++++++ packages/cli/test/lib/introspect.test.ts | 48 +++++++++++++++++ .../cli/test/lib/scanner-flags.integration.test.ts | 61 ++++++++++++++++------ .../test/script/generate-skill-markdown.test.ts | 26 +++++++++ 9 files changed, 191 insertions(+), 44 deletions(-) diff --git a/packages/cli/script/generate-command-docs.ts b/packages/cli/script/generate-command-docs.ts index 8c9ce6332..ac02d200b 100644 --- a/packages/cli/script/generate-command-docs.ts +++ b/packages/cli/script/generate-command-docs.ts @@ -128,61 +128,62 @@ function ...
Found 10 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/alert/issues/create.ts:
Line 14: import { ContextError, ValidationError } from "../../../lib/errors.js";
Line 60: export const createCommand = buildCommand({
Line 101: optional: true as const,
Line 115: optional: true,
Line 122: optional: true,
Line 134: optional: true,
Line 141: optional: true,
Line 147: optional: true,
Line 153: optional: true,
Line 193: throw new ContextError("Organization and project", USAGE_HINT);
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/alert/issues/create.ts</path>
<type>file</type>
<content>
55: return `Would create issue alert rule '${result.name}' in ${result.org}/${result.project}.`;
56: }
57: return `Created issue alert rule ${result.id ?? "(unknown id)"} in ${result.org}/${result.project}: ${result.name} (${result.status ?? "active"}).`;
58: }
59:
60: export const createCommand = buildCommand({
61: docs: {
62: brief: "Create an issue alert rule",
63: fullDescription:
64: "Create a project-scoped issue alert rule. The target may be an explicit " +
65: "<org>/<project>, an auto-detected project, or a bare project search when " +
66: "it resolves to exactly one project.\n\n" +
67: "Required fields:\n" +
68: " --name, --condition (>=1), --action (>=1)\n\n" +
69: "Optional fields:\n" +
70: " --frequency, --environment, --filter, --filter-match, --owner\n\n" +
71: "Conditions and ...
[{"placeholder":"org/conversation-id","brief":"[<org>/]<conversation-id> - Org (optional) and conversation ID","optional":true,"variadic":false}]
error: pathspec 'apps/cli-docs/src/content/docs/commands/agent-conversation.md' did not match any file(s) known to git error: pathspec 'apps/cli-docs/src/content/docs/commands/release.md' did not match any file(s) known to git error: pathspec 'apps/cli-docs/src/content/docs/commands/issue.md' did not match any file(s) known to git Did you forget to 'git add'?
Found 1 matches /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/schema.md: Line 18: | `<resource...>` | Resource name and optional operation |
USAGE
sentry agent-conversation view [<org>/]<conversation-id>
sentry agent-conversation view --help
View the full transcript of an agent conversation.
The org is optional and auto-detected from your project context when
omitted. Prefix the ID with an org slug to target a specific org.
Examples:
sentry agent-conversation view conv-123 # View full transcript (organization auto-detected)
sentry agent-conversation view my-org/conv-123 # Explicit organization
sentry agent-conversation view my-org/conv-123 --json # JSON output
ALIASES
sentry agent-conversation show
FLAGS
-f [--fresh] Bypass cache, re-detect projects, and fetch fresh data [default = false]
[--json] Output as JSON [default = false]
[--fields] Comma-separated fields to include in JSON output (dot.notation supported)
-h --help Print help information and exit
-- All subsequent inputs should be ...
Found 2 matches /home/byk/Code/getsentry/cli-pr-1558/packages/cli/script/generate-skill.ts: Line 496: commands: extractRouteGroupCommands(target, routeName, docExamples), Line 504: commands: [buildCommandInfo(target, path, examples)],
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/script/generate-skill.ts</path>
<type>file</type>
<content>
390: }
391: const code = token.text.trim();
392: if (currentCmd && examples.has(currentCmd)) {
393: appendExample(examples, currentCmd, code);
394: } else {
395: const target = matchExampleToCommand(
396: code,
397: commandPaths,
398: groupFallback,
399: defaultCommandPath
400: );
401: if (target) {
402: appendExample(examples, target, code);
403: }
404: }
405: }
406: }
407:
408: /**
409: * Load examples for a specific command group from docs using the `marked`
410: * AST parser. Walks the token tree to find command headings and associate
411: * bash code blocks with each command.
412: *
413: * Handles both auto-generated reference sections (`### \`sentry ...\`` headings)
414: * and hand-written custom sections (`## Examples` with descriptive headings)
415: * by matching ...
ac72db51b18bb3e23999483233c9ad02d72ea531 ec83887a16f780f32fba4b7d710bad262dba3a22 ac72db51b18bb3e23999483233c9ad02d72ea531 92109205f179b9b3cad90ca4df73a855d75d64ba 92109205f179b9b3cad90ca4df73a855d75d64ba ec83887a16f780f32fba4b7d710bad262dba3a22 e24b72e24667e4605f6e839f22c9df55f4d6662c4aaff28ed126b8e1637bcbc6 - # branch.oid ac72db51b18bb3e23999483233c9ad02d72ea531 # branch.head fix/agent-conversation-reference-root-cause # branch.upstream origin/pr-1558
No files found
Found 8 matches /home/byk/Code/getsentry/cli-pr-1558/.gitignore: Line 49: # docs (now under apps/cli-docs) Line 50: apps/cli-docs/dist Line 51: apps/cli-docs/node_modules Line 52: apps/cli-docs/.astro Line 73: apps/cli-docs/src/content/docs/commands/ Line 74: apps/cli-docs/src/content/docs/configuration.md Line 77: apps/cli-docs/public/.well-known/skills/index.json Line 85: apps/cli-docs/DOCUMENTATION_GAPS.md
packages/cli/src/lib/introspect.ts:214-216 always renders arrays as required, and :248-255 hardcodes optional: false, ignoring params.parameter.optional.
This breaks valid commands:
packages/cli/src/commands/event/send.ts:140-147 explicitly marks files optional; :297-320 supports sending with --message and no file.apps/cli-docs/src/content/docs/commands/event.md:49-57 incorrectly renders sentry event send <args...>.packages/cli/src/commands/schema.ts:359-365 supports no positional arguments, but generated schema.md:18 renders <resource...>.Fix: Preserve array optionality in getPositionalString() and extractPositionals(), then mark every semantically optional array command explicitly. Keep issue merge required.
Regression: Add property tests covering both optional and required arrays. Assert generated output contains [<args...>] for event send and <issue...> for issue merge.
packages/cli/src/commands/agent-conversation/view.ts:30-31,75 defines the canonical [<org>/]<conversation-id> syntax. However, packages/cli/src/lib/introspect.ts:307-309 applies __primaryUsage only to the command heading while deriving argument rows from raw parser metadata. packages/cli/script/generate-command-docs.ts:200-204 then renders that raw metadata.
The resulting generated page is contradictory:
apps/cli-docs/src/content/docs/commands/agent-conversation.md:49 has the correct heading.:57 renders [<org/conversation-id>], exposing the rejected raw syntax and implying that the required conversation ID is optional.Fix: Carry the primary customUsage into argument-row metadata, such as an authoritative syntax field, and use it when rendering compound single-token positionals. Never derive public syntax solely from parser optionality. ...
Date: Sep 10, 2026 * 🔴 (13:28) Organization slugs and project selectors (slugs or IDs) never contain `/`; therefore the target argument has at most one slash. * 🔴 (13:28) `agent-conversation list` uses `COMMAND_NAME = "agent-conversation list"` and now configures `positional: POSITIONAL`. * 🔴 (13:28) Target-validation code imports `ContextError` and `validationError` from `../../lib/errors.js`…
🔴 (13:28) Added exported `CommandExample` metadata type with readonly `description` and readonly `command`; `command` is a complete command line including the `sentry` executable. 🔴 (13:28) `CommandDocumentation` now extends `StricliBuilderArgs<CommandContext>["docs"]` with optional readonly `examples?: readonly CommandExample[]` for canonical examples consumed by generated documentation. 🔴 (1…
🔴 (13:27) `sentry org list` supports `[--limit N] [--json]`. 🔴 (13:27) A `<project>` argument searches for a project by name across all accessible organizations. 🔴 (13:27) `org view` and `project view` mirror `gh repo view`: they work from DSN-derived context or with an explicit argument. 🔴 (13:27) Missing-context errors must use the `ContextError` class. 🔴 (13:27) Automatic command aliases …
🔴 (13:24) Repository root instructions in `/home/byk/Code/getsentry/cli-pr-1558/AGENTS.md` identify the agent as Jared (Outpost agent), an autonomous GitHub coding agent whose working directory is `/workspace/repo`. 🔴 (13:24) Repository workflow is `triage → explore → plan → implement → review → ship`; `worker` is a deprecated alias of `implement`. 🔴 (13:24) Model assignments: heavy triage/pla…