Skip to content

CLI Generation: roadmap to Firecrawl-parity for autosdk cli-project #338

Description

@HavenDV

Tracking issue: CLI generation quality

AutoSDK already generates runnable CLI projects via autosdk cli-project (and the source-generator variant gated by AutoSDK_GenerateCli=true). For real-world SDKs the generated output is currently a low-level API wrapper: every operation takes only --request-json / --request-file and emits raw JSON. The user-facing UX layer (per-field flags, polling, formatters, sensible output options, env-based auth) has to be re-implemented by hand in every SDK that wants a polished CLI.

Firecrawl is the gold-standard hand-written reference in this org — firecrawl scrape <url> --only-main-content --max-depth 5 --wait --output-dir ./out/ — but its Commands/ folder is ~1500 lines of bespoke System.CommandLine wiring on top of the AutoSDK-generated GeneratedApi/ baseline.

This issue tracks the gap analysis. Each sub-issue captures one missing capability the generator would need to absorb to make hand-written Commands/ largely unnecessary.

Architectural premise (layered approach)

Keep the existing two-tier shape: auto-generated .g.cs baseline + hand-written overrides via partial-class hooks. Each hook becomes optional polish — out-of-the-box generation should already be Firecrawl-quality.

Customization seams:

  • partial-class hooks on generated command classes (override formatter, customize argument hoisting, replace command entirely)
  • OpenAPI vendor extensions (x-cli-argument, x-cli-format, x-cli-wait, x-cli-skip) for spec-side overrides
  • existing AutoSDK CLI/MSBuild flags pattern (AutoSDK_Cli* props mirrored to --cli-* CLI flags)

Gap list

# Gap Issue
1 Per-parameter flags (request body flattening) #339
2 Positional argument hoisting #340
3 Long-running job polling (--wait/--poll-interval/--wait-timeout) #341
4 Human-readable response formatters + --json toggle #342
5 --input / --output / --output-dir convenience options #343
6 Auth flow polish (env var fallback, per-SDK config dir, auth status with source) #344
7 Smart command naming (strip tag prefix, drop api wrapper by default) #345
8 Option set reuse across operations sharing a body schema #346
9 Tri-state nullable bool option parser #347
10 Webhook composite builder #348

Suggested execution order

Land #339 first (request body flattening) — most others depend on it. Then #340 + #345 (hoisting + naming, both small) so the command surface looks right. Then #341 (polling) for the long-running-job SDKs. Then #343 (input/output options). Then #342 (formatters) so the output side is presentable. Then #344 (auth) so SDKs don't need hand-written auth resolution. Finally #346 / #347 / #348 as polish.

Pilot

Firecrawl. Once each gap lands, regenerate Firecrawl.Cli/GeneratedApi/ and shrink the hand-written Commands/ accordingly. Final acceptance is when Firecrawl's CLI ships with no hand-written commands (or only ones that genuinely cannot be derived from the spec).

Reference paths

  • Generator: src/libs/AutoSDK.CLI/Commands/CliProjectCommand.cs (scaffolder) and src/libs/AutoSDK.SourceGenerators/CliGenerator.cs (Roslyn).
  • Hand-written reference: tryAGI/Firecrawlsrc/libs/Firecrawl.Cli/Commands/, CliOptions.cs, CliRuntime.cs.
  • Current generated output: tryAGI/Firecrawlsrc/libs/Firecrawl.Cli/GeneratedApi/.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions