Dashboard › cli › Session 0e6sRF7bvO9B
0e6sRF7bvO9BWWAlEConduct a fresh independent, read-only correctness/adversarial review of getsentry/cli PR #1558 in /home/byk/Code/getsentry/cli-pr-1558. Prior reviewer attempts returned empty output, so a substantive report is mandatory. Do not edit files, commit, fetch, switch branches, or mutate VCS state.
Immutable target: base bd065083c3b82677747b97a6cc7f5cf57532d3bc, head fc5d50e2324e2b6bb2067976bf1515dab45224fb, expected SHA-256 for git diff base...head is 03c5772e78b393b3979c44754709d7f401bb37a71e5679b34c50a9cc8334c2d0. Verify base/head, clean worktree, and hash before and after; report BLOCKED if any differ.
Inspect every changed file and relevant surrounding implementation/tests. Validate these contracts: Stricli definitions are authoritative for usage and structured examples; optional tuple positionals render [<name>] in introspection and website tables while required and variadic behavior remains intact; command metadata survives wrappers/native help/introspection without changing public CommandInfo.examples: string[]; metadata examples override legacy fragments while fragments remain fallback; native examples precede JSON-field help; website/skill generators share stable formatting and generated artifacts match source; fragment coverage is not weakened beyond metadata-owned examples. Verify agent-conversation list derives optional usage from one POSITIONAL definition. Verify view accepts exactly zero or one slash, rejects empty segments/multiple slashes before org resolution/API calls, uses ContextError for omission and fielded ValidationError for malformed supplied input, preserves valid organization auto-detection and explicit-org behavior. Check wrapper typing/runtime behavior, hidden routes, generated signatures, and backward compatibility. Review .github/workflows/pr-risk.yml: fork PRs still score and upload artifacts without forbidden label mutation, same-repo PRs still label, and the GitHub expression/action input behaves as intended. ...
Skill "repo-setup" not found. Available skills: ast-grep, customize-opencode, jj-create-pr, jj-guide, jj-update-pr, jj-workflow
<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
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/CONTRIBUTING.md
<path>/home/byk/Code/getsentry/cli-pr-1558/.lore.md</path>
<type>file</type>
<content>
1: <!-- Managed by lore (https://github.com/BYK/loreai) — manual edits are imported on next session. -->
2:
3: ## Long-term Knowledge
4:
5: ### Architecture
6:
7: <!-- lore:01a02357-f0a8-7fdb-9e9d-b0710cfe65c9 -->
8: * **API output binary and HTTP contracts**: Always preserve strict output-mode and binary-safety contracts. `sentry api` must preserve `rawApiRequest()` status text; empty textual non-2xx bodies must produce an HTTP status/request fallback, and JSON mode must expose `{status, statusText, body}` so empty success and error responses are distinguishable. Binary `Uint8Array` successes bypass formatters and remain raw; binary errors emit only status/content-type/byte-count summaries, never bytes or JSON coercion. Prompts must never block scripted runs or interleave with stdout JSON.
9:
10: <!-- lore:019ef480-47f1-7708-80cb-514ac37a3fde -->
11: * **@sentry/symbolic 13.4.0 API surface: ...
fc5d50e2324e2b6bb2067976bf1515dab45224fb bd065083c3b82677747b97a6cc7f5cf57532d3bc fc5d50e2324e2b6bb2067976bf1515dab45224fb bd065083c3b82677747b97a6cc7f5cf57532d3bc 03c5772e78b393b3979c44754709d7f401bb37a71e5679b34c50a9cc8334c2d0 -
M .github/workflows/pr-risk.yml 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/s...
<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 ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/.cursor/rules/ultracite.mdc</path>
<type>file</type>
<content>
1: ---
2: description: Ultracite Rules - AI-Ready Formatter and Linter
3: globs: "**/*.{ts,tsx,js,jsx,json,jsonc,html,vue,svelte,astro,css,yaml,yml,graphql,gql,md,mdx,grit}"
4: alwaysApply: false
5: ---
6:
7: # Ultracite Code Standards
8:
9: This project uses **Ultracite**, a zero-config Biome preset that enforces strict code quality standards through automated formatting and linting.
10:
11: ## Quick Reference
12:
13: - **Format code**: `npx ultracite fix`
14: - **Check for issues**: `npx ultracite check`
15: - **Diagnose setup**: `npx ultracite doctor`
16:
17: Biome (the underlying engine) provides extremely fast Rust-based linting and formatting. Most issues are automatically fixable.
18:
19: ---
20:
21: ## Core Principles
22:
23: Write code that is **accessible, performant, type-safe, and maintainable**. Focus on clarity and explicit intent over brevity. ...
<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: ...
diff --git a/packages/cli/src/commands/agent-conversation/list.ts b/packages/cli/src/commands/agent-conversation/list.ts
index 009809093..806842e71 100644
--- a/packages/cli/src/commands/agent-conversation/list.ts
+++ b/packages/cli/src/commands/agent-conversation/list.ts
@@ -1,193 +1,213 @@
/**
* sentry agent-conversation list
*
* List recent agent conversations from Sentry projects.
*/
import type { SentryContext } from "../../context.js";
import { listConversations } from "../../lib/api-client.js";
import { validateLimit } from "../../lib/arg-parsing.js";
import {
advancePaginationState,
buildPaginationContextKey,
hasPreviousPage,
resolveCursor,
} from "../../lib/db/pagination.js";
import { ContextError } from "../../lib/errors.js";
import { formatConversationTable } from "../../lib/formatters/conversation.js";
import { filterFields } from "../../lib/formatters/json.js";
import { CommandOutput } from "../../lib/formatters/output.js";
+import { ...
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
@@ -216,98 +216,101 @@ function getMultiCommandRoutes(): Map<string, RouteInfo> {
/**
* Given a route map target, find the name of its default command (if any).
* Compares the default command object reference against all subcommand entries.
*/
function findDefaultInRouteMap(target: RouteMap): string | undefined {
if (!target.getDefaultCommand) {
return;
}
const defaultCmd = target.getDefaultCommand();
if (!defaultCmd) {
return;
}
for (const sub of target.getAllEntries()) {
if (sub.target === defaultCmd) {
return sub.name.original;
}
}
return;
}
/**
* Extract the default command name for a route by inspecting the Stricli route map.
* Returns the default command name (e.g., "serve" for `local`) or undefined. ...
diff --git a/packages/cli/test/commands/agent-conversation/list.test.ts b/packages/cli/test/commands/agent-conversation/list.test.ts
index 21a26bd6c..e080697cc 100644
--- a/packages/cli/test/commands/agent-conversation/list.test.ts
+++ b/packages/cli/test/commands/agent-conversation/list.test.ts
@@ -233,100 +233,113 @@ describe("listCommand.func", () => {
test("resolves org from positional arg", async () => {
listConversationsSpy.mockResolvedValue({
data: sampleConversations,
nextCursor: undefined,
});
const { context } = createMockContext();
const func = await listCommand.loader();
await func.call(context, JSON_FLAGS, ORG);
// resolveOrg receives the positional org directly
expect(resolveOrgSpy).toHaveBeenCalledWith(
expect.objectContaining({ org: ORG })
);
// listConversations called with the resolved org
expect(listConversationsSpy).toHaveBeenCalledWith(ORG, expect.any(Object));
});
...
...output truncated... Full output saved to: /home/byk/.local/share/opencode/tool-output/tool_0886f47fc001AdI8MdlW7mqWbx -sentry agent-conversation view my-org conv-123 - -# JSON output -sentry agent-conversation view my-org conv-123 --json -``` diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/SKILL.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/SKILL.md index f1a71fb6a..85a58de78 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/SKILL.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/SKILL.md @@ -331,164 +331,164 @@ npm install -g sentry ### Authentication ```bash sentry auth sentry auth --token YOUR_SENTRY_API_TOKEN sentry auth status sentry auth logout ``` ## Command Reference ### Auth Authenticate with Sentry - `sentry auth login` — Authenticate with Sentry - `sentry auth logout` — Log out of Sentry - `sentry auth refresh` — Refresh your OAuth access token - `sentry auth status` — View authentication status - ...
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>
<path>/home/byk/Code/getsentry/cli-pr-1558/node_modules</path> <type>directory</type> <entries> .modules.yaml .pnpm-workspace-state.json .pnpm/ (3 entries) </entries>
<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>
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/README.md /home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/package.json /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 55 matches /home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.d.ts: Line 470: * Controls whether or not to include optional flags and positional parameters in the usage line. Line 471: * If enabled, all parameters that are optional at runtime (including parameters with defaults) will be hidden. Line 551: * Locale is optionally provided at runtime by the context. Line 637: readonly optional?: boolean; Line 656: * Parameter is required and cannot be set as optional. Line 658: readonly optional?: false; Line 671: * Only available for runtime-optional parameters. Line 677: * Parameter is optional and must be specified as such. Line 679: readonly optional: true; Line 682: * Only available for optional parameters. Line 697: readonly optional?: boolean; Line 701: * Parameter is required and cannot be set as optional. Line 703: readonly optional?: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.d.ts</path>
<type>file</type>
<content>
620: }
621:
622: interface BaseFlagParameter {
623: /**
624: * In-line documentation for this flag.
625: */
626: readonly brief: string;
627: /**
628: * String that serves as placeholder for the value in the generated usage line. Defaults to "value".
629: */
630: readonly placeholder?: string;
631: }
632: interface BaseBooleanFlagParameter extends BaseFlagParameter {
633: /**
634: * Indicates flag should be treated as a boolean.
635: */
636: readonly kind: "boolean";
637: readonly optional?: boolean;
638: /**
639: * Default flag value if input is not provided at runtime.
640: *
641: * If no value is provided, boolean flags default to `false`.
642: */
643: readonly default?: boolean;
644: /**
645: * Whether to generate a negated version of this flag (e.g., ...
<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 33 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.js:
Line 185: function maximum(arr1, arr2) {
Line 200: return maximum(acc, lengths);
Line 421: * Expected (maximum) count of positional arguments.
Line 440: * If specified, indicates the minimum number of arguments that are expected and the last argument count.
Line 625: if (flag.optional) {
Line 804: if (positional.kind === "tuple") {
Line 809: if (typeof positional.maximum === "number" && positionalIndex >= positional.maximum) {
Line 810: throw new UnexpectedPositionalError(positional.maximum, input);
Line 820: if (positional.kind === "array") {
Line 821: if (typeof positional.minimum === "number" && positionalIndex < positional.minimum) {
Line 824: positional.minimum,
Line 844: if (param.optional) {
Line 993: if (positional.kind === "array") {
Line ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.js</path>
<type>file</type>
<content>
780: storeInput(
781: flagInputs,
782: config.caseStyle,
783: nextFlag.namedFlag,
784: nextFlag.negated ? "false" : "true"
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: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.js</path>
<type>file</type>
<content>
1810: const aliases = Object.entries(parameters.aliases).filter((entry) => entry[1] === name);
1811: if (aliases.length === 1 && aliases[0]) {
1812: displayName = `-${aliases[0][0]}`;
1813: }
1814: }
1815: if (flag.kind === "boolean") {
1816: return [flag, displayName];
1817: }
1818: if (flag.kind === "enum" && typeof flag.placeholder !== "string") {
1819: return [flag, `${displayName} ${flag.values.join("|")}`];
1820: }
1821: const placeholder = flag.placeholder ?? "value";
1822: return [flag, `${displayName} ${placeholder}`];
1823: }).map(([flag, usage]) => {
1824: if (flag.kind === "parsed" && flag.variadic) {
1825: if (isOptionalAtRuntime(flag)) {
1826: return wrapVariadicFlag(wrapOptionalFlag(usage));
1827: }
1828: return ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.js</path>
<type>file</type>
<content>
2070: throw new InternalError(
2071: `Unable to allow negation for --${internalFlagName} as it conflicts with --${negatedFlagName}`
2072: );
2073: }
2074: }
2075: }
2076: }
2077: function checkForInvalidVariadicSeparators(flags) {
2078: for (const [internalFlagName, flag] of Object.entries(flags)) {
2079: if ("variadic" in flag && typeof flag.variadic === "string") {
2080: if (flag.variadic.length < 1) {
2081: throw new InternalError(
2082: `Unable to use "" as variadic separator for --${internalFlagName} as it is empty`
2083: );
2084: }
2085: if (/\s/.test(flag.variadic)) {
2086: throw new InternalError(
2087: `Unable to use "${flag.variadic}" as variadic separator for --${internalFlagName} as it contains whitespace`
2088: );
2089: ...
Found 100 matches (more matches available)
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/introspect.ts:
Line 37: fullDescription?: string;
Line 46: fullDescription?: string;
Line 55: * reads it to populate {@link CommandInfo.jsonFields}.
Line 102: export type CommandInfo = {
Line 105: fullDescription?: string;
Line 131: commands: CommandInfo[];
Line 139: | { kind: "command"; info: CommandInfo }
Line 280: * Build a {@link CommandInfo} from a Stricli Command.
Line 286: export function buildCommandInfo(
Line 290: ): CommandInfo {
Line 298: fullDescription: cmd.fullDescription,
Line 324: ): CommandInfo[] {
Line 325: const commands: CommandInfo[] = [];
Line 336: commands.push(buildCommandInfo(subTarget, path, examples));
Line 378: commands: [buildCommandInfo(target, path)],
Line 453: info: buildCommandInfo(target, `sentry ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/introspect.ts</path>
<type>file</type>
<content>
1: /**
2: * Route Tree Introspection
3: *
4: * Shared module for extracting structured metadata from Stricli's route tree.
5: * Used at runtime by `sentry help --json` and at build time by `generate-skill.ts`.
6: *
7: * While @stricli/core exports RouteMap and Command types, they require complex
8: * generic parameters (CommandContext) and don't export internal types like
9: * RouteMapEntry or FlagParameter. These simplified types are purpose-built
10: * for introspection and documentation generation.
11: */
12:
13: import type { CommandExample } from "./command.js";
14: import {
15: extractSchemaFields,
16: type SchemaFieldInfo,
17: } from "./formatters/output.js";
18: import { fuzzyMatch } from "./fuzzy.js";
19:
20: // ---------------------------------------------------------------------------
21: // Stricli Runtime Types (simplified for introspection)
22: ...
/home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/index.md /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/schema.md /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/api.md /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/local.md /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/info.md /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/init.md /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/trial.md /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/trace.md /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/status.md /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/span.md /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/sourcemap.md /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/sr...
Found 31 matches /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/dashboard.md: Line 18: | `[<org/title-filter...>]` | [<org/project>] [<name-glob>] | Line 37: | `[<org/project/dashboard...>]` | [<org/project>] <dashboard-id-or-title> | Line 58: | `[<org/project/title...>]` | [<org/project>] <title> | Line 68: | `[<org/project/dashboard/title...>]` | [<org/project>] <dashboard> <title> | Line 95: | `[<org/project/dashboard...>]` | [<org/project>] <dashboard-id-or-title> | Line 124: | `[<org/project/dashboard...>]` | [<org/project>] <dashboard-id-or-title> | Line 144: | `[<org/dashboard...>]` | [<org/project>] <dashboard-id-or-title> | Line 161: | `[<org/dashboard...>]` | [<org/project>] <dashboard-id-or-title> | /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/monitor.md: Line 18: | `[<monitor-slug ...
Found 78 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/mutate-command.ts:
Line 313: * positional: { ... },
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/trial/start.ts:
Line 94: positional: {
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/trial/list.ts:
Line 217: positional: {
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/trace/view.ts:
Line 483: positional: {
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/trace/logs.ts:
Line 129: positional: {
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/trace/list.ts:
Line 222: positional: {
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/span/view.ts:
Line 383: positional: {
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/span/list.ts:
Line 574: positional: {
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/sourcemap/upload.ts:
Line 230: ...
<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 ...
Found 4 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/mutate-command.ts:
Line 405: return buildCommand({
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/list-command.ts:
Line 618: return buildCommand({
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/command.ts:
Line 165: * buildCommand({
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/formatters/output.ts:
Line 10: * buildCommand({
<path>/home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/fragments/commands/agent-conversation.md</path> <type>file</type> <content> (End of file - total 0 lines) </content>
<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 ...
Your first result was empty and cannot satisfy the correctness merge gate. Complete the read-only correctness/adversarial review now. The immutable target was just reverified: clean worktree; base bd065083c3b82677747b97a6cc7f5cf57532d3bc; head fc5d50e2324e2b6bb2067976bf1515dab45224fb; triple-dot patch SHA-256 03c5772e78b393b3979c44754709d7f401bb37a71e5679b34c50a9cc8334c2d0. Preserve every contract and review area from the original prompt. Return findings with exact current file:line evidence or explicit PASS statements and residual risks/testing gaps. For every defect, include impact, concrete fix, and deterministic regression. If tools prevent inspection, return BLOCKED with the exact error. Never return empty output. Reverify the immutable target after inspection. End exactly MERGE or DO-NOT-MERGE. Do not modify anything.
<path>/home/byk/Code/getsentry/cli-pr-1558/.github/workflows/pr-risk.yml</path>
<type>file</type>
<content>
1: name: PR Risk Experiment
2:
3: on:
4: pull_request:
5: types: [opened, synchronize, reopened, ready_for_review]
6:
7: permissions:
8: contents: read
9: pull-requests: write
10: issues: write
11:
12: concurrency:
13: group: pr-risk-${{ github.event.pull_request.number }}
14: cancel-in-progress: true
15:
16: jobs:
17: risk:
18: name: Score PR risk
19: runs-on: ubuntu-latest
20: if: github.event.pull_request.draft == false
21:
22: steps:
23: - name: Score current PR
24: uses: getsentry/pr-risk-action@v0
25: with:
26: repo: ${{ github.repository }}
27: pr-number: ${{ github.event.pull_request.number }}
28: result-path: risk-pr-result.json
29: skip-reviews: "true"
30: apply-label: ${{ github.event.pull_request.head.repo.full_name == github.repository }}
31:
32: - ...
Found 2 matches
/home/byk/Code/getsentry/cli-pr-1558/.github/workflows/pr-risk.yml:
Line 24: uses: getsentry/pr-risk-action@v0
Line 30: apply-label: ${{ github.event.pull_request.head.repo.full_name == github.repository }}
name: PR Risk Action
description: Score a pull request as low, medium, or high risk.
inputs:
repo:
description: GitHub repository as owner/name.
required: true
pr-number:
description: Pull request number.
required: true
profile:
description: Profile directory under profiles/. Defaults to owner__repo.
required: false
default: ""
history:
description: Optional raw historical PR JSONL or JSONL.GZ path. Defaults to the selected profile history.
required: false
default: ""
model:
description: Optional saved model JSON path. Defaults to the selected profile model.
required: false
default: ""
result-path:
description: JSON result output path.
required: false
default: risk-pr-result.json
skip-reviews:
description: Skip fetching current PR reviews.
required: false
default: "true"
apply-label:
description: "Apply risk labels to the pull request. Requires issues: write in the caller workflow."
...
Found 3 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/app.ts:
Line 6: UnsatisfiedPositionalError,
Line 227: * command which then fails with UnsatisfiedPositionalError because no issue ID
Line 312: if (exc instanceof UnsatisfiedPositionalError) {
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/app.ts</path> <type>file</type> <content> 200: "bash-hook": true, 201: }, 202: }, 203: }); 204: 205: /** 206: * Route group names that have `defaultCommand` set. 207: * 208: * Derived from the route map at module load time — no manual list to maintain. 209: * Used to detect the no-args case (`sentry issue` with no subcommand) 210: * so we can show a usage hint instead of a confusing parse error. 211: */ 212: const routesWithDefaultCommand: ReadonlySet<string> = new Set( 213: routes 214: .getAllEntries() 215: .filter( 216: (e) => 217: isRouteMap(e.target as unknown) && 218: (e.target as unknown as RouteMap).getDefaultCommand?.() 219: ) 220: .map((e) => e.name.original) 221: ); 222: 223: /** 224: * Detect when the user typed a bare route group with no subcommand (e.g., `sentry issue`). ...
<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>
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/command.ts</path> <type>file</type> <content> 1: /** 2: * Command builder with telemetry, global flag injection, and output modes. 3: * 4: * Provides `buildCommand` — the standard command builder for all Sentry CLI 5: * commands. It wraps Stricli's `buildCommand` with: 6: * 7: * 1. **Automatic flag/arg telemetry** — captures flag values and positional 8: * arguments as Sentry span context for observability. 9: * 10: * 2. **Hidden global logging flags** — injects `--log-level` and `--verbose` 11: * into every command's parameters. These are intercepted before the original 12: * `func` runs: the logger level is set, and the injected flags are stripped 13: * so the original function never sees them. If a command already defines its 14: * own `--verbose` flag (e.g. `api` uses it for HTTP output), the injected 15: * one is skipped and the command's own value is used for both purposes. ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/command.ts</path>
<type>file</type>
<content>
400: function buildFieldsFlag(outputConfig?: OutputConfig<any>) {
401: if (!outputConfig?.schema) {
402: return FIELDS_FLAG;
403: }
404: const schemaFields = extractSchemaFields(outputConfig.schema);
405: if (schemaFields.length === 0) {
406: return FIELDS_FLAG;
407: }
408: const fieldNames = schemaFields.map((f) => f.name).join(", ");
409: return {
410: ...FIELDS_FLAG,
411: brief: `${FIELDS_FLAG.brief}. Available: ${fieldNames}`,
412: };
413: }
414:
415: /**
416: * Enrich command docs with a JSON fields section when a schema is registered.
417: * Appends available field names and types to `fullDescription` so they appear
418: * in Stricli's `--help` output. ...
Found 1 matches /home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/api/conversations.ts: Line 119: export async function getConversationSpans(
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/api/conversations.ts</path>
<type>file</type>
<content>
80: const { data, headers } = await apiRequestToRegion<ConversationListItem[]>(
81: regionUrl,
82: `/organizations/${orgSlug}/agents/conversations/`,
83: { params, schema: array(ConversationListItemSchema) }
84: );
85:
86: const { nextCursor } = parseLinkHeader(headers.get("link") ?? null);
87:
88: return { data, nextCursor };
89: }
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: ...
<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: ...
(no output)
ast-grep 0.40.5
packages/cli/src/commands/auth/index.ts:29: hideRoute: {
packages/cli/src/commands/auth/index.ts:30: default: true,
packages/cli/src/commands/auth/index.ts:31: },
Debug AST:
program (0,0)-(0,25)
lexical_declaration (0,0)-(0,25)
variable_declarator (0,6)-(0,25)
name: identifier (0,6)-(0,7)
value: object (0,10)-(0,25)
pair (0,12)-(0,23)
key: property_identifier (0,12)-(0,19)
value: identifier (0,21)-(0,23)
(no output)
help[positional-default]:
┌─ packages/cli/src/commands/trace/view.ts:496:9
│
482 │ parameters: {
│ ╭───────────────'
483 │ ╭ │ positional: {
· │ │
491 │ │ │ },
│ ╰─│─────'
· │
496 │ │ default: false,
│ │ ^^^^^^^^^^^^^^
· │
507 │ │ },
│ ╰───'
help[positional-default]:
┌─ packages/cli/src/commands/trace/view.ts:501:9
│
482 │ parameters: {
│ ╭───────────────'
483 │ ╭ │ positional: {
· │ │
491 │ │ │ },
│ ╰─│─────'
· │
501 │ │ default: false,
│ │ ^^^^^^^^^^^^^^
· │
507 │ │ },
│ ╰───'
help[positional-default]:
┌─ packages/cli/src/commands/dart-symbol-map/upload.ts:200:9
│
179 │ parameters: {
│ ╭───────────────'
180 │ ╭ │ positional: {
· │ │
189 │ │ │ },
│ ╰─│─────'
· │
200 │ │ default: false,
│ │ ^^^^^^^^^^^^^^
· │
206 │ │ },
│ ...
(no output)
[
{
"path": "sentry help",
"hidden": false,
"positional": {
"kind": "array",
"parameter": {
"brief": "Command to get help for",
"parse": "[function String]",
"placeholder": "command"
}
}
},
{
"path": "sentry alert issues list",
"hidden": false,
"positional": {
"kind": "tuple",
"parameters": [
{
"placeholder": "org/project",
"brief": "<org>/ (all projects), <org>/<project>, or <project> (search)",
"parse": "[function String]",
"optional": true
}
]
}
},
{
"path": "sentry alert issues view",
"hidden": false,
"positional": {
"kind": "tuple",
"parameters": [
{
"placeholder": "org/project/rule-id-or-name",
"brief": "Issue alert rule ID or name",
"parse": "[function String]"
}
]
}
},
{
"path": "sentry alert issues create",
"hidden": false,
...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/issue/merge.ts</path>
<type>file</type>
<content>
240: if (match) {
241: return [match, ...issues.filter((i) => i !== match)];
242: }
243: }
244:
245: throw new ValidationError(
246: `--into '${into}' did not match any of the provided issues.\n\n` +
247: `Provided: ${issues.map((i) => i.shortId).join(", ")}`,
248: "into"
249: );
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. ...
<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 3 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 {
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/errors.ts</path>
<type>file</type>
<content>
380: }
381: }
382: return lines.join("\n");
383: }
384:
385: /**
386: * Missing required context errors (org, project, etc).
387: *
388: * Use when the user **omitted** a required value entirely. For cases where the
389: * user **provided** a value that couldn't be matched, use {@link ResolutionError}
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"). ...
commit 92dc1dab246fa60438667cd8e449426968bf84a6
Author: alicandayan <268751452+alicandayan@users.noreply.github.com>
Commit: Burak Yigit Kaya <byk@sentry.io>
fix(docs): correct agent conversation argument syntax
commit 285a589de9aae902718f18b33a3f13ee0bdef8d7
Author: Burak Yigit Kaya <byk@sentry.io>
Commit: Burak Yigit Kaya <byk@sentry.io>
fix(docs): derive command references from metadata
commit fc5d50e2324e2b6bb2067976bf1515dab45224fb
Author: Burak Yigit Kaya <byk@sentry.io>
Commit: Burak Yigit Kaya <byk@sentry.io>
fix(ci): skip risk labels for fork PRs
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/script/generate-skill.ts</path>
<type>file</type>
<content>
1: #!/usr/bin/env tsx
2: /**
3: * Generate Skill Files from Stricli Command Metadata and Docs
4: *
5: * Introspects the CLI's route tree and merges with documentation
6: * to generate structured documentation for AI agents.
7: *
8: * Produces:
9: * - SKILL.md: compact index with agent guidance + command summaries
10: * - references/*.md: full per-route command documentation
11: * - index.json: skill discovery manifest for .well-known
12: *
13: * Usage:
14: * tsx script/generate-skill.ts
15: *
16: * Output:
17: * plugins/sentry-cli/skills/sentry-cli/SKILL.md
18: * plugins/sentry-cli/skills/sentry-cli/references/*.md
19: * docs/public/.well-known/skills/index.json
20: */
21:
22: import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
23: import { access, readFile, writeFile } from "node:fs/promises";
24: import type { Token ...
<path>/home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/issue.md</path> <type>file</type> <content> 140: 141: **Options:** 142: 143: | Option | Description | 144: |--------|-------------| 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: 163: All commands support `--json` for machine-readable output and `--fields` to select specific JSON fields. 164: 165: <!-- GENERATED:END --> 166: 167: ## Examples 168: 169: ### List ...
Found 3 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.js:
Line 1789: function wrapRequiredParameter(text) {
Line 1792: function wrapOptionalParameter(text) {
Line 1847: return param.optional || typeof param.default !== "undefined" ? wrapOptionalParameter(argName) : wrapRequiredParameter(argName);
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.js</path>
<type>file</type>
<content>
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 wrapRequiredParameter(text) {
1790: return `<${text}>`;
1791: }
1792: function wrapOptionalParameter(text) {
1793: return `[<${text}>]`;
1794: }
1795: function wrapVariadicParameter(text) {
1796: return `<${text}>...`;
1797: }
1798: function formatUsageLineForParameters(parameters, args) {
1799: const ...
Found 21 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/test/script/generate-skill-markdown.test.ts:
Line 10: import { listCommand } from "../../src/commands/agent-conversation/list.js";
Line 11: import { viewCommand } from "../../src/commands/agent-conversation/view.js";
Line 35: "sentry agent-conversation list"
Line 39: "sentry agent-conversation view"
Line 47: "# Explicit organization\nsentry agent-conversation list my-org"
Line 51: "# View full transcript (organization auto-detected)\nsentry agent-conversation view conv-123",
Line 52: "# Explicit organization\nsentry agent-conversation view my-org/conv-123",
Line 53: "# JSON output\nsentry agent-conversation view my-org/conv-123 --json",
Line 57: "**Examples:**",
Line 61: "sentry agent-conversation view conv-123",
Line 64: "sentry agent-conversation view my-org/conv-123",
Line 67: "sentry agent-conversation view ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/app.ts</path>
<type>file</type>
<content>
1: import {
2: type ApplicationText,
3: buildApplication,
4: text_en,
5: UnexpectedPositionalError,
6: UnsatisfiedPositionalError,
7: } from "@stricli/core";
8: import { conversationRoute } from "./commands/agent-conversation/index.js";
9: import { listCommand as conversationListCommand } from "./commands/agent-conversation/list.js";
10: import { alertRoute } from "./commands/alert/index.js";
11: import { apiCommand } from "./commands/api.js";
12: import { authRoute } from "./commands/auth/index.js";
13: import { whoamiCommand } from "./commands/auth/whoami.js";
14: import { bashHookCommand } from "./commands/bash-hook.js";
15: import { buildRoute } from "./commands/build/index.js";
16: import { cliRoute } from "./commands/cli/index.js";
17: import { codeMappingsRoute } from "./commands/code-mappings/index.js";
18: import { dartSymbolMapRoute } from ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/list-command.ts</path>
<type>file</type>
<content>
1: /**
2: * Shared building blocks for org-scoped list commands.
3: *
4: * Provides reusable Stricli parameter definitions (target positional, common
5: * flags, aliases) and a `buildOrgListCommand` factory for commands whose
6: * entire `func` body is handled by `dispatchOrgScopedList`.
7: *
8: * Level A — shared constants (used by all four list commands):
9: * LIST_TARGET_POSITIONAL, LIST_JSON_FLAG, LIST_CURSOR_FLAG,
10: * buildListLimitFlag, LIST_BASE_ALIASES
11: *
12: * Level B — full command builder (team / repo only):
13: * buildOrgListCommand
14: */
15:
16: import { createRequire } from "node:module";
17: import type { Aliases, Command, CommandContext } from "@stricli/core";
18: import type { SentryContext } from "../context.js";
19:
20: const _require = createRequire(import.meta.url);
21:
22: import { parseOrgProjectArg } from ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/mutate-command.ts</path> <type>file</type> <content> 280: /** Skip injecting `--dry-run` flag and `-n` alias. */ 281: noDryRunFlag?: boolean; 282: /** Skip the non-interactive safety guard pre-hook. */ 283: noNonInteractiveGuard?: boolean; 284: }; 285: 286: /** 287: * Build a Stricli command for a destructive operation with automatic safety 288: * flag injection and a non-interactive guard. 289: * 290: * This is a drop-in replacement for `buildCommand` that: 291: * 1. Auto-injects `--yes`, `--force`, and `--dry-run` flags (unless already 292: * defined, controlled by `options`) 293: * 2. Auto-injects `-y`, `-f`, `-n` aliases (skips if key already taken) 294: * 3. ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/agent-conversation/list.ts</path>
<type>file</type>
<content>
1: /**
2: * sentry agent-conversation list
3: *
4: * List recent agent conversations from Sentry projects.
5: */
6:
7: import type { SentryContext } from "../../context.js";
8: import { listConversations } from "../../lib/api-client.js";
9: import { validateLimit } from "../../lib/arg-parsing.js";
10: import {
11: advancePaginationState,
12: buildPaginationContextKey,
13: hasPreviousPage,
14: resolveCursor,
15: } from "../../lib/db/pagination.js";
16: import { ContextError } from "../../lib/errors.js";
17: import { formatConversationTable } from "../../lib/formatters/conversation.js";
18: import { filterFields } from "../../lib/formatters/json.js";
19: import { CommandOutput } from "../../lib/formatters/output.js";
20: import { getPositionalString } from "../../lib/introspect.js";
21: import {
22: buildListCommand,
23: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/agent-conversation/view.ts</path>
<type>file</type>
<content>
1: /**
2: * sentry agent-conversation view
3: *
4: * View the transcript of a specific agent conversation.
5: */
6:
7: import type { SentryContext } from "../../context.js";
8: import { getConversationSpans } from "../../lib/api-client.js";
9: import { buildCommand } from "../../lib/command.js";
10: import { ContextError, validationError } from "../../lib/errors.js";
11: import {
12: buildTranscriptResult,
13: formatTranscriptResult,
14: type TranscriptResult,
15: } from "../../lib/formatters/conversation.js";
16: import { CommandOutput } from "../../lib/formatters/output.js";
17: import {
18: applyFreshFlag,
19: FRESH_ALIASES,
20: FRESH_FLAG,
21: } from "../../lib/list-command.js";
22: import { withProgress } from "../../lib/polling.js";
23: import { resolveOrg } from "../../lib/resolve-target.js";
24:
25: type ViewFlags = {
26: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/test/commands/agent-conversation/view.test.ts</path>
<type>file</type>
<content>
180: // or resolution-failure scenarios.
181: resolveOrgSpy.mockResolvedValue({ org: ORG });
182: withProgressSpy = vi
183: .spyOn(polling, "withProgress")
184: .mockImplementation(mockWithProgress);
185: });
186:
187: afterEach(() => {
188: getConversationSpansSpy.mockRestore();
189: resolveOrgSpy.mockRestore();
190: withProgressSpy.mockRestore();
191: });
192:
193: test("resolves org + conversationId from a slash-separated arg", async () => {
194: resolveOrgSpy.mockResolvedValue({ org: ORG });
195: getConversationSpansSpy.mockResolvedValue({
196: spans: sampleSpans,
197: truncated: false,
198: title: null,
199: });
200:
201: const { context, stdoutWrite } = createMockContext();
202: const func = await viewCommand.loader();
203: await func.call(context, ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/script/generate-command-docs.ts</path>
<type>file</type>
<content>
1: #!/usr/bin/env tsx
2: /**
3: * Generate Command Reference & Configuration Documentation
4: *
5: * Introspects the CLI's route tree and env var registry to generate
6: * accurate reference pages for the documentation website. Flags, arguments,
7: * aliases, and environment variables are extracted directly from source code,
8: * preventing documentation drift.
9: *
10: * Each generated page combines:
11: * 1. Auto-generated reference and examples from CLI metadata or env registry
12: * 2. Hand-written guides and tips from docs/src/fragments/
13: *
14: * The generated output is gitignored. Fragment files are the committed
15: * source of truth for content that cannot live in command definitions.
16: *
17: * Usage:
18: * tsx script/generate-command-docs.ts
19: *
20: * Output:
21: * docs/src/content/docs/commands/{route}.md (one per ...
## 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 ```
Found 9 matches /home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/resolve-target.ts: Line 264: export async function resolveOrgFromDsn( Line 1298: export async function resolveOrgAndProject( Line 1653: export async function resolveOrgProjectOrGuide( Line 1673: export async function resolveOrg( Line 1877: export async function resolveOrgsForListing( Line 1951: export async function resolveOrgProjectTarget( Line 2086: export function resolveOrgProjectFromArg( Line 2385: export async function resolveOrgOptionalProjectTarget( Line 2424: export function resolveOrgOptionalProjectFromArg(
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/resolve-target.ts</path>
<type>file</type>
<content>
1650: *
1651: * @throws {ContextError} When the target cannot be resolved or chosen.
1652: */
1653: export async function resolveOrgProjectOrGuide(
1654: options: ResolveOptions
1655: ): Promise<ResolvedTarget> {
1656: const resolved = await resolveOrgAndProject(options);
1657: return resolved ?? (await guideOrgProjectFailure(options));
1658: }
1659:
1660: /**
1661: * Resolve organization only from multiple sources.
1662: *
1663: * Resolution priority:
1664: * 1. Positional argument
1665: * 2. SENTRY_ORG / SENTRY_PROJECT env vars
1666: * 3. `.sentryclirc` config file
1667: * 4. Config defaults
1668: * 5. ...
Found 3 matches /home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/init.ts: Line 237: validateResourceId(parsed.org, "organization slug"); Line 238: validateResourceId(parsed.project, "project name"); Line 241: validateResourceId(parsed.org, "organization slug");
Found 14 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/arg-parsing.ts:
Line 705: validateResourceId(np.slug, "project slug");
Line 714: validateResourceId(no.slug, "organization slug");
Line 740: validateResourceId(np.slug, "project slug");
Line 801: validateResourceId(np.slug, "project slug");
Line 1153: validateResourceId(fragment, "issue identifier");
Line 1164: validateResourceId(prefix.replace(/\//g, ""), "issue identifier");
Line 1170: validateResourceId(prefix, "project slug");
Line 1267: validateResourceId(id, idLabel);
Line 1321: validateResourceId(org, "organization slug");
Line 1340: validateResourceId(input.replace(/\//g, ""), "issue identifier");
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/input-validation.ts:
Line 149: export function validateResourceId(input: string, label: string): void {
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/init.ts:
Line ...
Found 2 matches /home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/api/infrastructure.ts: Line 489: export async function apiRequestToRegion<T>( Line 646: export async function apiRequestToRegionNoContent(
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/api/infrastructure.ts</path>
<type>file</type>
<content>
430: // Overshot — trim and drop nextCursor (cursor would skip items)
431: if (allRows.length > limit) {
432: return { data: allRows.slice(0, limit) };
433: }
434: return { data: allRows, nextCursor: result.nextCursor };
435: }
436:
437: cursor = result.nextCursor;
438: }
439:
440: // Safety limit reached — warn and return what we have, no nextCursor
441: logger.warn(
442: `Pagination limit reached (${MAX_PAGINATION_PAGES} pages, ${allRows.length} items). ` +
443: "Results may be incomplete."
444: );
445: return { data: allRows.slice(0, limit) };
446: }
447:
448: /**
449: * Wire a single-page fetcher into a limit-bounded, auto-paginating list call. ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/input-validation.ts</path>
<type>file</type>
<content>
1: /**
2: * Input Validation for Agent Hallucination Hardening
3: *
4: * Reusable validators that defend against malformed inputs from AI agents.
5: * Agents hallucinate differently than humans typo — they embed query params
6: * in resource IDs, double-encode URLs, and inject path traversals.
7: *
8: * These validators are applied at the CLI argument parsing layer so all
9: * commands benefit automatically. The Sentry API handles most of these
10: * server-side (404, 400), but client-side validation provides:
11: * - Better error messages with actionable suggestions
12: * - Faster failure without a network round-trip
13: * - Defense-in-depth against unexpected URL manipulation
14: *
15: * @see https://github.com/getsentry/cli/issues/350
16: */
17:
18: import { ValidationError } from "./errors.js";
19:
20: /**
21: * Characters that are never valid in ...
diff --git a/.github/workflows/pr-risk.yml b/.github/workflows/pr-risk.yml
index 2a1bd3c76..dc8359b2d 100644
--- a/.github/workflows/pr-risk.yml
+++ b/.github/workflows/pr-risk.yml
@@ -1,36 +1,36 @@
name: PR Risk Experiment
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: read
pull-requests: write
issues: write
concurrency:
group: pr-risk-${{ github.event.pull_request.number }}
cancel-in-progress: true
jobs:
risk:
name: Score PR risk
runs-on: ubuntu-latest
if: github.event.pull_request.draft == false
steps:
- name: Score current PR
uses: getsentry/pr-risk-action@v0
with:
repo: ${{ github.repository }}
pr-number: ${{ github.event.pull_request.number }}
result-path: risk-pr-result.json
skip-reviews: "true"
- apply-label: "true"
+ apply-label: ${{ github.event.pull_request.head.repo.full_name ...
diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/SKILL.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/SKILL.md index f1a71fb6a..85a58de78 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/SKILL.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/SKILL.md @@ -361 +361 @@ Work with Sentry organizations -- `sentry org view <org>` — View details of an organization +- `sentry org view [<org>]` — View details of an organization @@ -371,2 +371,2 @@ Work with Sentry projects -- `sentry project list <org/project>` — List projects -- `sentry project view <org/project>` — View details of a project +- `sentry project list [<org/project>]` — List projects +- `sentry project view [<org/project>]` — View details of a project @@ -380 +380 @@ Manage Sentry issues -- `sentry issue list <org/project>` — List issues in a project +- `sentry issue list [<org/project>]` — List issues in a project @@ -414 +414 @@ Manage Sentry alert rules -- `sentry alert issues list ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/test/lib/command.test.ts</path>
<type>file</type>
<content>
150: });
151:
152: describe("buildCommand", () => {
153: test("builds a valid command object", () => {
154: const command = buildCommand({
155: auth: false,
156: docs: { brief: "Test command" },
157: parameters: {
158: flags: {
159: verbose: { kind: "boolean", brief: "Verbose", default: false },
160: },
161: },
162: async *func(_flags: { verbose: boolean }) {
163: // no-op
164: },
165: });
166: expect(command).toBeDefined();
167: });
168:
169: test("handles commands with empty parameters", () => {
170: const command = buildCommand({
171: auth: false,
172: docs: { brief: "Simple command" },
173: parameters: {},
174: async *func() {
175: // no-op
176: },
177: });
178: expect(command).toBeDefined();
179: });
180:
181: test("retains ...
No files found
Found 1 matches /home/byk/Code/getsentry/cli-pr-1558/packages/cli/test/script/generate-skill-markdown.test.ts: Line 57: "**Examples:**",
Found 1 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/formatters/output.ts:
Line 534: export function formatSchemaForHelp(fields: SchemaFieldInfo[]): string {
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/formatters/output.ts</path>
<type>file</type>
<content>
510: * description is found.
511: */
512: function findDescription(schema: ValibotSchemaNode): string | undefined {
513: let node: ValibotSchemaNode | undefined = schema;
514: while (node) {
515: const description = getDescription(node as unknown as GenericSchema);
516: if (description !== undefined) {
517: return description;
518: }
519: node = node.wrapped;
520: }
521: return;
522: }
523:
524: /**
525: * Format schema fields as a help text block for `--help` output.
526: *
527: * Produces a compact field list like:
528: * ```
529: * JSON fields (use --json --fields to select):
530: * id (string) — Numeric issue ID
531: * count (string, optional) — Total event count
532: * ```
533: */
534: export function formatSchemaForHelp(fields: SchemaFieldInfo[]): string {
535: if (fields.length === 0) {
536: return "";
537: ...
Found 4 matches /home/byk/Code/getsentry/cli-pr-1558/apps/cli-docs/src/content/docs/commands/release.md: Line 26: | `-e, --environment <environment>...` | Filter by environment (repeatable, comma-separated) | Line 136: ### `sentry release deploy <org/version> <environment> [<name>]` Line 145: | `<environment>` | Deploy environment (e.g. production) | Line 146: | `[<name>]` | Optional deploy name (quote multi-word names, e.g. "Deploy #42") |
sentry agent-conversation view <org/conversation-id>
> sentry@0.45.0-dev.0 cli /home/byk/Code/getsentry/cli-pr-1558/packages/cli > tsx --env-file-if-exists=.env.local --import ./script/require-shim.mjs src/bin.ts -- agent-conversation view --help .env.local not found. Continuing without it. .env.local not found. Continuing without it. Error: Not authenticated. Run 'sentry auth login' first. ELIFECYCLE Command failed with exit code 10.
> sentry@0.45.0-dev.0 cli /home/byk/Code/getsentry/cli-pr-1558/packages/cli > tsx --env-file-if-exists=.env.local --import ./script/require-shim.mjs src/bin.ts agent-conversation view .env.local not found. Continuing without it. .env.local not found. Continuing without it. ELIFECYCLE Command failed with exit code 252. Expected argument for org/conversation-id
Found 2 matches /home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/cli.ts: Line 268: // needed before dispatch — the raw args go straight to `run()`. Line 489: await run(app, argv, buildContext(process, span));
> sentry@0.45.0-dev.0 cli /home/byk/Code/getsentry/cli-pr-1558/packages/cli
> tsx --env-file-if-exists=.env.local --import ./script/require-shim.mjs src/bin.ts agent-conversation --help
.env.local not found. Continuing without it.
.env.local not found. Continuing without it.
USAGE
sentry agent-conversation list [--limit value] [--query value] [--period value] [--fresh] [--cursor value] [--json] [--fields value] [<org>]
sentry agent-conversation view [--fresh] [--json] [--fields value] <org/conversation-id>
sentry agent-conversation --help
List and view agent conversations from Sentry Explore.
Commands:
list List recent agent conversations
view View a conversation transcript
FLAGS
-h --help Print help information and exit
-- All subsequent inputs should be interpreted as arguments
COMMANDS
list List recent agent conversations
view View an agent conversation transcript
.env.local not found. Continuing without it.
.env.local not found. Continuing without it.
.env.local not found. Continuing without it.
.env.local not found. Continuing without it.
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]
...
.env.local not found. Continuing without it. .env.local not found. Continuing without it. .env.local not found. Continuing without it. .env.local not found. Continuing without it. USAGE sentry agent-conversation list [--limit value] [--query value] [--period value] [--fresh] [--cursor value] [--json] [--fields value] [<org>] sentry agent-conversation list --help List recent agent conversations from a Sentry organization. The organization is auto-detected when omitted. Examples: sentry agent-conversation list # List recent agent conversations sentry agent-conversation list my-org # Explicit organization sentry agent-conversation list --limit 50 --period 24h # Show more, last 24 hours sentry agent-conversation list -q "has:errors" # Filter conversations sentry agent-conversation list my-org -c next # Paginate through results JSON fields (use --json --fields to select): conversationId (string) title (string | null, optional) flow (array) errors (number) ...
/home/byk/Code/getsentry/cli-pr-1558/node_modules/.pnpm/tsx@4.23.5/node_modules/tsx/dist/register-CptX03bE.cjs:9
`)},"createLog"),G=pt(W.bgLightYellow(W.black(" CJS "))),Tn=pt(W.bgBlue(" ESM ")),R=new Map,Sn=u(async e=>{if(R.has(e))return R.get(e);if(!await _.promises.access(e).then(()=>!0,()=>!1)){R.set(e,void 0);return}const r=await _.promises.readFile(e,"utf8");try{const n=JSON.parse(r);return R.set(e,n),n}catch{throw new Error(`Error parsing: ${e}`)}},"readPackageJson"),On=u(e=>{if(R.has(e))return R.get(e);if(!_.existsSync(e)){R.set(e,void 0);return}const t=_.readFileSync(e,"utf8");try{const r=JSON.parse(t);return R.set(e,r),r}catch{throw new Error(`Error parsing: ${e}`)}},"readPackageJsonSync"),An=u(async e=>{let t=new URL("package.json",e);for(;!t.pathname.endsWith("/node_modules/package.json");){const r=Q.fileURLToPath(t),n=await Sn(r);if(n)return n;const s=t;if(t=new URL("../package.json",t),t.pathname===s.pathname)break}},"findPackageJson"),ft=u(e=>{let t=new ...
{
"expected": 112,
"compact": 111,
"refs": 111,
"missingCompact": [
"sentry help <command...>"
],
"extraCompact": [],
"missingRefs": [
"sentry help <command...>"
],
"extraRefs": []
}
fc5d50e2324e2b6bb2067976bf1515dab45224fb bd065083c3b82677747b97a6cc7f5cf57532d3bc fc5d50e2324e2b6bb2067976bf1515dab45224fb bd065083c3b82677747b97a6cc7f5cf57532d3bc 03c5772e78b393b3979c44754709d7f401bb37a71e5679b34c50a9cc8334c2d0 -
Found 1 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/help.ts:
Line 764: export function formatHelpHuman(data: HelpJsonResult): string {
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/help.ts</path>
<type>file</type>
<content>
650: if (items.length === 2) {
651: return `${items[0]} or ${items[1]}`;
652: }
653: return `${items.slice(0, -1).join(", ")}, or ${items.at(-1)}`;
654: }
655:
656: // ---------------------------------------------------------------------------
657: // Human Rendering of Introspection Data
658: // ---------------------------------------------------------------------------
659:
660: /**
661: * Format a single flag for human display.
662: *
663: * @param flag - The flag info to format
664: * @param aliases - Command alias map for short flag lookup
665: * @returns Formatted flag string like "-l, --limit <value> - Max items"
666: */
667: function formatFlagHuman(
668: flag: import("./introspect.js").FlagInfo,
669: aliases: Record<string, string>
670: ): string {
671: const alias = Object.entries(aliases).find(([, v]) => v === flag.name)?.[0];
672: let syntax ...
MUST-FIX — Omission never produces the required ContextError.
view declares a required Stricli positional at packages/cli/src/commands/agent-conversation/view.ts:99-108. Stricli rejects a missing required tuple before loading the command (packages/cli/node_modules/@stricli/core/dist/index.js:837-848), so the ContextError at view.ts:119-121 is unreachable through the real CLI. The new test bypasses parsing by calling viewCommand.loader() directly at packages/cli/test/commands/agent-conversation/view.test.ts:268-274. An exact-head invocation returned Expected argument for org/conversation-id with exit 252, not ContextError exit 22.
target?: string, and distinguish undefined from a supplied blank string. Omission must throw ContextError; supplied blank input must throw a fielded ValidationError.ContextError/exit 22. Also dispatch "" and whitespace-only targets and assert a ValidationError with field: "conversation-id" before resolution or API calls.MUST-FIX — Native route-group help ignores the canonical customUsage.
The canonical usage is defined at packages/cli/src/commands/agent-conversation/view.ts:30-31,75, but the raw positional remains <org/conversation-id> at view.ts:99-107. The wrapper only stores __primaryUsage at packages/cli/src/lib/command.ts:458-470. Stricli’s formatUsageLine uses raw parameters (packages/cli/node_modules/@stricli/core/dist/index.js:2116-2118), and route-group help calls that formatter at index.js:2140-2143. Consequently, exact-head sentry agent-conversation --help prints:
sentry agent-conversation view ... <org/conversation-id>
instead of [<org>/]<conversation-id>. ...
* 🟡 (23:54) Exact-head `sentry agent-conversation list --help` rendered canonical usage `sentry agent-conversation list [--limit value] [--query value] [--period value] [--fresh] [--cursor value] [--json] [--fields value] [<org>]`, with `sentry agent-conversation list --help` as the alternate usage; `.env.local` was absent and the CLI continued without it. * 🟡 (23:54) Agent-conversation list he…
* 🟡 (23:41) `packages/cli/test/lib/command.test.ts` contains `buildCommand` tests confirming: valid commands and commands with empty `parameters` build successfully; the first `docs.customUsage` entry is retained as `__primaryUsage` for introspection; structured `docs.examples` are retained as `__examples`; and `numberParser` is re-exported from Stricli as a function. * 🟡 (23:41) The custom-usa…
* 🟡 (23:35) `paginate<T>()` in `packages/cli/src/lib/api/infrastructure.ts` accepts `options: { limit?: number; cursor?: string }`, a `fetchPage(perPage, cursor)` callback, and `defaultLimit = 10`; it computes `limit = options.limit ?? defaultLimit`, caps `perPage` with `Math.min(limit, API_MAX_PER_PAGE)`, and calls `autoPaginate()` with the initial `options.cursor`. * 🟡 (23:35) `autoPaginate()…
* 🟡 (23:27) `packages/cli/test/commands/agent-conversation/view.test.ts` tests explicit slash-separated targets by calling the command with `${ORG}/${CONVERSATION_ID}`, expecting `resolveOrg()` to receive `{ org: ORG }`, `getConversationSpans()` to receive `(ORG, CONVERSATION_ID)`, and JSON output to contain the expected `conversationId`. * 🟡 (23:27) `packages/cli/test/commands/agent-conversati…
* 🔴 (23:25) User stated `packages/cli/src/lib/list-command.ts` parses `flags.period` into a `TimeRange` object, so no manual time-range parsing is needed. * 🔴 (23:25) User stated Stricli `getAllEntries()` entries always have `aliases` present at runtime, using an empty array when there are none. * 🔴 (23:25) User stated `buildListCommand()` must always inject `--fresh` unless the command alread…
* 🟡 (23:23) Generated issue documentation in `apps/cli-docs/src/content/docs/commands/issue.md` lines 147-163 renders the merge heading as `sentry issue merge <issue...>`, describes it as “Merge 2+ issues into a single canonical group,” but renders the argument table entry as `[<issue...>]` with description “Issue IDs to merge (2 or more required).” * 🟡 (23:23) `apps/cli-docs/src/content/docs/c…
* 🔴 (23:21) User stated that `--into` always designates an issue that participates in the merge as the preferred parent. In `packages/cli/src/commands/issue/merge.ts`, `flags.into` is appended to positional `args` via `const effectiveArgs = flags.into ? [...args, flags.into] : args`; duplicate representations are later collapsed by numeric-ID deduplication in `resolveAllIssues`. * 🟡 (23:21) `pa…
* 🟡 (23:20) A `help[positional-default]` scan found flags with `default` values inside command `parameters` definitions, including `packages/cli/src/commands/trace/view.ts` lines 496 and 501 (`false`), `packages/cli/src/commands/dart-symbol-map/upload.ts` line 200 (`false`), and `packages/cli/src/commands/trace/logs.ts` lines 142 (`false`), 148 (`DEFAULT_PERIOD`), and 154 (`"100"`, with comment …
* 🔴 (23:18) User stated that the designated flags in `packages/cli/src/lib/command.ts` are always stripped, so the command never sees them. * 🟡 (23:18) `packages/cli/src/lib/api/conversations.ts` contains exactly 1 `getConversationSpans` match, exported at line 119. * 🟡 (23:18) `getConversationSpans()` in `packages/cli/src/lib/api/conversations.ts` lines 119–177 accepts `orgSlug`, `conversatio…
* 🔴 (23:16) [enforced-review-workflow] User required a complete read-only correctness/adversarial review preserving every contract and review area from the original prompt; no files may be modified. * 🔴 (23:16) User stated the immutable review target had a clean worktree, base commit `bd065083c3b82677747b97a6cc7f5cf57532d3bc`, head commit `fc5d50e2324e2b6bb2067976bf1515dab45224fb`, and triple-d…
* 🟡 (23:13) Search found exactly 31 variadic positional-argument documentation matches in generated Markdown: `apps/cli-docs/src/content/docs/commands/dashboard.md` lines 18, 37, 58, 68, 95, 124, 144, 161; `monitor.md` line 18; `schema.md` line 18; `log.md` lines 18, 39; `debug-files.md` lines 28, 47; `event.md` lines 18, 57; `cli.md` lines 28, 46; `issue.md` line 155; `replay.md` line 40; `reac…
* 🟡 (23:12) Repository search found 100 matches, with additional matches available, for `fullDescription`/`CommandInfo`-related symbols. Key implementation locations include `packages/cli/src/lib/introspect.ts` (`CommandInfo`, `buildCommandInfo()`, command extraction and resolution) and `packages/cli/src/lib/command.ts` (augmenting `fullDescription` with JSON field documentation and examples; st…
* 🔴 (23:11) User stated a flag should be required if a value will always be provided. * 🔴 (23:11) User stated variadic flags are always optional in that they will parse to an empty array if no arguments are found. * 🔴 (23:11) User stated positional parameters are always defined as an array or tuple. * 🟡 (23:11) Inspection of `packages/cli/node_modules/@stricli/core/dist/index.d.ts` establishe…
* 🔴 (23:10) User directed switching to nightly builds. * 🔴 (23:10) User stated variadic flags are always optional because they parse to an empty array when no arguments are found. * 🟡 (23:10) Inspection of `packages/cli/node_modules/@stricli/core/dist/index.d.ts` found the variadic-flag contract at lines 881–883: “Variadic flags are always optional in that they will parse to an empty array if …
Date: September 9, 2026 * 🔴 (23:09) User stated `extractFlags()` always returns exactly one `FlagInfo` per input entry. * 🔴 (23:09) User stated tuple positionals from `getPositionalString()` always produce angle-bracket placeholders; required parameters use `<placeholder>`, optional parameters use `[<placeholder>]`, and an absent placeholder falls back to `arg${index}`. * 🔴 (23:09) User stated…
Date: September 9, 2026 * 🔴 (23:09) User stated flags in `ALWAYS_STRIP` are always stripped before dispatch, so the command never sees them; `ALWAYS_STRIP` currently contains `LOG_LEVEL_KEY`. * 🔴 (23:09) User stated list-command construction must always inject `--fresh` via `FRESH_FLAG` unless the command already defines a `fresh` flag. * 🔴 (23:09) User stated the first positional argument for…
* 🔴 (23:08) User stated to always check `package.json` for the latest scripts; commands run from `packages/cli` or via `pnpm --filter sentry run <script>` from the repository root. * 🔴 (23:08) User stated all packages must be added to `devDependencies`, never `dependencies`, because everything is bundled at build time via esbuild; CI enforces this with `pnpm run check:deps`. * 🔴 (23:08) User s…
Date: Sep 9, 2026 * 🟡 (23:08) Target diff contains 35 modified files: `.github/workflows/pr-risk.yml`; `apps/cli-docs/src/fragments/commands/agent-conversation.md`; `packages/cli/plugins/sentry-cli/skills/sentry-cli/SKILL.md`; `packages/cli/plugins/sentry-cli/skills/sentry-cli/references/agent-conversation.md`; `packages/cli/plugins/sentry-cli/skills/sentry-cli/references/alert.md`; `packages/cl…
Date: Sep 9, 2026 * 🟡 [requested-review] (23:06) User requested a fresh, independent, read-only correctness/adversarial review of getsentry/cli PR #1558 in `/home/byk/Code/getsentry/cli-pr-1558`; prior reviewer attempts returned empty output, so a substantive report is mandatory. * 🔴 (23:06) User directed: “Never return empty output.” * 🔴 [enforced-read-only-review] (23:06) User prohibited edi…