Dashboard › cli › Session 0OKQPy981xKY
0OKQPy981xKYTuQEJYou are the final independent security reviewer for getsentry/cli PR #1558. Work read-only in /home/byk/Code/getsentry/cli-pr-1558; do not edit files, fetch, switch branches, commit, or mutate VCS state. Previous code-review agents repeatedly returned no output, so you MUST return a substantive report or an explicit blocker.
Immutable target: base bd065083c3b82677747b97a6cc7f5cf57532d3bc, head fc5d50e2324e2b6bb2067976bf1515dab45224fb, expected SHA-256 of git diff base...head is 03c5772e78b393b3979c44754709d7f401bb37a71e5679b34c50a9cc8334c2d0. Before and after review, verify HEAD, merge base, clean worktree, and this hash. If any differ, report BLOCKED with evidence and end DO-NOT-MERGE.
Inspect all 35 changed paths plus relevant surrounding code. Security threat model:
CommandDocumentation, Stricli/native help, public JSON introspection, website Markdown, skill Markdown, generated references, and embedded skill content. Check Markdown fence/backtick/template-expression/control-character escaping, JSON integrity, shell or command execution, credential/binary leakage, and unsafe filesystem writes..github/workflows/pr-risk.yml under attacker-controlled fork event fields. ...I’ll first freeze the review target by checking revision, merge base, worktree state, and diff hash. I’ll then inspect every changed path and each threat-model boundary before repeating the immutable-target checks.
[
{
"content": "Verify immutable target state before review",
"status": "in_progress",
"priority": "high"
},
{
"content": "Enumerate and inspect all changed paths plus surrounding security-sensitive code",
"status": "pending",
"priority": "high"
},
{
"content": "Trace metadata through runtime, JSON, Markdown, generated, and embedded outputs",
"status": "pending",
"priority": "high"
},
{
"content": "Audit agent-conversation parsing and organization-scoped request behavior",
"status": "pending",
"priority": "high"
},
{
"content": "Audit pr-risk fork-event permissions, serialization, scoring, labeling, and artifacts",
"status": "pending",
"priority": "high"
},
{
"content": "Verify generated artifacts and review focused validation evidence",
"status": "pending",
"priority": "high"
},
{
"content": "Reverify immutable target state and issue final security verdict",
"status": "pending",
...
fc5d50e2324e2b6bb2067976bf1515dab45224fb
bd065083c3b82677747b97a6cc7f5cf57532d3bc
(no output)
03c5772e78b393b3979c44754709d7f401bb37a71e5679b34c50a9cc8334c2d0 -
[
{
"content": "Verify immutable target state before review",
"status": "completed",
"priority": "high"
},
{
"content": "Enumerate and inspect all changed paths plus surrounding security-sensitive code",
"status": "in_progress",
"priority": "high"
},
{
"content": "Trace metadata through runtime, JSON, Markdown, generated, and embedded outputs",
"status": "pending",
"priority": "high"
},
{
"content": "Audit agent-conversation parsing and organization-scoped request behavior",
"status": "pending",
"priority": "high"
},
{
"content": "Audit pr-risk fork-event permissions, serialization, scoring, labeling, and artifacts",
"status": "pending",
"priority": "high"
},
{
"content": "Verify generated artifacts and review focused validation evidence",
"status": "pending",
"priority": "high"
},
{
"content": "Reverify immutable target state and issue final security verdict",
"status": ...
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...
.github/workflows/pr-risk.yml | 2 +- .../src/fragments/commands/agent-conversation.md | 33 ---------- .../plugins/sentry-cli/skills/sentry-cli/SKILL.md | 46 +++++++------- .../sentry-cli/references/agent-conversation.md | 13 ++-- .../skills/sentry-cli/references/alert.md | 6 +- .../sentry-cli/skills/sentry-cli/references/cli.md | 4 +- .../skills/sentry-cli/references/explore.md | 2 +- .../skills/sentry-cli/references/feedback.md | 2 +- .../skills/sentry-cli/references/init.md | 2 +- .../skills/sentry-cli/references/issue.md | 2 +- .../skills/sentry-cli/references/monitor.md | 2 +- .../sentry-cli/skills/sentry-cli/references/org.md | 2 +- .../skills/sentry-cli/references/project.md | 4 +- .../skills/sentry-cli/references/release.md | 4 +- .../skills/sentry-cli/references/replay.md | 2 +- .../skills/sentry-cli/references/repo.md | 2 +- ...
No files found
The immutable checks match exactly, and the patch contains the stated 35 paths. The substantive changes cluster into four surfaces: trusted command metadata and generators, agent-conversation parsing, fork-safe PR-risk labeling, and regenerated documentation; I’m reviewing each source change against its generated outputs rather than treating generated files as independent evidence.
/home/byk/Code/getsentry/cli-pr-1558/AGENTS.md /home/byk/Code/getsentry/cli-pr-1558/packages/cli/AGENTS.md
<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. ...
<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** - ...
...output truncated...
Full output saved to: /home/byk/.local/share/opencode/tool-output/tool_0887e19d0001K20tw6sNINXrlY
}
return;
}
const multiCommandRoutes = getMultiCommandRoutes();
for (const [routeName, route] of multiCommandRoutes) {
const fragmentPath = `${FRAGMENTS_DIR}/${routeName}.md`;
let content: string;
try {
content = await readFile(fragmentPath, "utf-8");
} catch {
// Fragment doesn't exist — already caught by Check 1
continue;
}
const defaultCmd = getDefaultCommandName(routeName);
const missing: string[] = [];
for (const cmd of route.commands) {
+ if (cmd.examples.length > 0) {
+ continue;
+ }
const sub = cmd.path.slice(`sentry ${routeName} `.length);
const leaf = sub.split(" ").at(-1) ?? sub;
const isDefault = leaf === defaultCmd;
if (!fragmentMentionsSubcommand(content, routeName, cmd, isDefault)) {
missing.push(sub);
}
}
if (missing.length > 0) {
const ...
<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: - ...
<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/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: ...
<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/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/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/list-command.ts</path>
<type>file</type>
<content>
561:
562: // Auto-inject common flags and aliases into parameters
563: const params = (builderArgs.parameters ?? {}) as Record<string, unknown>;
564: const existingFlags = (params.flags ?? {}) as Record<string, unknown>;
565: const existingAliases = (params.aliases ?? {}) as Record<string, string>;
566:
567: const mergedFlags = { ...existingFlags };
568: const mergedAliases = { ...existingAliases };
569:
570: // Always inject --fresh unless the command already defines it
571: if (!("fresh" in mergedFlags)) {
572: mergedFlags.fresh = FRESH_FLAG;
573: }
574:
575: // Inject --cursor unless opted out or already defined
576: if (!(options?.noCursorFlag || "cursor" in mergedFlags)) {
577: mergedFlags.cursor = LIST_CURSOR_FLAG;
578: }
579:
580: // Inject -f alias unless opted out or already defined
581: if (!(options?.noFreshAlias || "f" ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/mutate-command.ts</path>
<type>file</type>
<content>
1: /**
2: * Shared building blocks for mutation (create/delete) commands.
3: *
4: * Provides reusable Stricli parameter definitions, safety utilities, and a
5: * `buildDeleteCommand` wrapper — paralleling `list-command.ts` for list commands.
6: *
7: * Level A — shared constants (used by create and delete commands):
8: * DRY_RUN_FLAG, YES_FLAG, FORCE_FLAG,
9: * DESTRUCTIVE_FLAGS, DESTRUCTIVE_ALIASES, DRY_RUN_ALIASES
10: *
11: * Level B — shared utilities:
12: * isConfirmationBypassed, guardNonInteractive, confirmByTyping,
13: * requireExplicitTarget
14: *
15: * Level C — delete command builder:
16: * buildDeleteCommand
17: */
18:
19: import { isatty } from "node:tty";
20: import type { Command, CommandContext } from "@stricli/core";
21: import type { ParsedOrgProject } from "./arg-parsing.js";
22: import { buildCommand, type ...
diff --git a/packages/cli/src/lib/list-command.ts b/packages/cli/src/lib/list-command.ts
index 43f170d36..35811179c 100644
--- a/packages/cli/src/lib/list-command.ts
+++ b/packages/cli/src/lib/list-command.ts
@@ -3,41 +3,45 @@
*
* Provides reusable Stricli parameter definitions (target positional, common
* flags, aliases) and a `buildOrgListCommand` factory for commands whose
* entire `func` body is handled by `dispatchOrgScopedList`.
*
* Level A — shared constants (used by all four list commands):
* LIST_TARGET_POSITIONAL, LIST_JSON_FLAG, LIST_CURSOR_FLAG,
* buildListLimitFlag, LIST_BASE_ALIASES
*
* Level B — full command builder (team / repo only):
* buildOrgListCommand
*/
import { createRequire } from "node:module";
import type { Aliases, Command, CommandContext } from "@stricli/core";
import type { SentryContext } from "../context.js";
const _require = createRequire(import.meta.url);
import { parseOrgProjectArg } from ...
Found 43 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/script/generate-skill.ts:
Line 22: import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
Line 23: import { access, readFile, writeFile } from "node:fs/promises";
Line 33: // Bootstrap: ensure the generated skill-content module exists before
Line 34: // importing the route tree (app.ts → agent-skills.ts → skill-content.ts).
Line 40: const SKILL_CONTENT_PATH = "src/generated/skill-content.ts";
Line 43: writeFileSync(
Line 45: "export const SKILL_FILES: ReadonlyMap<string, string> = new Map();\n"
Line 67: * Hidden dispatcher routes (e.g. auth's `default`) map bare group examples
Line 81: // Auth uses a hidden "default" dispatcher; bare `sentry auth` examples
Line 345: * Initializes each path with an empty array in the examples map.
Line 349: examples: Map<string, string[]>
Line 359: if (!examples.has(cmdPath)) {
Line 360: ...
<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/packages/cli/script/generate-skill.ts</path>
<type>file</type>
<content>
541: syntax += " <value>...";
542: }
543: parts.push(syntax);
544: if (flag.brief) {
545: parts.push(flag.brief);
546: }
547: if (flag.default !== undefined && flag.kind !== "boolean") {
548: parts.push(`(default: ${JSON.stringify(flag.default)})`);
549: }
550: return parts.join(" - ");
551: }
552:
553: /**
554: * Get the visible, non-global flags for a command.
555: * Excludes hidden flags, help, and globally-injected flags.
556: */
557: function getVisibleFlags(cmd: CommandInfo): FlagInfo[] {
558: return cmd.flags.filter((f) => !(f.hidden || GLOBAL_FLAG_NAMES.has(f.name)));
559: }
560:
561: // ---------------------------------------------------------------------------
562: // Reference File Generation (full detail)
563: // ---------------------------------------------------------------------------
564:
565: /** Generate full ...
No files found
Found 7 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/agent-skills.ts:
Line 16: import { SKILL_FILES } from "../generated/skill-content.js";
Line 113: for (const [relativePath, content] of SKILL_FILES) {
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/script/generate-skill.ts:
Line 45: "export const SKILL_FILES: ReadonlyMap<string, string> = new Map();\n"
Line 949: export const SKILL_FILES: ReadonlyMap<string, string> = new Map([
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/script/generate-command-docs.ts:
Line 39: "export const SKILL_FILES: [string, string][] = [];\n";
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/script/check-fragments.ts:
Line 32: "export const SKILL_FILES: [string, string][] = [];\n"
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/script/generate-docs-sections.ts:
Line 30: "export const SKILL_FILES: [string, string][] = [];\n";
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/agent-skills.ts</path>
<type>file</type>
<content>
1: /**
2: * Agent skill installation for AI coding assistants.
3: *
4: * Detects supported AI coding agents (currently Claude Code and agents that
5: * use the shared `~/.agents` root) and installs the Sentry CLI skill files
6: * so the agent can use CLI commands effectively.
7: *
8: * Skill file contents are embedded at build time (via a generated module
9: * produced by script/generate-skill.ts), so no network fetch is needed.
10: */
11:
12: import { accessSync, constants, existsSync, mkdirSync } from "node:fs";
13: import { rename, rm, writeFile } from "node:fs/promises";
14: import { basename, dirname, join } from "node:path";
15: import { captureException } from "@sentry/node-core/light";
16: import { SKILL_FILES } from "../generated/skill-content.js";
17:
18: /** Where skills are installed */
19: export type AgentSkillLocation = {
20: /** Path where the ...
<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 ...
<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 ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/script/generate-skill-markdown.ts</path>
<type>file</type>
<content>
1: /**
2: * Markdown parsing helpers shared by the skill generator and its tests.
3: */
4:
5: /** Matches a generated command heading and stops before positional usage. */
6: const COMMAND_HEADING_RE =
7: /^`sentry\s+([^<[`\s]+(?:\s+[^<[`\s]+)*)(?:\s*(?:<|\[)[^`]*)?`$/;
8:
9: /** Extract the literal command path from a generated command heading. */
10: export function extractCommandPathFromHeading(
11: heading: string
12: ): string | undefined {
13: const match = COMMAND_HEADING_RE.exec(heading);
14: return match?.[1] ? `sentry ${match[1]}` : undefined;
15: }
16:
17: /** Find the command whose literal path appears in a loose example block. */
18: export function matchExampleToCommand(
19: code: string,
20: commandPaths: readonly string[],
21: groupFallback: string,
22: defaultCommandPath?: string
23: ): string | undefined {
24: // Prefer ...
Found 15 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/help.ts:
Line 206: export function printCustomHelp(): string {
Line 298: * passes through {@link formatHelpHuman}, which renders the branded banner for
Line 365: export function introspectCommand(
Line 395: * `introspectCommand(path)` for a specific command/group, serialized with
Line 417: // `nope` in unprocessedInputs. Folding those in lets `introspectCommand`
Line 424: : introspectCommand(commandPath);
Line 686: parts.push(`(default: ${JSON.stringify(flag.default)})`);
Line 764: export function formatHelpHuman(data: HelpJsonResult): string {
Line 767: // triggers printCustomHelp's sixel probe / terminal I/O.
Line 769: return printCustomHelp().trimEnd();
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/commands/help.ts:
Line 16: formatHelpHuman,
Line 18: introspectCommand,
Line 31: human: formatHelpHuman,
Line 49: // ...
<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/lib/help.ts</path>
<type>file</type>
<content>
340: }
341:
342: /**
343: * Introspect the full command tree.
344: * Returns all visible routes with all flags included, plus the top-level
345: * environment variables and common flags recognized by the CLI.
346: */
347: export function introspectAllCommands(): {
348: routes: RouteInfo[];
349: envVars: HelpEnvVarInfo[];
350: flags: HelpFlagInfo[];
351: } {
352: const routeMap = routes as unknown as RouteMap;
353: return {
354: routes: extractAllRoutes(routeMap),
355: envVars: buildTopLevelEnvVars(),
356: flags: buildCommonFlags(),
357: };
358: }
359:
360: /**
361: * Introspect a specific command or group.
362: * Returns the resolved command/group info, or an error object
363: * with optional fuzzy suggestions if the path doesn't resolve. ...
Found 10 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/formatters/log.ts:
Line 463: a.type === "array" ? JSON.stringify(a.value) : String(a.value),
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/formatters/local.ts:
Line 20: * `JSON.stringify` only escapes C0 (U+0000–U+001F) per RFC 8259;
Line 30: * Used for JSON output where `JSON.stringify` escapes C0 controls but
Line 388: return sanitize(JSON.stringify(value));
Line 749: * Envelope payloads are untrusted, and `JSON.stringify()` does not escape C1
Line 777: return JSON.stringify(
Line 989: * the full `sanitize()`. `JSON.stringify()` escapes C0 control characters
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/formatters/json.ts:
Line 169: export function formatJson<T>(data: T): string {
Line 170: return JSON.stringify(data, null, 2);
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/formatters/conversation.ts:
Line 236: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/formatters/json.ts</path>
<type>file</type>
<content>
145: *
146: * Handles whitespace around commas and filters out empty segments:
147: * ```ts
148: * parseFieldsList("id, title , status") // → ["id", "title", "status"]
149: * parseFieldsList("id,,title") // → ["id", "title"]
150: * ```
151: *
152: * @param input - Raw `--fields` flag value
153: * @returns Parsed field path list (may be empty if input is all whitespace/commas)
154: */
155: export function parseFieldsList(input: string): string[] {
156: return [
157: ...new Set(
158: input
159: .split(",")
160: .map((f) => f.trim())
161: .filter(Boolean)
162: ),
163: ];
164: }
165:
166: /**
167: * Format data as pretty-printed JSON
168: */
169: export function formatJson<T>(data: T): string {
170: return JSON.stringify(data, null, 2);
171: }
172:
173: /**
174: * Output JSON to a write stream. ...
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>
<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>
No files found
<path>/home/byk/Code/getsentry/cli-pr-1558/node_modules/.pnpm</path> <type>directory</type> <entries> @a2a-js+sdk@0.3.14_express@5.2.1/ @ai-sdk+provider-utils@2.2.8_zod@4.4.3/ @ai-sdk+provider-utils@3.0.30_zod@4.4.3/ @ai-sdk+provider-utils@4.0.40_zod@4.4.3/ @ai-sdk+provider-utils@5.0.13_zod@4.4.3/ @ai-sdk+provider@1.1.3/ @ai-sdk+provider@2.0.3/ @ai-sdk+provider@3.0.14/ @ai-sdk+provider@4.0.4/ @ai-sdk+ui-utils@1.2.11_zod@4.4.3/ @alcalzone+ansi-tokenize@0.3.0/ @anthropic-ai+sdk@0.39.0/ @apm-js-collab+code-transformer-bundler-plugins@0.5.0/ @apm-js-collab+code-transformer-bundler-plugins@0.7.3/ @apm-js-collab+code-transformer@0.15.0/ @apm-js-collab+code-transformer@0.18.1/ @apm-js-collab+tracing-hooks@0.10.1/ @apm-js-collab+tracing-hooks@0.13.0/ @astrojs+compiler-binding-linux-x64-gnu@0.3.2/ @astrojs+compiler-binding-linux-x64-musl@0.3.2/ @astrojs+compiler-binding@0.3.2_@emnapi+core@1.10.0_@emnapi+runtime@1.10.0/ @astrojs+compiler-rs@0.3.2_@emnapi+core@1.10.0_@emnapi+runtime@1.10.0/ @astr...
<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</path> <type>directory</type> <entries> auto-complete/ core/ (2 entries) </entries>
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/package.json</path>
<type>file</type>
<content>
1: {
2: "name": "@stricli/core",
3: "version": "1.2.8",
4: "description": "Build complex CLIs with type safety and no dependencies",
5: "license": "Apache-2.0",
6: "repository": {
7: "type": "git",
8: "url": "https://github.com/bloomberg/stricli/tree/main/packages/core"
9: },
10: "author": "Michael Molisani <mmolisani@bloomberg.net>",
11: "files": [
12: "dist"
13: ],
14: "type": "module",
15: "exports": {
16: "import": "./dist/index.js",
17: "require": "./dist/index.cjs"
18: },
19: "types": "dist/index.d.ts",
20: "scripts": {
21: "format": "prettier --config ../../.prettierrc -w .",
22: "format:check": "prettier --config ../../.prettierrc -c .",
23: "lint": "eslint src tests",
24: "lint:fix": "eslint src tests --fix",
25: ...
Found 28 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.d.ts:
Line 1123: readonly fullDescription: string | undefined;
Line 1411: interface CommandDocumentation {
Line 1419: readonly fullDescription?: string;
Line 1423: readonly customUsage?: readonly (string | CustomUsage)[];
Line 1452: declare function buildCommand<const FLAGS extends Readonly<Partial<Record<keyof FLAGS, unknown>>> = NonNullable<unknown>, const ARGS extends BaseArgs = [], const CONTEXT extends CommandContext = CommandContext>(builderArgs: CommandBuilderArguments<FLAGS, ARGS, CONTEXT>): Command<CONTEXT>;
Line 1465: readonly fullDescription?: string;
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.cjs:
Line 2049: const { brief, fullDescription, customUsage } = docs;
Line 2053: if (customUsage) {
Line 2054: for (const usage of customUsage) {
Line 2070: yield fullDescription ?? ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.d.ts</path>
<type>file</type>
<content>
1395: declare const looseBooleanParser: (input: string) => boolean;
1396:
1397: /**
1398: * Creates an input parser that checks if the input string is found in a list of choices.
1399: */
1400: declare function buildChoiceParser<T extends string>(choices: readonly T[]): InputParser<T>;
1401:
1402: /**
1403: * Parses input strings as numbers.
1404: */
1405: declare const numberParser: (input: string) => number;
1406:
1407: interface CustomUsage {
1408: readonly input: string;
1409: readonly brief: string;
1410: }
1411: interface CommandDocumentation {
1412: /**
1413: * In-line documentation for this command.
1414: */
1415: readonly brief: string;
1416: /**
1417: * Longer description of this command's behavior, only printed during `--help`.
1418: */
1419: readonly fullDescription?: string;
1420: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.js</path>
<type>file</type>
<content>
1985: if (def.default) {
1986: const defaultKeyword = args.ansiColor ? `\x1B[2m${keywords.default}\x1B[22m` : keywords.default;
1987: suffix = `[${defaultKeyword} ${def.default}]`;
1988: }
1989: return [
1990: args.ansiColor ? `\x1B[1m${name}\x1B[22m` : name,
1991: args.ansiColor ? `\x1B[3m${def.brief}\x1B[23m` : def.brief,
1992: suffix ?? ""
1993: ];
1994: }),
1995: [" ", " "]
1996: );
1997: }
1998:
1999: // src/routing/command/documentation.ts
2000: function* generateCommandHelpLines(parameters, docs, args) {
2001: const { brief, fullDescription, customUsage } = docs;
2002: const { headers } = args.text;
2003: const prefix = args.prefix.join(" ");
2004: yield args.ansiColor ? `\x1B[4m${headers.usage}\x1B[24m` : headers.usage;
2005: if (customUsage) {
2006: for ...
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 135: () => 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>
1: /**
2: * Agent conversations API functions
3: *
4: * Functions for listing and retrieving agent conversation data from the Sentry
5: * Explore agent conversations endpoints.
6: *
7: * The `/organizations/{org}/agents/conversations/` endpoints are PRIVATE and not
8: * yet in `@sentry/api` (getsentry/sentry-api-schema). Call them via
9: * `apiRequestToRegion` with local Valibot schemas (same pattern as `logs.ts` /
10: * `traces.ts`). Details response shape is documented on
11: * `AgentConversationDetailsSchema`. Pagination uses `parseLinkHeader`. Revisit
12: * once these endpoints land in `@sentry/api`.
13: */
14:
15: import { array } from "valibot";
16:
17: import {
18: type AgentConversationDetails,
19: AgentConversationDetailsSchema,
20: type AgentConversationSpan,
21: type ConversationListItem,
22: ConversationListItemSchema,
23: } from ...
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. ...
Found 62 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/resolve-target.ts:
Line 4: * Shared utilities for resolving organization and project context from
Line 107: * Resolved organization and project target for API calls.
Line 143: * Resolved organization for API calls (without project).
Line 184: * Resolve organization and project from DSN detection.
Line 259: * Resolve organization only from DSN detection.
Line 264: export async function resolveOrgFromDsn(
Line 369: if (projectInfo.organization) {
Line 371: projectInfo.organization.slug,
Line 372: projectInfo.organization.name
Line 375: orgSlug: projectInfo.organization.slug,
Line 383: org: projectInfo.organization.slug,
Line 558: orgName: m.organization?.name ?? m.orgSlug,
Line 577: orgDisplay: m.organization?.name ?? m.orgSlug,
Line 669: * Find similar project slugs across all accessible organizations. ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/src/lib/resolve-target.ts</path>
<type>file</type>
<content>
1635: }
1636: }
1637:
1638: if (isAuthenticated()) {
1639: throw await buildAccountContextError(usageHint);
1640: }
1641: throw new ContextError("Organization and project", usageHint);
1642: }
1643:
1644: /**
1645: * Resolve an org/project target, guiding the user when auto-detection fails.
1646: *
1647: * Drop-in replacement for the `resolveOrgAndProject(...)` + "throw
1648: * `ContextError` on null" pattern, combining {@link resolveOrgAndProject} with
1649: * {@link guideOrgProjectFailure}.
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 ?? ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/test/commands/agent-conversation/view.test.ts</path>
<type>file</type>
<content>
1: /**
2: * Conversation View Command Tests
3: *
4: * Tests for the `sentry agent-conversation view` command func() body, covering:
5: * - Resolving org + conversationId from a single `<org>/<conversation-id>` arg
6: * - Resolving org via resolveOrg when only the conversation-id is given
7: * - Throwing error when no args provided
8: * - Throwing ContextError when org cannot be resolved
9: * - Yielding CommandOutput with transcript result
10: * - Setting truncated flag from API response
11: *
12: * Uses spyOn mocking to avoid real HTTP calls or database access.
13: */
14:
15: import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
16: import { viewCommand } from "../../../src/commands/agent-conversation/view.js";
17:
18: vi.mock("../../../src/lib/api-client.js", async (importOriginal) => {
19: const actual =
20: ...
Found 14 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/test/script/generate-skill-markdown.test.ts:
Line 39: "sentry agent-conversation view"
Line 49: expect(view.positional).toBe("[<org>/]<conversation-id>");
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 61: "sentry agent-conversation view conv-123",
Line 64: "sentry agent-conversation view my-org/conv-123",
Line 67: "sentry agent-conversation view my-org/conv-123 --json",
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/test/commands/agent-conversation/view.test.ts:
Line 4: * Tests for the `sentry agent-conversation view` command func() body, covering:
Line 5: * - Resolving org + conversationId from a single ...
Found 20 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.js:
Line 625: if (flag.optional) {
Line 727: const { flags = {}, aliases = {}, positional = { kind: "tuple", parameters: [] } } = parameters;
Line 804: if (positional.kind === "tuple") {
Line 805: if (positionalIndex >= positional.parameters.length) {
Line 806: throw new UnexpectedPositionalError(positional.parameters.length, input);
Line 844: if (param.optional) {
Line 1241: // its GLOBAL_FLAGS definition. If `matchTopLevelFlag` is missing, the CLI's
Line 1273: // marker is missing, the CLI's `check:patches` fails.
Line 1451: // missing, the CLI's `check:patches` fails.
Line 1469: // missing, the CLI's `check:patches` fails. ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/node_modules/@stricli/core/dist/index.js</path>
<type>file</type>
<content>
710: flagInputs.set(internalFlagName, [...inputs, ...multipleInputs]);
711: } else {
712: flagInputs.set(internalFlagName, [...inputs, input]);
713: }
714: }
715: function isFlagSatisfiedByInputs(flags, flagInputs, key) {
716: const inputs = flagInputs.get(key);
717: if (inputs) {
718: const flag = flags[key];
719: if (isVariadicFlag(flag)) {
720: return false;
721: }
722: return true;
723: }
724: return false;
725: }
726: function buildArgumentScanner(parameters, config) {
727: const { flags = {}, aliases = {}, positional = { kind: "tuple", parameters: [] } } = parameters;
728: const resolvedAliases = resolveAliases(flags, aliases, config.caseStyle);
729: const positionalInputs = [];
730: const flagInputs = /* @__PURE__ */ new Map();
731: let positionalIndex = 0;
732: let activeFlag;
733: let ...
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>
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 51 matches
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/test/lib/api/traces.test.ts:
Line 144: expect(capturedUrl).toContain(`sort=${encodeURIComponent("-timestamp")}`);
Line 162: expect(capturedUrl).toContain(`cursor=${encodeURIComponent("0:50:0")}`);
Line 193: `start=${encodeURIComponent("2024-01-15T00:00:00Z")}`
Line 196: `end=${encodeURIComponent("2024-01-16T00:00:00Z")}`
Line 459: expect(capturedUrl).toContain(`sort=${encodeURIComponent("-timestamp")}`);
Line 574: `query=${encodeURIComponent("project:my-project")}`
Line 617: `start=${encodeURIComponent("2024-01-15T00:00:00Z")}`
Line 620: `end=${encodeURIComponent("2024-01-16T00:00:00Z")}`
Line 630: expect(capturedUrl).toContain(`cursor=${encodeURIComponent("0:50:0")}`);
/home/byk/Code/getsentry/cli-pr-1558/packages/cli/test/lib/api/explore.test.ts:
Line 103: `query=${encodeURIComponent("is:unresolved")}`
Line 153: ...
<path>/home/byk/Code/getsentry/cli-pr-1558/packages/cli/test/lib/api/conversations.test.ts</path>
<type>file</type>
<content>
282: // getConversationSpans
283: // ============================================================================
284:
285: describe("getConversationSpans", () => {
286: const CONV_ID = "conv-abc-123";
287:
288: /** Minimal valid span for schema validation */
289: function makeSpan(id: string) {
290: return {
291: "gen_ai.conversation.id": CONV_ID,
292: span_id: id,
293: trace: "00112233445566778899aabbccddeeff",
294: project: "my-project",
295: "project.id": 42,
296: "span.name": "gen_ai.invoke_agent",
297: "span.status": "ok",
298: "precise.start_ts": 1_716_500_000,
299: "precise.finish_ts": 1_716_500_010,
300: "gen_ai.operation.type": "ai_client",
301: };
302: }
303:
304: /** Details envelope returned by the conversation details endpoint. ...
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
@@ -248,70 +248,83 @@ describe("listCommand.func", () => {
// listConversations called with the resolved org
expect(listConversationsSpy).toHaveBeenCalledWith(ORG, expect.any(Object));
});
test("resolves org via resolveOrg when no positional", async () => {
resolveOrgSpy.mockResolvedValue({ org: "auto-org" });
listConversationsSpy.mockResolvedValue({
data: [],
nextCursor: undefined,
});
const { context } = createMockContext();
const func = await listCommand.loader();
await func.call(context, JSON_FLAGS, undefined);
expect(resolveOrgSpy).toHaveBeenCalledWith(
expect.objectContaining({ org: undefined })
);
...
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 ...
No files found
Date: Sep 9, 2026 * 🔴 (23:26) Full truncated tool output was saved to `/home/byk/.local/share/opencode/tool-output/tool_0887e19d0001K20tw6sNINXrlY`. * 🔴 (23:26) In `packages/cli/script/check-fragments.ts`, subcommands with `cmd.examples.length > 0` are skipped during fragment subcommand-coverage checks; commands without examples still require fragment coverage. * 🔴 (23:26) User stated conversa…
🔴 (23:23) Security-review checklist had 7 ordered high-priority tasks: 1. “Verify immutable target state before review” (`in_progress`), 2. “Enumerate and inspect all changed paths plus surrounding security-sensitive code” (`pending`), 3. “Trace metadata through runtime, JSON, Markdown, generated, and embedded outputs” (`pending`), 4. “Audit agent-conversation parsing and organization-scoped req…