///|
fn main raise {
  let app = @cmder.cli(
    name="myapp",
    version="0.1.0",
    description="Example CLI with nested subcommands",
    commands=[
      @cmder.command(
        name="greet",
        description="Greet someone",
        options=[
          @cmder.string(
            "name",
            short='n',
            description="Name to greet",
            required=true,
          ),
          @cmder.bool("loud", short='l', description="Shout the greeting"),
          @cmder.int("count", short='c', description="Repeat count", default=1),
        ],
        examples=[
          "myapp greet --name Alice", "myapp greet --name Bob --loud --count 3",
        ],
        run=ctx => {
          let name = ctx.get_string_required("name")
          let loud = ctx.get_bool("loud")
          let count = ctx.get_int_required("count")
          for _ in 0.. {
              let dry = ctx.get_bool("dry-run")
              let steps = ctx.get_int("steps")
              if dry {
                println("[DRY RUN] Would apply migrations")
              } else {
                match steps {
                  Some(n) => println("Applying \{n} migrations...")
                  None => println("Applying all pending migrations...")
                }
              }
              println("Done.")
            },
          ),
          @cmder.command(
            name="down",
            description="Rollback migrations",
            options=[
              @cmder.int(
                "steps",
                short='s',
                description="Number of migrations to rollback",
                default=1,
              ),
            ],
            run=ctx => {
              let steps = ctx.get_int_required("steps")
              println("Rolling back \{steps} migration(s)...")
              println("Done.")
            },
          ),
        ]),
        @cmder.command(
          name="seed",
          description="Seed the database",
          options=[
            @cmder.string(
              "file",
              short='f',
              description="Seed file path",
              default="seeds/default.sql",
            ),
          ],
          run=ctx => {
            let file = ctx.get_string_required("file")
            println("Seeding from: \{file}")
          },
        ),
      ]),
    ],
  )
  // --schema flag: output structured JSON and exit
  let args = @env.args()
  if args.length() > 0 && args[args.length() - 1] == "--schema" {
    println(app.render_schema())
    return
  }
  app.run_or_exit()
}