Skip to content

Commit 9e83911

Browse files
committed
fix(help): document target patterns and trailing-slash significance (#267)
Renames the positional placeholder from `<target>` to `<org/project>` so the usage line is self-documenting. Adds a prose explanation of trailing-slash semantics to the fullDescription of every command that uses parseOrgProjectArg, and improves the --cursor rejection error in dispatchOrgScopedList to include a contextual suggestion when a bare slug was given.
1 parent 981435c commit 9e83911

File tree

7 files changed

+40
-21
lines changed

7 files changed

+40
-21
lines changed

src/commands/issue/list.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -657,11 +657,15 @@ export const listCommand = buildCommand({
657657
brief: "List issues in a project",
658658
fullDescription:
659659
"List issues from Sentry projects.\n\n" +
660-
"Target specification:\n" +
660+
"Target patterns:\n" +
661661
" sentry issue list # auto-detect from DSN or config\n" +
662662
" sentry issue list <org>/<proj> # explicit org and project\n" +
663-
" sentry issue list <org>/ # all projects in org\n" +
663+
" sentry issue list <org>/ # all projects in org (trailing / required)\n" +
664664
" sentry issue list <project> # find project across all orgs\n\n" +
665+
"The trailing slash on <org>/ is significant — without it, the argument\n" +
666+
"is treated as a project name search (e.g., 'sentry' searches for a\n" +
667+
"project named 'sentry', while 'sentry/' lists all projects in the\n" +
668+
"'sentry' org).\n\n" +
665669
"In monorepos with multiple Sentry projects, shows issues from all detected projects.",
666670
},
667671
parameters: {

src/commands/log/list.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -232,10 +232,12 @@ export const listCommand = buildCommand({
232232
brief: "List logs from a project",
233233
fullDescription:
234234
"List and stream logs from Sentry projects.\n\n" +
235-
"Target specification:\n" +
235+
"Target patterns:\n" +
236236
" sentry log list # auto-detect from DSN or config\n" +
237237
" sentry log list <org>/<proj> # explicit org and project\n" +
238238
" sentry log list <project> # find project across all orgs\n\n" +
239+
"A bare name (no slash) is treated as a project search. Use <org>/<proj>\n" +
240+
"for an explicit target.\n\n" +
239241
"Examples:\n" +
240242
" sentry log list # List last 100 logs\n" +
241243
" sentry log list -f # Stream logs (2s poll interval)\n" +
@@ -248,8 +250,8 @@ export const listCommand = buildCommand({
248250
kind: "tuple",
249251
parameters: [
250252
{
251-
placeholder: "target",
252-
brief: "Target: <org>/<project> or <project>",
253+
placeholder: "org/project",
254+
brief: "<org>/<project> or <project> (search)",
253255
parse: String,
254256
optional: true,
255257
},

src/commands/project/list.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -607,13 +607,17 @@ export const listCommand = buildCommand({
607607
brief: "List projects",
608608
fullDescription:
609609
"List projects in an organization.\n\n" +
610-
"Target specification:\n" +
610+
"Target patterns:\n" +
611611
" sentry project list # auto-detect from DSN or config\n" +
612-
" sentry project list <org>/ # list all projects in org (paginated)\n" +
612+
" sentry project list <org>/ # all projects in org (paginated)\n" +
613613
" sentry project list <org>/<proj> # show specific project\n" +
614614
" sentry project list <project> # find project across all orgs\n\n" +
615+
"The trailing slash on <org>/ is significant — without it, the argument\n" +
616+
"is treated as a project name search (e.g., 'sentry' searches for a\n" +
617+
"project named 'sentry', while 'sentry/' lists all projects in the\n" +
618+
"'sentry' org). Cursor pagination (--cursor) requires the <org>/ form.\n\n" +
615619
"Pagination:\n" +
616-
" sentry project list <org>/ -c last # continue from last page\n" +
620+
" sentry project list <org>/ -c last # continue from last page\n" +
617621
" sentry project list <org>/ -c <cursor> # resume at specific cursor\n\n" +
618622
"Filtering and output:\n" +
619623
" sentry project list --platform javascript # filter by platform\n" +

src/commands/project/view.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,19 +201,21 @@ export const viewCommand = buildCommand({
201201
brief: "View details of a project",
202202
fullDescription:
203203
"View detailed information about Sentry projects.\n\n" +
204-
"Target specification:\n" +
204+
"Target patterns:\n" +
205205
" sentry project view # auto-detect from DSN or config\n" +
206206
" sentry project view <org>/<project> # explicit org and project\n" +
207207
" sentry project view <project> # find project across all orgs\n\n" +
208+
"A bare name (no slash) is treated as a project search. Use <org>/<project>\n" +
209+
"for an explicit target.\n\n" +
208210
"In monorepos with multiple Sentry projects, shows details for all detected projects.",
209211
},
210212
parameters: {
211213
positional: {
212214
kind: "tuple",
213215
parameters: [
214216
{
215-
placeholder: "target",
216-
brief: "Target: <org>/<project>, <project>, or omit for auto-detect",
217+
placeholder: "org/project",
218+
brief: "<org>/<project>, <project> (search), or omit for auto-detect",
217219
parse: String,
218220
optional: true,
219221
},

src/commands/trace/list.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,12 @@ export const listCommand = buildCommand({
6767
brief: "List recent traces in a project",
6868
fullDescription:
6969
"List recent traces from Sentry projects.\n\n" +
70-
"Target specification:\n" +
70+
"Target patterns:\n" +
7171
" sentry trace list # auto-detect from DSN or config\n" +
7272
" sentry trace list <org>/<proj> # explicit org and project\n" +
7373
" sentry trace list <project> # find project across all orgs\n\n" +
74+
"A bare name (no slash) is treated as a project search. Use <org>/<proj>\n" +
75+
"for an explicit target.\n\n" +
7476
"Examples:\n" +
7577
" sentry trace list # List last 10 traces\n" +
7678
" sentry trace list --limit 50 # Show more traces\n" +
@@ -82,8 +84,8 @@ export const listCommand = buildCommand({
8284
kind: "tuple",
8385
parameters: [
8486
{
85-
placeholder: "target",
86-
brief: "Target: <org>/<project> or <project>",
87+
placeholder: "org/project",
88+
brief: "<org>/<project> or <project> (search)",
8789
parse: String,
8890
optional: true,
8991
},

src/lib/list-command.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,17 @@ import { dispatchOrgScopedList, type OrgListConfig } from "./org-list.js";
2424
// ---------------------------------------------------------------------------
2525

2626
/**
27-
* Positional `target` parameter shared by all list commands.
27+
* Positional `org/project` parameter shared by all list commands.
2828
*
29-
* Accepts `<org>/`, `<org>/<project>`, or bare `<org>` / `<project>`.
29+
* Accepts `<org>/`, `<org>/<project>`, or bare `<project>` (search).
3030
* Marked optional so the command falls back to auto-detection when omitted.
3131
*/
3232
export const LIST_TARGET_POSITIONAL = {
3333
kind: "tuple" as const,
3434
parameters: [
3535
{
36-
placeholder: "target",
37-
brief: "Target: <org>/, <org>/<project>, or <org>",
36+
placeholder: "org/project",
37+
brief: "<org>/ (all projects), <org>/<project>, or <project> (search)",
3838
parse: String,
3939
optional: true as const,
4040
},

src/lib/org-list.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -739,10 +739,15 @@ export async function dispatchOrgScopedList<TEntity, TWithOrg>(
739739

740740
// Cursor pagination is only supported in org-all mode
741741
if (flags.cursor && parsed.type !== "org-all") {
742+
const hint =
743+
parsed.type === "project-search"
744+
? `\n\nDid you mean '${config.commandPrefix} ${parsed.projectSlug}/'? ` +
745+
"A bare name searches for a project — add a trailing slash to list an org's projects."
746+
: "";
742747
throw new ValidationError(
743-
`The --cursor flag is only supported when listing ${config.entityPlural} for a specific organization ` +
744-
`(e.g., ${config.commandPrefix} <org>/). ` +
745-
`Use '${config.commandPrefix} <org>/' for paginated results.`,
748+
"The --cursor flag requires the <org>/ pattern " +
749+
`(e.g., ${config.commandPrefix} my-org/).` +
750+
hint,
746751
"cursor"
747752
);
748753
}

0 commit comments

Comments
 (0)