Generate CLI output schemas from command output types
Maintainer thường phản hồi trong vòng 1 ngày
Một pull request liên quan đã được merge.
- #1830 của @sentry-junior — đã merge
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 12/100
- Loại issue
- Tái cấu trúc
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Đình trệ
- Công nghệ
- typescript
Hướng nghiên cứu
Start with packages/cli/src/commands/alert/output-schemas.ts to see how API fields and hand-written CLI fields are declared alongside the TypeScript output types. The existing completion-target and command-api generators are the model for any build step, and packages/cli/AGENTS.md is where the new declaration convention would be documented. This is design work, and PR #1830 is already open against it, so pick it up only after confirming with maintainers which option is chosen.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Problem
Command output schemas (OutputConfig.schema) drive --fields completion, the JSON field tables in --help, and the generated skill references. Since #1783, the fields that come from the Sentry API are taken from the generated @sentry/api/valibot response schemas (for example packages/cli/src/commands/alert/output-schemas.ts). Fields the CLI adds itself are still written by hand, next to a TypeScript output type that describes the same data:
- target context:
org,project,orgSlug,targetProject - status and result flags: the alert
statuslabel,deleted,dryRun(DryRunOutputField) - computed values:
dsn,url, dashboardperiod/fetchedAt, widgetdata
So every command declares its JSON output twice: once as the TypeScript type its func yields and output.human consumes, and once as a valibot schema. Nothing checks that the two agree. The schema is documentation only (nothing validates output against it), so drift goes unnoticed. A field added to the type silently stops completing, and a renamed field keeps completing a path that no longer exists. Raised by @BYK in https://github.com/getsentry/toolkit/pull/1783#discussion_r4448809546 ("Shouldn't this be auto-generated?").
Goal
One source of truth per command's JSON output: the API part from @sentry/api, and the CLI-added part derived from the command's output type instead of written by hand.
Options
- Generate schemas from TypeScript types at build time. Add a
generate:*step, like the existing completion-target and command-api generators, that reads each command's declared output type and emits a valibot (or plain field-path) description. Candidates: the TS compiler API, or a types-to-schema tool. Descriptions would come from TSDoc on the type's properties.- Pros: types stay the source of truth, and descriptions sit next to the fields.
- Cons: output types are often inferred or built from
Pick/intersections over SDK types. The generator has to resolve those, and it has to know which type belongs to which command.
- Invert it: schema first, types derived. Write the CLI-added entries once as valibot and derive the TS type with
InferOutput<typeof Schema>, sofunc's return type andoutput.human's parameter come from the schema.- Pros: no new generator, and the compiler enforces that the two agree.
- Cons: valibot becomes the authoring format for output types, which means touching many commands.
- Keep both, add a type-level check. Keep hand-written schemas, but add a compile-time assertion per command, e.g.
Expect<Equal<keyof InferOutput<typeof Schema>, keyof Output>>, or a test that compares field paths.- Pros: smallest change.
- Cons: still two copies to maintain, and only drift is caught.
Option 2 looks like the best fit for buildCommand. Option 1 is worth it only if descriptions can come from TSDoc reliably.
Dependencies
- Descriptions for API fields need the upstream change from the #1783 plan:
@sentry/api's generated valibot has nov.description()actions today, so the CLI wraps generated fields inpipe(field, description(...))by hand. Until that lands, this issue only covers the CLI-added fields. - Related: #1387 (migrate fully to
@sentry/apiSDK types), and #1808 / thesentry-cli/json-transform-uses-fieldslint rule (jsonTransformmust applyfields).
Done when
- No command's output schema writes out by hand a field that also exists in its TypeScript output type, or a test/compile error fails when they diverge.
--fieldscompletion,--helpfield tables and the skill references keep working unchanged, and the generated docs don't change unexpectedly.packages/cli/AGENTS.mddocuments how to declare output for a new command.
via @BYK.
--
- Ngôn ngữ chính
- TypeScript
- Star
- 949
- Fork
- 171
- Merge trung bình
- 23 giờ 5 phút
- Pull request đã merge (30 ngày)
- 320
Chuẩn bị môi trường
Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của getsentry/toolkit
-
CLI enhancement MCP
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 63/100
getsentry/toolkit#1908 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Docs MCP URL normalization retains query strings and fragmentsCó thể đã có người làm @pcbeingused333 đã nhận 4 ngày trước. Đang mởbug MCP
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 73/100
getsentry/toolkit#1618 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
getsentry/toolkit#1471 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 35/100
getsentry/toolkit#1925 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement MCP
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 25/100
getsentry/toolkit#1911 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của getsentry/toolkit
Issue tương tự
-
area: infrastructure bug priority: low
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
snapotter-hq/SnapOtter#4575 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
Maintainer thường phản hồi trong vòng 1 ngày
-
documentation server-memory v2
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
modelcontextprotocol/servers#5457 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
comp: ssr comp: zones type: feature version: current (v17+)
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
angular/angularfire#3836 ·
Maintainer thường phản hồi trong vòng 3 ngày
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
Maintainer thường phản hồi trong vòng 1 ngày