Skip to content

move the start sub-command to cobra.#864

Open
qustavo wants to merge 1 commit intoarkade-os:masterfrom
qustavo:move_start_cmd_to_cobra
Open

move the start sub-command to cobra.#864
qustavo wants to merge 1 commit intoarkade-os:masterfrom
qustavo:move_start_cmd_to_cobra

Conversation

@qustavo
Copy link
Contributor

@qustavo qustavo commented Dec 11, 2025

This is the first (of multiple) commit that starts the migration from urfave/cli to spf13/cobra so that we have a unified commmand and flag handler.

Now flag usage is documented.

Closes #782

Summary by CodeRabbit

  • New Features

    • Added CLI flag-based configuration and wiring for server startup.
    • Environment variables are now bound with an ARKD_ prefix and support hyphen-to-underscore mapping for keys (improved env var/flag consistency).
  • Chores

    • Reworked command wiring and startup handling to route execution through a wrapper-based CLI flow.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 11, 2025

Walkthrough

Replaces the urfave/cli start command with a Cobra-based command structure: adds Viper env binding, moves start logic into a new Cobra start command and wrapper, and renames configuration keys from UPPERCASE underscore style to lowercase hyphen style while adding Cobra flag wiring.

Changes

Cohort / File(s) Summary
Cobra/Viper setup
cmd/arkd/root.go
New file: sets Viper prefix ARKD, enables automatic env binding, and applies a replacer to map -_ for environment variables.
Start command (Cobra)
cmd/arkd/start.go
New Cobra-based start command and action: loads config, builds service config, optionally enables OTel, starts gRPC service, registers stop handler, and waits for OS signals; flags bound to Viper.
CLI command wiring / wrapper
cmd/arkd/commands.go, cmd/arkd/main.go
Replaces original startCmd with a startCmdWrapper that sets SkipFlagParsing: true and routes execution to the start implementation; updates app command list and default resolution.
Configuration & flags
internal/config/config.go
Adds SetupFlags(cmd *cobra.Command) to register many CLI flags, binds them to Viper, and changes exported config key values from UPPERCASE/underscore to lowercase/hyphen names.
Module dependencies
go.mod
Adds github.com/spf13/cobra v1.10.2, updates/declares github.com/spf13/pflag v1.0.9, and includes github.com/inconshreveable/mousetrap indirect dependency.

Sequence Diagram(s)

mermaid
sequenceDiagram
participant User as CLI user
participant Cobra as Cobra command
participant Viper as Viper/env
participant Config as internal/config
participant Service as Ark gRPC service
participant OTel as OTel (optional)
Note over User,Cobra: User runs arkd start (startCmdWrapper)
User->>Cobra: invoke start command (SkipFlagParsing)
Cobra->>Viper: bind flags/env via SetupFlags and envReplacer
Cobra->>Config: call LoadConfig (reads Viper-bound flags/env)
Config-->>Cobra: return cfg
Cobra->>Service: initialize service with cfg
alt otel enabled
Service->>OTel: initialize exporter and start push loop
end
Service->>Service: start gRPC and admin listeners
Service->>Cobra: register exit/stop handler
Cobra->>Service: wait for termination signals (SIGINT/SIGTERM)
Note over Service,Cobra: on signal -> Service.Stop() and cleanup

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

  • Attention areas:
    • Verify all renamed config key constants in internal/config/config.go are updated across the codebase and flag bindings.
    • Confirm SetupFlags correctly binds flags to Viper and that envReplacer maps env vars as expected.
    • Ensure startCmdWrapper routing and SkipFlagParsing behavior match intended CLI parsing semantics.
    • Inspect start.go startup/shutdown sequence (OTel initialization, service lifecycle, signal handling).

Possibly related PRs

  • add start sub-command #783 — Modifies the same start command declaration and action flow; directly related to the start command restructuring.

Suggested reviewers

  • Kukks
  • louisinger
  • altafan

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 16.67% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'move the start sub-command to cobra' directly and clearly summarizes the primary change: migrating the start subcommand from urfave/cli to spf13/cobra.
Linked Issues check ✅ Passed The PR fulfills the primary objective from issue #782 by moving command logic into a dedicated Cobra-based subcommand with its own flag setup, enabling proper flag documentation via --help.
Out of Scope Changes check ✅ Passed All changes are scoped to migrating the start subcommand to Cobra and supporting infrastructure (root.go for Viper config, config.go for flag setup) required for this migration.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@qustavo qustavo mentioned this pull request Dec 11, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (3)
cmd/arkd/commands.go (1)

20-28: Consider passing subcommand args into Cobra explicitly instead of relying on os.Args

Right now the wrapper ignores the *cli.Context and calls startCmd.Execute(), which in turn parses os.Args. This works, but it means patterns like arkd start <args> will leave "start" as a positional arg to Cobra (even if you don’t use args today).

You could make the behavior more explicit and future‑proof by wiring the urfave args into Cobra:

-	startCmdWrapper = &cli.Command{
+	startCmdWrapper = &cli.Command{
 		Name:            "start",
 		Usage:           "Starts the arkd server",
 		SkipFlagParsing: true,
-		Action: func(_ *cli.Context) error {
-			return startCmd.Execute()
+		Action: func(ctx *cli.Context) error {
+			startCmd.SetArgs(ctx.Args().Slice())
+			return startCmd.Execute()
 		},
 	}

This keeps the wrapper behavior well‑defined even if you later start using Cobra positional args.

cmd/arkd/start.go (1)

29-31: Decouple startAction from *cli.Context once urfave/cli is gone

The comment says startAction is a wrapper for the Cobra command, but its signature still takes a *cli.Context (always passed as nil from Cobra). Once you finish the urfave→Cobra migration, consider changing it to:

-func startAction(_ *cli.Context) error {
+func startAction() error {

and updating RunE accordingly. That will let you drop the urfave import from this file entirely.

internal/config/config.go (1)

335-365: LoadConfig now depends on Viper/flags being preconfigured; consider defaults and error text alignment

LoadConfig assumes that Viper has already been wired with defaults and env/flag bindings (via SetupFlags + the root.go init). That’s fine for the arkd start code path, but it’s worth double‑checking two things:

  1. Behavior when LoadConfig is used outside the Cobra path

If any tests, tools, or other code paths call config.LoadConfig() without having first called SetupFlags (or without setting Viper defaults), viper.GetString(Datadir) will be empty and initDatadir will attempt to MkdirAll(""), which will fail with a somewhat opaque “failed to create datadir” error.

If you expect LoadConfig to be reused outside the Cobra/CLI context, consider also setting Viper defaults inside this package (e.g. in an init or at the start of LoadConfig) so it is self‑contained:

viper.SetDefault(Datadir, defaultDatadir)
// ... other critical defaults if needed

or clearly document that SetupFlags must be called before LoadConfig.

  1. Align error messaging with new env/flag naming

In liveStoreService:

redisOpts, err := redis.ParseURL(c.RedisUrl)
if err != nil {
    return fmt.Errorf("invalid REDIS_URL: %w", err)
}

the error references REDIS_URL, but the new key is redis-url and the actual env var is ARKD_REDIS_URL. Updating this message to reflect the new naming (or to mention both old and new env vars if you keep compatibility) will avoid confusion when debugging misconfigurations.

Neither of these change runtime behavior in the happy path, but they make the config API more robust and operator‑friendly.

Also applies to: 788-801

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 76f6680 and 96cc19b.

⛔ Files ignored due to path filters (1)
  • go.sum is excluded by !**/*.sum
📒 Files selected for processing (6)
  • cmd/arkd/commands.go (1 hunks)
  • cmd/arkd/main.go (2 hunks)
  • cmd/arkd/root.go (1 hunks)
  • cmd/arkd/start.go (1 hunks)
  • go.mod (3 hunks)
  • internal/config/config.go (3 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
internal/config/config.go (3)
pkg/arkd-wallet/config/config.go (7)
  • Datadir (25-25)
  • Port (24-24)
  • LogLevel (26-26)
  • OtelCollectorEndpoint (30-30)
  • OtelPushInterval (31-31)
  • PyroscopeServerURL (32-32)
  • Config (84-97)
pkg/arkd-wallet-btcwallet/config/config.go (5)
  • Datadir (18-18)
  • Port (17-17)
  • LogLevel (19-19)
  • EsploraURL (21-21)
  • Config (88-102)
internal/interface/grpc/config.go (1)
  • Config (13-23)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: integration tests
  • GitHub Check: unit tests
🔇 Additional comments (5)
go.mod (1)

47-47: Cobra/pflag dependency additions look consistent; just ensure the module graph is clean

Adding github.com/spf13/cobra v1.10.2, its mousetrap helper, and bumping pflag to v1.0.9 is the expected stack for Cobra and should coexist fine with the existing dependencies.

I’d still recommend re‑running go mod tidy and your test suite to confirm there are no unexpected indirect changes or version conflicts introduced by the new CLI wiring.

Also applies to: 126-126, 261-261

cmd/arkd/start.go (2)

77-93: Nice touch on augmenting flag help with env variable hints

Decorating each flag’s Usage with its corresponding ARKD_... environment variable via envReplacer + viper.BindPFlags is a good way to surface configuration without separate docs. This directly addresses the “flag usage is now documented” goal for arkd start --help.


24-56: The gRPC service constructor already calls appConfig.Validate() internally (at internal/interface/grpc/service.go), so an explicit validation call before grpcservice.NewService is redundant. Additionally, Config.Validate() only validates configuration fields (db type, scheduler type, etc.) and does not perform service initialization. Services like wallet, signer, and repo are initialized on-demand through getter methods like WalletService() and AdminService(), not through Validate(). The current code flow is correct as-is.

Likely an incorrect or invalid review comment.

cmd/arkd/main.go (1)

26-44: Wrapper integration preserves default start behavior

Wiring startCmdWrapper into app.Commands and using app.DefaultCommand = startCmd.Use keeps arkd (without a subcommand) starting the daemon, while also allowing arkd start --help to go through Cobra and expose the new, documented flags. This matches the compatibility note from the issue while improving per‑command help.

cmd/arkd/root.go (1)

9-17: The review comment is incorrect; the ARKD_ prefix is established public API, not a breaking change.

The viper.SetEnvPrefix("ARKD") configuration at lines 9-17 is the original design, already documented in the README as the standard way to configure arkd. All environment variables (ARKD_DATADIR, ARKD_DB_TYPE, ARKD_PORT, etc.) are publicly documented, and operators are already using them. There is no legacy unprefixed behavior (DB_TYPE, DATADIR) to maintain backward compatibility with—the prefix has been part of the public API from the start.

The comment above envReplacer is also accurate: it correctly describes mapping flags like --db-type to environment variables (which become ARKD_DB_TYPE after the prefix is applied). No changes needed.

This is the first (of multiple) commit that starts the migration from
urfave/cli to spf13/cobra so that we have a unified commmand and flag
handler.

Now flag usage is documented.

Closes arkade-os#782
@qustavo qustavo force-pushed the move_start_cmd_to_cobra branch from 96cc19b to dab0942 Compare December 11, 2025 18:27
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (1)
internal/config/config.go (1)

298-302: Empty help text for several flags.

These flags have empty descriptions: SettlementMinExpiryGap, VtxoNoCsvValidationCutoffDate, OnchainOutputFee, EnablePprof, AlertManagerURL (L314), and PyroscopeServerURL (L332). This reduces CLI usability when users run --help.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 96cc19b and dab0942.

⛔ Files ignored due to path filters (1)
  • go.sum is excluded by !**/*.sum
📒 Files selected for processing (6)
  • cmd/arkd/commands.go (1 hunks)
  • cmd/arkd/main.go (2 hunks)
  • cmd/arkd/root.go (1 hunks)
  • cmd/arkd/start.go (1 hunks)
  • go.mod (3 hunks)
  • internal/config/config.go (3 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • cmd/arkd/start.go
  • go.mod
🧰 Additional context used
🧬 Code graph analysis (1)
internal/config/config.go (3)
pkg/arkd-wallet/config/config.go (5)
  • Datadir (25-25)
  • Port (24-24)
  • LogLevel (26-26)
  • LoadConfig (41-82)
  • Config (84-97)
pkg/arkd-wallet-btcwallet/config/config.go (6)
  • Datadir (18-18)
  • Port (17-17)
  • LogLevel (19-19)
  • EsploraURL (21-21)
  • LoadConfig (38-86)
  • Config (88-102)
internal/interface/grpc/config.go (1)
  • Config (13-23)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: integration tests
  • GitHub Check: Build and Scan
  • GitHub Check: unit tests
🔇 Additional comments (4)
cmd/arkd/root.go (1)

9-17: LGTM! Environment variable binding setup is correct.

The Viper configuration correctly:

  • Sets ARKD as the environment prefix
  • Uses AutomaticEnv() to bind all keys
  • Replaces - with _ via SetEnvKeyReplacer to map kebab-case flags (e.g., --db-type) to environment variables (e.g., ARKD_DB_TYPE)

This aligns well with the new lowercase-hyphen keys in internal/config/config.go.

cmd/arkd/commands.go (1)

20-29: Wrapper pattern for incremental CLI migration looks good.

The SkipFlagParsing: true setting is essential here—it prevents urfave/cli from consuming flags that should be parsed by Cobra's startCmd. The TODO comment clearly documents the transitional nature of this wrapper.

internal/config/config.go (1)

156-213: LGTM! Consistent kebab-case naming for configuration keys.

The key naming convention is now uniform (lowercase-hyphen), which integrates properly with the Viper environment replacer in root.go that maps --db-typeARKD_DB_TYPE.

cmd/arkd/main.go (1)

43-43: No changes needed. startCmd.Use is correctly set to "start" in start.go (line 21), matching startCmdWrapper.Name (commands.go line 23). The default command resolves correctly.

Comment on lines +254 to +256
cmd.Flags().Int(Port, DefaultPort, "Port (public) to listen on")
cmd.Flags().Int(AdminPort, DefaultAdminPort,
"Admin port (private) to listen on, fallback to service port if 0")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Type inconsistency: Port flags registered as Int, read as Uint32.

Port and AdminPort are registered with cmd.Flags().Int() but LoadConfig reads them with viper.GetUint32(). While ports are typically positive, the type mismatch may cause Viper binding issues.

Consider using cmd.Flags().Uint32() for consistency:

-	cmd.Flags().Int(Port, DefaultPort, "Port (public) to listen on")
-	cmd.Flags().Int(AdminPort, DefaultAdminPort,
+	cmd.Flags().Uint32(Port, uint32(DefaultPort), "Port (public) to listen on")
+	cmd.Flags().Uint32(AdminPort, uint32(DefaultAdminPort),
 		"Admin port (private) to listen on, fallback to service port if 0")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
cmd.Flags().Int(Port, DefaultPort, "Port (public) to listen on")
cmd.Flags().Int(AdminPort, DefaultAdminPort,
"Admin port (private) to listen on, fallback to service port if 0")
cmd.Flags().Uint32(Port, uint32(DefaultPort), "Port (public) to listen on")
cmd.Flags().Uint32(AdminPort, uint32(DefaultAdminPort),
"Admin port (private) to listen on, fallback to service port if 0")
🤖 Prompt for AI Agents
internal/config/config.go around lines 254 to 256: the flags for Port and
AdminPort are registered with cmd.Flags().Int() but later read with
viper.GetUint32(), causing a type mismatch; change the flag registrations to
cmd.Flags().Uint32() for both Port and AdminPort, and ensure DefaultPort and
DefaultAdminPort are uint32 (or cast to uint32 when passing to the flag) so the
flag types match the viper.GetUint32() usage; leave the AdminPort 0 fallback
behavior unchanged.

Comment on lines +269 to +281
cmd.Flags().Int(UnilateralExitDelay, defaultUnilateralExitDelay,
"Unilateral exit delay in seconds")
cmd.Flags().Int(PublicUnilateralExitDelay, defaultUnilateralExitDelay,
"Public unilateral exit delay in seconds")
cmd.Flags().Int(CheckpointExitDelay, defaultCheckpointExitDelay,
"Checkpoint exit delay in seconds")
cmd.Flags().String(EsploraURL, defaultEsploraURL, "Esplora API URL")
cmd.Flags().Bool(NoMacaroons, defaultNoMacaroons, "Disable macaroon authentication")
cmd.Flags().Int(BoardingExitDelay, defaultBoardingExitDelay, "Boarding exit delay in seconds")
cmd.Flags().Int(RoundMaxParticipantsCount, defaultRoundMaxParticipantsCount,
"Maximum number of participants per round")
cmd.Flags().Int(RoundMinParticipantsCount, defaultRoundMinParticipantsCount,
"Minimum number of participants per round")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Type mismatch: Int flags read as Int64 in LoadConfig.

Several flags are registered with cmd.Flags().Int() but LoadConfig reads them with viper.GetInt64():

Flag SetupFlags type LoadConfig getter
UnilateralExitDelay Int (L269) GetInt64 (L406)
PublicUnilateralExitDelay Int (L271) GetInt64 (L407)
CheckpointExitDelay Int (L273) GetInt64 (L408)
BoardingExitDelay Int (L277) GetInt64 (L409)
RoundMaxParticipantsCount Int (L278) GetInt64 (L434)
RoundMinParticipantsCount Int (L280) GetInt64 (L435)

When Viper binds Cobra flags, a type mismatch can cause incorrect value retrieval (returning 0 or truncated values).

Apply this diff to fix the type mismatches:

-	cmd.Flags().Int(UnilateralExitDelay, defaultUnilateralExitDelay,
+	cmd.Flags().Int64(UnilateralExitDelay, int64(defaultUnilateralExitDelay),
 		"Unilateral exit delay in seconds")
-	cmd.Flags().Int(PublicUnilateralExitDelay, defaultUnilateralExitDelay,
+	cmd.Flags().Int64(PublicUnilateralExitDelay, int64(defaultUnilateralExitDelay),
 		"Public unilateral exit delay in seconds")
-	cmd.Flags().Int(CheckpointExitDelay, defaultCheckpointExitDelay,
+	cmd.Flags().Int64(CheckpointExitDelay, int64(defaultCheckpointExitDelay),
 		"Checkpoint exit delay in seconds")
 	cmd.Flags().String(EsploraURL, defaultEsploraURL, "Esplora API URL")
 	cmd.Flags().Bool(NoMacaroons, defaultNoMacaroons, "Disable macaroon authentication")
-	cmd.Flags().Int(BoardingExitDelay, defaultBoardingExitDelay, "Boarding exit delay in seconds")
-	cmd.Flags().Int(RoundMaxParticipantsCount, defaultRoundMaxParticipantsCount,
+	cmd.Flags().Int64(BoardingExitDelay, int64(defaultBoardingExitDelay), "Boarding exit delay in seconds")
+	cmd.Flags().Int64(RoundMaxParticipantsCount, int64(defaultRoundMaxParticipantsCount),
 		"Maximum number of participants per round")
-	cmd.Flags().Int(RoundMinParticipantsCount, defaultRoundMinParticipantsCount,
+	cmd.Flags().Int64(RoundMinParticipantsCount, int64(defaultRoundMinParticipantsCount),
 		"Minimum number of participants per round")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
cmd.Flags().Int(UnilateralExitDelay, defaultUnilateralExitDelay,
"Unilateral exit delay in seconds")
cmd.Flags().Int(PublicUnilateralExitDelay, defaultUnilateralExitDelay,
"Public unilateral exit delay in seconds")
cmd.Flags().Int(CheckpointExitDelay, defaultCheckpointExitDelay,
"Checkpoint exit delay in seconds")
cmd.Flags().String(EsploraURL, defaultEsploraURL, "Esplora API URL")
cmd.Flags().Bool(NoMacaroons, defaultNoMacaroons, "Disable macaroon authentication")
cmd.Flags().Int(BoardingExitDelay, defaultBoardingExitDelay, "Boarding exit delay in seconds")
cmd.Flags().Int(RoundMaxParticipantsCount, defaultRoundMaxParticipantsCount,
"Maximum number of participants per round")
cmd.Flags().Int(RoundMinParticipantsCount, defaultRoundMinParticipantsCount,
"Minimum number of participants per round")
cmd.Flags().Int64(UnilateralExitDelay, int64(defaultUnilateralExitDelay),
"Unilateral exit delay in seconds")
cmd.Flags().Int64(PublicUnilateralExitDelay, int64(defaultUnilateralExitDelay),
"Public unilateral exit delay in seconds")
cmd.Flags().Int64(CheckpointExitDelay, int64(defaultCheckpointExitDelay),
"Checkpoint exit delay in seconds")
cmd.Flags().String(EsploraURL, defaultEsploraURL, "Esplora API URL")
cmd.Flags().Bool(NoMacaroons, defaultNoMacaroons, "Disable macaroon authentication")
cmd.Flags().Int64(BoardingExitDelay, int64(defaultBoardingExitDelay), "Boarding exit delay in seconds")
cmd.Flags().Int64(RoundMaxParticipantsCount, int64(defaultRoundMaxParticipantsCount),
"Maximum number of participants per round")
cmd.Flags().Int64(RoundMinParticipantsCount, int64(defaultRoundMinParticipantsCount),
"Minimum number of participants per round")
🤖 Prompt for AI Agents
internal/config/config.go around lines 269 to 281, several flags are registered
with cmd.Flags().Int() but later read with viper.GetInt64(), causing a type
mismatch; change the flag registrations for UnilateralExitDelay,
PublicUnilateralExitDelay, CheckpointExitDelay, BoardingExitDelay,
RoundMaxParticipantsCount, and RoundMinParticipantsCount to use
cmd.Flags().Int64(...) (matching the GetInt64 getters) so the flag types align
with Viper reads and preserve 64-bit values.

@altafan
Copy link
Collaborator

altafan commented Jan 7, 2026

@qustavo sorry for the late reply 🙏. Can we go directly for the migration from urfave/cli to cobra? This way we don't need to have "wrappers"

@qustavo
Copy link
Contributor Author

qustavo commented Jan 19, 2026

@qustavo sorry for the late reply 🙏. Can we go directly for the migration from urfave/cli to cobra? This way we don't need to have "wrappers"

We could but that would turn the PR into a greater change which makes it harder to properly review it. To better understand your motivation, what's the downside of a wrapper (which will eventually be removed)

@altafan
Copy link
Collaborator

altafan commented Feb 4, 2026

We could but that would turn the PR into a greater change which makes it harder to properly review it. To better understand your motivation, what's the downside of a wrapper (which will eventually be removed)

I think it will still lead to a big pr once we remove the wrappers? In this case, the wrappers seem like unnecessary extra work?

@qustavo
Copy link
Contributor Author

qustavo commented Feb 10, 2026

It might be more code changes, split in smaller PRs, IMO these are easier to reason about hence to review, also it should minimize branch conflicts.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Improve main action flag visibility

2 participants