From b6957b82498d969714a9851d7b55f694a5052319 Mon Sep 17 00:00:00 2001
From: default <216188+jdx@users.noreply.github.com>
Date: Sun, 23 Aug 2026 19:24:10 +0000
Subject: [PATCH 1/2] perf(go): measure Go parsers the way the Rust ones are
measured
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The Go card on the landing page reported whole-process wall time with the Go
runtime's ~1 ms startup subtracted, while the Rust card reported in-process parse
throughput. Two cards, two estimators, one of them a difference between numbers
two orders of magnitude larger than the bar it drew. Worse, the usage-go bar was
the binder alone against the other three frameworks' whole job.
So: `benches/go/cmd/sweep` is `benches/gate/src/bin/time-sweep.rs` in Go. Every
parser runs repeatedly in one process and the fastest of many short rounds is
reported, with the collector off during a round and run between rounds — left on,
it moved urfave's minimum by 2x between runs. usage-go's row is `Parse`, argv to a
filled struct, because that is the whole of what cobra, urfave and kong each do in
one call.
urfave/cli v3 and kong get generated mise-scale shadows, so all four rows are the
same CLI from the same checked-in spec rather than two of them being hand-measured
against programs that were not in the repository. What each framework cannot
express is counted and printed as before: kong loses most, since a flag reaches
every command below the one that declares it and mise redeclares 222 of them.
Whole-process cost is still measured and still reported, in `go/README.md` rather
than on the chart: it is mostly the Go runtime, and it cannot resolve a 5.9 µs
parse. Its instruction counts are now taken with `GOMAXPROCS=1` — valgrind
serializes every thread onto one core and an unpinned Go runtime spends the wait
spinning, which read twenty cobra resolves as 56M on one run and 5,002M on the
next.
At mise's scale, in-process: usage-go 5.9 µs, cobra 110 µs, urfave 200 µs, kong
3.0 ms. The typed front door costs about eighty times the binder under it, most of
it in two maps the generated `Parse` allocates per call, which is now written down
in the README rather than stepped around by charting the binder.
Co-Authored-By: Claude Opus 5
---
benches/go/cmd/parse-n-cobra/main.go | 38 +
benches/go/cmd/parse-n-kong/main.go | 38 +
benches/go/cmd/parse-n-urfave/main.go | 38 +
benches/go/cmd/sweep/main.go | 168 +
benches/go/cobra/go.mod | 15 -
benches/go/cobra/go.sum | 13 -
benches/go/go.mod | 29 +
benches/go/go.sum | 30 +
.../go/{cobra/main.go => mise-cobra/cobra.go} | 52 +-
benches/go/mise-kong/kong.go | 1705 ++
benches/go/mise-urfave/urfave.go | 256 +
benches/go/mise/tables.go | 14350 ++++++++++++++++
benches/go/shadows_test.go | 77 +
docs/.vitepress/theme/UsageBenches.vue | 57 +-
docs/go/index.md | 6 +-
go/README.md | 192 +-
go/internal/bench/bind-n/main.go | 44 +
go/internal/bench/parse-n/main.go | 60 +-
mise.toml | 47 +-
tasks/perf-go.sh | 353 +-
xtask/src/{ => go}/cobra.rs | 163 +-
xtask/src/go/kong.rs | 412 +
xtask/src/go/mod.rs | 148 +
xtask/src/go/urfave.rs | 254 +
xtask/src/main.rs | 14 +-
25 files changed, 18073 insertions(+), 486 deletions(-)
create mode 100644 benches/go/cmd/parse-n-cobra/main.go
create mode 100644 benches/go/cmd/parse-n-kong/main.go
create mode 100644 benches/go/cmd/parse-n-urfave/main.go
create mode 100644 benches/go/cmd/sweep/main.go
delete mode 100644 benches/go/cobra/go.mod
delete mode 100644 benches/go/cobra/go.sum
create mode 100644 benches/go/go.mod
create mode 100644 benches/go/go.sum
rename benches/go/{cobra/main.go => mise-cobra/cobra.go} (99%)
create mode 100644 benches/go/mise-kong/kong.go
create mode 100644 benches/go/mise-urfave/urfave.go
create mode 100644 benches/go/mise/tables.go
create mode 100644 benches/go/shadows_test.go
create mode 100644 go/internal/bench/bind-n/main.go
rename xtask/src/{ => go}/cobra.rs (50%)
create mode 100644 xtask/src/go/kong.rs
create mode 100644 xtask/src/go/mod.rs
create mode 100644 xtask/src/go/urfave.rs
diff --git a/benches/go/cmd/parse-n-cobra/main.go b/benches/go/cmd/parse-n-cobra/main.go
new file mode 100644
index 000000000..489e2db16
--- /dev/null
+++ b/benches/go/cmd/parse-n-cobra/main.go
@@ -0,0 +1,38 @@
+// Command parse-n-cobra resolves the same command line N times, N coming from the
+// environment, against cobra's command tree.
+//
+// The counterpart of `go/internal/bench/parse-n` for one of the frameworks usage-go
+// is compared against, and the same protocol: differencing two runs of one binary
+// separates what the resolves cost from what the Go runtime costs to start, without
+// subtracting a second binary whose startup is not the same size.
+//
+// What this answers that `cmd/sweep` cannot: instruction counts, which are
+// deterministic where wall clock is not, and what a whole process costs — the number
+// an adopter feels, most of which is the runtime rather than the parser.
+package main
+
+import (
+ "fmt"
+ "os"
+ "strconv"
+
+ misecobra "github.com/jdx/usage/benches/go/mise-cobra"
+)
+
+func main() {
+ n := 1
+ if v, err := strconv.Atoi(os.Getenv("PARSE_N")); err == nil {
+ n = v
+ }
+
+ // Printed at the end, and it is what keeps the measurement honest: a rejected
+ // command line is cheap to resolve, so a harness that did not check would happily
+ // report the cost of failing early.
+ seen := 0
+ for i := 0; i < n; i++ {
+ if misecobra.Resolve(os.Args[1:]) {
+ seen = 1
+ }
+ }
+ fmt.Println(seen)
+}
diff --git a/benches/go/cmd/parse-n-kong/main.go b/benches/go/cmd/parse-n-kong/main.go
new file mode 100644
index 000000000..87841706c
--- /dev/null
+++ b/benches/go/cmd/parse-n-kong/main.go
@@ -0,0 +1,38 @@
+// Command parse-n-kong resolves the same command line N times, N coming from the
+// environment, against kong's reflected grammar.
+//
+// The counterpart of `go/internal/bench/parse-n` for one of the frameworks usage-go
+// is compared against, and the same protocol: differencing two runs of one binary
+// separates what the resolves cost from what the Go runtime costs to start, without
+// subtracting a second binary whose startup is not the same size.
+//
+// What this answers that `cmd/sweep` cannot: instruction counts, which are
+// deterministic where wall clock is not, and what a whole process costs — the number
+// an adopter feels, most of which is the runtime rather than the parser.
+package main
+
+import (
+ "fmt"
+ "os"
+ "strconv"
+
+ misekong "github.com/jdx/usage/benches/go/mise-kong"
+)
+
+func main() {
+ n := 1
+ if v, err := strconv.Atoi(os.Getenv("PARSE_N")); err == nil {
+ n = v
+ }
+
+ // Printed at the end, and it is what keeps the measurement honest: a rejected
+ // command line is cheap to resolve, so a harness that did not check would happily
+ // report the cost of failing early.
+ seen := 0
+ for i := 0; i < n; i++ {
+ if misekong.Resolve(os.Args[1:]) {
+ seen = 1
+ }
+ }
+ fmt.Println(seen)
+}
diff --git a/benches/go/cmd/parse-n-urfave/main.go b/benches/go/cmd/parse-n-urfave/main.go
new file mode 100644
index 000000000..cb073ec16
--- /dev/null
+++ b/benches/go/cmd/parse-n-urfave/main.go
@@ -0,0 +1,38 @@
+// Command parse-n-urfave resolves the same command line N times, N coming from the
+// environment, against urfave's command tree.
+//
+// The counterpart of `go/internal/bench/parse-n` for one of the frameworks usage-go
+// is compared against, and the same protocol: differencing two runs of one binary
+// separates what the resolves cost from what the Go runtime costs to start, without
+// subtracting a second binary whose startup is not the same size.
+//
+// What this answers that `cmd/sweep` cannot: instruction counts, which are
+// deterministic where wall clock is not, and what a whole process costs — the number
+// an adopter feels, most of which is the runtime rather than the parser.
+package main
+
+import (
+ "fmt"
+ "os"
+ "strconv"
+
+ miseurfave "github.com/jdx/usage/benches/go/mise-urfave"
+)
+
+func main() {
+ n := 1
+ if v, err := strconv.Atoi(os.Getenv("PARSE_N")); err == nil {
+ n = v
+ }
+
+ // Printed at the end, and it is what keeps the measurement honest: a rejected
+ // command line is cheap to resolve, so a harness that did not check would happily
+ // report the cost of failing early.
+ seen := 0
+ for i := 0; i < n; i++ {
+ if miseurfave.Resolve(os.Args[1:]) {
+ seen = 1
+ }
+ }
+ fmt.Println(seen)
+}
diff --git a/benches/go/cmd/sweep/main.go b/benches/go/cmd/sweep/main.go
new file mode 100644
index 000000000..5b419f1c8
--- /dev/null
+++ b/benches/go/cmd/sweep/main.go
@@ -0,0 +1,168 @@
+// Command sweep is wall clock for the four Go parsers, measured so it survives a
+// loaded machine.
+//
+// This is `benches/gate/src/bin/time-sweep.rs` in Go, deliberately: the two cards on
+// the landing page should be answering the same question with the same estimator, and
+// what a parse costs is a question about parsing rather than about how long a Go
+// process takes to start. A whole-process measurement cannot answer it — 0.95 ms of a
+// Go process is the runtime coming up, which is three orders of magnitude larger than
+// the thing being compared and varies run to run by more than the thing being
+// compared costs.
+//
+// So each parser runs repeatedly in one process and the report is the *fastest*
+// per-parse time from many short rounds. Noise from other tenants is additive —
+// nothing another process does can make this one faster — so the minimum is the
+// estimator to want, and short rounds are the ones an interruption can only spoil
+// individually. Each framework gets rounds sized to about the same wall time rather
+// than the same iteration count, so a parser 200x slower than another is not asked
+// for 200x the work.
+//
+// Two things this does not measure, both reported elsewhere by `tasks/perf-go.sh`:
+// what a whole process costs, which is the number an adopter feels, and the garbage
+// collection an allocating parser causes, which a minimum over short rounds mostly
+// steps around. The median column is printed beside the minimum because that is where
+// collection shows up.
+package main
+
+import (
+ "flag"
+ "fmt"
+ "os"
+ "runtime"
+ "runtime/debug"
+ "sort"
+ "strings"
+ "time"
+
+ "github.com/jdx/usage/benches/go/mise"
+ misecobra "github.com/jdx/usage/benches/go/mise-cobra"
+ misekong "github.com/jdx/usage/benches/go/mise-kong"
+ miseurfave "github.com/jdx/usage/benches/go/mise-urfave"
+ "github.com/jdx/usage/go/argv"
+)
+
+// The one command line every row is measured against, the same one the Rust shadows
+// use, so the two cards describe the same work.
+var words = []string{"use", "-g", "node@20"}
+
+// Rounds, and per-round iteration counts chosen so a round is ~0.5-3ms of work.
+const rounds = 4000
+
+// sink keeps a parse from being optimized away. Go has no `black_box`, and a compiler
+// that can see the result is unused is within its rights to skip producing it.
+var sink bool
+
+type stats struct {
+ min, p01, p10, median float64
+}
+
+// sweep times iters calls of f, rounds times, and describes the distribution per call.
+//
+// The collector is off for the duration and asked to run between rounds, outside the
+// timed interval. Three frameworks here build a model per parse and drop it, so left to
+// itself the collector runs inside most rounds and lands unevenly: two runs of this
+// program read urfave's minimum as 266 µs and 546 µs, which is not a measurement of
+// anything. Off, every round measures the same work.
+//
+// Excluding it is also the closer answer for a CLI. A process that parses one command
+// line and gets on with it usually exits before the collector was ever going to run; what
+// the garbage costs shows up in the whole-process table instead, where a real process pays
+// for it.
+func sweep(rounds, iters int, f func() bool) stats {
+ defer debug.SetGCPercent(debug.SetGCPercent(-1))
+
+ // Warm the allocator, the caches, the branch predictors and — for the frameworks
+ // that build a model per call — the heap they will keep reusing. Whatever the first
+ // call pays for is not what a parse costs on the millionth.
+ warm := iters
+ if warm < 200 {
+ warm = 200
+ }
+ for i := 0; i < warm; i++ {
+ sink = f()
+ }
+
+ perCall := make([]float64, 0, rounds)
+ for r := 0; r < rounds; r++ {
+ // Between rounds, never inside one: with the collector off, whatever the last
+ // round allocated is still on the heap, and a round that has to grow it is
+ // measuring the allocator's bad day rather than the parser.
+ runtime.GC()
+ start := time.Now()
+ for i := 0; i < iters; i++ {
+ sink = f()
+ }
+ perCall = append(perCall, float64(time.Since(start).Nanoseconds())/float64(iters))
+ }
+ sort.Float64s(perCall)
+ at := func(q float64) float64 {
+ return perCall[int(float64(len(perCall)-1)*q)]
+ }
+ return stats{min: perCall[0], p01: at(0.01), p10: at(0.10), median: at(0.50)}
+}
+
+// row is one framework, and how much work to ask it for.
+type row struct {
+ label string
+ rounds int
+ iters int
+ f func() bool
+}
+
+func main() {
+ tsv := flag.Bool("tsv", false, "one tab-separated row per parser, for a script to read")
+ flag.Parse()
+
+ rows := []row{
+ {"usage-go, argv -> struct", rounds, 2_000, func() bool {
+ cli, err := mise.Parse(words)
+ return err == nil && cli.Use != nil
+ }},
+ // The binder alone, without the post-binding rules or the structs it fills.
+ // Reported because it is the part that is comparable to nothing else here: no
+ // other framework has a stage that answers "which token is which" and stops.
+ {"usage-go, argv -> events", rounds, 2_000, func() bool {
+ p := argv.New(mise.Root, words)
+ reached := false
+ for p.Next() {
+ if ev := p.Event(); ev.Kind == argv.KindCommand {
+ reached = true
+ }
+ }
+ return p.Err() == nil && reached
+ }},
+ {"urfave/cli v3, build tree + run", rounds / 8, 4, func() bool {
+ return miseurfave.Resolve(words)
+ }},
+ {"cobra, build tree + resolve", rounds / 8, 4, func() bool {
+ return misecobra.Resolve(words)
+ }},
+ {"kong, reflect over structs + parse", rounds / 40, 1, func() bool {
+ return misekong.Resolve(words)
+ }},
+ }
+
+ // Every row is checked before any row is timed. A parser that rejected this command
+ // line would be cheap for the wrong reason, and a table that reported it anyway
+ // would be measuring how fast a framework can fail.
+ for _, r := range rows {
+ if !r.f() {
+ fmt.Fprintf(os.Stderr,
+ "sweep: %s did not reach a subcommand on `%s`, so there is nothing worth measuring\n",
+ r.label, strings.Join(words, " "))
+ os.Exit(1)
+ }
+ }
+
+ if !*tsv {
+ fmt.Printf("%-40s%9s %9s %9s %9s\n", "", "min", "p01", "p10", "median")
+ }
+ for _, r := range rows {
+ s := sweep(r.rounds, r.iters, r.f)
+ if *tsv {
+ fmt.Printf("%s\t%.0f\t%.0f\t%.0f\t%.0f\n", r.label, s.min, s.p01, s.p10, s.median)
+ continue
+ }
+ fmt.Printf("%-40s%9.0f %9.0f %9.0f %9.0f ns\n", r.label, s.min, s.p01, s.p10, s.median)
+ }
+}
diff --git a/benches/go/cobra/go.mod b/benches/go/cobra/go.mod
deleted file mode 100644
index 57351288a..000000000
--- a/benches/go/cobra/go.mod
+++ /dev/null
@@ -1,15 +0,0 @@
-// A module of its own, so that cobra is not a dependency of `github.com/jdx/usage/go`.
-//
-// That module has none, deliberately: an adopter's binary carries the tables and nothing
-// else. A benchmark that put cobra in its go.mod would be measuring the thing it is
-// comparing against while claiming to have no dependencies.
-module github.com/jdx/usage/benches/go/cobra
-
-go 1.24
-
-require github.com/spf13/cobra v1.10.2
-
-require (
- github.com/inconshreveable/mousetrap v1.1.0 // indirect
- github.com/spf13/pflag v1.0.9 // indirect
-)
diff --git a/benches/go/cobra/go.sum b/benches/go/cobra/go.sum
deleted file mode 100644
index 2342cd127..000000000
--- a/benches/go/cobra/go.sum
+++ /dev/null
@@ -1,13 +0,0 @@
-github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
-github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
-github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
-github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s=
-github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0=
-github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
-github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
-github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
-github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/benches/go/go.mod b/benches/go/go.mod
new file mode 100644
index 000000000..c3a2b6da5
--- /dev/null
+++ b/benches/go/go.mod
@@ -0,0 +1,29 @@
+// One module for every mise-scale Go shadow, and the only place in the repository
+// where another CLI framework is a dependency.
+//
+// `github.com/jdx/usage/go` has none, deliberately: an adopter's binary carries the
+// tables and nothing else. A benchmark that put cobra, urfave/cli or kong in *that*
+// go.mod would be measuring the thing it is comparing against while claiming to have
+// no dependencies. So the four shadows live here, together, and the sweep that times
+// them links all four into one binary — the Go counterpart of `benches/gate`, which
+// does the same for the Rust four.
+module github.com/jdx/usage/benches/go
+
+go 1.24
+
+require (
+ github.com/alecthomas/kong v1.16.1
+ github.com/jdx/usage/go v0.0.0
+ github.com/spf13/cobra v1.10.2
+ github.com/urfave/cli/v3 v3.11.0
+)
+
+require (
+ github.com/expr-lang/expr v1.17.8 // indirect
+ github.com/inconshreveable/mousetrap v1.1.0 // indirect
+ github.com/spf13/pflag v1.0.9 // indirect
+)
+
+// The Go module is unreleased, and what is being measured is this checkout of it
+// rather than a published version.
+replace github.com/jdx/usage/go => ../../go
diff --git a/benches/go/go.sum b/benches/go/go.sum
new file mode 100644
index 000000000..f3a546124
--- /dev/null
+++ b/benches/go/go.sum
@@ -0,0 +1,30 @@
+github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
+github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
+github.com/alecthomas/kong v1.16.1 h1:ixhCt93XkJ98kGposQ54+bl0IK6XwqB40AsMynU7Z8E=
+github.com/alecthomas/kong v1.16.1/go.mod h1:wrlbXem1CWqUV5Vbmss5ISYhsVPkBb1Yo7YKJghju2I=
+github.com/alecthomas/repr v0.5.2 h1:SU73FTI9D1P5UNtvseffFSGmdNci/O6RsqzeXJtP0Qs=
+github.com/alecthomas/repr v0.5.2/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
+github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/expr-lang/expr v1.17.8 h1:W1loDTT+0PQf5YteHSTpju2qfUfNoBt4yw9+wOEU9VM=
+github.com/expr-lang/expr v1.17.8/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4=
+github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
+github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
+github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
+github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
+github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
+github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
+github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
+github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
+github.com/urfave/cli/v3 v3.11.0 h1:P/euJp99kb9p0tlVY+iYTLYYTAQlfl0hR2gUO1Img1Q=
+github.com/urfave/cli/v3 v3.11.0/go.mod h1:ysVLtOEmg2tOy6PknnYVhDoouyC/6N42TMeoMzskhso=
+go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/benches/go/cobra/main.go b/benches/go/mise-cobra/cobra.go
similarity index 99%
rename from benches/go/cobra/main.go
rename to benches/go/mise-cobra/cobra.go
index dfc321f56..f52a72817 100644
--- a/benches/go/cobra/main.go
+++ b/benches/go/mise-cobra/cobra.go
@@ -1,23 +1,12 @@
// Code generated by `xtask gen-shadow benches/mise.usage.kdl cobra`. DO NOT EDIT.
//
-// mise declared in cobra, from the same spec the usage tables are generated from, so
-// that the two rows of `go/README.md`'s table describe the same CLI. Regenerate with
-// `mise run gen-shadow` rather than editing: a hand-edit here is a difference no
-// reviewer can see, in a program whose whole job is to be comparable.
-//
-// The tree is built inside the loop on purpose. That is what cobra does on every
-// process start — a `&cobra.Command` per subcommand, each with its own flag set — and
-// it is the cost the comparison is about. Hoisting it out would measure a parser
-// against a program that had already paid for its model.
-package main
-
-import (
- "fmt"
- "os"
- "strconv"
+// mise declared in cobra, from the same spec the usage tables are generated
+// from, so that the rows of `go/README.md`'s tables describe the same CLI.
+// Regenerate with `mise run gen-shadow` rather than editing: a hand-edit here is a
+// difference no reviewer can see, in a program whose whole job is to be comparable.
+package misecobra
- "github.com/spf13/cobra"
-)
+import "github.com/spf13/cobra"
// build declares the whole CLI, as a cobra program's `init` or `main` would.
func build() *cobra.Command {
@@ -1205,25 +1194,14 @@ func build() *cobra.Command {
return root
}
-func main() {
- n := 1
- if v, err := strconv.Atoi(os.Getenv("PARSE_N")); err == nil {
- n = v
- }
-
- // Find and ParseFlags rather than Execute: the comparison is about resolving a
- // command line, and Execute would run the command as well. This is the same work
- // the usage side does — reach a command, bind its flags — and no more.
- seen := 0
- for i := 0; i < n; i++ {
- root := build()
- cmd, flags, err := root.Find(os.Args[1:])
- if err == nil {
- err = cmd.ParseFlags(flags)
- }
- if err == nil && cmd != root {
- seen = 1
- }
+// Resolve builds cobra's model of the CLI and resolves argv against it, reporting
+// whether a subcommand was reached. Both halves are the measurement: cobra has no
+// way to answer a command line without first constructing the tree.
+func Resolve(argv []string) bool {
+ root := build()
+ cmd, flags, err := root.Find(argv)
+ if err == nil {
+ err = cmd.ParseFlags(flags)
}
- fmt.Println(seen)
+ return err == nil && cmd != root
}
diff --git a/benches/go/mise-kong/kong.go b/benches/go/mise-kong/kong.go
new file mode 100644
index 000000000..401b9d00a
--- /dev/null
+++ b/benches/go/mise-kong/kong.go
@@ -0,0 +1,1705 @@
+// Code generated by `xtask gen-shadow benches/mise.usage.kdl kong`. DO NOT EDIT.
+//
+// mise declared in kong, from the same spec the usage tables are generated from,
+// so that the rows of `go/README.md`'s tables describe the same CLI. Regenerate
+// with `mise run gen-shadow` rather than editing.
+//
+// One struct per command and one tag per flag, as an author would write them.
+// `kong.New` walks all of it with reflection inside `Resolve`, because that is
+// what a kong program does on every process start.
+package misekong
+
+import (
+ "io"
+
+ "github.com/alecthomas/kong"
+)
+
+// Cli is the root command.
+type Cli struct {
+ ContinueOnError bool "name:\"continue-on-error\" short:\"c\" help:\"Continue running tasks even if one fails\" hidden:\"\""
+ Cd string "name:\"cd\" short:\"C\" help:\"Change directory before running command\""
+ Env []string "name:\"env\" short:\"E\" help:\"Set the environment for loading `mise..toml`\""
+ Force bool "name:\"force\" short:\"f\" help:\"Force the operation\" hidden:\"\""
+ Jobs string "name:\"jobs\" short:\"j\" help:\"How many jobs to run in parallel; values below 1 are treated as 1 [default: 8]\" env:\"MISE_JOBS\""
+ DryRun bool "name:\"dry-run\" short:\"n\" help:\"Dry run, don't actually do anything\" hidden:\"\""
+ Profile []string "name:\"profile\" short:\"P\" help:\"Set the profile (environment)\" hidden:\"\""
+ Quiet bool "name:\"quiet\" short:\"q\" help:\"Suppress non-error messages\""
+ Shell string "name:\"shell\" short:\"s\" hidden:\"\""
+ Tool []string "name:\"tool\" short:\"t\" help:\"Tool(s) to run in addition to what is in mise.toml files e.g.: node@20 python@3.10\" hidden:\"\" env:\"MISE_QUIET\""
+ Verbose int "name:\"verbose\" short:\"v\" help:\"Show extra output (use -vv for even more)\" type:\"counter\""
+ Version bool "name:\"version\" short:\"V\" hidden:\"\""
+ Yes bool "name:\"yes\" short:\"y\" help:\"Answer yes to all confirmation prompts\""
+ Debug bool "name:\"debug\" help:\"Sets log level to debug\" hidden:\"\""
+ LogLevel string "name:\"log-level\" hidden:\"\""
+ NoConfig bool "name:\"no-config\" help:\"Do not load any config files\""
+ NoEnv bool "name:\"no-env\" help:\"Do not load environment variables from config files\""
+ NoHooks bool "name:\"no-hooks\" help:\"Do not execute hooks from config files\""
+ NoTimings bool "name:\"no-timings\" aliases:\"no-timing\" help:\"Hides elapsed time after each task completes\" hidden:\"\""
+ Output string "name:\"output\""
+ Raw bool "name:\"raw\" help:\"Read/write directly to stdin/stdout/stderr instead of by line\""
+ Locked bool "name:\"locked\" help:\"Require lockfile URLs to be present during installation\""
+ Silent bool "name:\"silent\" help:\"Suppress all task output and mise non-error messages\""
+ Timings bool "name:\"timings\" aliases:\"timing\" help:\"Shows elapsed time after each task completes\" hidden:\"\""
+ Trace bool "name:\"trace\" help:\"Sets log level to trace\" hidden:\"\""
+ Activate ActivateCmd "cmd:\"\" name:\"activate\" help:\"Initializes mise in the current shell session\""
+ ToolAlias ToolAliasCmd "cmd:\"\" name:\"tool-alias\" help:\"Manage tool version aliases.\" aliases:\"alias,aliases\""
+ Asdf AsdfCmd "cmd:\"\" name:\"asdf\" help:\"[internal] simulates asdf for plugins that call \\\"asdf\\\" internally\" hidden:\"\""
+ Backends BackendsCmd "cmd:\"\" name:\"backends\" help:\"Manage backends\" aliases:\"b,backend,backend-list\""
+ BinPaths BinPathsCmd "cmd:\"\" name:\"bin-paths\" help:\"List all the active runtime bin paths\""
+ Bootstrap BootstrapCmd "cmd:\"\" name:\"bootstrap\" help:\"Set up a machine for the current config in one command\" aliases:\"bs\""
+ Cache CacheCmd "cmd:\"\" name:\"cache\" help:\"Manage the mise cache\""
+ Completion CompletionCmd "cmd:\"\" name:\"completion\" help:\"Generate shell completions\" aliases:\"complete,completions\""
+ Config ConfigCmd "cmd:\"\" name:\"config\" help:\"Manage config files\" aliases:\"cfg,toml\""
+ Current CurrentCmd "cmd:\"\" name:\"current\" help:\"Shows current active and installed runtime versions\" hidden:\"\""
+ Deactivate DeactivateCmd "cmd:\"\" name:\"deactivate\" help:\"Disable mise for current shell session\""
+ Direnv DirenvCmd "cmd:\"\" name:\"direnv\" help:\"Output direnv function to use mise inside direnv\" hidden:\"\""
+ Dotfiles DotfilesCmd "cmd:\"\" name:\"dotfiles\" help:\"Manage dotfiles from `[dotfiles]` (deprecated)\" hidden:\"\""
+ Doctor DoctorCmd "cmd:\"\" name:\"doctor\" help:\"Check mise installation for possible problems\" aliases:\"dr\""
+ En EnCmd "cmd:\"\" name:\"en\" help:\"Starts a new shell with the mise environment built from the current configuration\""
+ Env2 EnvCmd "cmd:\"\" name:\"env\" help:\"Exports env vars to activate mise a single time\" aliases:\"e\""
+ Exec ExecCmd "cmd:\"\" name:\"exec\" help:\"Execute a command with tool(s) set\" aliases:\"x\""
+ Fmt FmtCmd "cmd:\"\" name:\"fmt\" help:\"Formats mise.toml\""
+ Generate GenerateCmd "cmd:\"\" name:\"generate\" help:\"Generate files for various tools/services\" aliases:\"gen,g\""
+ Github GithubCmd "cmd:\"\" name:\"github\" help:\"GitHub related commands\" hidden:\"\""
+ Global GlobalCmd "cmd:\"\" name:\"global\" help:\"Sets/gets the global tool version(s)\" hidden:\"\""
+ HookEnv HookEnvCmd "cmd:\"\" name:\"hook-env\" help:\"[internal] called by activate hook to update env vars directory change\" hidden:\"\""
+ HookNotFound HookNotFoundCmd "cmd:\"\" name:\"hook-not-found\" help:\"[internal] called by shell when a command is not found\" hidden:\"\""
+ Implode ImplodeCmd "cmd:\"\" name:\"implode\" help:\"Removes mise CLI and all related data\""
+ Edit EditCmd "cmd:\"\" name:\"edit\" help:\"Edit mise.toml interactively\""
+ Install InstallCmd "cmd:\"\" name:\"install\" help:\"Install a tool version\" aliases:\"i\""
+ InstallInto InstallIntoCmd "cmd:\"\" name:\"install-into\" help:\"Install a tool version to a specific path\""
+ Latest LatestCmd "cmd:\"\" name:\"latest\" help:\"Gets the latest available version for a plugin\""
+ Link LinkCmd "cmd:\"\" name:\"link\" help:\"Symlinks a tool version into mise\" aliases:\"ln\""
+ Local LocalCmd "cmd:\"\" name:\"local\" help:\"Sets/gets tool version in local .tool-versions or mise.toml\" aliases:\"l\" hidden:\"\""
+ Lock LockCmd "cmd:\"\" name:\"lock\" help:\"Update lockfile checksums and URLs for all specified platforms\""
+ Ls LsCmd "cmd:\"\" name:\"ls\" help:\"List installed and active tool versions\" aliases:\"list\""
+ LsRemote LsRemoteCmd "cmd:\"\" name:\"ls-remote\" help:\"List runtime versions available for install.\" aliases:\"list-all,list-remote\""
+ Mcp McpCmd "cmd:\"\" name:\"mcp\" help:\"Run Model Context Protocol (MCP) server\""
+ Oci OciCmd "cmd:\"\" name:\"oci\" help:\"[experimental] Build OCI container images from a mise.toml\""
+ Outdated OutdatedCmd "cmd:\"\" name:\"outdated\" help:\"Shows outdated tool versions\""
+ Patrons PatronsCmd "cmd:\"\" name:\"patrons\" help:\"Show the individuals supporting mise as Patron-tier members\""
+ Plugins PluginsCmd "cmd:\"\" name:\"plugins\" help:\"Manage plugins\" aliases:\"p,plugin,plugin-list\""
+ Deps DepsCmd "cmd:\"\" name:\"deps\" help:\"[experimental] Manage project dependencies\" aliases:\"dep,prepare\""
+ Prune PruneCmd "cmd:\"\" name:\"prune\" help:\"Delete unused versions of tools\""
+ Registry RegistryCmd "cmd:\"\" name:\"registry\" help:\"List available tools to install\""
+ RenderHelp RenderHelpCmd "cmd:\"\" name:\"render-help\" help:\"internal command to generate markdown from help\" hidden:\"\""
+ Reshim ReshimCmd "cmd:\"\" name:\"reshim\" help:\"Creates new shims based on bin paths from currently installed tools.\""
+ Run RunCmd "cmd:\"\" name:\"run\" help:\"Run task(s)\" aliases:\"r\""
+ Search SearchCmd "cmd:\"\" name:\"search\" help:\"Search for tools in the registry\""
+ SelfUpdate SelfUpdateCmd "cmd:\"\" name:\"self-update\" help:\"Updates mise itself.\""
+ Set SetCmd "cmd:\"\" name:\"set\" help:\"Set environment variables in mise.toml\" aliases:\"ev,env-vars\""
+ Settings SettingsCmd "cmd:\"\" name:\"settings\" help:\"Manage settings\""
+ Shell2 ShellCmd "cmd:\"\" name:\"shell\" help:\"Sets a tool version for the current session.\" aliases:\"sh\""
+ ShellAlias ShellAliasCmd "cmd:\"\" name:\"shell-alias\" help:\"Manage shell aliases.\""
+ Sponsors SponsorsCmd "cmd:\"\" name:\"sponsors\" help:\"Show the companies sponsoring mise and the jdx.dev open source tools\""
+ Sync SyncCmd "cmd:\"\" name:\"sync\" help:\"Synchronize tools from other version managers with mise\""
+ Tasks TasksCmd "cmd:\"\" name:\"tasks\" help:\"Manage tasks\" aliases:\"t,task\""
+ TestTool TestToolCmd "cmd:\"\" name:\"test-tool\" help:\"Test a tool installs and executes\""
+ Token TokenCmd "cmd:\"\" name:\"token\" help:\"Display git provider tokens mise will use\""
+ Tool2 ToolCmd "cmd:\"\" name:\"tool\" help:\"Gets information about a tool\""
+ ToolStub ToolStubCmd "cmd:\"\" name:\"tool-stub\" help:\"Execute a tool stub\""
+ Trust TrustCmd "cmd:\"\" name:\"trust\" help:\"Marks a config file as trusted\""
+ Uninstall UninstallCmd "cmd:\"\" name:\"uninstall\" help:\"Removes installed tool versions\""
+ Unset UnsetCmd "cmd:\"\" name:\"unset\" help:\"Remove environment variable(s) from the config file.\""
+ Untrust UntrustCmd "cmd:\"\" name:\"untrust\" help:\"Remove explicit trust for a config\""
+ Unuse UnuseCmd "cmd:\"\" name:\"unuse\" help:\"Removes installed tool versions from mise.toml\" aliases:\"rm,remove\""
+ Upgrade UpgradeCmd "cmd:\"\" name:\"upgrade\" help:\"Upgrades outdated tools\" aliases:\"up\""
+ Usage UsageCmd "cmd:\"\" name:\"usage\" help:\"Generate a usage CLI spec\" hidden:\"\""
+ Use UseCmd "cmd:\"\" name:\"use\" help:\"Installs a tool and adds the version to mise.toml.\" aliases:\"u\""
+ Version2 VersionCmd "cmd:\"\" name:\"version\" help:\"Display the version of mise\" aliases:\"v\""
+ Watch WatchCmd "cmd:\"\" name:\"watch\" help:\"Run task(s) and watch for changes to rerun it\" aliases:\"w\""
+ Where WhereCmd "cmd:\"\" name:\"where\" help:\"Display the installation path for a tool\""
+ Which WhichCmd "cmd:\"\" name:\"which\" help:\"Shows the path that a tool's bin points to.\""
+}
+
+// ActivateCmd is `activate`: Initializes mise in the current shell session
+type ActivateCmd struct {
+ NoHookEnv bool "name:\"no-hook-env\" help:\"Do not automatically call hook-env\""
+ Shims bool "name:\"shims\" help:\"Use shims instead of modifying PATH Effectively the same as:\""
+ Status bool "name:\"status\" help:\"Show \\\"mise: @\\\" message when changing directories\" hidden:\"\""
+ SHELLTYPE string "arg:\"\" name:\"SHELL_TYPE\" optional:\"\" help:\"Shell type to generate the script for\""
+}
+
+// ToolAliasCmd is `tool-alias`: Manage tool version aliases.
+type ToolAliasCmd struct {
+ NoHeader bool "name:\"no-header\" help:\"Don't show table header\""
+ Get ToolAliasGetCmd "cmd:\"\" name:\"get\" help:\"Show an alias for a tool\""
+ Ls ToolAliasLsCmd "cmd:\"\" name:\"ls\" help:\"List tool version aliases Shows the aliases that can be specified. These can come from user config or from plugins in `bin/list-aliases`.\" aliases:\"list\""
+ Set ToolAliasSetCmd "cmd:\"\" name:\"set\" help:\"Add/update an alias for a tool/backend\" aliases:\"add,create\""
+ Unset ToolAliasUnsetCmd "cmd:\"\" name:\"unset\" help:\"Clears an alias for a tool/backend\" aliases:\"rm,remove,delete,del\""
+}
+
+// ToolAliasGetCmd is `tool-alias get`: Show an alias for a tool
+type ToolAliasGetCmd struct {
+ TOOL string "arg:\"\" name:\"TOOL\" help:\"The tool to show the alias for\""
+ ALIAS string "arg:\"\" name:\"ALIAS\" help:\"The alias to show\""
+}
+
+// ToolAliasLsCmd is `tool-alias ls`: List tool version aliases
+type ToolAliasLsCmd struct {
+ TOOL string "arg:\"\" name:\"TOOL\" optional:\"\" help:\"Show aliases for \""
+}
+
+// ToolAliasSetCmd is `tool-alias set`: Add/update an alias for a tool/backend
+type ToolAliasSetCmd struct {
+ TOOL string "arg:\"\" name:\"TOOL\" help:\"The tool/backend to set the alias for\""
+ ALIAS string "arg:\"\" name:\"ALIAS\" help:\"The alias to set\""
+ VALUE string "arg:\"\" name:\"VALUE\" optional:\"\" help:\"The value to set the alias to\""
+}
+
+// ToolAliasUnsetCmd is `tool-alias unset`: Clears an alias for a tool/backend
+type ToolAliasUnsetCmd struct {
+ TOOL string "arg:\"\" name:\"TOOL\" help:\"The tool/backend to remove the alias from\""
+ ALIAS string "arg:\"\" name:\"ALIAS\" optional:\"\" help:\"The alias to remove\""
+}
+
+// AsdfCmd is `asdf`: [internal] simulates asdf for plugins that call "asdf" internally
+type AsdfCmd struct {
+ ARGS []string "arg:\"\" name:\"ARGS\" optional:\"\" help:\"all arguments\""
+}
+
+// BackendsCmd is `backends`: Manage backends
+type BackendsCmd struct {
+ Ls BackendsLsCmd "cmd:\"\" name:\"ls\" help:\"List built-in backends\" aliases:\"list\""
+}
+
+// BackendsLsCmd is `backends ls`: List built-in backends
+type BackendsLsCmd struct {
+}
+
+// BinPathsCmd is `bin-paths`: List all the active runtime bin paths
+type BinPathsCmd struct {
+ BinNames bool "name:\"bin-names\" help:\"Output executable names instead of bin directories\""
+ Json bool "name:\"json\" short:\"J\" help:\"Output executable entries in JSON format (implies --bin-names)\""
+ TOOLVERSION []string "arg:\"\" name:\"TOOL@VERSION\" optional:\"\" help:\"Tool(s) to look up e.g.: ruby@3\""
+}
+
+// BootstrapCmd is `bootstrap`: Set up a machine for the current config in one command
+type BootstrapCmd struct {
+ ForceDotfiles bool "name:\"force-dotfiles\" help:\"Overwrite existing files that conflict with whole-file dotfile entries\""
+ Only []string "name:\"only\" help:\"Run only one or more bootstrap parts\""
+ PromptSecrets bool "name:\"prompt-secrets\" help:\"Prompt securely for missing bootstrap secret inputs\""
+ Skip []string "name:\"skip\" help:\"Skip one or more bootstrap parts\""
+ Update bool "name:\"update\" help:\"Refresh package manager metadata and update configured repos\""
+ ApplyAccountPlan BootstrapApplyAccountPlanCmd "cmd:\"\" name:\"__apply-account-plan\" hidden:\"\""
+ ApplyServicePlan BootstrapApplyServicePlanCmd "cmd:\"\" name:\"__apply-service-plan\" hidden:\"\""
+ ApplyFirewallPlan BootstrapApplyFirewallPlanCmd "cmd:\"\" name:\"__apply-firewall-plan\" hidden:\"\""
+ ApplySystemPlan BootstrapApplySystemPlanCmd "cmd:\"\" name:\"__apply-system-plan\" hidden:\"\""
+ InspectSystemFiles BootstrapInspectSystemFilesCmd "cmd:\"\" name:\"__inspect-system-files\" hidden:\"\""
+ InspectFirewallPlan BootstrapInspectFirewallPlanCmd "cmd:\"\" name:\"__inspect-firewall-plan\" hidden:\"\""
+ Accounts BootstrapAccountsCmd "cmd:\"\" name:\"accounts\" help:\"Manage Linux users and groups from `[bootstrap.users]` and `[bootstrap.groups]`\""
+ Compose BootstrapComposeCmd "cmd:\"\" name:\"compose\" help:\"Manage Docker Compose projects from `[bootstrap.compose]`\""
+ Dotfiles BootstrapDotfilesCmd "cmd:\"\" name:\"dotfiles\" help:\"Manage dotfiles from `[dotfiles]`\""
+ Files BootstrapFilesCmd "cmd:\"\" name:\"files\" help:\"Manage privileged files and directories from `[bootstrap.files]` and `[bootstrap.directories]`\""
+ Firewall BootstrapFirewallCmd "cmd:\"\" name:\"firewall\" help:\"Manage the Linux host firewall from `[bootstrap.linux.firewall]`\""
+ Launchd BootstrapLaunchdCmd "cmd:\"\" name:\"launchd\" help:\"Manage macOS LaunchAgents from `[bootstrap.macos.launchd.agents]`\" hidden:\"\""
+ Linux BootstrapLinuxCmd "cmd:\"\" name:\"linux\" help:\"Manage Linux bootstrap config from `[bootstrap.linux]`\""
+ Macos BootstrapMacosCmd "cmd:\"\" name:\"macos\" help:\"Manage macOS bootstrap config from `[bootstrap.macos]`\""
+ MacosDefaults BootstrapMacosDefaultsCmd2 "cmd:\"\" name:\"macos-defaults\" help:\"Manage macOS defaults from `[bootstrap.macos.defaults]`\" hidden:\"\""
+ MiseShellActivate BootstrapMiseShellActivateCmd "cmd:\"\" name:\"mise-shell-activate\" help:\"Manage mise shell activation from `[bootstrap.mise_shell_activate]`\" aliases:\"shell\""
+ Packages BootstrapPackagesCmd "cmd:\"\" name:\"packages\" help:\"Manage bootstrap system packages from `[bootstrap.packages]`\""
+ Plan BootstrapPlanCmd "cmd:\"\" name:\"plan\" help:\"Show the changes declarative bootstrap resources would make\""
+ Plugins BootstrapPluginsCmd "cmd:\"\" name:\"plugins\" help:\"Manage package manager plugins declared in `[bootstrap.plugins]`\""
+ Remote BootstrapRemoteCmd "cmd:\"\" name:\"remote\" help:\"Bootstrap one or more machines over OpenSSH\""
+ Repos BootstrapReposCmd "cmd:\"\" name:\"repos\" help:\"Manage git repo checkouts from `[bootstrap.repos]`\""
+ Secrets BootstrapSecretsCmd "cmd:\"\" name:\"secrets\" help:\"Inspect bootstrap secret inputs without revealing their values\""
+ Services BootstrapServicesCmd "cmd:\"\" name:\"services\" help:\"Manage Linux system services from `[bootstrap.services]`\""
+ Status BootstrapStatusCmd "cmd:\"\" name:\"status\" help:\"Show the aggregate bootstrap status\" aliases:\"ls\""
+ Systemd BootstrapSystemdCmd "cmd:\"\" name:\"systemd\" help:\"Manage systemd user services from `[bootstrap.linux.systemd.units]`\" hidden:\"\""
+ User BootstrapUserCmd "cmd:\"\" name:\"user\" help:\"Manage current-user bootstrap settings from `[bootstrap.user]`\""
+}
+
+// BootstrapApplyAccountPlanCmd is `bootstrap __apply-account-plan`.
+type BootstrapApplyAccountPlanCmd struct {
+}
+
+// BootstrapApplyServicePlanCmd is `bootstrap __apply-service-plan`.
+type BootstrapApplyServicePlanCmd struct {
+}
+
+// BootstrapApplyFirewallPlanCmd is `bootstrap __apply-firewall-plan`.
+type BootstrapApplyFirewallPlanCmd struct {
+}
+
+// BootstrapApplySystemPlanCmd is `bootstrap __apply-system-plan`.
+type BootstrapApplySystemPlanCmd struct {
+}
+
+// BootstrapInspectSystemFilesCmd is `bootstrap __inspect-system-files`.
+type BootstrapInspectSystemFilesCmd struct {
+}
+
+// BootstrapInspectFirewallPlanCmd is `bootstrap __inspect-firewall-plan`.
+type BootstrapInspectFirewallPlanCmd struct {
+}
+
+// BootstrapAccountsCmd is `bootstrap accounts`: Manage Linux users and groups from `[bootstrap.users]` and `[bootstrap.groups]`
+type BootstrapAccountsCmd struct {
+ Apply BootstrapAccountsApplyCmd "cmd:\"\" name:\"apply\" help:\"Apply configured Linux users and groups\""
+ Status BootstrapAccountsStatusCmd "cmd:\"\" name:\"status\" help:\"Show configured Linux user and group state\""
+}
+
+// BootstrapAccountsApplyCmd is `bootstrap accounts apply`: Apply configured Linux users and groups
+type BootstrapAccountsApplyCmd struct {
+}
+
+// BootstrapAccountsStatusCmd is `bootstrap accounts status`: Show configured Linux user and group state
+type BootstrapAccountsStatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 when any account is not converged\""
+}
+
+// BootstrapComposeCmd is `bootstrap compose`: Manage Docker Compose projects from `[bootstrap.compose]`
+type BootstrapComposeCmd struct {
+ Apply BootstrapComposeApplyCmd "cmd:\"\" name:\"apply\" help:\"Apply configured Docker Compose project state\""
+ Status BootstrapComposeStatusCmd "cmd:\"\" name:\"status\" help:\"Show configured Docker Compose project state\""
+}
+
+// BootstrapComposeApplyCmd is `bootstrap compose apply`: Apply configured Docker Compose project state
+type BootstrapComposeApplyCmd struct {
+}
+
+// BootstrapComposeStatusCmd is `bootstrap compose status`: Show configured Docker Compose project state
+type BootstrapComposeStatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 when any Compose project is not converged\""
+}
+
+// BootstrapDotfilesCmd is `bootstrap dotfiles`: Manage dotfiles from `[dotfiles]`
+type BootstrapDotfilesCmd struct {
+ Add BootstrapDotfilesAddCmd "cmd:\"\" name:\"add\" help:\"Add or update dotfiles in `[dotfiles]`\""
+ Apply BootstrapDotfilesApplyCmd "cmd:\"\" name:\"apply\" help:\"Apply dotfiles from `[dotfiles]`\""
+ Edit BootstrapDotfilesEditCmd "cmd:\"\" name:\"edit\" help:\"Edit a managed dotfile source\""
+ Status BootstrapDotfilesStatusCmd "cmd:\"\" name:\"status\" help:\"Show the status of dotfiles from `[dotfiles]`\""
+ Unapply BootstrapDotfilesUnapplyCmd "cmd:\"\" name:\"unapply\" help:\"Remove dotfiles applied from `[dotfiles]`\""
+}
+
+// BootstrapDotfilesAddCmd is `bootstrap dotfiles add`: Add or update dotfiles in `[dotfiles]`
+type BootstrapDotfilesAddCmd struct {
+ Global bool "name:\"global\" short:\"g\" help:\"Write to the global config\""
+ Local bool "name:\"local\" short:\"l\" help:\"Write to the local config instead of the global config\""
+ Mode string "name:\"mode\" short:\"m\" help:\"Dotfile mode to write\""
+ NoApply bool "name:\"no-apply\" help:\"Add the entry without applying it\""
+ Path string "name:\"path\" short:\"p\" help:\"Write to this config file or directory\""
+ Source string "name:\"source\" help:\"Source path to use for a single target\""
+ TARGET []string "arg:\"\" name:\"TARGET\" help:\"Targets to add or update\""
+}
+
+// BootstrapDotfilesApplyCmd is `bootstrap dotfiles apply`: Apply dotfiles from `[dotfiles]`
+type BootstrapDotfilesApplyCmd struct {
+ TARGET []string "arg:\"\" name:\"TARGET\" optional:\"\" help:\"Only apply these targets\""
+}
+
+// BootstrapDotfilesEditCmd is `bootstrap dotfiles edit`: Edit a managed dotfile source
+type BootstrapDotfilesEditCmd struct {
+ Apply bool "name:\"apply\" help:\"Apply this target after the editor exits\""
+ Mode string "name:\"mode\" short:\"m\" help:\"Dotfile mode to use if the target is not yet managed\""
+ Source string "name:\"source\" help:\"Source path to use if the target is not yet managed\""
+ TARGET string "arg:\"\" name:\"TARGET\" help:\"Target to edit\""
+}
+
+// BootstrapDotfilesStatusCmd is `bootstrap dotfiles status`: Show the status of dotfiles from `[dotfiles]`
+type BootstrapDotfilesStatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 if any configured dotfiles are not in their desired state (missing, source missing, differs)\""
+ TARGET []string "arg:\"\" name:\"TARGET\" optional:\"\" help:\"Only show these targets\""
+}
+
+// BootstrapDotfilesUnapplyCmd is `bootstrap dotfiles unapply`: Remove dotfiles applied from `[dotfiles]`
+type BootstrapDotfilesUnapplyCmd struct {
+ TARGET []string "arg:\"\" name:\"TARGET\" optional:\"\" help:\"Only unapply these targets\""
+}
+
+// BootstrapFilesCmd is `bootstrap files`: Manage privileged files and directories from `[bootstrap.files]` and `[bootstrap.directories]`
+type BootstrapFilesCmd struct {
+ Apply BootstrapFilesApplyCmd "cmd:\"\" name:\"apply\" help:\"Apply configured privileged files and directories\""
+ Status BootstrapFilesStatusCmd "cmd:\"\" name:\"status\" help:\"Show configured privileged file and directory state\""
+}
+
+// BootstrapFilesApplyCmd is `bootstrap files apply`: Apply configured privileged files and directories
+type BootstrapFilesApplyCmd struct {
+}
+
+// BootstrapFilesStatusCmd is `bootstrap files status`: Show configured privileged file and directory state
+type BootstrapFilesStatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 when any resource is not converged\""
+}
+
+// BootstrapFirewallCmd is `bootstrap firewall`: Manage the Linux host firewall from `[bootstrap.linux.firewall]`
+type BootstrapFirewallCmd struct {
+ Apply BootstrapFirewallApplyCmd "cmd:\"\" name:\"apply\" help:\"Apply the configured Linux host firewall\""
+ Status BootstrapFirewallStatusCmd "cmd:\"\" name:\"status\" help:\"Show configured Linux host firewall state\""
+}
+
+// BootstrapFirewallApplyCmd is `bootstrap firewall apply`: Apply the configured Linux host firewall
+type BootstrapFirewallApplyCmd struct {
+}
+
+// BootstrapFirewallStatusCmd is `bootstrap firewall status`: Show configured Linux host firewall state
+type BootstrapFirewallStatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 when the firewall is not converged\""
+}
+
+// BootstrapLaunchdCmd is `bootstrap launchd`: Manage macOS LaunchAgents from `[bootstrap.macos.launchd.agents]`
+type BootstrapLaunchdCmd struct {
+ Apply BootstrapLaunchdApplyCmd "cmd:\"\" name:\"apply\""
+ Status BootstrapLaunchdStatusCmd "cmd:\"\" name:\"status\""
+}
+
+// BootstrapLaunchdApplyCmd is `bootstrap launchd apply`.
+type BootstrapLaunchdApplyCmd struct {
+}
+
+// BootstrapLaunchdStatusCmd is `bootstrap launchd status`.
+type BootstrapLaunchdStatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 if any configured LaunchAgent is not in its desired state\""
+}
+
+// BootstrapLinuxCmd is `bootstrap linux`: Manage Linux bootstrap config from `[bootstrap.linux]`
+type BootstrapLinuxCmd struct {
+ SystemdUnits BootstrapLinuxSystemdUnitsCmd "cmd:\"\" name:\"systemd-units\" help:\"Manage systemd user services from `[bootstrap.linux.systemd.units]`\" aliases:\"systemd\""
+}
+
+// BootstrapLinuxSystemdUnitsCmd is `bootstrap linux systemd-units`: Manage systemd user services from `[bootstrap.linux.systemd.units]`
+type BootstrapLinuxSystemdUnitsCmd struct {
+ Apply BootstrapLinuxSystemdUnitsApplyCmd "cmd:\"\" name:\"apply\""
+ Status BootstrapLinuxSystemdUnitsStatusCmd "cmd:\"\" name:\"status\""
+}
+
+// BootstrapLinuxSystemdUnitsApplyCmd is `bootstrap linux systemd-units apply`.
+type BootstrapLinuxSystemdUnitsApplyCmd struct {
+}
+
+// BootstrapLinuxSystemdUnitsStatusCmd is `bootstrap linux systemd-units status`.
+type BootstrapLinuxSystemdUnitsStatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 if any configured systemd user service is not in its desired state\""
+}
+
+// BootstrapMacosCmd is `bootstrap macos`: Manage macOS bootstrap config from `[bootstrap.macos]`
+type BootstrapMacosCmd struct {
+ Defaults BootstrapMacosDefaultsCmd "cmd:\"\" name:\"defaults\" help:\"Manage macOS defaults from `[bootstrap.macos.defaults]`\""
+ LaunchdAgents BootstrapMacosLaunchdAgentsCmd "cmd:\"\" name:\"launchd-agents\" help:\"Manage macOS LaunchAgents from `[bootstrap.macos.launchd.agents]`\" aliases:\"launchd\""
+}
+
+// BootstrapMacosDefaultsCmd is `bootstrap macos defaults`: Manage macOS defaults from `[bootstrap.macos.defaults]`
+type BootstrapMacosDefaultsCmd struct {
+ Apply BootstrapMacosDefaultsApplyCmd "cmd:\"\" name:\"apply\""
+ Status BootstrapMacosDefaultsStatusCmd "cmd:\"\" name:\"status\""
+}
+
+// BootstrapMacosDefaultsApplyCmd is `bootstrap macos defaults apply`.
+type BootstrapMacosDefaultsApplyCmd struct {
+}
+
+// BootstrapMacosDefaultsStatusCmd is `bootstrap macos defaults status`.
+type BootstrapMacosDefaultsStatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 if any configured defaults are not in their desired state\""
+}
+
+// BootstrapMacosLaunchdAgentsCmd is `bootstrap macos launchd-agents`: Manage macOS LaunchAgents from `[bootstrap.macos.launchd.agents]`
+type BootstrapMacosLaunchdAgentsCmd struct {
+ Apply BootstrapMacosLaunchdAgentsApplyCmd "cmd:\"\" name:\"apply\""
+ Status BootstrapMacosLaunchdAgentsStatusCmd "cmd:\"\" name:\"status\""
+}
+
+// BootstrapMacosLaunchdAgentsApplyCmd is `bootstrap macos launchd-agents apply`.
+type BootstrapMacosLaunchdAgentsApplyCmd struct {
+}
+
+// BootstrapMacosLaunchdAgentsStatusCmd is `bootstrap macos launchd-agents status`.
+type BootstrapMacosLaunchdAgentsStatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 if any configured LaunchAgent is not in its desired state\""
+}
+
+// BootstrapMacosDefaultsCmd2 is `bootstrap macos-defaults`: Manage macOS defaults from `[bootstrap.macos.defaults]`
+type BootstrapMacosDefaultsCmd2 struct {
+ Apply BootstrapMacosDefaultsCmd2ApplyCmd "cmd:\"\" name:\"apply\""
+ Status BootstrapMacosDefaultsCmd2StatusCmd "cmd:\"\" name:\"status\""
+}
+
+// BootstrapMacosDefaultsCmd2ApplyCmd is `bootstrap macos-defaults apply`.
+type BootstrapMacosDefaultsCmd2ApplyCmd struct {
+}
+
+// BootstrapMacosDefaultsCmd2StatusCmd is `bootstrap macos-defaults status`.
+type BootstrapMacosDefaultsCmd2StatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 if any configured defaults are not in their desired state\""
+}
+
+// BootstrapMiseShellActivateCmd is `bootstrap mise-shell-activate`: Manage mise shell activation from `[bootstrap.mise_shell_activate]`
+type BootstrapMiseShellActivateCmd struct {
+ Apply BootstrapMiseShellActivateApplyCmd "cmd:\"\" name:\"apply\""
+ Status BootstrapMiseShellActivateStatusCmd "cmd:\"\" name:\"status\""
+}
+
+// BootstrapMiseShellActivateApplyCmd is `bootstrap mise-shell-activate apply`.
+type BootstrapMiseShellActivateApplyCmd struct {
+}
+
+// BootstrapMiseShellActivateStatusCmd is `bootstrap mise-shell-activate status`.
+type BootstrapMiseShellActivateStatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 if any configured shell activation is not in its desired state\""
+}
+
+// BootstrapPackagesCmd is `bootstrap packages`: Manage bootstrap system packages from `[bootstrap.packages]`
+type BootstrapPackagesCmd struct {
+ Apply BootstrapPackagesApplyCmd "cmd:\"\" name:\"apply\" help:\"Apply system packages from `[bootstrap.packages]`\" aliases:\"i,install\""
+ Brew BootstrapPackagesBrewCmd "cmd:\"\" name:\"brew\" help:\"Manage Homebrew taps used by bootstrap packages\""
+ Import BootstrapPackagesImportCmd "cmd:\"\" name:\"import\" help:\"Import installed system packages into `[bootstrap.packages]`\""
+ Prune BootstrapPackagesPruneCmd "cmd:\"\" name:\"prune\" help:\"Prune installed system packages no longer declared in `[bootstrap.packages]`\""
+ Status BootstrapPackagesStatusCmd "cmd:\"\" name:\"status\" help:\"Show the status of system packages from `[bootstrap.packages]`\" aliases:\"ls\""
+ Upgrade BootstrapPackagesUpgradeCmd "cmd:\"\" name:\"upgrade\" help:\"Upgrade installed bootstrap packages from `[bootstrap.packages]`\" aliases:\"up\""
+ Use BootstrapPackagesUseCmd "cmd:\"\" name:\"use\" help:\"Add bootstrap packages to [bootstrap.packages] and install them\" aliases:\"u\""
+}
+
+// BootstrapPackagesApplyCmd is `bootstrap packages apply`: Apply system packages from `[bootstrap.packages]`
+type BootstrapPackagesApplyCmd struct {
+ Manager string "name:\"manager\" short:\"m\" help:\"Only install packages for this built-in or plugin manager\""
+ PACKAGE []string "arg:\"\" name:\"PACKAGE\" optional:\"\" help:\"Packages in `manager:package` form; defaults to everything configured in [bootstrap.packages]\""
+}
+
+// BootstrapPackagesBrewCmd is `bootstrap packages brew`: Manage Homebrew taps used by bootstrap packages
+type BootstrapPackagesBrewCmd struct {
+ Tap BootstrapPackagesBrewTapCmd "cmd:\"\" name:\"tap\" help:\"Add a Homebrew tap URL to [bootstrap.brew.taps]\""
+ Untap BootstrapPackagesBrewUntapCmd "cmd:\"\" name:\"untap\" help:\"Remove Homebrew tap URLs from [bootstrap.brew.taps]\" aliases:\"remove,rm\""
+}
+
+// BootstrapPackagesBrewTapCmd is `bootstrap packages brew tap`: Add a Homebrew tap URL to [bootstrap.brew.taps]
+type BootstrapPackagesBrewTapCmd struct {
+ Local bool "name:\"local\" short:\"l\" help:\"Write to the local config instead of the global config\""
+ Path string "name:\"path\" short:\"p\" aliases:\"file\" help:\"Write to this config file or directory\""
+ TAP string "arg:\"\" name:\"TAP\" help:\"Tap name, e.g. `owner/repo`\""
+ URL string "arg:\"\" name:\"URL\" optional:\"\" help:\"GitHub URL for the tap. Defaults to https://github.com//homebrew-.git\""
+}
+
+// BootstrapPackagesBrewUntapCmd is `bootstrap packages brew untap`: Remove Homebrew tap URLs from [bootstrap.brew.taps]
+type BootstrapPackagesBrewUntapCmd struct {
+ Local bool "name:\"local\" short:\"l\" help:\"Write to the local config instead of the global config\""
+ Path string "name:\"path\" short:\"p\" aliases:\"file\" help:\"Write to this config file or directory\""
+ TAPS []string "arg:\"\" name:\"TAPS\" help:\"Tap name(s), e.g. `owner/repo`\""
+}
+
+// BootstrapPackagesImportCmd is `bootstrap packages import`: Import installed system packages into `[bootstrap.packages]`
+type BootstrapPackagesImportCmd struct {
+ Global bool "name:\"global\" short:\"g\" help:\"Write to the global config (~/.config/mise/config.toml)\""
+ Manager string "name:\"manager\" short:\"m\" help:\"Only import packages for this manager. Currently only `brew` is supported.\" default:\"brew\""
+ All bool "name:\"all\" help:\"Import every linked formula, including dependencies\""
+ Path string "name:\"path\" short:\"p\" aliases:\"file\" help:\"Write to this config file or directory\""
+}
+
+// BootstrapPackagesPruneCmd is `bootstrap packages prune`: Prune installed system packages no longer declared in `[bootstrap.packages]`
+type BootstrapPackagesPruneCmd struct {
+ Manager string "name:\"manager\" short:\"m\" help:\"Only prune packages for this manager\" default:\"brew\""
+}
+
+// BootstrapPackagesStatusCmd is `bootstrap packages status`: Show the status of system packages from `[bootstrap.packages]`
+type BootstrapPackagesStatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 if any configured packages are not in their desired state\""
+}
+
+// BootstrapPackagesUpgradeCmd is `bootstrap packages upgrade`: Upgrade installed bootstrap packages from `[bootstrap.packages]`
+type BootstrapPackagesUpgradeCmd struct {
+ Manager string "name:\"manager\" short:\"m\" help:\"Only upgrade packages for this built-in or plugin manager\""
+ PACKAGE []string "arg:\"\" name:\"PACKAGE\" optional:\"\" help:\"Packages in `manager:package` form; defaults to everything configured in [bootstrap.packages]\""
+}
+
+// BootstrapPackagesUseCmd is `bootstrap packages use`: Add bootstrap packages to [bootstrap.packages] and install them
+type BootstrapPackagesUseCmd struct {
+ Global bool "name:\"global\" short:\"g\" help:\"Write to the global config (~/.config/mise/config.toml) instead of the local one\""
+ Path string "name:\"path\" short:\"p\" aliases:\"file\" help:\"Write to this config file or directory\""
+ PACKAGE []string "arg:\"\" name:\"PACKAGE\" help:\"Packages in `manager:package[@version]` form\""
+}
+
+// BootstrapPlanCmd is `bootstrap plan`: Show the changes declarative bootstrap resources would make
+type BootstrapPlanCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output a stable machine-readable plan in JSON format\""
+ DetailedExitcode bool "name:\"detailed-exitcode\" help:\"Exit 2 when the plan contains changes, 0 when unchanged, and 1 on errors\""
+}
+
+// BootstrapPluginsCmd is `bootstrap plugins`: Manage package manager plugins declared in `[bootstrap.plugins]`
+type BootstrapPluginsCmd struct {
+ Apply BootstrapPluginsApplyCmd "cmd:\"\" name:\"apply\""
+ Status BootstrapPluginsStatusCmd "cmd:\"\" name:\"status\""
+}
+
+// BootstrapPluginsApplyCmd is `bootstrap plugins apply`.
+type BootstrapPluginsApplyCmd struct {
+}
+
+// BootstrapPluginsStatusCmd is `bootstrap plugins status`.
+type BootstrapPluginsStatusCmd struct {
+ Missing bool "name:\"missing\" help:\"Exit with code 1 if a declared plugin is missing\""
+}
+
+// BootstrapRemoteCmd is `bootstrap remote`: Bootstrap one or more machines over OpenSSH
+type BootstrapRemoteCmd struct {
+ All bool "name:\"all\" help:\"Select every configured inventory host\""
+ BootstrapCommand string "name:\"bootstrap-command\" help:\"Explicit remote shell command that installs mise and places it on PATH\""
+ ConnectTimeout string "name:\"connect-timeout\" help:\"SSH connection timeout in seconds\" default:\"10\""
+ CopyLink []string "name:\"copy-link\" help:\"Dereference one source-relative symbolic link; repeat for multiple links\""
+ CopyLinks bool "name:\"copy-links\" help:\"Dereference every symbolic link in the source archive\""
+ Exclude []string "name:\"exclude\" help:\"Additional archive pattern to exclude; repeat for multiple patterns\""
+ FailFast bool "name:\"fail-fast\" help:\"Stop after the first failed target\""
+ Host []string "name:\"host\" help:\"Ad-hoc SSH destination (`[user@]host`); repeat for multiple hosts\""
+ IdentityFile string "name:\"identity-file\" short:\"i\" help:\"SSH identity file override\""
+ KeepStaging bool "name:\"keep-staging\" help:\"Keep the remote staging directory for debugging\""
+ MiseBin string "name:\"mise-bin\" help:\"Local mise binary to upload (escape hatch for custom architectures)\""
+ Port string "name:\"port\" help:\"SSH port override\""
+ RemoteEnv []string "name:\"remote-env\" help:\"Config environments to load on the remote host; repeat or delimit with commas (for example, ci,dotfiles)\""
+ RemoteMise string "name:\"remote-mise\" help:\"Existing mise executable name or path; relative paths use the staged project\""
+ Source string "name:\"source\" help:\"Local directory archived and sent to each target\""
+ SshOption []string "name:\"ssh-option\" help:\"OpenSSH `-o` option; repeat for multiple options\""
+ Tag []string "name:\"tag\" help:\"Select configured hosts with this tag; repeat to match any tag\""
+ TARGET []string "arg:\"\" name:\"TARGET\" optional:\"\" help:\"Inventory host names from `[bootstrap.remote.hosts]`\""
+}
+
+// BootstrapReposCmd is `bootstrap repos`: Manage git repo checkouts from `[bootstrap.repos]`
+type BootstrapReposCmd struct {
+ Apply BootstrapReposApplyCmd "cmd:\"\" name:\"apply\""
+ Exec BootstrapReposExecCmd "cmd:\"\" name:\"exec\""
+ Status BootstrapReposStatusCmd "cmd:\"\" name:\"status\""
+ Update BootstrapReposUpdateCmd "cmd:\"\" name:\"update\""
+}
+
+// BootstrapReposApplyCmd is `bootstrap repos apply`.
+type BootstrapReposApplyCmd struct {
+}
+
+// BootstrapReposExecCmd is `bootstrap repos exec`.
+type BootstrapReposExecCmd struct {
+ PATH []string "arg:\"\" name:\"PATH\" optional:\"\" help:\"Run only in matching configured or expanded paths\""
+}
+
+// BootstrapReposStatusCmd is `bootstrap repos status`.
+type BootstrapReposStatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 if any configured repo is not in its desired state\""
+}
+
+// BootstrapReposUpdateCmd is `bootstrap repos update`.
+type BootstrapReposUpdateCmd struct {
+ PATH []string "arg:\"\" name:\"PATH\" optional:\"\" help:\"Update only matching configured or expanded paths\""
+}
+
+// BootstrapSecretsCmd is `bootstrap secrets`: Inspect bootstrap secret inputs without revealing their values
+type BootstrapSecretsCmd struct {
+ Status BootstrapSecretsStatusCmd "cmd:\"\" name:\"status\" help:\"Show whether declared bootstrap secret inputs are available\""
+}
+
+// BootstrapSecretsStatusCmd is `bootstrap secrets status`: Show whether declared bootstrap secret inputs are available
+type BootstrapSecretsStatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 if a declared secret input is unavailable\""
+}
+
+// BootstrapServicesCmd is `bootstrap services`: Manage Linux system services from `[bootstrap.services]`
+type BootstrapServicesCmd struct {
+ Apply BootstrapServicesApplyCmd "cmd:\"\" name:\"apply\" help:\"Apply configured Linux system service state\""
+ Status BootstrapServicesStatusCmd "cmd:\"\" name:\"status\" help:\"Show configured Linux system service state\""
+}
+
+// BootstrapServicesApplyCmd is `bootstrap services apply`: Apply configured Linux system service state
+type BootstrapServicesApplyCmd struct {
+}
+
+// BootstrapServicesStatusCmd is `bootstrap services status`: Show configured Linux system service state
+type BootstrapServicesStatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 when any service is not converged\""
+}
+
+// BootstrapStatusCmd is `bootstrap status`: Show the aggregate bootstrap status
+type BootstrapStatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 if any configured bootstrap state is not in its desired state\""
+}
+
+// BootstrapSystemdCmd is `bootstrap systemd`: Manage systemd user services from `[bootstrap.linux.systemd.units]`
+type BootstrapSystemdCmd struct {
+ Apply BootstrapSystemdApplyCmd "cmd:\"\" name:\"apply\""
+ Status BootstrapSystemdStatusCmd "cmd:\"\" name:\"status\""
+}
+
+// BootstrapSystemdApplyCmd is `bootstrap systemd apply`.
+type BootstrapSystemdApplyCmd struct {
+}
+
+// BootstrapSystemdStatusCmd is `bootstrap systemd status`.
+type BootstrapSystemdStatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 if any configured systemd user service is not in its desired state\""
+}
+
+// BootstrapUserCmd is `bootstrap user`: Manage current-user bootstrap settings from `[bootstrap.user]`
+type BootstrapUserCmd struct {
+ Apply BootstrapUserApplyCmd "cmd:\"\" name:\"apply\""
+ Status BootstrapUserStatusCmd "cmd:\"\" name:\"status\""
+}
+
+// BootstrapUserApplyCmd is `bootstrap user apply`.
+type BootstrapUserApplyCmd struct {
+}
+
+// BootstrapUserStatusCmd is `bootstrap user status`.
+type BootstrapUserStatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 if any configured user setting is not in its desired state\""
+}
+
+// CacheCmd is `cache`: Manage the mise cache
+type CacheCmd struct {
+ Clear CacheClearCmd "cmd:\"\" name:\"clear\" help:\"Deletes all cache files in mise\" aliases:\"c,clean\""
+ Path CachePathCmd "cmd:\"\" name:\"path\" help:\"Show the cache directory path\" aliases:\"dir\""
+ Prune CachePruneCmd "cmd:\"\" name:\"prune\" help:\"Removes stale mise cache files\" aliases:\"p\""
+ Task CacheTaskCmd "cmd:\"\" name:\"task\" help:\"Inspect output cache entries for a task\""
+}
+
+// CacheClearCmd is `cache clear`: Deletes all cache files in mise
+type CacheClearCmd struct {
+ Outdate bool "name:\"outdate\" help:\"Mark all cache files as old\" hidden:\"\""
+ Task string "name:\"task\" help:\"Clear output cache entries for a task name or pattern\""
+ TOOL []string "arg:\"\" name:\"TOOL\" optional:\"\" help:\"Tool(s) to clear cache for e.g.: node, python\""
+}
+
+// CachePathCmd is `cache path`: Show the cache directory path
+type CachePathCmd struct {
+}
+
+// CachePruneCmd is `cache prune`: Removes stale mise cache files
+type CachePruneCmd struct {
+ TOOL []string "arg:\"\" name:\"TOOL\" optional:\"\" help:\"Tool(s) to prune cache for e.g.: node, python\""
+}
+
+// CacheTaskCmd is `cache task`: Inspect output cache entries for a task
+type CacheTaskCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ TASK string "arg:\"\" name:\"TASK\" help:\"Task name or pattern to inspect\""
+}
+
+// CompletionCmd is `completion`: Generate shell completions
+type CompletionCmd struct {
+ IncludeBashCompletionLib bool "name:\"include-bash-completion-lib\" help:\"Include the bash completion library in the bash completion script\""
+ Usage bool "name:\"usage\" help:\"Always use usage for completions. Currently, usage is the default for fish and bash but not zsh since it has a few quirks to work out first.\" hidden:\"\""
+ SHELL string "arg:\"\" name:\"SHELL\" optional:\"\" help:\"Shell type to generate completions for\""
+}
+
+// ConfigCmd is `config`: Manage config files
+type ConfigCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ NoHeader bool "name:\"no-header\" aliases:\"no-headers\" help:\"Do not print table header\""
+ TrackedConfigs bool "name:\"tracked-configs\" help:\"List all tracked config files\""
+ Get ConfigGetCmd "cmd:\"\" name:\"get\" help:\"Display the value of a setting in a mise.toml file\""
+ Ls ConfigLsCmd "cmd:\"\" name:\"ls\" help:\"List config files currently in use\" aliases:\"list\""
+ Set ConfigSetCmd "cmd:\"\" name:\"set\" help:\"Set the value of a setting in a mise.toml file\""
+}
+
+// ConfigGetCmd is `config get`: Display the value of a setting in a mise.toml file
+type ConfigGetCmd struct {
+ File string "name:\"file\" aliases:\"path\" help:\"The path to the mise.toml file to read\""
+ KEY string "arg:\"\" name:\"KEY\" optional:\"\" help:\"The path of the config to display\""
+}
+
+// ConfigLsCmd is `config ls`: List config files currently in use
+type ConfigLsCmd struct {
+}
+
+// ConfigSetCmd is `config set`: Set the value of a setting in a mise.toml file
+type ConfigSetCmd struct {
+ File string "name:\"file\" aliases:\"path\" help:\"The path to the mise.toml file to edit\""
+ Type string "name:\"type\" default:\"infer\""
+ KEY string "arg:\"\" name:\"KEY\" help:\"The path of the config to display\""
+ VALUE string "arg:\"\" name:\"VALUE\" optional:\"\" help:\"The value to set the key to (optional if provided as KEY=VALUE)\""
+}
+
+// CurrentCmd is `current`: Shows current active and installed runtime versions
+type CurrentCmd struct {
+ PLUGIN string "arg:\"\" name:\"PLUGIN\" optional:\"\" help:\"Plugin to show versions of e.g.: ruby, node, cargo:eza, npm:prettier, etc.\""
+}
+
+// DeactivateCmd is `deactivate`: Disable mise for current shell session
+type DeactivateCmd struct {
+}
+
+// DirenvCmd is `direnv`: Output direnv function to use mise inside direnv
+type DirenvCmd struct {
+ Activate DirenvActivateCmd "cmd:\"\" name:\"activate\" help:\"Output direnv function to use mise inside direnv\" hidden:\"\""
+ Envrc DirenvEnvrcCmd "cmd:\"\" name:\"envrc\" help:\"[internal] This is an internal command that writes an envrc file for direnv to consume.\" hidden:\"\""
+ Exec DirenvExecCmd "cmd:\"\" name:\"exec\" help:\"[internal] This is an internal command that writes an envrc file for direnv to consume.\" hidden:\"\""
+}
+
+// DirenvActivateCmd is `direnv activate`: Output direnv function to use mise inside direnv
+type DirenvActivateCmd struct {
+}
+
+// DirenvEnvrcCmd is `direnv envrc`: [internal] This is an internal command that writes an envrc file
+type DirenvEnvrcCmd struct {
+}
+
+// DirenvExecCmd is `direnv exec`: [internal] This is an internal command that writes an envrc file
+type DirenvExecCmd struct {
+}
+
+// DotfilesCmd is `dotfiles`: Manage dotfiles from `[dotfiles]` (deprecated)
+type DotfilesCmd struct {
+ Add DotfilesAddCmd "cmd:\"\" name:\"add\" help:\"Add or update dotfiles in `[dotfiles]`\" hidden:\"\""
+ Apply DotfilesApplyCmd "cmd:\"\" name:\"apply\" help:\"Apply dotfiles from `[dotfiles]`\" hidden:\"\""
+ Edit DotfilesEditCmd "cmd:\"\" name:\"edit\" help:\"Edit a managed dotfile source\" hidden:\"\""
+ Status DotfilesStatusCmd "cmd:\"\" name:\"status\" help:\"Show the status of dotfiles from `[dotfiles]`\" aliases:\"ls\" hidden:\"\""
+ Unapply DotfilesUnapplyCmd "cmd:\"\" name:\"unapply\" help:\"Remove dotfiles applied from `[dotfiles]`\" hidden:\"\""
+}
+
+// DotfilesAddCmd is `dotfiles add`: Add or update dotfiles in `[dotfiles]`
+type DotfilesAddCmd struct {
+ Global bool "name:\"global\" short:\"g\" help:\"Write to the global config\""
+ Local bool "name:\"local\" short:\"l\" help:\"Write to the local config instead of the global config\""
+ Mode string "name:\"mode\" short:\"m\" help:\"Dotfile mode to write\""
+ NoApply bool "name:\"no-apply\" help:\"Add the entry without applying it\""
+ Path string "name:\"path\" short:\"p\" help:\"Write to this config file or directory\""
+ Source string "name:\"source\" help:\"Source path to use for a single target\""
+ TARGET []string "arg:\"\" name:\"TARGET\" help:\"Targets to add or update\""
+}
+
+// DotfilesApplyCmd is `dotfiles apply`: Apply dotfiles from `[dotfiles]`
+type DotfilesApplyCmd struct {
+ TARGET []string "arg:\"\" name:\"TARGET\" optional:\"\" help:\"Only apply these targets\""
+}
+
+// DotfilesEditCmd is `dotfiles edit`: Edit a managed dotfile source
+type DotfilesEditCmd struct {
+ Apply bool "name:\"apply\" help:\"Apply this target after the editor exits\""
+ Mode string "name:\"mode\" short:\"m\" help:\"Dotfile mode to use if the target is not yet managed\""
+ Source string "name:\"source\" help:\"Source path to use if the target is not yet managed\""
+ TARGET string "arg:\"\" name:\"TARGET\" help:\"Target to edit\""
+}
+
+// DotfilesStatusCmd is `dotfiles status`: Show the status of dotfiles from `[dotfiles]`
+type DotfilesStatusCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Missing bool "name:\"missing\" help:\"Exit with code 1 if any configured dotfiles are not in their desired state (missing, source missing, differs)\""
+ TARGET []string "arg:\"\" name:\"TARGET\" optional:\"\" help:\"Only show these targets\""
+}
+
+// DotfilesUnapplyCmd is `dotfiles unapply`: Remove dotfiles applied from `[dotfiles]`
+type DotfilesUnapplyCmd struct {
+ TARGET []string "arg:\"\" name:\"TARGET\" optional:\"\" help:\"Only unapply these targets\""
+}
+
+// DoctorCmd is `doctor`: Check mise installation for possible problems
+type DoctorCmd struct {
+ Json bool "name:\"json\" short:\"J\""
+ Path DoctorPathCmd "cmd:\"\" name:\"path\" help:\"Print the current PATH entries mise is providing\" aliases:\"paths\""
+}
+
+// DoctorPathCmd is `doctor path`: Print the current PATH entries mise is providing
+type DoctorPathCmd struct {
+ Full bool "name:\"full\" help:\"Print all entries including those not provided by mise\""
+}
+
+// EnCmd is `en`: Starts a new shell with the mise environment built from the current configuration
+type EnCmd struct {
+ DIR string "arg:\"\" name:\"DIR\" optional:\"\" help:\"Directory to start the shell in\""
+}
+
+// EnvCmd is `env`: Exports env vars to activate mise a single time
+type EnvCmd struct {
+ Dotenv bool "name:\"dotenv\" short:\"D\" help:\"Output in dotenv format\""
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ JsonExtended bool "name:\"json-extended\" help:\"Output in JSON format with additional information (source, tool)\""
+ Redacted bool "name:\"redacted\" help:\"Only show redacted environment variables\""
+ Values bool "name:\"values\" help:\"Only show values of environment variables\""
+ TOOLVERSION []string "arg:\"\" name:\"TOOL@VERSION\" optional:\"\" help:\"Tool(s) to use\""
+}
+
+// ExecCmd is `exec`: Execute a command with tool(s) set
+type ExecCmd struct {
+ Command string "name:\"command\" help:\"Command string to execute\""
+ AllowEnv []string "name:\"allow-env\" help:\"Allow specific env var through (implies --deny-env for everything else) Supports wildcards, e.g. --allow-env='MYAPP_*'\""
+ AllowNet []string "name:\"allow-net\" help:\"Allow network to specific host (implies --deny-net for everything else) macOS only in v1; on Linux falls back to allowing all network\""
+ AllowRead []string "name:\"allow-read\" help:\"Allow reads from specific path (implies --deny-read for everything else)\""
+ AllowWrite []string "name:\"allow-write\" help:\"Allow writes to specific path (implies --deny-write for everything else)\""
+ DenyAll bool "name:\"deny-all\" help:\"Block reads, writes, network, and env vars\""
+ DenyEnv bool "name:\"deny-env\" help:\"Block env var inheritance (only PATH, HOME, USER, SHELL, TERM, LANG pass through)\""
+ DenyNet bool "name:\"deny-net\" help:\"Block all network access\""
+ DenyRead bool "name:\"deny-read\" help:\"Block filesystem reads (system libs and tool dirs still accessible)\""
+ DenyWrite bool "name:\"deny-write\" help:\"Block all filesystem writes\""
+ FreshEnv bool "name:\"fresh-env\" help:\"Bypass the environment cache and recompute the environment\""
+ NoDeps bool "name:\"no-deps\" help:\"Skip automatic dependency preparation\""
+ TOOLVERSION []string "arg:\"\" name:\"TOOL@VERSION\" optional:\"\" help:\"Tool(s) to start e.g.: node@20 python@3.10\""
+}
+
+// FmtCmd is `fmt`: Formats mise.toml
+type FmtCmd struct {
+ All bool "name:\"all\" short:\"a\" help:\"Format all files from the current directory\""
+ Check bool "name:\"check\" help:\"Check if the configs are formatted, no formatting is done\""
+ Stdin bool "name:\"stdin\" help:\"Read config from stdin and write its formatted version into stdout\""
+}
+
+// GenerateCmd is `generate`: Generate files for various tools/services
+type GenerateCmd struct {
+ Bootstrap GenerateBootstrapCmd "cmd:\"\" name:\"bootstrap\" help:\"Generate a script to download+execute mise\""
+ Config GenerateConfigCmd "cmd:\"\" name:\"config\" help:\"Generate a mise.toml file\""
+ Devcontainer GenerateDevcontainerCmd "cmd:\"\" name:\"devcontainer\" help:\"Generate a devcontainer to execute mise\""
+ GitPreCommit GenerateGitPreCommitCmd "cmd:\"\" name:\"git-pre-commit\" help:\"Generate a git pre-commit hook\" aliases:\"pre-commit\""
+ GithubAction GenerateGithubActionCmd "cmd:\"\" name:\"github-action\" help:\"Generate a GitHub Action workflow file\""
+ TaskDocs GenerateTaskDocsCmd "cmd:\"\" name:\"task-docs\" help:\"Generate documentation for tasks in a project\""
+ TaskStubs GenerateTaskStubsCmd "cmd:\"\" name:\"task-stubs\" help:\"Generates shims to run mise tasks\""
+ ToolStub GenerateToolStubCmd "cmd:\"\" name:\"tool-stub\" help:\"Generate a tool stub for HTTP-based tools\""
+}
+
+// GenerateBootstrapCmd is `generate bootstrap`: Generate a script to download+execute mise
+type GenerateBootstrapCmd struct {
+ Localize bool "name:\"localize\" short:\"l\" help:\"Sandboxes mise internal directories like MISE_DATA_DIR and MISE_CACHE_DIR into a `.mise` directory in the project\""
+ Write string "name:\"write\" short:\"w\" help:\"instead of outputting the script to stdout, write to a file and make it executable\""
+ LocalizedDir string "name:\"localized-dir\" help:\"Directory to put localized data into\" default:\".mise\""
+ Windows bool "name:\"windows\" help:\"Also write a Windows launcher, `.cmd`\""
+}
+
+// GenerateConfigCmd is `generate config`: Generate a mise.toml file
+type GenerateConfigCmd struct {
+ Global bool "name:\"global\" short:\"g\" help:\"Generate the global config file (~/.config/mise/config.toml)\""
+ ToolVersions string "name:\"tool-versions\" help:\"Path to a .tool-versions file to import tools from\""
+ PATH string "arg:\"\" name:\"PATH\" optional:\"\" help:\"Path to the config file to create\""
+}
+
+// GenerateDevcontainerCmd is `generate devcontainer`: Generate a devcontainer to execute mise
+type GenerateDevcontainerCmd struct {
+ Image string "name:\"image\" short:\"i\" help:\"The image to use for the devcontainer\""
+ MountMiseData bool "name:\"mount-mise-data\" short:\"m\" help:\"Bind the mise-data-volume to the devcontainer\""
+ Name string "name:\"name\" help:\"The name of the devcontainer\""
+ Write bool "name:\"write\" short:\"w\" help:\"write to .devcontainer/devcontainer.json\""
+}
+
+// GenerateGitPreCommitCmd is `generate git-pre-commit`: Generate a git pre-commit hook
+type GenerateGitPreCommitCmd struct {
+ Task string "name:\"task\" help:\"The task to run when the pre-commit hook is triggered\" default:\"pre-commit\""
+ Write bool "name:\"write\" short:\"w\" help:\"write to .git/hooks/pre-commit and make it executable\""
+ Hook string "name:\"hook\" help:\"Which hook to generate (saves to .git/hooks/$hook)\" default:\"pre-commit\""
+ MISEARG []string "arg:\"\" name:\"MISE_ARG\" optional:\"\" help:\"mise flags to embed in the generated hook, given after `--`\""
+}
+
+// GenerateGithubActionCmd is `generate github-action`: Generate a GitHub Action workflow file
+type GenerateGithubActionCmd struct {
+ Task string "name:\"task\" help:\"The task to run when the workflow is triggered\" default:\"ci\""
+ Write bool "name:\"write\" short:\"w\" help:\"write to .github/workflows/$name.yml\""
+ Name string "name:\"name\" help:\"the name of the workflow to generate\" default:\"ci\""
+}
+
+// GenerateTaskDocsCmd is `generate task-docs`: Generate documentation for tasks in a project
+type GenerateTaskDocsCmd struct {
+ Inject bool "name:\"inject\" short:\"i\" help:\"inserts the documentation into an existing file\""
+ Index bool "name:\"index\" short:\"I\" help:\"write only an index of tasks, intended for use with `--multi`\""
+ Multi bool "name:\"multi\" short:\"m\" help:\"render each task as a separate document, requires `--output` to be a directory\""
+ Root string "name:\"root\" short:\"r\" help:\"root directory to search for tasks\""
+ Style string "name:\"style\" default:\"simple\""
+}
+
+// GenerateTaskStubsCmd is `generate task-stubs`: Generates shims to run mise tasks
+type GenerateTaskStubsCmd struct {
+ Dir string "name:\"dir\" short:\"d\" help:\"Directory to create task stubs inside of\" default:\"bin\""
+ MiseBin string "name:\"mise-bin\" short:\"m\" help:\"Path to a mise bin to use when running the task stub.\" default:\"mise\""
+}
+
+// GenerateToolStubCmd is `generate tool-stub`: Generate a tool stub for HTTP-based tools
+type GenerateToolStubCmd struct {
+ Bin string "name:\"bin\" short:\"b\" help:\"Binary path within the extracted archive\""
+ Bootstrap bool "name:\"bootstrap\" help:\"Wrap stub in a bootstrap script that installs mise if not already present\""
+ BootstrapVersion string "name:\"bootstrap-version\" help:\"Specify mise version for the bootstrap script\""
+ ChecksumAlgorithm string "name:\"checksum-algorithm\" help:\"Checksum algorithm to use when downloading artifacts\" default:\"blake3\""
+ Fetch bool "name:\"fetch\" help:\"Fetch checksums and sizes for an existing tool stub file\""
+ Http string "name:\"http\" help:\"HTTP backend type to use\" default:\"http\""
+ Lock bool "name:\"lock\" help:\"Resolve and embed lockfile data (exact version + platform URLs/checksums) into an existing stub file for reproducible installs without runtime API calls\""
+ PlatformBin []string "name:\"platform-bin\" help:\"Platform-specific binary paths in the format platform:path\""
+ PlatformUrl []string "name:\"platform-url\" help:\"Platform-specific URLs in the format platform:url or just url (auto-detect platform)\""
+ SkipDownload bool "name:\"skip-download\" help:\"Skip downloading for checksum and binary path detection (faster but less informative)\""
+ Url string "name:\"url\" short:\"u\" help:\"URL for downloading the tool\""
+ OUTPUT string "arg:\"\" name:\"OUTPUT\" help:\"Output file path for the tool stub\""
+}
+
+// GithubCmd is `github`: GitHub related commands
+type GithubCmd struct {
+ Token GithubTokenCmd "cmd:\"\" name:\"token\" help:\"Display the GitHub token mise will use for a given host\" hidden:\"\""
+}
+
+// GithubTokenCmd is `github token`: Display the GitHub token mise will use for a given host
+type GithubTokenCmd struct {
+ Oauth bool "name:\"oauth\" help:\"Force native GitHub OAuth device flow instead of normal token resolution\""
+ Refresh bool "name:\"refresh\" help:\"Mint a fresh OAuth token even if the cached one has not expired, via the refresh-token grant or a new device-code flow\""
+ Unmask bool "name:\"unmask\" help:\"Show the full unmasked token\""
+ HOST string "arg:\"\" name:\"HOST\" optional:\"\" help:\"GitHub hostname\""
+}
+
+// GlobalCmd is `global`: Sets/gets the global tool version(s)
+type GlobalCmd struct {
+ Fuzzy bool "name:\"fuzzy\" help:\"Save fuzzy version to `~/.tool-versions` e.g.: `mise global --fuzzy node@20` will save `node 20` to ~/.tool-versions this is the default behavior unless MISE_ASDF_COMPAT=1\""
+ Path bool "name:\"path\" help:\"Get the path of the global config file\""
+ Pin bool "name:\"pin\" help:\"Save exact version to `~/.tool-versions` e.g.: `mise global --pin node@20` will save `node 20.0.0` to ~/.tool-versions\""
+ Remove []string "name:\"remove\" aliases:\"rm,unset\" help:\"Remove the tool(s) from ~/.tool-versions\""
+ TOOLVERSION []string "arg:\"\" name:\"TOOL@VERSION\" optional:\"\" help:\"Tool(s) to add to .tool-versions e.g.: node@20 If this is a single tool with no version, the current value of the global .tool-versions will be displayed\""
+}
+
+// HookEnvCmd is `hook-env`: [internal] called by activate hook to update env vars directory change
+type HookEnvCmd struct {
+ Reason string "name:\"reason\" help:\"Reason for calling hook-env (e.g., \\\"precmd\\\", \\\"chpwd\\\")\" hidden:\"\""
+ Status bool "name:\"status\" help:\"Show \\\"mise: @\\\" message when changing directories\" hidden:\"\""
+}
+
+// HookNotFoundCmd is `hook-not-found`: [internal] called by shell when a command is not found
+type HookNotFoundCmd struct {
+ BIN string "arg:\"\" name:\"BIN\" help:\"Attempted bin to run\""
+}
+
+// ImplodeCmd is `implode`: Removes mise CLI and all related data
+type ImplodeCmd struct {
+ Config bool "name:\"config\" help:\"Also remove config directory\""
+}
+
+// EditCmd is `edit`: Edit mise.toml interactively
+type EditCmd struct {
+ Global bool "name:\"global\" short:\"g\" help:\"Edit the global config file (~/.config/mise/config.toml)\""
+ ToolVersions string "name:\"tool-versions\" help:\"Path to a .tool-versions file to import tools from\""
+ PATH string "arg:\"\" name:\"PATH\" optional:\"\" help:\"Path to the config file to create\""
+}
+
+// InstallCmd is `install`: Install a tool version
+type InstallCmd struct {
+ DryRunCode bool "name:\"dry-run-code\" help:\"Like --dry-run but exits with code 1 if there are tools to install\""
+ IncludeTaskTools bool "name:\"include-task-tools\" help:\"Also install tools required by tasks in the current scope\""
+ MinimumReleaseAge string "name:\"minimum-release-age\" aliases:\"before\" help:\"Only install versions released before this date or older than this duration\""
+ Monorepo bool "name:\"monorepo\" help:\"Install tools from every [monorepo].config_roots config root\" env:\"MISE_MONOREPO\""
+ Shared string "name:\"shared\" help:\"Install tool(s) to a shared directory\""
+ System bool "name:\"system\" help:\"Install tool(s) to the system-wide shared directory\""
+ TOOLVERSION []string "arg:\"\" name:\"TOOL@VERSION\" optional:\"\" help:\"Tool(s) to install e.g.: node@20\""
+}
+
+// InstallIntoCmd is `install-into`: Install a tool version to a specific path
+type InstallIntoCmd struct {
+ TOOLVERSION string "arg:\"\" name:\"TOOL@VERSION\" help:\"Tool to install e.g.: node@20\""
+ PATH string "arg:\"\" name:\"PATH\" help:\"Path to install the tool into\""
+}
+
+// LatestCmd is `latest`: Gets the latest available version for a plugin
+type LatestCmd struct {
+ Installed bool "name:\"installed\" short:\"i\" help:\"Show latest installed instead of available version\""
+ MinimumReleaseAge string "name:\"minimum-release-age\" aliases:\"before\" help:\"Only consider versions released before this date or older than this duration\""
+ TOOLVERSION string "arg:\"\" name:\"TOOL@VERSION\" help:\"Tool to get the latest version of\""
+ ASDFVERSION string "arg:\"\" name:\"ASDF_VERSION\" optional:\"\" help:\"The version prefix to use when querying the latest version same as the first argument after the \\\"@\\\" used for asdf compatibility\""
+}
+
+// LinkCmd is `link`: Symlinks a tool version into mise
+type LinkCmd struct {
+ TOOLVERSION string "arg:\"\" name:\"TOOL@VERSION\" help:\"Tool name and version to create a symlink for\""
+ PATH string "arg:\"\" name:\"PATH\" help:\"The local path to the tool version e.g.: ~/.nvm/versions/node/v20.0.0\""
+}
+
+// LocalCmd is `local`: Sets/gets tool version in local .tool-versions or mise.toml
+type LocalCmd struct {
+ Parent bool "name:\"parent\" short:\"p\" help:\"Recurse up to find a .tool-versions file rather than using the current directory only by default this command will only set the tool in the current directory (\\\"$PWD/.tool-versions\\\")\""
+ Fuzzy bool "name:\"fuzzy\" help:\"Save fuzzy version to `.tool-versions` e.g.: `mise local --fuzzy node@20` will save `node 20` to .tool-versions This is the default behavior unless MISE_ASDF_COMPAT=1\""
+ Path bool "name:\"path\" help:\"Get the path of the config file\""
+ Pin bool "name:\"pin\" help:\"Save exact version to `.tool-versions` e.g.: `mise local --pin node@20` will save `node 20.0.0` to .tool-versions\""
+ Remove []string "name:\"remove\" aliases:\"rm,unset\" help:\"Remove the tool(s) from .tool-versions\""
+ TOOLVERSION []string "arg:\"\" name:\"TOOL@VERSION\" optional:\"\" help:\"Tool(s) to add to .tool-versions/mise.toml e.g.: node@20 if this is a single tool with no version, the current value of .tool-versions/mise.toml will be displayed\""
+}
+
+// LockCmd is `lock`: Update lockfile checksums and URLs for all specified platforms
+type LockCmd struct {
+ Global bool "name:\"global\" short:\"g\" help:\"Target only global config lockfiles (~/.config/mise/mise.lock and system config) By default, only the active project config root is locked\""
+ Platform []string "name:\"platform\" short:\"p\" help:\"Comma-separated list of platforms to target e.g.: linux-x64,macos-arm64,windows-x64 If not specified, all platforms already in lockfile will be updated\""
+ Bump bool "name:\"bump\" help:\"Re-resolve fuzzy version selectors against the latest available versions\""
+ Json bool "name:\"json\" help:\"Output version changes as JSON\""
+ Local bool "name:\"local\" help:\"Update mise.local.lock instead of mise.lock Use for tools defined in .local.toml configs\""
+ MinimumReleaseAge string "name:\"minimum-release-age\" aliases:\"before\" help:\"Only lock versions released before this age or date\""
+ TOOL []string "arg:\"\" name:\"TOOL\" optional:\"\" help:\"Tool(s) to update in lockfile e.g.: node python If not specified, all configured and task-specific tools will be updated\""
+}
+
+// LsCmd is `ls`: List installed and active tool versions
+type LsCmd struct {
+ Current bool "name:\"current\" help:\"Only show tool versions currently specified in a mise.toml\""
+ Global bool "name:\"global\" short:\"g\" help:\"Only show tool versions currently specified in the global mise.toml\""
+ Installed bool "name:\"installed\" short:\"i\" help:\"Only show tool versions that are installed (Hides tools defined in mise.toml but not installed)\""
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Local bool "name:\"local\" short:\"l\" help:\"Only show tool versions currently specified in the local mise.toml\""
+ Missing bool "name:\"missing\" short:\"m\" help:\"Display missing tool versions\""
+ Offline bool "name:\"offline\" short:\"o\" help:\"Don't fetch information such as outdated versions\" hidden:\"\""
+ Plugin string "name:\"plugin\" short:\"p\" hidden:\"\""
+ AllSources bool "name:\"all-sources\" help:\"Display all tracked config sources for tools\""
+ Monorepo bool "name:\"monorepo\" help:\"List tools from every [monorepo].config_roots config root\" env:\"MISE_MONOREPO\""
+ NoHeader bool "name:\"no-header\" aliases:\"no-headers\" help:\"Don't display headers\""
+ Outdated bool "name:\"outdated\" help:\"Display whether a version is outdated\""
+ Prefix string "name:\"prefix\" help:\"Display versions matching this prefix\""
+ Prunable bool "name:\"prunable\" help:\"List only tools that can be pruned with `mise prune`\""
+ INSTALLEDTOOL []string "arg:\"\" name:\"INSTALLED_TOOL\" optional:\"\" help:\"Only show tool versions from [TOOL]\""
+}
+
+// LsRemoteCmd is `ls-remote`: List runtime versions available for install.
+type LsRemoteCmd struct {
+ All bool "name:\"all\" help:\"Show all installed plugins and versions\""
+ MinimumReleaseAge string "name:\"minimum-release-age\" aliases:\"before\" help:\"Only show versions released before this age or date\""
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format (includes version metadata like created_at timestamps when available)\""
+ NoVersionsHost bool "name:\"no-versions-host\" help:\"Disable checking the mise-versions host\""
+ Prerelease bool "name:\"prerelease\" help:\"Include pre-release versions in the output for backends that report upstream prerelease metadata or opt in to regex-based prerelease detection. Equivalent to setting `MISE_PRERELEASES=1` or the `prereleases` setting for the duration of this command.\""
+ StrictMetadata bool "name:\"strict-metadata\" help:\"Fail if release metadata fetches fail\""
+ TOOLVERSION string "arg:\"\" name:\"TOOL@VERSION\" optional:\"\" help:\"Tool to get versions for\""
+ PREFIX string "arg:\"\" name:\"PREFIX\" optional:\"\" help:\"The version prefix to use when querying the latest version same as the first argument after the \\\"@\\\"\""
+}
+
+// McpCmd is `mcp`: Run Model Context Protocol (MCP) server
+type McpCmd struct {
+}
+
+// OciCmd is `oci`: [experimental] Build OCI container images from a mise.toml
+type OciCmd struct {
+ Build OciBuildCmd "cmd:\"\" name:\"build\" help:\"[experimental] Build an OCI image from the current mise.toml\""
+ Push OciPushCmd "cmd:\"\" name:\"push\" help:\"[experimental] Build an OCI image and push it to a registry\""
+ Run OciRunCmd "cmd:\"\" name:\"run\" help:\"[experimental] Build an OCI image from the current mise.toml and run a command in it\""
+}
+
+// OciBuildCmd is `oci build`: [experimental] Build an OCI image from the current mise.toml
+type OciBuildCmd struct {
+ Copy []string "name:\"copy\" help:\"Copy a host file, directory, or symlink into the image (repeatable, HOST:IMAGE)\""
+ From string "name:\"from\" help:\"Base image reference (overrides [oci].from and the oci.default_from setting)\""
+ IncludeGlobal bool "name:\"include-global\" help:\"Also include tools from the global / system config (default: project-only)\""
+ Tag string "name:\"tag\" help:\"Tag to record in the image index (the org.opencontainers.image.ref.name annotation)\""
+ MountPoint string "name:\"mount-point\" help:\"Where to place tool installs inside the image (default: /mise)\""
+ NoMise bool "name:\"no-mise\" help:\"Do not embed the currently-running mise binary at /usr/local/bin/mise\""
+ Owner string "name:\"owner\" help:\"UID[:GID] to assign to every tar entry in generated layers\""
+}
+
+// OciPushCmd is `oci push`: [experimental] Build an OCI image and push it to a registry
+type OciPushCmd struct {
+ CacheFrom string "name:\"cache-from\" help:\"Reuse unchanged tool layers from this image instead of the destination ref\""
+ From string "name:\"from\" help:\"Base image for the build (ignored with --image-dir)\""
+ ImageDir string "name:\"image-dir\" help:\"Push an already-built OCI image layout (skip the build step)\""
+ IncludeGlobal bool "name:\"include-global\" help:\"Also include tools from the global / system config (default: project-only)\""
+ MountPoint string "name:\"mount-point\" help:\"Override in-image mount point (ignored with --image-dir)\""
+ NoCache bool "name:\"no-cache\" help:\"Don't reuse tool layers from the previously pushed image\""
+ NoMise bool "name:\"no-mise\" help:\"Don't embed the mise binary (ignored with --image-dir)\""
+ Owner string "name:\"owner\" help:\"UID[:GID] to assign to every tar entry when building (conflicts with --image-dir)\""
+ UpdateIndex bool "name:\"update-index\" help:\"Maintain the tag as a multi-arch image index\""
+ REF string "arg:\"\" name:\"REF\" help:\"Destination registry reference (e.g. `ghcr.io/me/devenv:latest`)\""
+}
+
+// OciRunCmd is `oci run`: [experimental] Build an OCI image from the current mise.toml and run a command in it
+type OciRunCmd struct {
+ Engine string "name:\"engine\" help:\"Container engine to use (`auto`, `podman`, or `docker`)\" default:\"auto\""
+ From string "name:\"from\" help:\"Base image reference for the build (ignored with --image-dir)\""
+ ImageDir string "name:\"image-dir\" help:\"Use an already-built OCI image layout instead of building fresh\""
+ IncludeGlobal bool "name:\"include-global\" help:\"Also include tools from the global / system config (default: project-only)\""
+ Keep bool "name:\"keep\" help:\"Keep the loaded image in the engine's storage after the run\""
+ MountPoint string "name:\"mount-point\" help:\"Override in-image mount point (ignored with --image-dir)\""
+ NoMise bool "name:\"no-mise\" help:\"Don't embed the mise binary (ignored with --image-dir)\""
+ Owner string "name:\"owner\" help:\"UID[:GID] to assign to every tar entry when building (conflicts with --image-dir)\""
+ Volume []string "name:\"volume\" aliases:\"mount\" help:\"Bind-mount a host path (repeatable, `HOST:CONTAINER[:MODE]`)\""
+ Interactive bool "name:\"interactive\" short:\"i\" help:\"Run interactively (pass `-i` to the engine)\""
+ Tty bool "name:\"tty\" help:\"Allocate a TTY (pass `-t` to the engine)\""
+ Workdir string "name:\"workdir\" short:\"w\" help:\"Working directory inside the container\""
+ CMD []string "arg:\"\" name:\"CMD\" optional:\"\" help:\"Command and arguments to run inside the container (after `--`)\""
+}
+
+// OutdatedCmd is `outdated`: Shows outdated tool versions
+type OutdatedCmd struct {
+ Bump bool "name:\"bump\" short:\"b\" help:\"Compares against the latest versions available, not what matches the current config\""
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Inactive bool "name:\"inactive\" help:\"Show outdated tools including installed-but-inactive tools not present in the current config\""
+ Local bool "name:\"local\" help:\"Only show outdated tools defined in local config files\""
+ Monorepo bool "name:\"monorepo\" help:\"Placeholder for future monorepo outdated checks; `mise outdated --monorepo` is not implemented yet.\""
+ NoHeader bool "name:\"no-header\" help:\"Don't show table header\""
+ TOOLVERSION []string "arg:\"\" name:\"TOOL@VERSION\" optional:\"\" help:\"Tool(s) to show outdated versions for e.g.: node@20 python@3.10 If not specified, all tools in global and local configs will be shown\""
+}
+
+// PatronsCmd is `patrons`: Show the individuals supporting mise as Patron-tier members
+type PatronsCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Refresh bool "name:\"refresh\" help:\"Bypass the local cache and re-fetch\""
+}
+
+// PluginsCmd is `plugins`: Manage plugins
+type PluginsCmd struct {
+ All bool "name:\"all\" short:\"a\" help:\"list all available remote plugins\" hidden:\"\""
+ Core bool "name:\"core\" help:\"The built-in plugins only Normally these are not shown\""
+ Urls bool "name:\"urls\" short:\"u\" aliases:\"url\" help:\"Show the git url for each plugin e.g.: https://github.com/mise-plugins/vfox-cmake.git\""
+ Refs bool "name:\"refs\" help:\"Show the git refs for each plugin e.g.: main 1234abc\" hidden:\"\""
+ User bool "name:\"user\" help:\"List installed plugins\""
+ Install PluginsInstallCmd "cmd:\"\" name:\"install\" help:\"Install a plugin\" aliases:\"i,a,add\""
+ Link PluginsLinkCmd "cmd:\"\" name:\"link\" help:\"Symlinks a plugin into mise\" aliases:\"ln\""
+ Ls PluginsLsCmd "cmd:\"\" name:\"ls\" help:\"List installed plugins\" aliases:\"list\""
+ LsRemote PluginsLsRemoteCmd "cmd:\"\" name:\"ls-remote\" help:\"List all available remote plugins\" aliases:\"list-remote,list-all\""
+ Uninstall PluginsUninstallCmd "cmd:\"\" name:\"uninstall\" help:\"Removes a plugin\" aliases:\"remove,rm\""
+ Update PluginsUpdateCmd "cmd:\"\" name:\"update\" help:\"Updates a plugin to the latest version\" aliases:\"up,upgrade\""
+}
+
+// PluginsInstallCmd is `plugins install`: Install a plugin
+type PluginsInstallCmd struct {
+ NEWPLUGIN string "arg:\"\" name:\"NEW_PLUGIN\" optional:\"\" help:\"The name of the plugin to install e.g.: cmake, poetry Can specify multiple plugins: `mise plugins install cmake poetry`\""
+ GITURL string "arg:\"\" name:\"GIT_URL\" optional:\"\" help:\"The git url of the plugin\""
+ REST []string "arg:\"\" name:\"REST\" optional:\"\""
+}
+
+// PluginsLinkCmd is `plugins link`: Symlinks a plugin into mise
+type PluginsLinkCmd struct {
+ NAME string "arg:\"\" name:\"NAME\" help:\"The name of the plugin e.g.: cmake, poetry\""
+ DIR string "arg:\"\" name:\"DIR\" optional:\"\" help:\"The local path to the plugin e.g.: ./vfox-cmake\""
+}
+
+// PluginsLsCmd is `plugins ls`: List installed plugins
+type PluginsLsCmd struct {
+ Outdated bool "name:\"outdated\" short:\"o\" help:\"Show plugins with available updates Checks the remote for newer versions and only displays plugins that are outdated\""
+}
+
+// PluginsLsRemoteCmd is `plugins ls-remote`: List all available remote plugins
+type PluginsLsRemoteCmd struct {
+ OnlyNames bool "name:\"only-names\" help:\"Only show the name of each plugin by default it will show a \\\"*\\\" next to installed plugins\""
+}
+
+// PluginsUninstallCmd is `plugins uninstall`: Removes a plugin
+type PluginsUninstallCmd struct {
+ Purge bool "name:\"purge\" short:\"p\" help:\"Also remove the plugin's installs, downloads, and cache\""
+ PLUGIN []string "arg:\"\" name:\"PLUGIN\" optional:\"\" help:\"Plugin(s) to remove\""
+}
+
+// PluginsUpdateCmd is `plugins update`: Updates a plugin to the latest version
+type PluginsUpdateCmd struct {
+ PLUGIN []string "arg:\"\" name:\"PLUGIN\" optional:\"\" help:\"Plugin(s) to update\""
+}
+
+// DepsCmd is `deps`: [experimental] Manage project dependencies
+type DepsCmd struct {
+ Explain bool "name:\"explain\" help:\"Show why a provider is fresh or stale (requires a provider argument)\""
+ List bool "name:\"list\" help:\"Show what deps providers are available\""
+ Monorepo bool "name:\"monorepo\" help:\"Install dependencies from every [monorepo].config_roots config root\" env:\"MISE_MONOREPO\""
+ Only []string "name:\"only\" help:\"Run specific deps rule(s) only\""
+ Skip []string "name:\"skip\" help:\"Skip specific deps rule(s)\""
+ Add DepsAddCmd "cmd:\"\" name:\"add\" help:\"Add a dependency\""
+ Install DepsInstallCmd "cmd:\"\" name:\"install\" help:\"Install all project dependencies\""
+ Remove DepsRemoveCmd "cmd:\"\" name:\"remove\" help:\"Remove a dependency\""
+}
+
+// DepsAddCmd is `deps add`: Add a dependency
+type DepsAddCmd struct {
+ Dev bool "name:\"dev\" short:\"D\" help:\"Add as a development dependency\""
+ PACKAGES []string "arg:\"\" name:\"PACKAGES\" help:\"Package(s) to add (e.g., npm:react, npm:@types/react@19)\""
+}
+
+// DepsInstallCmd is `deps install`: Install all project dependencies
+type DepsInstallCmd struct {
+ PROVIDER string "arg:\"\" name:\"PROVIDER\" optional:\"\" help:\"Provider to operate on (runs only this provider, or use with --explain)\""
+}
+
+// DepsRemoveCmd is `deps remove`: Remove a dependency
+type DepsRemoveCmd struct {
+ PACKAGES []string "arg:\"\" name:\"PACKAGES\" help:\"Package(s) to remove (e.g., npm:lodash)\""
+}
+
+// PruneCmd is `prune`: Delete unused versions of tools
+type PruneCmd struct {
+ Configs bool "name:\"configs\" help:\"Prune only tracked and trusted configuration links that point to nonexistent configurations\""
+ DryRunCode bool "name:\"dry-run-code\" help:\"Like --dry-run but exits with code 1 if there are tools to prune\""
+ Monorepo bool "name:\"monorepo\" help:\"Placeholder for future monorepo pruning; `mise prune --monorepo` is not implemented yet.\""
+ Tools bool "name:\"tools\" help:\"Prune only unused versions of tools\""
+ INSTALLEDTOOL []string "arg:\"\" name:\"INSTALLED_TOOL\" optional:\"\" help:\"Prune only these tools\""
+}
+
+// RegistryCmd is `registry`: List available tools to install
+type RegistryCmd struct {
+ Backend string "name:\"backend\" short:\"b\" help:\"Show only tools for this backend\""
+ Complete bool "name:\"complete\" help:\"Print all tools with descriptions for shell completions\" hidden:\"\""
+ HideAliased bool "name:\"hide-aliased\" help:\"Hide aliased tools\""
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Security bool "name:\"security\" help:\"Include security features for each tool's backends in JSON output.\""
+ NAME string "arg:\"\" name:\"NAME\" optional:\"\" help:\"Show only the specified tool's full name\""
+}
+
+// RenderHelpCmd is `render-help`: internal command to generate markdown from help
+type RenderHelpCmd struct {
+}
+
+// ReshimCmd is `reshim`: Creates new shims based on bin paths from currently installed tools.
+type ReshimCmd struct {
+ TOOL string "arg:\"\" name:\"TOOL\" optional:\"\""
+ VERSION string "arg:\"\" name:\"VERSION\" optional:\"\""
+}
+
+// RunCmd is `run`: Run task(s)
+type RunCmd struct {
+ Affected bool "name:\"affected\" help:\"Run matching tasks only for projects affected by Git changes\""
+ AffectedBase string "name:\"affected-base\" help:\"Git base revision for --affected Defaults to MISE_AFFECTED_BASE, CI metadata, or HEAD~1\""
+ AffectedExplain bool "name:\"affected-explain\" help:\"Explain why projects and tasks were selected by --affected\""
+ AffectedHead string "name:\"affected-head\" help:\"Git head revision for --affected Defaults to MISE_AFFECTED_HEAD, CI metadata, or HEAD\""
+ AffectedJson bool "name:\"affected-json\" help:\"Output affected projects and tasks as JSON without running tasks\""
+ All bool "name:\"all\" help:\"Open the interactive selector with all tasks from the entire monorepo\""
+ AllowEnv []string "name:\"allow-env\" help:\"Allow specific env var through (implies --deny-env for everything else) Supports wildcards, e.g. --allow-env='MYAPP_*'\""
+ AllowNet []string "name:\"allow-net\" help:\"Allow network to specific host (implies --deny-net for everything else)\""
+ AllowRead []string "name:\"allow-read\" help:\"Allow reads from specific path (implies --deny-read for everything else)\""
+ AllowWrite []string "name:\"allow-write\" help:\"Allow writes to specific path (implies --deny-write for everything else)\""
+ DenyAll bool "name:\"deny-all\" help:\"Block reads, writes, network, and env vars\""
+ DenyEnv bool "name:\"deny-env\" help:\"Block env var inheritance (only PATH, HOME, USER, SHELL, TERM, LANG pass through)\""
+ DenyNet bool "name:\"deny-net\" help:\"Block all network access\""
+ DenyRead bool "name:\"deny-read\" help:\"Block filesystem reads (system libs and tool dirs still accessible)\""
+ DenyWrite bool "name:\"deny-write\" help:\"Block all filesystem writes\""
+ FreshEnv bool "name:\"fresh-env\" help:\"Bypass the environment cache and recompute the environment\""
+ NoCache bool "name:\"no-cache\" help:\"Do not use cache on remote tasks\" env:\"MISE_TASK_REMOTE_NO_CACHE\""
+ NoDeps bool "name:\"no-deps\" help:\"Skip automatic dependency preparation\""
+ SkipDeps bool "name:\"skip-deps\" help:\"Run only the specified tasks skipping all dependencies\" env:\"MISE_TASK_SKIP_DEPENDS\""
+ SkipTools bool "name:\"skip-tools\" help:\"Skip installing tools before running tasks\""
+ TaskCache string "name:\"task-cache\" help:\"Set task output cache access for this run\" env:\"MISE_TASK_CACHE\" default:\"read-write\""
+ TaskCacheExplain bool "name:\"task-cache-explain\" help:\"Explain the inputs that produced each task's output cache key\""
+ TaskCacheExplainJson bool "name:\"task-cache-explain-json\" help:\"Output cache-key input details as JSON Lines without running tasks\""
+ TaskCacheStats bool "name:\"task-cache-stats\" help:\"Report task output cache hits, restored bytes, and time saved\""
+ Timeout string "name:\"timeout\" help:\"Timeout for the task to complete e.g.: 30s, 5m\""
+}
+
+// SearchCmd is `search`: Search for tools in the registry
+type SearchCmd struct {
+ Interactive bool "name:\"interactive\" short:\"i\" help:\"Show interactive search\""
+ MatchType string "name:\"match-type\" short:\"m\" help:\"Match type: equal, contains, or fuzzy\" default:\"fuzzy\""
+ NoHeader bool "name:\"no-header\" aliases:\"no-headers\" help:\"Don't display headers\""
+ NAME string "arg:\"\" name:\"NAME\" optional:\"\" help:\"The tool to search for\""
+}
+
+// SelfUpdateCmd is `self-update`: Updates mise itself.
+type SelfUpdateCmd struct {
+ NoPlugins bool "name:\"no-plugins\" help:\"Disable auto-updating plugins\""
+ VERSION string "arg:\"\" name:\"VERSION\" optional:\"\" help:\"Update to a specific version\""
+}
+
+// SetCmd is `set`: Set environment variables in mise.toml
+type SetCmd struct {
+ Global bool "name:\"global\" short:\"g\" help:\"Set the environment variable in the global config file\""
+ AgeEncrypt bool "name:\"age-encrypt\" help:\"[experimental] Encrypt the value with age before storing\""
+ AgeKeyFile string "name:\"age-key-file\" help:\"[experimental] Age identity file for encryption\""
+ AgeRecipient []string "name:\"age-recipient\" help:\"[experimental] Age recipient (x25519 public key) for encryption\""
+ AgeSshRecipient []string "name:\"age-ssh-recipient\" help:\"[experimental] SSH recipient (public key or path) for age encryption\""
+ Complete bool "name:\"complete\" help:\"Render completions\" hidden:\"\""
+ File string "name:\"file\" aliases:\"path\" help:\"The TOML file to update\""
+ NoRedact bool "name:\"no-redact\" help:\"Show raw values instead of redacting secrets\""
+ Prompt bool "name:\"prompt\" help:\"Prompt for environment variable values\""
+ Remove []string "name:\"remove\" aliases:\"rm,unset\" help:\"Remove the environment variable from config file\" hidden:\"\""
+ Stdin bool "name:\"stdin\" help:\"Read the value from stdin (for multiline input)\""
+ ENVVAR []string "arg:\"\" name:\"ENV_VAR\" optional:\"\" help:\"Environment variable(s) to set e.g.: NODE_ENV=production\""
+}
+
+// SettingsCmd is `settings`: Manage settings
+type SettingsCmd struct {
+ All bool "name:\"all\" short:\"a\" help:\"List all settings\""
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Local bool "name:\"local\" short:\"l\" help:\"Use the local config file instead of the global one\""
+ Toml bool "name:\"toml\" short:\"T\" help:\"Output in TOML format\""
+ Complete bool "name:\"complete\" help:\"Print all settings with descriptions for shell completions\" hidden:\"\""
+ JsonExtended bool "name:\"json-extended\" help:\"Output in JSON format with sources\""
+ Add SettingsAddCmd "cmd:\"\" name:\"add\" help:\"Adds a setting to the configuration file\""
+ Get SettingsGetCmd "cmd:\"\" name:\"get\" help:\"Show a current setting\""
+ Ls SettingsLsCmd "cmd:\"\" name:\"ls\" help:\"Show current settings\" aliases:\"list\""
+ Set SettingsSetCmd "cmd:\"\" name:\"set\" help:\"Add/update a setting\" aliases:\"create\""
+ Unset SettingsUnsetCmd "cmd:\"\" name:\"unset\" help:\"Clears a setting\" aliases:\"rm,remove,delete,del\""
+}
+
+// SettingsAddCmd is `settings add`: Adds a setting to the configuration file
+type SettingsAddCmd struct {
+ SETTING string "arg:\"\" name:\"SETTING\" help:\"The setting to set\""
+ VALUE string "arg:\"\" name:\"VALUE\" optional:\"\" help:\"The value to set (optional if provided as KEY=VALUE)\""
+}
+
+// SettingsGetCmd is `settings get`: Show a current setting
+type SettingsGetCmd struct {
+ SETTING string "arg:\"\" name:\"SETTING\" help:\"The setting to show\""
+}
+
+// SettingsLsCmd is `settings ls`: Show current settings
+type SettingsLsCmd struct {
+ SETTING string "arg:\"\" name:\"SETTING\" optional:\"\" help:\"Name of setting\""
+}
+
+// SettingsSetCmd is `settings set`: Add/update a setting
+type SettingsSetCmd struct {
+ SETTING string "arg:\"\" name:\"SETTING\" help:\"The setting to set\""
+ VALUE string "arg:\"\" name:\"VALUE\" optional:\"\" help:\"The value to set (optional if provided as KEY=VALUE)\""
+}
+
+// SettingsUnsetCmd is `settings unset`: Clears a setting
+type SettingsUnsetCmd struct {
+ KEY string "arg:\"\" name:\"KEY\" help:\"The setting to remove\""
+}
+
+// ShellCmd is `shell`: Sets a tool version for the current session.
+type ShellCmd struct {
+ Unset bool "name:\"unset\" short:\"u\" help:\"Removes a previously set version\""
+ TOOLVERSION []string "arg:\"\" name:\"TOOL@VERSION\" help:\"Tool(s) to use\""
+}
+
+// ShellAliasCmd is `shell-alias`: Manage shell aliases.
+type ShellAliasCmd struct {
+ NoHeader bool "name:\"no-header\" help:\"Don't show table header\""
+ Get ShellAliasGetCmd "cmd:\"\" name:\"get\" help:\"Show the command for a shell alias\""
+ Ls ShellAliasLsCmd "cmd:\"\" name:\"ls\" help:\"List shell aliases\" aliases:\"list\""
+ Set ShellAliasSetCmd "cmd:\"\" name:\"set\" help:\"Add/update a shell alias\" aliases:\"add,create\""
+ Unset ShellAliasUnsetCmd "cmd:\"\" name:\"unset\" help:\"Removes a shell alias\" aliases:\"rm,remove,delete,del\""
+}
+
+// ShellAliasGetCmd is `shell-alias get`: Show the command for a shell alias
+type ShellAliasGetCmd struct {
+ ShellAlias string "arg:\"\" name:\"shell_alias\" help:\"The alias to show\""
+}
+
+// ShellAliasLsCmd is `shell-alias ls`: List shell aliases
+type ShellAliasLsCmd struct {
+}
+
+// ShellAliasSetCmd is `shell-alias set`: Add/update a shell alias
+type ShellAliasSetCmd struct {
+ ShellAlias string "arg:\"\" name:\"shell_alias\" help:\"The alias name\""
+ COMMAND string "arg:\"\" name:\"COMMAND\" optional:\"\" help:\"The command to run (optional if provided as ALIAS=COMMAND)\""
+}
+
+// ShellAliasUnsetCmd is `shell-alias unset`: Removes a shell alias
+type ShellAliasUnsetCmd struct {
+ ShellAlias string "arg:\"\" name:\"shell_alias\" help:\"The alias to remove\""
+}
+
+// SponsorsCmd is `sponsors`: Show the companies sponsoring mise and the jdx.dev open source tools
+type SponsorsCmd struct {
+}
+
+// SyncCmd is `sync`: Synchronize tools from other version managers with mise
+type SyncCmd struct {
+ Node SyncNodeCmd "cmd:\"\" name:\"node\" help:\"Symlinks all tool versions from an external tool into mise\""
+ Python SyncPythonCmd "cmd:\"\" name:\"python\" help:\"Symlinks all tool versions from an external tool into mise\""
+ Ruby SyncRubyCmd "cmd:\"\" name:\"ruby\" help:\"Symlinks all ruby tool versions from an external tool into mise\""
+}
+
+// SyncNodeCmd is `sync node`: Symlinks all tool versions from an external tool into mise
+type SyncNodeCmd struct {
+ Brew bool "name:\"brew\" help:\"Get tool versions from Homebrew\""
+ Nodenv bool "name:\"nodenv\" help:\"Get tool versions from nodenv\""
+ Nvm bool "name:\"nvm\" help:\"Get tool versions from nvm\""
+}
+
+// SyncPythonCmd is `sync python`: Symlinks all tool versions from an external tool into mise
+type SyncPythonCmd struct {
+ Pyenv bool "name:\"pyenv\" help:\"Get tool versions from pyenv\""
+ Uv bool "name:\"uv\" help:\"Sync tool versions with uv (2-way sync)\""
+}
+
+// SyncRubyCmd is `sync ruby`: Symlinks all ruby tool versions from an external tool into mise
+type SyncRubyCmd struct {
+ Brew bool "name:\"brew\" help:\"Get tool versions from Homebrew\" required:\"\""
+}
+
+// TasksCmd is `tasks`: Manage tasks
+type TasksCmd struct {
+ Global bool "name:\"global\" short:\"g\" help:\"Only show global tasks\""
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Local bool "name:\"local\" short:\"l\" help:\"Only show non-global tasks\""
+ Extended bool "name:\"extended\" short:\"x\" help:\"Show all columns\""
+ All bool "name:\"all\" help:\"Load all tasks from the entire monorepo, including sibling directories. By default, only tasks from the current directory hierarchy are loaded.\""
+ Complete bool "name:\"complete\" help:\"Display tasks for usage completion\" hidden:\"\""
+ Hidden bool "name:\"hidden\" help:\"Show hidden tasks\""
+ NameOnly bool "name:\"name-only\" help:\"Only show task names, one per line. Useful for piping to fzf and similar tools.\""
+ NoHeader bool "name:\"no-header\" aliases:\"no-headers\" help:\"Do not print table header\""
+ Sort string "name:\"sort\" help:\"Sort by column. Default is name.\""
+ SortOrder string "name:\"sort-order\" help:\"Sort order. Default is asc.\""
+ Usage bool "name:\"usage\" hidden:\"\""
+ Add TasksAddCmd "cmd:\"\" name:\"add\" help:\"Create a new task\""
+ Deps TasksDepsCmd "cmd:\"\" name:\"deps\" help:\"Display a tree visualization of a dependency graph\""
+ Edit TasksEditCmd "cmd:\"\" name:\"edit\" help:\"Edit a task with $EDITOR\""
+ Graph TasksGraphCmd "cmd:\"\" name:\"graph\" help:\"[experimental] Inspect the workspace project graph\""
+ Info TasksInfoCmd "cmd:\"\" name:\"info\" help:\"Get information about a task\""
+ Ls TasksLsCmd "cmd:\"\" name:\"ls\" help:\"List available tasks to execute These may be included from the config file or from the project's .mise/tasks directory mise will merge all tasks from all parent directories into this list.\""
+ Run TasksRunCmd "cmd:\"\" name:\"run\" help:\"Run task(s)\" aliases:\"r\""
+ Validate TasksValidateCmd "cmd:\"\" name:\"validate\" help:\"Validate tasks for common errors and issues\""
+}
+
+// TasksAddCmd is `tasks add`: Create a new task
+type TasksAddCmd struct {
+ Alias []string "name:\"alias\" short:\"a\" help:\"Other names for the task\""
+ Depends []string "name:\"depends\" short:\"d\" help:\"Add dependencies to the task\""
+ Dir string "name:\"dir\" short:\"D\" help:\"Run the task in a specific directory\""
+ File bool "name:\"file\" help:\"Create a file task instead of a toml task\""
+ Hide bool "name:\"hide\" short:\"H\" help:\"Hide the task from `mise tasks` and completions\""
+ Sources []string "name:\"sources\" help:\"Glob patterns of files this task uses as input\""
+ WaitFor []string "name:\"wait-for\" short:\"w\" help:\"Wait for these tasks to complete if they are to run\""
+ DependsPost []string "name:\"depends-post\" help:\"Dependencies to run after the task runs\""
+ Description string "name:\"description\" help:\"Description of the task\""
+ Outputs []string "name:\"outputs\" help:\"Glob patterns of files this task creates, to skip if they are not modified\""
+ RunWindows string "name:\"run-windows\" help:\"Command to run on windows\""
+ TASK string "arg:\"\" name:\"TASK\" help:\"Tasks name to add\""
+ RUN []string "arg:\"\" name:\"RUN\" optional:\"\""
+}
+
+// TasksDepsCmd is `tasks deps`: Display a tree visualization of a dependency graph
+type TasksDepsCmd struct {
+ Compact bool "name:\"compact\" help:\"Collapse repeated dependencies after their first occurrence\""
+ Dot bool "name:\"dot\" help:\"Display dependencies in DOT format\""
+ TASKS []string "arg:\"\" name:\"TASKS\" optional:\"\" help:\"Tasks to show dependencies for Can specify multiple tasks by separating with spaces e.g.: mise tasks deps lint test check\""
+}
+
+// TasksEditCmd is `tasks edit`: Edit a task with $EDITOR
+type TasksEditCmd struct {
+ Path bool "name:\"path\" short:\"p\" help:\"Display the path to the task instead of editing it\""
+ TASK string "arg:\"\" name:\"TASK\" help:\"Task to edit\""
+}
+
+// TasksGraphCmd is `tasks graph`: [experimental] Inspect the workspace project graph
+type TasksGraphCmd struct {
+ Explain bool "name:\"explain\" help:\"Explain provider attribution for inferred projects and tasks\""
+}
+
+// TasksInfoCmd is `tasks info`: Get information about a task
+type TasksInfoCmd struct {
+ TASK string "arg:\"\" name:\"TASK\" help:\"Name of the task to get information about\""
+}
+
+// TasksLsCmd is `tasks ls`: List available tasks to execute
+type TasksLsCmd struct {
+}
+
+// TasksRunCmd is `tasks run`: Run task(s)
+type TasksRunCmd struct {
+ Affected bool "name:\"affected\" help:\"Run matching tasks only for projects affected by Git changes\""
+ AffectedBase string "name:\"affected-base\" help:\"Git base revision for --affected Defaults to MISE_AFFECTED_BASE, CI metadata, or HEAD~1\""
+ AffectedExplain bool "name:\"affected-explain\" help:\"Explain why projects and tasks were selected by --affected\""
+ AffectedHead string "name:\"affected-head\" help:\"Git head revision for --affected Defaults to MISE_AFFECTED_HEAD, CI metadata, or HEAD\""
+ AffectedJson bool "name:\"affected-json\" help:\"Output affected projects and tasks as JSON without running tasks\""
+ AllowEnv []string "name:\"allow-env\" help:\"Allow specific env var through (implies --deny-env for everything else) Supports wildcards, e.g. --allow-env='MYAPP_*'\""
+ AllowNet []string "name:\"allow-net\" help:\"Allow network to specific host (implies --deny-net for everything else)\""
+ AllowRead []string "name:\"allow-read\" help:\"Allow reads from specific path (implies --deny-read for everything else)\""
+ AllowWrite []string "name:\"allow-write\" help:\"Allow writes to specific path (implies --deny-write for everything else)\""
+ DenyAll bool "name:\"deny-all\" help:\"Block reads, writes, network, and env vars\""
+ DenyEnv bool "name:\"deny-env\" help:\"Block env var inheritance (only PATH, HOME, USER, SHELL, TERM, LANG pass through)\""
+ DenyNet bool "name:\"deny-net\" help:\"Block all network access\""
+ DenyRead bool "name:\"deny-read\" help:\"Block filesystem reads (system libs and tool dirs still accessible)\""
+ DenyWrite bool "name:\"deny-write\" help:\"Block all filesystem writes\""
+ FreshEnv bool "name:\"fresh-env\" help:\"Bypass the environment cache and recompute the environment\""
+ NoCache bool "name:\"no-cache\" help:\"Do not use cache on remote tasks\" env:\"MISE_TASK_REMOTE_NO_CACHE\""
+ NoDeps bool "name:\"no-deps\" help:\"Skip automatic dependency preparation\""
+ SkipDeps bool "name:\"skip-deps\" help:\"Run only the specified tasks skipping all dependencies\" env:\"MISE_TASK_SKIP_DEPENDS\""
+ SkipTools bool "name:\"skip-tools\" help:\"Skip installing tools before running tasks\""
+ TaskCache string "name:\"task-cache\" help:\"Set task output cache access for this run\" env:\"MISE_TASK_CACHE\" default:\"read-write\""
+ TaskCacheExplain bool "name:\"task-cache-explain\" help:\"Explain the inputs that produced each task's output cache key\""
+ TaskCacheExplainJson bool "name:\"task-cache-explain-json\" help:\"Output cache-key input details as JSON Lines without running tasks\""
+ TaskCacheStats bool "name:\"task-cache-stats\" help:\"Report task output cache hits, restored bytes, and time saved\""
+ Timeout string "name:\"timeout\" help:\"Timeout for the task to complete e.g.: 30s, 5m\""
+ TASK string "arg:\"\" name:\"TASK\" optional:\"\" help:\"Tasks to run Can specify multiple tasks by separating with `:::` e.g.: mise run task1 arg1 arg2 ::: task2 arg1 arg2 Defaults to `default` when omitted\""
+ ARGS []string "arg:\"\" name:\"ARGS\" optional:\"\" help:\"Arguments to pass to the tasks. Use \\\":::\\\" to separate tasks.\""
+}
+
+// TasksValidateCmd is `tasks validate`: Validate tasks for common errors and issues
+type TasksValidateCmd struct {
+ ErrorsOnly bool "name:\"errors-only\" help:\"Only show errors (skip warnings)\""
+ TASKS []string "arg:\"\" name:\"TASKS\" optional:\"\" help:\"Tasks to validate If not specified, validates all tasks\""
+}
+
+// TestToolCmd is `test-tool`: Test a tool installs and executes
+type TestToolCmd struct {
+ All bool "name:\"all\" short:\"a\" help:\"Test every tool specified in registry/\""
+ AllConfig bool "name:\"all-config\" help:\"Test all tools specified in config files\""
+ IncludeNonDefined bool "name:\"include-non-defined\" help:\"Also test tools not defined in registry/, guessing how to test it\""
+ TOOLS []string "arg:\"\" name:\"TOOLS\" optional:\"\" help:\"Tool(s) to test\""
+}
+
+// TokenCmd is `token`: Display git provider tokens mise will use
+type TokenCmd struct {
+ Forgejo TokenForgejoCmd "cmd:\"\" name:\"forgejo\" help:\"Forgejo token\""
+ Github TokenGithubCmd "cmd:\"\" name:\"github\" help:\"GitHub token\""
+ Gitlab TokenGitlabCmd "cmd:\"\" name:\"gitlab\" help:\"GitLab token\""
+}
+
+// TokenForgejoCmd is `token forgejo`: Forgejo token
+type TokenForgejoCmd struct {
+ Unmask bool "name:\"unmask\" help:\"Show the full unmasked token\""
+ HOST string "arg:\"\" name:\"HOST\" optional:\"\" help:\"Forgejo hostname\""
+}
+
+// TokenGithubCmd is `token github`: GitHub token
+type TokenGithubCmd struct {
+ Oauth bool "name:\"oauth\" help:\"Resolve only via the native GitHub OAuth source (cache, refresh, or device-code flow), bypassing other token sources\""
+ Refresh bool "name:\"refresh\" help:\"Mint a fresh OAuth token even if the cached one has not expired, via the refresh-token grant or a new device-code flow. Use after changing the GitHub App's installations or permissions: cached tokens keep their original access until they expire\""
+ Unmask bool "name:\"unmask\" help:\"Show the full unmasked token\""
+ HOST string "arg:\"\" name:\"HOST\" optional:\"\" help:\"GitHub hostname\""
+}
+
+// TokenGitlabCmd is `token gitlab`: GitLab token
+type TokenGitlabCmd struct {
+ Unmask bool "name:\"unmask\" help:\"Show the full unmasked token\""
+ HOST string "arg:\"\" name:\"HOST\" optional:\"\" help:\"GitLab hostname\""
+}
+
+// ToolCmd is `tool`: Gets information about a tool
+type ToolCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Output in JSON format\""
+ Active bool "name:\"active\" help:\"Only show active versions\""
+ Backend bool "name:\"backend\" help:\"Only show backend field\""
+ ConfigSource bool "name:\"config-source\" help:\"Only show config source\""
+ Description bool "name:\"description\" help:\"Only show description field\""
+ Installed bool "name:\"installed\" help:\"Only show installed versions\""
+ Requested bool "name:\"requested\" help:\"Only show requested versions\""
+ ToolOptions bool "name:\"tool-options\" help:\"Only show tool options\""
+ TOOL string "arg:\"\" name:\"TOOL\" help:\"Tool name to get information about\""
+}
+
+// ToolStubCmd is `tool-stub`: Execute a tool stub
+type ToolStubCmd struct {
+ FILE string "arg:\"\" name:\"FILE\" help:\"Path to the TOML tool stub file to execute\""
+ ARGS []string "arg:\"\" name:\"ARGS\" optional:\"\" help:\"Arguments to pass to the tool\""
+}
+
+// TrustCmd is `trust`: Marks a config file as trusted
+type TrustCmd struct {
+ All bool "name:\"all\" short:\"a\" help:\"Trust all config files in the current directory, its parents, and its subdirectories\""
+ Ignore bool "name:\"ignore\" help:\"Do not trust this config and ignore it in the future\""
+ Show bool "name:\"show\" help:\"Show the trusted status of config files from the current directory and its parents. Does not trust or untrust any files.\""
+ Untrust bool "name:\"untrust\" help:\"Remove explicit trust for this config\""
+ CONFIGFILE string "arg:\"\" name:\"CONFIG_FILE\" optional:\"\" help:\"The config file whose trust status to change\""
+}
+
+// UninstallCmd is `uninstall`: Removes installed tool versions
+type UninstallCmd struct {
+ All bool "name:\"all\" short:\"a\" help:\"Delete all installed versions\""
+ DryRunCode bool "name:\"dry-run-code\" help:\"Like --dry-run but exits with code 1 if there are tools to uninstall\""
+ INSTALLEDTOOLVERSION []string "arg:\"\" name:\"INSTALLED_TOOL@VERSION\" optional:\"\" help:\"Tool(s) to remove\""
+}
+
+// UnsetCmd is `unset`: Remove environment variable(s) from the config file.
+type UnsetCmd struct {
+ File string "name:\"file\" aliases:\"path\" help:\"Specify a file to use instead of `mise.toml`\""
+ Global bool "name:\"global\" short:\"g\" help:\"Use the global config file\""
+ ENVKEY []string "arg:\"\" name:\"ENV_KEY\" optional:\"\" help:\"Environment variable(s) to remove e.g.: NODE_ENV\""
+}
+
+// UntrustCmd is `untrust`: Remove explicit trust for a config
+type UntrustCmd struct {
+ CONFIGFILE string "arg:\"\" name:\"CONFIG_FILE\" optional:\"\" help:\"The config file to untrust\""
+}
+
+// UnuseCmd is `unuse`: Removes installed tool versions from mise.toml
+type UnuseCmd struct {
+ Global bool "name:\"global\" short:\"g\" help:\"Use the global config file (`~/.config/mise/config.toml`) instead of the local one\""
+ Path string "name:\"path\" short:\"p\" aliases:\"file\" help:\"Specify a path to a config file or directory\""
+ NoPrune bool "name:\"no-prune\" help:\"Do not also prune the installed version\""
+ INSTALLEDTOOLVERSION []string "arg:\"\" name:\"INSTALLED_TOOL@VERSION\" help:\"Tool(s) to remove\""
+}
+
+// UpgradeCmd is `upgrade`: Upgrades outdated tools
+type UpgradeCmd struct {
+ Bump bool "name:\"bump\" short:\"b\" help:\"Upgrades to the latest version available, bumping the version in mise.toml\""
+ Interactive bool "name:\"interactive\" short:\"i\" help:\"Display multiselect menu to choose which tools to upgrade\""
+ Exclude []string "name:\"exclude\" short:\"x\" help:\"Tool(s) to exclude from upgrading e.g.: go python\""
+ DryRunCode bool "name:\"dry-run-code\" help:\"Like --dry-run but exits with code 1 if there are outdated tools\""
+ Inactive bool "name:\"inactive\" help:\"Upgrade all tools, including installed-but-inactive tools not present in the current config\""
+ Local bool "name:\"local\" help:\"Only upgrade tools defined in local config files\""
+ MinimumReleaseAge string "name:\"minimum-release-age\" aliases:\"before\" help:\"Only upgrade to versions released before this date or older than this duration\""
+ Monorepo bool "name:\"monorepo\" help:\"Placeholder for future monorepo upgrades; `mise upgrade --monorepo` is not implemented yet.\""
+ NoPrune bool "name:\"no-prune\" help:\"Do not uninstall the versions that were upgraded away from\""
+ Prune bool "name:\"prune\" help:\"Uninstall the versions that were upgraded away from\""
+ INSTALLEDTOOLVERSION []string "arg:\"\" name:\"INSTALLED_TOOL@VERSION\" optional:\"\" help:\"Tool(s) to upgrade e.g.: node@20 python@3.10 If not specified, all current tools will be upgraded\""
+}
+
+// UsageCmd is `usage`: Generate a usage CLI spec
+type UsageCmd struct {
+}
+
+// UseCmd is `use`: Installs a tool and adds the version to mise.toml.
+type UseCmd struct {
+ Global bool "name:\"global\" short:\"g\" help:\"Use the global config file (`~/.config/mise/config.toml`) instead of the local one\""
+ Path string "name:\"path\" short:\"p\" help:\"Specify a path to a config file or directory\""
+ DryRunCode bool "name:\"dry-run-code\" help:\"Like --dry-run but exits with code 1 if there are changes to make\""
+ Fuzzy bool "name:\"fuzzy\" help:\"Save fuzzy version to config file\""
+ MinimumReleaseAge string "name:\"minimum-release-age\" aliases:\"before\" help:\"Only install versions released before this date or older than this duration\""
+ Pin bool "name:\"pin\" help:\"Save the resolved concrete version to the config file\""
+ Remove []string "name:\"remove\" aliases:\"rm,unset\" help:\"Remove the tool(s) from config file\""
+ TOOLVERSION []string "arg:\"\" name:\"TOOL@VERSION\" optional:\"\" help:\"Tool(s) to add to config file\""
+}
+
+// VersionCmd is `version`: Display the version of mise
+type VersionCmd struct {
+ Json bool "name:\"json\" short:\"J\" help:\"Print the version information in JSON format\""
+}
+
+// WatchCmd is `watch`: Run task(s) and watch for changes to rerun it
+type WatchCmd struct {
+ TaskFlag []string "name:\"task-flag\" help:\"Tasks to run\" hidden:\"\""
+ Glob []string "name:\"glob\" short:\"g\" help:\"Files to watch Defaults to sources from the task(s)\" hidden:\"\""
+ SkipDeps bool "name:\"skip-deps\" help:\"Run only the specified tasks skipping all dependencies\""
+ Watch []string "name:\"watch\" short:\"w\" help:\"Watch a specific file or directory\""
+ WatchNonRecursive []string "name:\"watch-non-recursive\" short:\"W\" help:\"Watch a specific directory, non-recursively\""
+ WatchFile string "name:\"watch-file\" short:\"F\" help:\"Watch files and directories from a file\""
+ Clear string "name:\"clear\" help:\"Clear screen before running command\""
+ OnBusyUpdate string "name:\"on-busy-update\" short:\"o\" help:\"What to do when receiving events while the command is running\" default:\"do-nothing\""
+ Restart bool "name:\"restart\" short:\"r\" help:\"Restart the process if it's still running\""
+ Signal string "name:\"signal\" help:\"Send a signal to the process when it's still running\""
+ StopSignal string "name:\"stop-signal\" help:\"Signal to send to stop the command\""
+ StopTimeout string "name:\"stop-timeout\" help:\"Time to wait for the command to exit gracefully\" default:\"10s\""
+ MapSignal []string "name:\"map-signal\" help:\"Translate signals from the OS to signals to send to the command\""
+ Debounce string "name:\"debounce\" short:\"d\" help:\"Time to wait for new events before taking action\" default:\"50ms\""
+ StdinQuit bool "name:\"stdin-quit\" help:\"Exit when stdin closes\""
+ NoVcsIgnore bool "name:\"no-vcs-ignore\" help:\"Don't load gitignores\""
+ NoProjectIgnore bool "name:\"no-project-ignore\" help:\"Don't load project-local ignores\""
+ NoGlobalIgnore bool "name:\"no-global-ignore\" help:\"Don't load global ignores\""
+ NoDefaultIgnore bool "name:\"no-default-ignore\" help:\"Don't use internal default ignores\""
+ NoDiscoverIgnore bool "name:\"no-discover-ignore\" help:\"Don't discover ignore files at all\""
+ IgnoreNothing bool "name:\"ignore-nothing\" help:\"Don't ignore anything at all\""
+ Postpone bool "name:\"postpone\" short:\"p\" help:\"Wait until first change before running command\""
+ DelayRun string "name:\"delay-run\" help:\"Sleep before running the command\""
+ Poll string "name:\"poll\" aliases:\"force-poll\" help:\"Poll for filesystem changes\""
+ EmitEventsTo string "name:\"emit-events-to\" help:\"Configure event emission\" default:\"none\""
+ OnlyEmitEvents bool "name:\"only-emit-events\" help:\"Only emit events to stdout, run no commands.\""
+ WrapProcess string "name:\"wrap-process\" help:\"Configure how the process is wrapped\""
+ Notify bool "name:\"notify\" short:\"N\" help:\"Alert when commands start and end\""
+ Color string "name:\"color\" aliases:\"colour\" help:\"When to use terminal colours\" default:\"auto\""
+ Bell bool "name:\"bell\" help:\"Ring the terminal bell on command completion\""
+ ProjectOrigin string "name:\"project-origin\" help:\"Set the project origin\""
+ Workdir string "name:\"workdir\" help:\"Set the working directory\""
+ Exts []string "name:\"exts\" short:\"e\" help:\"Filename extensions to filter to\""
+ Filter []string "name:\"filter\" help:\"Filename patterns to filter to\""
+ FilterFile []string "name:\"filter-file\" help:\"Files to load filters from\" env:\"WATCHEXEC_FILTER_FILES\""
+ FilterProg []string "name:\"filter-prog\" short:\"J\" help:\"[experimental] Filter programs.\""
+ Ignore []string "name:\"ignore\" short:\"i\" help:\"Filename patterns to filter out\""
+ IgnoreFile []string "name:\"ignore-file\" help:\"Files to load ignores from\" env:\"WATCHEXEC_IGNORE_FILES\""
+ FsEvents []string "name:\"fs-events\" help:\"Filesystem events to filter to\""
+ NoMeta bool "name:\"no-meta\" help:\"Don't emit fs events for metadata changes\""
+ PrintEvents bool "name:\"print-events\" help:\"Print events that trigger actions\""
+ Manual bool "name:\"manual\" help:\"Show the manual page\""
+ TASK string "arg:\"\" name:\"TASK\" optional:\"\" help:\"Tasks to run Can specify multiple tasks by separating with `:::` e.g.: `mise run task1 arg1 arg2 ::: task2 arg1 arg2` Defaults to `default`\""
+ ARGS []string "arg:\"\" name:\"ARGS\" optional:\"\" help:\"Task and arguments to run\""
+}
+
+// WhereCmd is `where`: Display the installation path for a tool
+type WhereCmd struct {
+ TOOLVERSION string "arg:\"\" name:\"TOOL@VERSION\" help:\"Tool(s) to look up e.g.: ruby@3 if \\\"@\\\" is specified, it will show the latest installed version that matches the prefix otherwise, it will show the current, active installed version\""
+ ASDFVERSION string "arg:\"\" name:\"ASDF_VERSION\" optional:\"\" help:\"the version prefix to use when querying the latest version same as the first argument after the \\\"@\\\" used for asdf compatibility\""
+}
+
+// WhichCmd is `which`: Shows the path that a tool's bin points to.
+type WhichCmd struct {
+ Complete bool "name:\"complete\" hidden:\"\""
+ Plugin bool "name:\"plugin\" help:\"Show the plugin name instead of the path\""
+ BINNAME string "arg:\"\" name:\"BIN_NAME\" optional:\"\" help:\"The bin to look up\""
+}
+
+// Resolve builds kong's model of the CLI by reflecting over the structs above and
+// parses argv against it, reporting whether a subcommand was reached.
+//
+// Both halves are the measurement: kong has no way to answer a command line
+// without first walking the whole grammar.
+func Resolve(argv []string) bool {
+ var target Cli
+ parser, err := kong.New(&target, kong.Name("mise"),
+ kong.Exit(func(int) {}), kong.Writers(io.Discard, io.Discard))
+ if err != nil {
+ return false
+ }
+ ctx, err := parser.Parse(argv)
+ if err != nil {
+ return false
+ }
+ return ctx.Selected() != nil
+}
diff --git a/benches/go/mise-urfave/urfave.go b/benches/go/mise-urfave/urfave.go
new file mode 100644
index 000000000..53eb34504
--- /dev/null
+++ b/benches/go/mise-urfave/urfave.go
@@ -0,0 +1,256 @@
+// Code generated by `xtask gen-shadow benches/mise.usage.kdl urfave`. DO NOT EDIT.
+//
+// mise declared in urfave/cli v3, from the same spec the usage tables are
+// generated from, so that the rows of `go/README.md`'s tables describe the same
+// CLI. Regenerate with `mise run gen-shadow` rather than editing.
+//
+// The tree is built inside `Resolve` on purpose: that is what an urfave program
+// does on every process start, and it is the cost the comparison is about.
+package miseurfave
+
+import (
+ "context"
+ "io"
+
+ "github.com/urfave/cli/v3"
+)
+
+// build declares the whole CLI, as an urfave program's `main` would.
+//
+// `hit` is set by the action of whichever subcommand the parse arrives at, which is
+// how this shadow answers the same question the others do — was a subcommand
+// reached — without an action that does any work.
+func build(hit *bool) *cli.Command {
+ noop := func(context.Context, *cli.Command) error { return nil }
+ reached := func(context.Context, *cli.Command) error { *hit = true; return nil }
+ cmd1 := &cli.Command{Name: "activate", Usage: "Initializes mise in the current shell session", Description: "Initializes mise in the current shell session\n\nThis should go into your shell's rc file or login shell. Otherwise, it will only take effect in the current session. (e.g. ~/.zshrc, ~/.zprofile, ~/.zshenv, ~/.bashrc, ~/.bash_profile, ~/.profile, ~/.config/fish/config.fish, or $PROFILE for powershell)\n\nTypically, this can be added with something like the following:\n\n echo 'eval \"$(mise activate zsh)\"' >> ~/.zshrc\n\nHowever, this requires that \"mise\" is in your PATH. If it is not, you need to specify the full path like this:\n\n echo 'eval \"$(/path/to/mise activate zsh)\"' >> ~/.zshrc\n\nCustomize status output with `status` settings.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "quiet", Aliases: []string{"q"}, Usage: "Suppress non-error messages", Local: true}, &cli.StringFlag{Name: "shell", Aliases: []string{"s"}, Usage: "Shell type to generate the script for", Hidden: true, Local: true}, &cli.BoolFlag{Name: "no-hook-env", Usage: "Do not automatically call hook-env", Local: true}, &cli.BoolFlag{Name: "shims", Usage: "Use shims instead of modifying PATH\nEffectively the same as:", Local: true}, &cli.BoolFlag{Name: "status", Usage: "Show \"mise: @\" message when changing directories", Hidden: true, Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "SHELL_TYPE"}}}
+ cmd2 := &cli.Command{Name: "get", Usage: "Show an alias for a tool", Description: "Show an alias for a tool\n\nThis is the contents of a tool_alias. entry in ~/.config/mise/config.toml", Action: reached, Arguments: []cli.Argument{&cli.StringArg{Name: "TOOL"}, &cli.StringArg{Name: "ALIAS"}}}
+ cmd3 := &cli.Command{Name: "ls", Usage: "List tool version aliases\nShows the aliases that can be specified.\nThese can come from user config or from plugins in `bin/list-aliases`.", Description: "List tool version aliases\nShows the aliases that can be specified.\nThese can come from user config or from plugins in `bin/list-aliases`.\n\nFor user config, aliases are defined like the following in `~/.config/mise/config.toml`:\n\n [tool_alias.node.versions]\n lts = \"22.0.0\"", Aliases: []string{"list"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "no-header", Usage: "Don't show table header", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "TOOL"}}}
+ cmd4 := &cli.Command{Name: "set", Usage: "Add/update an alias for a tool/backend", Description: "Add/update an alias for a tool/backend\n\nThis modifies the contents of ~/.config/mise/config.toml", Aliases: []string{"add", "create"}, Action: reached, Arguments: []cli.Argument{&cli.StringArg{Name: "TOOL"}, &cli.StringArg{Name: "ALIAS"}, &cli.StringArg{Name: "VALUE"}}}
+ cmd5 := &cli.Command{Name: "unset", Usage: "Clears an alias for a tool/backend", Description: "Clears an alias for a tool/backend\n\nThis modifies the contents of ~/.config/mise/config.toml", Aliases: []string{"rm", "remove", "delete", "del"}, Action: reached, Arguments: []cli.Argument{&cli.StringArg{Name: "TOOL"}, &cli.StringArg{Name: "ALIAS"}}}
+ cmd6 := &cli.Command{Name: "tool-alias", Usage: "Manage tool version aliases.", Aliases: []string{"alias", "aliases"}, Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "tool", Aliases: []string{"p", "plugin"}, Usage: "Filter aliases by tool", Local: true}, &cli.BoolFlag{Name: "no-header", Usage: "Don't show table header", Local: true}}, Commands: []*cli.Command{cmd2, cmd3, cmd4, cmd5}}
+ cmd7 := &cli.Command{Name: "asdf", Usage: "[internal] simulates asdf for plugins that call \"asdf\" internally", Hidden: true, Action: reached, Arguments: []cli.Argument{&cli.StringArgs{Name: "ARGS", Min: 0, Max: -1}}}
+ cmd8 := &cli.Command{Name: "ls", Usage: "List built-in backends", Aliases: []string{"list"}, Action: reached}
+ cmd9 := &cli.Command{Name: "backends", Usage: "Manage backends", Aliases: []string{"b", "backend", "backend-list"}, Action: reached, Commands: []*cli.Command{cmd8}}
+ cmd10 := &cli.Command{Name: "bin-paths", Usage: "List all the active runtime bin paths", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "bin-names", Usage: "Output executable names instead of bin directories", Local: true}, &cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output executable entries in JSON format (implies --bin-names)", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TOOL@VERSION", Min: 0, Max: -1}}}
+ cmd11 := &cli.Command{Name: "__apply-account-plan", Hidden: true, Action: reached}
+ cmd12 := &cli.Command{Name: "__apply-service-plan", Hidden: true, Action: reached}
+ cmd13 := &cli.Command{Name: "__apply-firewall-plan", Hidden: true, Action: reached}
+ cmd14 := &cli.Command{Name: "__apply-system-plan", Hidden: true, Action: reached}
+ cmd15 := &cli.Command{Name: "__inspect-system-files", Hidden: true, Action: reached}
+ cmd16 := &cli.Command{Name: "__inspect-firewall-plan", Hidden: true, Action: reached}
+ cmd17 := &cli.Command{Name: "apply", Usage: "Apply configured Linux users and groups", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print what would change without changing anything", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}}
+ cmd18 := &cli.Command{Name: "status", Usage: "Show configured Linux user and group state", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 when any account is not converged", Local: true}}}
+ cmd19 := &cli.Command{Name: "accounts", Usage: "Manage Linux users and groups from `[bootstrap.users]` and `[bootstrap.groups]`", Action: reached, Commands: []*cli.Command{cmd17, cmd18}}
+ cmd20 := &cli.Command{Name: "apply", Usage: "Apply configured Docker Compose project state", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print what would change without changing anything", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}}
+ cmd21 := &cli.Command{Name: "status", Usage: "Show configured Docker Compose project state", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 when any Compose project is not converged", Local: true}}}
+ cmd22 := &cli.Command{Name: "compose", Usage: "Manage Docker Compose projects from `[bootstrap.compose]`", Action: reached, Commands: []*cli.Command{cmd20, cmd21}}
+ cmd23 := &cli.Command{Name: "add", Usage: "Add or update dotfiles in `[dotfiles]`", Description: "Add or update dotfiles in `[dotfiles]`\n\nIf the target is already managed, this updates its source from the live target. Otherwise it creates a `[dotfiles]` entry and seeds the source under `dotfiles.root` unless `--source` is provided.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "force", Aliases: []string{"f"}, Usage: "Overwrite existing sources without prompting", Local: true}, &cli.BoolFlag{Name: "global", Aliases: []string{"g"}, Usage: "Write to the global config", Local: true}, &cli.BoolFlag{Name: "local", Aliases: []string{"l"}, Usage: "Write to the local config instead of the global config", Local: true}, &cli.StringFlag{Name: "mode", Aliases: []string{"m"}, Usage: "Dotfile mode to write", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the config/source updates without writing anything", Local: true}, &cli.BoolFlag{Name: "no-apply", Usage: "Add the entry without applying it", Local: true}, &cli.StringFlag{Name: "path", Aliases: []string{"p"}, Usage: "Write to this config file or directory", Local: true}, &cli.StringFlag{Name: "source", Aliases: []string{"s"}, Usage: "Source path to use for a single target", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TARGET", Min: 1, Max: -1}}}
+ cmd24 := &cli.Command{Name: "apply", Usage: "Apply dotfiles from `[dotfiles]`", Description: "Apply dotfiles from `[dotfiles]`\n\nApplies configured whole-file entries and edits that aren't in their desired state. Whole-file entries may symlink, copy, or render templates. Edit entries manage a marker-delimited block or a single line in a file mise doesn't otherwise own.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "force", Aliases: []string{"f"}, Usage: "Overwrite existing files that conflict with whole-file dotfile entries", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the actions that would run without writing anything", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TARGET", Min: 0, Max: -1}}}
+ cmd25 := &cli.Command{Name: "edit", Usage: "Edit a managed dotfile source", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "apply", Usage: "Apply this target after the editor exits", Local: true}, &cli.StringFlag{Name: "mode", Aliases: []string{"m"}, Usage: "Dotfile mode to use if the target is not yet managed", Local: true}, &cli.StringFlag{Name: "source", Aliases: []string{"s"}, Usage: "Source path to use if the target is not yet managed", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt when adding an unmanaged target", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "TARGET"}}}
+ cmd26 := &cli.Command{Name: "status", Usage: "Show the status of dotfiles from `[dotfiles]`", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 if any configured dotfiles are not in their desired\nstate (missing, source missing, differs)", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TARGET", Min: 0, Max: -1}}}
+ cmd27 := &cli.Command{Name: "unapply", Usage: "Remove dotfiles applied from `[dotfiles]`", Description: "Remove dotfiles applied from `[dotfiles]`\n\nRemoves configured whole-file entries and edits while preserving files mise cannot identify as managed. Modified copies, templates, and plain-line edits require `--force`.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "force", Aliases: []string{"f"}, Usage: "Remove modified or otherwise ambiguous managed files and lines", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the actions that would run without writing anything", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TARGET", Min: 0, Max: -1}}}
+ cmd28 := &cli.Command{Name: "dotfiles", Usage: "Manage dotfiles from `[dotfiles]`", Action: reached, Commands: []*cli.Command{cmd23, cmd24, cmd25, cmd26, cmd27}}
+ cmd29 := &cli.Command{Name: "apply", Usage: "Apply configured privileged files and directories", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print what would change without changing anything", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}, &cli.BoolFlag{Name: "prompt-secrets", Usage: "Prompt securely for missing bootstrap secret inputs", Local: true}}}
+ cmd30 := &cli.Command{Name: "status", Usage: "Show configured privileged file and directory state", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 when any resource is not converged", Local: true}, &cli.BoolFlag{Name: "prompt-secrets", Usage: "Prompt securely for missing bootstrap secret inputs", Local: true}}}
+ cmd31 := &cli.Command{Name: "files", Usage: "Manage privileged files and directories from `[bootstrap.files]` and `[bootstrap.directories]`", Action: reached, Commands: []*cli.Command{cmd29, cmd30}}
+ cmd32 := &cli.Command{Name: "apply", Usage: "Apply the configured Linux host firewall", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print what would change without changing anything", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}}
+ cmd33 := &cli.Command{Name: "status", Usage: "Show configured Linux host firewall state", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 when the firewall is not converged", Local: true}}}
+ cmd34 := &cli.Command{Name: "firewall", Usage: "Manage the Linux host firewall from `[bootstrap.linux.firewall]`", Action: reached, Commands: []*cli.Command{cmd32, cmd33}}
+ cmd35 := &cli.Command{Name: "apply", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the commands that would run without running them", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}}
+ cmd36 := &cli.Command{Name: "status", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 if any configured LaunchAgent is not in its desired state", Local: true}}}
+ cmd37 := &cli.Command{Name: "launchd", Usage: "Manage macOS LaunchAgents from `[bootstrap.macos.launchd.agents]`", Hidden: true, Action: reached, Commands: []*cli.Command{cmd35, cmd36}}
+ cmd38 := &cli.Command{Name: "apply", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the commands that would run without running them", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}}
+ cmd39 := &cli.Command{Name: "status", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 if any configured systemd user service is not in its desired state", Local: true}}}
+ cmd40 := &cli.Command{Name: "systemd-units", Usage: "Manage systemd user services from `[bootstrap.linux.systemd.units]`", Aliases: []string{"systemd"}, Action: reached, Commands: []*cli.Command{cmd38, cmd39}}
+ cmd41 := &cli.Command{Name: "linux", Usage: "Manage Linux bootstrap config from `[bootstrap.linux]`", Action: reached, Commands: []*cli.Command{cmd40}}
+ cmd42 := &cli.Command{Name: "apply", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the commands that would run without running them", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}}
+ cmd43 := &cli.Command{Name: "status", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 if any configured defaults are not in their desired state", Local: true}}}
+ cmd44 := &cli.Command{Name: "defaults", Usage: "Manage macOS defaults from `[bootstrap.macos.defaults]`", Action: reached, Commands: []*cli.Command{cmd42, cmd43}}
+ cmd45 := &cli.Command{Name: "apply", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the commands that would run without running them", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}}
+ cmd46 := &cli.Command{Name: "status", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 if any configured LaunchAgent is not in its desired state", Local: true}}}
+ cmd47 := &cli.Command{Name: "launchd-agents", Usage: "Manage macOS LaunchAgents from `[bootstrap.macos.launchd.agents]`", Aliases: []string{"launchd"}, Action: reached, Commands: []*cli.Command{cmd45, cmd46}}
+ cmd48 := &cli.Command{Name: "macos", Usage: "Manage macOS bootstrap config from `[bootstrap.macos]`", Action: reached, Commands: []*cli.Command{cmd44, cmd47}}
+ cmd49 := &cli.Command{Name: "apply", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the commands that would run without running them", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}}
+ cmd50 := &cli.Command{Name: "status", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 if any configured defaults are not in their desired state", Local: true}}}
+ cmd51 := &cli.Command{Name: "macos-defaults", Usage: "Manage macOS defaults from `[bootstrap.macos.defaults]`", Hidden: true, Action: reached, Commands: []*cli.Command{cmd49, cmd50}}
+ cmd52 := &cli.Command{Name: "apply", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the actions that would run without writing anything", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}}
+ cmd53 := &cli.Command{Name: "status", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 if any configured shell activation is not in its desired state", Local: true}}}
+ cmd54 := &cli.Command{Name: "mise-shell-activate", Usage: "Manage mise shell activation from `[bootstrap.mise_shell_activate]`", Aliases: []string{"shell"}, Action: reached, Commands: []*cli.Command{cmd52, cmd53}}
+ cmd55 := &cli.Command{Name: "apply", Usage: "Apply system packages from `[bootstrap.packages]`", Description: "Apply system packages from `[bootstrap.packages]`\n\nChecks which configured packages are missing and installs them with the system package manager. Built-in system managers may elevate with sudo when not running as root (see `system_packages.sudo`); package plugins never do.\n\nPackages can also be given explicitly in `manager:package` form (e.g. `apk:zlib-dev`, `apt:curl`, `brew:jq`); they are installed whether or not they appear in the config. Explicit packages and `--manager` scope the run to packages only. `install` is accepted as an alias for this command.", Aliases: []string{"i", "install"}, Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "manager", Aliases: []string{"m"}, Usage: "Only install packages for this built-in or plugin manager", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the commands that would run without running them", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}, &cli.BoolFlag{Name: "update", Usage: "Refresh package manager metadata first (apk: `--update-cache`, apt: `apt-get update`)", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "PACKAGE", Min: 0, Max: -1}}}
+ cmd56 := &cli.Command{Name: "tap", Usage: "Add a Homebrew tap URL to [bootstrap.brew.taps]", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "local", Aliases: []string{"l"}, Usage: "Write to the local config instead of the global config", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the config change without writing it", Local: true}, &cli.StringFlag{Name: "path", Aliases: []string{"p", "file"}, Usage: "Write to this config file or directory", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "TAP"}, &cli.StringArg{Name: "URL"}}}
+ cmd57 := &cli.Command{Name: "untap", Usage: "Remove Homebrew tap URLs from [bootstrap.brew.taps]", Aliases: []string{"remove", "rm"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "local", Aliases: []string{"l"}, Usage: "Write to the local config instead of the global config", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the config change without writing it", Local: true}, &cli.StringFlag{Name: "path", Aliases: []string{"p", "file"}, Usage: "Write to this config file or directory", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TAPS", Min: 1, Max: -1}}}
+ cmd58 := &cli.Command{Name: "brew", Usage: "Manage Homebrew taps used by bootstrap packages", Description: "Manage Homebrew taps used by bootstrap packages\n\nThese commands edit `[bootstrap.brew.taps]` so tapped formulae and casks can be fetched directly by mise without a Homebrew installation.", Action: reached, Commands: []*cli.Command{cmd56, cmd57}}
+ cmd59 := &cli.Command{Name: "import", Usage: "Import installed system packages into `[bootstrap.packages]`", Description: "Import installed system packages into `[bootstrap.packages]`\n\nCurrently supports Homebrew formulae only. By default, imports linked formulae whose active keg receipt says they were installed on request. Pass `--all` to import every linked formula, including dependencies.", Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "env", Aliases: []string{"e"}, Usage: "Write to the config file for this environment (mise..toml)", Local: true}, &cli.BoolFlag{Name: "global", Aliases: []string{"g"}, Usage: "Write to the global config (~/.config/mise/config.toml)", Local: true}, &cli.StringFlag{Name: "manager", Aliases: []string{"m"}, Usage: "Only import packages for this manager. Currently only `brew` is supported.", Local: true, Value: "brew"}, &cli.BoolFlag{Name: "all", Usage: "Import every linked formula, including dependencies", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the config change without writing config", Local: true}, &cli.StringFlag{Name: "path", Aliases: []string{"p", "file"}, Usage: "Write to this config file or directory", Local: true}}}
+ cmd60 := &cli.Command{Name: "prune", Usage: "Prune installed system packages no longer declared in `[bootstrap.packages]`", Description: "Prune installed system packages no longer declared in `[bootstrap.packages]`\n\nSupports Homebrew formulae and conservatively removable, mise-owned casks. Pruning keeps packages needed by the current config or by trusted, loadable tracked configs.", Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "manager", Aliases: []string{"m"}, Usage: "Only prune packages for this manager", Local: true, Value: "brew"}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print what would be removed without deleting anything", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}}
+ cmd61 := &cli.Command{Name: "status", Usage: "Show the status of system packages from `[bootstrap.packages]`", Aliases: []string{"ls"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 if any configured packages are not in their desired state", Local: true}}}
+ cmd62 := &cli.Command{Name: "upgrade", Usage: "Upgrade installed bootstrap packages from `[bootstrap.packages]`", Description: "Upgrade installed bootstrap packages from `[bootstrap.packages]`\n\nRefreshes package manager metadata and upgrades the configured packages that are already installed: apk/apt/dnf/pacman upgrade to the newest available version (apk, apt, and dnf honor a version pinned in config), brew pours the formula's current bottle and replaces the old keg, brew-cask installs the current cask artifact, flatpak and flatpak-user update applications and runtimes, and mas upgrades App Store apps. Packages that are not installed yet are skipped — use `mise bootstrap packages apply` for those.\n\nPackages can also be given explicitly in `manager:package` form.", Aliases: []string{"up"}, Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "manager", Aliases: []string{"m"}, Usage: "Only upgrade packages for this built-in or plugin manager", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the commands that would run without running them", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "PACKAGE", Min: 0, Max: -1}}}
+ cmd63 := &cli.Command{Name: "use", Usage: "Add bootstrap packages to [bootstrap.packages] and install them", Description: "Add bootstrap packages to [bootstrap.packages] and install them\n\nLike `mise use` for tools: writes `\"manager:package\" = \"version\"` entries to mise.toml (the local config by default, the global one with `-g`) and then installs whatever is missing.\n\nVersions are pinned with `@`: `mise bootstrap packages use apt:curl@8.5.0-2`. Without `@` (or with `@latest`) no pin is written. brew formulae and casks version through their names instead (for example `brew:postgresql@17`, `brew-cask:temurin@17`), where `@` is part of the Homebrew name rather than a mise version selector. mas uses numeric ADAM IDs and does not support pins.", Aliases: []string{"u"}, Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "env", Aliases: []string{"e"}, Usage: "Write to the config file for this environment (mise..toml)", Local: true}, &cli.BoolFlag{Name: "global", Aliases: []string{"g"}, Usage: "Write to the global config (~/.config/mise/config.toml) instead of the local one", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the commands that would run without writing config or installing", Local: true}, &cli.StringFlag{Name: "path", Aliases: []string{"p", "file"}, Usage: "Write to this config file or directory", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "PACKAGE", Min: 1, Max: -1}}}
+ cmd64 := &cli.Command{Name: "packages", Usage: "Manage bootstrap system packages from `[bootstrap.packages]`", Action: reached, Commands: []*cli.Command{cmd55, cmd58, cmd59, cmd60, cmd61, cmd62, cmd63}}
+ cmd65 := &cli.Command{Name: "plan", Usage: "Show the changes declarative bootstrap resources would make", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output a stable machine-readable plan in JSON format", Local: true}, &cli.BoolFlag{Name: "detailed-exitcode", Usage: "Exit 2 when the plan contains changes, 0 when unchanged, and 1 on errors", Local: true}, &cli.BoolFlag{Name: "prompt-secrets", Usage: "Prompt securely for missing bootstrap secret inputs", Local: true}}}
+ cmd66 := &cli.Command{Name: "apply", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print what would happen without installing plugins", Local: true}}}
+ cmd67 := &cli.Command{Name: "status", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 if a declared plugin is missing", Local: true}}}
+ cmd68 := &cli.Command{Name: "plugins", Usage: "Manage package manager plugins declared in `[bootstrap.plugins]`", Action: reached, Commands: []*cli.Command{cmd66, cmd67}}
+ cmd69 := &cli.Command{Name: "remote", Usage: "Bootstrap one or more machines over OpenSSH", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "all", Usage: "Select every configured inventory host", Local: true}, &cli.StringFlag{Name: "bootstrap-command", Usage: "Explicit remote shell command that installs mise and places it on PATH", Local: true}, &cli.StringFlag{Name: "connect-timeout", Usage: "SSH connection timeout in seconds", Local: true, Value: "10"}, &cli.StringSliceFlag{Name: "copy-link", Usage: "Dereference one source-relative symbolic link; repeat for multiple links", Local: true}, &cli.BoolFlag{Name: "copy-links", Usage: "Dereference every symbolic link in the source archive", Local: true}, &cli.StringSliceFlag{Name: "exclude", Usage: "Additional archive pattern to exclude; repeat for multiple patterns", Local: true}, &cli.BoolFlag{Name: "fail-fast", Usage: "Stop after the first failed target", Local: true}, &cli.BoolFlag{Name: "force-dotfiles", Usage: "Allow remote dotfile conflicts to be replaced", Local: true}, &cli.StringSliceFlag{Name: "host", Usage: "Ad-hoc SSH destination (`[user@]host`); repeat for multiple hosts", Local: true}, &cli.StringFlag{Name: "identity-file", Aliases: []string{"i"}, Usage: "SSH identity file override", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the remote bootstrap changes without applying them", Local: true}, &cli.BoolFlag{Name: "keep-staging", Usage: "Keep the remote staging directory for debugging", Local: true}, &cli.StringFlag{Name: "mise-bin", Usage: "Local mise binary to upload (escape hatch for custom architectures)", Local: true}, &cli.StringSliceFlag{Name: "only", Usage: "Run only one or more remote bootstrap parts", Local: true}, &cli.StringFlag{Name: "port", Usage: "SSH port override", Local: true}, &cli.BoolFlag{Name: "prompt-secrets", Usage: "Prompt securely for missing secret inputs on the remote host", Local: true}, &cli.StringSliceFlag{Name: "remote-env", Usage: "Config environments to load on the remote host; repeat or delimit with commas (for example, ci,dotfiles)", Local: true}, &cli.StringFlag{Name: "remote-mise", Usage: "Existing mise executable name or path; relative paths use the staged project", Local: true}, &cli.StringSliceFlag{Name: "skip", Usage: "Skip one or more remote bootstrap parts", Local: true}, &cli.StringFlag{Name: "source", Usage: "Local directory archived and sent to each target", Local: true}, &cli.StringSliceFlag{Name: "ssh-option", Usage: "OpenSSH `-o` option; repeat for multiple options", Local: true}, &cli.StringSliceFlag{Name: "tag", Usage: "Select configured hosts with this tag; repeat to match any tag", Local: true}, &cli.BoolFlag{Name: "update", Usage: "Refresh package manager metadata and update configured repos remotely", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip remote confirmation prompts", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TARGET", Min: 0, Max: -1}}}
+ cmd70 := &cli.Command{Name: "apply", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the commands that would run without running them", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}}
+ cmd71 := &cli.Command{Name: "exec", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "continue-on-error", Aliases: []string{"c"}, Usage: "Continue running in other repos after a command fails", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the commands that would run without running them", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "PATH", Min: 0, Max: -1}, &cli.StringArgs{Name: "COMMAND", Min: 1, Max: -1}}}
+ cmd72 := &cli.Command{Name: "status", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 if any configured repo is not in its desired state", Local: true}}}
+ cmd73 := &cli.Command{Name: "update", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the commands that would run without running them", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "PATH", Min: 0, Max: -1}}}
+ cmd74 := &cli.Command{Name: "repos", Usage: "Manage git repo checkouts from `[bootstrap.repos]`", Action: reached, Commands: []*cli.Command{cmd70, cmd71, cmd72, cmd73}}
+ cmd75 := &cli.Command{Name: "status", Usage: "Show whether declared bootstrap secret inputs are available", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 if a declared secret input is unavailable", Local: true}}}
+ cmd76 := &cli.Command{Name: "secrets", Usage: "Inspect bootstrap secret inputs without revealing their values", Action: reached, Commands: []*cli.Command{cmd75}}
+ cmd77 := &cli.Command{Name: "apply", Usage: "Apply configured Linux system service state", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print what would change without changing anything", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}}
+ cmd78 := &cli.Command{Name: "status", Usage: "Show configured Linux system service state", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 when any service is not converged", Local: true}}}
+ cmd79 := &cli.Command{Name: "services", Usage: "Manage Linux system services from `[bootstrap.services]`", Action: reached, Commands: []*cli.Command{cmd77, cmd78}}
+ cmd80 := &cli.Command{Name: "status", Usage: "Show the aggregate bootstrap status", Aliases: []string{"ls"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 if any configured bootstrap state is not in its desired state", Local: true}, &cli.BoolFlag{Name: "prompt-secrets", Usage: "Prompt securely for missing bootstrap secret inputs", Local: true}}}
+ cmd81 := &cli.Command{Name: "apply", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the commands that would run without running them", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}}
+ cmd82 := &cli.Command{Name: "status", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 if any configured systemd user service is not in its desired state", Local: true}}}
+ cmd83 := &cli.Command{Name: "systemd", Usage: "Manage systemd user services from `[bootstrap.linux.systemd.units]`", Hidden: true, Action: reached, Commands: []*cli.Command{cmd81, cmd82}}
+ cmd84 := &cli.Command{Name: "apply", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the commands that would run without running them", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}}
+ cmd85 := &cli.Command{Name: "status", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 if any configured user setting is not in its desired state", Local: true}}}
+ cmd86 := &cli.Command{Name: "user", Usage: "Manage current-user bootstrap settings from `[bootstrap.user]`", Action: reached, Commands: []*cli.Command{cmd84, cmd85}}
+ cmd87 := &cli.Command{Name: "bootstrap", Usage: "Set up a machine for the current config in one command", Description: "Set up a machine for the current config in one command\n\nRuns the bootstrap steps for the current config in order:\n\n0. `mise bootstrap accounts apply` — converge `[bootstrap.users]` and\n `[bootstrap.groups]` (Linux)\n1. `mise bootstrap plugins apply` — install `[bootstrap.plugins]`\n 1.7. `[bootstrap.hooks.pre-packages]` — optional setup hook\n2. Install built-in-manager entries from `[bootstrap.packages]` 3. `mise bootstrap files apply` — converge `[bootstrap.files]` and\n `[bootstrap.directories]`\n4. `mise bootstrap services apply` — converge `[bootstrap.services]`\n systemd system services (Linux)\n5. `mise bootstrap firewall apply` — converge `[bootstrap.linux.firewall]`\n host firewall policy and rules (Linux)\n6. `mise bootstrap compose apply` — converge `[bootstrap.compose]`\n Docker Compose projects\n7. `mise bootstrap repos apply` — clone/converge `[bootstrap.repos]`\n surrounded by `pre-repos`/`post-repos` hooks\n8. `mise bootstrap dotfiles apply` — apply dotfiles from `[dotfiles]`\n surrounded by `pre-dotfiles`/`post-dotfiles` hooks\n9. `mise bootstrap mise-shell-activate apply` — configure shell activation\n from `[bootstrap.mise_shell_activate]`\n10. `mise bootstrap macos defaults apply` — write\n `[bootstrap.macos.defaults]` entries (macOS)\n surrounded by `pre-defaults`/`post-defaults` hooks\n11. `mise bootstrap macos launchd-agents apply` — install/load\n `[bootstrap.macos.launchd.agents]`\n12. `mise bootstrap linux systemd-units apply` — install/start\n `[bootstrap.linux.systemd.units]`\n13. `mise bootstrap user apply` — set `[bootstrap.user].login_shell`\n (Unix)\n surrounded by `pre-user`/`post-user` hooks\n14. `mise install` — install missing tools from `[tools]`\n surrounded by `pre-tools`/`post-tools` hooks; package-plugin entries\n from `[bootstrap.packages]` install afterward, followed by\n `[bootstrap.hooks.post-packages]`\n15. `mise run bootstrap` — if a task named `bootstrap` is defined 16. `[bootstrap.hooks.final]` — optional final hook\n\nThe declarative steps converge — anything already in its desired state is skipped, so re-running is safe. The `bootstrap` task runs on every invocation; keep it idempotent. Use it for any project-specific setup that doesn't fit the declarative sections (seeding databases, auth flows, etc.) — it runs with the installed tools on PATH.\n\nUse `--skip ` to skip named parts, or `--only ` to run just named parts. Both flags can be repeated or comma-separated, but they cannot be used together.", Aliases: []string{"bs"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print what would happen without installing anything", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip confirmation prompts", Local: true}, &cli.BoolFlag{Name: "force-dotfiles", Usage: "Overwrite existing files that conflict with whole-file dotfile entries", Local: true}, &cli.StringSliceFlag{Name: "only", Usage: "Run only one or more bootstrap parts", Local: true}, &cli.BoolFlag{Name: "prompt-secrets", Usage: "Prompt securely for missing bootstrap secret inputs", Local: true}, &cli.StringSliceFlag{Name: "skip", Usage: "Skip one or more bootstrap parts", Local: true}, &cli.BoolFlag{Name: "update", Usage: "Refresh package manager metadata and update configured repos", Local: true}}, Commands: []*cli.Command{cmd11, cmd12, cmd13, cmd14, cmd15, cmd16, cmd19, cmd22, cmd28, cmd31, cmd34, cmd37, cmd41, cmd48, cmd51, cmd54, cmd64, cmd65, cmd68, cmd69, cmd74, cmd76, cmd79, cmd80, cmd83, cmd86}}
+ cmd88 := &cli.Command{Name: "clear", Usage: "Deletes all cache files in mise", Aliases: []string{"c", "clean"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "outdate", Usage: "Mark all cache files as old", Hidden: true, Local: true}, &cli.StringFlag{Name: "task", Usage: "Clear output cache entries for a task name or pattern", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TOOL", Min: 0, Max: -1}}}
+ cmd89 := &cli.Command{Name: "path", Usage: "Show the cache directory path", Aliases: []string{"dir"}, Action: reached}
+ cmd90 := &cli.Command{Name: "prune", Usage: "Removes stale mise cache files", Description: "Removes stale mise cache files\n\nBy default, this command will remove files that have not been accessed in 30 days. Change this with the MISE_CACHE_PRUNE_AGE environment variable.", Aliases: []string{"p"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "verbose", Aliases: []string{"v"}, Usage: "Show pruned files", Local: true, Config: cli.BoolConfig{Count: new(int)}}, &cli.BoolFlag{Name: "dry-run", Usage: "Just show what would be pruned", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TOOL", Min: 0, Max: -1}}}
+ cmd91 := &cli.Command{Name: "task", Usage: "Inspect output cache entries for a task", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "TASK"}}}
+ cmd92 := &cli.Command{Name: "cache", Usage: "Manage the mise cache", Description: "Manage the mise cache\n\nRun `mise cache` with no args to view the current cache directory.", Action: reached, Commands: []*cli.Command{cmd88, cmd89, cmd90, cmd91}}
+ cmd93 := &cli.Command{Name: "completion", Usage: "Generate shell completions", Aliases: []string{"complete", "completions"}, Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "shell", Aliases: []string{"s"}, Usage: "Shell type to generate completions for", Hidden: true, Local: true}, &cli.BoolFlag{Name: "include-bash-completion-lib", Usage: "Include the bash completion library in the bash completion script", Local: true}, &cli.BoolFlag{Name: "usage", Usage: "Always use usage for completions.\nCurrently, usage is the default for fish and bash but not zsh since it has a few quirks\nto work out first.", Hidden: true, Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "SHELL"}}}
+ cmd94 := &cli.Command{Name: "get", Usage: "Display the value of a setting in a mise.toml file", Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "file", Aliases: []string{"f", "path"}, Usage: "The path to the mise.toml file to read", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "KEY"}}}
+ cmd95 := &cli.Command{Name: "ls", Usage: "List config files currently in use", Aliases: []string{"list"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "no-header", Aliases: []string{"no-headers"}, Usage: "Do not print table header", Local: true}, &cli.BoolFlag{Name: "tracked-configs", Usage: "List all tracked config files", Local: true}}}
+ cmd96 := &cli.Command{Name: "set", Usage: "Set the value of a setting in a mise.toml file", Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "file", Aliases: []string{"f", "path"}, Usage: "The path to the mise.toml file to edit", Local: true}, &cli.StringFlag{Name: "type", Aliases: []string{"t"}, Local: true, Value: "infer"}}, Arguments: []cli.Argument{&cli.StringArg{Name: "KEY"}, &cli.StringArg{Name: "VALUE"}}}
+ cmd97 := &cli.Command{Name: "config", Usage: "Manage config files", Aliases: []string{"cfg", "toml"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "no-header", Aliases: []string{"no-headers"}, Usage: "Do not print table header", Local: true}, &cli.BoolFlag{Name: "tracked-configs", Usage: "List all tracked config files", Local: true}}, Commands: []*cli.Command{cmd94, cmd95, cmd96}}
+ cmd98 := &cli.Command{Name: "current", Usage: "Shows current active and installed runtime versions", Description: "Shows current active and installed runtime versions\n\nThis is similar to `mise ls --current`, but this only shows the runtime and/or version. It's designed to fit into scripts more easily.", Hidden: true, Action: reached, Arguments: []cli.Argument{&cli.StringArg{Name: "PLUGIN"}}}
+ cmd99 := &cli.Command{Name: "deactivate", Usage: "Disable mise for current shell session", Description: "Disable mise for current shell session\n\nThis can be used to temporarily disable mise in a shell session.", Action: reached}
+ cmd100 := &cli.Command{Name: "activate", Usage: "Output direnv function to use mise inside direnv", Description: "Output direnv function to use mise inside direnv\n\nSee https://mise.jdx.dev/direnv.html for more information\n\nBecause this generates the idiomatic files based on currently installed plugins, you should run this command after installing new plugins. Otherwise direnv may not know to update environment variables when idiomatic file versions change.", Hidden: true, Action: reached}
+ cmd101 := &cli.Command{Name: "envrc", Usage: "[internal] This is an internal command that writes an envrc file\nfor direnv to consume.", Hidden: true, Action: reached}
+ cmd102 := &cli.Command{Name: "exec", Usage: "[internal] This is an internal command that writes an envrc file\nfor direnv to consume.", Hidden: true, Action: reached}
+ cmd103 := &cli.Command{Name: "direnv", Usage: "Output direnv function to use mise inside direnv", Description: "Output direnv function to use mise inside direnv\n\nSee https://mise.jdx.dev/direnv.html for more information\n\nBecause this generates the idiomatic files based on currently installed plugins, you should run this command after installing new plugins. Otherwise direnv may not know to update environment variables when idiomatic file versions change.", Hidden: true, Action: reached, Commands: []*cli.Command{cmd100, cmd101, cmd102}}
+ cmd104 := &cli.Command{Name: "add", Usage: "Add or update dotfiles in `[dotfiles]`", Description: "Add or update dotfiles in `[dotfiles]`\n\nIf the target is already managed, this updates its source from the live target. Otherwise it creates a `[dotfiles]` entry and seeds the source under `dotfiles.root` unless `--source` is provided.", Hidden: true, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "force", Aliases: []string{"f"}, Usage: "Overwrite existing sources without prompting", Local: true}, &cli.BoolFlag{Name: "global", Aliases: []string{"g"}, Usage: "Write to the global config", Local: true}, &cli.BoolFlag{Name: "local", Aliases: []string{"l"}, Usage: "Write to the local config instead of the global config", Local: true}, &cli.StringFlag{Name: "mode", Aliases: []string{"m"}, Usage: "Dotfile mode to write", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the config/source updates without writing anything", Local: true}, &cli.BoolFlag{Name: "no-apply", Usage: "Add the entry without applying it", Local: true}, &cli.StringFlag{Name: "path", Aliases: []string{"p"}, Usage: "Write to this config file or directory", Local: true}, &cli.StringFlag{Name: "source", Aliases: []string{"s"}, Usage: "Source path to use for a single target", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TARGET", Min: 1, Max: -1}}}
+ cmd105 := &cli.Command{Name: "apply", Usage: "Apply dotfiles from `[dotfiles]`", Description: "Apply dotfiles from `[dotfiles]`\n\nApplies configured whole-file entries and edits that aren't in their desired state. Whole-file entries may symlink, copy, or render templates. Edit entries manage a marker-delimited block or a single line in a file mise doesn't otherwise own.", Hidden: true, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "force", Aliases: []string{"f"}, Usage: "Overwrite existing files that conflict with whole-file dotfile entries", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the actions that would run without writing anything", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TARGET", Min: 0, Max: -1}}}
+ cmd106 := &cli.Command{Name: "edit", Usage: "Edit a managed dotfile source", Hidden: true, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "apply", Usage: "Apply this target after the editor exits", Local: true}, &cli.StringFlag{Name: "mode", Aliases: []string{"m"}, Usage: "Dotfile mode to use if the target is not yet managed", Local: true}, &cli.StringFlag{Name: "source", Aliases: []string{"s"}, Usage: "Source path to use if the target is not yet managed", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt when adding an unmanaged target", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "TARGET"}}}
+ cmd107 := &cli.Command{Name: "status", Usage: "Show the status of dotfiles from `[dotfiles]`", Aliases: []string{"ls"}, Hidden: true, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "missing", Usage: "Exit with code 1 if any configured dotfiles are not in their desired\nstate (missing, source missing, differs)", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TARGET", Min: 0, Max: -1}}}
+ cmd108 := &cli.Command{Name: "unapply", Usage: "Remove dotfiles applied from `[dotfiles]`", Description: "Remove dotfiles applied from `[dotfiles]`\n\nRemoves configured whole-file entries and edits while preserving files mise cannot identify as managed. Modified copies, templates, and plain-line edits require `--force`.", Hidden: true, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "force", Aliases: []string{"f"}, Usage: "Remove modified or otherwise ambiguous managed files and lines", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Print the actions that would run without writing anything", Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Skip the confirmation prompt", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TARGET", Min: 0, Max: -1}}}
+ cmd109 := &cli.Command{Name: "dotfiles", Usage: "Manage dotfiles from `[dotfiles]` (deprecated)", Description: "Manage dotfiles from `[dotfiles]` (deprecated)\n\nUse `mise bootstrap dotfiles` instead.", Hidden: true, Action: reached, Commands: []*cli.Command{cmd104, cmd105, cmd106, cmd107, cmd108}}
+ cmd110 := &cli.Command{Name: "path", Usage: "Print the current PATH entries mise is providing", Aliases: []string{"paths"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "full", Aliases: []string{"f"}, Usage: "Print all entries including those not provided by mise", Local: true}}}
+ cmd111 := &cli.Command{Name: "doctor", Usage: "Check mise installation for possible problems", Aliases: []string{"dr"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Local: true}}, Commands: []*cli.Command{cmd110}}
+ cmd112 := &cli.Command{Name: "en", Usage: "Starts a new shell with the mise environment built from the current configuration", Description: "Starts a new shell with the mise environment built from the current configuration\n\nThis is an alternative to `mise activate` that allows you to explicitly start a mise session. It will have the tools and environment variables in the configs loaded. Note that changing directories will not update the mise environment.", Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "shell", Aliases: []string{"s"}, Usage: "Shell to start", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "DIR"}}}
+ cmd113 := &cli.Command{Name: "env", Usage: "Exports env vars to activate mise a single time", Description: "Exports env vars to activate mise a single time\n\nUse this if you don't want to permanently install mise. It's not necessary to use this if you have `mise activate` in your shell rc file.", Aliases: []string{"e"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dotenv", Aliases: []string{"D"}, Usage: "Output in dotenv format", Local: true}, &cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.StringFlag{Name: "shell", Aliases: []string{"s"}, Usage: "Shell type to generate environment variables for", Local: true}, &cli.BoolFlag{Name: "json-extended", Usage: "Output in JSON format with additional information (source, tool)", Local: true}, &cli.BoolFlag{Name: "redacted", Usage: "Only show redacted environment variables", Local: true}, &cli.BoolFlag{Name: "values", Usage: "Only show values of environment variables", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TOOL@VERSION", Min: 0, Max: -1}}}
+ cmd114 := &cli.Command{Name: "exec", Usage: "Execute a command with tool(s) set", Description: "Execute a command with tool(s) set\n\nuse this to avoid modifying the shell session or running ad-hoc commands with mise tools set.\n\nTools will be loaded from mise.toml, though they can be overridden with args Note that only the plugin specified will be overridden, so if a `mise.toml` file includes \"node 20\" but you run `mise exec python@3.11`; it will still load node@20.\n\nThe \"--\" separates runtimes from the commands to pass along to the subprocess.", Aliases: []string{"x"}, Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "command", Aliases: []string{"c"}, Usage: "Command string to execute", Local: true}, &cli.StringFlag{Name: "jobs", Aliases: []string{"j"}, Usage: "Number of jobs to run in parallel\nValues below 1 are treated as 1\n[default: 4]", Local: true, Sources: cli.EnvVars("MISE_JOBS")}, &cli.StringSliceFlag{Name: "allow-env", Usage: "Allow specific env var through (implies --deny-env for everything else)\nSupports wildcards, e.g. --allow-env='MYAPP_*'", Local: true}, &cli.StringSliceFlag{Name: "allow-net", Usage: "Allow network to specific host (implies --deny-net for everything else)\nmacOS only in v1; on Linux falls back to allowing all network", Local: true}, &cli.StringSliceFlag{Name: "allow-read", Usage: "Allow reads from specific path (implies --deny-read for everything else)", Local: true}, &cli.StringSliceFlag{Name: "allow-write", Usage: "Allow writes to specific path (implies --deny-write for everything else)", Local: true}, &cli.BoolFlag{Name: "deny-all", Usage: "Block reads, writes, network, and env vars", Local: true}, &cli.BoolFlag{Name: "deny-env", Usage: "Block env var inheritance (only PATH, HOME, USER, SHELL, TERM, LANG pass through)", Local: true}, &cli.BoolFlag{Name: "deny-net", Usage: "Block all network access", Local: true}, &cli.BoolFlag{Name: "deny-read", Usage: "Block filesystem reads (system libs and tool dirs still accessible)", Local: true}, &cli.BoolFlag{Name: "deny-write", Usage: "Block all filesystem writes", Local: true}, &cli.BoolFlag{Name: "fresh-env", Usage: "Bypass the environment cache and recompute the environment", Local: true}, &cli.BoolFlag{Name: "no-deps", Usage: "Skip automatic dependency preparation", Local: true}, &cli.BoolFlag{Name: "raw", Usage: "Connect backend install command stdin/stdout/stderr directly to the terminal Implies --jobs=1", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TOOL@VERSION", Min: 0, Max: -1}, &cli.StringArgs{Name: "COMMAND", Min: 0, Max: -1}}}
+ cmd115 := &cli.Command{Name: "fmt", Usage: "Formats mise.toml", Description: "Formats mise.toml\n\nSorts keys and cleans up whitespace in mise.toml", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "all", Aliases: []string{"a"}, Usage: "Format all files from the current directory", Local: true}, &cli.BoolFlag{Name: "check", Aliases: []string{"c"}, Usage: "Check if the configs are formatted, no formatting is done", Local: true}, &cli.BoolFlag{Name: "stdin", Aliases: []string{"s"}, Usage: "Read config from stdin and write its formatted version into stdout", Local: true}}}
+ cmd116 := &cli.Command{Name: "bootstrap", Usage: "Generate a script to download+execute mise", Description: "Generate a script to download+execute mise\n\nThis is designed to be used in a project where contributors may not have mise installed.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "localize", Aliases: []string{"l"}, Usage: "Sandboxes mise internal directories like MISE_DATA_DIR and MISE_CACHE_DIR into a `.mise` directory in the project", Local: true}, &cli.StringFlag{Name: "version", Aliases: []string{"V"}, Usage: "Specify mise version to fetch", Local: true}, &cli.StringFlag{Name: "write", Aliases: []string{"w"}, Usage: "instead of outputting the script to stdout, write to a file and make it executable", Local: true}, &cli.StringFlag{Name: "localized-dir", Usage: "Directory to put localized data into", Local: true, Value: ".mise"}, &cli.BoolFlag{Name: "windows", Usage: "Also write a Windows launcher, `.cmd`", Local: true}}}
+ cmd117 := &cli.Command{Name: "config", Usage: "Generate a mise.toml file", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "global", Aliases: []string{"g"}, Usage: "Generate the global config file (~/.config/mise/config.toml)", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Show what would be generated without writing to file", Local: true}, &cli.StringFlag{Name: "tool-versions", Aliases: []string{"t"}, Usage: "Path to a .tool-versions file to import tools from", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "PATH"}}}
+ cmd118 := &cli.Command{Name: "devcontainer", Usage: "Generate a devcontainer to execute mise", Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "image", Aliases: []string{"i"}, Usage: "The image to use for the devcontainer", Local: true}, &cli.BoolFlag{Name: "mount-mise-data", Aliases: []string{"m"}, Usage: "Bind the mise-data-volume to the devcontainer", Local: true}, &cli.StringFlag{Name: "name", Aliases: []string{"n"}, Usage: "The name of the devcontainer", Local: true}, &cli.BoolFlag{Name: "write", Aliases: []string{"w"}, Usage: "write to .devcontainer/devcontainer.json", Local: true}}}
+ cmd119 := &cli.Command{Name: "git-pre-commit", Usage: "Generate a git pre-commit hook", Description: "Generate a git pre-commit hook\n\nThis command generates a git pre-commit hook that runs a mise task like `mise run pre-commit` when you commit changes to your repository.\n\nStaged files are passed to the task as `STAGED`.\n\nFor more advanced pre-commit functionality, see mise's sister project: https://hk.jdx.dev/", Aliases: []string{"pre-commit"}, Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "task", Aliases: []string{"t"}, Usage: "The task to run when the pre-commit hook is triggered", Local: true, Value: "pre-commit"}, &cli.BoolFlag{Name: "write", Aliases: []string{"w"}, Usage: "write to .git/hooks/pre-commit and make it executable", Local: true}, &cli.StringFlag{Name: "hook", Usage: "Which hook to generate (saves to .git/hooks/$hook)", Local: true, Value: "pre-commit"}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "MISE_ARG", Min: 0, Max: -1}}}
+ cmd120 := &cli.Command{Name: "github-action", Usage: "Generate a GitHub Action workflow file", Description: "Generate a GitHub Action workflow file\n\nThis command generates a GitHub Action workflow file that runs a mise task like `mise run ci` when you push changes to your repository.", Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "task", Aliases: []string{"t"}, Usage: "The task to run when the workflow is triggered", Local: true, Value: "ci"}, &cli.BoolFlag{Name: "write", Aliases: []string{"w"}, Usage: "write to .github/workflows/$name.yml", Local: true}, &cli.StringFlag{Name: "name", Usage: "the name of the workflow to generate", Local: true, Value: "ci"}}}
+ cmd121 := &cli.Command{Name: "task-docs", Usage: "Generate documentation for tasks in a project", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "inject", Aliases: []string{"i"}, Usage: "inserts the documentation into an existing file", Local: true}, &cli.BoolFlag{Name: "index", Aliases: []string{"I"}, Usage: "write only an index of tasks, intended for use with `--multi`", Local: true}, &cli.BoolFlag{Name: "multi", Aliases: []string{"m"}, Usage: "render each task as a separate document, requires `--output` to be a directory", Local: true}, &cli.StringFlag{Name: "output", Aliases: []string{"o"}, Usage: "writes the generated docs to a file/directory", Local: true}, &cli.StringFlag{Name: "root", Aliases: []string{"r"}, Usage: "root directory to search for tasks", Local: true}, &cli.StringFlag{Name: "style", Aliases: []string{"s"}, Local: true, Value: "simple"}}}
+ cmd122 := &cli.Command{Name: "task-stubs", Usage: "Generates shims to run mise tasks", Description: "Generates shims to run mise tasks\n\nBy default, this will build shims like ./bin/. These can be paired with `mise generate bootstrap` so contributors to a project can execute mise tasks without installing mise into their system. When a parent and nested task both exist, the parent stub is written to `/_default`.", Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "dir", Aliases: []string{"d"}, Usage: "Directory to create task stubs inside of", Local: true, Value: "bin"}, &cli.StringFlag{Name: "mise-bin", Aliases: []string{"m"}, Usage: "Path to a mise bin to use when running the task stub.", Local: true, Value: "mise"}}}
+ cmd123 := &cli.Command{Name: "tool-stub", Usage: "Generate a tool stub for HTTP-based tools", Description: "Generate a tool stub for HTTP-based tools\n\nThis command generates tool stubs that can automatically download and execute tools from HTTP URLs. It can detect checksums, file sizes, and binary paths automatically by downloading and analyzing the tool.\n\nWhen generating stubs with platform-specific URLs, the command will append new platforms to existing stub files rather than overwriting them. This allows you to incrementally build cross-platform tool stubs.", Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "bin", Aliases: []string{"b"}, Usage: "Binary path within the extracted archive", Local: true}, &cli.BoolFlag{Name: "bootstrap", Usage: "Wrap stub in a bootstrap script that installs mise if not already present", Local: true}, &cli.StringFlag{Name: "bootstrap-version", Usage: "Specify mise version for the bootstrap script", Local: true}, &cli.StringFlag{Name: "checksum-algorithm", Usage: "Checksum algorithm to use when downloading artifacts", Local: true, Value: "blake3"}, &cli.BoolFlag{Name: "fetch", Usage: "Fetch checksums and sizes for an existing tool stub file", Local: true}, &cli.StringFlag{Name: "http", Usage: "HTTP backend type to use", Local: true, Value: "http"}, &cli.BoolFlag{Name: "lock", Usage: "Resolve and embed lockfile data (exact version + platform URLs/checksums) into an existing stub file for reproducible installs without runtime API calls", Local: true}, &cli.StringSliceFlag{Name: "platform-bin", Usage: "Platform-specific binary paths in the format platform:path", Local: true}, &cli.StringSliceFlag{Name: "platform-url", Usage: "Platform-specific URLs in the format platform:url or just url (auto-detect platform)", Local: true}, &cli.BoolFlag{Name: "skip-download", Usage: "Skip downloading for checksum and binary path detection (faster but less informative)", Local: true}, &cli.StringFlag{Name: "url", Aliases: []string{"u"}, Usage: "URL for downloading the tool", Local: true}, &cli.StringFlag{Name: "version", Usage: "Version of the tool", Local: true, Value: "latest"}}, Arguments: []cli.Argument{&cli.StringArg{Name: "OUTPUT"}}}
+ cmd124 := &cli.Command{Name: "generate", Usage: "Generate files for various tools/services", Aliases: []string{"gen", "g"}, Action: reached, Commands: []*cli.Command{cmd116, cmd117, cmd118, cmd119, cmd120, cmd121, cmd122, cmd123}}
+ cmd125 := &cli.Command{Name: "token", Usage: "Display the GitHub token mise will use for a given host", Description: "Display the GitHub token mise will use for a given host\n\nShows which token source mise would use, useful for debugging authentication issues. The token is masked by default.", Hidden: true, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "oauth", Usage: "Force native GitHub OAuth device flow instead of normal token resolution", Local: true}, &cli.BoolFlag{Name: "raw", Usage: "Print only the token value", Local: true}, &cli.BoolFlag{Name: "refresh", Usage: "Mint a fresh OAuth token even if the cached one has not expired, via the refresh-token grant or a new device-code flow", Local: true}, &cli.BoolFlag{Name: "unmask", Usage: "Show the full unmasked token", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "HOST"}}}
+ cmd126 := &cli.Command{Name: "github", Usage: "GitHub related commands", Hidden: true, Action: reached, Commands: []*cli.Command{cmd125}}
+ cmd127 := &cli.Command{Name: "global", Usage: "Sets/gets the global tool version(s)", Description: "Sets/gets the global tool version(s)\n\nDisplays the contents of global config after writing. The file is `$HOME/.config/mise/config.toml` by default. It can be changed with `$MISE_GLOBAL_CONFIG_FILE`. If `$MISE_GLOBAL_CONFIG_FILE` is set to anything that ends in `.toml`, it will be parsed as `mise.toml`. Otherwise, it will be parsed as a `.tool-versions` file.\n\nUse MISE_ASDF_COMPAT=1 to default the global config to ~/.tool-versions\n\nUse `mise local` to set a tool version locally in the current directory.", Hidden: true, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "fuzzy", Usage: "Save fuzzy version to `~/.tool-versions`\ne.g.: `mise global --fuzzy node@20` will save `node 20` to ~/.tool-versions\nthis is the default behavior unless MISE_ASDF_COMPAT=1", Local: true}, &cli.BoolFlag{Name: "path", Usage: "Get the path of the global config file", Local: true}, &cli.BoolFlag{Name: "pin", Usage: "Save exact version to `~/.tool-versions`\ne.g.: `mise global --pin node@20` will save `node 20.0.0` to ~/.tool-versions", Local: true}, &cli.StringSliceFlag{Name: "remove", Aliases: []string{"rm", "unset"}, Usage: "Remove the tool(s) from ~/.tool-versions", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TOOL@VERSION", Min: 0, Max: -1}}}
+ cmd128 := &cli.Command{Name: "hook-env", Usage: "[internal] called by activate hook to update env vars directory change", Hidden: true, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "force", Aliases: []string{"f"}, Usage: "Skip early exit check", Local: true}, &cli.BoolFlag{Name: "quiet", Aliases: []string{"q"}, Usage: "Hide warnings such as when a tool is not installed", Local: true}, &cli.StringFlag{Name: "shell", Aliases: []string{"s"}, Usage: "Shell type to generate script for", Local: true}, &cli.StringFlag{Name: "reason", Usage: "Reason for calling hook-env (e.g., \"precmd\", \"chpwd\")", Hidden: true, Local: true}, &cli.BoolFlag{Name: "status", Usage: "Show \"mise: @\" message when changing directories", Hidden: true, Local: true}}}
+ cmd129 := &cli.Command{Name: "hook-not-found", Usage: "[internal] called by shell when a command is not found", Hidden: true, Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "shell", Aliases: []string{"s"}, Usage: "Shell type to generate script for", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "BIN"}}}
+ cmd130 := &cli.Command{Name: "implode", Usage: "Removes mise CLI and all related data", Description: "Removes mise CLI and all related data\n\nSkips config directory by default.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "List directories that would be removed without actually removing them", Local: true}, &cli.BoolFlag{Name: "config", Usage: "Also remove config directory", Local: true}}}
+ cmd131 := &cli.Command{Name: "edit", Usage: "Edit mise.toml interactively", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "global", Aliases: []string{"g"}, Usage: "Edit the global config file (~/.config/mise/config.toml)", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Show what would be generated without writing to file", Local: true}, &cli.StringFlag{Name: "tool-versions", Aliases: []string{"t"}, Usage: "Path to a .tool-versions file to import tools from", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "PATH"}}}
+ cmd132 := &cli.Command{Name: "install", Usage: "Install a tool version", Description: "Install a tool version\n\nInstalls a tool version to `~/.local/share/mise/installs//` Installing alone will not activate the tools so they won't be in PATH. To install and/or activate in one command, use `mise use` which will create a `mise.toml` file in the current directory to activate this tool when inside the directory. Alternatively, run `mise exec @ -- ` to execute a tool without creating config files.\n\nTools will be installed in parallel. To disable, set `--jobs=1` or `MISE_JOBS=1`", Aliases: []string{"i"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "force", Aliases: []string{"f"}, Usage: "Force reinstall even if already installed\nWith no tools specified, reinstall all configured tools", Local: true}, &cli.StringFlag{Name: "jobs", Aliases: []string{"j"}, Usage: "Number of jobs to run in parallel\nValues below 1 are treated as 1\n[default: 4]", Local: true, Sources: cli.EnvVars("MISE_JOBS")}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Show what would be installed without actually installing", Local: true}, &cli.BoolFlag{Name: "verbose", Aliases: []string{"v"}, Usage: "Show installation output", Local: true, Config: cli.BoolConfig{Count: new(int)}}, &cli.BoolFlag{Name: "dry-run-code", Usage: "Like --dry-run but exits with code 1 if there are tools to install", Local: true}, &cli.BoolFlag{Name: "include-task-tools", Usage: "Also install tools required by tasks in the current scope", Local: true}, &cli.StringFlag{Name: "minimum-release-age", Aliases: []string{"before"}, Usage: "Only install versions released before this date or older than this duration", Local: true}, &cli.BoolFlag{Name: "monorepo", Usage: "Install tools from every [monorepo].config_roots config root", Local: true, Sources: cli.EnvVars("MISE_MONOREPO")}, &cli.BoolFlag{Name: "raw", Usage: "Connect backend install command stdin/stdout/stderr directly to the terminal Implies --jobs=1", Local: true}, &cli.StringFlag{Name: "shared", Usage: "Install tool(s) to a shared directory", Local: true}, &cli.BoolFlag{Name: "system", Usage: "Install tool(s) to the system-wide shared directory", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TOOL@VERSION", Min: 0, Max: -1}}}
+ cmd133 := &cli.Command{Name: "install-into", Usage: "Install a tool version to a specific path", Description: "Install a tool version to a specific path\n\nUsed for building a tool to a directory for use outside of mise", Action: reached, Arguments: []cli.Argument{&cli.StringArg{Name: "TOOL@VERSION"}, &cli.StringArg{Name: "PATH"}}}
+ cmd134 := &cli.Command{Name: "latest", Usage: "Gets the latest available version for a plugin", Description: "Gets the latest available version for a plugin\n\nSupports prefixes such as `node@20` to get the latest version of node 20.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "installed", Aliases: []string{"i"}, Usage: "Show latest installed instead of available version", Local: true}, &cli.StringFlag{Name: "minimum-release-age", Aliases: []string{"before"}, Usage: "Only consider versions released before this date or older than this duration", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "TOOL@VERSION"}, &cli.StringArg{Name: "ASDF_VERSION"}}}
+ cmd135 := &cli.Command{Name: "link", Usage: "Symlinks a tool version into mise", Description: "Symlinks a tool version into mise\n\nUse this for adding installs either custom compiled outside mise or built with a different tool.", Aliases: []string{"ln"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "force", Aliases: []string{"f"}, Usage: "Overwrite an existing tool version if it exists", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "TOOL@VERSION"}, &cli.StringArg{Name: "PATH"}}}
+ cmd136 := &cli.Command{Name: "local", Usage: "Sets/gets tool version in local .tool-versions or mise.toml", Description: "Sets/gets tool version in local .tool-versions or mise.toml\n\nUse this to set a tool's version when within a directory Use `mise global` to set a tool version globally This uses `.tool-version` by default unless there is a `mise.toml` file or if `MISE_USE_TOML` is set. A future v2 release of mise will default to using `mise.toml`.", Aliases: []string{"l"}, Hidden: true, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "parent", Aliases: []string{"p"}, Usage: "Recurse up to find a .tool-versions file rather than using the current directory only\nby default this command will only set the tool in the current directory (\"$PWD/.tool-versions\")", Local: true}, &cli.BoolFlag{Name: "fuzzy", Usage: "Save fuzzy version to `.tool-versions` e.g.: `mise local --fuzzy node@20` will save `node 20` to .tool-versions This is the default behavior unless MISE_ASDF_COMPAT=1", Local: true}, &cli.BoolFlag{Name: "path", Usage: "Get the path of the config file", Local: true}, &cli.BoolFlag{Name: "pin", Usage: "Save exact version to `.tool-versions`\ne.g.: `mise local --pin node@20` will save `node 20.0.0` to .tool-versions", Local: true}, &cli.StringSliceFlag{Name: "remove", Aliases: []string{"rm", "unset"}, Usage: "Remove the tool(s) from .tool-versions", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TOOL@VERSION", Min: 0, Max: -1}}}
+ cmd137 := &cli.Command{Name: "lock", Usage: "Update lockfile checksums and URLs for all specified platforms", Description: "Update lockfile checksums and URLs for all specified platforms\n\nUpdates checksums and download URLs for all platforms already specified in the lockfile. If no lockfile exists, shows what would be created based on the current configuration, including tools declared by tasks. This allows you to refresh lockfile data for platforms other than the one you're currently on. Operates on the lockfile in the current config root. Use TOOL arguments to target specific tools.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "global", Aliases: []string{"g"}, Usage: "Target only global config lockfiles (~/.config/mise/mise.lock and system config)\nBy default, only the active project config root is locked", Local: true}, &cli.StringFlag{Name: "jobs", Aliases: []string{"j"}, Usage: "Number of jobs to run in parallel\nValues below 1 are treated as 1", Local: true, Sources: cli.EnvVars("MISE_JOBS")}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Show what would be updated without making changes", Local: true}, &cli.StringSliceFlag{Name: "platform", Aliases: []string{"p"}, Usage: "Comma-separated list of platforms to target\ne.g.: linux-x64,macos-arm64,windows-x64\nIf not specified, all platforms already in lockfile will be updated", Local: true}, &cli.BoolFlag{Name: "bump", Usage: "Re-resolve fuzzy version selectors against the latest available versions", Local: true}, &cli.BoolFlag{Name: "json", Usage: "Output version changes as JSON", Local: true}, &cli.BoolFlag{Name: "local", Usage: "Update mise.local.lock instead of mise.lock\nUse for tools defined in .local.toml configs", Local: true}, &cli.StringFlag{Name: "minimum-release-age", Aliases: []string{"before"}, Usage: "Only lock versions released before this age or date", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TOOL", Min: 0, Max: -1}}}
+ cmd138 := &cli.Command{Name: "ls", Usage: "List installed and active tool versions", Description: "List installed and active tool versions\n\nThis command lists tools that mise \"knows about\". These may be tools that are currently installed, or those that are in a config file (active) but may or may not be installed.\n\nIt's a useful command to get the current state of your tools.", Aliases: []string{"list"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "current", Aliases: []string{"c"}, Usage: "Only show tool versions currently specified in a mise.toml", Local: true}, &cli.BoolFlag{Name: "global", Aliases: []string{"g"}, Usage: "Only show tool versions currently specified in the global mise.toml", Local: true}, &cli.BoolFlag{Name: "installed", Aliases: []string{"i"}, Usage: "Only show tool versions that are installed (Hides tools defined in mise.toml but not installed)", Local: true}, &cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "local", Aliases: []string{"l"}, Usage: "Only show tool versions currently specified in the local mise.toml", Local: true}, &cli.BoolFlag{Name: "missing", Aliases: []string{"m"}, Usage: "Display missing tool versions", Local: true}, &cli.BoolFlag{Name: "offline", Aliases: []string{"o"}, Usage: "Don't fetch information such as outdated versions", Hidden: true, Local: true}, &cli.StringFlag{Name: "plugin", Aliases: []string{"p"}, Hidden: true, Local: true}, &cli.BoolFlag{Name: "all-sources", Usage: "Display all tracked config sources for tools", Local: true}, &cli.BoolFlag{Name: "monorepo", Usage: "List tools from every [monorepo].config_roots config root", Local: true, Sources: cli.EnvVars("MISE_MONOREPO")}, &cli.BoolFlag{Name: "no-header", Aliases: []string{"no-headers"}, Usage: "Don't display headers", Local: true}, &cli.BoolFlag{Name: "outdated", Usage: "Display whether a version is outdated", Local: true}, &cli.StringFlag{Name: "prefix", Usage: "Display versions matching this prefix", Local: true}, &cli.BoolFlag{Name: "prunable", Usage: "List only tools that can be pruned with `mise prune`", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "INSTALLED_TOOL", Min: 0, Max: -1}}}
+ cmd139 := &cli.Command{Name: "ls-remote", Usage: "List runtime versions available for install.", Description: "List runtime versions available for install.\n\nNote that the results may be cached, run `mise cache clean` to clear the cache and get fresh results.", Aliases: []string{"list-all", "list-remote"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "all", Usage: "Show all installed plugins and versions", Local: true}, &cli.StringFlag{Name: "minimum-release-age", Aliases: []string{"before"}, Usage: "Only show versions released before this age or date", Local: true}, &cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format (includes version metadata like created_at timestamps when available)", Local: true}, &cli.BoolFlag{Name: "no-versions-host", Usage: "Disable checking the mise-versions host", Local: true}, &cli.BoolFlag{Name: "prerelease", Usage: "Include pre-release versions in the output for backends that report\nupstream prerelease metadata or opt in to regex-based prerelease\ndetection. Equivalent to setting `MISE_PRERELEASES=1` or the\n`prereleases` setting for the duration of this command.", Local: true}, &cli.BoolFlag{Name: "strict-metadata", Usage: "Fail if release metadata fetches fail", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "TOOL@VERSION"}, &cli.StringArg{Name: "PREFIX"}}}
+ cmd140 := &cli.Command{Name: "mcp", Usage: "Run Model Context Protocol (MCP) server", Description: "Run Model Context Protocol (MCP) server\n\nThis command starts an MCP server that exposes mise functionality to AI assistants over stdin/stdout using JSON-RPC protocol.\n\nThe MCP server provides access to: - Installed and available tools - Task definitions and execution - Environment variables - Configuration information - Task execution via the run_task tool\n\nResources available: - mise://tools - List all tools (use ?include_inactive=true to include inactive tools) - mise://tasks - List all tasks with their configurations - mise://env - List all environment variables - mise://config - Show configuration files and project root\n\nTools available: - list_commands - Every mise command, with its declared effect on the world - install_tool - Install a tool with an optional version (not yet implemented) - run_task - Execute a mise task with optional arguments\n\nNote: This is primarily intended for integration with AI assistants like Claude, Cursor, or other tools that support the Model Context Protocol.", Action: reached}
+ cmd141 := &cli.Command{Name: "build", Usage: "[experimental] Build an OCI image from the current mise.toml", Description: "[experimental] Build an OCI image from the current mise.toml\n\nEach tool version becomes its own content-addressable OCI layer. Bumping a tool version only invalidates that tool's layer — other tools, the base image, and config are reused unchanged. The output directory conforms to the OCI image-layout spec and can be consumed by `skopeo`, `crane`, or `podman load`.\n\nRequires `mise settings experimental=true` (or `MISE_EXPERIMENTAL=1`).", Action: reached, Flags: []cli.Flag{&cli.StringSliceFlag{Name: "copy", Usage: "Copy a host file, directory, or symlink into the image (repeatable, HOST:IMAGE)", Local: true}, &cli.StringFlag{Name: "output", Aliases: []string{"o"}, Usage: "Output directory for the OCI image layout", Local: true, Value: "./mise-oci"}, &cli.StringFlag{Name: "from", Usage: "Base image reference (overrides [oci].from and the oci.default_from setting)", Local: true}, &cli.BoolFlag{Name: "include-global", Usage: "Also include tools from the global / system config (default: project-only)", Local: true}, &cli.StringFlag{Name: "tag", Aliases: []string{"t"}, Usage: "Tag to record in the image index (the org.opencontainers.image.ref.name annotation)", Local: true}, &cli.StringFlag{Name: "mount-point", Usage: "Where to place tool installs inside the image (default: /mise)", Local: true}, &cli.BoolFlag{Name: "no-mise", Usage: "Do not embed the currently-running mise binary at /usr/local/bin/mise", Local: true}, &cli.StringFlag{Name: "owner", Usage: "UID[:GID] to assign to every tar entry in generated layers", Local: true}}}
+ cmd142 := &cli.Command{Name: "push", Usage: "[experimental] Build an OCI image and push it to a registry", Description: "[experimental] Build an OCI image and push it to a registry\n\nPushes with mise's built-in registry client — no skopeo/crane/docker required. If `--image-dir` is not passed, builds fresh from the current mise.toml first. Only blobs the registry doesn't already have are uploaded, so repeat pushes of mostly-unchanged toolsets are cheap.\n\nTool layers whose tool, version, mount point, and file owner match the previously pushed image (or `--cache-from`) are reused without being rebuilt — those tools don't even need to be installed locally. Pass `--no-cache` to force a full local rebuild.\n\nCredentials are read from the same places docker and podman use: `$REGISTRY_AUTH_FILE`, `$XDG_RUNTIME_DIR/containers/auth.json`, `~/.config/containers/auth.json`, and `~/.docker/config.json` (including credential helpers) — so `docker login` / `podman login` is all the setup needed.\n\nRequires `mise settings experimental=true` (or `MISE_EXPERIMENTAL=1`).", Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "cache-from", Usage: "Reuse unchanged tool layers from this image instead of the destination ref", Local: true}, &cli.StringFlag{Name: "from", Usage: "Base image for the build (ignored with --image-dir)", Local: true}, &cli.StringFlag{Name: "image-dir", Usage: "Push an already-built OCI image layout (skip the build step)", Local: true}, &cli.BoolFlag{Name: "include-global", Usage: "Also include tools from the global / system config (default: project-only)", Local: true}, &cli.StringFlag{Name: "mount-point", Usage: "Override in-image mount point (ignored with --image-dir)", Local: true}, &cli.BoolFlag{Name: "no-cache", Usage: "Don't reuse tool layers from the previously pushed image", Local: true}, &cli.BoolFlag{Name: "no-mise", Usage: "Don't embed the mise binary (ignored with --image-dir)", Local: true}, &cli.StringFlag{Name: "owner", Usage: "UID[:GID] to assign to every tar entry when building (conflicts with --image-dir)", Local: true}, &cli.BoolFlag{Name: "update-index", Usage: "Maintain the tag as a multi-arch image index", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "REF"}}}
+ cmd143 := &cli.Command{Name: "run", Usage: "[experimental] Build an OCI image from the current mise.toml and run a command in it", Description: "[experimental] Build an OCI image from the current mise.toml and run a command in it\n\nEquivalent to `mise oci build` followed by `docker run` / `podman run`. The built image is loaded into the local container engine (podman pulls the OCI layout natively; docker receives it via `docker load`) and the given command is executed inside it with stdin/stdout/stderr inherited.\n\nRequires `mise settings experimental=true` (or `MISE_EXPERIMENTAL=1`) and one of: `podman`, `docker`.", Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "engine", Usage: "Container engine to use (`auto`, `podman`, or `docker`)", Local: true, Value: "auto"}, &cli.StringFlag{Name: "from", Usage: "Base image reference for the build (ignored with --image-dir)", Local: true}, &cli.StringFlag{Name: "image-dir", Usage: "Use an already-built OCI image layout instead of building fresh", Local: true}, &cli.BoolFlag{Name: "include-global", Usage: "Also include tools from the global / system config (default: project-only)", Local: true}, &cli.BoolFlag{Name: "keep", Usage: "Keep the loaded image in the engine's storage after the run", Local: true}, &cli.StringFlag{Name: "mount-point", Usage: "Override in-image mount point (ignored with --image-dir)", Local: true}, &cli.BoolFlag{Name: "no-mise", Usage: "Don't embed the mise binary (ignored with --image-dir)", Local: true}, &cli.StringFlag{Name: "owner", Usage: "UID[:GID] to assign to every tar entry when building (conflicts with --image-dir)", Local: true}, &cli.StringSliceFlag{Name: "volume", Aliases: []string{"mount"}, Usage: "Bind-mount a host path (repeatable, `HOST:CONTAINER[:MODE]`)", Local: true}, &cli.StringSliceFlag{Name: "env", Aliases: []string{"e"}, Usage: "Set environment variable in the container (repeatable, `KEY=VAL`)", Local: true}, &cli.BoolFlag{Name: "interactive", Aliases: []string{"i"}, Usage: "Run interactively (pass `-i` to the engine)", Local: true}, &cli.BoolFlag{Name: "tty", Aliases: []string{"t"}, Usage: "Allocate a TTY (pass `-t` to the engine)", Local: true}, &cli.StringFlag{Name: "workdir", Aliases: []string{"w"}, Usage: "Working directory inside the container", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "CMD", Min: 0, Max: -1}}}
+ cmd144 := &cli.Command{Name: "oci", Usage: "[experimental] Build OCI container images from a mise.toml", Description: "[experimental] Build OCI container images from a mise.toml\n\nEach tool becomes its own OCI layer, so bumping any single tool version only invalidates one content-addressable blob — unlike a Dockerfile where changing an early `RUN` invalidates every layer above it.\n\nThis command is experimental and requires `mise settings experimental=true` (or `MISE_EXPERIMENTAL=1`). Behavior, flags, and output layout may change in future releases.", Action: reached, Commands: []*cli.Command{cmd141, cmd142, cmd143}}
+ cmd145 := &cli.Command{Name: "outdated", Usage: "Shows outdated tool versions", Description: "Shows outdated tool versions\n\nSee `mise upgrade` to upgrade these versions.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "bump", Aliases: []string{"b"}, Usage: "Compares against the latest versions available, not what matches the current config", Local: true}, &cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "inactive", Usage: "Show outdated tools including installed-but-inactive tools not present in the current config", Local: true}, &cli.BoolFlag{Name: "local", Usage: "Only show outdated tools defined in local config files", Local: true}, &cli.BoolFlag{Name: "monorepo", Usage: "Placeholder for future monorepo outdated checks; `mise outdated --monorepo` is not implemented yet.", Local: true}, &cli.BoolFlag{Name: "no-header", Usage: "Don't show table header", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TOOL@VERSION", Min: 0, Max: -1}}}
+ cmd146 := &cli.Command{Name: "patrons", Usage: "Show the individuals supporting mise as Patron-tier members", Description: "Show the individuals supporting mise as Patron-tier members\n\nLists the individuals on the Patron tier from . The list refreshes daily; supporting terminals will render each patron's name as a clickable link via OSC 8 hyperlinks.\n\nTo appear here, become a patron at .", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "refresh", Usage: "Bypass the local cache and re-fetch", Local: true}}}
+ cmd147 := &cli.Command{Name: "install", Usage: "Install a plugin", Description: "Install a plugin\n\nnote that mise can automatically install plugins when you install a tool e.g.: `mise install cmake@3.30` will autoinstall the cmake plugin\n\nThis behavior can be modified in ~/.config/mise/config.toml", Aliases: []string{"i", "a", "add"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "all", Aliases: []string{"a"}, Usage: "Install all missing plugins\nThis will only install plugins that have matching shorthands.\ni.e.: they don't need the full git repo url", Local: true}, &cli.BoolFlag{Name: "force", Aliases: []string{"f"}, Usage: "Reinstall even if plugin exists", Local: true}, &cli.StringFlag{Name: "jobs", Aliases: []string{"j"}, Usage: "Number of jobs to run in parallel\nValues below 1 are treated as 1", Local: true}, &cli.BoolFlag{Name: "verbose", Aliases: []string{"v"}, Usage: "Show installation output", Local: true, Config: cli.BoolConfig{Count: new(int)}}}, Arguments: []cli.Argument{&cli.StringArg{Name: "NEW_PLUGIN"}, &cli.StringArg{Name: "GIT_URL"}, &cli.StringArgs{Name: "REST", Min: 0, Max: -1}}}
+ cmd148 := &cli.Command{Name: "link", Usage: "Symlinks a plugin into mise", Description: "Symlinks a plugin into mise\n\nThis is used for developing a plugin.", Aliases: []string{"ln"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "force", Aliases: []string{"f"}, Usage: "Overwrite existing plugin", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "NAME"}, &cli.StringArg{Name: "DIR"}}}
+ cmd149 := &cli.Command{Name: "ls", Usage: "List installed plugins", Description: "List installed plugins\n\nCan also show remotely available plugins to install.", Aliases: []string{"list"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "all", Aliases: []string{"a"}, Usage: "List all available remote plugins\nSame as `mise plugins ls-remote`", Hidden: true, Local: true}, &cli.BoolFlag{Name: "core", Aliases: []string{"c"}, Usage: "The built-in plugins only\nNormally these are not shown", Hidden: true, Local: true}, &cli.BoolFlag{Name: "outdated", Aliases: []string{"o"}, Usage: "Show plugins with available updates\nChecks the remote for newer versions and only displays plugins that are outdated", Local: true}, &cli.BoolFlag{Name: "urls", Aliases: []string{"u", "url"}, Usage: "Show the git url for each plugin\ne.g.: https://github.com/mise-plugins/vfox-cmake.git", Local: true}, &cli.BoolFlag{Name: "refs", Usage: "Show the git refs for each plugin\ne.g.: main 1234abc", Hidden: true, Local: true}, &cli.BoolFlag{Name: "user", Usage: "List installed plugins", Hidden: true, Local: true}}}
+ cmd150 := &cli.Command{Name: "ls-remote", Usage: "List all available remote plugins", Description: "\nList all available remote plugins\n\nThe full list is here: https://github.com/jdx/mise/blob/main/registry/\n\nExamples:\n\n $ mise plugins ls-remote\n", Aliases: []string{"list-remote", "list-all"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "urls", Aliases: []string{"u"}, Usage: "Show the git url for each plugin e.g.: https://github.com/mise-plugins/mise-poetry.git", Local: true}, &cli.BoolFlag{Name: "only-names", Usage: "Only show the name of each plugin by default it will show a \"*\" next to installed plugins", Local: true}}}
+ cmd151 := &cli.Command{Name: "uninstall", Usage: "Removes a plugin", Aliases: []string{"remove", "rm"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "all", Aliases: []string{"a"}, Usage: "Remove all plugins", Local: true}, &cli.BoolFlag{Name: "purge", Aliases: []string{"p"}, Usage: "Also remove the plugin's installs, downloads, and cache", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "PLUGIN", Min: 0, Max: -1}}}
+ cmd152 := &cli.Command{Name: "update", Usage: "Updates a plugin to the latest version", Description: "Updates a plugin to the latest version\n\nnote: this updates the plugin itself, not the runtime versions", Aliases: []string{"up", "upgrade"}, Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "jobs", Aliases: []string{"j"}, Usage: "Number of jobs to run in parallel\nValues below 1 are treated as 1\nDefault: 4", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "PLUGIN", Min: 0, Max: -1}}}
+ cmd153 := &cli.Command{Name: "plugins", Usage: "Manage plugins", Aliases: []string{"p", "plugin", "plugin-list"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "all", Aliases: []string{"a"}, Usage: "list all available remote plugins", Hidden: true, Local: true}, &cli.BoolFlag{Name: "core", Aliases: []string{"c"}, Usage: "The built-in plugins only\nNormally these are not shown", Local: true}, &cli.BoolFlag{Name: "urls", Aliases: []string{"u", "url"}, Usage: "Show the git url for each plugin\ne.g.: https://github.com/mise-plugins/vfox-cmake.git", Local: true}, &cli.BoolFlag{Name: "refs", Usage: "Show the git refs for each plugin\ne.g.: main 1234abc", Hidden: true, Local: true}, &cli.BoolFlag{Name: "user", Usage: "List installed plugins", Local: true}}, Commands: []*cli.Command{cmd147, cmd148, cmd149, cmd150, cmd151, cmd152}}
+ cmd154 := &cli.Command{Name: "add", Usage: "Add a dependency", Description: "Add a dependency\n\nAdds one or more packages to the project using the appropriate package manager. Package specs use the format `ecosystem:package`, e.g., `npm:react` or `npm:@types/react@19`.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dev", Aliases: []string{"D"}, Usage: "Add as a development dependency", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "PACKAGES", Min: 1, Max: -1}}}
+ cmd155 := &cli.Command{Name: "install", Usage: "Install all project dependencies", Description: "Install all project dependencies\n\nChecks if dependency lockfiles are newer than installed outputs and runs install commands if needed.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "explain", Usage: "Show why a provider is fresh or stale (requires a provider argument)", Local: true}, &cli.BoolFlag{Name: "force", Aliases: []string{"f"}, Usage: "Force run all deps steps even if outputs are fresh", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Only check if deps install is needed, don't run commands", Local: true}, &cli.BoolFlag{Name: "list", Usage: "Show what deps providers are available", Local: true}, &cli.BoolFlag{Name: "monorepo", Usage: "Install dependencies from every [monorepo].config_roots config root", Local: true, Sources: cli.EnvVars("MISE_MONOREPO")}, &cli.StringSliceFlag{Name: "only", Usage: "Run specific deps rule(s) only", Local: true}, &cli.StringSliceFlag{Name: "skip", Usage: "Skip specific deps rule(s)", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "PROVIDER"}}}
+ cmd156 := &cli.Command{Name: "remove", Usage: "Remove a dependency", Description: "Remove a dependency\n\nRemoves one or more packages from the project using the appropriate package manager. Package specs use the format `ecosystem:package`, e.g., `npm:lodash`.", Action: reached, Arguments: []cli.Argument{&cli.StringArgs{Name: "PACKAGES", Min: 1, Max: -1}}}
+ cmd157 := &cli.Command{Name: "deps", Usage: "[experimental] Manage project dependencies", Description: "[experimental] Manage project dependencies\n\nRuns all applicable dependency install steps for the current project. This checks if dependency lockfiles are newer than installed outputs (e.g., package-lock.json vs node_modules/) and runs install commands if needed.\n\nProviders with `auto = true` are automatically invoked before `mise x` and `mise run` unless skipped with the --no-deps flag.", Aliases: []string{"dep", "prepare"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "explain", Usage: "Show why a provider is fresh or stale (requires a provider argument)", Local: true}, &cli.BoolFlag{Name: "force", Aliases: []string{"f"}, Usage: "Force run all deps steps even if outputs are fresh", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Only check if deps install is needed, don't run commands", Local: true}, &cli.BoolFlag{Name: "list", Usage: "Show what deps providers are available", Local: true}, &cli.BoolFlag{Name: "monorepo", Usage: "Install dependencies from every [monorepo].config_roots config root", Local: true, Sources: cli.EnvVars("MISE_MONOREPO")}, &cli.StringSliceFlag{Name: "only", Usage: "Run specific deps rule(s) only", Local: true}, &cli.StringSliceFlag{Name: "skip", Usage: "Skip specific deps rule(s)", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "PROVIDER"}}, Commands: []*cli.Command{cmd154, cmd155, cmd156}}
+ cmd158 := &cli.Command{Name: "prune", Usage: "Delete unused versions of tools", Description: "Delete unused versions of tools\n\nmise tracks which config files have been used in ~/.local/state/mise/tracked-configs Versions which are no longer the latest specified in any of those configs are deleted. Versions installed only with environment variables `MISE__VERSION` will be deleted, as will versions only referenced on the command line `mise exec @`.\n\nTool stubs that have been executed are tracked in ~/.local/state/mise/tracked-stubs. Versions still referenced by a tracked stub are not deleted.\n\nYou can list prunable tools with `mise ls --prunable`", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Do not actually delete anything", Local: true}, &cli.BoolFlag{Name: "configs", Usage: "Prune only tracked and trusted configuration links that point to nonexistent configurations", Local: true}, &cli.BoolFlag{Name: "dry-run-code", Usage: "Like --dry-run but exits with code 1 if there are tools to prune", Local: true}, &cli.BoolFlag{Name: "monorepo", Usage: "Placeholder for future monorepo pruning; `mise prune --monorepo` is not implemented yet.", Local: true}, &cli.BoolFlag{Name: "tools", Usage: "Prune only unused versions of tools", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "INSTALLED_TOOL", Min: 0, Max: -1}}}
+ cmd159 := &cli.Command{Name: "registry", Usage: "List available tools to install", Description: "List available tools to install\n\nThis command lists the tools available in the registry as shorthand names.\n\nFor example, `poetry` is shorthand for `asdf:mise-plugins/mise-poetry`.", Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "backend", Aliases: []string{"b"}, Usage: "Show only tools for this backend", Local: true}, &cli.BoolFlag{Name: "complete", Usage: "Print all tools with descriptions for shell completions", Hidden: true, Local: true}, &cli.BoolFlag{Name: "hide-aliased", Usage: "Hide aliased tools", Local: true}, &cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "security", Usage: "Include security features for each tool's backends in JSON output.", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "NAME"}}}
+ cmd160 := &cli.Command{Name: "render-help", Usage: "internal command to generate markdown from help", Hidden: true, Action: reached}
+ cmd161 := &cli.Command{Name: "reshim", Usage: "Creates new shims based on bin paths from currently installed tools.", Description: "Creates new shims based on bin paths from currently installed tools.\n\nThis creates new shims in ~/.local/share/mise/shims for CLIs that have been added. mise will try to do this automatically for commands like `npm i -g` but there are other ways to install things (like using yarn or pnpm for node) that mise does not know about and so it will be necessary to call this explicitly.\n\nIf you think mise should automatically call this for a particular command, please open an issue on the mise repo. You can also set up a shell function to reshim automatically (it's really fast so you don't need to worry about overhead):\n\n npm() {\n command npm \"$@\"\n mise reshim\n }\n\nNote that this creates shims for _all_ installed tools, not just the ones that are currently active in mise.toml.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "force", Aliases: []string{"f"}, Usage: "Removes all shims before reshimming", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "TOOL"}, &cli.StringArg{Name: "VERSION"}}}
+ cmd162 := &cli.Command{Name: "run", Usage: "Run task(s)", Description: "Run task(s)\n\nThis command will run a task, or multiple tasks in parallel. Tasks may have dependencies on other tasks or on source files. If source is configured on a task, it will only run if the source files have changed.\n\nTasks can be defined in mise.toml or as standalone scripts. In mise.toml, tasks take this form:\n\n [tasks.build]\n run = \"npm run build\"\n sources = [\"src/**/*.ts\"]\n outputs = [\"dist/**/*.js\"]\n\nAlternatively, tasks can be defined as standalone scripts. These must be located in `mise-tasks`, `.mise-tasks`, `.mise/tasks`, `mise/tasks` or `.config/mise/tasks`. The name of the script will be the name of the tasks.\n\n $ cat .mise/tasks/build<` to create/modify environment-specific config files like `mise..toml`.", Aliases: []string{"ev", "env-vars"}, Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "env", Aliases: []string{"E"}, Usage: "Create/modify an environment-specific config file like .mise..toml", Local: true}, &cli.BoolFlag{Name: "global", Aliases: []string{"g"}, Usage: "Set the environment variable in the global config file", Local: true}, &cli.BoolFlag{Name: "age-encrypt", Usage: "[experimental] Encrypt the value with age before storing", Local: true}, &cli.StringFlag{Name: "age-key-file", Usage: "[experimental] Age identity file for encryption", Local: true}, &cli.StringSliceFlag{Name: "age-recipient", Usage: "[experimental] Age recipient (x25519 public key) for encryption", Local: true}, &cli.StringSliceFlag{Name: "age-ssh-recipient", Usage: "[experimental] SSH recipient (public key or path) for age encryption", Local: true}, &cli.BoolFlag{Name: "complete", Usage: "Render completions", Hidden: true, Local: true}, &cli.StringFlag{Name: "file", Aliases: []string{"path"}, Usage: "The TOML file to update", Local: true}, &cli.BoolFlag{Name: "no-redact", Usage: "Show raw values instead of redacting secrets", Local: true}, &cli.BoolFlag{Name: "prompt", Usage: "Prompt for environment variable values", Local: true}, &cli.StringSliceFlag{Name: "remove", Aliases: []string{"rm", "unset"}, Usage: "Remove the environment variable from config file", Hidden: true, Local: true}, &cli.BoolFlag{Name: "stdin", Usage: "Read the value from stdin (for multiline input)", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "ENV_VAR", Min: 0, Max: -1}}}
+ cmd166 := &cli.Command{Name: "add", Usage: "Adds a setting to the configuration file", Description: "Adds a setting to the configuration file\n\nUsed with an array setting, this will append the value to the array. This modifies the contents of ~/.config/mise/config.toml", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "local", Aliases: []string{"l"}, Usage: "Use the local config file instead of the global one", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "SETTING"}, &cli.StringArg{Name: "VALUE"}}}
+ cmd167 := &cli.Command{Name: "get", Usage: "Show a current setting", Description: "Show a current setting\n\nThis is the contents of a single entry in ~/.config/mise/config.toml\n\nNote that aliases are also stored in this file but managed separately with `mise tool-alias get`", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "local", Aliases: []string{"l"}, Usage: "Use the local config file instead of the global one", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "SETTING"}}}
+ cmd168 := &cli.Command{Name: "ls", Usage: "Show current settings", Description: "Show current settings\n\nThis is the contents of ~/.config/mise/config.toml\n\nNote that aliases are also stored in this file but managed separately with `mise tool-alias`", Aliases: []string{"list"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "all", Aliases: []string{"a"}, Usage: "List all settings", Local: true}, &cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "local", Aliases: []string{"l"}, Usage: "Use the local config file instead of the global one"}, &cli.BoolFlag{Name: "toml", Aliases: []string{"T"}, Usage: "Output in TOML format", Local: true}, &cli.BoolFlag{Name: "complete", Usage: "Print all settings with descriptions for shell completions", Hidden: true, Local: true}, &cli.BoolFlag{Name: "json-extended", Usage: "Output in JSON format with sources", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "SETTING"}}}
+ cmd169 := &cli.Command{Name: "set", Usage: "Add/update a setting", Description: "Add/update a setting\n\nThis modifies the contents of ~/.config/mise/config.toml by default. With `--local`, modifies the local config file instead. See https://mise.jdx.dev/configuration.html#target-file-for-write-operations", Aliases: []string{"create"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "local", Aliases: []string{"l"}, Usage: "Use the local config file instead of the global one", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "SETTING"}, &cli.StringArg{Name: "VALUE"}}}
+ cmd170 := &cli.Command{Name: "unset", Usage: "Clears a setting", Description: "Clears a setting\n\nThis modifies the contents of ~/.config/mise/config.toml", Aliases: []string{"rm", "remove", "delete", "del"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "local", Aliases: []string{"l"}, Usage: "Use the local config file instead of the global one", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "KEY"}}}
+ cmd171 := &cli.Command{Name: "settings", Usage: "Manage settings", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "all", Aliases: []string{"a"}, Usage: "List all settings", Local: true}, &cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "local", Aliases: []string{"l"}, Usage: "Use the local config file instead of the global one"}, &cli.BoolFlag{Name: "toml", Aliases: []string{"T"}, Usage: "Output in TOML format", Local: true}, &cli.BoolFlag{Name: "complete", Usage: "Print all settings with descriptions for shell completions", Hidden: true, Local: true}, &cli.BoolFlag{Name: "json-extended", Usage: "Output in JSON format with sources", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "SETTING"}, &cli.StringArg{Name: "VALUE"}}, Commands: []*cli.Command{cmd166, cmd167, cmd168, cmd169, cmd170}}
+ cmd172 := &cli.Command{Name: "shell", Usage: "Sets a tool version for the current session.", Description: "Sets a tool version for the current session.\n\nOnly works in a session where mise is already activated.\n\nThis works by setting environment variables for the current shell session such as `MISE_NODE_VERSION=20` which is \"eval\"ed as a shell function created by `mise activate`.", Aliases: []string{"sh"}, Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "jobs", Aliases: []string{"j"}, Usage: "Number of jobs to run in parallel\nValues below 1 are treated as 1\n[default: 4]", Local: true, Sources: cli.EnvVars("MISE_JOBS")}, &cli.BoolFlag{Name: "unset", Aliases: []string{"u"}, Usage: "Removes a previously set version", Local: true}, &cli.BoolFlag{Name: "raw", Usage: "Connect backend install command stdin/stdout/stderr directly to the terminal Implies --jobs=1", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TOOL@VERSION", Min: 1, Max: -1}}}
+ cmd173 := &cli.Command{Name: "get", Usage: "Show the command for a shell alias", Action: reached, Arguments: []cli.Argument{&cli.StringArg{Name: "shell_alias"}}}
+ cmd174 := &cli.Command{Name: "ls", Usage: "List shell aliases", Description: "List shell aliases\n\nShows the shell aliases that are set in the current directory. These are defined in `mise.toml` under the `[shell_alias]` section.", Aliases: []string{"list"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "no-header", Usage: "Don't show table header", Local: true}}}
+ cmd175 := &cli.Command{Name: "set", Usage: "Add/update a shell alias", Description: "Add/update a shell alias\n\nThis modifies the contents of ~/.config/mise/config.toml", Aliases: []string{"add", "create"}, Action: reached, Arguments: []cli.Argument{&cli.StringArg{Name: "shell_alias"}, &cli.StringArg{Name: "COMMAND"}}}
+ cmd176 := &cli.Command{Name: "unset", Usage: "Removes a shell alias", Description: "Removes a shell alias\n\nThis modifies the contents of ~/.config/mise/config.toml", Aliases: []string{"rm", "remove", "delete", "del"}, Action: reached, Arguments: []cli.Argument{&cli.StringArg{Name: "shell_alias"}}}
+ cmd177 := &cli.Command{Name: "shell-alias", Usage: "Manage shell aliases.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "no-header", Usage: "Don't show table header", Local: true}}, Commands: []*cli.Command{cmd173, cmd174, cmd175, cmd176}}
+ cmd178 := &cli.Command{Name: "sponsors", Usage: "Show the companies sponsoring mise and the jdx.dev open source tools", Action: reached}
+ cmd179 := &cli.Command{Name: "node", Usage: "Symlinks all tool versions from an external tool into mise", Description: "Symlinks all tool versions from an external tool into mise\n\nFor example, use this to import all Homebrew node installs into mise\n\nThis won't overwrite managed installs, runtime aliases, or links from other providers.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "brew", Usage: "Get tool versions from Homebrew", Local: true}, &cli.BoolFlag{Name: "nodenv", Usage: "Get tool versions from nodenv", Local: true}, &cli.BoolFlag{Name: "nvm", Usage: "Get tool versions from nvm", Local: true}}}
+ cmd180 := &cli.Command{Name: "python", Usage: "Symlinks all tool versions from an external tool into mise", Description: "Symlinks all tool versions from an external tool into mise\n\nFor example, use this to import all pyenv installs into mise\n\nThis won't overwrite managed installs, runtime aliases, or links from other providers.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "pyenv", Usage: "Get tool versions from pyenv", Local: true}, &cli.BoolFlag{Name: "uv", Usage: "Sync tool versions with uv (2-way sync)", Local: true}}}
+ cmd181 := &cli.Command{Name: "ruby", Usage: "Symlinks all ruby tool versions from an external tool into mise", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "brew", Usage: "Get tool versions from Homebrew", Required: true, Local: true}}}
+ cmd182 := &cli.Command{Name: "sync", Usage: "Synchronize tools from other version managers with mise", Action: reached, Commands: []*cli.Command{cmd179, cmd180, cmd181}}
+ cmd183 := &cli.Command{Name: "add", Usage: "Create a new task", Description: "Create a new task\n\nAdds a task to the local mise.toml file. See https://mise.jdx.dev/configuration.html#target-file-for-write-operations", Action: reached, Flags: []cli.Flag{&cli.StringSliceFlag{Name: "alias", Aliases: []string{"a"}, Usage: "Other names for the task", Local: true}, &cli.StringSliceFlag{Name: "depends", Aliases: []string{"d"}, Usage: "Add dependencies to the task", Local: true}, &cli.StringFlag{Name: "dir", Aliases: []string{"D"}, Usage: "Run the task in a specific directory", Local: true}, &cli.BoolFlag{Name: "file", Aliases: []string{"f"}, Usage: "Create a file task instead of a toml task", Local: true}, &cli.BoolFlag{Name: "hide", Aliases: []string{"H"}, Usage: "Hide the task from `mise tasks` and completions", Local: true}, &cli.BoolFlag{Name: "quiet", Aliases: []string{"q"}, Usage: "Do not print the command before running", Local: true}, &cli.BoolFlag{Name: "raw", Aliases: []string{"r"}, Usage: "Directly connect stdin/stdout/stderr", Local: true}, &cli.StringSliceFlag{Name: "sources", Aliases: []string{"s"}, Usage: "Glob patterns of files this task uses as input", Local: true}, &cli.StringSliceFlag{Name: "wait-for", Aliases: []string{"w"}, Usage: "Wait for these tasks to complete if they are to run", Local: true}, &cli.StringSliceFlag{Name: "depends-post", Usage: "Dependencies to run after the task runs", Local: true}, &cli.StringFlag{Name: "description", Usage: "Description of the task", Local: true}, &cli.StringSliceFlag{Name: "outputs", Usage: "Glob patterns of files this task creates, to skip if they are not modified", Local: true}, &cli.StringFlag{Name: "run-windows", Usage: "Command to run on windows", Local: true}, &cli.StringFlag{Name: "shell", Usage: "Run the task in a specific shell", Local: true}, &cli.BoolFlag{Name: "silent", Usage: "Do not print the command or its output", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "TASK"}, &cli.StringArgs{Name: "RUN", Min: 0, Max: -1}}}
+ cmd184 := &cli.Command{Name: "deps", Usage: "Display a tree visualization of a dependency graph", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "compact", Usage: "Collapse repeated dependencies after their first occurrence", Local: true}, &cli.BoolFlag{Name: "dot", Usage: "Display dependencies in DOT format", Local: true}, &cli.BoolFlag{Name: "hidden", Usage: "Show hidden tasks", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TASKS", Min: 0, Max: -1}}}
+ cmd185 := &cli.Command{Name: "edit", Usage: "Edit a task with $EDITOR", Description: "Edit a task with $EDITOR\n\nThe task will be created as a standalone script if it does not already exist.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "path", Aliases: []string{"p"}, Usage: "Display the path to the task instead of editing it", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "TASK"}}}
+ cmd186 := &cli.Command{Name: "graph", Usage: "[experimental] Inspect the workspace project graph", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output the project graph as JSON", Local: true}, &cli.BoolFlag{Name: "explain", Usage: "Explain provider attribution for inferred projects and tasks", Local: true}, &cli.BoolFlag{Name: "no-header", Aliases: []string{"no-headers"}, Usage: "Do not print table headers", Local: true}}}
+ cmd187 := &cli.Command{Name: "info", Usage: "Get information about a task", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "TASK"}}}
+ cmd188 := &cli.Command{Name: "ls", Usage: "List available tasks to execute\nThese may be included from the config file or from the project's .mise/tasks directory\nmise will merge all tasks from all parent directories into this list.", Description: "List available tasks to execute\nThese may be included from the config file or from the project's .mise/tasks directory\nmise will merge all tasks from all parent directories into this list.\n\nSo if you have global tasks in `~/.config/mise/tasks/*` and project-specific tasks in\n~/myproject/.mise/tasks/*, then they'll both be available but the project-specific\ntasks will override the global ones if they have the same name.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "global", Aliases: []string{"g"}, Usage: "Only show global tasks", Local: true}, &cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Output in JSON format", Local: true}, &cli.BoolFlag{Name: "local", Aliases: []string{"l"}, Usage: "Only show non-global tasks", Local: true}, &cli.BoolFlag{Name: "extended", Aliases: []string{"x"}, Usage: "Show all columns", Local: true}, &cli.BoolFlag{Name: "all", Usage: "Load all tasks from the entire monorepo, including sibling directories.\nBy default, only tasks from the current directory hierarchy are loaded.", Local: true}, &cli.BoolFlag{Name: "complete", Usage: "Display tasks for usage completion", Hidden: true, Local: true}, &cli.BoolFlag{Name: "hidden", Usage: "Show hidden tasks", Local: true}, &cli.BoolFlag{Name: "name-only", Usage: "Only show task names, one per line. Useful for piping to fzf and similar tools.", Local: true}, &cli.BoolFlag{Name: "no-header", Aliases: []string{"no-headers"}, Usage: "Do not print table header", Local: true}, &cli.StringFlag{Name: "sort", Usage: "Sort by column. Default is name.", Local: true}, &cli.StringFlag{Name: "sort-order", Usage: "Sort order. Default is asc.", Local: true}, &cli.BoolFlag{Name: "usage", Hidden: true, Local: true}}}
+ cmd189 := &cli.Command{Name: "run", Usage: "Run task(s)", Description: "Run task(s)\n\nThis command will run a task, or multiple tasks in parallel. Tasks may have dependencies on other tasks or on source files. If source is configured on a task, it will only run if the source files have changed.\n\nTasks can be defined in mise.toml or as standalone scripts. In mise.toml, tasks take this form:\n\n [tasks.build]\n run = \"npm run build\"\n sources = [\"src/**/*.ts\"]\n outputs = [\"dist/**/*.js\"]\n\nAlternatively, tasks can be defined as standalone scripts. These must be located in `mise-tasks`, `.mise-tasks`, `.mise/tasks`, `mise/tasks` or `.config/mise/tasks`. The name of the script will be the name of the tasks.\n\n $ cat .mise/tasks/build<`, `mise install`, `mise exec`, and `mise watch`) automatically trust their active config. Paranoid mode requires explicit, content-bound trust for every non-global config.\n\nIn normal mode, safe config files do not require trust: files that only contain `min_version`, `[tools]` entries with plain version strings (or arrays of them), and `[tasks]` without templates or tool options.\n\nTrust is shared across git worktrees: a config file inside a linked worktree is trusted when the equivalent path in the repository's main checkout has been trusted. Paranoid mode disables this sharing since worktrees can check out branches with different config contents.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "all", Aliases: []string{"a"}, Usage: "Trust all config files in the current directory, its parents, and its subdirectories", Local: true}, &cli.BoolFlag{Name: "ignore", Usage: "Do not trust this config and ignore it in the future", Local: true}, &cli.BoolFlag{Name: "show", Usage: "Show the trusted status of config files from the current directory and its parents.\nDoes not trust or untrust any files.", Local: true}, &cli.BoolFlag{Name: "untrust", Usage: "Remove explicit trust for this config", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "CONFIG_FILE"}}}
+ cmd200 := &cli.Command{Name: "uninstall", Usage: "Removes installed tool versions", Description: "Removes installed tool versions\n\nThis only removes the installed version, it does not modify mise.toml.", Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "all", Aliases: []string{"a"}, Usage: "Delete all installed versions", Local: true}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Do not actually delete anything", Local: true}, &cli.BoolFlag{Name: "dry-run-code", Usage: "Like --dry-run but exits with code 1 if there are tools to uninstall", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "INSTALLED_TOOL@VERSION", Min: 0, Max: -1}}}
+ cmd201 := &cli.Command{Name: "unset", Usage: "Remove environment variable(s) from the config file.", Description: "Remove environment variable(s) from the config file.\n\nBy default, this command modifies `mise.toml` in the current directory.", Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "file", Aliases: []string{"f", "path"}, Usage: "Specify a file to use instead of `mise.toml`", Local: true}, &cli.BoolFlag{Name: "global", Aliases: []string{"g"}, Usage: "Use the global config file", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "ENV_KEY", Min: 0, Max: -1}}}
+ cmd202 := &cli.Command{Name: "untrust", Usage: "Remove explicit trust for a config", Action: reached, Arguments: []cli.Argument{&cli.StringArg{Name: "CONFIG_FILE"}}}
+ cmd203 := &cli.Command{Name: "unuse", Usage: "Removes installed tool versions from mise.toml", Description: "Removes installed tool versions from mise.toml\n\nBy default, this will use the `mise.toml` file that has the tool defined. If multiple config files exist (e.g., both `mise.toml` and `mise.local.toml`), the lowest precedence file (`mise.toml`) will be used. See https://mise.jdx.dev/configuration.html#target-file-for-write-operations\n\nIn the following order:\n - If `--global` is set, it will use the global config file.\n - If `--path` is set, it will use the config file at the given path.\n - If `--env` is set, it will use `mise..toml`.\n - If [`MISE_DEFAULT_CONFIG_FILENAME`](https://mise.jdx.dev/configuration.html#mise_default_config_filename) is set, it will use that instead.\n - If `MISE_OVERRIDE_CONFIG_FILENAMES` is set, it will the first from that list.\n - Otherwise just \"mise.toml\" or global config if cwd is home directory.\n\nUse [`MISE_GLOBAL_CONFIG_FILE`](https://mise.jdx.dev/configuration.html#mise_global_config_file) to choose a different global config path.\n\nWill also prune the installed version if no other configurations are using it.", Aliases: []string{"rm", "remove"}, Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "env", Aliases: []string{"e"}, Usage: "Create/modify an environment-specific config file like .mise..toml", Local: true}, &cli.BoolFlag{Name: "global", Aliases: []string{"g"}, Usage: "Use the global config file (`~/.config/mise/config.toml`) instead of the local one", Local: true}, &cli.StringFlag{Name: "path", Aliases: []string{"p", "file"}, Usage: "Specify a path to a config file or directory", Local: true}, &cli.BoolFlag{Name: "no-prune", Usage: "Do not also prune the installed version", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "INSTALLED_TOOL@VERSION", Min: 1, Max: -1}}}
+ cmd204 := &cli.Command{Name: "upgrade", Usage: "Upgrades outdated tools", Description: "Upgrades outdated tools\n\nBy default, this keeps the range specified in mise.toml. So if you have node@20 set, it will upgrade to the latest 20.x.x version available. See the `--bump` flag to use the latest version and bump the version in mise.toml.\n\nThis will update mise.lock if it is enabled, see https://mise.jdx.dev/configuration/settings.html#lockfile", Aliases: []string{"up"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "bump", Aliases: []string{"b"}, Usage: "Upgrades to the latest version available, bumping the version in mise.toml", Local: true}, &cli.BoolFlag{Name: "interactive", Aliases: []string{"i"}, Usage: "Display multiselect menu to choose which tools to upgrade", Local: true}, &cli.StringFlag{Name: "jobs", Aliases: []string{"j"}, Usage: "Number of jobs to run in parallel\nValues below 1 are treated as 1\n[default: 4]", Local: true, Sources: cli.EnvVars("MISE_JOBS")}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Just print what would be done, don't actually do it", Local: true}, &cli.StringSliceFlag{Name: "exclude", Aliases: []string{"x"}, Usage: "Tool(s) to exclude from upgrading\ne.g.: go python", Local: true}, &cli.BoolFlag{Name: "dry-run-code", Usage: "Like --dry-run but exits with code 1 if there are outdated tools", Local: true}, &cli.BoolFlag{Name: "inactive", Usage: "Upgrade all tools, including installed-but-inactive tools not present in the current config", Local: true}, &cli.BoolFlag{Name: "local", Usage: "Only upgrade tools defined in local config files", Local: true}, &cli.StringFlag{Name: "minimum-release-age", Aliases: []string{"before"}, Usage: "Only upgrade to versions released before this date or older than this duration", Local: true}, &cli.BoolFlag{Name: "monorepo", Usage: "Placeholder for future monorepo upgrades; `mise upgrade --monorepo` is not implemented yet.", Local: true}, &cli.BoolFlag{Name: "no-prune", Usage: "Do not uninstall the versions that were upgraded away from", Local: true}, &cli.BoolFlag{Name: "prune", Usage: "Uninstall the versions that were upgraded away from", Local: true}, &cli.BoolFlag{Name: "raw", Usage: "Connect backend install command stdin/stdout/stderr directly to the terminal Implies --jobs=1", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "INSTALLED_TOOL@VERSION", Min: 0, Max: -1}}}
+ cmd205 := &cli.Command{Name: "usage", Usage: "Generate a usage CLI spec", Description: "Generate a usage CLI spec\n\nSee https://usage.jdx.dev for more information on this specification.", Hidden: true, Action: reached}
+ cmd206 := &cli.Command{Name: "use", Usage: "Installs a tool and adds the version to mise.toml.", Description: "Installs a tool and adds the version to mise.toml.\n\nThis will install the tool version if it is not already installed. By default, this will use a `mise.toml` file in the current directory. If multiple config files exist (e.g., both `mise.toml` and `mise.local.toml`), the lowest precedence file (`mise.toml`) will be used. See https://mise.jdx.dev/configuration.html#target-file-for-write-operations\n\nIn the following order:\n - If `--global` is set, it will use the global config file.\n - If `--path` is set, it will use the config file at the given path.\n - If `--env` is set, it will use `mise..toml`.\n - If [`MISE_DEFAULT_CONFIG_FILENAME`](https://mise.jdx.dev/configuration.html#mise_default_config_filename) is set, it will use that instead.\n - If `MISE_OVERRIDE_CONFIG_FILENAMES` is set, it will the first from that list.\n - Otherwise just \"mise.toml\" or global config if cwd is home directory.\n\nUse [`MISE_GLOBAL_CONFIG_FILE`](https://mise.jdx.dev/configuration.html#mise_global_config_file) to choose a different global config path.\n\nUse the `--global` flag to use the global config file instead.", Aliases: []string{"u"}, Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "env", Aliases: []string{"e"}, Usage: "Create/modify an environment-specific config file like .mise..toml", Local: true}, &cli.BoolFlag{Name: "force", Aliases: []string{"f"}, Usage: "Force reinstall even if already installed", Local: true}, &cli.BoolFlag{Name: "global", Aliases: []string{"g"}, Usage: "Use the global config file (`~/.config/mise/config.toml`) instead of the local one", Local: true}, &cli.StringFlag{Name: "jobs", Aliases: []string{"j"}, Usage: "Number of jobs to run in parallel\nValues below 1 are treated as 1\n[default: 4]", Local: true, Sources: cli.EnvVars("MISE_JOBS")}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Perform a dry run, showing what would be installed and modified without making changes", Local: true}, &cli.StringFlag{Name: "path", Aliases: []string{"p"}, Usage: "Specify a path to a config file or directory", Local: true}, &cli.BoolFlag{Name: "dry-run-code", Usage: "Like --dry-run but exits with code 1 if there are changes to make", Local: true}, &cli.BoolFlag{Name: "fuzzy", Usage: "Save fuzzy version to config file", Local: true}, &cli.StringFlag{Name: "minimum-release-age", Aliases: []string{"before"}, Usage: "Only install versions released before this date or older than this duration", Local: true}, &cli.BoolFlag{Name: "pin", Usage: "Save the resolved concrete version to the config file", Local: true}, &cli.BoolFlag{Name: "raw", Usage: "Connect backend install command stdin/stdout/stderr directly to the terminal Implies `--jobs=1`", Local: true}, &cli.StringSliceFlag{Name: "remove", Aliases: []string{"rm", "unset"}, Usage: "Remove the tool(s) from config file", Local: true}}, Arguments: []cli.Argument{&cli.StringArgs{Name: "TOOL@VERSION", Min: 0, Max: -1}}}
+ cmd207 := &cli.Command{Name: "version", Usage: "Display the version of mise", Description: "Display the version of mise\n\nDisplays the version, os, architecture, and the date of the build.\n\nIf the version is out of date, it will display a warning.", Aliases: []string{"v"}, Action: reached, Flags: []cli.Flag{&cli.BoolFlag{Name: "json", Aliases: []string{"J"}, Usage: "Print the version information in JSON format", Local: true}}}
+ cmd208 := &cli.Command{Name: "watch", Usage: "Run task(s) and watch for changes to rerun it", Description: "Run task(s) and watch for changes to rerun it\n\nThis command uses the `watchexec` tool to watch for changes to files and rerun the specified task(s). It must be installed for this command to work, but you can install it with `mise use -g watchexec@latest`.\n\nFor more advanced process management (daemon management, auto-restart, readiness checks, cron scheduling), see mise's sister project: https://pitchfork.jdx.dev", Aliases: []string{"w"}, Action: reached, Flags: []cli.Flag{&cli.StringSliceFlag{Name: "task-flag", Aliases: []string{"t"}, Usage: "Tasks to run", Hidden: true, Local: true}, &cli.StringSliceFlag{Name: "glob", Aliases: []string{"g"}, Usage: "Files to watch\nDefaults to sources from the task(s)", Hidden: true, Local: true}, &cli.BoolFlag{Name: "skip-deps", Usage: "Run only the specified tasks skipping all dependencies", Local: true}, &cli.StringSliceFlag{Name: "watch", Aliases: []string{"w"}, Usage: "Watch a specific file or directory", Local: true}, &cli.StringSliceFlag{Name: "watch-non-recursive", Aliases: []string{"W"}, Usage: "Watch a specific directory, non-recursively", Local: true}, &cli.StringFlag{Name: "watch-file", Aliases: []string{"F"}, Usage: "Watch files and directories from a file", Local: true}, &cli.StringFlag{Name: "clear", Aliases: []string{"c"}, Usage: "Clear screen before running command", Local: true}, &cli.StringFlag{Name: "on-busy-update", Aliases: []string{"o"}, Usage: "What to do when receiving events while the command is running", Local: true, Value: "do-nothing"}, &cli.BoolFlag{Name: "restart", Aliases: []string{"r"}, Usage: "Restart the process if it's still running", Local: true}, &cli.StringFlag{Name: "signal", Aliases: []string{"s"}, Usage: "Send a signal to the process when it's still running", Local: true}, &cli.StringFlag{Name: "stop-signal", Usage: "Signal to send to stop the command", Local: true}, &cli.StringFlag{Name: "stop-timeout", Usage: "Time to wait for the command to exit gracefully", Local: true, Value: "10s"}, &cli.StringSliceFlag{Name: "map-signal", Usage: "Translate signals from the OS to signals to send to the command", Local: true}, &cli.StringFlag{Name: "debounce", Aliases: []string{"d"}, Usage: "Time to wait for new events before taking action", Local: true, Value: "50ms"}, &cli.BoolFlag{Name: "stdin-quit", Usage: "Exit when stdin closes", Local: true}, &cli.BoolFlag{Name: "no-vcs-ignore", Usage: "Don't load gitignores", Local: true}, &cli.BoolFlag{Name: "no-project-ignore", Usage: "Don't load project-local ignores", Local: true}, &cli.BoolFlag{Name: "no-global-ignore", Usage: "Don't load global ignores", Local: true}, &cli.BoolFlag{Name: "no-default-ignore", Usage: "Don't use internal default ignores", Local: true}, &cli.BoolFlag{Name: "no-discover-ignore", Usage: "Don't discover ignore files at all", Local: true}, &cli.BoolFlag{Name: "ignore-nothing", Usage: "Don't ignore anything at all", Local: true}, &cli.BoolFlag{Name: "postpone", Aliases: []string{"p"}, Usage: "Wait until first change before running command", Local: true}, &cli.StringFlag{Name: "delay-run", Usage: "Sleep before running the command", Local: true}, &cli.StringFlag{Name: "poll", Aliases: []string{"force-poll"}, Usage: "Poll for filesystem changes", Local: true}, &cli.StringFlag{Name: "shell", Usage: "Use a different shell", Local: true}, &cli.StringFlag{Name: "emit-events-to", Usage: "Configure event emission", Local: true, Value: "none"}, &cli.BoolFlag{Name: "only-emit-events", Usage: "Only emit events to stdout, run no commands.", Local: true}, &cli.StringSliceFlag{Name: "env", Aliases: []string{"E"}, Usage: "Add env vars to the command", Local: true}, &cli.StringFlag{Name: "wrap-process", Usage: "Configure how the process is wrapped", Local: true}, &cli.BoolFlag{Name: "notify", Aliases: []string{"N"}, Usage: "Alert when commands start and end", Local: true}, &cli.StringFlag{Name: "color", Aliases: []string{"colour"}, Usage: "When to use terminal colours", Local: true, Value: "auto"}, &cli.BoolFlag{Name: "timings", Usage: "Print how long the command took to run", Local: true}, &cli.BoolFlag{Name: "quiet", Aliases: []string{"q"}, Usage: "Don't print starting and stopping messages", Local: true}, &cli.BoolFlag{Name: "bell", Usage: "Ring the terminal bell on command completion", Local: true}, &cli.StringFlag{Name: "project-origin", Usage: "Set the project origin", Local: true}, &cli.StringFlag{Name: "workdir", Usage: "Set the working directory", Local: true}, &cli.StringSliceFlag{Name: "exts", Aliases: []string{"e"}, Usage: "Filename extensions to filter to", Local: true}, &cli.StringSliceFlag{Name: "filter", Aliases: []string{"f"}, Usage: "Filename patterns to filter to", Local: true}, &cli.StringSliceFlag{Name: "filter-file", Usage: "Files to load filters from", Local: true, Sources: cli.EnvVars("WATCHEXEC_FILTER_FILES")}, &cli.StringSliceFlag{Name: "filter-prog", Aliases: []string{"J"}, Usage: "[experimental] Filter programs.", Local: true}, &cli.StringSliceFlag{Name: "ignore", Aliases: []string{"i"}, Usage: "Filename patterns to filter out", Local: true}, &cli.StringSliceFlag{Name: "ignore-file", Usage: "Files to load ignores from", Local: true, Sources: cli.EnvVars("WATCHEXEC_IGNORE_FILES")}, &cli.StringSliceFlag{Name: "fs-events", Usage: "Filesystem events to filter to", Local: true}, &cli.BoolFlag{Name: "no-meta", Usage: "Don't emit fs events for metadata changes", Local: true}, &cli.BoolFlag{Name: "print-events", Usage: "Print events that trigger actions", Local: true}, &cli.BoolFlag{Name: "manual", Usage: "Show the manual page", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "TASK"}, &cli.StringArgs{Name: "ARGS", Min: 0, Max: -1}}}
+ cmd209 := &cli.Command{Name: "where", Usage: "Display the installation path for a tool", Description: "Display the installation path for a tool\n\nThe tool must be installed for this to work.", Action: reached, Arguments: []cli.Argument{&cli.StringArg{Name: "TOOL@VERSION"}, &cli.StringArg{Name: "ASDF_VERSION"}}}
+ cmd210 := &cli.Command{Name: "which", Usage: "Shows the path that a tool's bin points to.", Description: "Shows the path that a tool's bin points to.\n\nUse this to figure out what version of a tool is currently active.", Action: reached, Flags: []cli.Flag{&cli.StringFlag{Name: "tool", Aliases: []string{"t"}, Usage: "Use a specific tool@version\ne.g.: `mise which npm --tool=node@20`", Local: true}, &cli.BoolFlag{Name: "complete", Hidden: true, Local: true}, &cli.BoolFlag{Name: "plugin", Usage: "Show the plugin name instead of the path", Local: true}, &cli.BoolFlag{Name: "version", Usage: "Show the version instead of the path", Local: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "BIN_NAME"}}}
+ root := &cli.Command{Name: "mise", Writer: io.Discard, ErrWriter: io.Discard, Action: noop, Flags: []cli.Flag{&cli.BoolFlag{Name: "continue-on-error", Aliases: []string{"c"}, Usage: "Continue running tasks even if one fails", Hidden: true, Local: true}, &cli.StringFlag{Name: "cd", Aliases: []string{"C"}, Usage: "Change directory before running command"}, &cli.StringSliceFlag{Name: "env", Aliases: []string{"E"}, Usage: "Set the environment for loading `mise..toml`"}, &cli.BoolFlag{Name: "force", Aliases: []string{"f"}, Usage: "Force the operation", Hidden: true, Local: true}, &cli.StringFlag{Name: "jobs", Aliases: []string{"j"}, Usage: "How many jobs to run in parallel; values below 1 are treated as 1 [default: 8]", Sources: cli.EnvVars("MISE_JOBS")}, &cli.BoolFlag{Name: "dry-run", Aliases: []string{"n"}, Usage: "Dry run, don't actually do anything", Hidden: true, Local: true}, &cli.StringSliceFlag{Name: "profile", Aliases: []string{"P"}, Usage: "Set the profile (environment)", Hidden: true}, &cli.BoolFlag{Name: "quiet", Aliases: []string{"q"}, Usage: "Suppress non-error messages"}, &cli.StringFlag{Name: "shell", Aliases: []string{"s"}, Hidden: true, Local: true}, &cli.StringSliceFlag{Name: "tool", Aliases: []string{"t"}, Usage: "Tool(s) to run in addition to what is in mise.toml files e.g.: node@20 python@3.10", Hidden: true, Local: true, Sources: cli.EnvVars("MISE_QUIET")}, &cli.BoolFlag{Name: "verbose", Aliases: []string{"v"}, Usage: "Show extra output (use -vv for even more)", Config: cli.BoolConfig{Count: new(int)}}, &cli.BoolFlag{Name: "version", Aliases: []string{"V"}, Hidden: true, Local: true}, &cli.BoolFlag{Name: "yes", Aliases: []string{"y"}, Usage: "Answer yes to all confirmation prompts"}, &cli.BoolFlag{Name: "debug", Usage: "Sets log level to debug", Hidden: true}, &cli.StringFlag{Name: "log-level", Hidden: true}, &cli.BoolFlag{Name: "no-config", Usage: "Do not load any config files", Local: true}, &cli.BoolFlag{Name: "no-env", Usage: "Do not load environment variables from config files", Local: true}, &cli.BoolFlag{Name: "no-hooks", Usage: "Do not execute hooks from config files", Local: true}, &cli.BoolFlag{Name: "no-timings", Aliases: []string{"no-timing"}, Usage: "Hides elapsed time after each task completes", Hidden: true, Local: true}, &cli.StringFlag{Name: "output", Local: true}, &cli.BoolFlag{Name: "raw", Usage: "Read/write directly to stdin/stdout/stderr instead of by line"}, &cli.BoolFlag{Name: "locked", Usage: "Require lockfile URLs to be present during installation"}, &cli.BoolFlag{Name: "silent", Usage: "Suppress all task output and mise non-error messages"}, &cli.BoolFlag{Name: "timings", Aliases: []string{"timing"}, Usage: "Shows elapsed time after each task completes", Hidden: true, Local: true}, &cli.BoolFlag{Name: "trace", Usage: "Sets log level to trace", Hidden: true}}, Arguments: []cli.Argument{&cli.StringArg{Name: "TASK"}, &cli.StringArgs{Name: "TASK_ARGS", Min: 0, Max: -1}, &cli.StringArgs{Name: "TASK_ARGS_LAST", Min: 0, Max: -1}}, Commands: []*cli.Command{cmd1, cmd6, cmd7, cmd9, cmd10, cmd87, cmd92, cmd93, cmd97, cmd98, cmd99, cmd103, cmd109, cmd111, cmd112, cmd113, cmd114, cmd115, cmd124, cmd126, cmd127, cmd128, cmd129, cmd130, cmd131, cmd132, cmd133, cmd134, cmd135, cmd136, cmd137, cmd138, cmd139, cmd140, cmd144, cmd145, cmd146, cmd153, cmd157, cmd158, cmd159, cmd160, cmd161, cmd162, cmd163, cmd164, cmd165, cmd171, cmd172, cmd177, cmd178, cmd182, cmd191, cmd192, cmd196, cmd197, cmd198, cmd199, cmd200, cmd201, cmd202, cmd203, cmd204, cmd205, cmd206, cmd207, cmd208, cmd209, cmd210}}
+ return root
+}
+
+// Resolve builds urfave's model of the CLI and runs argv against it, reporting
+// whether a subcommand was reached.
+//
+// argv arrives without the program name, the way the other shadows take it, and
+// `Run` wants it with one — hence the copy, which is a few dozen nanoseconds
+// against a parse three orders of magnitude larger.
+func Resolve(argv []string) bool {
+ hit := false
+ root := build(&hit)
+ args := make([]string, 0, len(argv)+1)
+ args = append(args, "mise")
+ args = append(args, argv...)
+ if err := root.Run(context.Background(), args); err != nil {
+ return false
+ }
+ return hit
+}
diff --git a/benches/go/mise/tables.go b/benches/go/mise/tables.go
new file mode 100644
index 000000000..44d45373b
--- /dev/null
+++ b/benches/go/mise/tables.go
@@ -0,0 +1,14350 @@
+// Code generated by `usage generate go`. DO NOT EDIT.
+//
+// Binding tables for `mise`, read by
+// [github.com/jdx/usage/go/argv]. Regenerate rather than editing: the spec is
+// the definition, and a hand-edit here is a difference no reviewer can see.
+//
+// These are package-level variables holding plain data, so the linker lays them
+// out and nothing runs before main.
+
+package mise
+
+import "github.com/jdx/usage/go/argv"
+
+// Keys identify a table entry without a string comparison: switch on the Key an
+// event carries rather than on its Name, which is there for diagnostics.
+const (
+ CmdRoot uint64 = 1
+ FlagContinueOnError uint64 = 2
+ FlagCd uint64 = 3
+ FlagEnv uint64 = 4
+ FlagForce uint64 = 5
+ FlagJobs uint64 = 6
+ FlagDryRun uint64 = 7
+ FlagProfile uint64 = 8
+ FlagQuiet uint64 = 9
+ FlagShell uint64 = 10
+ FlagTool uint64 = 11
+ FlagVerbose uint64 = 12
+ FlagVersion uint64 = 13
+ FlagYes uint64 = 14
+ FlagDebug uint64 = 15
+ FlagLogLevel uint64 = 16
+ FlagNoConfig uint64 = 17
+ FlagNoEnv uint64 = 18
+ FlagNoHooks uint64 = 19
+ FlagNoTimings uint64 = 20
+ FlagOutput uint64 = 21
+ FlagRaw uint64 = 22
+ FlagLocked uint64 = 23
+ FlagSilent uint64 = 24
+ FlagTimings uint64 = 25
+ FlagTrace uint64 = 26
+ ArgTask uint64 = 27
+ ArgTaskArgs uint64 = 28
+ ArgTaskArgsLast uint64 = 29
+ CmdActivate uint64 = 30
+ FlagActivateQuiet uint64 = 31
+ FlagActivateShell uint64 = 32
+ FlagActivateNoHookEnv uint64 = 33
+ FlagActivateShims uint64 = 34
+ FlagActivateStatus uint64 = 35
+ ArgActivateShellType uint64 = 36
+ CmdToolAlias uint64 = 37
+ FlagToolAliasTool uint64 = 38
+ FlagToolAliasNoHeader uint64 = 39
+ CmdToolAliasGet uint64 = 40
+ ArgToolAliasGetTool uint64 = 41
+ ArgToolAliasGetAlias uint64 = 42
+ CmdToolAliasLs uint64 = 43
+ FlagToolAliasLsNoHeader uint64 = 44
+ ArgToolAliasLsTool uint64 = 45
+ CmdToolAliasSet uint64 = 46
+ ArgToolAliasSetTool uint64 = 47
+ ArgToolAliasSetAlias uint64 = 48
+ ArgToolAliasSetValue uint64 = 49
+ CmdToolAliasUnset uint64 = 50
+ ArgToolAliasUnsetTool uint64 = 51
+ ArgToolAliasUnsetAlias uint64 = 52
+ CmdAsdf uint64 = 53
+ ArgAsdfArgs uint64 = 54
+ CmdBackends uint64 = 55
+ CmdBackendsLs uint64 = 56
+ CmdBinPaths uint64 = 57
+ FlagBinPathsBinNames uint64 = 58
+ FlagBinPathsJson uint64 = 59
+ ArgBinPathsToolVersion uint64 = 60
+ CmdBootstrap uint64 = 61
+ FlagBootstrapDryRun uint64 = 62
+ FlagBootstrapYes uint64 = 63
+ FlagBootstrapForceDotfiles uint64 = 64
+ FlagBootstrapOnly uint64 = 65
+ FlagBootstrapPromptSecrets uint64 = 66
+ FlagBootstrapSkip uint64 = 67
+ FlagBootstrapUpdate uint64 = 68
+ CmdBootstrapApplyAccountPlan uint64 = 69
+ CmdBootstrapApplyServicePlan uint64 = 70
+ CmdBootstrapApplyFirewallPlan uint64 = 71
+ CmdBootstrapApplySystemPlan uint64 = 72
+ CmdBootstrapInspectSystemFiles uint64 = 73
+ CmdBootstrapInspectFirewallPlan uint64 = 74
+ CmdBootstrapAccounts uint64 = 75
+ CmdBootstrapAccountsApply uint64 = 76
+ FlagBootstrapAccountsApplyDryRun uint64 = 77
+ FlagBootstrapAccountsApplyYes uint64 = 78
+ CmdBootstrapAccountsStatus uint64 = 79
+ FlagBootstrapAccountsStatusJson uint64 = 80
+ FlagBootstrapAccountsStatusMissing uint64 = 81
+ CmdBootstrapCompose uint64 = 82
+ CmdBootstrapComposeApply uint64 = 83
+ FlagBootstrapComposeApplyDryRun uint64 = 84
+ FlagBootstrapComposeApplyYes uint64 = 85
+ CmdBootstrapComposeStatus uint64 = 86
+ FlagBootstrapComposeStatusJson uint64 = 87
+ FlagBootstrapComposeStatusMissing uint64 = 88
+ CmdBootstrapDotfiles uint64 = 89
+ CmdBootstrapDotfilesAdd uint64 = 90
+ FlagBootstrapDotfilesAddForce uint64 = 91
+ FlagBootstrapDotfilesAddGlobal uint64 = 92
+ FlagBootstrapDotfilesAddLocal uint64 = 93
+ FlagBootstrapDotfilesAddMode uint64 = 94
+ FlagBootstrapDotfilesAddDryRun uint64 = 95
+ FlagBootstrapDotfilesAddNoApply uint64 = 96
+ FlagBootstrapDotfilesAddPath uint64 = 97
+ FlagBootstrapDotfilesAddSource uint64 = 98
+ FlagBootstrapDotfilesAddYes uint64 = 99
+ ArgBootstrapDotfilesAddTarget uint64 = 100
+ CmdBootstrapDotfilesApply uint64 = 101
+ FlagBootstrapDotfilesApplyForce uint64 = 102
+ FlagBootstrapDotfilesApplyDryRun uint64 = 103
+ FlagBootstrapDotfilesApplyYes uint64 = 104
+ ArgBootstrapDotfilesApplyTarget uint64 = 105
+ CmdBootstrapDotfilesEdit uint64 = 106
+ FlagBootstrapDotfilesEditApply uint64 = 107
+ FlagBootstrapDotfilesEditMode uint64 = 108
+ FlagBootstrapDotfilesEditSource uint64 = 109
+ FlagBootstrapDotfilesEditYes uint64 = 110
+ ArgBootstrapDotfilesEditTarget uint64 = 111
+ CmdBootstrapDotfilesStatus uint64 = 112
+ FlagBootstrapDotfilesStatusJson uint64 = 113
+ FlagBootstrapDotfilesStatusMissing uint64 = 114
+ ArgBootstrapDotfilesStatusTarget uint64 = 115
+ CmdBootstrapDotfilesUnapply uint64 = 116
+ FlagBootstrapDotfilesUnapplyForce uint64 = 117
+ FlagBootstrapDotfilesUnapplyDryRun uint64 = 118
+ FlagBootstrapDotfilesUnapplyYes uint64 = 119
+ ArgBootstrapDotfilesUnapplyTarget uint64 = 120
+ CmdBootstrapFiles uint64 = 121
+ CmdBootstrapFilesApply uint64 = 122
+ FlagBootstrapFilesApplyDryRun uint64 = 123
+ FlagBootstrapFilesApplyYes uint64 = 124
+ FlagBootstrapFilesApplyPromptSecrets uint64 = 125
+ CmdBootstrapFilesStatus uint64 = 126
+ FlagBootstrapFilesStatusJson uint64 = 127
+ FlagBootstrapFilesStatusMissing uint64 = 128
+ FlagBootstrapFilesStatusPromptSecrets uint64 = 129
+ CmdBootstrapFirewall uint64 = 130
+ CmdBootstrapFirewallApply uint64 = 131
+ FlagBootstrapFirewallApplyDryRun uint64 = 132
+ FlagBootstrapFirewallApplyYes uint64 = 133
+ CmdBootstrapFirewallStatus uint64 = 134
+ FlagBootstrapFirewallStatusJson uint64 = 135
+ FlagBootstrapFirewallStatusMissing uint64 = 136
+ CmdBootstrapLaunchd uint64 = 137
+ CmdBootstrapLaunchdApply uint64 = 138
+ FlagBootstrapLaunchdApplyDryRun uint64 = 139
+ FlagBootstrapLaunchdApplyYes uint64 = 140
+ CmdBootstrapLaunchdStatus uint64 = 141
+ FlagBootstrapLaunchdStatusJson uint64 = 142
+ FlagBootstrapLaunchdStatusMissing uint64 = 143
+ CmdBootstrapLinux uint64 = 144
+ CmdBootstrapLinuxSystemdUnits uint64 = 145
+ CmdBootstrapLinuxSystemdUnitsApply uint64 = 146
+ FlagBootstrapLinuxSystemdUnitsApplyDryRun uint64 = 147
+ FlagBootstrapLinuxSystemdUnitsApplyYes uint64 = 148
+ CmdBootstrapLinuxSystemdUnitsStatus uint64 = 149
+ FlagBootstrapLinuxSystemdUnitsStatusJson uint64 = 150
+ FlagBootstrapLinuxSystemdUnitsStatusMissing uint64 = 151
+ CmdBootstrapMacos uint64 = 152
+ CmdBootstrapMacosDefaults uint64 = 153
+ CmdBootstrapMacosDefaultsApply uint64 = 154
+ FlagBootstrapMacosDefaultsApplyDryRun uint64 = 155
+ FlagBootstrapMacosDefaultsApplyYes uint64 = 156
+ CmdBootstrapMacosDefaultsStatus uint64 = 157
+ FlagBootstrapMacosDefaultsStatusJson uint64 = 158
+ FlagBootstrapMacosDefaultsStatusMissing uint64 = 159
+ CmdBootstrapMacosLaunchdAgents uint64 = 160
+ CmdBootstrapMacosLaunchdAgentsApply uint64 = 161
+ FlagBootstrapMacosLaunchdAgentsApplyDryRun uint64 = 162
+ FlagBootstrapMacosLaunchdAgentsApplyYes uint64 = 163
+ CmdBootstrapMacosLaunchdAgentsStatus uint64 = 164
+ FlagBootstrapMacosLaunchdAgentsStatusJson uint64 = 165
+ FlagBootstrapMacosLaunchdAgentsStatusMissing uint64 = 166
+ CmdBootstrapMacosDefaults2 uint64 = 167
+ CmdBootstrapMacosDefaultsApply2 uint64 = 168
+ FlagBootstrapMacosDefaultsApplyDryRun2 uint64 = 169
+ FlagBootstrapMacosDefaultsApplyYes2 uint64 = 170
+ CmdBootstrapMacosDefaultsStatus2 uint64 = 171
+ FlagBootstrapMacosDefaultsStatusJson2 uint64 = 172
+ FlagBootstrapMacosDefaultsStatusMissing2 uint64 = 173
+ CmdBootstrapMiseShellActivate uint64 = 174
+ CmdBootstrapMiseShellActivateApply uint64 = 175
+ FlagBootstrapMiseShellActivateApplyDryRun uint64 = 176
+ FlagBootstrapMiseShellActivateApplyYes uint64 = 177
+ CmdBootstrapMiseShellActivateStatus uint64 = 178
+ FlagBootstrapMiseShellActivateStatusJson uint64 = 179
+ FlagBootstrapMiseShellActivateStatusMissing uint64 = 180
+ CmdBootstrapPackages uint64 = 181
+ CmdBootstrapPackagesApply uint64 = 182
+ FlagBootstrapPackagesApplyManager uint64 = 183
+ FlagBootstrapPackagesApplyDryRun uint64 = 184
+ FlagBootstrapPackagesApplyYes uint64 = 185
+ FlagBootstrapPackagesApplyUpdate uint64 = 186
+ ArgBootstrapPackagesApplyPackage uint64 = 187
+ CmdBootstrapPackagesBrew uint64 = 188
+ CmdBootstrapPackagesBrewTap uint64 = 189
+ FlagBootstrapPackagesBrewTapLocal uint64 = 190
+ FlagBootstrapPackagesBrewTapDryRun uint64 = 191
+ FlagBootstrapPackagesBrewTapPath uint64 = 192
+ ArgBootstrapPackagesBrewTapTap uint64 = 193
+ ArgBootstrapPackagesBrewTapUrl uint64 = 194
+ CmdBootstrapPackagesBrewUntap uint64 = 195
+ FlagBootstrapPackagesBrewUntapLocal uint64 = 196
+ FlagBootstrapPackagesBrewUntapDryRun uint64 = 197
+ FlagBootstrapPackagesBrewUntapPath uint64 = 198
+ ArgBootstrapPackagesBrewUntapTaps uint64 = 199
+ CmdBootstrapPackagesImport uint64 = 200
+ FlagBootstrapPackagesImportEnv uint64 = 201
+ FlagBootstrapPackagesImportGlobal uint64 = 202
+ FlagBootstrapPackagesImportManager uint64 = 203
+ FlagBootstrapPackagesImportAll uint64 = 204
+ FlagBootstrapPackagesImportDryRun uint64 = 205
+ FlagBootstrapPackagesImportPath uint64 = 206
+ CmdBootstrapPackagesPrune uint64 = 207
+ FlagBootstrapPackagesPruneManager uint64 = 208
+ FlagBootstrapPackagesPruneDryRun uint64 = 209
+ FlagBootstrapPackagesPruneYes uint64 = 210
+ CmdBootstrapPackagesStatus uint64 = 211
+ FlagBootstrapPackagesStatusJson uint64 = 212
+ FlagBootstrapPackagesStatusMissing uint64 = 213
+ CmdBootstrapPackagesUpgrade uint64 = 214
+ FlagBootstrapPackagesUpgradeManager uint64 = 215
+ FlagBootstrapPackagesUpgradeDryRun uint64 = 216
+ FlagBootstrapPackagesUpgradeYes uint64 = 217
+ ArgBootstrapPackagesUpgradePackage uint64 = 218
+ CmdBootstrapPackagesUse uint64 = 219
+ FlagBootstrapPackagesUseEnv uint64 = 220
+ FlagBootstrapPackagesUseGlobal uint64 = 221
+ FlagBootstrapPackagesUseDryRun uint64 = 222
+ FlagBootstrapPackagesUsePath uint64 = 223
+ FlagBootstrapPackagesUseYes uint64 = 224
+ ArgBootstrapPackagesUsePackage uint64 = 225
+ CmdBootstrapPlan uint64 = 226
+ FlagBootstrapPlanJson uint64 = 227
+ FlagBootstrapPlanDetailedExitcode uint64 = 228
+ FlagBootstrapPlanPromptSecrets uint64 = 229
+ CmdBootstrapPlugins uint64 = 230
+ CmdBootstrapPluginsApply uint64 = 231
+ FlagBootstrapPluginsApplyDryRun uint64 = 232
+ CmdBootstrapPluginsStatus uint64 = 233
+ FlagBootstrapPluginsStatusMissing uint64 = 234
+ CmdBootstrapRemote uint64 = 235
+ FlagBootstrapRemoteAll uint64 = 236
+ FlagBootstrapRemoteBootstrapCommand uint64 = 237
+ FlagBootstrapRemoteConnectTimeout uint64 = 238
+ FlagBootstrapRemoteCopyLink uint64 = 239
+ FlagBootstrapRemoteCopyLinks uint64 = 240
+ FlagBootstrapRemoteExclude uint64 = 241
+ FlagBootstrapRemoteFailFast uint64 = 242
+ FlagBootstrapRemoteForceDotfiles uint64 = 243
+ FlagBootstrapRemoteHost uint64 = 244
+ FlagBootstrapRemoteIdentityFile uint64 = 245
+ FlagBootstrapRemoteDryRun uint64 = 246
+ FlagBootstrapRemoteKeepStaging uint64 = 247
+ FlagBootstrapRemoteMiseBin uint64 = 248
+ FlagBootstrapRemoteOnly uint64 = 249
+ FlagBootstrapRemotePort uint64 = 250
+ FlagBootstrapRemotePromptSecrets uint64 = 251
+ FlagBootstrapRemoteRemoteEnv uint64 = 252
+ FlagBootstrapRemoteRemoteMise uint64 = 253
+ FlagBootstrapRemoteSkip uint64 = 254
+ FlagBootstrapRemoteSource uint64 = 255
+ FlagBootstrapRemoteSshOption uint64 = 256
+ FlagBootstrapRemoteTag uint64 = 257
+ FlagBootstrapRemoteUpdate uint64 = 258
+ FlagBootstrapRemoteYes uint64 = 259
+ ArgBootstrapRemoteTarget uint64 = 260
+ CmdBootstrapRepos uint64 = 261
+ CmdBootstrapReposApply uint64 = 262
+ FlagBootstrapReposApplyDryRun uint64 = 263
+ FlagBootstrapReposApplyYes uint64 = 264
+ CmdBootstrapReposExec uint64 = 265
+ FlagBootstrapReposExecContinueOnError uint64 = 266
+ FlagBootstrapReposExecDryRun uint64 = 267
+ ArgBootstrapReposExecPath uint64 = 268
+ ArgBootstrapReposExecCommand uint64 = 269
+ CmdBootstrapReposStatus uint64 = 270
+ FlagBootstrapReposStatusJson uint64 = 271
+ FlagBootstrapReposStatusMissing uint64 = 272
+ CmdBootstrapReposUpdate uint64 = 273
+ FlagBootstrapReposUpdateDryRun uint64 = 274
+ FlagBootstrapReposUpdateYes uint64 = 275
+ ArgBootstrapReposUpdatePath uint64 = 276
+ CmdBootstrapSecrets uint64 = 277
+ CmdBootstrapSecretsStatus uint64 = 278
+ FlagBootstrapSecretsStatusJson uint64 = 279
+ FlagBootstrapSecretsStatusMissing uint64 = 280
+ CmdBootstrapServices uint64 = 281
+ CmdBootstrapServicesApply uint64 = 282
+ FlagBootstrapServicesApplyDryRun uint64 = 283
+ FlagBootstrapServicesApplyYes uint64 = 284
+ CmdBootstrapServicesStatus uint64 = 285
+ FlagBootstrapServicesStatusJson uint64 = 286
+ FlagBootstrapServicesStatusMissing uint64 = 287
+ CmdBootstrapStatus uint64 = 288
+ FlagBootstrapStatusJson uint64 = 289
+ FlagBootstrapStatusMissing uint64 = 290
+ FlagBootstrapStatusPromptSecrets uint64 = 291
+ CmdBootstrapSystemd uint64 = 292
+ CmdBootstrapSystemdApply uint64 = 293
+ FlagBootstrapSystemdApplyDryRun uint64 = 294
+ FlagBootstrapSystemdApplyYes uint64 = 295
+ CmdBootstrapSystemdStatus uint64 = 296
+ FlagBootstrapSystemdStatusJson uint64 = 297
+ FlagBootstrapSystemdStatusMissing uint64 = 298
+ CmdBootstrapUser uint64 = 299
+ CmdBootstrapUserApply uint64 = 300
+ FlagBootstrapUserApplyDryRun uint64 = 301
+ FlagBootstrapUserApplyYes uint64 = 302
+ CmdBootstrapUserStatus uint64 = 303
+ FlagBootstrapUserStatusJson uint64 = 304
+ FlagBootstrapUserStatusMissing uint64 = 305
+ CmdCache uint64 = 306
+ CmdCacheClear uint64 = 307
+ FlagCacheClearOutdate uint64 = 308
+ FlagCacheClearTask uint64 = 309
+ ArgCacheClearTool uint64 = 310
+ CmdCachePath uint64 = 311
+ CmdCachePrune uint64 = 312
+ FlagCachePruneVerbose uint64 = 313
+ FlagCachePruneDryRun uint64 = 314
+ ArgCachePruneTool uint64 = 315
+ CmdCacheTask uint64 = 316
+ FlagCacheTaskJson uint64 = 317
+ ArgCacheTaskTask uint64 = 318
+ CmdCompletion uint64 = 319
+ FlagCompletionShell uint64 = 320
+ FlagCompletionIncludeBashCompletionLib uint64 = 321
+ FlagCompletionUsage uint64 = 322
+ ArgCompletionShell uint64 = 323
+ CmdConfig uint64 = 324
+ FlagConfigJson uint64 = 325
+ FlagConfigNoHeader uint64 = 326
+ FlagConfigTrackedConfigs uint64 = 327
+ CmdConfigGet uint64 = 328
+ FlagConfigGetFile uint64 = 329
+ ArgConfigGetKey uint64 = 330
+ CmdConfigLs uint64 = 331
+ FlagConfigLsJson uint64 = 332
+ FlagConfigLsNoHeader uint64 = 333
+ FlagConfigLsTrackedConfigs uint64 = 334
+ CmdConfigSet uint64 = 335
+ FlagConfigSetFile uint64 = 336
+ FlagConfigSetType uint64 = 337
+ ArgConfigSetKey uint64 = 338
+ ArgConfigSetValue uint64 = 339
+ CmdCurrent uint64 = 340
+ ArgCurrentPlugin uint64 = 341
+ CmdDeactivate uint64 = 342
+ CmdDirenv uint64 = 343
+ CmdDirenvActivate uint64 = 344
+ CmdDirenvEnvrc uint64 = 345
+ CmdDirenvExec uint64 = 346
+ CmdDotfiles uint64 = 347
+ CmdDotfilesAdd uint64 = 348
+ FlagDotfilesAddForce uint64 = 349
+ FlagDotfilesAddGlobal uint64 = 350
+ FlagDotfilesAddLocal uint64 = 351
+ FlagDotfilesAddMode uint64 = 352
+ FlagDotfilesAddDryRun uint64 = 353
+ FlagDotfilesAddNoApply uint64 = 354
+ FlagDotfilesAddPath uint64 = 355
+ FlagDotfilesAddSource uint64 = 356
+ FlagDotfilesAddYes uint64 = 357
+ ArgDotfilesAddTarget uint64 = 358
+ CmdDotfilesApply uint64 = 359
+ FlagDotfilesApplyForce uint64 = 360
+ FlagDotfilesApplyDryRun uint64 = 361
+ FlagDotfilesApplyYes uint64 = 362
+ ArgDotfilesApplyTarget uint64 = 363
+ CmdDotfilesEdit uint64 = 364
+ FlagDotfilesEditApply uint64 = 365
+ FlagDotfilesEditMode uint64 = 366
+ FlagDotfilesEditSource uint64 = 367
+ FlagDotfilesEditYes uint64 = 368
+ ArgDotfilesEditTarget uint64 = 369
+ CmdDotfilesStatus uint64 = 370
+ FlagDotfilesStatusJson uint64 = 371
+ FlagDotfilesStatusMissing uint64 = 372
+ ArgDotfilesStatusTarget uint64 = 373
+ CmdDotfilesUnapply uint64 = 374
+ FlagDotfilesUnapplyForce uint64 = 375
+ FlagDotfilesUnapplyDryRun uint64 = 376
+ FlagDotfilesUnapplyYes uint64 = 377
+ ArgDotfilesUnapplyTarget uint64 = 378
+ CmdDoctor uint64 = 379
+ FlagDoctorJson uint64 = 380
+ CmdDoctorPath uint64 = 381
+ FlagDoctorPathFull uint64 = 382
+ CmdEn uint64 = 383
+ FlagEnShell uint64 = 384
+ ArgEnDir uint64 = 385
+ CmdEnv uint64 = 386
+ FlagEnvDotenv uint64 = 387
+ FlagEnvJson uint64 = 388
+ FlagEnvShell uint64 = 389
+ FlagEnvJsonExtended uint64 = 390
+ FlagEnvRedacted uint64 = 391
+ FlagEnvValues uint64 = 392
+ ArgEnvToolVersion uint64 = 393
+ CmdExec uint64 = 394
+ FlagExecCommand uint64 = 395
+ FlagExecJobs uint64 = 396
+ FlagExecAllowEnv uint64 = 397
+ FlagExecAllowNet uint64 = 398
+ FlagExecAllowRead uint64 = 399
+ FlagExecAllowWrite uint64 = 400
+ FlagExecDenyAll uint64 = 401
+ FlagExecDenyEnv uint64 = 402
+ FlagExecDenyNet uint64 = 403
+ FlagExecDenyRead uint64 = 404
+ FlagExecDenyWrite uint64 = 405
+ FlagExecFreshEnv uint64 = 406
+ FlagExecNoDeps uint64 = 407
+ FlagExecRaw uint64 = 408
+ ArgExecToolVersion uint64 = 409
+ ArgExecCommand uint64 = 410
+ CmdFmt uint64 = 411
+ FlagFmtAll uint64 = 412
+ FlagFmtCheck uint64 = 413
+ FlagFmtStdin uint64 = 414
+ CmdGenerate uint64 = 415
+ CmdGenerateBootstrap uint64 = 416
+ FlagGenerateBootstrapLocalize uint64 = 417
+ FlagGenerateBootstrapVersion uint64 = 418
+ FlagGenerateBootstrapWrite uint64 = 419
+ FlagGenerateBootstrapLocalizedDir uint64 = 420
+ FlagGenerateBootstrapWindows uint64 = 421
+ CmdGenerateConfig uint64 = 422
+ FlagGenerateConfigGlobal uint64 = 423
+ FlagGenerateConfigDryRun uint64 = 424
+ FlagGenerateConfigToolVersions uint64 = 425
+ ArgGenerateConfigPath uint64 = 426
+ CmdGenerateDevcontainer uint64 = 427
+ FlagGenerateDevcontainerImage uint64 = 428
+ FlagGenerateDevcontainerMountMiseData uint64 = 429
+ FlagGenerateDevcontainerName uint64 = 430
+ FlagGenerateDevcontainerWrite uint64 = 431
+ CmdGenerateGitPreCommit uint64 = 432
+ FlagGenerateGitPreCommitTask uint64 = 433
+ FlagGenerateGitPreCommitWrite uint64 = 434
+ FlagGenerateGitPreCommitHook uint64 = 435
+ ArgGenerateGitPreCommitMiseArg uint64 = 436
+ CmdGenerateGithubAction uint64 = 437
+ FlagGenerateGithubActionTask uint64 = 438
+ FlagGenerateGithubActionWrite uint64 = 439
+ FlagGenerateGithubActionName uint64 = 440
+ CmdGenerateTaskDocs uint64 = 441
+ FlagGenerateTaskDocsInject uint64 = 442
+ FlagGenerateTaskDocsIndex uint64 = 443
+ FlagGenerateTaskDocsMulti uint64 = 444
+ FlagGenerateTaskDocsOutput uint64 = 445
+ FlagGenerateTaskDocsRoot uint64 = 446
+ FlagGenerateTaskDocsStyle uint64 = 447
+ CmdGenerateTaskStubs uint64 = 448
+ FlagGenerateTaskStubsDir uint64 = 449
+ FlagGenerateTaskStubsMiseBin uint64 = 450
+ CmdGenerateToolStub uint64 = 451
+ FlagGenerateToolStubBin uint64 = 452
+ FlagGenerateToolStubBootstrap uint64 = 453
+ FlagGenerateToolStubBootstrapVersion uint64 = 454
+ FlagGenerateToolStubChecksumAlgorithm uint64 = 455
+ FlagGenerateToolStubFetch uint64 = 456
+ FlagGenerateToolStubHttp uint64 = 457
+ FlagGenerateToolStubLock uint64 = 458
+ FlagGenerateToolStubPlatformBin uint64 = 459
+ FlagGenerateToolStubPlatformUrl uint64 = 460
+ FlagGenerateToolStubSkipDownload uint64 = 461
+ FlagGenerateToolStubUrl uint64 = 462
+ FlagGenerateToolStubVersion uint64 = 463
+ ArgGenerateToolStubOutput uint64 = 464
+ CmdGithub uint64 = 465
+ CmdGithubToken uint64 = 466
+ FlagGithubTokenOauth uint64 = 467
+ FlagGithubTokenRaw uint64 = 468
+ FlagGithubTokenRefresh uint64 = 469
+ FlagGithubTokenUnmask uint64 = 470
+ ArgGithubTokenHost uint64 = 471
+ CmdGlobal uint64 = 472
+ FlagGlobalFuzzy uint64 = 473
+ FlagGlobalPath uint64 = 474
+ FlagGlobalPin uint64 = 475
+ FlagGlobalRemove uint64 = 476
+ ArgGlobalToolVersion uint64 = 477
+ CmdHookEnv uint64 = 478
+ FlagHookEnvForce uint64 = 479
+ FlagHookEnvQuiet uint64 = 480
+ FlagHookEnvShell uint64 = 481
+ FlagHookEnvReason uint64 = 482
+ FlagHookEnvStatus uint64 = 483
+ CmdHookNotFound uint64 = 484
+ FlagHookNotFoundShell uint64 = 485
+ ArgHookNotFoundBin uint64 = 486
+ CmdImplode uint64 = 487
+ FlagImplodeDryRun uint64 = 488
+ FlagImplodeConfig uint64 = 489
+ CmdEdit uint64 = 490
+ FlagEditGlobal uint64 = 491
+ FlagEditDryRun uint64 = 492
+ FlagEditToolVersions uint64 = 493
+ ArgEditPath uint64 = 494
+ CmdInstall uint64 = 495
+ FlagInstallForce uint64 = 496
+ FlagInstallJobs uint64 = 497
+ FlagInstallDryRun uint64 = 498
+ FlagInstallVerbose uint64 = 499
+ FlagInstallDryRunCode uint64 = 500
+ FlagInstallIncludeTaskTools uint64 = 501
+ FlagInstallMinimumReleaseAge uint64 = 502
+ FlagInstallMonorepo uint64 = 503
+ FlagInstallRaw uint64 = 504
+ FlagInstallShared uint64 = 505
+ FlagInstallSystem uint64 = 506
+ ArgInstallToolVersion uint64 = 507
+ CmdInstallInto uint64 = 508
+ ArgInstallIntoToolVersion uint64 = 509
+ ArgInstallIntoPath uint64 = 510
+ CmdLatest uint64 = 511
+ FlagLatestInstalled uint64 = 512
+ FlagLatestMinimumReleaseAge uint64 = 513
+ ArgLatestToolVersion uint64 = 514
+ ArgLatestAsdfVersion uint64 = 515
+ CmdLink uint64 = 516
+ FlagLinkForce uint64 = 517
+ ArgLinkToolVersion uint64 = 518
+ ArgLinkPath uint64 = 519
+ CmdLocal uint64 = 520
+ FlagLocalParent uint64 = 521
+ FlagLocalFuzzy uint64 = 522
+ FlagLocalPath uint64 = 523
+ FlagLocalPin uint64 = 524
+ FlagLocalRemove uint64 = 525
+ ArgLocalToolVersion uint64 = 526
+ CmdLock uint64 = 527
+ FlagLockGlobal uint64 = 528
+ FlagLockJobs uint64 = 529
+ FlagLockDryRun uint64 = 530
+ FlagLockPlatform uint64 = 531
+ FlagLockBump uint64 = 532
+ FlagLockJson uint64 = 533
+ FlagLockLocal uint64 = 534
+ FlagLockMinimumReleaseAge uint64 = 535
+ ArgLockTool uint64 = 536
+ CmdLs uint64 = 537
+ FlagLsCurrent uint64 = 538
+ FlagLsGlobal uint64 = 539
+ FlagLsInstalled uint64 = 540
+ FlagLsJson uint64 = 541
+ FlagLsLocal uint64 = 542
+ FlagLsMissing uint64 = 543
+ FlagLsOffline uint64 = 544
+ FlagLsPlugin uint64 = 545
+ FlagLsAllSources uint64 = 546
+ FlagLsMonorepo uint64 = 547
+ FlagLsNoHeader uint64 = 548
+ FlagLsOutdated uint64 = 549
+ FlagLsPrefix uint64 = 550
+ FlagLsPrunable uint64 = 551
+ ArgLsInstalledTool uint64 = 552
+ CmdLsRemote uint64 = 553
+ FlagLsRemoteAll uint64 = 554
+ FlagLsRemoteMinimumReleaseAge uint64 = 555
+ FlagLsRemoteJson uint64 = 556
+ FlagLsRemoteNoVersionsHost uint64 = 557
+ FlagLsRemotePrerelease uint64 = 558
+ FlagLsRemoteStrictMetadata uint64 = 559
+ ArgLsRemoteToolVersion uint64 = 560
+ ArgLsRemotePrefix uint64 = 561
+ CmdMcp uint64 = 562
+ CmdOci uint64 = 563
+ CmdOciBuild uint64 = 564
+ FlagOciBuildCopy uint64 = 565
+ FlagOciBuildOutput uint64 = 566
+ FlagOciBuildFrom uint64 = 567
+ FlagOciBuildIncludeGlobal uint64 = 568
+ FlagOciBuildTag uint64 = 569
+ FlagOciBuildMountPoint uint64 = 570
+ FlagOciBuildNoMise uint64 = 571
+ FlagOciBuildOwner uint64 = 572
+ CmdOciPush uint64 = 573
+ FlagOciPushCacheFrom uint64 = 574
+ FlagOciPushFrom uint64 = 575
+ FlagOciPushImageDir uint64 = 576
+ FlagOciPushIncludeGlobal uint64 = 577
+ FlagOciPushMountPoint uint64 = 578
+ FlagOciPushNoCache uint64 = 579
+ FlagOciPushNoMise uint64 = 580
+ FlagOciPushOwner uint64 = 581
+ FlagOciPushUpdateIndex uint64 = 582
+ ArgOciPushRef uint64 = 583
+ CmdOciRun uint64 = 584
+ FlagOciRunEngine uint64 = 585
+ FlagOciRunFrom uint64 = 586
+ FlagOciRunImageDir uint64 = 587
+ FlagOciRunIncludeGlobal uint64 = 588
+ FlagOciRunKeep uint64 = 589
+ FlagOciRunMountPoint uint64 = 590
+ FlagOciRunNoMise uint64 = 591
+ FlagOciRunOwner uint64 = 592
+ FlagOciRunVolume uint64 = 593
+ FlagOciRunEnv uint64 = 594
+ FlagOciRunInteractive uint64 = 595
+ FlagOciRunTty uint64 = 596
+ FlagOciRunWorkdir uint64 = 597
+ ArgOciRunCmd uint64 = 598
+ CmdOutdated uint64 = 599
+ FlagOutdatedBump uint64 = 600
+ FlagOutdatedJson uint64 = 601
+ FlagOutdatedL uint64 = 602
+ FlagOutdatedInactive uint64 = 603
+ FlagOutdatedLocal uint64 = 604
+ FlagOutdatedMonorepo uint64 = 605
+ FlagOutdatedNoHeader uint64 = 606
+ ArgOutdatedToolVersion uint64 = 607
+ CmdPatrons uint64 = 608
+ FlagPatronsJson uint64 = 609
+ FlagPatronsRefresh uint64 = 610
+ CmdPlugins uint64 = 611
+ FlagPluginsAll uint64 = 612
+ FlagPluginsCore uint64 = 613
+ FlagPluginsUrls uint64 = 614
+ FlagPluginsRefs uint64 = 615
+ FlagPluginsUser uint64 = 616
+ CmdPluginsInstall uint64 = 617
+ FlagPluginsInstallAll uint64 = 618
+ FlagPluginsInstallForce uint64 = 619
+ FlagPluginsInstallJobs uint64 = 620
+ FlagPluginsInstallVerbose uint64 = 621
+ ArgPluginsInstallNewPlugin uint64 = 622
+ ArgPluginsInstallGitUrl uint64 = 623
+ ArgPluginsInstallRest uint64 = 624
+ CmdPluginsLink uint64 = 625
+ FlagPluginsLinkForce uint64 = 626
+ ArgPluginsLinkName uint64 = 627
+ ArgPluginsLinkDir uint64 = 628
+ CmdPluginsLs uint64 = 629
+ FlagPluginsLsAll uint64 = 630
+ FlagPluginsLsCore uint64 = 631
+ FlagPluginsLsOutdated uint64 = 632
+ FlagPluginsLsUrls uint64 = 633
+ FlagPluginsLsRefs uint64 = 634
+ FlagPluginsLsUser uint64 = 635
+ CmdPluginsLsRemote uint64 = 636
+ FlagPluginsLsRemoteUrls uint64 = 637
+ FlagPluginsLsRemoteOnlyNames uint64 = 638
+ CmdPluginsUninstall uint64 = 639
+ FlagPluginsUninstallAll uint64 = 640
+ FlagPluginsUninstallPurge uint64 = 641
+ ArgPluginsUninstallPlugin uint64 = 642
+ CmdPluginsUpdate uint64 = 643
+ FlagPluginsUpdateJobs uint64 = 644
+ ArgPluginsUpdatePlugin uint64 = 645
+ CmdDeps uint64 = 646
+ FlagDepsExplain uint64 = 647
+ FlagDepsForce uint64 = 648
+ FlagDepsDryRun uint64 = 649
+ FlagDepsList uint64 = 650
+ FlagDepsMonorepo uint64 = 651
+ FlagDepsOnly uint64 = 652
+ FlagDepsSkip uint64 = 653
+ ArgDepsProvider uint64 = 654
+ CmdDepsAdd uint64 = 655
+ FlagDepsAddDev uint64 = 656
+ ArgDepsAddPackages uint64 = 657
+ CmdDepsInstall uint64 = 658
+ FlagDepsInstallExplain uint64 = 659
+ FlagDepsInstallForce uint64 = 660
+ FlagDepsInstallDryRun uint64 = 661
+ FlagDepsInstallList uint64 = 662
+ FlagDepsInstallMonorepo uint64 = 663
+ FlagDepsInstallOnly uint64 = 664
+ FlagDepsInstallSkip uint64 = 665
+ ArgDepsInstallProvider uint64 = 666
+ CmdDepsRemove uint64 = 667
+ ArgDepsRemovePackages uint64 = 668
+ CmdPrune uint64 = 669
+ FlagPruneDryRun uint64 = 670
+ FlagPruneConfigs uint64 = 671
+ FlagPruneDryRunCode uint64 = 672
+ FlagPruneMonorepo uint64 = 673
+ FlagPruneTools uint64 = 674
+ ArgPruneInstalledTool uint64 = 675
+ CmdRegistry uint64 = 676
+ FlagRegistryBackend uint64 = 677
+ FlagRegistryComplete uint64 = 678
+ FlagRegistryHideAliased uint64 = 679
+ FlagRegistryJson uint64 = 680
+ FlagRegistrySecurity uint64 = 681
+ ArgRegistryName uint64 = 682
+ CmdRenderHelp uint64 = 683
+ CmdReshim uint64 = 684
+ FlagReshimForce uint64 = 685
+ ArgReshimTool uint64 = 686
+ ArgReshimVersion uint64 = 687
+ CmdRun uint64 = 688
+ FlagRunAffected uint64 = 689
+ FlagRunAffectedBase uint64 = 690
+ FlagRunAffectedExplain uint64 = 691
+ FlagRunAffectedHead uint64 = 692
+ FlagRunAffectedJson uint64 = 693
+ FlagRunAll uint64 = 694
+ FlagRunContinueOnError uint64 = 695
+ FlagRunCd uint64 = 696
+ FlagRunForce uint64 = 697
+ FlagRunJobs uint64 = 698
+ FlagRunDryRun uint64 = 699
+ FlagRunOutput uint64 = 700
+ FlagRunQuiet uint64 = 701
+ FlagRunRaw uint64 = 702
+ FlagRunShell uint64 = 703
+ FlagRunSilent uint64 = 704
+ FlagRunTool uint64 = 705
+ FlagRunAllowEnv uint64 = 706
+ FlagRunAllowNet uint64 = 707
+ FlagRunAllowRead uint64 = 708
+ FlagRunAllowWrite uint64 = 709
+ FlagRunDenyAll uint64 = 710
+ FlagRunDenyEnv uint64 = 711
+ FlagRunDenyNet uint64 = 712
+ FlagRunDenyRead uint64 = 713
+ FlagRunDenyWrite uint64 = 714
+ FlagRunFreshEnv uint64 = 715
+ FlagRunNoCache uint64 = 716
+ FlagRunNoDeps uint64 = 717
+ FlagRunNoTimings uint64 = 718
+ FlagRunSkipDeps uint64 = 719
+ FlagRunSkipTools uint64 = 720
+ FlagRunTaskCache uint64 = 721
+ FlagRunTaskCacheExplain uint64 = 722
+ FlagRunTaskCacheExplainJson uint64 = 723
+ FlagRunTaskCacheStats uint64 = 724
+ FlagRunTimeout uint64 = 725
+ FlagRunTimings uint64 = 726
+ CmdSearch uint64 = 727
+ FlagSearchInteractive uint64 = 728
+ FlagSearchMatchType uint64 = 729
+ FlagSearchNoHeader uint64 = 730
+ ArgSearchName uint64 = 731
+ CmdSelfUpdate uint64 = 732
+ FlagSelfUpdateForce uint64 = 733
+ FlagSelfUpdateYes uint64 = 734
+ FlagSelfUpdateNoPlugins uint64 = 735
+ ArgSelfUpdateVersion uint64 = 736
+ CmdSet uint64 = 737
+ FlagSetEnv uint64 = 738
+ FlagSetGlobal uint64 = 739
+ FlagSetAgeEncrypt uint64 = 740
+ FlagSetAgeKeyFile uint64 = 741
+ FlagSetAgeRecipient uint64 = 742
+ FlagSetAgeSshRecipient uint64 = 743
+ FlagSetComplete uint64 = 744
+ FlagSetFile uint64 = 745
+ FlagSetNoRedact uint64 = 746
+ FlagSetPrompt uint64 = 747
+ FlagSetRemove uint64 = 748
+ FlagSetStdin uint64 = 749
+ ArgSetEnvVar uint64 = 750
+ CmdSettings uint64 = 751
+ FlagSettingsAll uint64 = 752
+ FlagSettingsJson uint64 = 753
+ FlagSettingsLocal uint64 = 754
+ FlagSettingsToml uint64 = 755
+ FlagSettingsComplete uint64 = 756
+ FlagSettingsJsonExtended uint64 = 757
+ ArgSettingsSetting uint64 = 758
+ ArgSettingsValue uint64 = 759
+ CmdSettingsAdd uint64 = 760
+ FlagSettingsAddLocal uint64 = 761
+ ArgSettingsAddSetting uint64 = 762
+ ArgSettingsAddValue uint64 = 763
+ CmdSettingsGet uint64 = 764
+ FlagSettingsGetLocal uint64 = 765
+ ArgSettingsGetSetting uint64 = 766
+ CmdSettingsLs uint64 = 767
+ FlagSettingsLsAll uint64 = 768
+ FlagSettingsLsJson uint64 = 769
+ FlagSettingsLsLocal uint64 = 770
+ FlagSettingsLsToml uint64 = 771
+ FlagSettingsLsComplete uint64 = 772
+ FlagSettingsLsJsonExtended uint64 = 773
+ ArgSettingsLsSetting uint64 = 774
+ CmdSettingsSet uint64 = 775
+ FlagSettingsSetLocal uint64 = 776
+ ArgSettingsSetSetting uint64 = 777
+ ArgSettingsSetValue uint64 = 778
+ CmdSettingsUnset uint64 = 779
+ FlagSettingsUnsetLocal uint64 = 780
+ ArgSettingsUnsetKey uint64 = 781
+ CmdShell uint64 = 782
+ FlagShellJobs uint64 = 783
+ FlagShellUnset uint64 = 784
+ FlagShellRaw uint64 = 785
+ ArgShellToolVersion uint64 = 786
+ CmdShellAlias uint64 = 787
+ FlagShellAliasNoHeader uint64 = 788
+ CmdShellAliasGet uint64 = 789
+ ArgShellAliasGetShellAlias uint64 = 790
+ CmdShellAliasLs uint64 = 791
+ FlagShellAliasLsNoHeader uint64 = 792
+ CmdShellAliasSet uint64 = 793
+ ArgShellAliasSetShellAlias uint64 = 794
+ ArgShellAliasSetCommand uint64 = 795
+ CmdShellAliasUnset uint64 = 796
+ ArgShellAliasUnsetShellAlias uint64 = 797
+ CmdSponsors uint64 = 798
+ CmdSync uint64 = 799
+ CmdSyncNode uint64 = 800
+ FlagSyncNodeBrew uint64 = 801
+ FlagSyncNodeNodenv uint64 = 802
+ FlagSyncNodeNvm uint64 = 803
+ CmdSyncPython uint64 = 804
+ FlagSyncPythonPyenv uint64 = 805
+ FlagSyncPythonUv uint64 = 806
+ CmdSyncRuby uint64 = 807
+ FlagSyncRubyBrew uint64 = 808
+ CmdTasks uint64 = 809
+ FlagTasksGlobal uint64 = 810
+ FlagTasksJson uint64 = 811
+ FlagTasksLocal uint64 = 812
+ FlagTasksExtended uint64 = 813
+ FlagTasksAll uint64 = 814
+ FlagTasksComplete uint64 = 815
+ FlagTasksHidden uint64 = 816
+ FlagTasksNameOnly uint64 = 817
+ FlagTasksNoHeader uint64 = 818
+ FlagTasksSort uint64 = 819
+ FlagTasksSortOrder uint64 = 820
+ FlagTasksUsage uint64 = 821
+ ArgTasksTask uint64 = 822
+ CmdTasksAdd uint64 = 823
+ FlagTasksAddAlias uint64 = 824
+ FlagTasksAddDepends uint64 = 825
+ FlagTasksAddDir uint64 = 826
+ FlagTasksAddFile uint64 = 827
+ FlagTasksAddHide uint64 = 828
+ FlagTasksAddQuiet uint64 = 829
+ FlagTasksAddRaw uint64 = 830
+ FlagTasksAddSources uint64 = 831
+ FlagTasksAddWaitFor uint64 = 832
+ FlagTasksAddDependsPost uint64 = 833
+ FlagTasksAddDescription uint64 = 834
+ FlagTasksAddOutputs uint64 = 835
+ FlagTasksAddRunWindows uint64 = 836
+ FlagTasksAddShell uint64 = 837
+ FlagTasksAddSilent uint64 = 838
+ ArgTasksAddTask uint64 = 839
+ ArgTasksAddRun uint64 = 840
+ CmdTasksDeps uint64 = 841
+ FlagTasksDepsCompact uint64 = 842
+ FlagTasksDepsDot uint64 = 843
+ FlagTasksDepsHidden uint64 = 844
+ ArgTasksDepsTasks uint64 = 845
+ CmdTasksEdit uint64 = 846
+ FlagTasksEditPath uint64 = 847
+ ArgTasksEditTask uint64 = 848
+ CmdTasksGraph uint64 = 849
+ FlagTasksGraphJson uint64 = 850
+ FlagTasksGraphExplain uint64 = 851
+ FlagTasksGraphNoHeader uint64 = 852
+ CmdTasksInfo uint64 = 853
+ FlagTasksInfoJson uint64 = 854
+ ArgTasksInfoTask uint64 = 855
+ CmdTasksLs uint64 = 856
+ FlagTasksLsGlobal uint64 = 857
+ FlagTasksLsJson uint64 = 858
+ FlagTasksLsLocal uint64 = 859
+ FlagTasksLsExtended uint64 = 860
+ FlagTasksLsAll uint64 = 861
+ FlagTasksLsComplete uint64 = 862
+ FlagTasksLsHidden uint64 = 863
+ FlagTasksLsNameOnly uint64 = 864
+ FlagTasksLsNoHeader uint64 = 865
+ FlagTasksLsSort uint64 = 866
+ FlagTasksLsSortOrder uint64 = 867
+ FlagTasksLsUsage uint64 = 868
+ CmdTasksRun uint64 = 869
+ FlagTasksRunAffected uint64 = 870
+ FlagTasksRunAffectedBase uint64 = 871
+ FlagTasksRunAffectedExplain uint64 = 872
+ FlagTasksRunAffectedHead uint64 = 873
+ FlagTasksRunAffectedJson uint64 = 874
+ FlagTasksRunAll uint64 = 875
+ FlagTasksRunContinueOnError uint64 = 876
+ FlagTasksRunCd uint64 = 877
+ FlagTasksRunForce uint64 = 878
+ FlagTasksRunJobs uint64 = 879
+ FlagTasksRunDryRun uint64 = 880
+ FlagTasksRunOutput uint64 = 881
+ FlagTasksRunQuiet uint64 = 882
+ FlagTasksRunRaw uint64 = 883
+ FlagTasksRunShell uint64 = 884
+ FlagTasksRunSilent uint64 = 885
+ FlagTasksRunTool uint64 = 886
+ FlagTasksRunAllowEnv uint64 = 887
+ FlagTasksRunAllowNet uint64 = 888
+ FlagTasksRunAllowRead uint64 = 889
+ FlagTasksRunAllowWrite uint64 = 890
+ FlagTasksRunDenyAll uint64 = 891
+ FlagTasksRunDenyEnv uint64 = 892
+ FlagTasksRunDenyNet uint64 = 893
+ FlagTasksRunDenyRead uint64 = 894
+ FlagTasksRunDenyWrite uint64 = 895
+ FlagTasksRunFreshEnv uint64 = 896
+ FlagTasksRunNoCache uint64 = 897
+ FlagTasksRunNoDeps uint64 = 898
+ FlagTasksRunNoTimings uint64 = 899
+ FlagTasksRunSkipDeps uint64 = 900
+ FlagTasksRunSkipTools uint64 = 901
+ FlagTasksRunTaskCache uint64 = 902
+ FlagTasksRunTaskCacheExplain uint64 = 903
+ FlagTasksRunTaskCacheExplainJson uint64 = 904
+ FlagTasksRunTaskCacheStats uint64 = 905
+ FlagTasksRunTimeout uint64 = 906
+ FlagTasksRunTimings uint64 = 907
+ ArgTasksRunTask uint64 = 908
+ ArgTasksRunArgs uint64 = 909
+ ArgTasksRunArgsLast uint64 = 910
+ CmdTasksValidate uint64 = 911
+ FlagTasksValidateErrorsOnly uint64 = 912
+ FlagTasksValidateJson uint64 = 913
+ ArgTasksValidateTasks uint64 = 914
+ CmdTestTool uint64 = 915
+ FlagTestToolAll uint64 = 916
+ FlagTestToolJobs uint64 = 917
+ FlagTestToolAllConfig uint64 = 918
+ FlagTestToolIncludeNonDefined uint64 = 919
+ FlagTestToolRaw uint64 = 920
+ ArgTestToolTools uint64 = 921
+ CmdToken uint64 = 922
+ CmdTokenForgejo uint64 = 923
+ FlagTokenForgejoUnmask uint64 = 924
+ ArgTokenForgejoHost uint64 = 925
+ CmdTokenGithub uint64 = 926
+ FlagTokenGithubOauth uint64 = 927
+ FlagTokenGithubRaw uint64 = 928
+ FlagTokenGithubRefresh uint64 = 929
+ FlagTokenGithubUnmask uint64 = 930
+ ArgTokenGithubHost uint64 = 931
+ CmdTokenGitlab uint64 = 932
+ FlagTokenGitlabUnmask uint64 = 933
+ ArgTokenGitlabHost uint64 = 934
+ CmdTool uint64 = 935
+ FlagToolJson uint64 = 936
+ FlagToolActive uint64 = 937
+ FlagToolBackend uint64 = 938
+ FlagToolConfigSource uint64 = 939
+ FlagToolDescription uint64 = 940
+ FlagToolInstalled uint64 = 941
+ FlagToolRequested uint64 = 942
+ FlagToolToolOptions uint64 = 943
+ ArgToolTool uint64 = 944
+ CmdToolStub uint64 = 945
+ ArgToolStubFile uint64 = 946
+ ArgToolStubArgs uint64 = 947
+ CmdTrust uint64 = 948
+ FlagTrustAll uint64 = 949
+ FlagTrustIgnore uint64 = 950
+ FlagTrustShow uint64 = 951
+ FlagTrustUntrust uint64 = 952
+ ArgTrustConfigFile uint64 = 953
+ CmdUninstall uint64 = 954
+ FlagUninstallAll uint64 = 955
+ FlagUninstallDryRun uint64 = 956
+ FlagUninstallDryRunCode uint64 = 957
+ ArgUninstallInstalledToolVersion uint64 = 958
+ CmdUnset uint64 = 959
+ FlagUnsetFile uint64 = 960
+ FlagUnsetGlobal uint64 = 961
+ ArgUnsetEnvKey uint64 = 962
+ CmdUntrust uint64 = 963
+ ArgUntrustConfigFile uint64 = 964
+ CmdUnuse uint64 = 965
+ FlagUnuseEnv uint64 = 966
+ FlagUnuseGlobal uint64 = 967
+ FlagUnusePath uint64 = 968
+ FlagUnuseNoPrune uint64 = 969
+ ArgUnuseInstalledToolVersion uint64 = 970
+ CmdUpgrade uint64 = 971
+ FlagUpgradeBump uint64 = 972
+ FlagUpgradeInteractive uint64 = 973
+ FlagUpgradeJobs uint64 = 974
+ FlagUpgradeL uint64 = 975
+ FlagUpgradeDryRun uint64 = 976
+ FlagUpgradeExclude uint64 = 977
+ FlagUpgradeDryRunCode uint64 = 978
+ FlagUpgradeInactive uint64 = 979
+ FlagUpgradeLocal uint64 = 980
+ FlagUpgradeMinimumReleaseAge uint64 = 981
+ FlagUpgradeMonorepo uint64 = 982
+ FlagUpgradeNoPrune uint64 = 983
+ FlagUpgradePrune uint64 = 984
+ FlagUpgradeRaw uint64 = 985
+ ArgUpgradeInstalledToolVersion uint64 = 986
+ CmdUsage uint64 = 987
+ CmdUse uint64 = 988
+ FlagUseEnv uint64 = 989
+ FlagUseForce uint64 = 990
+ FlagUseGlobal uint64 = 991
+ FlagUseJobs uint64 = 992
+ FlagUseDryRun uint64 = 993
+ FlagUsePath uint64 = 994
+ FlagUseDryRunCode uint64 = 995
+ FlagUseFuzzy uint64 = 996
+ FlagUseMinimumReleaseAge uint64 = 997
+ FlagUsePin uint64 = 998
+ FlagUseRaw uint64 = 999
+ FlagUseRemove uint64 = 1000
+ ArgUseToolVersion uint64 = 1001
+ CmdVersion uint64 = 1002
+ FlagVersionJson uint64 = 1003
+ CmdWatch uint64 = 1004
+ FlagWatchTaskFlag uint64 = 1005
+ FlagWatchGlob uint64 = 1006
+ FlagWatchSkipDeps uint64 = 1007
+ FlagWatchWatch uint64 = 1008
+ FlagWatchWatchNonRecursive uint64 = 1009
+ FlagWatchWatchFile uint64 = 1010
+ FlagWatchClear uint64 = 1011
+ FlagWatchOnBusyUpdate uint64 = 1012
+ FlagWatchRestart uint64 = 1013
+ FlagWatchSignal uint64 = 1014
+ FlagWatchStopSignal uint64 = 1015
+ FlagWatchStopTimeout uint64 = 1016
+ FlagWatchMapSignal uint64 = 1017
+ FlagWatchDebounce uint64 = 1018
+ FlagWatchStdinQuit uint64 = 1019
+ FlagWatchNoVcsIgnore uint64 = 1020
+ FlagWatchNoProjectIgnore uint64 = 1021
+ FlagWatchNoGlobalIgnore uint64 = 1022
+ FlagWatchNoDefaultIgnore uint64 = 1023
+ FlagWatchNoDiscoverIgnore uint64 = 1024
+ FlagWatchIgnoreNothing uint64 = 1025
+ FlagWatchPostpone uint64 = 1026
+ FlagWatchDelayRun uint64 = 1027
+ FlagWatchPoll uint64 = 1028
+ FlagWatchShell uint64 = 1029
+ FlagWatchN uint64 = 1030
+ FlagWatchEmitEventsTo uint64 = 1031
+ FlagWatchOnlyEmitEvents uint64 = 1032
+ FlagWatchEnv uint64 = 1033
+ FlagWatchWrapProcess uint64 = 1034
+ FlagWatchNotify uint64 = 1035
+ FlagWatchColor uint64 = 1036
+ FlagWatchTimings uint64 = 1037
+ FlagWatchQuiet uint64 = 1038
+ FlagWatchBell uint64 = 1039
+ FlagWatchProjectOrigin uint64 = 1040
+ FlagWatchWorkdir uint64 = 1041
+ FlagWatchExts uint64 = 1042
+ FlagWatchFilter uint64 = 1043
+ FlagWatchFilterFile uint64 = 1044
+ FlagWatchFilterProg uint64 = 1045
+ FlagWatchIgnore uint64 = 1046
+ FlagWatchIgnoreFile uint64 = 1047
+ FlagWatchFsEvents uint64 = 1048
+ FlagWatchNoMeta uint64 = 1049
+ FlagWatchPrintEvents uint64 = 1050
+ FlagWatchManual uint64 = 1051
+ ArgWatchTask uint64 = 1052
+ ArgWatchArgs uint64 = 1053
+ CmdWhere uint64 = 1054
+ ArgWhereToolVersion uint64 = 1055
+ ArgWhereAsdfVersion uint64 = 1056
+ CmdWhich uint64 = 1057
+ FlagWhichTool uint64 = 1058
+ FlagWhichComplete uint64 = 1059
+ FlagWhichPlugin uint64 = 1060
+ FlagWhichVersion uint64 = 1061
+ ArgWhichBinName uint64 = 1062
+)
+
+// Root is the command tree for `mise`. Pass it to argv.New.
+var Root = &argv.Command{
+ Name: "mise",
+ Key: CmdRoot,
+ Flags: []*argv.Flag{
+ {Key: FlagContinueOnError, Name: "continue-on-error", Longs: []string{"continue-on-error"}, Shorts: []byte{'c'}},
+ {Key: FlagCd, Name: "cd", Longs: []string{"cd"}, Shorts: []byte{'C'}, TakesValue: true, Global: true},
+ {Key: FlagEnv, Name: "env", Longs: []string{"env"}, Shorts: []byte{'E'}, TakesValue: true, Global: true},
+ {Key: FlagForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ {Key: FlagJobs, Name: "jobs", Longs: []string{"jobs"}, Shorts: []byte{'j'}, TakesValue: true, Global: true},
+ {Key: FlagDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagProfile, Name: "profile", Longs: []string{"profile"}, Shorts: []byte{'P'}, TakesValue: true, Global: true},
+ {Key: FlagQuiet, Name: "quiet", Longs: []string{"quiet"}, Shorts: []byte{'q'}, Global: true},
+ {Key: FlagShell, Name: "shell", Longs: []string{"shell"}, Shorts: []byte{'s'}, TakesValue: true},
+ {Key: FlagTool, Name: "tool", Longs: []string{"tool"}, Shorts: []byte{'t'}, TakesValue: true},
+ {Key: FlagVerbose, Name: "verbose", Longs: []string{"verbose"}, Shorts: []byte{'v'}, Global: true},
+ {Key: FlagVersion, Name: "version", Longs: []string{"version"}, Shorts: []byte{'V'}},
+ {Key: FlagYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}, Global: true},
+ {Key: FlagDebug, Name: "debug", Longs: []string{"debug"}, Global: true},
+ {Key: FlagLogLevel, Name: "log-level", Longs: []string{"log-level"}, TakesValue: true, Global: true},
+ {Key: FlagNoConfig, Name: "no-config", Longs: []string{"no-config"}},
+ {Key: FlagNoEnv, Name: "no-env", Longs: []string{"no-env"}},
+ {Key: FlagNoHooks, Name: "no-hooks", Longs: []string{"no-hooks"}},
+ {Key: FlagNoTimings, Name: "no-timings", Longs: []string{"no-timings", "no-timing"}, HiddenLongs: []string{"no-timing"}},
+ {Key: FlagOutput, Name: "output", Longs: []string{"output"}, TakesValue: true},
+ {Key: FlagRaw, Name: "raw", Longs: []string{"raw"}, Global: true},
+ {Key: FlagLocked, Name: "locked", Longs: []string{"locked"}, Global: true},
+ {Key: FlagSilent, Name: "silent", Longs: []string{"silent"}, Global: true},
+ {Key: FlagTimings, Name: "timings", Longs: []string{"timings", "timing"}, HiddenLongs: []string{"timing"}},
+ {Key: FlagTrace, Name: "trace", Longs: []string{"trace"}, Global: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgTask, Name: "TASK", DoubleDash: argv.DoubleDashAutomatic},
+ {Key: ArgTaskArgs, Name: "TASK_ARGS", Var: true},
+ {Key: ArgTaskArgsLast, Name: "TASK_ARGS_LAST", Var: true, DoubleDash: argv.DoubleDashRequired},
+ },
+ Subcommands: []*argv.Command{cmdActivate, cmdToolAlias, cmdAsdf, cmdBackends, cmdBinPaths, cmdBootstrap, cmdCache, cmdCompletion, cmdConfig, cmdCurrent, cmdDeactivate, cmdDirenv, cmdDotfiles, cmdDoctor, cmdEn, cmdEnv, cmdExec, cmdFmt, cmdGenerate, cmdGithub, cmdGlobal, cmdHookEnv, cmdHookNotFound, cmdImplode, cmdEdit, cmdInstall, cmdInstallInto, cmdLatest, cmdLink, cmdLocal, cmdLock, cmdLs, cmdLsRemote, cmdMcp, cmdOci, cmdOutdated, cmdPatrons, cmdPlugins, cmdDeps, cmdPrune, cmdRegistry, cmdRenderHelp, cmdReshim, cmdRun, cmdSearch, cmdSelfUpdate, cmdSet, cmdSettings, cmdShell, cmdShellAlias, cmdSponsors, cmdSync, cmdTasks, cmdTestTool, cmdToken, cmdTool, cmdToolStub, cmdTrust, cmdUninstall, cmdUnset, cmdUntrust, cmdUnuse, cmdUpgrade, cmdUsage, cmdUse, cmdVersion, cmdWatch, cmdWhere, cmdWhich},
+ ArgRequiredElseHelp: true,
+ DefaultSubcommand: cmdRun,
+}
+
+// activate
+var cmdActivate = &argv.Command{
+ Name: "activate",
+ Key: CmdActivate,
+ Flags: []*argv.Flag{
+ {Key: FlagActivateQuiet, Name: "quiet", Longs: []string{"quiet"}, Shorts: []byte{'q'}},
+ {Key: FlagActivateShell, Name: "shell", Longs: []string{"shell"}, Shorts: []byte{'s'}, TakesValue: true},
+ {Key: FlagActivateNoHookEnv, Name: "no-hook-env", Longs: []string{"no-hook-env"}},
+ {Key: FlagActivateShims, Name: "shims", Longs: []string{"shims"}},
+ {Key: FlagActivateStatus, Name: "status", Longs: []string{"status"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgActivateShellType, Name: "SHELL_TYPE"},
+ },
+}
+
+// tool-alias
+var cmdToolAlias = &argv.Command{
+ Name: "tool-alias",
+ Key: CmdToolAlias,
+ Aliases: []string{"alias", "aliases"},
+ Flags: []*argv.Flag{
+ {Key: FlagToolAliasTool, Name: "tool", Longs: []string{"tool", "plugin"}, HiddenLongs: []string{"plugin"}, Shorts: []byte{'p'}, TakesValue: true},
+ {Key: FlagToolAliasNoHeader, Name: "no-header", Longs: []string{"no-header"}},
+ },
+ Subcommands: []*argv.Command{cmdToolAliasGet, cmdToolAliasLs, cmdToolAliasSet, cmdToolAliasUnset},
+}
+
+// tool-alias get
+var cmdToolAliasGet = &argv.Command{
+ Name: "get",
+ Key: CmdToolAliasGet,
+ Args: []*argv.Arg{
+ {Key: ArgToolAliasGetTool, Name: "TOOL", Required: true},
+ {Key: ArgToolAliasGetAlias, Name: "ALIAS", Required: true},
+ },
+}
+
+// tool-alias ls
+var cmdToolAliasLs = &argv.Command{
+ Name: "ls",
+ Key: CmdToolAliasLs,
+ Aliases: []string{"list"},
+ Flags: []*argv.Flag{
+ {Key: FlagToolAliasLsNoHeader, Name: "no-header", Longs: []string{"no-header"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgToolAliasLsTool, Name: "TOOL"},
+ },
+}
+
+// tool-alias set
+var cmdToolAliasSet = &argv.Command{
+ Name: "set",
+ Key: CmdToolAliasSet,
+ Aliases: []string{"add", "create"},
+ Args: []*argv.Arg{
+ {Key: ArgToolAliasSetTool, Name: "TOOL", Required: true},
+ {Key: ArgToolAliasSetAlias, Name: "ALIAS", Required: true},
+ {Key: ArgToolAliasSetValue, Name: "VALUE"},
+ },
+}
+
+// tool-alias unset
+var cmdToolAliasUnset = &argv.Command{
+ Name: "unset",
+ Key: CmdToolAliasUnset,
+ Aliases: []string{"rm", "remove", "delete", "del"},
+ Args: []*argv.Arg{
+ {Key: ArgToolAliasUnsetTool, Name: "TOOL", Required: true},
+ {Key: ArgToolAliasUnsetAlias, Name: "ALIAS"},
+ },
+}
+
+// asdf
+var cmdAsdf = &argv.Command{
+ Name: "asdf",
+ Key: CmdAsdf,
+ Args: []*argv.Arg{
+ {Key: ArgAsdfArgs, Name: "ARGS", Var: true, DoubleDash: argv.DoubleDashAutomatic},
+ },
+}
+
+// backends
+var cmdBackends = &argv.Command{
+ Name: "backends",
+ Key: CmdBackends,
+ Aliases: []string{"b", "backend", "backend-list"},
+ Subcommands: []*argv.Command{cmdBackendsLs},
+}
+
+// backends ls
+var cmdBackendsLs = &argv.Command{
+ Name: "ls",
+ Key: CmdBackendsLs,
+ Aliases: []string{"list"},
+}
+
+// bin-paths
+var cmdBinPaths = &argv.Command{
+ Name: "bin-paths",
+ Key: CmdBinPaths,
+ Flags: []*argv.Flag{
+ {Key: FlagBinPathsBinNames, Name: "bin-names", Longs: []string{"bin-names"}},
+ {Key: FlagBinPathsJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgBinPathsToolVersion, Name: "TOOL@VERSION", Var: true},
+ },
+}
+
+// bootstrap
+var cmdBootstrap = &argv.Command{
+ Name: "bootstrap",
+ Key: CmdBootstrap,
+ Aliases: []string{"bs"},
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ {Key: FlagBootstrapForceDotfiles, Name: "force-dotfiles", Longs: []string{"force-dotfiles"}},
+ {Key: FlagBootstrapOnly, Name: "only", Longs: []string{"only"}, TakesValue: true, Delimiter: ','},
+ {Key: FlagBootstrapPromptSecrets, Name: "prompt-secrets", Longs: []string{"prompt-secrets"}},
+ {Key: FlagBootstrapSkip, Name: "skip", Longs: []string{"skip"}, TakesValue: true, Delimiter: ','},
+ {Key: FlagBootstrapUpdate, Name: "update", Longs: []string{"update"}},
+ },
+ Subcommands: []*argv.Command{cmdBootstrapApplyAccountPlan, cmdBootstrapApplyServicePlan, cmdBootstrapApplyFirewallPlan, cmdBootstrapApplySystemPlan, cmdBootstrapInspectSystemFiles, cmdBootstrapInspectFirewallPlan, cmdBootstrapAccounts, cmdBootstrapCompose, cmdBootstrapDotfiles, cmdBootstrapFiles, cmdBootstrapFirewall, cmdBootstrapLaunchd, cmdBootstrapLinux, cmdBootstrapMacos, cmdBootstrapMacosDefaults2, cmdBootstrapMiseShellActivate, cmdBootstrapPackages, cmdBootstrapPlan, cmdBootstrapPlugins, cmdBootstrapRemote, cmdBootstrapRepos, cmdBootstrapSecrets, cmdBootstrapServices, cmdBootstrapStatus, cmdBootstrapSystemd, cmdBootstrapUser},
+}
+
+// bootstrap __apply-account-plan
+var cmdBootstrapApplyAccountPlan = &argv.Command{
+ Name: "__apply-account-plan",
+ Key: CmdBootstrapApplyAccountPlan,
+}
+
+// bootstrap __apply-service-plan
+var cmdBootstrapApplyServicePlan = &argv.Command{
+ Name: "__apply-service-plan",
+ Key: CmdBootstrapApplyServicePlan,
+}
+
+// bootstrap __apply-firewall-plan
+var cmdBootstrapApplyFirewallPlan = &argv.Command{
+ Name: "__apply-firewall-plan",
+ Key: CmdBootstrapApplyFirewallPlan,
+}
+
+// bootstrap __apply-system-plan
+var cmdBootstrapApplySystemPlan = &argv.Command{
+ Name: "__apply-system-plan",
+ Key: CmdBootstrapApplySystemPlan,
+}
+
+// bootstrap __inspect-system-files
+var cmdBootstrapInspectSystemFiles = &argv.Command{
+ Name: "__inspect-system-files",
+ Key: CmdBootstrapInspectSystemFiles,
+}
+
+// bootstrap __inspect-firewall-plan
+var cmdBootstrapInspectFirewallPlan = &argv.Command{
+ Name: "__inspect-firewall-plan",
+ Key: CmdBootstrapInspectFirewallPlan,
+}
+
+// bootstrap accounts
+var cmdBootstrapAccounts = &argv.Command{
+ Name: "accounts",
+ Key: CmdBootstrapAccounts,
+ Subcommands: []*argv.Command{cmdBootstrapAccountsApply, cmdBootstrapAccountsStatus},
+}
+
+// bootstrap accounts apply
+var cmdBootstrapAccountsApply = &argv.Command{
+ Name: "apply",
+ Key: CmdBootstrapAccountsApply,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapAccountsApplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapAccountsApplyYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+}
+
+// bootstrap accounts status
+var cmdBootstrapAccountsStatus = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapAccountsStatus,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapAccountsStatusJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapAccountsStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ },
+}
+
+// bootstrap compose
+var cmdBootstrapCompose = &argv.Command{
+ Name: "compose",
+ Key: CmdBootstrapCompose,
+ Subcommands: []*argv.Command{cmdBootstrapComposeApply, cmdBootstrapComposeStatus},
+}
+
+// bootstrap compose apply
+var cmdBootstrapComposeApply = &argv.Command{
+ Name: "apply",
+ Key: CmdBootstrapComposeApply,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapComposeApplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapComposeApplyYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+}
+
+// bootstrap compose status
+var cmdBootstrapComposeStatus = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapComposeStatus,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapComposeStatusJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapComposeStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ },
+}
+
+// bootstrap dotfiles
+var cmdBootstrapDotfiles = &argv.Command{
+ Name: "dotfiles",
+ Key: CmdBootstrapDotfiles,
+ Subcommands: []*argv.Command{cmdBootstrapDotfilesAdd, cmdBootstrapDotfilesApply, cmdBootstrapDotfilesEdit, cmdBootstrapDotfilesStatus, cmdBootstrapDotfilesUnapply},
+}
+
+// bootstrap dotfiles add
+var cmdBootstrapDotfilesAdd = &argv.Command{
+ Name: "add",
+ Key: CmdBootstrapDotfilesAdd,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapDotfilesAddForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ {Key: FlagBootstrapDotfilesAddGlobal, Name: "global", Longs: []string{"global"}, Shorts: []byte{'g'}},
+ {Key: FlagBootstrapDotfilesAddLocal, Name: "local", Longs: []string{"local"}, Shorts: []byte{'l'}},
+ {Key: FlagBootstrapDotfilesAddMode, Name: "mode", Longs: []string{"mode"}, Shorts: []byte{'m'}, TakesValue: true},
+ {Key: FlagBootstrapDotfilesAddDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapDotfilesAddNoApply, Name: "no-apply", Longs: []string{"no-apply"}},
+ {Key: FlagBootstrapDotfilesAddPath, Name: "path", Longs: []string{"path"}, Shorts: []byte{'p'}, TakesValue: true},
+ {Key: FlagBootstrapDotfilesAddSource, Name: "source", Longs: []string{"source"}, Shorts: []byte{'s'}, TakesValue: true},
+ {Key: FlagBootstrapDotfilesAddYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgBootstrapDotfilesAddTarget, Name: "TARGET", Required: true, Var: true},
+ },
+}
+
+// bootstrap dotfiles apply
+var cmdBootstrapDotfilesApply = &argv.Command{
+ Name: "apply",
+ Key: CmdBootstrapDotfilesApply,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapDotfilesApplyForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ {Key: FlagBootstrapDotfilesApplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapDotfilesApplyYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgBootstrapDotfilesApplyTarget, Name: "TARGET", Var: true},
+ },
+}
+
+// bootstrap dotfiles edit
+var cmdBootstrapDotfilesEdit = &argv.Command{
+ Name: "edit",
+ Key: CmdBootstrapDotfilesEdit,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapDotfilesEditApply, Name: "apply", Longs: []string{"apply"}},
+ {Key: FlagBootstrapDotfilesEditMode, Name: "mode", Longs: []string{"mode"}, Shorts: []byte{'m'}, TakesValue: true},
+ {Key: FlagBootstrapDotfilesEditSource, Name: "source", Longs: []string{"source"}, Shorts: []byte{'s'}, TakesValue: true},
+ {Key: FlagBootstrapDotfilesEditYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgBootstrapDotfilesEditTarget, Name: "TARGET", Required: true},
+ },
+}
+
+// bootstrap dotfiles status
+var cmdBootstrapDotfilesStatus = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapDotfilesStatus,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapDotfilesStatusJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapDotfilesStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgBootstrapDotfilesStatusTarget, Name: "TARGET", Var: true},
+ },
+}
+
+// bootstrap dotfiles unapply
+var cmdBootstrapDotfilesUnapply = &argv.Command{
+ Name: "unapply",
+ Key: CmdBootstrapDotfilesUnapply,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapDotfilesUnapplyForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ {Key: FlagBootstrapDotfilesUnapplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapDotfilesUnapplyYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgBootstrapDotfilesUnapplyTarget, Name: "TARGET", Var: true},
+ },
+}
+
+// bootstrap files
+var cmdBootstrapFiles = &argv.Command{
+ Name: "files",
+ Key: CmdBootstrapFiles,
+ Subcommands: []*argv.Command{cmdBootstrapFilesApply, cmdBootstrapFilesStatus},
+}
+
+// bootstrap files apply
+var cmdBootstrapFilesApply = &argv.Command{
+ Name: "apply",
+ Key: CmdBootstrapFilesApply,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapFilesApplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapFilesApplyYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ {Key: FlagBootstrapFilesApplyPromptSecrets, Name: "prompt-secrets", Longs: []string{"prompt-secrets"}},
+ },
+}
+
+// bootstrap files status
+var cmdBootstrapFilesStatus = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapFilesStatus,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapFilesStatusJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapFilesStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ {Key: FlagBootstrapFilesStatusPromptSecrets, Name: "prompt-secrets", Longs: []string{"prompt-secrets"}},
+ },
+}
+
+// bootstrap firewall
+var cmdBootstrapFirewall = &argv.Command{
+ Name: "firewall",
+ Key: CmdBootstrapFirewall,
+ Subcommands: []*argv.Command{cmdBootstrapFirewallApply, cmdBootstrapFirewallStatus},
+}
+
+// bootstrap firewall apply
+var cmdBootstrapFirewallApply = &argv.Command{
+ Name: "apply",
+ Key: CmdBootstrapFirewallApply,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapFirewallApplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapFirewallApplyYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+}
+
+// bootstrap firewall status
+var cmdBootstrapFirewallStatus = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapFirewallStatus,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapFirewallStatusJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapFirewallStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ },
+}
+
+// bootstrap launchd
+var cmdBootstrapLaunchd = &argv.Command{
+ Name: "launchd",
+ Key: CmdBootstrapLaunchd,
+ Subcommands: []*argv.Command{cmdBootstrapLaunchdApply, cmdBootstrapLaunchdStatus},
+}
+
+// bootstrap launchd apply
+var cmdBootstrapLaunchdApply = &argv.Command{
+ Name: "apply",
+ Key: CmdBootstrapLaunchdApply,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapLaunchdApplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapLaunchdApplyYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+}
+
+// bootstrap launchd status
+var cmdBootstrapLaunchdStatus = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapLaunchdStatus,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapLaunchdStatusJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapLaunchdStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ },
+}
+
+// bootstrap linux
+var cmdBootstrapLinux = &argv.Command{
+ Name: "linux",
+ Key: CmdBootstrapLinux,
+ Subcommands: []*argv.Command{cmdBootstrapLinuxSystemdUnits},
+}
+
+// bootstrap linux systemd-units
+var cmdBootstrapLinuxSystemdUnits = &argv.Command{
+ Name: "systemd-units",
+ Key: CmdBootstrapLinuxSystemdUnits,
+ Aliases: []string{"systemd"},
+ Subcommands: []*argv.Command{cmdBootstrapLinuxSystemdUnitsApply, cmdBootstrapLinuxSystemdUnitsStatus},
+}
+
+// bootstrap linux systemd-units apply
+var cmdBootstrapLinuxSystemdUnitsApply = &argv.Command{
+ Name: "apply",
+ Key: CmdBootstrapLinuxSystemdUnitsApply,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapLinuxSystemdUnitsApplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapLinuxSystemdUnitsApplyYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+}
+
+// bootstrap linux systemd-units status
+var cmdBootstrapLinuxSystemdUnitsStatus = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapLinuxSystemdUnitsStatus,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapLinuxSystemdUnitsStatusJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapLinuxSystemdUnitsStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ },
+}
+
+// bootstrap macos
+var cmdBootstrapMacos = &argv.Command{
+ Name: "macos",
+ Key: CmdBootstrapMacos,
+ Subcommands: []*argv.Command{cmdBootstrapMacosDefaults, cmdBootstrapMacosLaunchdAgents},
+}
+
+// bootstrap macos defaults
+var cmdBootstrapMacosDefaults = &argv.Command{
+ Name: "defaults",
+ Key: CmdBootstrapMacosDefaults,
+ Subcommands: []*argv.Command{cmdBootstrapMacosDefaultsApply, cmdBootstrapMacosDefaultsStatus},
+}
+
+// bootstrap macos defaults apply
+var cmdBootstrapMacosDefaultsApply = &argv.Command{
+ Name: "apply",
+ Key: CmdBootstrapMacosDefaultsApply,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapMacosDefaultsApplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapMacosDefaultsApplyYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+}
+
+// bootstrap macos defaults status
+var cmdBootstrapMacosDefaultsStatus = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapMacosDefaultsStatus,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapMacosDefaultsStatusJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapMacosDefaultsStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ },
+}
+
+// bootstrap macos launchd-agents
+var cmdBootstrapMacosLaunchdAgents = &argv.Command{
+ Name: "launchd-agents",
+ Key: CmdBootstrapMacosLaunchdAgents,
+ Aliases: []string{"launchd"},
+ Subcommands: []*argv.Command{cmdBootstrapMacosLaunchdAgentsApply, cmdBootstrapMacosLaunchdAgentsStatus},
+}
+
+// bootstrap macos launchd-agents apply
+var cmdBootstrapMacosLaunchdAgentsApply = &argv.Command{
+ Name: "apply",
+ Key: CmdBootstrapMacosLaunchdAgentsApply,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapMacosLaunchdAgentsApplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapMacosLaunchdAgentsApplyYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+}
+
+// bootstrap macos launchd-agents status
+var cmdBootstrapMacosLaunchdAgentsStatus = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapMacosLaunchdAgentsStatus,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapMacosLaunchdAgentsStatusJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapMacosLaunchdAgentsStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ },
+}
+
+// bootstrap macos-defaults
+var cmdBootstrapMacosDefaults2 = &argv.Command{
+ Name: "macos-defaults",
+ Key: CmdBootstrapMacosDefaults2,
+ Subcommands: []*argv.Command{cmdBootstrapMacosDefaultsApply2, cmdBootstrapMacosDefaultsStatus2},
+}
+
+// bootstrap macos-defaults apply
+var cmdBootstrapMacosDefaultsApply2 = &argv.Command{
+ Name: "apply",
+ Key: CmdBootstrapMacosDefaultsApply2,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapMacosDefaultsApplyDryRun2, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapMacosDefaultsApplyYes2, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+}
+
+// bootstrap macos-defaults status
+var cmdBootstrapMacosDefaultsStatus2 = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapMacosDefaultsStatus2,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapMacosDefaultsStatusJson2, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapMacosDefaultsStatusMissing2, Name: "missing", Longs: []string{"missing"}},
+ },
+}
+
+// bootstrap mise-shell-activate
+var cmdBootstrapMiseShellActivate = &argv.Command{
+ Name: "mise-shell-activate",
+ Key: CmdBootstrapMiseShellActivate,
+ Aliases: []string{"shell"},
+ Subcommands: []*argv.Command{cmdBootstrapMiseShellActivateApply, cmdBootstrapMiseShellActivateStatus},
+}
+
+// bootstrap mise-shell-activate apply
+var cmdBootstrapMiseShellActivateApply = &argv.Command{
+ Name: "apply",
+ Key: CmdBootstrapMiseShellActivateApply,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapMiseShellActivateApplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapMiseShellActivateApplyYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+}
+
+// bootstrap mise-shell-activate status
+var cmdBootstrapMiseShellActivateStatus = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapMiseShellActivateStatus,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapMiseShellActivateStatusJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapMiseShellActivateStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ },
+}
+
+// bootstrap packages
+var cmdBootstrapPackages = &argv.Command{
+ Name: "packages",
+ Key: CmdBootstrapPackages,
+ Subcommands: []*argv.Command{cmdBootstrapPackagesApply, cmdBootstrapPackagesBrew, cmdBootstrapPackagesImport, cmdBootstrapPackagesPrune, cmdBootstrapPackagesStatus, cmdBootstrapPackagesUpgrade, cmdBootstrapPackagesUse},
+}
+
+// bootstrap packages apply
+var cmdBootstrapPackagesApply = &argv.Command{
+ Name: "apply",
+ Key: CmdBootstrapPackagesApply,
+ Aliases: []string{"i", "install"},
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapPackagesApplyManager, Name: "manager", Longs: []string{"manager"}, Shorts: []byte{'m'}, TakesValue: true},
+ {Key: FlagBootstrapPackagesApplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapPackagesApplyYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ {Key: FlagBootstrapPackagesApplyUpdate, Name: "update", Longs: []string{"update"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgBootstrapPackagesApplyPackage, Name: "PACKAGE", Var: true},
+ },
+}
+
+// bootstrap packages brew
+var cmdBootstrapPackagesBrew = &argv.Command{
+ Name: "brew",
+ Key: CmdBootstrapPackagesBrew,
+ Subcommands: []*argv.Command{cmdBootstrapPackagesBrewTap, cmdBootstrapPackagesBrewUntap},
+}
+
+// bootstrap packages brew tap
+var cmdBootstrapPackagesBrewTap = &argv.Command{
+ Name: "tap",
+ Key: CmdBootstrapPackagesBrewTap,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapPackagesBrewTapLocal, Name: "local", Longs: []string{"local"}, Shorts: []byte{'l'}},
+ {Key: FlagBootstrapPackagesBrewTapDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapPackagesBrewTapPath, Name: "path", Longs: []string{"path", "file"}, Shorts: []byte{'p'}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgBootstrapPackagesBrewTapTap, Name: "TAP", Required: true},
+ {Key: ArgBootstrapPackagesBrewTapUrl, Name: "URL"},
+ },
+}
+
+// bootstrap packages brew untap
+var cmdBootstrapPackagesBrewUntap = &argv.Command{
+ Name: "untap",
+ Key: CmdBootstrapPackagesBrewUntap,
+ Aliases: []string{"remove", "rm"},
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapPackagesBrewUntapLocal, Name: "local", Longs: []string{"local"}, Shorts: []byte{'l'}},
+ {Key: FlagBootstrapPackagesBrewUntapDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapPackagesBrewUntapPath, Name: "path", Longs: []string{"path", "file"}, Shorts: []byte{'p'}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgBootstrapPackagesBrewUntapTaps, Name: "TAPS", Required: true, Var: true},
+ },
+}
+
+// bootstrap packages import
+var cmdBootstrapPackagesImport = &argv.Command{
+ Name: "import",
+ Key: CmdBootstrapPackagesImport,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapPackagesImportEnv, Name: "env", Longs: []string{"env"}, Shorts: []byte{'e'}, TakesValue: true},
+ {Key: FlagBootstrapPackagesImportGlobal, Name: "global", Longs: []string{"global"}, Shorts: []byte{'g'}},
+ {Key: FlagBootstrapPackagesImportManager, Name: "manager", Longs: []string{"manager"}, Shorts: []byte{'m'}, TakesValue: true},
+ {Key: FlagBootstrapPackagesImportAll, Name: "all", Longs: []string{"all"}},
+ {Key: FlagBootstrapPackagesImportDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapPackagesImportPath, Name: "path", Longs: []string{"path", "file"}, Shorts: []byte{'p'}, TakesValue: true},
+ },
+}
+
+// bootstrap packages prune
+var cmdBootstrapPackagesPrune = &argv.Command{
+ Name: "prune",
+ Key: CmdBootstrapPackagesPrune,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapPackagesPruneManager, Name: "manager", Longs: []string{"manager"}, Shorts: []byte{'m'}, TakesValue: true},
+ {Key: FlagBootstrapPackagesPruneDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapPackagesPruneYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+}
+
+// bootstrap packages status
+var cmdBootstrapPackagesStatus = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapPackagesStatus,
+ Aliases: []string{"ls"},
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapPackagesStatusJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapPackagesStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ },
+}
+
+// bootstrap packages upgrade
+var cmdBootstrapPackagesUpgrade = &argv.Command{
+ Name: "upgrade",
+ Key: CmdBootstrapPackagesUpgrade,
+ Aliases: []string{"up"},
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapPackagesUpgradeManager, Name: "manager", Longs: []string{"manager"}, Shorts: []byte{'m'}, TakesValue: true},
+ {Key: FlagBootstrapPackagesUpgradeDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapPackagesUpgradeYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgBootstrapPackagesUpgradePackage, Name: "PACKAGE", Var: true},
+ },
+}
+
+// bootstrap packages use
+var cmdBootstrapPackagesUse = &argv.Command{
+ Name: "use",
+ Key: CmdBootstrapPackagesUse,
+ Aliases: []string{"u"},
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapPackagesUseEnv, Name: "env", Longs: []string{"env"}, Shorts: []byte{'e'}, TakesValue: true},
+ {Key: FlagBootstrapPackagesUseGlobal, Name: "global", Longs: []string{"global"}, Shorts: []byte{'g'}},
+ {Key: FlagBootstrapPackagesUseDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapPackagesUsePath, Name: "path", Longs: []string{"path", "file"}, Shorts: []byte{'p'}, TakesValue: true},
+ {Key: FlagBootstrapPackagesUseYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgBootstrapPackagesUsePackage, Name: "PACKAGE", Required: true, Var: true},
+ },
+}
+
+// bootstrap plan
+var cmdBootstrapPlan = &argv.Command{
+ Name: "plan",
+ Key: CmdBootstrapPlan,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapPlanJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapPlanDetailedExitcode, Name: "detailed-exitcode", Longs: []string{"detailed-exitcode"}},
+ {Key: FlagBootstrapPlanPromptSecrets, Name: "prompt-secrets", Longs: []string{"prompt-secrets"}},
+ },
+}
+
+// bootstrap plugins
+var cmdBootstrapPlugins = &argv.Command{
+ Name: "plugins",
+ Key: CmdBootstrapPlugins,
+ Subcommands: []*argv.Command{cmdBootstrapPluginsApply, cmdBootstrapPluginsStatus},
+}
+
+// bootstrap plugins apply
+var cmdBootstrapPluginsApply = &argv.Command{
+ Name: "apply",
+ Key: CmdBootstrapPluginsApply,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapPluginsApplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ },
+}
+
+// bootstrap plugins status
+var cmdBootstrapPluginsStatus = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapPluginsStatus,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapPluginsStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ },
+}
+
+// bootstrap remote
+var cmdBootstrapRemote = &argv.Command{
+ Name: "remote",
+ Key: CmdBootstrapRemote,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapRemoteAll, Name: "all", Longs: []string{"all"}},
+ {Key: FlagBootstrapRemoteBootstrapCommand, Name: "bootstrap-command", Longs: []string{"bootstrap-command"}, TakesValue: true},
+ {Key: FlagBootstrapRemoteConnectTimeout, Name: "connect-timeout", Longs: []string{"connect-timeout"}, TakesValue: true},
+ {Key: FlagBootstrapRemoteCopyLink, Name: "copy-link", Longs: []string{"copy-link"}, TakesValue: true},
+ {Key: FlagBootstrapRemoteCopyLinks, Name: "copy-links", Longs: []string{"copy-links"}},
+ {Key: FlagBootstrapRemoteExclude, Name: "exclude", Longs: []string{"exclude"}, TakesValue: true},
+ {Key: FlagBootstrapRemoteFailFast, Name: "fail-fast", Longs: []string{"fail-fast"}},
+ {Key: FlagBootstrapRemoteForceDotfiles, Name: "force-dotfiles", Longs: []string{"force-dotfiles"}},
+ {Key: FlagBootstrapRemoteHost, Name: "host", Longs: []string{"host"}, TakesValue: true},
+ {Key: FlagBootstrapRemoteIdentityFile, Name: "identity-file", Longs: []string{"identity-file"}, Shorts: []byte{'i'}, TakesValue: true},
+ {Key: FlagBootstrapRemoteDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapRemoteKeepStaging, Name: "keep-staging", Longs: []string{"keep-staging"}},
+ {Key: FlagBootstrapRemoteMiseBin, Name: "mise-bin", Longs: []string{"mise-bin"}, TakesValue: true},
+ {Key: FlagBootstrapRemoteOnly, Name: "only", Longs: []string{"only"}, TakesValue: true, Delimiter: ','},
+ {Key: FlagBootstrapRemotePort, Name: "port", Longs: []string{"port"}, TakesValue: true},
+ {Key: FlagBootstrapRemotePromptSecrets, Name: "prompt-secrets", Longs: []string{"prompt-secrets"}},
+ {Key: FlagBootstrapRemoteRemoteEnv, Name: "remote-env", Longs: []string{"remote-env"}, TakesValue: true, Delimiter: ','},
+ {Key: FlagBootstrapRemoteRemoteMise, Name: "remote-mise", Longs: []string{"remote-mise"}, TakesValue: true},
+ {Key: FlagBootstrapRemoteSkip, Name: "skip", Longs: []string{"skip"}, TakesValue: true, Delimiter: ','},
+ {Key: FlagBootstrapRemoteSource, Name: "source", Longs: []string{"source"}, TakesValue: true},
+ {Key: FlagBootstrapRemoteSshOption, Name: "ssh-option", Longs: []string{"ssh-option"}, TakesValue: true},
+ {Key: FlagBootstrapRemoteTag, Name: "tag", Longs: []string{"tag"}, TakesValue: true},
+ {Key: FlagBootstrapRemoteUpdate, Name: "update", Longs: []string{"update"}},
+ {Key: FlagBootstrapRemoteYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgBootstrapRemoteTarget, Name: "TARGET", Var: true},
+ },
+}
+
+// bootstrap repos
+var cmdBootstrapRepos = &argv.Command{
+ Name: "repos",
+ Key: CmdBootstrapRepos,
+ Subcommands: []*argv.Command{cmdBootstrapReposApply, cmdBootstrapReposExec, cmdBootstrapReposStatus, cmdBootstrapReposUpdate},
+}
+
+// bootstrap repos apply
+var cmdBootstrapReposApply = &argv.Command{
+ Name: "apply",
+ Key: CmdBootstrapReposApply,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapReposApplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapReposApplyYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+}
+
+// bootstrap repos exec
+var cmdBootstrapReposExec = &argv.Command{
+ Name: "exec",
+ Key: CmdBootstrapReposExec,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapReposExecContinueOnError, Name: "continue-on-error", Longs: []string{"continue-on-error"}, Shorts: []byte{'c'}},
+ {Key: FlagBootstrapReposExecDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgBootstrapReposExecPath, Name: "PATH", Var: true},
+ {Key: ArgBootstrapReposExecCommand, Name: "COMMAND", Required: true, Var: true, DoubleDash: argv.DoubleDashRequired},
+ },
+}
+
+// bootstrap repos status
+var cmdBootstrapReposStatus = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapReposStatus,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapReposStatusJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapReposStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ },
+}
+
+// bootstrap repos update
+var cmdBootstrapReposUpdate = &argv.Command{
+ Name: "update",
+ Key: CmdBootstrapReposUpdate,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapReposUpdateDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapReposUpdateYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgBootstrapReposUpdatePath, Name: "PATH", Var: true},
+ },
+}
+
+// bootstrap secrets
+var cmdBootstrapSecrets = &argv.Command{
+ Name: "secrets",
+ Key: CmdBootstrapSecrets,
+ Subcommands: []*argv.Command{cmdBootstrapSecretsStatus},
+}
+
+// bootstrap secrets status
+var cmdBootstrapSecretsStatus = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapSecretsStatus,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapSecretsStatusJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapSecretsStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ },
+}
+
+// bootstrap services
+var cmdBootstrapServices = &argv.Command{
+ Name: "services",
+ Key: CmdBootstrapServices,
+ Subcommands: []*argv.Command{cmdBootstrapServicesApply, cmdBootstrapServicesStatus},
+}
+
+// bootstrap services apply
+var cmdBootstrapServicesApply = &argv.Command{
+ Name: "apply",
+ Key: CmdBootstrapServicesApply,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapServicesApplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapServicesApplyYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+}
+
+// bootstrap services status
+var cmdBootstrapServicesStatus = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapServicesStatus,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapServicesStatusJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapServicesStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ },
+}
+
+// bootstrap status
+var cmdBootstrapStatus = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapStatus,
+ Aliases: []string{"ls"},
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapStatusJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ {Key: FlagBootstrapStatusPromptSecrets, Name: "prompt-secrets", Longs: []string{"prompt-secrets"}},
+ },
+}
+
+// bootstrap systemd
+var cmdBootstrapSystemd = &argv.Command{
+ Name: "systemd",
+ Key: CmdBootstrapSystemd,
+ Subcommands: []*argv.Command{cmdBootstrapSystemdApply, cmdBootstrapSystemdStatus},
+}
+
+// bootstrap systemd apply
+var cmdBootstrapSystemdApply = &argv.Command{
+ Name: "apply",
+ Key: CmdBootstrapSystemdApply,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapSystemdApplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapSystemdApplyYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+}
+
+// bootstrap systemd status
+var cmdBootstrapSystemdStatus = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapSystemdStatus,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapSystemdStatusJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapSystemdStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ },
+}
+
+// bootstrap user
+var cmdBootstrapUser = &argv.Command{
+ Name: "user",
+ Key: CmdBootstrapUser,
+ Subcommands: []*argv.Command{cmdBootstrapUserApply, cmdBootstrapUserStatus},
+}
+
+// bootstrap user apply
+var cmdBootstrapUserApply = &argv.Command{
+ Name: "apply",
+ Key: CmdBootstrapUserApply,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapUserApplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagBootstrapUserApplyYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+}
+
+// bootstrap user status
+var cmdBootstrapUserStatus = &argv.Command{
+ Name: "status",
+ Key: CmdBootstrapUserStatus,
+ Flags: []*argv.Flag{
+ {Key: FlagBootstrapUserStatusJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagBootstrapUserStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ },
+}
+
+// cache
+var cmdCache = &argv.Command{
+ Name: "cache",
+ Key: CmdCache,
+ Subcommands: []*argv.Command{cmdCacheClear, cmdCachePath, cmdCachePrune, cmdCacheTask},
+}
+
+// cache clear
+var cmdCacheClear = &argv.Command{
+ Name: "clear",
+ Key: CmdCacheClear,
+ Aliases: []string{"c", "clean"},
+ Flags: []*argv.Flag{
+ {Key: FlagCacheClearOutdate, Name: "outdate", Longs: []string{"outdate"}},
+ {Key: FlagCacheClearTask, Name: "task", Longs: []string{"task"}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgCacheClearTool, Name: "TOOL", Var: true},
+ },
+}
+
+// cache path
+var cmdCachePath = &argv.Command{
+ Name: "path",
+ Key: CmdCachePath,
+ Aliases: []string{"dir"},
+}
+
+// cache prune
+var cmdCachePrune = &argv.Command{
+ Name: "prune",
+ Key: CmdCachePrune,
+ Aliases: []string{"p"},
+ Flags: []*argv.Flag{
+ {Key: FlagCachePruneVerbose, Name: "verbose", Longs: []string{"verbose"}, Shorts: []byte{'v'}},
+ {Key: FlagCachePruneDryRun, Name: "dry-run", Longs: []string{"dry-run"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgCachePruneTool, Name: "TOOL", Var: true},
+ },
+}
+
+// cache task
+var cmdCacheTask = &argv.Command{
+ Name: "task",
+ Key: CmdCacheTask,
+ Flags: []*argv.Flag{
+ {Key: FlagCacheTaskJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgCacheTaskTask, Name: "TASK", Required: true},
+ },
+}
+
+// completion
+var cmdCompletion = &argv.Command{
+ Name: "completion",
+ Key: CmdCompletion,
+ Aliases: []string{"complete", "completions"},
+ Flags: []*argv.Flag{
+ {Key: FlagCompletionShell, Name: "shell", Longs: []string{"shell"}, Shorts: []byte{'s'}, TakesValue: true},
+ {Key: FlagCompletionIncludeBashCompletionLib, Name: "include-bash-completion-lib", Longs: []string{"include-bash-completion-lib"}},
+ {Key: FlagCompletionUsage, Name: "usage", Longs: []string{"usage"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgCompletionShell, Name: "SHELL"},
+ },
+}
+
+// config
+var cmdConfig = &argv.Command{
+ Name: "config",
+ Key: CmdConfig,
+ Aliases: []string{"cfg", "toml"},
+ Flags: []*argv.Flag{
+ {Key: FlagConfigJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagConfigNoHeader, Name: "no-header", Longs: []string{"no-header", "no-headers"}, HiddenLongs: []string{"no-headers"}},
+ {Key: FlagConfigTrackedConfigs, Name: "tracked-configs", Longs: []string{"tracked-configs"}},
+ },
+ Subcommands: []*argv.Command{cmdConfigGet, cmdConfigLs, cmdConfigSet},
+}
+
+// config get
+var cmdConfigGet = &argv.Command{
+ Name: "get",
+ Key: CmdConfigGet,
+ Flags: []*argv.Flag{
+ {Key: FlagConfigGetFile, Name: "file", Longs: []string{"file", "path"}, Shorts: []byte{'f'}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgConfigGetKey, Name: "KEY"},
+ },
+}
+
+// config ls
+var cmdConfigLs = &argv.Command{
+ Name: "ls",
+ Key: CmdConfigLs,
+ Aliases: []string{"list"},
+ Flags: []*argv.Flag{
+ {Key: FlagConfigLsJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagConfigLsNoHeader, Name: "no-header", Longs: []string{"no-header", "no-headers"}, HiddenLongs: []string{"no-headers"}},
+ {Key: FlagConfigLsTrackedConfigs, Name: "tracked-configs", Longs: []string{"tracked-configs"}},
+ },
+}
+
+// config set
+var cmdConfigSet = &argv.Command{
+ Name: "set",
+ Key: CmdConfigSet,
+ Flags: []*argv.Flag{
+ {Key: FlagConfigSetFile, Name: "file", Longs: []string{"file", "path"}, Shorts: []byte{'f'}, TakesValue: true},
+ {Key: FlagConfigSetType, Name: "type", Longs: []string{"type"}, Shorts: []byte{'t'}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgConfigSetKey, Name: "KEY", Required: true},
+ {Key: ArgConfigSetValue, Name: "VALUE"},
+ },
+}
+
+// current
+var cmdCurrent = &argv.Command{
+ Name: "current",
+ Key: CmdCurrent,
+ Args: []*argv.Arg{
+ {Key: ArgCurrentPlugin, Name: "PLUGIN"},
+ },
+}
+
+// deactivate
+var cmdDeactivate = &argv.Command{
+ Name: "deactivate",
+ Key: CmdDeactivate,
+}
+
+// direnv
+var cmdDirenv = &argv.Command{
+ Name: "direnv",
+ Key: CmdDirenv,
+ Subcommands: []*argv.Command{cmdDirenvActivate, cmdDirenvEnvrc, cmdDirenvExec},
+}
+
+// direnv activate
+var cmdDirenvActivate = &argv.Command{
+ Name: "activate",
+ Key: CmdDirenvActivate,
+}
+
+// direnv envrc
+var cmdDirenvEnvrc = &argv.Command{
+ Name: "envrc",
+ Key: CmdDirenvEnvrc,
+}
+
+// direnv exec
+var cmdDirenvExec = &argv.Command{
+ Name: "exec",
+ Key: CmdDirenvExec,
+}
+
+// dotfiles
+var cmdDotfiles = &argv.Command{
+ Name: "dotfiles",
+ Key: CmdDotfiles,
+ Subcommands: []*argv.Command{cmdDotfilesAdd, cmdDotfilesApply, cmdDotfilesEdit, cmdDotfilesStatus, cmdDotfilesUnapply},
+}
+
+// dotfiles add
+var cmdDotfilesAdd = &argv.Command{
+ Name: "add",
+ Key: CmdDotfilesAdd,
+ Flags: []*argv.Flag{
+ {Key: FlagDotfilesAddForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ {Key: FlagDotfilesAddGlobal, Name: "global", Longs: []string{"global"}, Shorts: []byte{'g'}},
+ {Key: FlagDotfilesAddLocal, Name: "local", Longs: []string{"local"}, Shorts: []byte{'l'}},
+ {Key: FlagDotfilesAddMode, Name: "mode", Longs: []string{"mode"}, Shorts: []byte{'m'}, TakesValue: true},
+ {Key: FlagDotfilesAddDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagDotfilesAddNoApply, Name: "no-apply", Longs: []string{"no-apply"}},
+ {Key: FlagDotfilesAddPath, Name: "path", Longs: []string{"path"}, Shorts: []byte{'p'}, TakesValue: true},
+ {Key: FlagDotfilesAddSource, Name: "source", Longs: []string{"source"}, Shorts: []byte{'s'}, TakesValue: true},
+ {Key: FlagDotfilesAddYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgDotfilesAddTarget, Name: "TARGET", Required: true, Var: true},
+ },
+}
+
+// dotfiles apply
+var cmdDotfilesApply = &argv.Command{
+ Name: "apply",
+ Key: CmdDotfilesApply,
+ Flags: []*argv.Flag{
+ {Key: FlagDotfilesApplyForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ {Key: FlagDotfilesApplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagDotfilesApplyYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgDotfilesApplyTarget, Name: "TARGET", Var: true},
+ },
+}
+
+// dotfiles edit
+var cmdDotfilesEdit = &argv.Command{
+ Name: "edit",
+ Key: CmdDotfilesEdit,
+ Flags: []*argv.Flag{
+ {Key: FlagDotfilesEditApply, Name: "apply", Longs: []string{"apply"}},
+ {Key: FlagDotfilesEditMode, Name: "mode", Longs: []string{"mode"}, Shorts: []byte{'m'}, TakesValue: true},
+ {Key: FlagDotfilesEditSource, Name: "source", Longs: []string{"source"}, Shorts: []byte{'s'}, TakesValue: true},
+ {Key: FlagDotfilesEditYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgDotfilesEditTarget, Name: "TARGET", Required: true},
+ },
+}
+
+// dotfiles status
+var cmdDotfilesStatus = &argv.Command{
+ Name: "status",
+ Key: CmdDotfilesStatus,
+ Aliases: []string{"ls"},
+ Flags: []*argv.Flag{
+ {Key: FlagDotfilesStatusJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagDotfilesStatusMissing, Name: "missing", Longs: []string{"missing"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgDotfilesStatusTarget, Name: "TARGET", Var: true},
+ },
+}
+
+// dotfiles unapply
+var cmdDotfilesUnapply = &argv.Command{
+ Name: "unapply",
+ Key: CmdDotfilesUnapply,
+ Flags: []*argv.Flag{
+ {Key: FlagDotfilesUnapplyForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ {Key: FlagDotfilesUnapplyDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagDotfilesUnapplyYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgDotfilesUnapplyTarget, Name: "TARGET", Var: true},
+ },
+}
+
+// doctor
+var cmdDoctor = &argv.Command{
+ Name: "doctor",
+ Key: CmdDoctor,
+ Aliases: []string{"dr"},
+ Flags: []*argv.Flag{
+ {Key: FlagDoctorJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ },
+ Subcommands: []*argv.Command{cmdDoctorPath},
+}
+
+// doctor path
+var cmdDoctorPath = &argv.Command{
+ Name: "path",
+ Key: CmdDoctorPath,
+ Aliases: []string{"paths"},
+ Flags: []*argv.Flag{
+ {Key: FlagDoctorPathFull, Name: "full", Longs: []string{"full"}, Shorts: []byte{'f'}},
+ },
+}
+
+// en
+var cmdEn = &argv.Command{
+ Name: "en",
+ Key: CmdEn,
+ Flags: []*argv.Flag{
+ {Key: FlagEnShell, Name: "shell", Longs: []string{"shell"}, Shorts: []byte{'s'}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgEnDir, Name: "DIR"},
+ },
+}
+
+// env
+var cmdEnv = &argv.Command{
+ Name: "env",
+ Key: CmdEnv,
+ Aliases: []string{"e"},
+ Flags: []*argv.Flag{
+ {Key: FlagEnvDotenv, Name: "dotenv", Longs: []string{"dotenv"}, Shorts: []byte{'D'}},
+ {Key: FlagEnvJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagEnvShell, Name: "shell", Longs: []string{"shell"}, Shorts: []byte{'s'}, TakesValue: true},
+ {Key: FlagEnvJsonExtended, Name: "json-extended", Longs: []string{"json-extended"}},
+ {Key: FlagEnvRedacted, Name: "redacted", Longs: []string{"redacted"}},
+ {Key: FlagEnvValues, Name: "values", Longs: []string{"values"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgEnvToolVersion, Name: "TOOL@VERSION", Var: true},
+ },
+}
+
+// exec
+var cmdExec = &argv.Command{
+ Name: "exec",
+ Key: CmdExec,
+ Aliases: []string{"x"},
+ Flags: []*argv.Flag{
+ {Key: FlagExecCommand, Name: "command", Longs: []string{"command"}, Shorts: []byte{'c'}, TakesValue: true},
+ {Key: FlagExecJobs, Name: "jobs", Longs: []string{"jobs"}, Shorts: []byte{'j'}, TakesValue: true},
+ {Key: FlagExecAllowEnv, Name: "allow-env", Longs: []string{"allow-env"}, TakesValue: true},
+ {Key: FlagExecAllowNet, Name: "allow-net", Longs: []string{"allow-net"}, TakesValue: true},
+ {Key: FlagExecAllowRead, Name: "allow-read", Longs: []string{"allow-read"}, TakesValue: true},
+ {Key: FlagExecAllowWrite, Name: "allow-write", Longs: []string{"allow-write"}, TakesValue: true},
+ {Key: FlagExecDenyAll, Name: "deny-all", Longs: []string{"deny-all"}},
+ {Key: FlagExecDenyEnv, Name: "deny-env", Longs: []string{"deny-env"}},
+ {Key: FlagExecDenyNet, Name: "deny-net", Longs: []string{"deny-net"}},
+ {Key: FlagExecDenyRead, Name: "deny-read", Longs: []string{"deny-read"}},
+ {Key: FlagExecDenyWrite, Name: "deny-write", Longs: []string{"deny-write"}},
+ {Key: FlagExecFreshEnv, Name: "fresh-env", Longs: []string{"fresh-env"}},
+ {Key: FlagExecNoDeps, Name: "no-deps", Longs: []string{"no-deps"}},
+ {Key: FlagExecRaw, Name: "raw", Longs: []string{"raw"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgExecToolVersion, Name: "TOOL@VERSION", Var: true},
+ {Key: ArgExecCommand, Name: "COMMAND", Var: true, DoubleDash: argv.DoubleDashRequired},
+ },
+}
+
+// fmt
+var cmdFmt = &argv.Command{
+ Name: "fmt",
+ Key: CmdFmt,
+ Flags: []*argv.Flag{
+ {Key: FlagFmtAll, Name: "all", Longs: []string{"all"}, Shorts: []byte{'a'}},
+ {Key: FlagFmtCheck, Name: "check", Longs: []string{"check"}, Shorts: []byte{'c'}},
+ {Key: FlagFmtStdin, Name: "stdin", Longs: []string{"stdin"}, Shorts: []byte{'s'}},
+ },
+}
+
+// generate
+var cmdGenerate = &argv.Command{
+ Name: "generate",
+ Key: CmdGenerate,
+ Aliases: []string{"gen", "g"},
+ Subcommands: []*argv.Command{cmdGenerateBootstrap, cmdGenerateConfig, cmdGenerateDevcontainer, cmdGenerateGitPreCommit, cmdGenerateGithubAction, cmdGenerateTaskDocs, cmdGenerateTaskStubs, cmdGenerateToolStub},
+}
+
+// generate bootstrap
+var cmdGenerateBootstrap = &argv.Command{
+ Name: "bootstrap",
+ Key: CmdGenerateBootstrap,
+ Flags: []*argv.Flag{
+ {Key: FlagGenerateBootstrapLocalize, Name: "localize", Longs: []string{"localize"}, Shorts: []byte{'l'}},
+ {Key: FlagGenerateBootstrapVersion, Name: "version", Longs: []string{"version"}, Shorts: []byte{'V'}, TakesValue: true},
+ {Key: FlagGenerateBootstrapWrite, Name: "write", Longs: []string{"write"}, Shorts: []byte{'w'}, TakesValue: true, ValueOptional: true, DefaultMissing: "./bin/mise"},
+ {Key: FlagGenerateBootstrapLocalizedDir, Name: "localized-dir", Longs: []string{"localized-dir"}, TakesValue: true},
+ {Key: FlagGenerateBootstrapWindows, Name: "windows", Longs: []string{"windows"}},
+ },
+}
+
+// generate config
+var cmdGenerateConfig = &argv.Command{
+ Name: "config",
+ Key: CmdGenerateConfig,
+ Flags: []*argv.Flag{
+ {Key: FlagGenerateConfigGlobal, Name: "global", Longs: []string{"global"}, Shorts: []byte{'g'}},
+ {Key: FlagGenerateConfigDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagGenerateConfigToolVersions, Name: "tool-versions", Longs: []string{"tool-versions"}, Shorts: []byte{'t'}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgGenerateConfigPath, Name: "PATH"},
+ },
+}
+
+// generate devcontainer
+var cmdGenerateDevcontainer = &argv.Command{
+ Name: "devcontainer",
+ Key: CmdGenerateDevcontainer,
+ Flags: []*argv.Flag{
+ {Key: FlagGenerateDevcontainerImage, Name: "image", Longs: []string{"image"}, Shorts: []byte{'i'}, TakesValue: true},
+ {Key: FlagGenerateDevcontainerMountMiseData, Name: "mount-mise-data", Longs: []string{"mount-mise-data"}, Shorts: []byte{'m'}},
+ {Key: FlagGenerateDevcontainerName, Name: "name", Longs: []string{"name"}, Shorts: []byte{'n'}, TakesValue: true},
+ {Key: FlagGenerateDevcontainerWrite, Name: "write", Longs: []string{"write"}, Shorts: []byte{'w'}},
+ },
+}
+
+// generate git-pre-commit
+var cmdGenerateGitPreCommit = &argv.Command{
+ Name: "git-pre-commit",
+ Key: CmdGenerateGitPreCommit,
+ Aliases: []string{"pre-commit"},
+ Flags: []*argv.Flag{
+ {Key: FlagGenerateGitPreCommitTask, Name: "task", Longs: []string{"task"}, Shorts: []byte{'t'}, TakesValue: true},
+ {Key: FlagGenerateGitPreCommitWrite, Name: "write", Longs: []string{"write"}, Shorts: []byte{'w'}},
+ {Key: FlagGenerateGitPreCommitHook, Name: "hook", Longs: []string{"hook"}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgGenerateGitPreCommitMiseArg, Name: "MISE_ARG", Var: true, DoubleDash: argv.DoubleDashRequired},
+ },
+}
+
+// generate github-action
+var cmdGenerateGithubAction = &argv.Command{
+ Name: "github-action",
+ Key: CmdGenerateGithubAction,
+ Flags: []*argv.Flag{
+ {Key: FlagGenerateGithubActionTask, Name: "task", Longs: []string{"task"}, Shorts: []byte{'t'}, TakesValue: true},
+ {Key: FlagGenerateGithubActionWrite, Name: "write", Longs: []string{"write"}, Shorts: []byte{'w'}},
+ {Key: FlagGenerateGithubActionName, Name: "name", Longs: []string{"name"}, TakesValue: true},
+ },
+}
+
+// generate task-docs
+var cmdGenerateTaskDocs = &argv.Command{
+ Name: "task-docs",
+ Key: CmdGenerateTaskDocs,
+ Flags: []*argv.Flag{
+ {Key: FlagGenerateTaskDocsInject, Name: "inject", Longs: []string{"inject"}, Shorts: []byte{'i'}},
+ {Key: FlagGenerateTaskDocsIndex, Name: "index", Longs: []string{"index"}, Shorts: []byte{'I'}},
+ {Key: FlagGenerateTaskDocsMulti, Name: "multi", Longs: []string{"multi"}, Shorts: []byte{'m'}},
+ {Key: FlagGenerateTaskDocsOutput, Name: "output", Longs: []string{"output"}, Shorts: []byte{'o'}, TakesValue: true},
+ {Key: FlagGenerateTaskDocsRoot, Name: "root", Longs: []string{"root"}, Shorts: []byte{'r'}, TakesValue: true},
+ {Key: FlagGenerateTaskDocsStyle, Name: "style", Longs: []string{"style"}, Shorts: []byte{'s'}, TakesValue: true},
+ },
+}
+
+// generate task-stubs
+var cmdGenerateTaskStubs = &argv.Command{
+ Name: "task-stubs",
+ Key: CmdGenerateTaskStubs,
+ Flags: []*argv.Flag{
+ {Key: FlagGenerateTaskStubsDir, Name: "dir", Longs: []string{"dir"}, Shorts: []byte{'d'}, TakesValue: true},
+ {Key: FlagGenerateTaskStubsMiseBin, Name: "mise-bin", Longs: []string{"mise-bin"}, Shorts: []byte{'m'}, TakesValue: true},
+ },
+}
+
+// generate tool-stub
+var cmdGenerateToolStub = &argv.Command{
+ Name: "tool-stub",
+ Key: CmdGenerateToolStub,
+ Flags: []*argv.Flag{
+ {Key: FlagGenerateToolStubBin, Name: "bin", Longs: []string{"bin"}, Shorts: []byte{'b'}, TakesValue: true},
+ {Key: FlagGenerateToolStubBootstrap, Name: "bootstrap", Longs: []string{"bootstrap"}},
+ {Key: FlagGenerateToolStubBootstrapVersion, Name: "bootstrap-version", Longs: []string{"bootstrap-version"}, TakesValue: true},
+ {Key: FlagGenerateToolStubChecksumAlgorithm, Name: "checksum-algorithm", Longs: []string{"checksum-algorithm"}, TakesValue: true},
+ {Key: FlagGenerateToolStubFetch, Name: "fetch", Longs: []string{"fetch"}},
+ {Key: FlagGenerateToolStubHttp, Name: "http", Longs: []string{"http"}, TakesValue: true},
+ {Key: FlagGenerateToolStubLock, Name: "lock", Longs: []string{"lock"}},
+ {Key: FlagGenerateToolStubPlatformBin, Name: "platform-bin", Longs: []string{"platform-bin"}, TakesValue: true},
+ {Key: FlagGenerateToolStubPlatformUrl, Name: "platform-url", Longs: []string{"platform-url"}, TakesValue: true},
+ {Key: FlagGenerateToolStubSkipDownload, Name: "skip-download", Longs: []string{"skip-download"}},
+ {Key: FlagGenerateToolStubUrl, Name: "url", Longs: []string{"url"}, Shorts: []byte{'u'}, TakesValue: true},
+ {Key: FlagGenerateToolStubVersion, Name: "version", Longs: []string{"version"}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgGenerateToolStubOutput, Name: "OUTPUT", Required: true},
+ },
+}
+
+// github
+var cmdGithub = &argv.Command{
+ Name: "github",
+ Key: CmdGithub,
+ Subcommands: []*argv.Command{cmdGithubToken},
+}
+
+// github token
+var cmdGithubToken = &argv.Command{
+ Name: "token",
+ Key: CmdGithubToken,
+ Flags: []*argv.Flag{
+ {Key: FlagGithubTokenOauth, Name: "oauth", Longs: []string{"oauth"}},
+ {Key: FlagGithubTokenRaw, Name: "raw", Longs: []string{"raw"}},
+ {Key: FlagGithubTokenRefresh, Name: "refresh", Longs: []string{"refresh"}},
+ {Key: FlagGithubTokenUnmask, Name: "unmask", Longs: []string{"unmask"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgGithubTokenHost, Name: "HOST"},
+ },
+}
+
+// global
+var cmdGlobal = &argv.Command{
+ Name: "global",
+ Key: CmdGlobal,
+ Flags: []*argv.Flag{
+ {Key: FlagGlobalFuzzy, Name: "fuzzy", Longs: []string{"fuzzy"}},
+ {Key: FlagGlobalPath, Name: "path", Longs: []string{"path"}},
+ {Key: FlagGlobalPin, Name: "pin", Longs: []string{"pin"}},
+ {Key: FlagGlobalRemove, Name: "remove", Longs: []string{"remove", "rm", "unset"}, HiddenLongs: []string{"rm", "unset"}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgGlobalToolVersion, Name: "TOOL@VERSION", Var: true},
+ },
+}
+
+// hook-env
+var cmdHookEnv = &argv.Command{
+ Name: "hook-env",
+ Key: CmdHookEnv,
+ Flags: []*argv.Flag{
+ {Key: FlagHookEnvForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ {Key: FlagHookEnvQuiet, Name: "quiet", Longs: []string{"quiet"}, Shorts: []byte{'q'}},
+ {Key: FlagHookEnvShell, Name: "shell", Longs: []string{"shell"}, Shorts: []byte{'s'}, TakesValue: true},
+ {Key: FlagHookEnvReason, Name: "reason", Longs: []string{"reason"}, TakesValue: true},
+ {Key: FlagHookEnvStatus, Name: "status", Longs: []string{"status"}},
+ },
+}
+
+// hook-not-found
+var cmdHookNotFound = &argv.Command{
+ Name: "hook-not-found",
+ Key: CmdHookNotFound,
+ Flags: []*argv.Flag{
+ {Key: FlagHookNotFoundShell, Name: "shell", Longs: []string{"shell"}, Shorts: []byte{'s'}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgHookNotFoundBin, Name: "BIN", Required: true},
+ },
+}
+
+// implode
+var cmdImplode = &argv.Command{
+ Name: "implode",
+ Key: CmdImplode,
+ Flags: []*argv.Flag{
+ {Key: FlagImplodeDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagImplodeConfig, Name: "config", Longs: []string{"config"}},
+ },
+}
+
+// edit
+var cmdEdit = &argv.Command{
+ Name: "edit",
+ Key: CmdEdit,
+ Flags: []*argv.Flag{
+ {Key: FlagEditGlobal, Name: "global", Longs: []string{"global"}, Shorts: []byte{'g'}},
+ {Key: FlagEditDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagEditToolVersions, Name: "tool-versions", Longs: []string{"tool-versions"}, Shorts: []byte{'t'}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgEditPath, Name: "PATH"},
+ },
+}
+
+// install
+var cmdInstall = &argv.Command{
+ Name: "install",
+ Key: CmdInstall,
+ Aliases: []string{"i"},
+ Flags: []*argv.Flag{
+ {Key: FlagInstallForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ {Key: FlagInstallJobs, Name: "jobs", Longs: []string{"jobs"}, Shorts: []byte{'j'}, TakesValue: true},
+ {Key: FlagInstallDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagInstallVerbose, Name: "verbose", Longs: []string{"verbose"}, Shorts: []byte{'v'}},
+ {Key: FlagInstallDryRunCode, Name: "dry-run-code", Longs: []string{"dry-run-code"}},
+ {Key: FlagInstallIncludeTaskTools, Name: "include-task-tools", Longs: []string{"include-task-tools"}},
+ {Key: FlagInstallMinimumReleaseAge, Name: "minimum-release-age", Longs: []string{"minimum-release-age", "before"}, HiddenLongs: []string{"before"}, TakesValue: true},
+ {Key: FlagInstallMonorepo, Name: "monorepo", Longs: []string{"monorepo"}},
+ {Key: FlagInstallRaw, Name: "raw", Longs: []string{"raw"}},
+ {Key: FlagInstallShared, Name: "shared", Longs: []string{"shared"}, TakesValue: true},
+ {Key: FlagInstallSystem, Name: "system", Longs: []string{"system"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgInstallToolVersion, Name: "TOOL@VERSION", Var: true},
+ },
+}
+
+// install-into
+var cmdInstallInto = &argv.Command{
+ Name: "install-into",
+ Key: CmdInstallInto,
+ Args: []*argv.Arg{
+ {Key: ArgInstallIntoToolVersion, Name: "TOOL@VERSION", Required: true},
+ {Key: ArgInstallIntoPath, Name: "PATH", Required: true},
+ },
+}
+
+// latest
+var cmdLatest = &argv.Command{
+ Name: "latest",
+ Key: CmdLatest,
+ Flags: []*argv.Flag{
+ {Key: FlagLatestInstalled, Name: "installed", Longs: []string{"installed"}, Shorts: []byte{'i'}},
+ {Key: FlagLatestMinimumReleaseAge, Name: "minimum-release-age", Longs: []string{"minimum-release-age", "before"}, HiddenLongs: []string{"before"}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgLatestToolVersion, Name: "TOOL@VERSION", Required: true},
+ {Key: ArgLatestAsdfVersion, Name: "ASDF_VERSION"},
+ },
+}
+
+// link
+var cmdLink = &argv.Command{
+ Name: "link",
+ Key: CmdLink,
+ Aliases: []string{"ln"},
+ Flags: []*argv.Flag{
+ {Key: FlagLinkForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgLinkToolVersion, Name: "TOOL@VERSION", Required: true},
+ {Key: ArgLinkPath, Name: "PATH", Required: true},
+ },
+}
+
+// local
+var cmdLocal = &argv.Command{
+ Name: "local",
+ Key: CmdLocal,
+ Aliases: []string{"l"},
+ Flags: []*argv.Flag{
+ {Key: FlagLocalParent, Name: "parent", Longs: []string{"parent"}, Shorts: []byte{'p'}},
+ {Key: FlagLocalFuzzy, Name: "fuzzy", Longs: []string{"fuzzy"}},
+ {Key: FlagLocalPath, Name: "path", Longs: []string{"path"}},
+ {Key: FlagLocalPin, Name: "pin", Longs: []string{"pin"}},
+ {Key: FlagLocalRemove, Name: "remove", Longs: []string{"remove", "rm", "unset"}, HiddenLongs: []string{"rm", "unset"}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgLocalToolVersion, Name: "TOOL@VERSION", Var: true},
+ },
+}
+
+// lock
+var cmdLock = &argv.Command{
+ Name: "lock",
+ Key: CmdLock,
+ Flags: []*argv.Flag{
+ {Key: FlagLockGlobal, Name: "global", Longs: []string{"global"}, Shorts: []byte{'g'}},
+ {Key: FlagLockJobs, Name: "jobs", Longs: []string{"jobs"}, Shorts: []byte{'j'}, TakesValue: true},
+ {Key: FlagLockDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagLockPlatform, Name: "platform", Longs: []string{"platform"}, Shorts: []byte{'p'}, TakesValue: true, Delimiter: ','},
+ {Key: FlagLockBump, Name: "bump", Longs: []string{"bump"}},
+ {Key: FlagLockJson, Name: "json", Longs: []string{"json"}},
+ {Key: FlagLockLocal, Name: "local", Longs: []string{"local"}},
+ {Key: FlagLockMinimumReleaseAge, Name: "minimum-release-age", Longs: []string{"minimum-release-age", "before"}, HiddenLongs: []string{"before"}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgLockTool, Name: "TOOL", Var: true},
+ },
+}
+
+// ls
+var cmdLs = &argv.Command{
+ Name: "ls",
+ Key: CmdLs,
+ Aliases: []string{"list"},
+ Flags: []*argv.Flag{
+ {Key: FlagLsCurrent, Name: "current", Longs: []string{"current"}, Shorts: []byte{'c'}},
+ {Key: FlagLsGlobal, Name: "global", Longs: []string{"global"}, Shorts: []byte{'g'}},
+ {Key: FlagLsInstalled, Name: "installed", Longs: []string{"installed"}, Shorts: []byte{'i'}},
+ {Key: FlagLsJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagLsLocal, Name: "local", Longs: []string{"local"}, Shorts: []byte{'l'}},
+ {Key: FlagLsMissing, Name: "missing", Longs: []string{"missing"}, Shorts: []byte{'m'}},
+ {Key: FlagLsOffline, Name: "offline", Longs: []string{"offline"}, Shorts: []byte{'o'}},
+ {Key: FlagLsPlugin, Name: "plugin", Longs: []string{"plugin"}, Shorts: []byte{'p'}, TakesValue: true},
+ {Key: FlagLsAllSources, Name: "all-sources", Longs: []string{"all-sources"}},
+ {Key: FlagLsMonorepo, Name: "monorepo", Longs: []string{"monorepo"}},
+ {Key: FlagLsNoHeader, Name: "no-header", Longs: []string{"no-header", "no-headers"}, HiddenLongs: []string{"no-headers"}},
+ {Key: FlagLsOutdated, Name: "outdated", Longs: []string{"outdated"}},
+ {Key: FlagLsPrefix, Name: "prefix", Longs: []string{"prefix"}, TakesValue: true},
+ {Key: FlagLsPrunable, Name: "prunable", Longs: []string{"prunable"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgLsInstalledTool, Name: "INSTALLED_TOOL", Var: true},
+ },
+}
+
+// ls-remote
+var cmdLsRemote = &argv.Command{
+ Name: "ls-remote",
+ Key: CmdLsRemote,
+ Aliases: []string{"list-all", "list-remote"},
+ Flags: []*argv.Flag{
+ {Key: FlagLsRemoteAll, Name: "all", Longs: []string{"all"}},
+ {Key: FlagLsRemoteMinimumReleaseAge, Name: "minimum-release-age", Longs: []string{"minimum-release-age", "before"}, HiddenLongs: []string{"before"}, TakesValue: true},
+ {Key: FlagLsRemoteJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagLsRemoteNoVersionsHost, Name: "no-versions-host", Longs: []string{"no-versions-host"}},
+ {Key: FlagLsRemotePrerelease, Name: "prerelease", Longs: []string{"prerelease"}},
+ {Key: FlagLsRemoteStrictMetadata, Name: "strict-metadata", Longs: []string{"strict-metadata"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgLsRemoteToolVersion, Name: "TOOL@VERSION"},
+ {Key: ArgLsRemotePrefix, Name: "PREFIX"},
+ },
+}
+
+// mcp
+var cmdMcp = &argv.Command{
+ Name: "mcp",
+ Key: CmdMcp,
+}
+
+// oci
+var cmdOci = &argv.Command{
+ Name: "oci",
+ Key: CmdOci,
+ Subcommands: []*argv.Command{cmdOciBuild, cmdOciPush, cmdOciRun},
+}
+
+// oci build
+var cmdOciBuild = &argv.Command{
+ Name: "build",
+ Key: CmdOciBuild,
+ Flags: []*argv.Flag{
+ {Key: FlagOciBuildCopy, Name: "copy", Longs: []string{"copy"}, TakesValue: true},
+ {Key: FlagOciBuildOutput, Name: "output", Longs: []string{"output"}, Shorts: []byte{'o'}, TakesValue: true},
+ {Key: FlagOciBuildFrom, Name: "from", Longs: []string{"from"}, TakesValue: true},
+ {Key: FlagOciBuildIncludeGlobal, Name: "include-global", Longs: []string{"include-global"}},
+ {Key: FlagOciBuildTag, Name: "tag", Longs: []string{"tag"}, Shorts: []byte{'t'}, TakesValue: true},
+ {Key: FlagOciBuildMountPoint, Name: "mount-point", Longs: []string{"mount-point"}, TakesValue: true},
+ {Key: FlagOciBuildNoMise, Name: "no-mise", Longs: []string{"no-mise"}},
+ {Key: FlagOciBuildOwner, Name: "owner", Longs: []string{"owner"}, TakesValue: true},
+ },
+}
+
+// oci push
+var cmdOciPush = &argv.Command{
+ Name: "push",
+ Key: CmdOciPush,
+ Flags: []*argv.Flag{
+ {Key: FlagOciPushCacheFrom, Name: "cache-from", Longs: []string{"cache-from"}, TakesValue: true},
+ {Key: FlagOciPushFrom, Name: "from", Longs: []string{"from"}, TakesValue: true},
+ {Key: FlagOciPushImageDir, Name: "image-dir", Longs: []string{"image-dir"}, TakesValue: true},
+ {Key: FlagOciPushIncludeGlobal, Name: "include-global", Longs: []string{"include-global"}},
+ {Key: FlagOciPushMountPoint, Name: "mount-point", Longs: []string{"mount-point"}, TakesValue: true},
+ {Key: FlagOciPushNoCache, Name: "no-cache", Longs: []string{"no-cache"}},
+ {Key: FlagOciPushNoMise, Name: "no-mise", Longs: []string{"no-mise"}},
+ {Key: FlagOciPushOwner, Name: "owner", Longs: []string{"owner"}, TakesValue: true},
+ {Key: FlagOciPushUpdateIndex, Name: "update-index", Longs: []string{"update-index"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgOciPushRef, Name: "REF", Required: true},
+ },
+}
+
+// oci run
+var cmdOciRun = &argv.Command{
+ Name: "run",
+ Key: CmdOciRun,
+ Flags: []*argv.Flag{
+ {Key: FlagOciRunEngine, Name: "engine", Longs: []string{"engine"}, TakesValue: true},
+ {Key: FlagOciRunFrom, Name: "from", Longs: []string{"from"}, TakesValue: true},
+ {Key: FlagOciRunImageDir, Name: "image-dir", Longs: []string{"image-dir"}, TakesValue: true},
+ {Key: FlagOciRunIncludeGlobal, Name: "include-global", Longs: []string{"include-global"}},
+ {Key: FlagOciRunKeep, Name: "keep", Longs: []string{"keep"}},
+ {Key: FlagOciRunMountPoint, Name: "mount-point", Longs: []string{"mount-point"}, TakesValue: true},
+ {Key: FlagOciRunNoMise, Name: "no-mise", Longs: []string{"no-mise"}},
+ {Key: FlagOciRunOwner, Name: "owner", Longs: []string{"owner"}, TakesValue: true},
+ {Key: FlagOciRunVolume, Name: "volume", Longs: []string{"volume", "mount"}, HiddenLongs: []string{"mount"}, TakesValue: true},
+ {Key: FlagOciRunEnv, Name: "env", Longs: []string{"env"}, Shorts: []byte{'e'}, TakesValue: true},
+ {Key: FlagOciRunInteractive, Name: "interactive", Longs: []string{"interactive"}, Shorts: []byte{'i'}},
+ {Key: FlagOciRunTty, Name: "tty", Longs: []string{"tty"}, Shorts: []byte{'t'}},
+ {Key: FlagOciRunWorkdir, Name: "workdir", Longs: []string{"workdir"}, Shorts: []byte{'w'}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgOciRunCmd, Name: "CMD", Var: true, DoubleDash: argv.DoubleDashRequired},
+ },
+}
+
+// outdated
+var cmdOutdated = &argv.Command{
+ Name: "outdated",
+ Key: CmdOutdated,
+ Flags: []*argv.Flag{
+ {Key: FlagOutdatedBump, Name: "bump", Longs: []string{"bump"}, Shorts: []byte{'b'}},
+ {Key: FlagOutdatedJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagOutdatedL, Name: "l", Shorts: []byte{'l'}},
+ {Key: FlagOutdatedInactive, Name: "inactive", Longs: []string{"inactive"}},
+ {Key: FlagOutdatedLocal, Name: "local", Longs: []string{"local"}},
+ {Key: FlagOutdatedMonorepo, Name: "monorepo", Longs: []string{"monorepo"}},
+ {Key: FlagOutdatedNoHeader, Name: "no-header", Longs: []string{"no-header"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgOutdatedToolVersion, Name: "TOOL@VERSION", Var: true},
+ },
+}
+
+// patrons
+var cmdPatrons = &argv.Command{
+ Name: "patrons",
+ Key: CmdPatrons,
+ Flags: []*argv.Flag{
+ {Key: FlagPatronsJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagPatronsRefresh, Name: "refresh", Longs: []string{"refresh"}},
+ },
+}
+
+// plugins
+var cmdPlugins = &argv.Command{
+ Name: "plugins",
+ Key: CmdPlugins,
+ Aliases: []string{"p", "plugin", "plugin-list"},
+ Flags: []*argv.Flag{
+ {Key: FlagPluginsAll, Name: "all", Longs: []string{"all"}, Shorts: []byte{'a'}},
+ {Key: FlagPluginsCore, Name: "core", Longs: []string{"core"}, Shorts: []byte{'c'}},
+ {Key: FlagPluginsUrls, Name: "urls", Longs: []string{"urls", "url"}, HiddenLongs: []string{"url"}, Shorts: []byte{'u'}},
+ {Key: FlagPluginsRefs, Name: "refs", Longs: []string{"refs"}},
+ {Key: FlagPluginsUser, Name: "user", Longs: []string{"user"}},
+ },
+ Subcommands: []*argv.Command{cmdPluginsInstall, cmdPluginsLink, cmdPluginsLs, cmdPluginsLsRemote, cmdPluginsUninstall, cmdPluginsUpdate},
+}
+
+// plugins install
+var cmdPluginsInstall = &argv.Command{
+ Name: "install",
+ Key: CmdPluginsInstall,
+ Aliases: []string{"i", "a", "add"},
+ Flags: []*argv.Flag{
+ {Key: FlagPluginsInstallAll, Name: "all", Longs: []string{"all"}, Shorts: []byte{'a'}},
+ {Key: FlagPluginsInstallForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ {Key: FlagPluginsInstallJobs, Name: "jobs", Longs: []string{"jobs"}, Shorts: []byte{'j'}, TakesValue: true},
+ {Key: FlagPluginsInstallVerbose, Name: "verbose", Longs: []string{"verbose"}, Shorts: []byte{'v'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgPluginsInstallNewPlugin, Name: "NEW_PLUGIN"},
+ {Key: ArgPluginsInstallGitUrl, Name: "GIT_URL"},
+ {Key: ArgPluginsInstallRest, Name: "REST", Var: true},
+ },
+}
+
+// plugins link
+var cmdPluginsLink = &argv.Command{
+ Name: "link",
+ Key: CmdPluginsLink,
+ Aliases: []string{"ln"},
+ Flags: []*argv.Flag{
+ {Key: FlagPluginsLinkForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgPluginsLinkName, Name: "NAME", Required: true},
+ {Key: ArgPluginsLinkDir, Name: "DIR"},
+ },
+}
+
+// plugins ls
+var cmdPluginsLs = &argv.Command{
+ Name: "ls",
+ Key: CmdPluginsLs,
+ Aliases: []string{"list"},
+ Flags: []*argv.Flag{
+ {Key: FlagPluginsLsAll, Name: "all", Longs: []string{"all"}, Shorts: []byte{'a'}},
+ {Key: FlagPluginsLsCore, Name: "core", Longs: []string{"core"}, Shorts: []byte{'c'}},
+ {Key: FlagPluginsLsOutdated, Name: "outdated", Longs: []string{"outdated"}, Shorts: []byte{'o'}},
+ {Key: FlagPluginsLsUrls, Name: "urls", Longs: []string{"urls", "url"}, HiddenLongs: []string{"url"}, Shorts: []byte{'u'}},
+ {Key: FlagPluginsLsRefs, Name: "refs", Longs: []string{"refs"}},
+ {Key: FlagPluginsLsUser, Name: "user", Longs: []string{"user"}},
+ },
+}
+
+// plugins ls-remote
+var cmdPluginsLsRemote = &argv.Command{
+ Name: "ls-remote",
+ Key: CmdPluginsLsRemote,
+ Aliases: []string{"list-remote", "list-all"},
+ Flags: []*argv.Flag{
+ {Key: FlagPluginsLsRemoteUrls, Name: "urls", Longs: []string{"urls"}, Shorts: []byte{'u'}},
+ {Key: FlagPluginsLsRemoteOnlyNames, Name: "only-names", Longs: []string{"only-names"}},
+ },
+}
+
+// plugins uninstall
+var cmdPluginsUninstall = &argv.Command{
+ Name: "uninstall",
+ Key: CmdPluginsUninstall,
+ Aliases: []string{"remove", "rm"},
+ Flags: []*argv.Flag{
+ {Key: FlagPluginsUninstallAll, Name: "all", Longs: []string{"all"}, Shorts: []byte{'a'}},
+ {Key: FlagPluginsUninstallPurge, Name: "purge", Longs: []string{"purge"}, Shorts: []byte{'p'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgPluginsUninstallPlugin, Name: "PLUGIN", Var: true},
+ },
+}
+
+// plugins update
+var cmdPluginsUpdate = &argv.Command{
+ Name: "update",
+ Key: CmdPluginsUpdate,
+ Aliases: []string{"up", "upgrade"},
+ Flags: []*argv.Flag{
+ {Key: FlagPluginsUpdateJobs, Name: "jobs", Longs: []string{"jobs"}, Shorts: []byte{'j'}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgPluginsUpdatePlugin, Name: "PLUGIN", Var: true},
+ },
+}
+
+// deps
+var cmdDeps = &argv.Command{
+ Name: "deps",
+ Key: CmdDeps,
+ Aliases: []string{"dep", "prepare"},
+ Flags: []*argv.Flag{
+ {Key: FlagDepsExplain, Name: "explain", Longs: []string{"explain"}},
+ {Key: FlagDepsForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ {Key: FlagDepsDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagDepsList, Name: "list", Longs: []string{"list"}},
+ {Key: FlagDepsMonorepo, Name: "monorepo", Longs: []string{"monorepo"}},
+ {Key: FlagDepsOnly, Name: "only", Longs: []string{"only"}, TakesValue: true},
+ {Key: FlagDepsSkip, Name: "skip", Longs: []string{"skip"}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgDepsProvider, Name: "PROVIDER"},
+ },
+ Subcommands: []*argv.Command{cmdDepsAdd, cmdDepsInstall, cmdDepsRemove},
+}
+
+// deps add
+var cmdDepsAdd = &argv.Command{
+ Name: "add",
+ Key: CmdDepsAdd,
+ Flags: []*argv.Flag{
+ {Key: FlagDepsAddDev, Name: "dev", Longs: []string{"dev"}, Shorts: []byte{'D'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgDepsAddPackages, Name: "PACKAGES", Required: true, Var: true},
+ },
+}
+
+// deps install
+var cmdDepsInstall = &argv.Command{
+ Name: "install",
+ Key: CmdDepsInstall,
+ Flags: []*argv.Flag{
+ {Key: FlagDepsInstallExplain, Name: "explain", Longs: []string{"explain"}},
+ {Key: FlagDepsInstallForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ {Key: FlagDepsInstallDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagDepsInstallList, Name: "list", Longs: []string{"list"}},
+ {Key: FlagDepsInstallMonorepo, Name: "monorepo", Longs: []string{"monorepo"}},
+ {Key: FlagDepsInstallOnly, Name: "only", Longs: []string{"only"}, TakesValue: true},
+ {Key: FlagDepsInstallSkip, Name: "skip", Longs: []string{"skip"}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgDepsInstallProvider, Name: "PROVIDER"},
+ },
+}
+
+// deps remove
+var cmdDepsRemove = &argv.Command{
+ Name: "remove",
+ Key: CmdDepsRemove,
+ Args: []*argv.Arg{
+ {Key: ArgDepsRemovePackages, Name: "PACKAGES", Required: true, Var: true},
+ },
+}
+
+// prune
+var cmdPrune = &argv.Command{
+ Name: "prune",
+ Key: CmdPrune,
+ Flags: []*argv.Flag{
+ {Key: FlagPruneDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagPruneConfigs, Name: "configs", Longs: []string{"configs"}},
+ {Key: FlagPruneDryRunCode, Name: "dry-run-code", Longs: []string{"dry-run-code"}},
+ {Key: FlagPruneMonorepo, Name: "monorepo", Longs: []string{"monorepo"}},
+ {Key: FlagPruneTools, Name: "tools", Longs: []string{"tools"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgPruneInstalledTool, Name: "INSTALLED_TOOL", Var: true},
+ },
+}
+
+// registry
+var cmdRegistry = &argv.Command{
+ Name: "registry",
+ Key: CmdRegistry,
+ Flags: []*argv.Flag{
+ {Key: FlagRegistryBackend, Name: "backend", Longs: []string{"backend"}, Shorts: []byte{'b'}, TakesValue: true},
+ {Key: FlagRegistryComplete, Name: "complete", Longs: []string{"complete"}},
+ {Key: FlagRegistryHideAliased, Name: "hide-aliased", Longs: []string{"hide-aliased"}},
+ {Key: FlagRegistryJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagRegistrySecurity, Name: "security", Longs: []string{"security"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgRegistryName, Name: "NAME"},
+ },
+}
+
+// render-help
+var cmdRenderHelp = &argv.Command{
+ Name: "render-help",
+ Key: CmdRenderHelp,
+}
+
+// reshim
+var cmdReshim = &argv.Command{
+ Name: "reshim",
+ Key: CmdReshim,
+ Flags: []*argv.Flag{
+ {Key: FlagReshimForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgReshimTool, Name: "TOOL"},
+ {Key: ArgReshimVersion, Name: "VERSION"},
+ },
+}
+
+// run
+var cmdRun = &argv.Command{
+ Name: "run",
+ Key: CmdRun,
+ Aliases: []string{"r"},
+ Flags: []*argv.Flag{
+ {Key: FlagRunAffected, Name: "affected", Longs: []string{"affected"}},
+ {Key: FlagRunAffectedBase, Name: "affected-base", Longs: []string{"affected-base"}, TakesValue: true},
+ {Key: FlagRunAffectedExplain, Name: "affected-explain", Longs: []string{"affected-explain"}},
+ {Key: FlagRunAffectedHead, Name: "affected-head", Longs: []string{"affected-head"}, TakesValue: true},
+ {Key: FlagRunAffectedJson, Name: "affected-json", Longs: []string{"affected-json"}},
+ {Key: FlagRunAll, Name: "all", Longs: []string{"all"}},
+ {Key: FlagRunContinueOnError, Name: "continue-on-error", Longs: []string{"continue-on-error"}, Shorts: []byte{'c'}},
+ {Key: FlagRunCd, Name: "cd", Longs: []string{"cd"}, Shorts: []byte{'C'}, TakesValue: true},
+ {Key: FlagRunForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ {Key: FlagRunJobs, Name: "jobs", Longs: []string{"jobs"}, Shorts: []byte{'j'}, TakesValue: true},
+ {Key: FlagRunDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagRunOutput, Name: "output", Longs: []string{"output"}, Shorts: []byte{'o'}, TakesValue: true},
+ {Key: FlagRunQuiet, Name: "quiet", Longs: []string{"quiet"}, Shorts: []byte{'q'}},
+ {Key: FlagRunRaw, Name: "raw", Longs: []string{"raw"}, Shorts: []byte{'r'}},
+ {Key: FlagRunShell, Name: "shell", Longs: []string{"shell"}, Shorts: []byte{'s'}, TakesValue: true},
+ {Key: FlagRunSilent, Name: "silent", Longs: []string{"silent"}, Shorts: []byte{'S'}},
+ {Key: FlagRunTool, Name: "tool", Longs: []string{"tool"}, Shorts: []byte{'t'}, TakesValue: true},
+ {Key: FlagRunAllowEnv, Name: "allow-env", Longs: []string{"allow-env"}, TakesValue: true},
+ {Key: FlagRunAllowNet, Name: "allow-net", Longs: []string{"allow-net"}, TakesValue: true},
+ {Key: FlagRunAllowRead, Name: "allow-read", Longs: []string{"allow-read"}, TakesValue: true},
+ {Key: FlagRunAllowWrite, Name: "allow-write", Longs: []string{"allow-write"}, TakesValue: true},
+ {Key: FlagRunDenyAll, Name: "deny-all", Longs: []string{"deny-all"}},
+ {Key: FlagRunDenyEnv, Name: "deny-env", Longs: []string{"deny-env"}},
+ {Key: FlagRunDenyNet, Name: "deny-net", Longs: []string{"deny-net"}},
+ {Key: FlagRunDenyRead, Name: "deny-read", Longs: []string{"deny-read"}},
+ {Key: FlagRunDenyWrite, Name: "deny-write", Longs: []string{"deny-write"}},
+ {Key: FlagRunFreshEnv, Name: "fresh-env", Longs: []string{"fresh-env"}},
+ {Key: FlagRunNoCache, Name: "no-cache", Longs: []string{"no-cache"}},
+ {Key: FlagRunNoDeps, Name: "no-deps", Longs: []string{"no-deps"}},
+ {Key: FlagRunNoTimings, Name: "no-timings", Longs: []string{"no-timings", "no-timing"}, HiddenLongs: []string{"no-timing"}},
+ {Key: FlagRunSkipDeps, Name: "skip-deps", Longs: []string{"skip-deps"}},
+ {Key: FlagRunSkipTools, Name: "skip-tools", Longs: []string{"skip-tools"}},
+ {Key: FlagRunTaskCache, Name: "task-cache", Longs: []string{"task-cache"}, TakesValue: true},
+ {Key: FlagRunTaskCacheExplain, Name: "task-cache-explain", Longs: []string{"task-cache-explain"}},
+ {Key: FlagRunTaskCacheExplainJson, Name: "task-cache-explain-json", Longs: []string{"task-cache-explain-json"}},
+ {Key: FlagRunTaskCacheStats, Name: "task-cache-stats", Longs: []string{"task-cache-stats"}},
+ {Key: FlagRunTimeout, Name: "timeout", Longs: []string{"timeout"}, TakesValue: true},
+ {Key: FlagRunTimings, Name: "timings", Longs: []string{"timings", "timing"}, HiddenLongs: []string{"timing"}},
+ },
+ DisableHelpFlag: true,
+}
+
+// search
+var cmdSearch = &argv.Command{
+ Name: "search",
+ Key: CmdSearch,
+ Flags: []*argv.Flag{
+ {Key: FlagSearchInteractive, Name: "interactive", Longs: []string{"interactive"}, Shorts: []byte{'i'}},
+ {Key: FlagSearchMatchType, Name: "match-type", Longs: []string{"match-type"}, Shorts: []byte{'m'}, TakesValue: true},
+ {Key: FlagSearchNoHeader, Name: "no-header", Longs: []string{"no-header", "no-headers"}, HiddenLongs: []string{"no-headers"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgSearchName, Name: "NAME"},
+ },
+}
+
+// self-update
+var cmdSelfUpdate = &argv.Command{
+ Name: "self-update",
+ Key: CmdSelfUpdate,
+ Flags: []*argv.Flag{
+ {Key: FlagSelfUpdateForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ {Key: FlagSelfUpdateYes, Name: "yes", Longs: []string{"yes"}, Shorts: []byte{'y'}},
+ {Key: FlagSelfUpdateNoPlugins, Name: "no-plugins", Longs: []string{"no-plugins"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgSelfUpdateVersion, Name: "VERSION"},
+ },
+}
+
+// set
+var cmdSet = &argv.Command{
+ Name: "set",
+ Key: CmdSet,
+ Aliases: []string{"ev", "env-vars"},
+ Flags: []*argv.Flag{
+ {Key: FlagSetEnv, Name: "env", Longs: []string{"env"}, Shorts: []byte{'E'}, TakesValue: true},
+ {Key: FlagSetGlobal, Name: "global", Longs: []string{"global"}, Shorts: []byte{'g'}},
+ {Key: FlagSetAgeEncrypt, Name: "age-encrypt", Longs: []string{"age-encrypt"}},
+ {Key: FlagSetAgeKeyFile, Name: "age-key-file", Longs: []string{"age-key-file"}, TakesValue: true},
+ {Key: FlagSetAgeRecipient, Name: "age-recipient", Longs: []string{"age-recipient"}, TakesValue: true},
+ {Key: FlagSetAgeSshRecipient, Name: "age-ssh-recipient", Longs: []string{"age-ssh-recipient"}, TakesValue: true},
+ {Key: FlagSetComplete, Name: "complete", Longs: []string{"complete"}},
+ {Key: FlagSetFile, Name: "file", Longs: []string{"file", "path"}, TakesValue: true},
+ {Key: FlagSetNoRedact, Name: "no-redact", Longs: []string{"no-redact"}},
+ {Key: FlagSetPrompt, Name: "prompt", Longs: []string{"prompt"}},
+ {Key: FlagSetRemove, Name: "remove", Longs: []string{"remove", "rm", "unset"}, TakesValue: true},
+ {Key: FlagSetStdin, Name: "stdin", Longs: []string{"stdin"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgSetEnvVar, Name: "ENV_VAR", Var: true},
+ },
+}
+
+// settings
+var cmdSettings = &argv.Command{
+ Name: "settings",
+ Key: CmdSettings,
+ Flags: []*argv.Flag{
+ {Key: FlagSettingsAll, Name: "all", Longs: []string{"all"}, Shorts: []byte{'a'}},
+ {Key: FlagSettingsJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagSettingsLocal, Name: "local", Longs: []string{"local"}, Shorts: []byte{'l'}, Global: true},
+ {Key: FlagSettingsToml, Name: "toml", Longs: []string{"toml"}, Shorts: []byte{'T'}},
+ {Key: FlagSettingsComplete, Name: "complete", Longs: []string{"complete"}},
+ {Key: FlagSettingsJsonExtended, Name: "json-extended", Longs: []string{"json-extended"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgSettingsSetting, Name: "SETTING"},
+ {Key: ArgSettingsValue, Name: "VALUE"},
+ },
+ Subcommands: []*argv.Command{cmdSettingsAdd, cmdSettingsGet, cmdSettingsLs, cmdSettingsSet, cmdSettingsUnset},
+}
+
+// settings add
+var cmdSettingsAdd = &argv.Command{
+ Name: "add",
+ Key: CmdSettingsAdd,
+ Flags: []*argv.Flag{
+ {Key: FlagSettingsAddLocal, Name: "local", Longs: []string{"local"}, Shorts: []byte{'l'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgSettingsAddSetting, Name: "SETTING", Required: true},
+ {Key: ArgSettingsAddValue, Name: "VALUE"},
+ },
+}
+
+// settings get
+var cmdSettingsGet = &argv.Command{
+ Name: "get",
+ Key: CmdSettingsGet,
+ Flags: []*argv.Flag{
+ {Key: FlagSettingsGetLocal, Name: "local", Longs: []string{"local"}, Shorts: []byte{'l'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgSettingsGetSetting, Name: "SETTING", Required: true},
+ },
+}
+
+// settings ls
+var cmdSettingsLs = &argv.Command{
+ Name: "ls",
+ Key: CmdSettingsLs,
+ Aliases: []string{"list"},
+ Flags: []*argv.Flag{
+ {Key: FlagSettingsLsAll, Name: "all", Longs: []string{"all"}, Shorts: []byte{'a'}},
+ {Key: FlagSettingsLsJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagSettingsLsLocal, Name: "local", Longs: []string{"local"}, Shorts: []byte{'l'}, Global: true},
+ {Key: FlagSettingsLsToml, Name: "toml", Longs: []string{"toml"}, Shorts: []byte{'T'}},
+ {Key: FlagSettingsLsComplete, Name: "complete", Longs: []string{"complete"}},
+ {Key: FlagSettingsLsJsonExtended, Name: "json-extended", Longs: []string{"json-extended"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgSettingsLsSetting, Name: "SETTING"},
+ },
+}
+
+// settings set
+var cmdSettingsSet = &argv.Command{
+ Name: "set",
+ Key: CmdSettingsSet,
+ Aliases: []string{"create"},
+ Flags: []*argv.Flag{
+ {Key: FlagSettingsSetLocal, Name: "local", Longs: []string{"local"}, Shorts: []byte{'l'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgSettingsSetSetting, Name: "SETTING", Required: true},
+ {Key: ArgSettingsSetValue, Name: "VALUE"},
+ },
+}
+
+// settings unset
+var cmdSettingsUnset = &argv.Command{
+ Name: "unset",
+ Key: CmdSettingsUnset,
+ Aliases: []string{"rm", "remove", "delete", "del"},
+ Flags: []*argv.Flag{
+ {Key: FlagSettingsUnsetLocal, Name: "local", Longs: []string{"local"}, Shorts: []byte{'l'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgSettingsUnsetKey, Name: "KEY", Required: true},
+ },
+}
+
+// shell
+var cmdShell = &argv.Command{
+ Name: "shell",
+ Key: CmdShell,
+ Aliases: []string{"sh"},
+ Flags: []*argv.Flag{
+ {Key: FlagShellJobs, Name: "jobs", Longs: []string{"jobs"}, Shorts: []byte{'j'}, TakesValue: true},
+ {Key: FlagShellUnset, Name: "unset", Longs: []string{"unset"}, Shorts: []byte{'u'}},
+ {Key: FlagShellRaw, Name: "raw", Longs: []string{"raw"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgShellToolVersion, Name: "TOOL@VERSION", Required: true, Var: true},
+ },
+}
+
+// shell-alias
+var cmdShellAlias = &argv.Command{
+ Name: "shell-alias",
+ Key: CmdShellAlias,
+ Flags: []*argv.Flag{
+ {Key: FlagShellAliasNoHeader, Name: "no-header", Longs: []string{"no-header"}},
+ },
+ Subcommands: []*argv.Command{cmdShellAliasGet, cmdShellAliasLs, cmdShellAliasSet, cmdShellAliasUnset},
+}
+
+// shell-alias get
+var cmdShellAliasGet = &argv.Command{
+ Name: "get",
+ Key: CmdShellAliasGet,
+ Args: []*argv.Arg{
+ {Key: ArgShellAliasGetShellAlias, Name: "shell_alias", Required: true},
+ },
+}
+
+// shell-alias ls
+var cmdShellAliasLs = &argv.Command{
+ Name: "ls",
+ Key: CmdShellAliasLs,
+ Aliases: []string{"list"},
+ Flags: []*argv.Flag{
+ {Key: FlagShellAliasLsNoHeader, Name: "no-header", Longs: []string{"no-header"}},
+ },
+}
+
+// shell-alias set
+var cmdShellAliasSet = &argv.Command{
+ Name: "set",
+ Key: CmdShellAliasSet,
+ Aliases: []string{"add", "create"},
+ Args: []*argv.Arg{
+ {Key: ArgShellAliasSetShellAlias, Name: "shell_alias", Required: true},
+ {Key: ArgShellAliasSetCommand, Name: "COMMAND"},
+ },
+}
+
+// shell-alias unset
+var cmdShellAliasUnset = &argv.Command{
+ Name: "unset",
+ Key: CmdShellAliasUnset,
+ Aliases: []string{"rm", "remove", "delete", "del"},
+ Args: []*argv.Arg{
+ {Key: ArgShellAliasUnsetShellAlias, Name: "shell_alias", Required: true},
+ },
+}
+
+// sponsors
+var cmdSponsors = &argv.Command{
+ Name: "sponsors",
+ Key: CmdSponsors,
+}
+
+// sync
+var cmdSync = &argv.Command{
+ Name: "sync",
+ Key: CmdSync,
+ Subcommands: []*argv.Command{cmdSyncNode, cmdSyncPython, cmdSyncRuby},
+}
+
+// sync node
+var cmdSyncNode = &argv.Command{
+ Name: "node",
+ Key: CmdSyncNode,
+ Flags: []*argv.Flag{
+ {Key: FlagSyncNodeBrew, Name: "brew", Longs: []string{"brew"}},
+ {Key: FlagSyncNodeNodenv, Name: "nodenv", Longs: []string{"nodenv"}},
+ {Key: FlagSyncNodeNvm, Name: "nvm", Longs: []string{"nvm"}},
+ },
+}
+
+// sync python
+var cmdSyncPython = &argv.Command{
+ Name: "python",
+ Key: CmdSyncPython,
+ Flags: []*argv.Flag{
+ {Key: FlagSyncPythonPyenv, Name: "pyenv", Longs: []string{"pyenv"}},
+ {Key: FlagSyncPythonUv, Name: "uv", Longs: []string{"uv"}},
+ },
+}
+
+// sync ruby
+var cmdSyncRuby = &argv.Command{
+ Name: "ruby",
+ Key: CmdSyncRuby,
+ Flags: []*argv.Flag{
+ {Key: FlagSyncRubyBrew, Name: "brew", Longs: []string{"brew"}},
+ },
+}
+
+// tasks
+var cmdTasks = &argv.Command{
+ Name: "tasks",
+ Key: CmdTasks,
+ Aliases: []string{"t", "task"},
+ Flags: []*argv.Flag{
+ {Key: FlagTasksGlobal, Name: "global", Longs: []string{"global"}, Shorts: []byte{'g'}},
+ {Key: FlagTasksJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagTasksLocal, Name: "local", Longs: []string{"local"}, Shorts: []byte{'l'}},
+ {Key: FlagTasksExtended, Name: "extended", Longs: []string{"extended"}, Shorts: []byte{'x'}},
+ {Key: FlagTasksAll, Name: "all", Longs: []string{"all"}},
+ {Key: FlagTasksComplete, Name: "complete", Longs: []string{"complete"}},
+ {Key: FlagTasksHidden, Name: "hidden", Longs: []string{"hidden"}},
+ {Key: FlagTasksNameOnly, Name: "name-only", Longs: []string{"name-only"}},
+ {Key: FlagTasksNoHeader, Name: "no-header", Longs: []string{"no-header", "no-headers"}, HiddenLongs: []string{"no-headers"}},
+ {Key: FlagTasksSort, Name: "sort", Longs: []string{"sort"}, TakesValue: true},
+ {Key: FlagTasksSortOrder, Name: "sort-order", Longs: []string{"sort-order"}, TakesValue: true},
+ {Key: FlagTasksUsage, Name: "usage", Longs: []string{"usage"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgTasksTask, Name: "TASK"},
+ },
+ Subcommands: []*argv.Command{cmdTasksAdd, cmdTasksDeps, cmdTasksEdit, cmdTasksGraph, cmdTasksInfo, cmdTasksLs, cmdTasksRun, cmdTasksValidate},
+}
+
+// tasks add
+var cmdTasksAdd = &argv.Command{
+ Name: "add",
+ Key: CmdTasksAdd,
+ Flags: []*argv.Flag{
+ {Key: FlagTasksAddAlias, Name: "alias", Longs: []string{"alias"}, Shorts: []byte{'a'}, TakesValue: true},
+ {Key: FlagTasksAddDepends, Name: "depends", Longs: []string{"depends"}, Shorts: []byte{'d'}, TakesValue: true},
+ {Key: FlagTasksAddDir, Name: "dir", Longs: []string{"dir"}, Shorts: []byte{'D'}, TakesValue: true},
+ {Key: FlagTasksAddFile, Name: "file", Longs: []string{"file"}, Shorts: []byte{'f'}},
+ {Key: FlagTasksAddHide, Name: "hide", Longs: []string{"hide"}, Shorts: []byte{'H'}},
+ {Key: FlagTasksAddQuiet, Name: "quiet", Longs: []string{"quiet"}, Shorts: []byte{'q'}},
+ {Key: FlagTasksAddRaw, Name: "raw", Longs: []string{"raw"}, Shorts: []byte{'r'}},
+ {Key: FlagTasksAddSources, Name: "sources", Longs: []string{"sources"}, Shorts: []byte{'s'}, TakesValue: true},
+ {Key: FlagTasksAddWaitFor, Name: "wait-for", Longs: []string{"wait-for"}, Shorts: []byte{'w'}, TakesValue: true},
+ {Key: FlagTasksAddDependsPost, Name: "depends-post", Longs: []string{"depends-post"}, TakesValue: true},
+ {Key: FlagTasksAddDescription, Name: "description", Longs: []string{"description"}, TakesValue: true},
+ {Key: FlagTasksAddOutputs, Name: "outputs", Longs: []string{"outputs"}, TakesValue: true},
+ {Key: FlagTasksAddRunWindows, Name: "run-windows", Longs: []string{"run-windows"}, TakesValue: true},
+ {Key: FlagTasksAddShell, Name: "shell", Longs: []string{"shell"}, TakesValue: true},
+ {Key: FlagTasksAddSilent, Name: "silent", Longs: []string{"silent"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgTasksAddTask, Name: "TASK", Required: true},
+ {Key: ArgTasksAddRun, Name: "RUN", Var: true, DoubleDash: argv.DoubleDashRequired},
+ },
+}
+
+// tasks deps
+var cmdTasksDeps = &argv.Command{
+ Name: "deps",
+ Key: CmdTasksDeps,
+ Flags: []*argv.Flag{
+ {Key: FlagTasksDepsCompact, Name: "compact", Longs: []string{"compact"}},
+ {Key: FlagTasksDepsDot, Name: "dot", Longs: []string{"dot"}},
+ {Key: FlagTasksDepsHidden, Name: "hidden", Longs: []string{"hidden"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgTasksDepsTasks, Name: "TASKS", Var: true},
+ },
+}
+
+// tasks edit
+var cmdTasksEdit = &argv.Command{
+ Name: "edit",
+ Key: CmdTasksEdit,
+ Flags: []*argv.Flag{
+ {Key: FlagTasksEditPath, Name: "path", Longs: []string{"path"}, Shorts: []byte{'p'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgTasksEditTask, Name: "TASK", Required: true},
+ },
+}
+
+// tasks graph
+var cmdTasksGraph = &argv.Command{
+ Name: "graph",
+ Key: CmdTasksGraph,
+ Flags: []*argv.Flag{
+ {Key: FlagTasksGraphJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagTasksGraphExplain, Name: "explain", Longs: []string{"explain"}},
+ {Key: FlagTasksGraphNoHeader, Name: "no-header", Longs: []string{"no-header", "no-headers"}, HiddenLongs: []string{"no-headers"}},
+ },
+}
+
+// tasks info
+var cmdTasksInfo = &argv.Command{
+ Name: "info",
+ Key: CmdTasksInfo,
+ Flags: []*argv.Flag{
+ {Key: FlagTasksInfoJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgTasksInfoTask, Name: "TASK", Required: true},
+ },
+}
+
+// tasks ls
+var cmdTasksLs = &argv.Command{
+ Name: "ls",
+ Key: CmdTasksLs,
+ Flags: []*argv.Flag{
+ {Key: FlagTasksLsGlobal, Name: "global", Longs: []string{"global"}, Shorts: []byte{'g'}},
+ {Key: FlagTasksLsJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagTasksLsLocal, Name: "local", Longs: []string{"local"}, Shorts: []byte{'l'}},
+ {Key: FlagTasksLsExtended, Name: "extended", Longs: []string{"extended"}, Shorts: []byte{'x'}},
+ {Key: FlagTasksLsAll, Name: "all", Longs: []string{"all"}},
+ {Key: FlagTasksLsComplete, Name: "complete", Longs: []string{"complete"}},
+ {Key: FlagTasksLsHidden, Name: "hidden", Longs: []string{"hidden"}},
+ {Key: FlagTasksLsNameOnly, Name: "name-only", Longs: []string{"name-only"}},
+ {Key: FlagTasksLsNoHeader, Name: "no-header", Longs: []string{"no-header", "no-headers"}, HiddenLongs: []string{"no-headers"}},
+ {Key: FlagTasksLsSort, Name: "sort", Longs: []string{"sort"}, TakesValue: true},
+ {Key: FlagTasksLsSortOrder, Name: "sort-order", Longs: []string{"sort-order"}, TakesValue: true},
+ {Key: FlagTasksLsUsage, Name: "usage", Longs: []string{"usage"}},
+ },
+}
+
+// tasks run
+var cmdTasksRun = &argv.Command{
+ Name: "run",
+ Key: CmdTasksRun,
+ Aliases: []string{"r"},
+ Flags: []*argv.Flag{
+ {Key: FlagTasksRunAffected, Name: "affected", Longs: []string{"affected"}},
+ {Key: FlagTasksRunAffectedBase, Name: "affected-base", Longs: []string{"affected-base"}, TakesValue: true},
+ {Key: FlagTasksRunAffectedExplain, Name: "affected-explain", Longs: []string{"affected-explain"}},
+ {Key: FlagTasksRunAffectedHead, Name: "affected-head", Longs: []string{"affected-head"}, TakesValue: true},
+ {Key: FlagTasksRunAffectedJson, Name: "affected-json", Longs: []string{"affected-json"}},
+ {Key: FlagTasksRunAll, Name: "all", Longs: []string{"all"}},
+ {Key: FlagTasksRunContinueOnError, Name: "continue-on-error", Longs: []string{"continue-on-error"}, Shorts: []byte{'c'}},
+ {Key: FlagTasksRunCd, Name: "cd", Longs: []string{"cd"}, Shorts: []byte{'C'}, TakesValue: true},
+ {Key: FlagTasksRunForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ {Key: FlagTasksRunJobs, Name: "jobs", Longs: []string{"jobs"}, Shorts: []byte{'j'}, TakesValue: true},
+ {Key: FlagTasksRunDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagTasksRunOutput, Name: "output", Longs: []string{"output"}, Shorts: []byte{'o'}, TakesValue: true},
+ {Key: FlagTasksRunQuiet, Name: "quiet", Longs: []string{"quiet"}, Shorts: []byte{'q'}},
+ {Key: FlagTasksRunRaw, Name: "raw", Longs: []string{"raw"}, Shorts: []byte{'r'}},
+ {Key: FlagTasksRunShell, Name: "shell", Longs: []string{"shell"}, Shorts: []byte{'s'}, TakesValue: true},
+ {Key: FlagTasksRunSilent, Name: "silent", Longs: []string{"silent"}, Shorts: []byte{'S'}},
+ {Key: FlagTasksRunTool, Name: "tool", Longs: []string{"tool"}, Shorts: []byte{'t'}, TakesValue: true},
+ {Key: FlagTasksRunAllowEnv, Name: "allow-env", Longs: []string{"allow-env"}, TakesValue: true},
+ {Key: FlagTasksRunAllowNet, Name: "allow-net", Longs: []string{"allow-net"}, TakesValue: true},
+ {Key: FlagTasksRunAllowRead, Name: "allow-read", Longs: []string{"allow-read"}, TakesValue: true},
+ {Key: FlagTasksRunAllowWrite, Name: "allow-write", Longs: []string{"allow-write"}, TakesValue: true},
+ {Key: FlagTasksRunDenyAll, Name: "deny-all", Longs: []string{"deny-all"}},
+ {Key: FlagTasksRunDenyEnv, Name: "deny-env", Longs: []string{"deny-env"}},
+ {Key: FlagTasksRunDenyNet, Name: "deny-net", Longs: []string{"deny-net"}},
+ {Key: FlagTasksRunDenyRead, Name: "deny-read", Longs: []string{"deny-read"}},
+ {Key: FlagTasksRunDenyWrite, Name: "deny-write", Longs: []string{"deny-write"}},
+ {Key: FlagTasksRunFreshEnv, Name: "fresh-env", Longs: []string{"fresh-env"}},
+ {Key: FlagTasksRunNoCache, Name: "no-cache", Longs: []string{"no-cache"}},
+ {Key: FlagTasksRunNoDeps, Name: "no-deps", Longs: []string{"no-deps"}},
+ {Key: FlagTasksRunNoTimings, Name: "no-timings", Longs: []string{"no-timings", "no-timing"}, HiddenLongs: []string{"no-timing"}},
+ {Key: FlagTasksRunSkipDeps, Name: "skip-deps", Longs: []string{"skip-deps"}},
+ {Key: FlagTasksRunSkipTools, Name: "skip-tools", Longs: []string{"skip-tools"}},
+ {Key: FlagTasksRunTaskCache, Name: "task-cache", Longs: []string{"task-cache"}, TakesValue: true},
+ {Key: FlagTasksRunTaskCacheExplain, Name: "task-cache-explain", Longs: []string{"task-cache-explain"}},
+ {Key: FlagTasksRunTaskCacheExplainJson, Name: "task-cache-explain-json", Longs: []string{"task-cache-explain-json"}},
+ {Key: FlagTasksRunTaskCacheStats, Name: "task-cache-stats", Longs: []string{"task-cache-stats"}},
+ {Key: FlagTasksRunTimeout, Name: "timeout", Longs: []string{"timeout"}, TakesValue: true},
+ {Key: FlagTasksRunTimings, Name: "timings", Longs: []string{"timings", "timing"}, HiddenLongs: []string{"timing"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgTasksRunTask, Name: "TASK", DoubleDash: argv.DoubleDashAutomatic},
+ {Key: ArgTasksRunArgs, Name: "ARGS", Var: true},
+ {Key: ArgTasksRunArgsLast, Name: "ARGS_LAST", Var: true, DoubleDash: argv.DoubleDashRequired},
+ },
+ DisableHelpFlag: true,
+}
+
+// tasks validate
+var cmdTasksValidate = &argv.Command{
+ Name: "validate",
+ Key: CmdTasksValidate,
+ Flags: []*argv.Flag{
+ {Key: FlagTasksValidateErrorsOnly, Name: "errors-only", Longs: []string{"errors-only"}},
+ {Key: FlagTasksValidateJson, Name: "json", Longs: []string{"json"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgTasksValidateTasks, Name: "TASKS", Var: true},
+ },
+}
+
+// test-tool
+var cmdTestTool = &argv.Command{
+ Name: "test-tool",
+ Key: CmdTestTool,
+ Flags: []*argv.Flag{
+ {Key: FlagTestToolAll, Name: "all", Longs: []string{"all"}, Shorts: []byte{'a'}},
+ {Key: FlagTestToolJobs, Name: "jobs", Longs: []string{"jobs"}, Shorts: []byte{'j'}, TakesValue: true},
+ {Key: FlagTestToolAllConfig, Name: "all-config", Longs: []string{"all-config"}},
+ {Key: FlagTestToolIncludeNonDefined, Name: "include-non-defined", Longs: []string{"include-non-defined"}},
+ {Key: FlagTestToolRaw, Name: "raw", Longs: []string{"raw"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgTestToolTools, Name: "TOOLS", Var: true},
+ },
+}
+
+// token
+var cmdToken = &argv.Command{
+ Name: "token",
+ Key: CmdToken,
+ Subcommands: []*argv.Command{cmdTokenForgejo, cmdTokenGithub, cmdTokenGitlab},
+}
+
+// token forgejo
+var cmdTokenForgejo = &argv.Command{
+ Name: "forgejo",
+ Key: CmdTokenForgejo,
+ Flags: []*argv.Flag{
+ {Key: FlagTokenForgejoUnmask, Name: "unmask", Longs: []string{"unmask"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgTokenForgejoHost, Name: "HOST"},
+ },
+}
+
+// token github
+var cmdTokenGithub = &argv.Command{
+ Name: "github",
+ Key: CmdTokenGithub,
+ Flags: []*argv.Flag{
+ {Key: FlagTokenGithubOauth, Name: "oauth", Longs: []string{"oauth"}},
+ {Key: FlagTokenGithubRaw, Name: "raw", Longs: []string{"raw"}},
+ {Key: FlagTokenGithubRefresh, Name: "refresh", Longs: []string{"refresh"}},
+ {Key: FlagTokenGithubUnmask, Name: "unmask", Longs: []string{"unmask"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgTokenGithubHost, Name: "HOST"},
+ },
+}
+
+// token gitlab
+var cmdTokenGitlab = &argv.Command{
+ Name: "gitlab",
+ Key: CmdTokenGitlab,
+ Flags: []*argv.Flag{
+ {Key: FlagTokenGitlabUnmask, Name: "unmask", Longs: []string{"unmask"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgTokenGitlabHost, Name: "HOST"},
+ },
+}
+
+// tool
+var cmdTool = &argv.Command{
+ Name: "tool",
+ Key: CmdTool,
+ Flags: []*argv.Flag{
+ {Key: FlagToolJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ {Key: FlagToolActive, Name: "active", Longs: []string{"active"}},
+ {Key: FlagToolBackend, Name: "backend", Longs: []string{"backend"}},
+ {Key: FlagToolConfigSource, Name: "config-source", Longs: []string{"config-source"}},
+ {Key: FlagToolDescription, Name: "description", Longs: []string{"description"}},
+ {Key: FlagToolInstalled, Name: "installed", Longs: []string{"installed"}},
+ {Key: FlagToolRequested, Name: "requested", Longs: []string{"requested"}},
+ {Key: FlagToolToolOptions, Name: "tool-options", Longs: []string{"tool-options"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgToolTool, Name: "TOOL", Required: true},
+ },
+}
+
+// tool-stub
+var cmdToolStub = &argv.Command{
+ Name: "tool-stub",
+ Key: CmdToolStub,
+ Args: []*argv.Arg{
+ {Key: ArgToolStubFile, Name: "FILE", Required: true},
+ {Key: ArgToolStubArgs, Name: "ARGS", Var: true, DoubleDash: argv.DoubleDashAutomatic},
+ },
+ DisableHelpFlag: true,
+ DisableVersionFlag: true,
+}
+
+// trust
+var cmdTrust = &argv.Command{
+ Name: "trust",
+ Key: CmdTrust,
+ Flags: []*argv.Flag{
+ {Key: FlagTrustAll, Name: "all", Longs: []string{"all"}, Shorts: []byte{'a'}},
+ {Key: FlagTrustIgnore, Name: "ignore", Longs: []string{"ignore"}},
+ {Key: FlagTrustShow, Name: "show", Longs: []string{"show"}},
+ {Key: FlagTrustUntrust, Name: "untrust", Longs: []string{"untrust"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgTrustConfigFile, Name: "CONFIG_FILE"},
+ },
+}
+
+// uninstall
+var cmdUninstall = &argv.Command{
+ Name: "uninstall",
+ Key: CmdUninstall,
+ Flags: []*argv.Flag{
+ {Key: FlagUninstallAll, Name: "all", Longs: []string{"all"}, Shorts: []byte{'a'}},
+ {Key: FlagUninstallDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagUninstallDryRunCode, Name: "dry-run-code", Longs: []string{"dry-run-code"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgUninstallInstalledToolVersion, Name: "INSTALLED_TOOL@VERSION", Var: true},
+ },
+}
+
+// unset
+var cmdUnset = &argv.Command{
+ Name: "unset",
+ Key: CmdUnset,
+ Flags: []*argv.Flag{
+ {Key: FlagUnsetFile, Name: "file", Longs: []string{"file", "path"}, Shorts: []byte{'f'}, TakesValue: true},
+ {Key: FlagUnsetGlobal, Name: "global", Longs: []string{"global"}, Shorts: []byte{'g'}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgUnsetEnvKey, Name: "ENV_KEY", Var: true},
+ },
+}
+
+// untrust
+var cmdUntrust = &argv.Command{
+ Name: "untrust",
+ Key: CmdUntrust,
+ Args: []*argv.Arg{
+ {Key: ArgUntrustConfigFile, Name: "CONFIG_FILE"},
+ },
+}
+
+// unuse
+var cmdUnuse = &argv.Command{
+ Name: "unuse",
+ Key: CmdUnuse,
+ Aliases: []string{"rm", "remove"},
+ Flags: []*argv.Flag{
+ {Key: FlagUnuseEnv, Name: "env", Longs: []string{"env"}, Shorts: []byte{'e'}, TakesValue: true},
+ {Key: FlagUnuseGlobal, Name: "global", Longs: []string{"global"}, Shorts: []byte{'g'}},
+ {Key: FlagUnusePath, Name: "path", Longs: []string{"path", "file"}, Shorts: []byte{'p'}, TakesValue: true},
+ {Key: FlagUnuseNoPrune, Name: "no-prune", Longs: []string{"no-prune"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgUnuseInstalledToolVersion, Name: "INSTALLED_TOOL@VERSION", Required: true, Var: true},
+ },
+}
+
+// upgrade
+var cmdUpgrade = &argv.Command{
+ Name: "upgrade",
+ Key: CmdUpgrade,
+ Aliases: []string{"up"},
+ Flags: []*argv.Flag{
+ {Key: FlagUpgradeBump, Name: "bump", Longs: []string{"bump"}, Shorts: []byte{'b'}},
+ {Key: FlagUpgradeInteractive, Name: "interactive", Longs: []string{"interactive"}, Shorts: []byte{'i'}},
+ {Key: FlagUpgradeJobs, Name: "jobs", Longs: []string{"jobs"}, Shorts: []byte{'j'}, TakesValue: true},
+ {Key: FlagUpgradeL, Name: "l", Shorts: []byte{'l'}},
+ {Key: FlagUpgradeDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagUpgradeExclude, Name: "exclude", Longs: []string{"exclude"}, Shorts: []byte{'x'}, TakesValue: true},
+ {Key: FlagUpgradeDryRunCode, Name: "dry-run-code", Longs: []string{"dry-run-code"}},
+ {Key: FlagUpgradeInactive, Name: "inactive", Longs: []string{"inactive"}},
+ {Key: FlagUpgradeLocal, Name: "local", Longs: []string{"local"}},
+ {Key: FlagUpgradeMinimumReleaseAge, Name: "minimum-release-age", Longs: []string{"minimum-release-age", "before"}, HiddenLongs: []string{"before"}, TakesValue: true},
+ {Key: FlagUpgradeMonorepo, Name: "monorepo", Longs: []string{"monorepo"}},
+ {Key: FlagUpgradeNoPrune, Name: "no-prune", Longs: []string{"no-prune"}},
+ {Key: FlagUpgradePrune, Name: "prune", Longs: []string{"prune"}},
+ {Key: FlagUpgradeRaw, Name: "raw", Longs: []string{"raw"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgUpgradeInstalledToolVersion, Name: "INSTALLED_TOOL@VERSION", Var: true},
+ },
+}
+
+// usage
+var cmdUsage = &argv.Command{
+ Name: "usage",
+ Key: CmdUsage,
+}
+
+// use
+var cmdUse = &argv.Command{
+ Name: "use",
+ Key: CmdUse,
+ Aliases: []string{"u"},
+ Flags: []*argv.Flag{
+ {Key: FlagUseEnv, Name: "env", Longs: []string{"env"}, Shorts: []byte{'e'}, TakesValue: true},
+ {Key: FlagUseForce, Name: "force", Longs: []string{"force"}, Shorts: []byte{'f'}},
+ {Key: FlagUseGlobal, Name: "global", Longs: []string{"global"}, Shorts: []byte{'g'}},
+ {Key: FlagUseJobs, Name: "jobs", Longs: []string{"jobs"}, Shorts: []byte{'j'}, TakesValue: true},
+ {Key: FlagUseDryRun, Name: "dry-run", Longs: []string{"dry-run"}, Shorts: []byte{'n'}},
+ {Key: FlagUsePath, Name: "path", Longs: []string{"path"}, Shorts: []byte{'p'}, TakesValue: true},
+ {Key: FlagUseDryRunCode, Name: "dry-run-code", Longs: []string{"dry-run-code"}},
+ {Key: FlagUseFuzzy, Name: "fuzzy", Longs: []string{"fuzzy"}},
+ {Key: FlagUseMinimumReleaseAge, Name: "minimum-release-age", Longs: []string{"minimum-release-age", "before"}, HiddenLongs: []string{"before"}, TakesValue: true},
+ {Key: FlagUsePin, Name: "pin", Longs: []string{"pin"}},
+ {Key: FlagUseRaw, Name: "raw", Longs: []string{"raw"}},
+ {Key: FlagUseRemove, Name: "remove", Longs: []string{"remove", "rm", "unset"}, HiddenLongs: []string{"rm", "unset"}, TakesValue: true},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgUseToolVersion, Name: "TOOL@VERSION", Var: true},
+ },
+}
+
+// version
+var cmdVersion = &argv.Command{
+ Name: "version",
+ Key: CmdVersion,
+ Aliases: []string{"v"},
+ Flags: []*argv.Flag{
+ {Key: FlagVersionJson, Name: "json", Longs: []string{"json"}, Shorts: []byte{'J'}},
+ },
+}
+
+// watch
+var cmdWatch = &argv.Command{
+ Name: "watch",
+ Key: CmdWatch,
+ Aliases: []string{"w"},
+ Flags: []*argv.Flag{
+ {Key: FlagWatchTaskFlag, Name: "task-flag", Longs: []string{"task-flag"}, Shorts: []byte{'t'}, TakesValue: true},
+ {Key: FlagWatchGlob, Name: "glob", Longs: []string{"glob"}, Shorts: []byte{'g'}, TakesValue: true},
+ {Key: FlagWatchSkipDeps, Name: "skip-deps", Longs: []string{"skip-deps"}},
+ {Key: FlagWatchWatch, Name: "watch", Longs: []string{"watch"}, Shorts: []byte{'w'}, TakesValue: true},
+ {Key: FlagWatchWatchNonRecursive, Name: "watch-non-recursive", Longs: []string{"watch-non-recursive"}, Shorts: []byte{'W'}, TakesValue: true},
+ {Key: FlagWatchWatchFile, Name: "watch-file", Longs: []string{"watch-file"}, Shorts: []byte{'F'}, TakesValue: true},
+ {Key: FlagWatchClear, Name: "clear", Longs: []string{"clear"}, Shorts: []byte{'c'}, TakesValue: true, ValueOptional: true, DefaultMissing: "clear"},
+ {Key: FlagWatchOnBusyUpdate, Name: "on-busy-update", Longs: []string{"on-busy-update"}, Shorts: []byte{'o'}, TakesValue: true},
+ {Key: FlagWatchRestart, Name: "restart", Longs: []string{"restart"}, Shorts: []byte{'r'}},
+ {Key: FlagWatchSignal, Name: "signal", Longs: []string{"signal"}, Shorts: []byte{'s'}, TakesValue: true},
+ {Key: FlagWatchStopSignal, Name: "stop-signal", Longs: []string{"stop-signal"}, TakesValue: true},
+ {Key: FlagWatchStopTimeout, Name: "stop-timeout", Longs: []string{"stop-timeout"}, TakesValue: true},
+ {Key: FlagWatchMapSignal, Name: "map-signal", Longs: []string{"map-signal"}, TakesValue: true},
+ {Key: FlagWatchDebounce, Name: "debounce", Longs: []string{"debounce"}, Shorts: []byte{'d'}, TakesValue: true},
+ {Key: FlagWatchStdinQuit, Name: "stdin-quit", Longs: []string{"stdin-quit"}},
+ {Key: FlagWatchNoVcsIgnore, Name: "no-vcs-ignore", Longs: []string{"no-vcs-ignore"}},
+ {Key: FlagWatchNoProjectIgnore, Name: "no-project-ignore", Longs: []string{"no-project-ignore"}},
+ {Key: FlagWatchNoGlobalIgnore, Name: "no-global-ignore", Longs: []string{"no-global-ignore"}},
+ {Key: FlagWatchNoDefaultIgnore, Name: "no-default-ignore", Longs: []string{"no-default-ignore"}},
+ {Key: FlagWatchNoDiscoverIgnore, Name: "no-discover-ignore", Longs: []string{"no-discover-ignore"}},
+ {Key: FlagWatchIgnoreNothing, Name: "ignore-nothing", Longs: []string{"ignore-nothing"}},
+ {Key: FlagWatchPostpone, Name: "postpone", Longs: []string{"postpone"}, Shorts: []byte{'p'}},
+ {Key: FlagWatchDelayRun, Name: "delay-run", Longs: []string{"delay-run"}, TakesValue: true},
+ {Key: FlagWatchPoll, Name: "poll", Longs: []string{"poll", "force-poll"}, HiddenLongs: []string{"force-poll"}, TakesValue: true, ValueOptional: true, DefaultMissing: "30s"},
+ {Key: FlagWatchShell, Name: "shell", Longs: []string{"shell"}, TakesValue: true},
+ {Key: FlagWatchN, Name: "n", Shorts: []byte{'n'}},
+ {Key: FlagWatchEmitEventsTo, Name: "emit-events-to", Longs: []string{"emit-events-to"}, TakesValue: true},
+ {Key: FlagWatchOnlyEmitEvents, Name: "only-emit-events", Longs: []string{"only-emit-events"}},
+ {Key: FlagWatchEnv, Name: "env", Longs: []string{"env"}, Shorts: []byte{'E'}, TakesValue: true},
+ {Key: FlagWatchWrapProcess, Name: "wrap-process", Longs: []string{"wrap-process"}, TakesValue: true},
+ {Key: FlagWatchNotify, Name: "notify", Longs: []string{"notify"}, Shorts: []byte{'N'}},
+ {Key: FlagWatchColor, Name: "color", Longs: []string{"color", "colour"}, HiddenLongs: []string{"colour"}, TakesValue: true},
+ {Key: FlagWatchTimings, Name: "timings", Longs: []string{"timings"}},
+ {Key: FlagWatchQuiet, Name: "quiet", Longs: []string{"quiet"}, Shorts: []byte{'q'}},
+ {Key: FlagWatchBell, Name: "bell", Longs: []string{"bell"}},
+ {Key: FlagWatchProjectOrigin, Name: "project-origin", Longs: []string{"project-origin"}, TakesValue: true},
+ {Key: FlagWatchWorkdir, Name: "workdir", Longs: []string{"workdir"}, TakesValue: true},
+ {Key: FlagWatchExts, Name: "exts", Longs: []string{"exts"}, Shorts: []byte{'e'}, TakesValue: true, Delimiter: ','},
+ {Key: FlagWatchFilter, Name: "filter", Longs: []string{"filter"}, Shorts: []byte{'f'}, TakesValue: true},
+ {Key: FlagWatchFilterFile, Name: "filter-file", Longs: []string{"filter-file"}, TakesValue: true, Delimiter: ':'},
+ {Key: FlagWatchFilterProg, Name: "filter-prog", Longs: []string{"filter-prog"}, Shorts: []byte{'J'}, TakesValue: true},
+ {Key: FlagWatchIgnore, Name: "ignore", Longs: []string{"ignore"}, Shorts: []byte{'i'}, TakesValue: true},
+ {Key: FlagWatchIgnoreFile, Name: "ignore-file", Longs: []string{"ignore-file"}, TakesValue: true, Delimiter: ':'},
+ {Key: FlagWatchFsEvents, Name: "fs-events", Longs: []string{"fs-events"}, TakesValue: true, Delimiter: ','},
+ {Key: FlagWatchNoMeta, Name: "no-meta", Longs: []string{"no-meta"}},
+ {Key: FlagWatchPrintEvents, Name: "print-events", Longs: []string{"print-events"}},
+ {Key: FlagWatchManual, Name: "manual", Longs: []string{"manual"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgWatchTask, Name: "TASK", DoubleDash: argv.DoubleDashAutomatic},
+ {Key: ArgWatchArgs, Name: "ARGS", Var: true, DoubleDash: argv.DoubleDashAutomatic},
+ },
+}
+
+// where
+var cmdWhere = &argv.Command{
+ Name: "where",
+ Key: CmdWhere,
+ Args: []*argv.Arg{
+ {Key: ArgWhereToolVersion, Name: "TOOL@VERSION", Required: true},
+ {Key: ArgWhereAsdfVersion, Name: "ASDF_VERSION"},
+ },
+}
+
+// which
+var cmdWhich = &argv.Command{
+ Name: "which",
+ Key: CmdWhich,
+ Flags: []*argv.Flag{
+ {Key: FlagWhichTool, Name: "tool", Longs: []string{"tool"}, Shorts: []byte{'t'}, TakesValue: true},
+ {Key: FlagWhichComplete, Name: "complete", Longs: []string{"complete"}},
+ {Key: FlagWhichPlugin, Name: "plugin", Longs: []string{"plugin"}},
+ {Key: FlagWhichVersion, Name: "version", Longs: []string{"version"}},
+ },
+ Args: []*argv.Arg{
+ {Key: ArgWhichBinName, Name: "BIN_NAME"},
+ },
+}
+
+// Meta is the cold table, read only by the rules that are decided once the
+// last token has been read: required, choices, the env-then-default fallback,
+// the var bounds, and the four that compare one entry against another. A parse
+// never touches it.
+//
+// Indexed by key, so entry Key sits at Meta[Key-1]. A command's slot is empty:
+// commands take keys too, and have no cold half.
+var Meta = argv.Metadata{
+ {},
+ {Key: FlagContinueOnError, Name: "continue-on-error", Flag: true, RequiresIfBoolean: true, Spelling: "--continue-on-error"},
+ {Key: FlagCd, Name: "cd", Flag: true, Spelling: "--cd", ValueName: "DIR"},
+ {Key: FlagEnv, Name: "env", Flag: true, Spelling: "--env", ValueName: "ENV"},
+ {Key: FlagForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force"},
+ {Key: FlagJobs, Name: "jobs", Flag: true, Spelling: "--jobs", ValueName: "JOBS", Env: "MISE_JOBS"},
+ {Key: FlagDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagProfile, Name: "profile", Flag: true, Spelling: "--profile", ValueName: "PROFILE", Conflicts: []uint64{FlagEnv}},
+ {Key: FlagQuiet, Name: "quiet", Flag: true, RequiresIfBoolean: true, Spelling: "--quiet", Overrides: []uint64{FlagSilent, FlagTrace, FlagVerbose, FlagDebug, FlagLogLevel}},
+ {Key: FlagShell, Name: "shell", Flag: true, Spelling: "--shell", ValueName: "SHELL"},
+ {Key: FlagTool, Name: "tool", Flag: true, Spelling: "--tool", ValueName: "TOOL@VERSION", Env: "MISE_QUIET"},
+ {Key: FlagVerbose, Name: "verbose", Flag: true, RequiresIfBoolean: true, Spelling: "--verbose", Overrides: []uint64{FlagQuiet, FlagSilent, FlagTrace, FlagDebug}},
+ {Key: FlagVersion, Name: "version", Flag: true, RequiresIfBoolean: true, Spelling: "--version"},
+ {Key: FlagYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {Key: FlagDebug, Name: "debug", Flag: true, RequiresIfBoolean: true, Spelling: "--debug", Overrides: []uint64{FlagQuiet, FlagTrace, FlagVerbose, FlagSilent, FlagLogLevel}},
+ {Key: FlagLogLevel, Name: "log-level", Flag: true, Spelling: "--log-level", ValueName: "LEVEL", Choices: []string{"trace", "debug", "info", "warning", "error"}, AcceptedChoices: []string{"trace", "debug", "info", "warning", "error"}, Overrides: []uint64{FlagQuiet, FlagTrace, FlagVerbose, FlagSilent, FlagDebug}},
+ {Key: FlagNoConfig, Name: "no-config", Flag: true, RequiresIfBoolean: true, Spelling: "--no-config"},
+ {Key: FlagNoEnv, Name: "no-env", Flag: true, RequiresIfBoolean: true, Spelling: "--no-env"},
+ {Key: FlagNoHooks, Name: "no-hooks", Flag: true, RequiresIfBoolean: true, Spelling: "--no-hooks"},
+ {Key: FlagNoTimings, Name: "no-timings", Flag: true, RequiresIfBoolean: true, Spelling: "--no-timings"},
+ {Key: FlagOutput, Name: "output", Flag: true, Spelling: "--output", ValueName: "OUTPUT"},
+ {Key: FlagRaw, Name: "raw", Flag: true, RequiresIfBoolean: true, Spelling: "--raw"},
+ {Key: FlagLocked, Name: "locked", Flag: true, RequiresIfBoolean: true, Spelling: "--locked"},
+ {Key: FlagSilent, Name: "silent", Flag: true, RequiresIfBoolean: true, Spelling: "--silent", Overrides: []uint64{FlagQuiet, FlagTrace, FlagVerbose, FlagDebug, FlagLogLevel}},
+ {Key: FlagTimings, Name: "timings", Flag: true, RequiresIfBoolean: true, Spelling: "--timings"},
+ {Key: FlagTrace, Name: "trace", Flag: true, RequiresIfBoolean: true, Spelling: "--trace", Overrides: []uint64{FlagQuiet, FlagSilent, FlagVerbose, FlagDebug, FlagLogLevel}},
+ {Key: ArgTask, Name: "TASK"},
+ {Key: ArgTaskArgs, Name: "TASK_ARGS"},
+ {Key: ArgTaskArgsLast, Name: "TASK_ARGS_LAST"},
+ {},
+ {Key: FlagActivateQuiet, Name: "quiet", Flag: true, RequiresIfBoolean: true, Spelling: "--quiet"},
+ {Key: FlagActivateShell, Name: "shell", Flag: true, Spelling: "--shell", ValueName: "SHELL", Choices: []string{"bash", "elvish", "fish", "nu", "xonsh", "zsh", "pwsh"}, AcceptedChoices: []string{"bash", "elvish", "fish", "nu", "xonsh", "zsh", "pwsh"}},
+ {Key: FlagActivateNoHookEnv, Name: "no-hook-env", Flag: true, RequiresIfBoolean: true, Spelling: "--no-hook-env"},
+ {Key: FlagActivateShims, Name: "shims", Flag: true, RequiresIfBoolean: true, Spelling: "--shims"},
+ {Key: FlagActivateStatus, Name: "status", Flag: true, RequiresIfBoolean: true, Spelling: "--status"},
+ {Key: ArgActivateShellType, Name: "SHELL_TYPE", Choices: []string{"bash", "elvish", "fish", "nu", "xonsh", "zsh", "pwsh"}, AcceptedChoices: []string{"bash", "elvish", "fish", "nu", "xonsh", "zsh", "pwsh"}},
+ {},
+ {Key: FlagToolAliasTool, Name: "tool", Flag: true, Spelling: "--tool", ValueName: "TOOL"},
+ {Key: FlagToolAliasNoHeader, Name: "no-header", Flag: true, RequiresIfBoolean: true, Spelling: "--no-header"},
+ {},
+ {Key: ArgToolAliasGetTool, Name: "TOOL", Required: true},
+ {Key: ArgToolAliasGetAlias, Name: "ALIAS", Required: true},
+ {},
+ {Key: FlagToolAliasLsNoHeader, Name: "no-header", Flag: true, RequiresIfBoolean: true, Spelling: "--no-header"},
+ {Key: ArgToolAliasLsTool, Name: "TOOL"},
+ {},
+ {Key: ArgToolAliasSetTool, Name: "TOOL", Required: true},
+ {Key: ArgToolAliasSetAlias, Name: "ALIAS", Required: true},
+ {Key: ArgToolAliasSetValue, Name: "VALUE"},
+ {},
+ {Key: ArgToolAliasUnsetTool, Name: "TOOL", Required: true},
+ {Key: ArgToolAliasUnsetAlias, Name: "ALIAS"},
+ {},
+ {Key: ArgAsdfArgs, Name: "ARGS"},
+ {},
+ {},
+ {},
+ {Key: FlagBinPathsBinNames, Name: "bin-names", Flag: true, RequiresIfBoolean: true, Spelling: "--bin-names"},
+ {Key: FlagBinPathsJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: ArgBinPathsToolVersion, Name: "TOOL@VERSION"},
+ {},
+ {Key: FlagBootstrapDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {Key: FlagBootstrapForceDotfiles, Name: "force-dotfiles", Flag: true, RequiresIfBoolean: true, Spelling: "--force-dotfiles"},
+ {Key: FlagBootstrapOnly, Name: "only", Flag: true, Spelling: "--only", ValueName: "ONLY", Choices: []string{"plugins", "packages", "accounts", "files", "services", "firewall", "compose", "repos", "dotfiles", "mise-shell-activate", "macos-defaults", "macos-launchd-agents", "linux-systemd-units", "user", "tools", "task", "final-hook"}, AcceptedChoices: []string{"plugins", "packages", "accounts", "files", "services", "firewall", "compose", "repos", "dotfiles", "mise-shell-activate", "macos-defaults", "macos-launchd-agents", "linux-systemd-units", "user", "tools", "task", "final-hook", "shell", "defaults", "launchd", "systemd"}, Conflicts: []uint64{FlagBootstrapSkip}},
+ {Key: FlagBootstrapPromptSecrets, Name: "prompt-secrets", Flag: true, RequiresIfBoolean: true, Spelling: "--prompt-secrets"},
+ {Key: FlagBootstrapSkip, Name: "skip", Flag: true, Spelling: "--skip", ValueName: "SKIP", Choices: []string{"plugins", "packages", "accounts", "files", "services", "firewall", "compose", "repos", "dotfiles", "mise-shell-activate", "macos-defaults", "macos-launchd-agents", "linux-systemd-units", "user", "tools", "task", "final-hook"}, AcceptedChoices: []string{"plugins", "packages", "accounts", "files", "services", "firewall", "compose", "repos", "dotfiles", "mise-shell-activate", "macos-defaults", "macos-launchd-agents", "linux-systemd-units", "user", "tools", "task", "final-hook", "shell", "defaults", "launchd", "systemd"}},
+ {Key: FlagBootstrapUpdate, Name: "update", Flag: true, RequiresIfBoolean: true, Spelling: "--update"},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {Key: FlagBootstrapAccountsApplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapAccountsApplyYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {},
+ {Key: FlagBootstrapAccountsStatusJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapAccountsStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {},
+ {},
+ {Key: FlagBootstrapComposeApplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapComposeApplyYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {},
+ {Key: FlagBootstrapComposeStatusJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapComposeStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {},
+ {},
+ {Key: FlagBootstrapDotfilesAddForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force"},
+ {Key: FlagBootstrapDotfilesAddGlobal, Name: "global", Flag: true, RequiresIfBoolean: true, Spelling: "--global", Conflicts: []uint64{FlagBootstrapDotfilesAddLocal, FlagBootstrapDotfilesAddPath}},
+ {Key: FlagBootstrapDotfilesAddLocal, Name: "local", Flag: true, RequiresIfBoolean: true, Spelling: "--local", Conflicts: []uint64{FlagBootstrapDotfilesAddGlobal, FlagBootstrapDotfilesAddPath}},
+ {Key: FlagBootstrapDotfilesAddMode, Name: "mode", Flag: true, Spelling: "--mode", ValueName: "MODE"},
+ {Key: FlagBootstrapDotfilesAddDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapDotfilesAddNoApply, Name: "no-apply", Flag: true, RequiresIfBoolean: true, Spelling: "--no-apply"},
+ {Key: FlagBootstrapDotfilesAddPath, Name: "path", Flag: true, Spelling: "--path", ValueName: "PATH", Conflicts: []uint64{FlagBootstrapDotfilesAddGlobal, FlagBootstrapDotfilesAddLocal}},
+ {Key: FlagBootstrapDotfilesAddSource, Name: "source", Flag: true, Spelling: "--source", ValueName: "PATH"},
+ {Key: FlagBootstrapDotfilesAddYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {Key: ArgBootstrapDotfilesAddTarget, Name: "TARGET", Required: true},
+ {},
+ {Key: FlagBootstrapDotfilesApplyForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force"},
+ {Key: FlagBootstrapDotfilesApplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapDotfilesApplyYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {Key: ArgBootstrapDotfilesApplyTarget, Name: "TARGET"},
+ {},
+ {Key: FlagBootstrapDotfilesEditApply, Name: "apply", Flag: true, RequiresIfBoolean: true, Spelling: "--apply"},
+ {Key: FlagBootstrapDotfilesEditMode, Name: "mode", Flag: true, Spelling: "--mode", ValueName: "MODE"},
+ {Key: FlagBootstrapDotfilesEditSource, Name: "source", Flag: true, Spelling: "--source", ValueName: "PATH"},
+ {Key: FlagBootstrapDotfilesEditYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {Key: ArgBootstrapDotfilesEditTarget, Name: "TARGET", Required: true},
+ {},
+ {Key: FlagBootstrapDotfilesStatusJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapDotfilesStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {Key: ArgBootstrapDotfilesStatusTarget, Name: "TARGET"},
+ {},
+ {Key: FlagBootstrapDotfilesUnapplyForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force"},
+ {Key: FlagBootstrapDotfilesUnapplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapDotfilesUnapplyYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {Key: ArgBootstrapDotfilesUnapplyTarget, Name: "TARGET"},
+ {},
+ {},
+ {Key: FlagBootstrapFilesApplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapFilesApplyYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {Key: FlagBootstrapFilesApplyPromptSecrets, Name: "prompt-secrets", Flag: true, RequiresIfBoolean: true, Spelling: "--prompt-secrets"},
+ {},
+ {Key: FlagBootstrapFilesStatusJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapFilesStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {Key: FlagBootstrapFilesStatusPromptSecrets, Name: "prompt-secrets", Flag: true, RequiresIfBoolean: true, Spelling: "--prompt-secrets"},
+ {},
+ {},
+ {Key: FlagBootstrapFirewallApplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapFirewallApplyYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {},
+ {Key: FlagBootstrapFirewallStatusJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapFirewallStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {},
+ {},
+ {Key: FlagBootstrapLaunchdApplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapLaunchdApplyYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {},
+ {Key: FlagBootstrapLaunchdStatusJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapLaunchdStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {},
+ {},
+ {},
+ {Key: FlagBootstrapLinuxSystemdUnitsApplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapLinuxSystemdUnitsApplyYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {},
+ {Key: FlagBootstrapLinuxSystemdUnitsStatusJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapLinuxSystemdUnitsStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {},
+ {},
+ {},
+ {Key: FlagBootstrapMacosDefaultsApplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapMacosDefaultsApplyYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {},
+ {Key: FlagBootstrapMacosDefaultsStatusJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapMacosDefaultsStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {},
+ {},
+ {Key: FlagBootstrapMacosLaunchdAgentsApplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapMacosLaunchdAgentsApplyYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {},
+ {Key: FlagBootstrapMacosLaunchdAgentsStatusJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapMacosLaunchdAgentsStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {},
+ {},
+ {Key: FlagBootstrapMacosDefaultsApplyDryRun2, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapMacosDefaultsApplyYes2, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {},
+ {Key: FlagBootstrapMacosDefaultsStatusJson2, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapMacosDefaultsStatusMissing2, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {},
+ {},
+ {Key: FlagBootstrapMiseShellActivateApplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapMiseShellActivateApplyYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {},
+ {Key: FlagBootstrapMiseShellActivateStatusJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapMiseShellActivateStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {},
+ {},
+ {Key: FlagBootstrapPackagesApplyManager, Name: "manager", Flag: true, Spelling: "--manager", ValueName: "MANAGER"},
+ {Key: FlagBootstrapPackagesApplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapPackagesApplyYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {Key: FlagBootstrapPackagesApplyUpdate, Name: "update", Flag: true, RequiresIfBoolean: true, Spelling: "--update"},
+ {Key: ArgBootstrapPackagesApplyPackage, Name: "PACKAGE"},
+ {},
+ {},
+ {Key: FlagBootstrapPackagesBrewTapLocal, Name: "local", Flag: true, RequiresIfBoolean: true, Spelling: "--local"},
+ {Key: FlagBootstrapPackagesBrewTapDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapPackagesBrewTapPath, Name: "path", Flag: true, Spelling: "--path", ValueName: "PATH", Conflicts: []uint64{FlagBootstrapPackagesBrewTapLocal}},
+ {Key: ArgBootstrapPackagesBrewTapTap, Name: "TAP", Required: true},
+ {Key: ArgBootstrapPackagesBrewTapUrl, Name: "URL"},
+ {},
+ {Key: FlagBootstrapPackagesBrewUntapLocal, Name: "local", Flag: true, RequiresIfBoolean: true, Spelling: "--local"},
+ {Key: FlagBootstrapPackagesBrewUntapDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapPackagesBrewUntapPath, Name: "path", Flag: true, Spelling: "--path", ValueName: "PATH", Conflicts: []uint64{FlagBootstrapPackagesBrewUntapLocal}},
+ {Key: ArgBootstrapPackagesBrewUntapTaps, Name: "TAPS", Required: true},
+ {},
+ {Key: FlagBootstrapPackagesImportEnv, Name: "env", Flag: true, Spelling: "--env", ValueName: "ENV", Conflicts: []uint64{FlagBootstrapPackagesImportGlobal, FlagBootstrapPackagesImportPath}},
+ {Key: FlagBootstrapPackagesImportGlobal, Name: "global", Flag: true, RequiresIfBoolean: true, Spelling: "--global", Conflicts: []uint64{FlagBootstrapPackagesImportEnv, FlagBootstrapPackagesImportPath}},
+ {Key: FlagBootstrapPackagesImportManager, Name: "manager", Flag: true, Spelling: "--manager", ValueName: "MANAGER", Choices: []string{"brew"}, AcceptedChoices: []string{"brew"}, Default: []string{"brew"}},
+ {Key: FlagBootstrapPackagesImportAll, Name: "all", Flag: true, RequiresIfBoolean: true, Spelling: "--all"},
+ {Key: FlagBootstrapPackagesImportDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapPackagesImportPath, Name: "path", Flag: true, Spelling: "--path", ValueName: "PATH", Conflicts: []uint64{FlagBootstrapPackagesImportGlobal}},
+ {},
+ {Key: FlagBootstrapPackagesPruneManager, Name: "manager", Flag: true, Spelling: "--manager", ValueName: "MANAGER", Choices: []string{"brew", "brew-cask"}, AcceptedChoices: []string{"brew", "brew-cask"}, Default: []string{"brew"}},
+ {Key: FlagBootstrapPackagesPruneDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapPackagesPruneYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {},
+ {Key: FlagBootstrapPackagesStatusJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapPackagesStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {},
+ {Key: FlagBootstrapPackagesUpgradeManager, Name: "manager", Flag: true, Spelling: "--manager", ValueName: "MANAGER"},
+ {Key: FlagBootstrapPackagesUpgradeDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapPackagesUpgradeYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {Key: ArgBootstrapPackagesUpgradePackage, Name: "PACKAGE"},
+ {},
+ {Key: FlagBootstrapPackagesUseEnv, Name: "env", Flag: true, Spelling: "--env", ValueName: "ENV", Conflicts: []uint64{FlagBootstrapPackagesUseGlobal, FlagBootstrapPackagesUsePath}},
+ {Key: FlagBootstrapPackagesUseGlobal, Name: "global", Flag: true, RequiresIfBoolean: true, Spelling: "--global"},
+ {Key: FlagBootstrapPackagesUseDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapPackagesUsePath, Name: "path", Flag: true, Spelling: "--path", ValueName: "PATH", Conflicts: []uint64{FlagBootstrapPackagesUseGlobal}},
+ {Key: FlagBootstrapPackagesUseYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {Key: ArgBootstrapPackagesUsePackage, Name: "PACKAGE", Required: true},
+ {},
+ {Key: FlagBootstrapPlanJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapPlanDetailedExitcode, Name: "detailed-exitcode", Flag: true, RequiresIfBoolean: true, Spelling: "--detailed-exitcode"},
+ {Key: FlagBootstrapPlanPromptSecrets, Name: "prompt-secrets", Flag: true, RequiresIfBoolean: true, Spelling: "--prompt-secrets"},
+ {},
+ {},
+ {Key: FlagBootstrapPluginsApplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {},
+ {Key: FlagBootstrapPluginsStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {},
+ {Key: FlagBootstrapRemoteAll, Name: "all", Flag: true, RequiresIfBoolean: true, Spelling: "--all"},
+ {Key: FlagBootstrapRemoteBootstrapCommand, Name: "bootstrap-command", Flag: true, Spelling: "--bootstrap-command", ValueName: "COMMAND", Conflicts: []uint64{FlagBootstrapRemoteMiseBin, FlagBootstrapRemoteRemoteMise}},
+ {Key: FlagBootstrapRemoteConnectTimeout, Name: "connect-timeout", Flag: true, Spelling: "--connect-timeout", ValueName: "CONNECT_TIMEOUT", Default: []string{"10"}},
+ {Key: FlagBootstrapRemoteCopyLink, Name: "copy-link", Flag: true, Spelling: "--copy-link", ValueName: "PATH"},
+ {Key: FlagBootstrapRemoteCopyLinks, Name: "copy-links", Flag: true, RequiresIfBoolean: true, Spelling: "--copy-links"},
+ {Key: FlagBootstrapRemoteExclude, Name: "exclude", Flag: true, Spelling: "--exclude", ValueName: "PATTERN"},
+ {Key: FlagBootstrapRemoteFailFast, Name: "fail-fast", Flag: true, RequiresIfBoolean: true, Spelling: "--fail-fast"},
+ {Key: FlagBootstrapRemoteForceDotfiles, Name: "force-dotfiles", Flag: true, RequiresIfBoolean: true, Spelling: "--force-dotfiles"},
+ {Key: FlagBootstrapRemoteHost, Name: "host", Flag: true, Spelling: "--host", ValueName: "[USER@]HOST"},
+ {Key: FlagBootstrapRemoteIdentityFile, Name: "identity-file", Flag: true, Spelling: "--identity-file", ValueName: "IDENTITY_FILE"},
+ {Key: FlagBootstrapRemoteDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapRemoteKeepStaging, Name: "keep-staging", Flag: true, RequiresIfBoolean: true, Spelling: "--keep-staging"},
+ {Key: FlagBootstrapRemoteMiseBin, Name: "mise-bin", Flag: true, Spelling: "--mise-bin", ValueName: "MISE_BIN", Conflicts: []uint64{FlagBootstrapRemoteRemoteMise, FlagBootstrapRemoteBootstrapCommand}},
+ {Key: FlagBootstrapRemoteOnly, Name: "only", Flag: true, Spelling: "--only", ValueName: "ONLY", Choices: []string{"plugins", "packages", "accounts", "files", "services", "firewall", "compose", "repos", "dotfiles", "mise-shell-activate", "macos-defaults", "macos-launchd-agents", "linux-systemd-units", "user", "tools", "task", "final-hook"}, AcceptedChoices: []string{"plugins", "packages", "accounts", "files", "services", "firewall", "compose", "repos", "dotfiles", "mise-shell-activate", "macos-defaults", "macos-launchd-agents", "linux-systemd-units", "user", "tools", "task", "final-hook", "shell", "defaults", "launchd", "systemd"}, Conflicts: []uint64{FlagBootstrapRemoteSkip}},
+ {Key: FlagBootstrapRemotePort, Name: "port", Flag: true, Spelling: "--port", ValueName: "PORT"},
+ {Key: FlagBootstrapRemotePromptSecrets, Name: "prompt-secrets", Flag: true, RequiresIfBoolean: true, Spelling: "--prompt-secrets"},
+ {Key: FlagBootstrapRemoteRemoteEnv, Name: "remote-env", Flag: true, Spelling: "--remote-env", ValueName: "ENV"},
+ {Key: FlagBootstrapRemoteRemoteMise, Name: "remote-mise", Flag: true, Spelling: "--remote-mise", ValueName: "COMMAND", Conflicts: []uint64{FlagBootstrapRemoteMiseBin, FlagBootstrapRemoteBootstrapCommand}},
+ {Key: FlagBootstrapRemoteSkip, Name: "skip", Flag: true, Spelling: "--skip", ValueName: "SKIP", Choices: []string{"plugins", "packages", "accounts", "files", "services", "firewall", "compose", "repos", "dotfiles", "mise-shell-activate", "macos-defaults", "macos-launchd-agents", "linux-systemd-units", "user", "tools", "task", "final-hook"}, AcceptedChoices: []string{"plugins", "packages", "accounts", "files", "services", "firewall", "compose", "repos", "dotfiles", "mise-shell-activate", "macos-defaults", "macos-launchd-agents", "linux-systemd-units", "user", "tools", "task", "final-hook", "shell", "defaults", "launchd", "systemd"}},
+ {Key: FlagBootstrapRemoteSource, Name: "source", Flag: true, Spelling: "--source", ValueName: "SOURCE"},
+ {Key: FlagBootstrapRemoteSshOption, Name: "ssh-option", Flag: true, Spelling: "--ssh-option", ValueName: "OPTION"},
+ {Key: FlagBootstrapRemoteTag, Name: "tag", Flag: true, Spelling: "--tag", ValueName: "TAG"},
+ {Key: FlagBootstrapRemoteUpdate, Name: "update", Flag: true, RequiresIfBoolean: true, Spelling: "--update"},
+ {Key: FlagBootstrapRemoteYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {Key: ArgBootstrapRemoteTarget, Name: "TARGET"},
+ {},
+ {},
+ {Key: FlagBootstrapReposApplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapReposApplyYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {},
+ {Key: FlagBootstrapReposExecContinueOnError, Name: "continue-on-error", Flag: true, RequiresIfBoolean: true, Spelling: "--continue-on-error"},
+ {Key: FlagBootstrapReposExecDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: ArgBootstrapReposExecPath, Name: "PATH"},
+ {Key: ArgBootstrapReposExecCommand, Name: "COMMAND", Required: true},
+ {},
+ {Key: FlagBootstrapReposStatusJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapReposStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {},
+ {Key: FlagBootstrapReposUpdateDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapReposUpdateYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {Key: ArgBootstrapReposUpdatePath, Name: "PATH"},
+ {},
+ {},
+ {Key: FlagBootstrapSecretsStatusJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapSecretsStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {},
+ {},
+ {Key: FlagBootstrapServicesApplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapServicesApplyYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {},
+ {Key: FlagBootstrapServicesStatusJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapServicesStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {},
+ {Key: FlagBootstrapStatusJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {Key: FlagBootstrapStatusPromptSecrets, Name: "prompt-secrets", Flag: true, RequiresIfBoolean: true, Spelling: "--prompt-secrets"},
+ {},
+ {},
+ {Key: FlagBootstrapSystemdApplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapSystemdApplyYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {},
+ {Key: FlagBootstrapSystemdStatusJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapSystemdStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {},
+ {},
+ {Key: FlagBootstrapUserApplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagBootstrapUserApplyYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {},
+ {Key: FlagBootstrapUserStatusJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagBootstrapUserStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {},
+ {},
+ {Key: FlagCacheClearOutdate, Name: "outdate", Flag: true, RequiresIfBoolean: true, Spelling: "--outdate"},
+ {Key: FlagCacheClearTask, Name: "task", Flag: true, Spelling: "--task", ValueName: "TASK", Conflicts: []uint64{ArgCacheClearTool, FlagCacheClearOutdate}},
+ {Key: ArgCacheClearTool, Name: "TOOL"},
+ {},
+ {},
+ {Key: FlagCachePruneVerbose, Name: "verbose", Flag: true, RequiresIfBoolean: true, Spelling: "--verbose"},
+ {Key: FlagCachePruneDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: ArgCachePruneTool, Name: "TOOL"},
+ {},
+ {Key: FlagCacheTaskJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: ArgCacheTaskTask, Name: "TASK", Required: true},
+ {},
+ {Key: FlagCompletionShell, Name: "shell", Flag: true, Spelling: "--shell", ValueName: "SHELL"},
+ {Key: FlagCompletionIncludeBashCompletionLib, Name: "include-bash-completion-lib", Flag: true, RequiresIfBoolean: true, Spelling: "--include-bash-completion-lib"},
+ {Key: FlagCompletionUsage, Name: "usage", Flag: true, RequiresIfBoolean: true, Spelling: "--usage"},
+ {Key: ArgCompletionShell, Name: "SHELL", RequiredUnless: []uint64{FlagCompletionShell}},
+ {},
+ {Key: FlagConfigJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagConfigNoHeader, Name: "no-header", Flag: true, RequiresIfBoolean: true, Spelling: "--no-header"},
+ {Key: FlagConfigTrackedConfigs, Name: "tracked-configs", Flag: true, RequiresIfBoolean: true, Spelling: "--tracked-configs"},
+ {},
+ {Key: FlagConfigGetFile, Name: "file", Flag: true, Spelling: "--file", ValueName: "FILE"},
+ {Key: ArgConfigGetKey, Name: "KEY"},
+ {},
+ {Key: FlagConfigLsJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagConfigLsNoHeader, Name: "no-header", Flag: true, RequiresIfBoolean: true, Spelling: "--no-header"},
+ {Key: FlagConfigLsTrackedConfigs, Name: "tracked-configs", Flag: true, RequiresIfBoolean: true, Spelling: "--tracked-configs"},
+ {},
+ {Key: FlagConfigSetFile, Name: "file", Flag: true, Spelling: "--file", ValueName: "FILE"},
+ {Key: FlagConfigSetType, Name: "type", Flag: true, Spelling: "--type", ValueName: "TYPE", Choices: []string{"infer", "string", "integer", "float", "bool", "list", "set"}, AcceptedChoices: []string{"infer", "string", "integer", "float", "bool", "list", "set"}, Default: []string{"infer"}},
+ {Key: ArgConfigSetKey, Name: "KEY", Required: true},
+ {Key: ArgConfigSetValue, Name: "VALUE"},
+ {},
+ {Key: ArgCurrentPlugin, Name: "PLUGIN"},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {Key: FlagDotfilesAddForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force"},
+ {Key: FlagDotfilesAddGlobal, Name: "global", Flag: true, RequiresIfBoolean: true, Spelling: "--global", Conflicts: []uint64{FlagDotfilesAddLocal, FlagDotfilesAddPath}},
+ {Key: FlagDotfilesAddLocal, Name: "local", Flag: true, RequiresIfBoolean: true, Spelling: "--local", Conflicts: []uint64{FlagDotfilesAddGlobal, FlagDotfilesAddPath}},
+ {Key: FlagDotfilesAddMode, Name: "mode", Flag: true, Spelling: "--mode", ValueName: "MODE"},
+ {Key: FlagDotfilesAddDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagDotfilesAddNoApply, Name: "no-apply", Flag: true, RequiresIfBoolean: true, Spelling: "--no-apply"},
+ {Key: FlagDotfilesAddPath, Name: "path", Flag: true, Spelling: "--path", ValueName: "PATH", Conflicts: []uint64{FlagDotfilesAddGlobal, FlagDotfilesAddLocal}},
+ {Key: FlagDotfilesAddSource, Name: "source", Flag: true, Spelling: "--source", ValueName: "PATH"},
+ {Key: FlagDotfilesAddYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {Key: ArgDotfilesAddTarget, Name: "TARGET", Required: true},
+ {},
+ {Key: FlagDotfilesApplyForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force"},
+ {Key: FlagDotfilesApplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagDotfilesApplyYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {Key: ArgDotfilesApplyTarget, Name: "TARGET"},
+ {},
+ {Key: FlagDotfilesEditApply, Name: "apply", Flag: true, RequiresIfBoolean: true, Spelling: "--apply"},
+ {Key: FlagDotfilesEditMode, Name: "mode", Flag: true, Spelling: "--mode", ValueName: "MODE"},
+ {Key: FlagDotfilesEditSource, Name: "source", Flag: true, Spelling: "--source", ValueName: "PATH"},
+ {Key: FlagDotfilesEditYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {Key: ArgDotfilesEditTarget, Name: "TARGET", Required: true},
+ {},
+ {Key: FlagDotfilesStatusJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagDotfilesStatusMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing"},
+ {Key: ArgDotfilesStatusTarget, Name: "TARGET"},
+ {},
+ {Key: FlagDotfilesUnapplyForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force"},
+ {Key: FlagDotfilesUnapplyDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagDotfilesUnapplyYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {Key: ArgDotfilesUnapplyTarget, Name: "TARGET"},
+ {},
+ {Key: FlagDoctorJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {},
+ {Key: FlagDoctorPathFull, Name: "full", Flag: true, RequiresIfBoolean: true, Spelling: "--full"},
+ {},
+ {Key: FlagEnShell, Name: "shell", Flag: true, Spelling: "--shell", ValueName: "SHELL"},
+ {Key: ArgEnDir, Name: "DIR", Default: []string{"."}},
+ {},
+ {Key: FlagEnvDotenv, Name: "dotenv", Flag: true, RequiresIfBoolean: true, Spelling: "--dotenv", Overrides: []uint64{FlagEnvShell}},
+ {Key: FlagEnvJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json", Overrides: []uint64{FlagEnvShell}},
+ {Key: FlagEnvShell, Name: "shell", Flag: true, Spelling: "--shell", ValueName: "SHELL", Overrides: []uint64{FlagEnvJson}},
+ {Key: FlagEnvJsonExtended, Name: "json-extended", Flag: true, RequiresIfBoolean: true, Spelling: "--json-extended", Overrides: []uint64{FlagEnvShell}},
+ {Key: FlagEnvRedacted, Name: "redacted", Flag: true, RequiresIfBoolean: true, Spelling: "--redacted"},
+ {Key: FlagEnvValues, Name: "values", Flag: true, RequiresIfBoolean: true, Spelling: "--values"},
+ {Key: ArgEnvToolVersion, Name: "TOOL@VERSION"},
+ {},
+ {Key: FlagExecCommand, Name: "command", Flag: true, Spelling: "--command", ValueName: "COMMAND", Conflicts: []uint64{ArgExecCommand}},
+ {Key: FlagExecJobs, Name: "jobs", Flag: true, Spelling: "--jobs", ValueName: "JOBS", Env: "MISE_JOBS"},
+ {Key: FlagExecAllowEnv, Name: "allow-env", Flag: true, Spelling: "--allow-env", ValueName: "VAR"},
+ {Key: FlagExecAllowNet, Name: "allow-net", Flag: true, Spelling: "--allow-net", ValueName: "HOST"},
+ {Key: FlagExecAllowRead, Name: "allow-read", Flag: true, Spelling: "--allow-read", ValueName: "PATH"},
+ {Key: FlagExecAllowWrite, Name: "allow-write", Flag: true, Spelling: "--allow-write", ValueName: "PATH"},
+ {Key: FlagExecDenyAll, Name: "deny-all", Flag: true, RequiresIfBoolean: true, Spelling: "--deny-all"},
+ {Key: FlagExecDenyEnv, Name: "deny-env", Flag: true, RequiresIfBoolean: true, Spelling: "--deny-env"},
+ {Key: FlagExecDenyNet, Name: "deny-net", Flag: true, RequiresIfBoolean: true, Spelling: "--deny-net"},
+ {Key: FlagExecDenyRead, Name: "deny-read", Flag: true, RequiresIfBoolean: true, Spelling: "--deny-read"},
+ {Key: FlagExecDenyWrite, Name: "deny-write", Flag: true, RequiresIfBoolean: true, Spelling: "--deny-write"},
+ {Key: FlagExecFreshEnv, Name: "fresh-env", Flag: true, RequiresIfBoolean: true, Spelling: "--fresh-env"},
+ {Key: FlagExecNoDeps, Name: "no-deps", Flag: true, RequiresIfBoolean: true, Spelling: "--no-deps"},
+ {Key: FlagExecRaw, Name: "raw", Flag: true, RequiresIfBoolean: true, Spelling: "--raw", Overrides: []uint64{FlagExecJobs}},
+ {Key: ArgExecToolVersion, Name: "TOOL@VERSION"},
+ {Key: ArgExecCommand, Name: "COMMAND", Conflicts: []uint64{FlagExecCommand}, RequiredUnless: []uint64{FlagExecCommand}},
+ {},
+ {Key: FlagFmtAll, Name: "all", Flag: true, RequiresIfBoolean: true, Spelling: "--all"},
+ {Key: FlagFmtCheck, Name: "check", Flag: true, RequiresIfBoolean: true, Spelling: "--check"},
+ {Key: FlagFmtStdin, Name: "stdin", Flag: true, RequiresIfBoolean: true, Spelling: "--stdin"},
+ {},
+ {},
+ {Key: FlagGenerateBootstrapLocalize, Name: "localize", Flag: true, RequiresIfBoolean: true, Spelling: "--localize"},
+ {Key: FlagGenerateBootstrapVersion, Name: "version", Flag: true, Spelling: "--version", ValueName: "VERSION"},
+ {Key: FlagGenerateBootstrapWrite, Name: "write", Flag: true, Spelling: "--write", ValueName: "WRITE"},
+ {Key: FlagGenerateBootstrapLocalizedDir, Name: "localized-dir", Flag: true, Spelling: "--localized-dir", ValueName: "LOCALIZED_DIR", Default: []string{".mise"}},
+ {Key: FlagGenerateBootstrapWindows, Name: "windows", Flag: true, RequiresIfBoolean: true, Spelling: "--windows", Requires: []uint64{FlagGenerateBootstrapWrite}},
+ {},
+ {Key: FlagGenerateConfigGlobal, Name: "global", Flag: true, RequiresIfBoolean: true, Spelling: "--global", Conflicts: []uint64{ArgGenerateConfigPath}},
+ {Key: FlagGenerateConfigDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagGenerateConfigToolVersions, Name: "tool-versions", Flag: true, Spelling: "--tool-versions", ValueName: "TOOL_VERSIONS"},
+ {Key: ArgGenerateConfigPath, Name: "PATH"},
+ {},
+ {Key: FlagGenerateDevcontainerImage, Name: "image", Flag: true, Spelling: "--image", ValueName: "IMAGE"},
+ {Key: FlagGenerateDevcontainerMountMiseData, Name: "mount-mise-data", Flag: true, RequiresIfBoolean: true, Spelling: "--mount-mise-data"},
+ {Key: FlagGenerateDevcontainerName, Name: "name", Flag: true, Spelling: "--name", ValueName: "NAME"},
+ {Key: FlagGenerateDevcontainerWrite, Name: "write", Flag: true, RequiresIfBoolean: true, Spelling: "--write"},
+ {},
+ {Key: FlagGenerateGitPreCommitTask, Name: "task", Flag: true, Spelling: "--task", ValueName: "TASK", Default: []string{"pre-commit"}},
+ {Key: FlagGenerateGitPreCommitWrite, Name: "write", Flag: true, RequiresIfBoolean: true, Spelling: "--write"},
+ {Key: FlagGenerateGitPreCommitHook, Name: "hook", Flag: true, Spelling: "--hook", ValueName: "HOOK", Default: []string{"pre-commit"}},
+ {Key: ArgGenerateGitPreCommitMiseArg, Name: "MISE_ARG"},
+ {},
+ {Key: FlagGenerateGithubActionTask, Name: "task", Flag: true, Spelling: "--task", ValueName: "TASK", Default: []string{"ci"}},
+ {Key: FlagGenerateGithubActionWrite, Name: "write", Flag: true, RequiresIfBoolean: true, Spelling: "--write"},
+ {Key: FlagGenerateGithubActionName, Name: "name", Flag: true, Spelling: "--name", ValueName: "NAME", Default: []string{"ci"}},
+ {},
+ {Key: FlagGenerateTaskDocsInject, Name: "inject", Flag: true, RequiresIfBoolean: true, Spelling: "--inject"},
+ {Key: FlagGenerateTaskDocsIndex, Name: "index", Flag: true, RequiresIfBoolean: true, Spelling: "--index"},
+ {Key: FlagGenerateTaskDocsMulti, Name: "multi", Flag: true, RequiresIfBoolean: true, Spelling: "--multi"},
+ {Key: FlagGenerateTaskDocsOutput, Name: "output", Flag: true, Spelling: "--output", ValueName: "OUTPUT"},
+ {Key: FlagGenerateTaskDocsRoot, Name: "root", Flag: true, Spelling: "--root", ValueName: "ROOT"},
+ {Key: FlagGenerateTaskDocsStyle, Name: "style", Flag: true, Spelling: "--style", ValueName: "STYLE", Choices: []string{"simple", "detailed"}, AcceptedChoices: []string{"simple", "detailed"}, Default: []string{"simple"}},
+ {},
+ {Key: FlagGenerateTaskStubsDir, Name: "dir", Flag: true, Spelling: "--dir", ValueName: "DIR", Default: []string{"bin"}},
+ {Key: FlagGenerateTaskStubsMiseBin, Name: "mise-bin", Flag: true, Spelling: "--mise-bin", ValueName: "MISE_BIN", Default: []string{"mise"}},
+ {},
+ {Key: FlagGenerateToolStubBin, Name: "bin", Flag: true, Spelling: "--bin", ValueName: "BIN"},
+ {Key: FlagGenerateToolStubBootstrap, Name: "bootstrap", Flag: true, RequiresIfBoolean: true, Spelling: "--bootstrap"},
+ {Key: FlagGenerateToolStubBootstrapVersion, Name: "bootstrap-version", Flag: true, Spelling: "--bootstrap-version", ValueName: "BOOTSTRAP_VERSION", Requires: []uint64{FlagGenerateToolStubBootstrap}},
+ {Key: FlagGenerateToolStubChecksumAlgorithm, Name: "checksum-algorithm", Flag: true, Spelling: "--checksum-algorithm", ValueName: "CHECKSUM_ALGORITHM", Choices: []string{"blake3", "sha256"}, AcceptedChoices: []string{"blake3", "sha256"}, Default: []string{"blake3"}, Conflicts: []uint64{FlagGenerateToolStubLock, FlagGenerateToolStubSkipDownload}},
+ {Key: FlagGenerateToolStubFetch, Name: "fetch", Flag: true, RequiresIfBoolean: true, Spelling: "--fetch", Conflicts: []uint64{FlagGenerateToolStubUrl, FlagGenerateToolStubPlatformUrl, FlagGenerateToolStubVersion, FlagGenerateToolStubBin, FlagGenerateToolStubPlatformBin, FlagGenerateToolStubSkipDownload, FlagGenerateToolStubLock}},
+ {Key: FlagGenerateToolStubHttp, Name: "http", Flag: true, Spelling: "--http", ValueName: "HTTP", Default: []string{"http"}},
+ {Key: FlagGenerateToolStubLock, Name: "lock", Flag: true, RequiresIfBoolean: true, Spelling: "--lock", Conflicts: []uint64{FlagGenerateToolStubUrl, FlagGenerateToolStubPlatformUrl, FlagGenerateToolStubBin, FlagGenerateToolStubPlatformBin, FlagGenerateToolStubFetch, FlagGenerateToolStubSkipDownload}},
+ {Key: FlagGenerateToolStubPlatformBin, Name: "platform-bin", Flag: true, Spelling: "--platform-bin", ValueName: "PLATFORM_BIN"},
+ {Key: FlagGenerateToolStubPlatformUrl, Name: "platform-url", Flag: true, Spelling: "--platform-url", ValueName: "PLATFORM_URL"},
+ {Key: FlagGenerateToolStubSkipDownload, Name: "skip-download", Flag: true, RequiresIfBoolean: true, Spelling: "--skip-download"},
+ {Key: FlagGenerateToolStubUrl, Name: "url", Flag: true, Spelling: "--url", ValueName: "URL"},
+ {Key: FlagGenerateToolStubVersion, Name: "version", Flag: true, Spelling: "--version", ValueName: "VERSION", Default: []string{"latest"}},
+ {Key: ArgGenerateToolStubOutput, Name: "OUTPUT", Required: true},
+ {},
+ {},
+ {Key: FlagGithubTokenOauth, Name: "oauth", Flag: true, RequiresIfBoolean: true, Spelling: "--oauth"},
+ {Key: FlagGithubTokenRaw, Name: "raw", Flag: true, RequiresIfBoolean: true, Spelling: "--raw"},
+ {Key: FlagGithubTokenRefresh, Name: "refresh", Flag: true, RequiresIfBoolean: true, Spelling: "--refresh", Requires: []uint64{FlagGithubTokenOauth}},
+ {Key: FlagGithubTokenUnmask, Name: "unmask", Flag: true, RequiresIfBoolean: true, Spelling: "--unmask"},
+ {Key: ArgGithubTokenHost, Name: "HOST", Default: []string{"github.com"}},
+ {},
+ {Key: FlagGlobalFuzzy, Name: "fuzzy", Flag: true, RequiresIfBoolean: true, Spelling: "--fuzzy", Overrides: []uint64{FlagGlobalPin}},
+ {Key: FlagGlobalPath, Name: "path", Flag: true, RequiresIfBoolean: true, Spelling: "--path"},
+ {Key: FlagGlobalPin, Name: "pin", Flag: true, RequiresIfBoolean: true, Spelling: "--pin", Overrides: []uint64{FlagGlobalFuzzy}},
+ {Key: FlagGlobalRemove, Name: "remove", Flag: true, Spelling: "--remove", ValueName: "TOOL"},
+ {Key: ArgGlobalToolVersion, Name: "TOOL@VERSION"},
+ {},
+ {Key: FlagHookEnvForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force"},
+ {Key: FlagHookEnvQuiet, Name: "quiet", Flag: true, RequiresIfBoolean: true, Spelling: "--quiet"},
+ {Key: FlagHookEnvShell, Name: "shell", Flag: true, Spelling: "--shell", ValueName: "SHELL"},
+ {Key: FlagHookEnvReason, Name: "reason", Flag: true, Spelling: "--reason", ValueName: "REASON", Choices: []string{"precmd", "chpwd"}, AcceptedChoices: []string{"precmd", "chpwd"}},
+ {Key: FlagHookEnvStatus, Name: "status", Flag: true, RequiresIfBoolean: true, Spelling: "--status"},
+ {},
+ {Key: FlagHookNotFoundShell, Name: "shell", Flag: true, Spelling: "--shell", ValueName: "SHELL"},
+ {Key: ArgHookNotFoundBin, Name: "BIN", Required: true},
+ {},
+ {Key: FlagImplodeDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagImplodeConfig, Name: "config", Flag: true, RequiresIfBoolean: true, Spelling: "--config"},
+ {},
+ {Key: FlagEditGlobal, Name: "global", Flag: true, RequiresIfBoolean: true, Spelling: "--global", Conflicts: []uint64{ArgEditPath}},
+ {Key: FlagEditDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagEditToolVersions, Name: "tool-versions", Flag: true, Spelling: "--tool-versions", ValueName: "TOOL_VERSIONS"},
+ {Key: ArgEditPath, Name: "PATH"},
+ {},
+ {Key: FlagInstallForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force"},
+ {Key: FlagInstallJobs, Name: "jobs", Flag: true, Spelling: "--jobs", ValueName: "JOBS", Env: "MISE_JOBS"},
+ {Key: FlagInstallDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagInstallVerbose, Name: "verbose", Flag: true, RequiresIfBoolean: true, Spelling: "--verbose"},
+ {Key: FlagInstallDryRunCode, Name: "dry-run-code", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run-code"},
+ {Key: FlagInstallIncludeTaskTools, Name: "include-task-tools", Flag: true, RequiresIfBoolean: true, Spelling: "--include-task-tools"},
+ {Key: FlagInstallMinimumReleaseAge, Name: "minimum-release-age", Flag: true, Spelling: "--minimum-release-age", ValueName: "MINIMUM_RELEASE_AGE"},
+ {Key: FlagInstallMonorepo, Name: "monorepo", Flag: true, RequiresIfBoolean: true, Spelling: "--monorepo", Env: "MISE_MONOREPO"},
+ {Key: FlagInstallRaw, Name: "raw", Flag: true, RequiresIfBoolean: true, Spelling: "--raw", Overrides: []uint64{FlagInstallJobs}},
+ {Key: FlagInstallShared, Name: "shared", Flag: true, Spelling: "--shared", ValueName: "SHARED", Conflicts: []uint64{FlagInstallSystem}},
+ {Key: FlagInstallSystem, Name: "system", Flag: true, RequiresIfBoolean: true, Spelling: "--system", Conflicts: []uint64{FlagInstallShared}},
+ {Key: ArgInstallToolVersion, Name: "TOOL@VERSION"},
+ {},
+ {Key: ArgInstallIntoToolVersion, Name: "TOOL@VERSION", Required: true},
+ {Key: ArgInstallIntoPath, Name: "PATH", Required: true},
+ {},
+ {Key: FlagLatestInstalled, Name: "installed", Flag: true, RequiresIfBoolean: true, Spelling: "--installed"},
+ {Key: FlagLatestMinimumReleaseAge, Name: "minimum-release-age", Flag: true, Spelling: "--minimum-release-age", ValueName: "MINIMUM_RELEASE_AGE", Conflicts: []uint64{FlagLatestInstalled}},
+ {Key: ArgLatestToolVersion, Name: "TOOL@VERSION", Required: true},
+ {Key: ArgLatestAsdfVersion, Name: "ASDF_VERSION"},
+ {},
+ {Key: FlagLinkForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force"},
+ {Key: ArgLinkToolVersion, Name: "TOOL@VERSION", Required: true},
+ {Key: ArgLinkPath, Name: "PATH", Required: true},
+ {},
+ {Key: FlagLocalParent, Name: "parent", Flag: true, RequiresIfBoolean: true, Spelling: "--parent"},
+ {Key: FlagLocalFuzzy, Name: "fuzzy", Flag: true, RequiresIfBoolean: true, Spelling: "--fuzzy", Overrides: []uint64{FlagLocalPin}},
+ {Key: FlagLocalPath, Name: "path", Flag: true, RequiresIfBoolean: true, Spelling: "--path"},
+ {Key: FlagLocalPin, Name: "pin", Flag: true, RequiresIfBoolean: true, Spelling: "--pin", Overrides: []uint64{FlagLocalFuzzy}},
+ {Key: FlagLocalRemove, Name: "remove", Flag: true, Spelling: "--remove", ValueName: "TOOL"},
+ {Key: ArgLocalToolVersion, Name: "TOOL@VERSION"},
+ {},
+ {Key: FlagLockGlobal, Name: "global", Flag: true, RequiresIfBoolean: true, Spelling: "--global"},
+ {Key: FlagLockJobs, Name: "jobs", Flag: true, Spelling: "--jobs", ValueName: "JOBS", Env: "MISE_JOBS"},
+ {Key: FlagLockDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagLockPlatform, Name: "platform", Flag: true, Spelling: "--platform", ValueName: "PLATFORM"},
+ {Key: FlagLockBump, Name: "bump", Flag: true, RequiresIfBoolean: true, Spelling: "--bump"},
+ {Key: FlagLockJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagLockLocal, Name: "local", Flag: true, RequiresIfBoolean: true, Spelling: "--local"},
+ {Key: FlagLockMinimumReleaseAge, Name: "minimum-release-age", Flag: true, Spelling: "--minimum-release-age", ValueName: "MINIMUM_RELEASE_AGE"},
+ {Key: ArgLockTool, Name: "TOOL"},
+ {},
+ {Key: FlagLsCurrent, Name: "current", Flag: true, RequiresIfBoolean: true, Spelling: "--current"},
+ {Key: FlagLsGlobal, Name: "global", Flag: true, RequiresIfBoolean: true, Spelling: "--global", Conflicts: []uint64{FlagLsLocal}},
+ {Key: FlagLsInstalled, Name: "installed", Flag: true, RequiresIfBoolean: true, Spelling: "--installed"},
+ {Key: FlagLsJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagLsLocal, Name: "local", Flag: true, RequiresIfBoolean: true, Spelling: "--local", Conflicts: []uint64{FlagLsGlobal}},
+ {Key: FlagLsMissing, Name: "missing", Flag: true, RequiresIfBoolean: true, Spelling: "--missing", Conflicts: []uint64{FlagLsInstalled}},
+ {Key: FlagLsOffline, Name: "offline", Flag: true, RequiresIfBoolean: true, Spelling: "--offline"},
+ {Key: FlagLsPlugin, Name: "plugin", Flag: true, Spelling: "--plugin", ValueName: "PLUGIN"},
+ {Key: FlagLsAllSources, Name: "all-sources", Flag: true, RequiresIfBoolean: true, Spelling: "--all-sources", Conflicts: []uint64{FlagLsCurrent, FlagLsGlobal, FlagLsLocal, FlagLsPrunable}},
+ {Key: FlagLsMonorepo, Name: "monorepo", Flag: true, RequiresIfBoolean: true, Spelling: "--monorepo", Env: "MISE_MONOREPO", Conflicts: []uint64{FlagLsAllSources, FlagLsPrunable}},
+ {Key: FlagLsNoHeader, Name: "no-header", Flag: true, RequiresIfBoolean: true, Spelling: "--no-header", Conflicts: []uint64{FlagLsJson}},
+ {Key: FlagLsOutdated, Name: "outdated", Flag: true, RequiresIfBoolean: true, Spelling: "--outdated"},
+ {Key: FlagLsPrefix, Name: "prefix", Flag: true, Spelling: "--prefix", ValueName: "PREFIX", Requires: []uint64{ArgLsInstalledTool}},
+ {Key: FlagLsPrunable, Name: "prunable", Flag: true, RequiresIfBoolean: true, Spelling: "--prunable"},
+ {Key: ArgLsInstalledTool, Name: "INSTALLED_TOOL", Conflicts: []uint64{FlagLsPlugin}},
+ {},
+ {Key: FlagLsRemoteAll, Name: "all", Flag: true, RequiresIfBoolean: true, Spelling: "--all", Conflicts: []uint64{ArgLsRemoteToolVersion, ArgLsRemotePrefix}},
+ {Key: FlagLsRemoteMinimumReleaseAge, Name: "minimum-release-age", Flag: true, Spelling: "--minimum-release-age", ValueName: "MINIMUM_RELEASE_AGE"},
+ {Key: FlagLsRemoteJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagLsRemoteNoVersionsHost, Name: "no-versions-host", Flag: true, RequiresIfBoolean: true, Spelling: "--no-versions-host"},
+ {Key: FlagLsRemotePrerelease, Name: "prerelease", Flag: true, RequiresIfBoolean: true, Spelling: "--prerelease"},
+ {Key: FlagLsRemoteStrictMetadata, Name: "strict-metadata", Flag: true, RequiresIfBoolean: true, Spelling: "--strict-metadata", Requires: []uint64{FlagLsRemoteJson, FlagLsRemoteNoVersionsHost}},
+ {Key: ArgLsRemoteToolVersion, Name: "TOOL@VERSION", RequiredUnless: []uint64{FlagLsRemoteAll}},
+ {Key: ArgLsRemotePrefix, Name: "PREFIX"},
+ {},
+ {},
+ {},
+ {Key: FlagOciBuildCopy, Name: "copy", Flag: true, Spelling: "--copy", ValueName: "HOST_PATH:IMAGE_PATH"},
+ {Key: FlagOciBuildOutput, Name: "output", Flag: true, Spelling: "--output", ValueName: "OUTPUT", Default: []string{"./mise-oci"}},
+ {Key: FlagOciBuildFrom, Name: "from", Flag: true, Spelling: "--from", ValueName: "FROM"},
+ {Key: FlagOciBuildIncludeGlobal, Name: "include-global", Flag: true, RequiresIfBoolean: true, Spelling: "--include-global"},
+ {Key: FlagOciBuildTag, Name: "tag", Flag: true, Spelling: "--tag", ValueName: "TAG"},
+ {Key: FlagOciBuildMountPoint, Name: "mount-point", Flag: true, Spelling: "--mount-point", ValueName: "MOUNT_POINT"},
+ {Key: FlagOciBuildNoMise, Name: "no-mise", Flag: true, RequiresIfBoolean: true, Spelling: "--no-mise"},
+ {Key: FlagOciBuildOwner, Name: "owner", Flag: true, Spelling: "--owner", ValueName: "UID[:GID]"},
+ {},
+ {Key: FlagOciPushCacheFrom, Name: "cache-from", Flag: true, Spelling: "--cache-from", ValueName: "REF", Conflicts: []uint64{FlagOciPushNoCache, FlagOciPushImageDir}},
+ {Key: FlagOciPushFrom, Name: "from", Flag: true, Spelling: "--from", ValueName: "FROM"},
+ {Key: FlagOciPushImageDir, Name: "image-dir", Flag: true, Spelling: "--image-dir", ValueName: "IMAGE_DIR", Conflicts: []uint64{FlagOciPushFrom, FlagOciPushMountPoint, FlagOciPushNoMise, FlagOciPushOwner, FlagOciPushIncludeGlobal}},
+ {Key: FlagOciPushIncludeGlobal, Name: "include-global", Flag: true, RequiresIfBoolean: true, Spelling: "--include-global"},
+ {Key: FlagOciPushMountPoint, Name: "mount-point", Flag: true, Spelling: "--mount-point", ValueName: "MOUNT_POINT"},
+ {Key: FlagOciPushNoCache, Name: "no-cache", Flag: true, RequiresIfBoolean: true, Spelling: "--no-cache"},
+ {Key: FlagOciPushNoMise, Name: "no-mise", Flag: true, RequiresIfBoolean: true, Spelling: "--no-mise"},
+ {Key: FlagOciPushOwner, Name: "owner", Flag: true, Spelling: "--owner", ValueName: "UID[:GID]"},
+ {Key: FlagOciPushUpdateIndex, Name: "update-index", Flag: true, RequiresIfBoolean: true, Spelling: "--update-index"},
+ {Key: ArgOciPushRef, Name: "REF", Required: true},
+ {},
+ {Key: FlagOciRunEngine, Name: "engine", Flag: true, Spelling: "--engine", ValueName: "ENGINE", Choices: []string{"auto", "podman", "docker"}, AcceptedChoices: []string{"auto", "podman", "docker"}, Default: []string{"auto"}},
+ {Key: FlagOciRunFrom, Name: "from", Flag: true, Spelling: "--from", ValueName: "FROM"},
+ {Key: FlagOciRunImageDir, Name: "image-dir", Flag: true, Spelling: "--image-dir", ValueName: "IMAGE_DIR", Conflicts: []uint64{FlagOciRunFrom, FlagOciRunMountPoint, FlagOciRunNoMise, FlagOciRunOwner, FlagOciRunIncludeGlobal}},
+ {Key: FlagOciRunIncludeGlobal, Name: "include-global", Flag: true, RequiresIfBoolean: true, Spelling: "--include-global"},
+ {Key: FlagOciRunKeep, Name: "keep", Flag: true, RequiresIfBoolean: true, Spelling: "--keep"},
+ {Key: FlagOciRunMountPoint, Name: "mount-point", Flag: true, Spelling: "--mount-point", ValueName: "MOUNT_POINT"},
+ {Key: FlagOciRunNoMise, Name: "no-mise", Flag: true, RequiresIfBoolean: true, Spelling: "--no-mise"},
+ {Key: FlagOciRunOwner, Name: "owner", Flag: true, Spelling: "--owner", ValueName: "UID[:GID]"},
+ {Key: FlagOciRunVolume, Name: "volume", Flag: true, Spelling: "--volume", ValueName: "HOST:CONTAINER"},
+ {Key: FlagOciRunEnv, Name: "env", Flag: true, Spelling: "--env", ValueName: "KEY=VAL"},
+ {Key: FlagOciRunInteractive, Name: "interactive", Flag: true, RequiresIfBoolean: true, Spelling: "--interactive"},
+ {Key: FlagOciRunTty, Name: "tty", Flag: true, RequiresIfBoolean: true, Spelling: "--tty"},
+ {Key: FlagOciRunWorkdir, Name: "workdir", Flag: true, Spelling: "--workdir", ValueName: "WORKDIR"},
+ {Key: ArgOciRunCmd, Name: "CMD"},
+ {},
+ {Key: FlagOutdatedBump, Name: "bump", Flag: true, RequiresIfBoolean: true, Spelling: "--bump"},
+ {Key: FlagOutdatedJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagOutdatedL, Name: "l", Flag: true, RequiresIfBoolean: true, Spelling: "-l"},
+ {Key: FlagOutdatedInactive, Name: "inactive", Flag: true, RequiresIfBoolean: true, Spelling: "--inactive", Conflicts: []uint64{FlagOutdatedLocal}},
+ {Key: FlagOutdatedLocal, Name: "local", Flag: true, RequiresIfBoolean: true, Spelling: "--local"},
+ {Key: FlagOutdatedMonorepo, Name: "monorepo", Flag: true, RequiresIfBoolean: true, Spelling: "--monorepo"},
+ {Key: FlagOutdatedNoHeader, Name: "no-header", Flag: true, RequiresIfBoolean: true, Spelling: "--no-header"},
+ {Key: ArgOutdatedToolVersion, Name: "TOOL@VERSION"},
+ {},
+ {Key: FlagPatronsJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagPatronsRefresh, Name: "refresh", Flag: true, RequiresIfBoolean: true, Spelling: "--refresh"},
+ {},
+ {Key: FlagPluginsAll, Name: "all", Flag: true, RequiresIfBoolean: true, Spelling: "--all"},
+ {Key: FlagPluginsCore, Name: "core", Flag: true, RequiresIfBoolean: true, Spelling: "--core", Conflicts: []uint64{FlagPluginsAll}},
+ {Key: FlagPluginsUrls, Name: "urls", Flag: true, RequiresIfBoolean: true, Spelling: "--urls"},
+ {Key: FlagPluginsRefs, Name: "refs", Flag: true, RequiresIfBoolean: true, Spelling: "--refs"},
+ {Key: FlagPluginsUser, Name: "user", Flag: true, RequiresIfBoolean: true, Spelling: "--user", Conflicts: []uint64{FlagPluginsAll}},
+ {},
+ {Key: FlagPluginsInstallAll, Name: "all", Flag: true, RequiresIfBoolean: true, Spelling: "--all", Conflicts: []uint64{ArgPluginsInstallNewPlugin, FlagPluginsInstallForce}},
+ {Key: FlagPluginsInstallForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force"},
+ {Key: FlagPluginsInstallJobs, Name: "jobs", Flag: true, Spelling: "--jobs", ValueName: "JOBS"},
+ {Key: FlagPluginsInstallVerbose, Name: "verbose", Flag: true, RequiresIfBoolean: true, Spelling: "--verbose"},
+ {Key: ArgPluginsInstallNewPlugin, Name: "NEW_PLUGIN", RequiredUnless: []uint64{FlagPluginsInstallAll}},
+ {Key: ArgPluginsInstallGitUrl, Name: "GIT_URL"},
+ {Key: ArgPluginsInstallRest, Name: "REST"},
+ {},
+ {Key: FlagPluginsLinkForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force"},
+ {Key: ArgPluginsLinkName, Name: "NAME", Required: true},
+ {Key: ArgPluginsLinkDir, Name: "DIR"},
+ {},
+ {Key: FlagPluginsLsAll, Name: "all", Flag: true, RequiresIfBoolean: true, Spelling: "--all"},
+ {Key: FlagPluginsLsCore, Name: "core", Flag: true, RequiresIfBoolean: true, Spelling: "--core", Conflicts: []uint64{FlagPluginsLsAll}},
+ {Key: FlagPluginsLsOutdated, Name: "outdated", Flag: true, RequiresIfBoolean: true, Spelling: "--outdated"},
+ {Key: FlagPluginsLsUrls, Name: "urls", Flag: true, RequiresIfBoolean: true, Spelling: "--urls"},
+ {Key: FlagPluginsLsRefs, Name: "refs", Flag: true, RequiresIfBoolean: true, Spelling: "--refs"},
+ {Key: FlagPluginsLsUser, Name: "user", Flag: true, RequiresIfBoolean: true, Spelling: "--user", Conflicts: []uint64{FlagPluginsLsAll}},
+ {},
+ {Key: FlagPluginsLsRemoteUrls, Name: "urls", Flag: true, RequiresIfBoolean: true, Spelling: "--urls"},
+ {Key: FlagPluginsLsRemoteOnlyNames, Name: "only-names", Flag: true, RequiresIfBoolean: true, Spelling: "--only-names"},
+ {},
+ {Key: FlagPluginsUninstallAll, Name: "all", Flag: true, RequiresIfBoolean: true, Spelling: "--all", Conflicts: []uint64{ArgPluginsUninstallPlugin}},
+ {Key: FlagPluginsUninstallPurge, Name: "purge", Flag: true, RequiresIfBoolean: true, Spelling: "--purge"},
+ {Key: ArgPluginsUninstallPlugin, Name: "PLUGIN"},
+ {},
+ {Key: FlagPluginsUpdateJobs, Name: "jobs", Flag: true, Spelling: "--jobs", ValueName: "JOBS"},
+ {Key: ArgPluginsUpdatePlugin, Name: "PLUGIN"},
+ {},
+ {Key: FlagDepsExplain, Name: "explain", Flag: true, RequiresIfBoolean: true, Spelling: "--explain"},
+ {Key: FlagDepsForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force"},
+ {Key: FlagDepsDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagDepsList, Name: "list", Flag: true, RequiresIfBoolean: true, Spelling: "--list"},
+ {Key: FlagDepsMonorepo, Name: "monorepo", Flag: true, RequiresIfBoolean: true, Spelling: "--monorepo", Env: "MISE_MONOREPO"},
+ {Key: FlagDepsOnly, Name: "only", Flag: true, Spelling: "--only", ValueName: "ONLY"},
+ {Key: FlagDepsSkip, Name: "skip", Flag: true, Spelling: "--skip", ValueName: "SKIP"},
+ {Key: ArgDepsProvider, Name: "PROVIDER"},
+ {},
+ {Key: FlagDepsAddDev, Name: "dev", Flag: true, RequiresIfBoolean: true, Spelling: "--dev"},
+ {Key: ArgDepsAddPackages, Name: "PACKAGES", Required: true},
+ {},
+ {Key: FlagDepsInstallExplain, Name: "explain", Flag: true, RequiresIfBoolean: true, Spelling: "--explain"},
+ {Key: FlagDepsInstallForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force"},
+ {Key: FlagDepsInstallDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagDepsInstallList, Name: "list", Flag: true, RequiresIfBoolean: true, Spelling: "--list"},
+ {Key: FlagDepsInstallMonorepo, Name: "monorepo", Flag: true, RequiresIfBoolean: true, Spelling: "--monorepo", Env: "MISE_MONOREPO"},
+ {Key: FlagDepsInstallOnly, Name: "only", Flag: true, Spelling: "--only", ValueName: "ONLY"},
+ {Key: FlagDepsInstallSkip, Name: "skip", Flag: true, Spelling: "--skip", ValueName: "SKIP"},
+ {Key: ArgDepsInstallProvider, Name: "PROVIDER"},
+ {},
+ {Key: ArgDepsRemovePackages, Name: "PACKAGES", Required: true},
+ {},
+ {Key: FlagPruneDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagPruneConfigs, Name: "configs", Flag: true, RequiresIfBoolean: true, Spelling: "--configs"},
+ {Key: FlagPruneDryRunCode, Name: "dry-run-code", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run-code"},
+ {Key: FlagPruneMonorepo, Name: "monorepo", Flag: true, RequiresIfBoolean: true, Spelling: "--monorepo"},
+ {Key: FlagPruneTools, Name: "tools", Flag: true, RequiresIfBoolean: true, Spelling: "--tools"},
+ {Key: ArgPruneInstalledTool, Name: "INSTALLED_TOOL"},
+ {},
+ {Key: FlagRegistryBackend, Name: "backend", Flag: true, Spelling: "--backend", ValueName: "BACKEND"},
+ {Key: FlagRegistryComplete, Name: "complete", Flag: true, RequiresIfBoolean: true, Spelling: "--complete"},
+ {Key: FlagRegistryHideAliased, Name: "hide-aliased", Flag: true, RequiresIfBoolean: true, Spelling: "--hide-aliased"},
+ {Key: FlagRegistryJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagRegistrySecurity, Name: "security", Flag: true, RequiresIfBoolean: true, Spelling: "--security", Requires: []uint64{FlagRegistryJson}},
+ {Key: ArgRegistryName, Name: "NAME"},
+ {},
+ {},
+ {Key: FlagReshimForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force"},
+ {Key: ArgReshimTool, Name: "TOOL"},
+ {Key: ArgReshimVersion, Name: "VERSION"},
+ {},
+ {Key: FlagRunAffected, Name: "affected", Flag: true, RequiresIfBoolean: true, Spelling: "--affected"},
+ {Key: FlagRunAffectedBase, Name: "affected-base", Flag: true, Spelling: "--affected-base", ValueName: "REV", Requires: []uint64{FlagRunAffected}},
+ {Key: FlagRunAffectedExplain, Name: "affected-explain", Flag: true, RequiresIfBoolean: true, Spelling: "--affected-explain", Conflicts: []uint64{FlagRunAffectedJson}, Requires: []uint64{FlagRunAffected}},
+ {Key: FlagRunAffectedHead, Name: "affected-head", Flag: true, Spelling: "--affected-head", ValueName: "REV", Requires: []uint64{FlagRunAffected}},
+ {Key: FlagRunAffectedJson, Name: "affected-json", Flag: true, RequiresIfBoolean: true, Spelling: "--affected-json", Conflicts: []uint64{FlagRunAffectedExplain}, Requires: []uint64{FlagRunAffected}},
+ {Key: FlagRunAll, Name: "all", Flag: true, RequiresIfBoolean: true, Spelling: "--all", Conflicts: []uint64{FlagRunAffected}},
+ {Key: FlagRunContinueOnError, Name: "continue-on-error", Flag: true, RequiresIfBoolean: true, Spelling: "--continue-on-error"},
+ {Key: FlagRunCd, Name: "cd", Flag: true, Spelling: "--cd", ValueName: "CD"},
+ {Key: FlagRunForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force"},
+ {Key: FlagRunJobs, Name: "jobs", Flag: true, Spelling: "--jobs", ValueName: "JOBS", Env: "MISE_JOBS"},
+ {Key: FlagRunDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagRunOutput, Name: "output", Flag: true, Spelling: "--output", ValueName: "OUTPUT", Env: "MISE_TASK_OUTPUT"},
+ {Key: FlagRunQuiet, Name: "quiet", Flag: true, RequiresIfBoolean: true, Spelling: "--quiet", Env: "MISE_QUIET"},
+ {Key: FlagRunRaw, Name: "raw", Flag: true, RequiresIfBoolean: true, Spelling: "--raw"},
+ {Key: FlagRunShell, Name: "shell", Flag: true, Spelling: "--shell", ValueName: "SHELL"},
+ {Key: FlagRunSilent, Name: "silent", Flag: true, RequiresIfBoolean: true, Spelling: "--silent", Env: "MISE_SILENT"},
+ {Key: FlagRunTool, Name: "tool", Flag: true, Spelling: "--tool", ValueName: "TOOL@VERSION"},
+ {Key: FlagRunAllowEnv, Name: "allow-env", Flag: true, Spelling: "--allow-env", ValueName: "VAR"},
+ {Key: FlagRunAllowNet, Name: "allow-net", Flag: true, Spelling: "--allow-net", ValueName: "HOST"},
+ {Key: FlagRunAllowRead, Name: "allow-read", Flag: true, Spelling: "--allow-read", ValueName: "PATH"},
+ {Key: FlagRunAllowWrite, Name: "allow-write", Flag: true, Spelling: "--allow-write", ValueName: "PATH"},
+ {Key: FlagRunDenyAll, Name: "deny-all", Flag: true, RequiresIfBoolean: true, Spelling: "--deny-all"},
+ {Key: FlagRunDenyEnv, Name: "deny-env", Flag: true, RequiresIfBoolean: true, Spelling: "--deny-env"},
+ {Key: FlagRunDenyNet, Name: "deny-net", Flag: true, RequiresIfBoolean: true, Spelling: "--deny-net"},
+ {Key: FlagRunDenyRead, Name: "deny-read", Flag: true, RequiresIfBoolean: true, Spelling: "--deny-read"},
+ {Key: FlagRunDenyWrite, Name: "deny-write", Flag: true, RequiresIfBoolean: true, Spelling: "--deny-write"},
+ {Key: FlagRunFreshEnv, Name: "fresh-env", Flag: true, RequiresIfBoolean: true, Spelling: "--fresh-env"},
+ {Key: FlagRunNoCache, Name: "no-cache", Flag: true, RequiresIfBoolean: true, Spelling: "--no-cache", Env: "MISE_TASK_REMOTE_NO_CACHE"},
+ {Key: FlagRunNoDeps, Name: "no-deps", Flag: true, RequiresIfBoolean: true, Spelling: "--no-deps"},
+ {Key: FlagRunNoTimings, Name: "no-timings", Flag: true, RequiresIfBoolean: true, Spelling: "--no-timings"},
+ {Key: FlagRunSkipDeps, Name: "skip-deps", Flag: true, RequiresIfBoolean: true, Spelling: "--skip-deps", Env: "MISE_TASK_SKIP_DEPENDS"},
+ {Key: FlagRunSkipTools, Name: "skip-tools", Flag: true, RequiresIfBoolean: true, Spelling: "--skip-tools"},
+ {Key: FlagRunTaskCache, Name: "task-cache", Flag: true, Spelling: "--task-cache", ValueName: "TASK_CACHE", Choices: []string{"read-write", "read-only", "write-only", "off", "local-only"}, AcceptedChoices: []string{"read-write", "read-only", "write-only", "off", "local-only"}, Default: []string{"read-write"}, Env: "MISE_TASK_CACHE"},
+ {Key: FlagRunTaskCacheExplain, Name: "task-cache-explain", Flag: true, RequiresIfBoolean: true, Spelling: "--task-cache-explain"},
+ {Key: FlagRunTaskCacheExplainJson, Name: "task-cache-explain-json", Flag: true, RequiresIfBoolean: true, Spelling: "--task-cache-explain-json", Conflicts: []uint64{FlagRunTaskCacheExplain}, Requires: []uint64{FlagRunDryRun}},
+ {Key: FlagRunTaskCacheStats, Name: "task-cache-stats", Flag: true, RequiresIfBoolean: true, Spelling: "--task-cache-stats", Conflicts: []uint64{FlagRunDryRun}},
+ {Key: FlagRunTimeout, Name: "timeout", Flag: true, Spelling: "--timeout", ValueName: "TIMEOUT"},
+ {Key: FlagRunTimings, Name: "timings", Flag: true, RequiresIfBoolean: true, Spelling: "--timings"},
+ {},
+ {Key: FlagSearchInteractive, Name: "interactive", Flag: true, RequiresIfBoolean: true, Spelling: "--interactive", Conflicts: []uint64{FlagSearchMatchType, FlagSearchNoHeader}},
+ {Key: FlagSearchMatchType, Name: "match-type", Flag: true, Spelling: "--match-type", ValueName: "MATCH_TYPE", Choices: []string{"equal", "contains", "fuzzy"}, AcceptedChoices: []string{"equal", "contains", "fuzzy"}, Default: []string{"fuzzy"}},
+ {Key: FlagSearchNoHeader, Name: "no-header", Flag: true, RequiresIfBoolean: true, Spelling: "--no-header"},
+ {Key: ArgSearchName, Name: "NAME"},
+ {},
+ {Key: FlagSelfUpdateForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force"},
+ {Key: FlagSelfUpdateYes, Name: "yes", Flag: true, RequiresIfBoolean: true, Spelling: "--yes"},
+ {Key: FlagSelfUpdateNoPlugins, Name: "no-plugins", Flag: true, RequiresIfBoolean: true, Spelling: "--no-plugins"},
+ {Key: ArgSelfUpdateVersion, Name: "VERSION"},
+ {},
+ {Key: FlagSetEnv, Name: "env", Flag: true, Spelling: "--env", ValueName: "ENV", Overrides: []uint64{FlagSetGlobal, FlagSetFile}},
+ {Key: FlagSetGlobal, Name: "global", Flag: true, RequiresIfBoolean: true, Spelling: "--global", Overrides: []uint64{FlagSetFile, FlagSetEnv}},
+ {Key: FlagSetAgeEncrypt, Name: "age-encrypt", Flag: true, RequiresIfBoolean: true, Spelling: "--age-encrypt", Requires: []uint64{ArgSetEnvVar}},
+ {Key: FlagSetAgeKeyFile, Name: "age-key-file", Flag: true, Spelling: "--age-key-file", ValueName: "PATH", Requires: []uint64{FlagSetAgeEncrypt}},
+ {Key: FlagSetAgeRecipient, Name: "age-recipient", Flag: true, Spelling: "--age-recipient", ValueName: "RECIPIENT", Requires: []uint64{FlagSetAgeEncrypt}},
+ {Key: FlagSetAgeSshRecipient, Name: "age-ssh-recipient", Flag: true, Spelling: "--age-ssh-recipient", ValueName: "PATH_OR_PUBKEY", Requires: []uint64{FlagSetAgeEncrypt}},
+ {Key: FlagSetComplete, Name: "complete", Flag: true, RequiresIfBoolean: true, Spelling: "--complete"},
+ {Key: FlagSetFile, Name: "file", Flag: true, Spelling: "--file", ValueName: "FILE"},
+ {Key: FlagSetNoRedact, Name: "no-redact", Flag: true, RequiresIfBoolean: true, Spelling: "--no-redact"},
+ {Key: FlagSetPrompt, Name: "prompt", Flag: true, RequiresIfBoolean: true, Spelling: "--prompt"},
+ {Key: FlagSetRemove, Name: "remove", Flag: true, Spelling: "--remove", ValueName: "ENV_KEY"},
+ {Key: FlagSetStdin, Name: "stdin", Flag: true, RequiresIfBoolean: true, Spelling: "--stdin", Conflicts: []uint64{FlagSetPrompt}, Requires: []uint64{ArgSetEnvVar}},
+ {Key: ArgSetEnvVar, Name: "ENV_VAR"},
+ {},
+ {Key: FlagSettingsAll, Name: "all", Flag: true, RequiresIfBoolean: true, Spelling: "--all"},
+ {Key: FlagSettingsJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagSettingsLocal, Name: "local", Flag: true, RequiresIfBoolean: true, Spelling: "--local"},
+ {Key: FlagSettingsToml, Name: "toml", Flag: true, RequiresIfBoolean: true, Spelling: "--toml"},
+ {Key: FlagSettingsComplete, Name: "complete", Flag: true, RequiresIfBoolean: true, Spelling: "--complete"},
+ {Key: FlagSettingsJsonExtended, Name: "json-extended", Flag: true, RequiresIfBoolean: true, Spelling: "--json-extended"},
+ {Key: ArgSettingsSetting, Name: "SETTING"},
+ {Key: ArgSettingsValue, Name: "VALUE", Conflicts: []uint64{FlagSettingsAll}},
+ {},
+ {Key: FlagSettingsAddLocal, Name: "local", Flag: true, RequiresIfBoolean: true, Spelling: "--local"},
+ {Key: ArgSettingsAddSetting, Name: "SETTING", Required: true},
+ {Key: ArgSettingsAddValue, Name: "VALUE"},
+ {},
+ {Key: FlagSettingsGetLocal, Name: "local", Flag: true, RequiresIfBoolean: true, Spelling: "--local"},
+ {Key: ArgSettingsGetSetting, Name: "SETTING", Required: true},
+ {},
+ {Key: FlagSettingsLsAll, Name: "all", Flag: true, RequiresIfBoolean: true, Spelling: "--all"},
+ {Key: FlagSettingsLsJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagSettingsLsLocal, Name: "local", Flag: true, RequiresIfBoolean: true, Spelling: "--local"},
+ {Key: FlagSettingsLsToml, Name: "toml", Flag: true, RequiresIfBoolean: true, Spelling: "--toml"},
+ {Key: FlagSettingsLsComplete, Name: "complete", Flag: true, RequiresIfBoolean: true, Spelling: "--complete"},
+ {Key: FlagSettingsLsJsonExtended, Name: "json-extended", Flag: true, RequiresIfBoolean: true, Spelling: "--json-extended"},
+ {Key: ArgSettingsLsSetting, Name: "SETTING"},
+ {},
+ {Key: FlagSettingsSetLocal, Name: "local", Flag: true, RequiresIfBoolean: true, Spelling: "--local"},
+ {Key: ArgSettingsSetSetting, Name: "SETTING", Required: true},
+ {Key: ArgSettingsSetValue, Name: "VALUE"},
+ {},
+ {Key: FlagSettingsUnsetLocal, Name: "local", Flag: true, RequiresIfBoolean: true, Spelling: "--local"},
+ {Key: ArgSettingsUnsetKey, Name: "KEY", Required: true},
+ {},
+ {Key: FlagShellJobs, Name: "jobs", Flag: true, Spelling: "--jobs", ValueName: "JOBS", Env: "MISE_JOBS"},
+ {Key: FlagShellUnset, Name: "unset", Flag: true, RequiresIfBoolean: true, Spelling: "--unset"},
+ {Key: FlagShellRaw, Name: "raw", Flag: true, RequiresIfBoolean: true, Spelling: "--raw", Overrides: []uint64{FlagShellJobs}},
+ {Key: ArgShellToolVersion, Name: "TOOL@VERSION", Required: true},
+ {},
+ {Key: FlagShellAliasNoHeader, Name: "no-header", Flag: true, RequiresIfBoolean: true, Spelling: "--no-header"},
+ {},
+ {Key: ArgShellAliasGetShellAlias, Name: "shell_alias", Required: true},
+ {},
+ {Key: FlagShellAliasLsNoHeader, Name: "no-header", Flag: true, RequiresIfBoolean: true, Spelling: "--no-header"},
+ {},
+ {Key: ArgShellAliasSetShellAlias, Name: "shell_alias", Required: true},
+ {Key: ArgShellAliasSetCommand, Name: "COMMAND"},
+ {},
+ {Key: ArgShellAliasUnsetShellAlias, Name: "shell_alias", Required: true},
+ {},
+ {},
+ {},
+ {Key: FlagSyncNodeBrew, Name: "brew", Flag: true, RequiresIfBoolean: true, Spelling: "--brew"},
+ {Key: FlagSyncNodeNodenv, Name: "nodenv", Flag: true, RequiresIfBoolean: true, Spelling: "--nodenv"},
+ {Key: FlagSyncNodeNvm, Name: "nvm", Flag: true, RequiresIfBoolean: true, Spelling: "--nvm"},
+ {},
+ {Key: FlagSyncPythonPyenv, Name: "pyenv", Flag: true, RequiresIfBoolean: true, Spelling: "--pyenv"},
+ {Key: FlagSyncPythonUv, Name: "uv", Flag: true, RequiresIfBoolean: true, Spelling: "--uv"},
+ {},
+ {Key: FlagSyncRubyBrew, Name: "brew", Flag: true, Required: true, RequiresIfBoolean: true, Spelling: "--brew"},
+ {},
+ {Key: FlagTasksGlobal, Name: "global", Flag: true, RequiresIfBoolean: true, Spelling: "--global", Overrides: []uint64{FlagTasksLocal}},
+ {Key: FlagTasksJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagTasksLocal, Name: "local", Flag: true, RequiresIfBoolean: true, Spelling: "--local", Overrides: []uint64{FlagTasksGlobal}},
+ {Key: FlagTasksExtended, Name: "extended", Flag: true, RequiresIfBoolean: true, Spelling: "--extended"},
+ {Key: FlagTasksAll, Name: "all", Flag: true, RequiresIfBoolean: true, Spelling: "--all"},
+ {Key: FlagTasksComplete, Name: "complete", Flag: true, RequiresIfBoolean: true, Spelling: "--complete"},
+ {Key: FlagTasksHidden, Name: "hidden", Flag: true, RequiresIfBoolean: true, Spelling: "--hidden"},
+ {Key: FlagTasksNameOnly, Name: "name-only", Flag: true, RequiresIfBoolean: true, Spelling: "--name-only", Conflicts: []uint64{FlagTasksJson, FlagTasksExtended, FlagTasksUsage}},
+ {Key: FlagTasksNoHeader, Name: "no-header", Flag: true, RequiresIfBoolean: true, Spelling: "--no-header"},
+ {Key: FlagTasksSort, Name: "sort", Flag: true, Spelling: "--sort", ValueName: "COLUMN", Choices: []string{"name", "alias", "description", "source"}, AcceptedChoices: []string{"name", "alias", "description", "source"}},
+ {Key: FlagTasksSortOrder, Name: "sort-order", Flag: true, Spelling: "--sort-order", ValueName: "SORT_ORDER", Choices: []string{"asc", "desc"}, AcceptedChoices: []string{"asc", "desc"}},
+ {Key: FlagTasksUsage, Name: "usage", Flag: true, RequiresIfBoolean: true, Spelling: "--usage"},
+ {Key: ArgTasksTask, Name: "TASK"},
+ {},
+ {Key: FlagTasksAddAlias, Name: "alias", Flag: true, Spelling: "--alias", ValueName: "ALIAS"},
+ {Key: FlagTasksAddDepends, Name: "depends", Flag: true, Spelling: "--depends", ValueName: "DEPENDS"},
+ {Key: FlagTasksAddDir, Name: "dir", Flag: true, Spelling: "--dir", ValueName: "DIR"},
+ {Key: FlagTasksAddFile, Name: "file", Flag: true, RequiresIfBoolean: true, Spelling: "--file"},
+ {Key: FlagTasksAddHide, Name: "hide", Flag: true, RequiresIfBoolean: true, Spelling: "--hide"},
+ {Key: FlagTasksAddQuiet, Name: "quiet", Flag: true, RequiresIfBoolean: true, Spelling: "--quiet"},
+ {Key: FlagTasksAddRaw, Name: "raw", Flag: true, RequiresIfBoolean: true, Spelling: "--raw"},
+ {Key: FlagTasksAddSources, Name: "sources", Flag: true, Spelling: "--sources", ValueName: "SOURCES"},
+ {Key: FlagTasksAddWaitFor, Name: "wait-for", Flag: true, Spelling: "--wait-for", ValueName: "WAIT_FOR"},
+ {Key: FlagTasksAddDependsPost, Name: "depends-post", Flag: true, Spelling: "--depends-post", ValueName: "DEPENDS_POST"},
+ {Key: FlagTasksAddDescription, Name: "description", Flag: true, Spelling: "--description", ValueName: "DESCRIPTION"},
+ {Key: FlagTasksAddOutputs, Name: "outputs", Flag: true, Spelling: "--outputs", ValueName: "OUTPUTS"},
+ {Key: FlagTasksAddRunWindows, Name: "run-windows", Flag: true, Spelling: "--run-windows", ValueName: "RUN_WINDOWS"},
+ {Key: FlagTasksAddShell, Name: "shell", Flag: true, Spelling: "--shell", ValueName: "SHELL"},
+ {Key: FlagTasksAddSilent, Name: "silent", Flag: true, RequiresIfBoolean: true, Spelling: "--silent"},
+ {Key: ArgTasksAddTask, Name: "TASK", Required: true},
+ {Key: ArgTasksAddRun, Name: "RUN"},
+ {},
+ {Key: FlagTasksDepsCompact, Name: "compact", Flag: true, RequiresIfBoolean: true, Spelling: "--compact", Conflicts: []uint64{FlagTasksDepsDot}},
+ {Key: FlagTasksDepsDot, Name: "dot", Flag: true, RequiresIfBoolean: true, Spelling: "--dot"},
+ {Key: FlagTasksDepsHidden, Name: "hidden", Flag: true, RequiresIfBoolean: true, Spelling: "--hidden"},
+ {Key: ArgTasksDepsTasks, Name: "TASKS"},
+ {},
+ {Key: FlagTasksEditPath, Name: "path", Flag: true, RequiresIfBoolean: true, Spelling: "--path"},
+ {Key: ArgTasksEditTask, Name: "TASK", Required: true},
+ {},
+ {Key: FlagTasksGraphJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagTasksGraphExplain, Name: "explain", Flag: true, RequiresIfBoolean: true, Spelling: "--explain", Conflicts: []uint64{FlagTasksGraphJson}},
+ {Key: FlagTasksGraphNoHeader, Name: "no-header", Flag: true, RequiresIfBoolean: true, Spelling: "--no-header"},
+ {},
+ {Key: FlagTasksInfoJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: ArgTasksInfoTask, Name: "TASK", Required: true},
+ {},
+ {Key: FlagTasksLsGlobal, Name: "global", Flag: true, RequiresIfBoolean: true, Spelling: "--global", Overrides: []uint64{FlagTasksLsLocal}},
+ {Key: FlagTasksLsJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagTasksLsLocal, Name: "local", Flag: true, RequiresIfBoolean: true, Spelling: "--local", Overrides: []uint64{FlagTasksLsGlobal}},
+ {Key: FlagTasksLsExtended, Name: "extended", Flag: true, RequiresIfBoolean: true, Spelling: "--extended"},
+ {Key: FlagTasksLsAll, Name: "all", Flag: true, RequiresIfBoolean: true, Spelling: "--all"},
+ {Key: FlagTasksLsComplete, Name: "complete", Flag: true, RequiresIfBoolean: true, Spelling: "--complete"},
+ {Key: FlagTasksLsHidden, Name: "hidden", Flag: true, RequiresIfBoolean: true, Spelling: "--hidden"},
+ {Key: FlagTasksLsNameOnly, Name: "name-only", Flag: true, RequiresIfBoolean: true, Spelling: "--name-only", Conflicts: []uint64{FlagTasksLsJson, FlagTasksLsExtended, FlagTasksLsUsage}},
+ {Key: FlagTasksLsNoHeader, Name: "no-header", Flag: true, RequiresIfBoolean: true, Spelling: "--no-header"},
+ {Key: FlagTasksLsSort, Name: "sort", Flag: true, Spelling: "--sort", ValueName: "COLUMN", Choices: []string{"name", "alias", "description", "source"}, AcceptedChoices: []string{"name", "alias", "description", "source"}},
+ {Key: FlagTasksLsSortOrder, Name: "sort-order", Flag: true, Spelling: "--sort-order", ValueName: "SORT_ORDER", Choices: []string{"asc", "desc"}, AcceptedChoices: []string{"asc", "desc"}},
+ {Key: FlagTasksLsUsage, Name: "usage", Flag: true, RequiresIfBoolean: true, Spelling: "--usage"},
+ {},
+ {Key: FlagTasksRunAffected, Name: "affected", Flag: true, RequiresIfBoolean: true, Spelling: "--affected"},
+ {Key: FlagTasksRunAffectedBase, Name: "affected-base", Flag: true, Spelling: "--affected-base", ValueName: "REV", Requires: []uint64{FlagTasksRunAffected}},
+ {Key: FlagTasksRunAffectedExplain, Name: "affected-explain", Flag: true, RequiresIfBoolean: true, Spelling: "--affected-explain", Conflicts: []uint64{FlagTasksRunAffectedJson}, Requires: []uint64{FlagTasksRunAffected}},
+ {Key: FlagTasksRunAffectedHead, Name: "affected-head", Flag: true, Spelling: "--affected-head", ValueName: "REV", Requires: []uint64{FlagTasksRunAffected}},
+ {Key: FlagTasksRunAffectedJson, Name: "affected-json", Flag: true, RequiresIfBoolean: true, Spelling: "--affected-json", Conflicts: []uint64{FlagTasksRunAffectedExplain}, Requires: []uint64{FlagTasksRunAffected}},
+ {Key: FlagTasksRunAll, Name: "all", Flag: true, RequiresIfBoolean: true, Spelling: "--all", Conflicts: []uint64{ArgTasksRunTask, FlagTasksRunAffected}},
+ {Key: FlagTasksRunContinueOnError, Name: "continue-on-error", Flag: true, RequiresIfBoolean: true, Spelling: "--continue-on-error"},
+ {Key: FlagTasksRunCd, Name: "cd", Flag: true, Spelling: "--cd", ValueName: "CD"},
+ {Key: FlagTasksRunForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force"},
+ {Key: FlagTasksRunJobs, Name: "jobs", Flag: true, Spelling: "--jobs", ValueName: "JOBS", Env: "MISE_JOBS"},
+ {Key: FlagTasksRunDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagTasksRunOutput, Name: "output", Flag: true, Spelling: "--output", ValueName: "OUTPUT", Env: "MISE_TASK_OUTPUT"},
+ {Key: FlagTasksRunQuiet, Name: "quiet", Flag: true, RequiresIfBoolean: true, Spelling: "--quiet", Env: "MISE_QUIET"},
+ {Key: FlagTasksRunRaw, Name: "raw", Flag: true, RequiresIfBoolean: true, Spelling: "--raw"},
+ {Key: FlagTasksRunShell, Name: "shell", Flag: true, Spelling: "--shell", ValueName: "SHELL"},
+ {Key: FlagTasksRunSilent, Name: "silent", Flag: true, RequiresIfBoolean: true, Spelling: "--silent", Env: "MISE_SILENT"},
+ {Key: FlagTasksRunTool, Name: "tool", Flag: true, Spelling: "--tool", ValueName: "TOOL@VERSION"},
+ {Key: FlagTasksRunAllowEnv, Name: "allow-env", Flag: true, Spelling: "--allow-env", ValueName: "VAR"},
+ {Key: FlagTasksRunAllowNet, Name: "allow-net", Flag: true, Spelling: "--allow-net", ValueName: "HOST"},
+ {Key: FlagTasksRunAllowRead, Name: "allow-read", Flag: true, Spelling: "--allow-read", ValueName: "PATH"},
+ {Key: FlagTasksRunAllowWrite, Name: "allow-write", Flag: true, Spelling: "--allow-write", ValueName: "PATH"},
+ {Key: FlagTasksRunDenyAll, Name: "deny-all", Flag: true, RequiresIfBoolean: true, Spelling: "--deny-all"},
+ {Key: FlagTasksRunDenyEnv, Name: "deny-env", Flag: true, RequiresIfBoolean: true, Spelling: "--deny-env"},
+ {Key: FlagTasksRunDenyNet, Name: "deny-net", Flag: true, RequiresIfBoolean: true, Spelling: "--deny-net"},
+ {Key: FlagTasksRunDenyRead, Name: "deny-read", Flag: true, RequiresIfBoolean: true, Spelling: "--deny-read"},
+ {Key: FlagTasksRunDenyWrite, Name: "deny-write", Flag: true, RequiresIfBoolean: true, Spelling: "--deny-write"},
+ {Key: FlagTasksRunFreshEnv, Name: "fresh-env", Flag: true, RequiresIfBoolean: true, Spelling: "--fresh-env"},
+ {Key: FlagTasksRunNoCache, Name: "no-cache", Flag: true, RequiresIfBoolean: true, Spelling: "--no-cache", Env: "MISE_TASK_REMOTE_NO_CACHE"},
+ {Key: FlagTasksRunNoDeps, Name: "no-deps", Flag: true, RequiresIfBoolean: true, Spelling: "--no-deps"},
+ {Key: FlagTasksRunNoTimings, Name: "no-timings", Flag: true, RequiresIfBoolean: true, Spelling: "--no-timings"},
+ {Key: FlagTasksRunSkipDeps, Name: "skip-deps", Flag: true, RequiresIfBoolean: true, Spelling: "--skip-deps", Env: "MISE_TASK_SKIP_DEPENDS"},
+ {Key: FlagTasksRunSkipTools, Name: "skip-tools", Flag: true, RequiresIfBoolean: true, Spelling: "--skip-tools"},
+ {Key: FlagTasksRunTaskCache, Name: "task-cache", Flag: true, Spelling: "--task-cache", ValueName: "TASK_CACHE", Choices: []string{"read-write", "read-only", "write-only", "off", "local-only"}, AcceptedChoices: []string{"read-write", "read-only", "write-only", "off", "local-only"}, Default: []string{"read-write"}, Env: "MISE_TASK_CACHE"},
+ {Key: FlagTasksRunTaskCacheExplain, Name: "task-cache-explain", Flag: true, RequiresIfBoolean: true, Spelling: "--task-cache-explain"},
+ {Key: FlagTasksRunTaskCacheExplainJson, Name: "task-cache-explain-json", Flag: true, RequiresIfBoolean: true, Spelling: "--task-cache-explain-json", Conflicts: []uint64{FlagTasksRunTaskCacheExplain}, Requires: []uint64{FlagTasksRunDryRun}},
+ {Key: FlagTasksRunTaskCacheStats, Name: "task-cache-stats", Flag: true, RequiresIfBoolean: true, Spelling: "--task-cache-stats", Conflicts: []uint64{FlagTasksRunDryRun}},
+ {Key: FlagTasksRunTimeout, Name: "timeout", Flag: true, Spelling: "--timeout", ValueName: "TIMEOUT"},
+ {Key: FlagTasksRunTimings, Name: "timings", Flag: true, RequiresIfBoolean: true, Spelling: "--timings"},
+ {Key: ArgTasksRunTask, Name: "TASK"},
+ {Key: ArgTasksRunArgs, Name: "ARGS"},
+ {Key: ArgTasksRunArgsLast, Name: "ARGS_LAST"},
+ {},
+ {Key: FlagTasksValidateErrorsOnly, Name: "errors-only", Flag: true, RequiresIfBoolean: true, Spelling: "--errors-only"},
+ {Key: FlagTasksValidateJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: ArgTasksValidateTasks, Name: "TASKS"},
+ {},
+ {Key: FlagTestToolAll, Name: "all", Flag: true, RequiresIfBoolean: true, Spelling: "--all", Conflicts: []uint64{ArgTestToolTools, FlagTestToolAllConfig}},
+ {Key: FlagTestToolJobs, Name: "jobs", Flag: true, Spelling: "--jobs", ValueName: "JOBS", Env: "MISE_TEST_TOOL_JOBS"},
+ {Key: FlagTestToolAllConfig, Name: "all-config", Flag: true, RequiresIfBoolean: true, Spelling: "--all-config", Conflicts: []uint64{ArgTestToolTools, FlagTestToolAll}},
+ {Key: FlagTestToolIncludeNonDefined, Name: "include-non-defined", Flag: true, RequiresIfBoolean: true, Spelling: "--include-non-defined"},
+ {Key: FlagTestToolRaw, Name: "raw", Flag: true, RequiresIfBoolean: true, Spelling: "--raw", Overrides: []uint64{FlagTestToolJobs}},
+ {Key: ArgTestToolTools, Name: "TOOLS", RequiredUnless: []uint64{FlagTestToolAll, FlagTestToolAllConfig}},
+ {},
+ {},
+ {Key: FlagTokenForgejoUnmask, Name: "unmask", Flag: true, RequiresIfBoolean: true, Spelling: "--unmask"},
+ {Key: ArgTokenForgejoHost, Name: "HOST", Default: []string{"codeberg.org"}},
+ {},
+ {Key: FlagTokenGithubOauth, Name: "oauth", Flag: true, RequiresIfBoolean: true, Spelling: "--oauth"},
+ {Key: FlagTokenGithubRaw, Name: "raw", Flag: true, RequiresIfBoolean: true, Spelling: "--raw"},
+ {Key: FlagTokenGithubRefresh, Name: "refresh", Flag: true, RequiresIfBoolean: true, Spelling: "--refresh", Requires: []uint64{FlagTokenGithubOauth}},
+ {Key: FlagTokenGithubUnmask, Name: "unmask", Flag: true, RequiresIfBoolean: true, Spelling: "--unmask"},
+ {Key: ArgTokenGithubHost, Name: "HOST", Default: []string{"github.com"}},
+ {},
+ {Key: FlagTokenGitlabUnmask, Name: "unmask", Flag: true, RequiresIfBoolean: true, Spelling: "--unmask"},
+ {Key: ArgTokenGitlabHost, Name: "HOST", Default: []string{"gitlab.com"}},
+ {},
+ {Key: FlagToolJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {Key: FlagToolActive, Name: "active", Flag: true, RequiresIfBoolean: true, Spelling: "--active"},
+ {Key: FlagToolBackend, Name: "backend", Flag: true, RequiresIfBoolean: true, Spelling: "--backend"},
+ {Key: FlagToolConfigSource, Name: "config-source", Flag: true, RequiresIfBoolean: true, Spelling: "--config-source"},
+ {Key: FlagToolDescription, Name: "description", Flag: true, RequiresIfBoolean: true, Spelling: "--description"},
+ {Key: FlagToolInstalled, Name: "installed", Flag: true, RequiresIfBoolean: true, Spelling: "--installed"},
+ {Key: FlagToolRequested, Name: "requested", Flag: true, RequiresIfBoolean: true, Spelling: "--requested"},
+ {Key: FlagToolToolOptions, Name: "tool-options", Flag: true, RequiresIfBoolean: true, Spelling: "--tool-options"},
+ {Key: ArgToolTool, Name: "TOOL", Required: true},
+ {},
+ {Key: ArgToolStubFile, Name: "FILE", Required: true},
+ {Key: ArgToolStubArgs, Name: "ARGS"},
+ {},
+ {Key: FlagTrustAll, Name: "all", Flag: true, RequiresIfBoolean: true, Spelling: "--all", Conflicts: []uint64{FlagTrustIgnore, FlagTrustUntrust}},
+ {Key: FlagTrustIgnore, Name: "ignore", Flag: true, RequiresIfBoolean: true, Spelling: "--ignore", Conflicts: []uint64{FlagTrustUntrust}},
+ {Key: FlagTrustShow, Name: "show", Flag: true, RequiresIfBoolean: true, Spelling: "--show"},
+ {Key: FlagTrustUntrust, Name: "untrust", Flag: true, RequiresIfBoolean: true, Spelling: "--untrust"},
+ {Key: ArgTrustConfigFile, Name: "CONFIG_FILE"},
+ {},
+ {Key: FlagUninstallAll, Name: "all", Flag: true, RequiresIfBoolean: true, Spelling: "--all"},
+ {Key: FlagUninstallDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagUninstallDryRunCode, Name: "dry-run-code", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run-code"},
+ {Key: ArgUninstallInstalledToolVersion, Name: "INSTALLED_TOOL@VERSION", RequiredUnless: []uint64{FlagUninstallAll}},
+ {},
+ {Key: FlagUnsetFile, Name: "file", Flag: true, Spelling: "--file", ValueName: "FILE"},
+ {Key: FlagUnsetGlobal, Name: "global", Flag: true, RequiresIfBoolean: true, Spelling: "--global", Overrides: []uint64{FlagUnsetFile}},
+ {Key: ArgUnsetEnvKey, Name: "ENV_KEY"},
+ {},
+ {Key: ArgUntrustConfigFile, Name: "CONFIG_FILE"},
+ {},
+ {Key: FlagUnuseEnv, Name: "env", Flag: true, Spelling: "--env", ValueName: "ENV", Overrides: []uint64{FlagUnuseGlobal, FlagUnusePath}},
+ {Key: FlagUnuseGlobal, Name: "global", Flag: true, RequiresIfBoolean: true, Spelling: "--global", Overrides: []uint64{FlagUnusePath, FlagUnuseEnv}},
+ {Key: FlagUnusePath, Name: "path", Flag: true, Spelling: "--path", ValueName: "PATH", Overrides: []uint64{FlagUnuseGlobal, FlagUnuseEnv}},
+ {Key: FlagUnuseNoPrune, Name: "no-prune", Flag: true, RequiresIfBoolean: true, Spelling: "--no-prune"},
+ {Key: ArgUnuseInstalledToolVersion, Name: "INSTALLED_TOOL@VERSION", Required: true},
+ {},
+ {Key: FlagUpgradeBump, Name: "bump", Flag: true, RequiresIfBoolean: true, Spelling: "--bump"},
+ {Key: FlagUpgradeInteractive, Name: "interactive", Flag: true, RequiresIfBoolean: true, Spelling: "--interactive", Conflicts: []uint64{ArgUpgradeInstalledToolVersion}},
+ {Key: FlagUpgradeJobs, Name: "jobs", Flag: true, Spelling: "--jobs", ValueName: "JOBS", Env: "MISE_JOBS"},
+ {Key: FlagUpgradeL, Name: "l", Flag: true, RequiresIfBoolean: true, Spelling: "-l"},
+ {Key: FlagUpgradeDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagUpgradeExclude, Name: "exclude", Flag: true, Spelling: "--exclude", ValueName: "INSTALLED_TOOL"},
+ {Key: FlagUpgradeDryRunCode, Name: "dry-run-code", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run-code"},
+ {Key: FlagUpgradeInactive, Name: "inactive", Flag: true, RequiresIfBoolean: true, Spelling: "--inactive", Conflicts: []uint64{FlagUpgradeLocal}},
+ {Key: FlagUpgradeLocal, Name: "local", Flag: true, RequiresIfBoolean: true, Spelling: "--local"},
+ {Key: FlagUpgradeMinimumReleaseAge, Name: "minimum-release-age", Flag: true, Spelling: "--minimum-release-age", ValueName: "MINIMUM_RELEASE_AGE"},
+ {Key: FlagUpgradeMonorepo, Name: "monorepo", Flag: true, RequiresIfBoolean: true, Spelling: "--monorepo"},
+ {Key: FlagUpgradeNoPrune, Name: "no-prune", Flag: true, RequiresIfBoolean: true, Spelling: "--no-prune", Overrides: []uint64{FlagUpgradePrune}},
+ {Key: FlagUpgradePrune, Name: "prune", Flag: true, RequiresIfBoolean: true, Spelling: "--prune", Overrides: []uint64{FlagUpgradeNoPrune}},
+ {Key: FlagUpgradeRaw, Name: "raw", Flag: true, RequiresIfBoolean: true, Spelling: "--raw", Overrides: []uint64{FlagUpgradeJobs}},
+ {Key: ArgUpgradeInstalledToolVersion, Name: "INSTALLED_TOOL@VERSION"},
+ {},
+ {},
+ {Key: FlagUseEnv, Name: "env", Flag: true, Spelling: "--env", ValueName: "ENV", Overrides: []uint64{FlagUseGlobal, FlagUsePath}},
+ {Key: FlagUseForce, Name: "force", Flag: true, RequiresIfBoolean: true, Spelling: "--force", Requires: []uint64{ArgUseToolVersion}},
+ {Key: FlagUseGlobal, Name: "global", Flag: true, RequiresIfBoolean: true, Spelling: "--global", Overrides: []uint64{FlagUsePath, FlagUseEnv}},
+ {Key: FlagUseJobs, Name: "jobs", Flag: true, Spelling: "--jobs", ValueName: "JOBS", Env: "MISE_JOBS"},
+ {Key: FlagUseDryRun, Name: "dry-run", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run"},
+ {Key: FlagUsePath, Name: "path", Flag: true, Spelling: "--path", ValueName: "PATH", Overrides: []uint64{FlagUseGlobal, FlagUseEnv}},
+ {Key: FlagUseDryRunCode, Name: "dry-run-code", Flag: true, RequiresIfBoolean: true, Spelling: "--dry-run-code"},
+ {Key: FlagUseFuzzy, Name: "fuzzy", Flag: true, RequiresIfBoolean: true, Spelling: "--fuzzy", Overrides: []uint64{FlagUsePin}},
+ {Key: FlagUseMinimumReleaseAge, Name: "minimum-release-age", Flag: true, Spelling: "--minimum-release-age", ValueName: "MINIMUM_RELEASE_AGE"},
+ {Key: FlagUsePin, Name: "pin", Flag: true, RequiresIfBoolean: true, Spelling: "--pin", Overrides: []uint64{FlagUseFuzzy}},
+ {Key: FlagUseRaw, Name: "raw", Flag: true, RequiresIfBoolean: true, Spelling: "--raw", Overrides: []uint64{FlagUseJobs}},
+ {Key: FlagUseRemove, Name: "remove", Flag: true, Spelling: "--remove", ValueName: "TOOL"},
+ {Key: ArgUseToolVersion, Name: "TOOL@VERSION"},
+ {},
+ {Key: FlagVersionJson, Name: "json", Flag: true, RequiresIfBoolean: true, Spelling: "--json"},
+ {},
+ {Key: FlagWatchTaskFlag, Name: "task-flag", Flag: true, Spelling: "--task-flag", ValueName: "TASK_FLAG"},
+ {Key: FlagWatchGlob, Name: "glob", Flag: true, Spelling: "--glob", ValueName: "GLOB"},
+ {Key: FlagWatchSkipDeps, Name: "skip-deps", Flag: true, RequiresIfBoolean: true, Spelling: "--skip-deps"},
+ {Key: FlagWatchWatch, Name: "watch", Flag: true, Spelling: "--watch", ValueName: "PATH"},
+ {Key: FlagWatchWatchNonRecursive, Name: "watch-non-recursive", Flag: true, Spelling: "--watch-non-recursive", ValueName: "PATH"},
+ {Key: FlagWatchWatchFile, Name: "watch-file", Flag: true, Spelling: "--watch-file", ValueName: "PATH"},
+ {Key: FlagWatchClear, Name: "clear", Flag: true, Spelling: "--clear", ValueName: "MODE", Choices: []string{"clear", "reset"}, AcceptedChoices: []string{"clear", "reset"}},
+ {Key: FlagWatchOnBusyUpdate, Name: "on-busy-update", Flag: true, Spelling: "--on-busy-update", ValueName: "MODE", Choices: []string{"queue", "do-nothing", "restart", "signal"}, AcceptedChoices: []string{"queue", "do-nothing", "restart", "signal"}, Default: []string{"do-nothing"}},
+ {Key: FlagWatchRestart, Name: "restart", Flag: true, RequiresIfBoolean: true, Spelling: "--restart", Conflicts: []uint64{FlagWatchOnBusyUpdate}},
+ {Key: FlagWatchSignal, Name: "signal", Flag: true, Spelling: "--signal", ValueName: "SIGNAL", Conflicts: []uint64{FlagWatchRestart}},
+ {Key: FlagWatchStopSignal, Name: "stop-signal", Flag: true, Spelling: "--stop-signal", ValueName: "SIGNAL"},
+ {Key: FlagWatchStopTimeout, Name: "stop-timeout", Flag: true, Spelling: "--stop-timeout", ValueName: "TIMEOUT", Default: []string{"10s"}},
+ {Key: FlagWatchMapSignal, Name: "map-signal", Flag: true, Spelling: "--map-signal", ValueName: "SIGNAL:SIGNAL"},
+ {Key: FlagWatchDebounce, Name: "debounce", Flag: true, Spelling: "--debounce", ValueName: "TIMEOUT", Default: []string{"50ms"}},
+ {Key: FlagWatchStdinQuit, Name: "stdin-quit", Flag: true, RequiresIfBoolean: true, Spelling: "--stdin-quit"},
+ {Key: FlagWatchNoVcsIgnore, Name: "no-vcs-ignore", Flag: true, RequiresIfBoolean: true, Spelling: "--no-vcs-ignore"},
+ {Key: FlagWatchNoProjectIgnore, Name: "no-project-ignore", Flag: true, RequiresIfBoolean: true, Spelling: "--no-project-ignore"},
+ {Key: FlagWatchNoGlobalIgnore, Name: "no-global-ignore", Flag: true, RequiresIfBoolean: true, Spelling: "--no-global-ignore"},
+ {Key: FlagWatchNoDefaultIgnore, Name: "no-default-ignore", Flag: true, RequiresIfBoolean: true, Spelling: "--no-default-ignore"},
+ {Key: FlagWatchNoDiscoverIgnore, Name: "no-discover-ignore", Flag: true, RequiresIfBoolean: true, Spelling: "--no-discover-ignore"},
+ {Key: FlagWatchIgnoreNothing, Name: "ignore-nothing", Flag: true, RequiresIfBoolean: true, Spelling: "--ignore-nothing"},
+ {Key: FlagWatchPostpone, Name: "postpone", Flag: true, RequiresIfBoolean: true, Spelling: "--postpone"},
+ {Key: FlagWatchDelayRun, Name: "delay-run", Flag: true, Spelling: "--delay-run", ValueName: "DURATION"},
+ {Key: FlagWatchPoll, Name: "poll", Flag: true, Spelling: "--poll", ValueName: "INTERVAL"},
+ {Key: FlagWatchShell, Name: "shell", Flag: true, Spelling: "--shell", ValueName: "SHELL"},
+ {Key: FlagWatchN, Name: "n", Flag: true, RequiresIfBoolean: true, Spelling: "-n"},
+ {Key: FlagWatchEmitEventsTo, Name: "emit-events-to", Flag: true, Spelling: "--emit-events-to", ValueName: "MODE", Choices: []string{"environment", "stdio", "file", "json-stdio", "json-file", "none"}, AcceptedChoices: []string{"environment", "stdio", "file", "json-stdio", "json-file", "none"}, Default: []string{"none"}},
+ {Key: FlagWatchOnlyEmitEvents, Name: "only-emit-events", Flag: true, RequiresIfBoolean: true, Spelling: "--only-emit-events", Conflicts: []uint64{FlagWatchManual}},
+ {Key: FlagWatchEnv, Name: "env", Flag: true, Spelling: "--env", ValueName: "KEY=VALUE"},
+ {Key: FlagWatchWrapProcess, Name: "wrap-process", Flag: true, Spelling: "--wrap-process", ValueName: "MODE", Choices: []string{"group", "session", "none"}, AcceptedChoices: []string{"group", "session", "none"}},
+ {Key: FlagWatchNotify, Name: "notify", Flag: true, RequiresIfBoolean: true, Spelling: "--notify"},
+ {Key: FlagWatchColor, Name: "color", Flag: true, Spelling: "--color", ValueName: "MODE", Choices: []string{"auto", "always", "never"}, AcceptedChoices: []string{"auto", "always", "never"}, Default: []string{"auto"}},
+ {Key: FlagWatchTimings, Name: "timings", Flag: true, RequiresIfBoolean: true, Spelling: "--timings"},
+ {Key: FlagWatchQuiet, Name: "quiet", Flag: true, RequiresIfBoolean: true, Spelling: "--quiet"},
+ {Key: FlagWatchBell, Name: "bell", Flag: true, RequiresIfBoolean: true, Spelling: "--bell"},
+ {Key: FlagWatchProjectOrigin, Name: "project-origin", Flag: true, Spelling: "--project-origin", ValueName: "DIRECTORY"},
+ {Key: FlagWatchWorkdir, Name: "workdir", Flag: true, Spelling: "--workdir", ValueName: "DIRECTORY"},
+ {Key: FlagWatchExts, Name: "exts", Flag: true, Spelling: "--exts", ValueName: "EXTENSIONS"},
+ {Key: FlagWatchFilter, Name: "filter", Flag: true, Spelling: "--filter", ValueName: "PATTERN"},
+ {Key: FlagWatchFilterFile, Name: "filter-file", Flag: true, Spelling: "--filter-file", ValueName: "PATH", Env: "WATCHEXEC_FILTER_FILES"},
+ {Key: FlagWatchFilterProg, Name: "filter-prog", Flag: true, Spelling: "--filter-prog", ValueName: "EXPRESSION"},
+ {Key: FlagWatchIgnore, Name: "ignore", Flag: true, Spelling: "--ignore", ValueName: "PATTERN"},
+ {Key: FlagWatchIgnoreFile, Name: "ignore-file", Flag: true, Spelling: "--ignore-file", ValueName: "PATH", Env: "WATCHEXEC_IGNORE_FILES"},
+ {Key: FlagWatchFsEvents, Name: "fs-events", Flag: true, Spelling: "--fs-events", ValueName: "EVENTS", Choices: []string{"access", "create", "remove", "rename", "modify", "metadata"}, AcceptedChoices: []string{"access", "create", "remove", "rename", "modify", "metadata"}, Default: []string{"create,remove,rename,modify,metadata"}},
+ {Key: FlagWatchNoMeta, Name: "no-meta", Flag: true, RequiresIfBoolean: true, Spelling: "--no-meta", Conflicts: []uint64{FlagWatchFsEvents}},
+ {Key: FlagWatchPrintEvents, Name: "print-events", Flag: true, RequiresIfBoolean: true, Spelling: "--print-events"},
+ {Key: FlagWatchManual, Name: "manual", Flag: true, RequiresIfBoolean: true, Spelling: "--manual"},
+ {Key: ArgWatchTask, Name: "TASK"},
+ {Key: ArgWatchArgs, Name: "ARGS"},
+ {},
+ {Key: ArgWhereToolVersion, Name: "TOOL@VERSION", Required: true},
+ {Key: ArgWhereAsdfVersion, Name: "ASDF_VERSION"},
+ {},
+ {Key: FlagWhichTool, Name: "tool", Flag: true, Spelling: "--tool", ValueName: "TOOL@VERSION"},
+ {Key: FlagWhichComplete, Name: "complete", Flag: true, RequiresIfBoolean: true, Spelling: "--complete"},
+ {Key: FlagWhichPlugin, Name: "plugin", Flag: true, RequiresIfBoolean: true, Spelling: "--plugin", Conflicts: []uint64{FlagWhichVersion}},
+ {Key: FlagWhichVersion, Name: "version", Flag: true, RequiresIfBoolean: true, Spelling: "--version", Conflicts: []uint64{FlagWhichPlugin}},
+ {Key: ArgWhichBinName, Name: "BIN_NAME", RequiredUnless: []uint64{FlagWhichComplete}},
+}
+
+// HelpText is the third table, read only when a page is rendered. Neither the
+// parser nor the post-binding rules touch it, and a CLI that never prints help
+// does not carry it: Go's linker drops an unreferenced table whole.
+//
+// Indexed by key, like the others.
+var HelpText = argv.HelpTable{
+ {Key: CmdRoot},
+ {Key: FlagContinueOnError, Hide: true, Short: "Continue running tasks even if one fails", Long: "Continue running tasks even if one fails"},
+ {Key: FlagCd, ValueName: "DIR", ValueDemanded: true, Short: "Change directory before running command", Long: "Change directory before running command"},
+ {Key: FlagEnv, Repeatable: true, ValueName: "ENV", ValueDemanded: true, Short: "Set the environment for loading `mise..toml`", Long: "Set the environment for loading `mise..toml`"},
+ {Key: FlagForce, Hide: true, Short: "Force the operation", Long: "Force the operation"},
+ {Key: FlagJobs, ValueName: "JOBS", ValueDemanded: true, Short: "How many jobs to run in parallel; values below 1 are treated as 1 [default: 8]", Long: "How many jobs to run in parallel; values below 1 are treated as 1 [default: 8]", Env: "MISE_JOBS"},
+ {Key: FlagDryRun, Hide: true, Short: "Dry run, don't actually do anything", Long: "Dry run, don't actually do anything"},
+ {Key: FlagProfile, Hide: true, Repeatable: true, ValueName: "PROFILE", ValueDemanded: true, Short: "Set the profile (environment)", Long: "Set the profile (environment)"},
+ {Key: FlagQuiet, Short: "Suppress non-error messages", Long: "Suppress non-error messages"},
+ {Key: FlagShell, Hide: true, ValueName: "SHELL", ValueDemanded: true},
+ {Key: FlagTool, Hide: true, Repeatable: true, ValueName: "TOOL@VERSION", ValueDemanded: true, Short: "Tool(s) to run in addition to what is in mise.toml files e.g.: node@20 python@3.10", Long: "Tool(s) to run in addition to what is in mise.toml files\ne.g.: node@20 python@3.10", Env: "MISE_QUIET"},
+ {Key: FlagVerbose, Repeatable: true, Short: "Show extra output (use -vv for even more)", Long: "Show extra output (use -vv for even more)"},
+ {Key: FlagVersion, Hide: true},
+ {Key: FlagYes, Short: "Answer yes to all confirmation prompts", Long: "Answer yes to all confirmation prompts"},
+ {Key: FlagDebug, Hide: true, Short: "Sets log level to debug", Long: "Sets log level to debug"},
+ {Key: FlagLogLevel, Hide: true, ValueName: "LEVEL", ValueDemanded: true, Choices: []string{"trace", "debug", "info", "warning", "error"}},
+ {Key: FlagNoConfig, Short: "Do not load any config files", Long: "Do not load any config files\n\nCan also use `MISE_NO_CONFIG=1`"},
+ {Key: FlagNoEnv, Short: "Do not load environment variables from config files", Long: "Do not load environment variables from config files\n\nCan also use `MISE_NO_ENV=1`"},
+ {Key: FlagNoHooks, Short: "Do not execute hooks from config files", Long: "Do not execute hooks from config files\n\nCan also use `MISE_NO_HOOKS=1`"},
+ {Key: FlagNoTimings, Hide: true, Short: "Hides elapsed time after each task completes", Long: "Hides elapsed time after each task completes\n\nDefault to always hide with `MISE_TASK_TIMINGS=0`"},
+ {Key: FlagOutput, ValueName: "OUTPUT", ValueDemanded: true},
+ {Key: FlagRaw, Short: "Read/write directly to stdin/stdout/stderr instead of by line", Long: "Read/write directly to stdin/stdout/stderr instead of by line"},
+ {Key: FlagLocked, Short: "Require lockfile URLs to be present during installation", Long: "Require lockfile URLs to be present during installation\n\nFails if tools don't have pre-resolved URLs in the lockfile for the current platform. This prevents API calls to GitHub, aqua registry, etc. Can also be enabled via MISE_LOCKED=1 or settings.locked=true"},
+ {Key: FlagSilent, Short: "Suppress all task output and mise non-error messages", Long: "Suppress all task output and mise non-error messages"},
+ {Key: FlagTimings, Hide: true, Short: "Shows elapsed time after each task completes", Long: "Shows elapsed time after each task completes\n\nDefault to always show with `MISE_TASK_TIMINGS=1`"},
+ {Key: FlagTrace, Hide: true, Short: "Sets log level to trace", Long: "Sets log level to trace"},
+ {Key: ArgTask, Short: "Task to run", Long: "Task to run.\n\nShorthand for `mise tasks run `."},
+ {Key: ArgTaskArgs, Hide: true, Short: "Task arguments", Long: "Task arguments"},
+ {Key: ArgTaskArgsLast, Hide: true},
+ {Key: CmdActivate, Short: "Initializes mise in the current shell session", Long: "Initializes mise in the current shell session\n\nThis should go into your shell's rc file or login shell. Otherwise, it will only take effect in the current session. (e.g. ~/.zshrc, ~/.zprofile, ~/.zshenv, ~/.bashrc, ~/.bash_profile, ~/.profile, ~/.config/fish/config.fish, or $PROFILE for powershell)\n\nTypically, this can be added with something like the following:\n\n echo 'eval \"$(mise activate zsh)\"' >> ~/.zshrc\n\nHowever, this requires that \"mise\" is in your PATH. If it is not, you need to specify the full path like this:\n\n echo 'eval \"$(/path/to/mise activate zsh)\"' >> ~/.zshrc\n\nCustomize status output with `status` settings.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1meval \"$(mise activate bash)\"\x1b[22m\n $ \x1b[1meval \"$(mise activate zsh)\"\x1b[22m\n $ \x1b[1mmise activate fish | source\x1b[22m\n $ \x1b[1mexecx($(mise activate xonsh))\x1b[22m\n $ \x1b[1m(&mise activate pwsh) | Out-String | Invoke-Expression\x1b[22m\n"},
+ {Key: FlagActivateQuiet, Short: "Suppress non-error messages", Long: "Suppress non-error messages"},
+ {Key: FlagActivateShell, Hide: true, ValueName: "SHELL", ValueDemanded: true, Short: "Shell type to generate the script for", Long: "Shell type to generate the script for", Choices: []string{"bash", "elvish", "fish", "nu", "xonsh", "zsh", "pwsh"}},
+ {Key: FlagActivateNoHookEnv, Short: "Do not automatically call hook-env", Long: "Do not automatically call hook-env\n\nThis can be helpful for debugging mise. If you run `eval \"$(mise activate --no-hook-env)\"`, then you can call `mise hook-env` manually which will output the env vars to stdout without actually modifying the environment. That way you can do things like `mise hook-env --trace` to get more information or just see the values that hook-env is outputting."},
+ {Key: FlagActivateShims, Short: "Use shims instead of modifying PATH\nEffectively the same as:", Long: "Use shims instead of modifying PATH\nEffectively the same as:\n\n PATH=\"$HOME/.local/share/mise/shims:$PATH\"\n\n`mise activate --shims` does not support all the features of `mise activate`.\nSee https://mise.jdx.dev/dev-tools/shims.html#shims-vs-path for more information"},
+ {Key: FlagActivateStatus, Hide: true, Short: "Show \"mise: @\" message when changing directories", Long: "Show \"mise: @\" message when changing directories"},
+ {Key: ArgActivateShellType, Short: "Shell type to generate the script for", Long: "Shell type to generate the script for", Choices: []string{"bash", "elvish", "fish", "nu", "xonsh", "zsh", "pwsh"}},
+ {Key: CmdToolAlias, Short: "Manage tool version aliases."},
+ {Key: FlagToolAliasTool, ValueName: "TOOL", ValueDemanded: true, Short: "Filter aliases by tool", Long: "Filter aliases by tool"},
+ {Key: FlagToolAliasNoHeader, Short: "Don't show table header", Long: "Don't show table header"},
+ {Key: CmdToolAliasGet, Short: "Show an alias for a tool", Long: "Show an alias for a tool\n\nThis is the contents of a tool_alias. entry in ~/.config/mise/config.toml", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise tool-alias get node lts-hydrogen\x1b[22m\n 20.0.0\n"},
+ {Key: ArgToolAliasGetTool, Demanded: true, Short: "The tool to show the alias for", Long: "The tool to show the alias for"},
+ {Key: ArgToolAliasGetAlias, Demanded: true, Short: "The alias to show", Long: "The alias to show"},
+ {Key: CmdToolAliasLs, Short: "List tool version aliases\nShows the aliases that can be specified.\nThese can come from user config or from plugins in `bin/list-aliases`.", Long: "List tool version aliases\nShows the aliases that can be specified.\nThese can come from user config or from plugins in `bin/list-aliases`.\n\nFor user config, aliases are defined like the following in `~/.config/mise/config.toml`:\n\n [tool_alias.node.versions]\n lts = \"22.0.0\"", VisibleAliases: []string{"list"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise tool-alias ls\x1b[22m\n node lts-jod 22\n"},
+ {Key: FlagToolAliasLsNoHeader, Short: "Don't show table header", Long: "Don't show table header"},
+ {Key: ArgToolAliasLsTool, Short: "Show aliases for ", Long: "Show aliases for "},
+ {Key: CmdToolAliasSet, Short: "Add/update an alias for a tool/backend", Long: "Add/update an alias for a tool/backend\n\nThis modifies the contents of ~/.config/mise/config.toml", VisibleAliases: []string{"add", "create"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise tool-alias set maven asdf:mise-plugins/mise-maven\x1b[22m\n $ \x1b[1mmise tool-alias set node lts-jod 22.0.0\x1b[22m\n"},
+ {Key: ArgToolAliasSetTool, Demanded: true, Short: "The tool/backend to set the alias for", Long: "The tool/backend to set the alias for"},
+ {Key: ArgToolAliasSetAlias, Demanded: true, Short: "The alias to set", Long: "The alias to set"},
+ {Key: ArgToolAliasSetValue, Short: "The value to set the alias to", Long: "The value to set the alias to"},
+ {Key: CmdToolAliasUnset, Short: "Clears an alias for a tool/backend", Long: "Clears an alias for a tool/backend\n\nThis modifies the contents of ~/.config/mise/config.toml", VisibleAliases: []string{"rm", "remove", "delete", "del"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise tool-alias unset maven\x1b[22m\n $ \x1b[1mmise tool-alias unset node lts-jod\x1b[22m\n"},
+ {Key: ArgToolAliasUnsetTool, Demanded: true, Short: "The tool/backend to remove the alias from", Long: "The tool/backend to remove the alias from"},
+ {Key: ArgToolAliasUnsetAlias, Short: "The alias to remove", Long: "The alias to remove"},
+ {Key: CmdAsdf, Hide: true, Short: "[internal] simulates asdf for plugins that call \"asdf\" internally"},
+ {Key: ArgAsdfArgs, Short: "all arguments", Long: "all arguments"},
+ {Key: CmdBackends, Short: "Manage backends", AfterLongHelp: "\x1b[1m\x1b[4mDeprecation:\x1b[22m\x1b[24m\n\nThe `mise b` alias is deprecated and will be removed in mise 2027.4.0.\nUse `mise backends` instead.\n"},
+ {Key: CmdBackendsLs, Short: "List built-in backends", VisibleAliases: []string{"list"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise backends ls\x1b[22m\n aqua\n asdf\n cargo\n core\n dotnet\n gem\n go\n npm\n pipx\n spm\n ubi\n vfox\n"},
+ {Key: CmdBinPaths, Short: "List all the active runtime bin paths"},
+ {Key: FlagBinPathsBinNames, Short: "Output executable names instead of bin directories", Long: "Output executable names instead of bin directories"},
+ {Key: FlagBinPathsJson, Short: "Output executable entries in JSON format (implies --bin-names)", Long: "Output executable entries in JSON format (implies --bin-names)"},
+ {Key: ArgBinPathsToolVersion, Short: "Tool(s) to look up\ne.g.: ruby@3", Long: "Tool(s) to look up\ne.g.: ruby@3"},
+ {Key: CmdBootstrap, Short: "Set up a machine for the current config in one command", Long: "Set up a machine for the current config in one command\n\nRuns the bootstrap steps for the current config in order:\n\n0. `mise bootstrap accounts apply` — converge `[bootstrap.users]` and\n `[bootstrap.groups]` (Linux)\n1. `mise bootstrap plugins apply` — install `[bootstrap.plugins]`\n 1.7. `[bootstrap.hooks.pre-packages]` — optional setup hook\n2. Install built-in-manager entries from `[bootstrap.packages]` 3. `mise bootstrap files apply` — converge `[bootstrap.files]` and\n `[bootstrap.directories]`\n4. `mise bootstrap services apply` — converge `[bootstrap.services]`\n systemd system services (Linux)\n5. `mise bootstrap firewall apply` — converge `[bootstrap.linux.firewall]`\n host firewall policy and rules (Linux)\n6. `mise bootstrap compose apply` — converge `[bootstrap.compose]`\n Docker Compose projects\n7. `mise bootstrap repos apply` — clone/converge `[bootstrap.repos]`\n surrounded by `pre-repos`/`post-repos` hooks\n8. `mise bootstrap dotfiles apply` — apply dotfiles from `[dotfiles]`\n surrounded by `pre-dotfiles`/`post-dotfiles` hooks\n9. `mise bootstrap mise-shell-activate apply` — configure shell activation\n from `[bootstrap.mise_shell_activate]`\n10. `mise bootstrap macos defaults apply` — write\n `[bootstrap.macos.defaults]` entries (macOS)\n surrounded by `pre-defaults`/`post-defaults` hooks\n11. `mise bootstrap macos launchd-agents apply` — install/load\n `[bootstrap.macos.launchd.agents]`\n12. `mise bootstrap linux systemd-units apply` — install/start\n `[bootstrap.linux.systemd.units]`\n13. `mise bootstrap user apply` — set `[bootstrap.user].login_shell`\n (Unix)\n surrounded by `pre-user`/`post-user` hooks\n14. `mise install` — install missing tools from `[tools]`\n surrounded by `pre-tools`/`post-tools` hooks; package-plugin entries\n from `[bootstrap.packages]` install afterward, followed by\n `[bootstrap.hooks.post-packages]`\n15. `mise run bootstrap` — if a task named `bootstrap` is defined 16. `[bootstrap.hooks.final]` — optional final hook\n\nThe declarative steps converge — anything already in its desired state is skipped, so re-running is safe. The `bootstrap` task runs on every invocation; keep it idempotent. Use it for any project-specific setup that doesn't fit the declarative sections (seeding databases, auth flows, etc.) — it runs with the installed tools on PATH.\n\nUse `--skip ` to skip named parts, or `--only ` to run just named parts. Both flags can be repeated or comma-separated, but they cannot be used together.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap\x1b[22m # packages + repos + dotfiles + tools + bootstrap task\n $ \x1b[1mmise bootstrap --force-dotfiles\x1b[22m # replace conflicting dotfile targets\n $ \x1b[1mmise bootstrap --skip tools,task\x1b[22m # skip tool installation and the bootstrap task\n $ \x1b[1mmise bootstrap --only tools\x1b[22m # run just tool installation\n $ \x1b[1mmise bootstrap status --missing\x1b[22m\n $ \x1b[1mmise bootstrap packages apply --yes\x1b[22m\n $ \x1b[1mmise bootstrap repos status\x1b[22m\n $ \x1b[1mmise bootstrap repos apply --dry-run\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles status\x1b[22m\n $ \x1b[1mmise bootstrap mise-shell-activate apply --dry-run\x1b[22m\n $ \x1b[1mmise bootstrap macos defaults status\x1b[22m\n $ \x1b[1mmise bootstrap macos launchd-agents apply --dry-run\x1b[22m\n $ \x1b[1mmise bootstrap linux systemd-units apply --dry-run\x1b[22m\n $ \x1b[1mmise bootstrap user apply --dry-run\x1b[22m\n"},
+ {Key: FlagBootstrapDryRun, Short: "Print what would happen without installing anything", Long: "Print what would happen without installing anything"},
+ {Key: FlagBootstrapYes, Short: "Skip confirmation prompts", Long: "Skip confirmation prompts"},
+ {Key: FlagBootstrapForceDotfiles, Short: "Overwrite existing files that conflict with whole-file dotfile entries", Long: "Overwrite existing files that conflict with whole-file dotfile entries"},
+ {Key: FlagBootstrapOnly, Repeatable: true, ValueName: "ONLY", ValueDemanded: true, Short: "Run only one or more bootstrap parts", Long: "Run only one or more bootstrap parts\n\nCan be passed multiple times or as a comma-separated list. Cannot be used with `--skip`.", Choices: []string{"plugins", "packages", "accounts", "files", "services", "firewall", "compose", "repos", "dotfiles", "mise-shell-activate", "macos-defaults", "macos-launchd-agents", "linux-systemd-units", "user", "tools", "task", "final-hook"}},
+ {Key: FlagBootstrapPromptSecrets, Short: "Prompt securely for missing bootstrap secret inputs", Long: "Prompt securely for missing bootstrap secret inputs"},
+ {Key: FlagBootstrapSkip, Repeatable: true, ValueName: "SKIP", ValueDemanded: true, Short: "Skip one or more bootstrap parts", Long: "Skip one or more bootstrap parts\n\nCan be passed multiple times or as a comma-separated list.", Choices: []string{"plugins", "packages", "accounts", "files", "services", "firewall", "compose", "repos", "dotfiles", "mise-shell-activate", "macos-defaults", "macos-launchd-agents", "linux-systemd-units", "user", "tools", "task", "final-hook"}},
+ {Key: FlagBootstrapUpdate, Short: "Refresh package manager metadata and update configured repos", Long: "Refresh package manager metadata and update configured repos"},
+ {Key: CmdBootstrapApplyAccountPlan, Hide: true},
+ {Key: CmdBootstrapApplyServicePlan, Hide: true},
+ {Key: CmdBootstrapApplyFirewallPlan, Hide: true},
+ {Key: CmdBootstrapApplySystemPlan, Hide: true},
+ {Key: CmdBootstrapInspectSystemFiles, Hide: true},
+ {Key: CmdBootstrapInspectFirewallPlan, Hide: true},
+ {Key: CmdBootstrapAccounts, Short: "Manage Linux users and groups from `[bootstrap.users]` and `[bootstrap.groups]`", SubcommandRequired: true},
+ {Key: CmdBootstrapAccountsApply, Short: "Apply configured Linux users and groups"},
+ {Key: FlagBootstrapAccountsApplyDryRun, Short: "Print what would change without changing anything", Long: "Print what would change without changing anything"},
+ {Key: FlagBootstrapAccountsApplyYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: CmdBootstrapAccountsStatus, Short: "Show configured Linux user and group state"},
+ {Key: FlagBootstrapAccountsStatusJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagBootstrapAccountsStatusMissing, Short: "Exit with code 1 when any account is not converged", Long: "Exit with code 1 when any account is not converged"},
+ {Key: CmdBootstrapCompose, Short: "Manage Docker Compose projects from `[bootstrap.compose]`", SubcommandRequired: true},
+ {Key: CmdBootstrapComposeApply, Short: "Apply configured Docker Compose project state"},
+ {Key: FlagBootstrapComposeApplyDryRun, Short: "Print what would change without changing anything", Long: "Print what would change without changing anything"},
+ {Key: FlagBootstrapComposeApplyYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: CmdBootstrapComposeStatus, Short: "Show configured Docker Compose project state"},
+ {Key: FlagBootstrapComposeStatusJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagBootstrapComposeStatusMissing, Short: "Exit with code 1 when any Compose project is not converged", Long: "Exit with code 1 when any Compose project is not converged"},
+ {Key: CmdBootstrapDotfiles, Short: "Manage dotfiles from `[dotfiles]`", SubcommandRequired: true},
+ {Key: CmdBootstrapDotfilesAdd, Short: "Add or update dotfiles in `[dotfiles]`", Long: "Add or update dotfiles in `[dotfiles]`\n\nIf the target is already managed, this updates its source from the live target. Otherwise it creates a `[dotfiles]` entry and seeds the source under `dotfiles.root` unless `--source` is provided.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap dotfiles add ~/.zshrc\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles add --mode copy ~/.config/starship.toml\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles add --source dotfiles/gitconfig ~/.gitconfig\x1b[22m\n"},
+ {Key: FlagBootstrapDotfilesAddForce, Short: "Overwrite existing sources without prompting", Long: "Overwrite existing sources without prompting"},
+ {Key: FlagBootstrapDotfilesAddGlobal, Short: "Write to the global config", Long: "Write to the global config"},
+ {Key: FlagBootstrapDotfilesAddLocal, Short: "Write to the local config instead of the global config", Long: "Write to the local config instead of the global config"},
+ {Key: FlagBootstrapDotfilesAddMode, ValueName: "MODE", ValueDemanded: true, Short: "Dotfile mode to write", Long: "Dotfile mode to write"},
+ {Key: FlagBootstrapDotfilesAddDryRun, Short: "Print the config/source updates without writing anything", Long: "Print the config/source updates without writing anything"},
+ {Key: FlagBootstrapDotfilesAddNoApply, Short: "Add the entry without applying it", Long: "Add the entry without applying it"},
+ {Key: FlagBootstrapDotfilesAddPath, ValueName: "PATH", ValueDemanded: true, Short: "Write to this config file or directory", Long: "Write to this config file or directory"},
+ {Key: FlagBootstrapDotfilesAddSource, ValueName: "PATH", ValueDemanded: true, Short: "Source path to use for a single target", Long: "Source path to use for a single target"},
+ {Key: FlagBootstrapDotfilesAddYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: ArgBootstrapDotfilesAddTarget, Demanded: true, Short: "Targets to add or update", Long: "Targets to add or update"},
+ {Key: CmdBootstrapDotfilesApply, Short: "Apply dotfiles from `[dotfiles]`", Long: "Apply dotfiles from `[dotfiles]`\n\nApplies configured whole-file entries and edits that aren't in their desired state. Whole-file entries may symlink, copy, or render templates. Edit entries manage a marker-delimited block or a single line in a file mise doesn't otherwise own.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap dotfiles apply\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles apply --dry-run\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles apply --force --yes\x1b[22m\n"},
+ {Key: FlagBootstrapDotfilesApplyForce, Short: "Overwrite existing files that conflict with whole-file dotfile entries", Long: "Overwrite existing files that conflict with whole-file dotfile entries"},
+ {Key: FlagBootstrapDotfilesApplyDryRun, Short: "Print the actions that would run without writing anything", Long: "Print the actions that would run without writing anything"},
+ {Key: FlagBootstrapDotfilesApplyYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: ArgBootstrapDotfilesApplyTarget, Short: "Only apply these targets", Long: "Only apply these targets"},
+ {Key: CmdBootstrapDotfilesEdit, Short: "Edit a managed dotfile source", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap dotfiles edit ~/.zshrc\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles edit --apply ~/.config/starship.toml\x1b[22m\n"},
+ {Key: FlagBootstrapDotfilesEditApply, Short: "Apply this target after the editor exits", Long: "Apply this target after the editor exits"},
+ {Key: FlagBootstrapDotfilesEditMode, ValueName: "MODE", ValueDemanded: true, Short: "Dotfile mode to use if the target is not yet managed", Long: "Dotfile mode to use if the target is not yet managed"},
+ {Key: FlagBootstrapDotfilesEditSource, ValueName: "PATH", ValueDemanded: true, Short: "Source path to use if the target is not yet managed", Long: "Source path to use if the target is not yet managed"},
+ {Key: FlagBootstrapDotfilesEditYes, Short: "Skip the confirmation prompt when adding an unmanaged target", Long: "Skip the confirmation prompt when adding an unmanaged target"},
+ {Key: ArgBootstrapDotfilesEditTarget, Demanded: true, Short: "Target to edit", Long: "Target to edit"},
+ {Key: CmdBootstrapDotfilesStatus, Short: "Show the status of dotfiles from `[dotfiles]`", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap dotfiles status\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles status ~/.zshrc\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles status --json\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles status --missing\x1b[22m # exit 1 if anything is out of sync\n"},
+ {Key: FlagBootstrapDotfilesStatusJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagBootstrapDotfilesStatusMissing, Short: "Exit with code 1 if any configured dotfiles are not in their desired\nstate (missing, source missing, differs)", Long: "Exit with code 1 if any configured dotfiles are not in their desired\nstate (missing, source missing, differs)"},
+ {Key: ArgBootstrapDotfilesStatusTarget, Short: "Only show these targets", Long: "Only show these targets"},
+ {Key: CmdBootstrapDotfilesUnapply, Short: "Remove dotfiles applied from `[dotfiles]`", Long: "Remove dotfiles applied from `[dotfiles]`\n\nRemoves configured whole-file entries and edits while preserving files mise cannot identify as managed. Modified copies, templates, and plain-line edits require `--force`.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap dotfiles unapply\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles unapply ~/.zshrc\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles unapply --dry-run\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles unapply --force --yes\x1b[22m\n"},
+ {Key: FlagBootstrapDotfilesUnapplyForce, Short: "Remove modified or otherwise ambiguous managed files and lines", Long: "Remove modified or otherwise ambiguous managed files and lines"},
+ {Key: FlagBootstrapDotfilesUnapplyDryRun, Short: "Print the actions that would run without writing anything", Long: "Print the actions that would run without writing anything"},
+ {Key: FlagBootstrapDotfilesUnapplyYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: ArgBootstrapDotfilesUnapplyTarget, Short: "Only unapply these targets", Long: "Only unapply these targets"},
+ {Key: CmdBootstrapFiles, Short: "Manage privileged files and directories from `[bootstrap.files]` and `[bootstrap.directories]`", SubcommandRequired: true},
+ {Key: CmdBootstrapFilesApply, Short: "Apply configured privileged files and directories"},
+ {Key: FlagBootstrapFilesApplyDryRun, Short: "Print what would change without changing anything", Long: "Print what would change without changing anything"},
+ {Key: FlagBootstrapFilesApplyYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: FlagBootstrapFilesApplyPromptSecrets, Short: "Prompt securely for missing bootstrap secret inputs", Long: "Prompt securely for missing bootstrap secret inputs"},
+ {Key: CmdBootstrapFilesStatus, Short: "Show configured privileged file and directory state"},
+ {Key: FlagBootstrapFilesStatusJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagBootstrapFilesStatusMissing, Short: "Exit with code 1 when any resource is not converged", Long: "Exit with code 1 when any resource is not converged"},
+ {Key: FlagBootstrapFilesStatusPromptSecrets, Short: "Prompt securely for missing bootstrap secret inputs", Long: "Prompt securely for missing bootstrap secret inputs"},
+ {Key: CmdBootstrapFirewall, Short: "Manage the Linux host firewall from `[bootstrap.linux.firewall]`", SubcommandRequired: true},
+ {Key: CmdBootstrapFirewallApply, Short: "Apply the configured Linux host firewall"},
+ {Key: FlagBootstrapFirewallApplyDryRun, Short: "Print what would change without changing anything", Long: "Print what would change without changing anything"},
+ {Key: FlagBootstrapFirewallApplyYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: CmdBootstrapFirewallStatus, Short: "Show configured Linux host firewall state"},
+ {Key: FlagBootstrapFirewallStatusJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagBootstrapFirewallStatusMissing, Short: "Exit with code 1 when the firewall is not converged", Long: "Exit with code 1 when the firewall is not converged"},
+ {Key: CmdBootstrapLaunchd, Hide: true, Short: "Manage macOS LaunchAgents from `[bootstrap.macos.launchd.agents]`", SubcommandRequired: true},
+ {Key: CmdBootstrapLaunchdApply},
+ {Key: FlagBootstrapLaunchdApplyDryRun, Short: "Print the commands that would run without running them", Long: "Print the commands that would run without running them"},
+ {Key: FlagBootstrapLaunchdApplyYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: CmdBootstrapLaunchdStatus},
+ {Key: FlagBootstrapLaunchdStatusJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagBootstrapLaunchdStatusMissing, Short: "Exit with code 1 if any configured LaunchAgent is not in its desired state", Long: "Exit with code 1 if any configured LaunchAgent is not in its desired state"},
+ {Key: CmdBootstrapLinux, Short: "Manage Linux bootstrap config from `[bootstrap.linux]`", SubcommandRequired: true},
+ {Key: CmdBootstrapLinuxSystemdUnits, Short: "Manage systemd user services from `[bootstrap.linux.systemd.units]`", SubcommandRequired: true},
+ {Key: CmdBootstrapLinuxSystemdUnitsApply},
+ {Key: FlagBootstrapLinuxSystemdUnitsApplyDryRun, Short: "Print the commands that would run without running them", Long: "Print the commands that would run without running them"},
+ {Key: FlagBootstrapLinuxSystemdUnitsApplyYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: CmdBootstrapLinuxSystemdUnitsStatus},
+ {Key: FlagBootstrapLinuxSystemdUnitsStatusJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagBootstrapLinuxSystemdUnitsStatusMissing, Short: "Exit with code 1 if any configured systemd user service is not in its desired state", Long: "Exit with code 1 if any configured systemd user service is not in its desired state"},
+ {Key: CmdBootstrapMacos, Short: "Manage macOS bootstrap config from `[bootstrap.macos]`", SubcommandRequired: true},
+ {Key: CmdBootstrapMacosDefaults, Short: "Manage macOS defaults from `[bootstrap.macos.defaults]`", SubcommandRequired: true},
+ {Key: CmdBootstrapMacosDefaultsApply},
+ {Key: FlagBootstrapMacosDefaultsApplyDryRun, Short: "Print the commands that would run without running them", Long: "Print the commands that would run without running them"},
+ {Key: FlagBootstrapMacosDefaultsApplyYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: CmdBootstrapMacosDefaultsStatus},
+ {Key: FlagBootstrapMacosDefaultsStatusJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagBootstrapMacosDefaultsStatusMissing, Short: "Exit with code 1 if any configured defaults are not in their desired state", Long: "Exit with code 1 if any configured defaults are not in their desired state"},
+ {Key: CmdBootstrapMacosLaunchdAgents, Short: "Manage macOS LaunchAgents from `[bootstrap.macos.launchd.agents]`", SubcommandRequired: true},
+ {Key: CmdBootstrapMacosLaunchdAgentsApply},
+ {Key: FlagBootstrapMacosLaunchdAgentsApplyDryRun, Short: "Print the commands that would run without running them", Long: "Print the commands that would run without running them"},
+ {Key: FlagBootstrapMacosLaunchdAgentsApplyYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: CmdBootstrapMacosLaunchdAgentsStatus},
+ {Key: FlagBootstrapMacosLaunchdAgentsStatusJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagBootstrapMacosLaunchdAgentsStatusMissing, Short: "Exit with code 1 if any configured LaunchAgent is not in its desired state", Long: "Exit with code 1 if any configured LaunchAgent is not in its desired state"},
+ {Key: CmdBootstrapMacosDefaults2, Hide: true, Short: "Manage macOS defaults from `[bootstrap.macos.defaults]`", SubcommandRequired: true},
+ {Key: CmdBootstrapMacosDefaultsApply2},
+ {Key: FlagBootstrapMacosDefaultsApplyDryRun2, Short: "Print the commands that would run without running them", Long: "Print the commands that would run without running them"},
+ {Key: FlagBootstrapMacosDefaultsApplyYes2, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: CmdBootstrapMacosDefaultsStatus2},
+ {Key: FlagBootstrapMacosDefaultsStatusJson2, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagBootstrapMacosDefaultsStatusMissing2, Short: "Exit with code 1 if any configured defaults are not in their desired state", Long: "Exit with code 1 if any configured defaults are not in their desired state"},
+ {Key: CmdBootstrapMiseShellActivate, Short: "Manage mise shell activation from `[bootstrap.mise_shell_activate]`", SubcommandRequired: true},
+ {Key: CmdBootstrapMiseShellActivateApply},
+ {Key: FlagBootstrapMiseShellActivateApplyDryRun, Short: "Print the actions that would run without writing anything", Long: "Print the actions that would run without writing anything"},
+ {Key: FlagBootstrapMiseShellActivateApplyYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: CmdBootstrapMiseShellActivateStatus},
+ {Key: FlagBootstrapMiseShellActivateStatusJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagBootstrapMiseShellActivateStatusMissing, Short: "Exit with code 1 if any configured shell activation is not in its desired state", Long: "Exit with code 1 if any configured shell activation is not in its desired state"},
+ {Key: CmdBootstrapPackages, Short: "Manage bootstrap system packages from `[bootstrap.packages]`", SubcommandRequired: true},
+ {Key: CmdBootstrapPackagesApply, Short: "Apply system packages from `[bootstrap.packages]`", Long: "Apply system packages from `[bootstrap.packages]`\n\nChecks which configured packages are missing and installs them with the system package manager. Built-in system managers may elevate with sudo when not running as root (see `system_packages.sudo`); package plugins never do.\n\nPackages can also be given explicitly in `manager:package` form (e.g. `apk:zlib-dev`, `apt:curl`, `brew:jq`); they are installed whether or not they appear in the config. Explicit packages and `--manager` scope the run to packages only. `install` is accepted as an alias for this command.", VisibleAliases: []string{"i"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap packages apply\x1b[22m\n $ \x1b[1mmise bootstrap packages apply apk:zlib-dev apt:curl brew:jq brew-cask:firefox flatpak:org.mozilla.firefox flatpak-user:org.gnome.Builder mas:497799835\x1b[22m\n $ \x1b[1mmise bootstrap packages apply --dry-run\x1b[22m\n $ \x1b[1mmise bootstrap packages apply --manager apt --yes\x1b[22m\n"},
+ {Key: FlagBootstrapPackagesApplyManager, ValueName: "MANAGER", ValueDemanded: true, Short: "Only install packages for this built-in or plugin manager", Long: "Only install packages for this built-in or plugin manager"},
+ {Key: FlagBootstrapPackagesApplyDryRun, Short: "Print the commands that would run without running them", Long: "Print the commands that would run without running them"},
+ {Key: FlagBootstrapPackagesApplyYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: FlagBootstrapPackagesApplyUpdate, Short: "Refresh package manager metadata first (apk: `--update-cache`, apt: `apt-get update`)", Long: "Refresh package manager metadata first (apk: `--update-cache`, apt: `apt-get update`)"},
+ {Key: ArgBootstrapPackagesApplyPackage, Short: "Packages in `manager:package` form; defaults to everything configured in [bootstrap.packages]", Long: "Packages in `manager:package` form; defaults to everything configured\nin [bootstrap.packages]"},
+ {Key: CmdBootstrapPackagesBrew, Short: "Manage Homebrew taps used by bootstrap packages", Long: "Manage Homebrew taps used by bootstrap packages\n\nThese commands edit `[bootstrap.brew.taps]` so tapped formulae and casks can be fetched directly by mise without a Homebrew installation.", SubcommandRequired: true},
+ {Key: CmdBootstrapPackagesBrewTap, Short: "Add a Homebrew tap URL to [bootstrap.brew.taps]", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap packages brew tap railwaycat/emacsmacport\x1b[22m\n $ \x1b[1mmise bootstrap packages brew tap acme/tools https://github.com/acme/homebrew-tools.git\x1b[22m\n"},
+ {Key: FlagBootstrapPackagesBrewTapLocal, Short: "Write to the local config instead of the global config", Long: "Write to the local config instead of the global config"},
+ {Key: FlagBootstrapPackagesBrewTapDryRun, Short: "Print the config change without writing it", Long: "Print the config change without writing it"},
+ {Key: FlagBootstrapPackagesBrewTapPath, ValueName: "PATH", ValueDemanded: true, Short: "Write to this config file or directory", Long: "Write to this config file or directory"},
+ {Key: ArgBootstrapPackagesBrewTapTap, Demanded: true, Short: "Tap name, e.g. `owner/repo`", Long: "Tap name, e.g. `owner/repo`"},
+ {Key: ArgBootstrapPackagesBrewTapUrl, Short: "GitHub URL for the tap. Defaults to https://github.com//homebrew-.git", Long: "GitHub URL for the tap. Defaults to https://github.com//homebrew-.git"},
+ {Key: CmdBootstrapPackagesBrewUntap, Short: "Remove Homebrew tap URLs from [bootstrap.brew.taps]", VisibleAliases: []string{"remove", "rm"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap packages brew untap railwaycat/emacsmacport\x1b[22m\n"},
+ {Key: FlagBootstrapPackagesBrewUntapLocal, Short: "Write to the local config instead of the global config", Long: "Write to the local config instead of the global config"},
+ {Key: FlagBootstrapPackagesBrewUntapDryRun, Short: "Print the config change without writing it", Long: "Print the config change without writing it"},
+ {Key: FlagBootstrapPackagesBrewUntapPath, ValueName: "PATH", ValueDemanded: true, Short: "Write to this config file or directory", Long: "Write to this config file or directory"},
+ {Key: ArgBootstrapPackagesBrewUntapTaps, Demanded: true, Short: "Tap name(s), e.g. `owner/repo`", Long: "Tap name(s), e.g. `owner/repo`"},
+ {Key: CmdBootstrapPackagesImport, Short: "Import installed system packages into `[bootstrap.packages]`", Long: "Import installed system packages into `[bootstrap.packages]`\n\nCurrently supports Homebrew formulae only. By default, imports linked formulae whose active keg receipt says they were installed on request. Pass `--all` to import every linked formula, including dependencies.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap packages import --manager brew\x1b[22m\n $ \x1b[1mmise bootstrap packages import --manager brew --all\x1b[22m\n $ \x1b[1mmise bootstrap packages import --manager brew --global\x1b[22m\n $ \x1b[1mmise bootstrap packages import --manager brew --dry-run\x1b[22m\n"},
+ {Key: FlagBootstrapPackagesImportEnv, ValueName: "ENV", ValueDemanded: true, Short: "Write to the config file for this environment (mise..toml)", Long: "Write to the config file for this environment (mise..toml)"},
+ {Key: FlagBootstrapPackagesImportGlobal, Short: "Write to the global config (~/.config/mise/config.toml)", Long: "Write to the global config (~/.config/mise/config.toml)"},
+ {Key: FlagBootstrapPackagesImportManager, ValueName: "MANAGER", ValueDemanded: true, Short: "Only import packages for this manager. Currently only `brew` is supported.", Long: "Only import packages for this manager. Currently only `brew` is supported.", Choices: []string{"brew"}, Default: []string{"brew"}},
+ {Key: FlagBootstrapPackagesImportAll, Short: "Import every linked formula, including dependencies", Long: "Import every linked formula, including dependencies"},
+ {Key: FlagBootstrapPackagesImportDryRun, Short: "Print the config change without writing config", Long: "Print the config change without writing config"},
+ {Key: FlagBootstrapPackagesImportPath, ValueName: "PATH", ValueDemanded: true, Short: "Write to this config file or directory", Long: "Write to this config file or directory"},
+ {Key: CmdBootstrapPackagesPrune, Short: "Prune installed system packages no longer declared in `[bootstrap.packages]`", Long: "Prune installed system packages no longer declared in `[bootstrap.packages]`\n\nSupports Homebrew formulae and conservatively removable, mise-owned casks. Pruning keeps packages needed by the current config or by trusted, loadable tracked configs.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap packages prune --manager brew\x1b[22m\n $ \x1b[1mmise bootstrap packages prune --manager brew --dry-run\x1b[22m\n $ \x1b[1mmise bootstrap packages prune --manager brew --yes\x1b[22m\n $ \x1b[1mmise bootstrap packages prune --manager brew-cask --dry-run\x1b[22m\n"},
+ {Key: FlagBootstrapPackagesPruneManager, ValueName: "MANAGER", ValueDemanded: true, Short: "Only prune packages for this manager", Long: "Only prune packages for this manager", Choices: []string{"brew", "brew-cask"}, Default: []string{"brew"}},
+ {Key: FlagBootstrapPackagesPruneDryRun, Short: "Print what would be removed without deleting anything", Long: "Print what would be removed without deleting anything"},
+ {Key: FlagBootstrapPackagesPruneYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: CmdBootstrapPackagesStatus, Short: "Show the status of system packages from `[bootstrap.packages]`", VisibleAliases: []string{"ls"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap packages status\x1b[22m\n $ \x1b[1mmise bootstrap packages status --json\x1b[22m\n $ \x1b[1mmise bootstrap packages status --missing\x1b[22m # exit 1 if anything is out of sync\n"},
+ {Key: FlagBootstrapPackagesStatusJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagBootstrapPackagesStatusMissing, Short: "Exit with code 1 if any configured packages are not in their desired state", Long: "Exit with code 1 if any configured packages are not in their desired state"},
+ {Key: CmdBootstrapPackagesUpgrade, Short: "Upgrade installed bootstrap packages from `[bootstrap.packages]`", Long: "Upgrade installed bootstrap packages from `[bootstrap.packages]`\n\nRefreshes package manager metadata and upgrades the configured packages that are already installed: apk/apt/dnf/pacman upgrade to the newest available version (apk, apt, and dnf honor a version pinned in config), brew pours the formula's current bottle and replaces the old keg, brew-cask installs the current cask artifact, flatpak and flatpak-user update applications and runtimes, and mas upgrades App Store apps. Packages that are not installed yet are skipped — use `mise bootstrap packages apply` for those.\n\nPackages can also be given explicitly in `manager:package` form.", VisibleAliases: []string{"up"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap packages upgrade\x1b[22m\n $ \x1b[1mmise bootstrap packages upgrade brew:postgresql@17\x1b[22m\n $ \x1b[1mmise bootstrap packages upgrade --manager brew-cask\x1b[22m\n $ \x1b[1mmise bootstrap packages upgrade --manager mas\x1b[22m\n $ \x1b[1mmise bootstrap packages upgrade --manager apt --yes\x1b[22m\n $ \x1b[1mmise bootstrap packages upgrade --dry-run\x1b[22m\n"},
+ {Key: FlagBootstrapPackagesUpgradeManager, ValueName: "MANAGER", ValueDemanded: true, Short: "Only upgrade packages for this built-in or plugin manager", Long: "Only upgrade packages for this built-in or plugin manager"},
+ {Key: FlagBootstrapPackagesUpgradeDryRun, Short: "Print the commands that would run without running them", Long: "Print the commands that would run without running them"},
+ {Key: FlagBootstrapPackagesUpgradeYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: ArgBootstrapPackagesUpgradePackage, Short: "Packages in `manager:package` form; defaults to everything configured in [bootstrap.packages]", Long: "Packages in `manager:package` form; defaults to everything configured\nin [bootstrap.packages]"},
+ {Key: CmdBootstrapPackagesUse, Short: "Add bootstrap packages to [bootstrap.packages] and install them", Long: "Add bootstrap packages to [bootstrap.packages] and install them\n\nLike `mise use` for tools: writes `\"manager:package\" = \"version\"` entries to mise.toml (the local config by default, the global one with `-g`) and then installs whatever is missing.\n\nVersions are pinned with `@`: `mise bootstrap packages use apt:curl@8.5.0-2`. Without `@` (or with `@latest`) no pin is written. brew formulae and casks version through their names instead (for example `brew:postgresql@17`, `brew-cask:temurin@17`), where `@` is part of the Homebrew name rather than a mise version selector. mas uses numeric ADAM IDs and does not support pins.", VisibleAliases: []string{"u"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap packages use apk:zlib-dev apt:curl brew:jq brew-cask:firefox flatpak:org.mozilla.firefox flatpak-user:org.gnome.Builder mas:497799835\x1b[22m\n $ \x1b[1mmise bootstrap packages use -g brew:postgresql@17\x1b[22m\n $ \x1b[1mmise bootstrap packages use apt:curl@8.5.0-2\x1b[22m\n"},
+ {Key: FlagBootstrapPackagesUseEnv, ValueName: "ENV", ValueDemanded: true, Short: "Write to the config file for this environment (mise..toml)", Long: "Write to the config file for this environment (mise..toml)"},
+ {Key: FlagBootstrapPackagesUseGlobal, Short: "Write to the global config (~/.config/mise/config.toml) instead of the local one", Long: "Write to the global config (~/.config/mise/config.toml) instead of the\nlocal one"},
+ {Key: FlagBootstrapPackagesUseDryRun, Short: "Print the commands that would run without writing config or installing", Long: "Print the commands that would run without writing config or installing"},
+ {Key: FlagBootstrapPackagesUsePath, ValueName: "PATH", ValueDemanded: true, Short: "Write to this config file or directory", Long: "Write to this config file or directory"},
+ {Key: FlagBootstrapPackagesUseYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: ArgBootstrapPackagesUsePackage, Demanded: true, Short: "Packages in `manager:package[@version]` form", Long: "Packages in `manager:package[@version]` form"},
+ {Key: CmdBootstrapPlan, Short: "Show the changes declarative bootstrap resources would make"},
+ {Key: FlagBootstrapPlanJson, Short: "Output a stable machine-readable plan in JSON format", Long: "Output a stable machine-readable plan in JSON format"},
+ {Key: FlagBootstrapPlanDetailedExitcode, Short: "Exit 2 when the plan contains changes, 0 when unchanged, and 1 on errors", Long: "Exit 2 when the plan contains changes, 0 when unchanged, and 1 on errors"},
+ {Key: FlagBootstrapPlanPromptSecrets, Short: "Prompt securely for missing bootstrap secret inputs", Long: "Prompt securely for missing bootstrap secret inputs"},
+ {Key: CmdBootstrapPlugins, Short: "Manage package manager plugins declared in `[bootstrap.plugins]`", SubcommandRequired: true},
+ {Key: CmdBootstrapPluginsApply},
+ {Key: FlagBootstrapPluginsApplyDryRun, Short: "Print what would happen without installing plugins", Long: "Print what would happen without installing plugins"},
+ {Key: CmdBootstrapPluginsStatus},
+ {Key: FlagBootstrapPluginsStatusMissing, Short: "Exit with code 1 if a declared plugin is missing", Long: "Exit with code 1 if a declared plugin is missing"},
+ {Key: CmdBootstrapRemote, Short: "Bootstrap one or more machines over OpenSSH"},
+ {Key: FlagBootstrapRemoteAll, Short: "Select every configured inventory host", Long: "Select every configured inventory host"},
+ {Key: FlagBootstrapRemoteBootstrapCommand, ValueName: "COMMAND", ValueDemanded: true, Short: "Explicit remote shell command that installs mise and places it on PATH", Long: "Explicit remote shell command that installs mise and places it on PATH"},
+ {Key: FlagBootstrapRemoteConnectTimeout, ValueName: "CONNECT_TIMEOUT", ValueDemanded: true, Short: "SSH connection timeout in seconds", Long: "SSH connection timeout in seconds", Default: []string{"10"}},
+ {Key: FlagBootstrapRemoteCopyLink, Repeatable: true, ValueName: "PATH", ValueDemanded: true, Short: "Dereference one source-relative symbolic link; repeat for multiple links", Long: "Dereference one source-relative symbolic link; repeat for multiple links"},
+ {Key: FlagBootstrapRemoteCopyLinks, Short: "Dereference every symbolic link in the source archive", Long: "Dereference every symbolic link in the source archive"},
+ {Key: FlagBootstrapRemoteExclude, Repeatable: true, ValueName: "PATTERN", ValueDemanded: true, Short: "Additional archive pattern to exclude; repeat for multiple patterns", Long: "Additional archive pattern to exclude; repeat for multiple patterns"},
+ {Key: FlagBootstrapRemoteFailFast, Short: "Stop after the first failed target", Long: "Stop after the first failed target"},
+ {Key: FlagBootstrapRemoteForceDotfiles, Short: "Allow remote dotfile conflicts to be replaced", Long: "Allow remote dotfile conflicts to be replaced"},
+ {Key: FlagBootstrapRemoteHost, Repeatable: true, ValueName: "[USER@]HOST", ValueDemanded: true, Short: "Ad-hoc SSH destination (`[user@]host`); repeat for multiple hosts", Long: "Ad-hoc SSH destination (`[user@]host`); repeat for multiple hosts"},
+ {Key: FlagBootstrapRemoteIdentityFile, ValueName: "IDENTITY_FILE", ValueDemanded: true, Short: "SSH identity file override", Long: "SSH identity file override"},
+ {Key: FlagBootstrapRemoteDryRun, Short: "Print the remote bootstrap changes without applying them", Long: "Print the remote bootstrap changes without applying them"},
+ {Key: FlagBootstrapRemoteKeepStaging, Short: "Keep the remote staging directory for debugging", Long: "Keep the remote staging directory for debugging"},
+ {Key: FlagBootstrapRemoteMiseBin, ValueName: "MISE_BIN", ValueDemanded: true, Short: "Local mise binary to upload (escape hatch for custom architectures)", Long: "Local mise binary to upload (escape hatch for custom architectures)"},
+ {Key: FlagBootstrapRemoteOnly, Repeatable: true, ValueName: "ONLY", ValueDemanded: true, Short: "Run only one or more remote bootstrap parts", Long: "Run only one or more remote bootstrap parts", Choices: []string{"plugins", "packages", "accounts", "files", "services", "firewall", "compose", "repos", "dotfiles", "mise-shell-activate", "macos-defaults", "macos-launchd-agents", "linux-systemd-units", "user", "tools", "task", "final-hook"}},
+ {Key: FlagBootstrapRemotePort, ValueName: "PORT", ValueDemanded: true, Short: "SSH port override", Long: "SSH port override"},
+ {Key: FlagBootstrapRemotePromptSecrets, Short: "Prompt securely for missing secret inputs on the remote host", Long: "Prompt securely for missing secret inputs on the remote host"},
+ {Key: FlagBootstrapRemoteRemoteEnv, Repeatable: true, ValueName: "ENV", ValueDemanded: true, Short: "Config environments to load on the remote host; repeat or delimit with commas (for example, ci,dotfiles)", Long: "Config environments to load on the remote host; repeat or delimit with commas (for example, ci,dotfiles)"},
+ {Key: FlagBootstrapRemoteRemoteMise, ValueName: "COMMAND", ValueDemanded: true, Short: "Existing mise executable name or path; relative paths use the staged project", Long: "Existing mise executable name or path; relative paths use the staged project"},
+ {Key: FlagBootstrapRemoteSkip, Repeatable: true, ValueName: "SKIP", ValueDemanded: true, Short: "Skip one or more remote bootstrap parts", Long: "Skip one or more remote bootstrap parts", Choices: []string{"plugins", "packages", "accounts", "files", "services", "firewall", "compose", "repos", "dotfiles", "mise-shell-activate", "macos-defaults", "macos-launchd-agents", "linux-systemd-units", "user", "tools", "task", "final-hook"}},
+ {Key: FlagBootstrapRemoteSource, ValueName: "SOURCE", ValueDemanded: true, Short: "Local directory archived and sent to each target", Long: "Local directory archived and sent to each target"},
+ {Key: FlagBootstrapRemoteSshOption, Repeatable: true, ValueName: "OPTION", ValueDemanded: true, Short: "OpenSSH `-o` option; repeat for multiple options", Long: "OpenSSH `-o` option; repeat for multiple options"},
+ {Key: FlagBootstrapRemoteTag, Repeatable: true, ValueName: "TAG", ValueDemanded: true, Short: "Select configured hosts with this tag; repeat to match any tag", Long: "Select configured hosts with this tag; repeat to match any tag"},
+ {Key: FlagBootstrapRemoteUpdate, Short: "Refresh package manager metadata and update configured repos remotely", Long: "Refresh package manager metadata and update configured repos remotely"},
+ {Key: FlagBootstrapRemoteYes, Short: "Skip remote confirmation prompts", Long: "Skip remote confirmation prompts"},
+ {Key: ArgBootstrapRemoteTarget, Short: "Inventory host names from `[bootstrap.remote.hosts]`", Long: "Inventory host names from `[bootstrap.remote.hosts]`"},
+ {Key: CmdBootstrapRepos, Short: "Manage git repo checkouts from `[bootstrap.repos]`", SubcommandRequired: true},
+ {Key: CmdBootstrapReposApply},
+ {Key: FlagBootstrapReposApplyDryRun, Short: "Print the commands that would run without running them", Long: "Print the commands that would run without running them"},
+ {Key: FlagBootstrapReposApplyYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: CmdBootstrapReposExec},
+ {Key: FlagBootstrapReposExecContinueOnError, Short: "Continue running in other repos after a command fails", Long: "Continue running in other repos after a command fails"},
+ {Key: FlagBootstrapReposExecDryRun, Short: "Print the commands that would run without running them", Long: "Print the commands that would run without running them"},
+ {Key: ArgBootstrapReposExecPath, Short: "Run only in matching configured or expanded paths", Long: "Run only in matching configured or expanded paths"},
+ {Key: ArgBootstrapReposExecCommand, Demanded: true, Short: "Command and arguments to run in each repo", Long: "Command and arguments to run in each repo"},
+ {Key: CmdBootstrapReposStatus},
+ {Key: FlagBootstrapReposStatusJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagBootstrapReposStatusMissing, Short: "Exit with code 1 if any configured repo is not in its desired state", Long: "Exit with code 1 if any configured repo is not in its desired state"},
+ {Key: CmdBootstrapReposUpdate},
+ {Key: FlagBootstrapReposUpdateDryRun, Short: "Print the commands that would run without running them", Long: "Print the commands that would run without running them"},
+ {Key: FlagBootstrapReposUpdateYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: ArgBootstrapReposUpdatePath, Short: "Update only matching configured or expanded paths", Long: "Update only matching configured or expanded paths"},
+ {Key: CmdBootstrapSecrets, Short: "Inspect bootstrap secret inputs without revealing their values", SubcommandRequired: true},
+ {Key: CmdBootstrapSecretsStatus, Short: "Show whether declared bootstrap secret inputs are available"},
+ {Key: FlagBootstrapSecretsStatusJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagBootstrapSecretsStatusMissing, Short: "Exit with code 1 if a declared secret input is unavailable", Long: "Exit with code 1 if a declared secret input is unavailable"},
+ {Key: CmdBootstrapServices, Short: "Manage Linux system services from `[bootstrap.services]`", SubcommandRequired: true},
+ {Key: CmdBootstrapServicesApply, Short: "Apply configured Linux system service state"},
+ {Key: FlagBootstrapServicesApplyDryRun, Short: "Print what would change without changing anything", Long: "Print what would change without changing anything"},
+ {Key: FlagBootstrapServicesApplyYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: CmdBootstrapServicesStatus, Short: "Show configured Linux system service state"},
+ {Key: FlagBootstrapServicesStatusJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagBootstrapServicesStatusMissing, Short: "Exit with code 1 when any service is not converged", Long: "Exit with code 1 when any service is not converged"},
+ {Key: CmdBootstrapStatus, Short: "Show the aggregate bootstrap status", VisibleAliases: []string{"ls"}},
+ {Key: FlagBootstrapStatusJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagBootstrapStatusMissing, Short: "Exit with code 1 if any configured bootstrap state is not in its desired state", Long: "Exit with code 1 if any configured bootstrap state is not in its desired state"},
+ {Key: FlagBootstrapStatusPromptSecrets, Short: "Prompt securely for missing bootstrap secret inputs", Long: "Prompt securely for missing bootstrap secret inputs"},
+ {Key: CmdBootstrapSystemd, Hide: true, Short: "Manage systemd user services from `[bootstrap.linux.systemd.units]`", SubcommandRequired: true},
+ {Key: CmdBootstrapSystemdApply},
+ {Key: FlagBootstrapSystemdApplyDryRun, Short: "Print the commands that would run without running them", Long: "Print the commands that would run without running them"},
+ {Key: FlagBootstrapSystemdApplyYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: CmdBootstrapSystemdStatus},
+ {Key: FlagBootstrapSystemdStatusJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagBootstrapSystemdStatusMissing, Short: "Exit with code 1 if any configured systemd user service is not in its desired state", Long: "Exit with code 1 if any configured systemd user service is not in its desired state"},
+ {Key: CmdBootstrapUser, Short: "Manage current-user bootstrap settings from `[bootstrap.user]`", SubcommandRequired: true},
+ {Key: CmdBootstrapUserApply},
+ {Key: FlagBootstrapUserApplyDryRun, Short: "Print the commands that would run without running them", Long: "Print the commands that would run without running them"},
+ {Key: FlagBootstrapUserApplyYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: CmdBootstrapUserStatus},
+ {Key: FlagBootstrapUserStatusJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagBootstrapUserStatusMissing, Short: "Exit with code 1 if any configured user setting is not in its desired state", Long: "Exit with code 1 if any configured user setting is not in its desired state"},
+ {Key: CmdCache, Short: "Manage the mise cache", Long: "Manage the mise cache\n\nRun `mise cache` with no args to view the current cache directory."},
+ {Key: CmdCacheClear, Short: "Deletes all cache files in mise", VisibleAliases: []string{"c"}},
+ {Key: FlagCacheClearOutdate, Hide: true, Short: "Mark all cache files as old", Long: "Mark all cache files as old"},
+ {Key: FlagCacheClearTask, ValueName: "TASK", ValueDemanded: true, Short: "Clear output cache entries for a task name or pattern", Long: "Clear output cache entries for a task name or pattern"},
+ {Key: ArgCacheClearTool, Short: "Tool(s) to clear cache for e.g.: node, python", Long: "Tool(s) to clear cache for\ne.g.: node, python"},
+ {Key: CmdCachePath, Short: "Show the cache directory path", VisibleAliases: []string{"dir"}},
+ {Key: CmdCachePrune, Short: "Removes stale mise cache files", Long: "Removes stale mise cache files\n\nBy default, this command will remove files that have not been accessed in 30 days. Change this with the MISE_CACHE_PRUNE_AGE environment variable.", VisibleAliases: []string{"p"}},
+ {Key: FlagCachePruneVerbose, Repeatable: true, Short: "Show pruned files", Long: "Show pruned files"},
+ {Key: FlagCachePruneDryRun, Short: "Just show what would be pruned", Long: "Just show what would be pruned"},
+ {Key: ArgCachePruneTool, Short: "Tool(s) to prune cache for e.g.: node, python", Long: "Tool(s) to prune cache for\ne.g.: node, python"},
+ {Key: CmdCacheTask, Short: "Inspect output cache entries for a task"},
+ {Key: FlagCacheTaskJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: ArgCacheTaskTask, Demanded: true, Short: "Task name or pattern to inspect", Long: "Task name or pattern to inspect"},
+ {Key: CmdCompletion, Short: "Generate shell completions", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise completion bash --include-bash-completion-lib > ~/.local/share/bash-completion/completions/mise\x1b[22m\n $ \x1b[1mmise completion zsh > /usr/local/share/zsh/site-functions/_mise\x1b[22m\n $ \x1b[1mmise completion fish > ~/.config/fish/completions/mise.fish\x1b[22m\n $ \x1b[1mmise completion powershell >> $PROFILE\x1b[22m\n"},
+ {Key: FlagCompletionShell, Hide: true, ValueName: "SHELL", ValueDemanded: true, Short: "Shell type to generate completions for", Long: "Shell type to generate completions for"},
+ {Key: FlagCompletionIncludeBashCompletionLib, Short: "Include the bash completion library in the bash completion script", Long: "Include the bash completion library in the bash completion script\n\nThis is required for completions to work in bash, but it is not included by default you may source it separately or enable this flag to enable it in the script."},
+ {Key: FlagCompletionUsage, Hide: true, Short: "Always use usage for completions.\nCurrently, usage is the default for fish and bash but not zsh since it has a few quirks\nto work out first.", Long: "Always use usage for completions.\nCurrently, usage is the default for fish and bash but not zsh since it has a few quirks\nto work out first.\n\nThis requires the `usage` CLI to be installed.\nhttps://usage.jdx.dev"},
+ {Key: ArgCompletionShell, Short: "Shell type to generate completions for", Long: "Shell type to generate completions for"},
+ {Key: CmdConfig, Short: "Manage config files", VisibleAliases: []string{"cfg"}},
+ {Key: FlagConfigJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagConfigNoHeader, Short: "Do not print table header", Long: "Do not print table header"},
+ {Key: FlagConfigTrackedConfigs, Short: "List all tracked config files", Long: "List all tracked config files"},
+ {Key: CmdConfigGet, Short: "Display the value of a setting in a mise.toml file", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise toml get tools.python\x1b[22m\n 3.12\n"},
+ {Key: FlagConfigGetFile, ValueName: "FILE", ValueDemanded: true, Short: "The path to the mise.toml file to read", Long: "The path to the mise.toml file to read\n\nCan be a file path or directory. If a directory is provided, the config file in that directory is used.\n\nIf not provided, the nearest mise.toml file will be used"},
+ {Key: ArgConfigGetKey, Short: "The path of the config to display", Long: "The path of the config to display"},
+ {Key: CmdConfigLs, Short: "List config files currently in use", VisibleAliases: []string{"list"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise config ls\x1b[22m\n Path Tools\n ~/.config/mise/config.toml pitchfork\n ~/src/mise/mise.toml actionlint, bun, cargo-binstall, cargo:cargo-insta\n"},
+ {Key: FlagConfigLsJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagConfigLsNoHeader, Short: "Do not print table header", Long: "Do not print table header"},
+ {Key: FlagConfigLsTrackedConfigs, Short: "List all tracked config files", Long: "List all tracked config files"},
+ {Key: CmdConfigSet, Short: "Set the value of a setting in a mise.toml file", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise config set tools.python 3.12\x1b[22m\n $ \x1b[1mmise config set settings.always_keep_download true\x1b[22m\n $ \x1b[1mmise config set env.TEST_ENV_VAR ABC\x1b[22m\n $ \x1b[1mmise config set settings.disable_tools node,rust\x1b[22m\n\n # Type for `settings` is inferred\n $ \x1b[1mmise config set settings.jobs 4\x1b[22m\n"},
+ {Key: FlagConfigSetFile, ValueName: "FILE", ValueDemanded: true, Short: "The path to the mise.toml file to edit", Long: "The path to the mise.toml file to edit\n\nCan be a file path or directory. If a directory is provided, the config file in that directory is used.\n\nIf not provided, the nearest mise.toml file will be used"},
+ {Key: FlagConfigSetType, ValueName: "TYPE", ValueDemanded: true, Choices: []string{"infer", "string", "integer", "float", "bool", "list", "set"}, Default: []string{"infer"}},
+ {Key: ArgConfigSetKey, Demanded: true, Short: "The path of the config to display", Long: "The path of the config to display"},
+ {Key: ArgConfigSetValue, Short: "The value to set the key to (optional if provided as KEY=VALUE)", Long: "The value to set the key to (optional if provided as KEY=VALUE)"},
+ {Key: CmdCurrent, Hide: true, Short: "Shows current active and installed runtime versions", Long: "Shows current active and installed runtime versions\n\nThis is similar to `mise ls --current`, but this only shows the runtime and/or version. It's designed to fit into scripts more easily.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n # outputs `.tool-versions` compatible format\n $ \x1b[1mmise current\x1b[22m\n python 3.11.0 3.10.0\n shfmt 3.6.0\n shellcheck 0.9.0\n node 20.0.0\n\n $ \x1b[1mmise current node\x1b[22m\n 20.0.0\n\n # can output multiple versions\n $ \x1b[1mmise current python\x1b[22m\n 3.11.0 3.10.0\n"},
+ {Key: ArgCurrentPlugin, Short: "Plugin to show versions of e.g.: ruby, node, cargo:eza, npm:prettier, etc.", Long: "Plugin to show versions of\ne.g.: ruby, node, cargo:eza, npm:prettier, etc."},
+ {Key: CmdDeactivate, Short: "Disable mise for current shell session", Long: "Disable mise for current shell session\n\nThis can be used to temporarily disable mise in a shell session.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise deactivate\x1b[22m\n"},
+ {Key: CmdDirenv, Hide: true, Short: "Output direnv function to use mise inside direnv", Long: "Output direnv function to use mise inside direnv\n\nSee https://mise.jdx.dev/direnv.html for more information\n\nBecause this generates the idiomatic files based on currently installed plugins, you should run this command after installing new plugins. Otherwise direnv may not know to update environment variables when idiomatic file versions change."},
+ {Key: CmdDirenvActivate, Hide: true, Short: "Output direnv function to use mise inside direnv", Long: "Output direnv function to use mise inside direnv\n\nSee https://mise.jdx.dev/direnv.html for more information\n\nBecause this generates the idiomatic files based on currently installed plugins, you should run this command after installing new plugins. Otherwise direnv may not know to update environment variables when idiomatic file versions change.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise direnv activate > ~/.config/direnv/lib/use_mise.sh\x1b[22m\n $ \x1b[1mecho 'use mise' > .envrc\x1b[22m\n $ \x1b[1mdirenv allow\x1b[22m\n"},
+ {Key: CmdDirenvEnvrc, Hide: true, Short: "[internal] This is an internal command that writes an envrc file\nfor direnv to consume."},
+ {Key: CmdDirenvExec, Hide: true, Short: "[internal] This is an internal command that writes an envrc file\nfor direnv to consume."},
+ {Key: CmdDotfiles, Hide: true, Short: "Manage dotfiles from `[dotfiles]` (deprecated)", Long: "Manage dotfiles from `[dotfiles]` (deprecated)\n\nUse `mise bootstrap dotfiles` instead.", SubcommandRequired: true},
+ {Key: CmdDotfilesAdd, Hide: true, Short: "Add or update dotfiles in `[dotfiles]`", Long: "Add or update dotfiles in `[dotfiles]`\n\nIf the target is already managed, this updates its source from the live target. Otherwise it creates a `[dotfiles]` entry and seeds the source under `dotfiles.root` unless `--source` is provided.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap dotfiles add ~/.zshrc\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles add --mode copy ~/.config/starship.toml\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles add --source dotfiles/gitconfig ~/.gitconfig\x1b[22m\n"},
+ {Key: FlagDotfilesAddForce, Short: "Overwrite existing sources without prompting", Long: "Overwrite existing sources without prompting"},
+ {Key: FlagDotfilesAddGlobal, Short: "Write to the global config", Long: "Write to the global config"},
+ {Key: FlagDotfilesAddLocal, Short: "Write to the local config instead of the global config", Long: "Write to the local config instead of the global config"},
+ {Key: FlagDotfilesAddMode, ValueName: "MODE", ValueDemanded: true, Short: "Dotfile mode to write", Long: "Dotfile mode to write"},
+ {Key: FlagDotfilesAddDryRun, Short: "Print the config/source updates without writing anything", Long: "Print the config/source updates without writing anything"},
+ {Key: FlagDotfilesAddNoApply, Short: "Add the entry without applying it", Long: "Add the entry without applying it"},
+ {Key: FlagDotfilesAddPath, ValueName: "PATH", ValueDemanded: true, Short: "Write to this config file or directory", Long: "Write to this config file or directory"},
+ {Key: FlagDotfilesAddSource, ValueName: "PATH", ValueDemanded: true, Short: "Source path to use for a single target", Long: "Source path to use for a single target"},
+ {Key: FlagDotfilesAddYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: ArgDotfilesAddTarget, Demanded: true, Short: "Targets to add or update", Long: "Targets to add or update"},
+ {Key: CmdDotfilesApply, Hide: true, Short: "Apply dotfiles from `[dotfiles]`", Long: "Apply dotfiles from `[dotfiles]`\n\nApplies configured whole-file entries and edits that aren't in their desired state. Whole-file entries may symlink, copy, or render templates. Edit entries manage a marker-delimited block or a single line in a file mise doesn't otherwise own.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap dotfiles apply\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles apply --dry-run\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles apply --force --yes\x1b[22m\n"},
+ {Key: FlagDotfilesApplyForce, Short: "Overwrite existing files that conflict with whole-file dotfile entries", Long: "Overwrite existing files that conflict with whole-file dotfile entries"},
+ {Key: FlagDotfilesApplyDryRun, Short: "Print the actions that would run without writing anything", Long: "Print the actions that would run without writing anything"},
+ {Key: FlagDotfilesApplyYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: ArgDotfilesApplyTarget, Short: "Only apply these targets", Long: "Only apply these targets"},
+ {Key: CmdDotfilesEdit, Hide: true, Short: "Edit a managed dotfile source", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap dotfiles edit ~/.zshrc\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles edit --apply ~/.config/starship.toml\x1b[22m\n"},
+ {Key: FlagDotfilesEditApply, Short: "Apply this target after the editor exits", Long: "Apply this target after the editor exits"},
+ {Key: FlagDotfilesEditMode, ValueName: "MODE", ValueDemanded: true, Short: "Dotfile mode to use if the target is not yet managed", Long: "Dotfile mode to use if the target is not yet managed"},
+ {Key: FlagDotfilesEditSource, ValueName: "PATH", ValueDemanded: true, Short: "Source path to use if the target is not yet managed", Long: "Source path to use if the target is not yet managed"},
+ {Key: FlagDotfilesEditYes, Short: "Skip the confirmation prompt when adding an unmanaged target", Long: "Skip the confirmation prompt when adding an unmanaged target"},
+ {Key: ArgDotfilesEditTarget, Demanded: true, Short: "Target to edit", Long: "Target to edit"},
+ {Key: CmdDotfilesStatus, Hide: true, Short: "Show the status of dotfiles from `[dotfiles]`", VisibleAliases: []string{"ls"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap dotfiles status\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles status ~/.zshrc\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles status --json\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles status --missing\x1b[22m # exit 1 if anything is out of sync\n"},
+ {Key: FlagDotfilesStatusJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagDotfilesStatusMissing, Short: "Exit with code 1 if any configured dotfiles are not in their desired\nstate (missing, source missing, differs)", Long: "Exit with code 1 if any configured dotfiles are not in their desired\nstate (missing, source missing, differs)"},
+ {Key: ArgDotfilesStatusTarget, Short: "Only show these targets", Long: "Only show these targets"},
+ {Key: CmdDotfilesUnapply, Hide: true, Short: "Remove dotfiles applied from `[dotfiles]`", Long: "Remove dotfiles applied from `[dotfiles]`\n\nRemoves configured whole-file entries and edits while preserving files mise cannot identify as managed. Modified copies, templates, and plain-line edits require `--force`.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise bootstrap dotfiles unapply\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles unapply ~/.zshrc\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles unapply --dry-run\x1b[22m\n $ \x1b[1mmise bootstrap dotfiles unapply --force --yes\x1b[22m\n"},
+ {Key: FlagDotfilesUnapplyForce, Short: "Remove modified or otherwise ambiguous managed files and lines", Long: "Remove modified or otherwise ambiguous managed files and lines"},
+ {Key: FlagDotfilesUnapplyDryRun, Short: "Print the actions that would run without writing anything", Long: "Print the actions that would run without writing anything"},
+ {Key: FlagDotfilesUnapplyYes, Short: "Skip the confirmation prompt", Long: "Skip the confirmation prompt"},
+ {Key: ArgDotfilesUnapplyTarget, Short: "Only unapply these targets", Long: "Only unapply these targets"},
+ {Key: CmdDoctor, Short: "Check mise installation for possible problems", VisibleAliases: []string{"dr"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise doctor\x1b[22m\n [WARN] plugin node is not installed\n"},
+ {Key: FlagDoctorJson},
+ {Key: CmdDoctorPath, Short: "Print the current PATH entries mise is providing", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n Get the current PATH entries mise is providing\n $ mise doctor path\n /home/user/.local/share/mise/installs/node/24.0.0/bin\n /home/user/.local/share/mise/installs/rust/1.90.0/bin\n /home/user/.local/share/mise/installs/python/3.10.0/bin\n"},
+ {Key: FlagDoctorPathFull, Short: "Print all entries including those not provided by mise", Long: "Print all entries including those not provided by mise"},
+ {Key: CmdEn, Short: "Starts a new shell with the mise environment built from the current configuration", Long: "Starts a new shell with the mise environment built from the current configuration\n\nThis is an alternative to `mise activate` that allows you to explicitly start a mise session. It will have the tools and environment variables in the configs loaded. Note that changing directories will not update the mise environment.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise en .\x1b[22m\n $ \x1b[1mnode -v\x1b[22m\n v20.0.0\n\n Skip loading bashrc:\n $ \x1b[1mmise en -s \"bash --norc\"\x1b[22m\n\n Skip loading zshrc:\n $ \x1b[1mmise en -s \"zsh -f\"\x1b[22m\n"},
+ {Key: FlagEnShell, ValueName: "SHELL", ValueDemanded: true, Short: "Shell to start", Long: "Shell to start\n\nDefaults to $SHELL"},
+ {Key: ArgEnDir, Short: "Directory to start the shell in", Long: "Directory to start the shell in", Default: []string{"."}},
+ {Key: CmdEnv, Short: "Exports env vars to activate mise a single time", Long: "Exports env vars to activate mise a single time\n\nUse this if you don't want to permanently install mise. It's not necessary to use this if you have `mise activate` in your shell rc file.", VisibleAliases: []string{"e"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1meval \"$(mise env -s bash)\"\x1b[22m\n $ \x1b[1meval \"$(mise env -s zsh)\"\x1b[22m\n $ \x1b[1mmise env -s fish | source\x1b[22m\n $ \x1b[1mexecx($(mise env -s xonsh))\x1b[22m\n"},
+ {Key: FlagEnvDotenv, Short: "Output in dotenv format", Long: "Output in dotenv format"},
+ {Key: FlagEnvJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagEnvShell, ValueName: "SHELL", ValueDemanded: true, Short: "Shell type to generate environment variables for", Long: "Shell type to generate environment variables for"},
+ {Key: FlagEnvJsonExtended, Short: "Output in JSON format with additional information (source, tool)", Long: "Output in JSON format with additional information (source, tool)"},
+ {Key: FlagEnvRedacted, Short: "Only show redacted environment variables", Long: "Only show redacted environment variables"},
+ {Key: FlagEnvValues, Short: "Only show values of environment variables", Long: "Only show values of environment variables"},
+ {Key: ArgEnvToolVersion, Short: "Tool(s) to use", Long: "Tool(s) to use"},
+ {Key: CmdExec, Short: "Execute a command with tool(s) set", Long: "Execute a command with tool(s) set\n\nuse this to avoid modifying the shell session or running ad-hoc commands with mise tools set.\n\nTools will be loaded from mise.toml, though they can be overridden with args Note that only the plugin specified will be overridden, so if a `mise.toml` file includes \"node 20\" but you run `mise exec python@3.11`; it will still load node@20.\n\nThe \"--\" separates runtimes from the commands to pass along to the subprocess.", VisibleAliases: []string{"x"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise exec node@20 -- node ./app.js\x1b[22m # launch app.js using node-20.x\n $ \x1b[1mmise x node@20 -- node ./app.js\x1b[22m # shorter alias\n\n # Specify command as a string:\n $ \x1b[1mmise exec node@20 python@3.11 --command \"node -v && python -V\"\x1b[22m\n\n # Run a command in a different directory:\n $ \x1b[1mmise x -C /path/to/project node@20 -- node ./app.js\x1b[22m\n"},
+ {Key: FlagExecCommand, ValueName: "COMMAND", ValueDemanded: true, Short: "Command string to execute", Long: "Command string to execute"},
+ {Key: FlagExecJobs, ValueName: "JOBS", ValueDemanded: true, Short: "Number of jobs to run in parallel\nValues below 1 are treated as 1\n[default: 4]", Long: "Number of jobs to run in parallel\nValues below 1 are treated as 1\n[default: 4]", Env: "MISE_JOBS"},
+ {Key: FlagExecAllowEnv, Repeatable: true, ValueName: "VAR", ValueDemanded: true, Short: "Allow specific env var through (implies --deny-env for everything else)\nSupports wildcards, e.g. --allow-env='MYAPP_*'", Long: "Allow specific env var through (implies --deny-env for everything else)\nSupports wildcards, e.g. --allow-env='MYAPP_*'"},
+ {Key: FlagExecAllowNet, Repeatable: true, ValueName: "HOST", ValueDemanded: true, Short: "Allow network to specific host (implies --deny-net for everything else)\nmacOS only in v1; on Linux falls back to allowing all network", Long: "Allow network to specific host (implies --deny-net for everything else)\nmacOS only in v1; on Linux falls back to allowing all network"},
+ {Key: FlagExecAllowRead, Repeatable: true, ValueName: "PATH", ValueDemanded: true, Short: "Allow reads from specific path (implies --deny-read for everything else)", Long: "Allow reads from specific path (implies --deny-read for everything else)"},
+ {Key: FlagExecAllowWrite, Repeatable: true, ValueName: "PATH", ValueDemanded: true, Short: "Allow writes to specific path (implies --deny-write for everything else)", Long: "Allow writes to specific path (implies --deny-write for everything else)"},
+ {Key: FlagExecDenyAll, Short: "Block reads, writes, network, and env vars", Long: "Block reads, writes, network, and env vars"},
+ {Key: FlagExecDenyEnv, Short: "Block env var inheritance (only PATH, HOME, USER, SHELL, TERM, LANG pass through)", Long: "Block env var inheritance (only PATH, HOME, USER, SHELL, TERM, LANG pass through)"},
+ {Key: FlagExecDenyNet, Short: "Block all network access", Long: "Block all network access"},
+ {Key: FlagExecDenyRead, Short: "Block filesystem reads (system libs and tool dirs still accessible)", Long: "Block filesystem reads (system libs and tool dirs still accessible)"},
+ {Key: FlagExecDenyWrite, Short: "Block all filesystem writes", Long: "Block all filesystem writes"},
+ {Key: FlagExecFreshEnv, Short: "Bypass the environment cache and recompute the environment", Long: "Bypass the environment cache and recompute the environment"},
+ {Key: FlagExecNoDeps, Short: "Skip automatic dependency preparation", Long: "Skip automatic dependency preparation"},
+ {Key: FlagExecRaw, Short: "Connect backend install command stdin/stdout/stderr directly to the terminal Implies --jobs=1", Long: "Connect backend install command stdin/stdout/stderr directly to the terminal\nImplies --jobs=1"},
+ {Key: ArgExecToolVersion, Short: "Tool(s) to start e.g.: node@20 python@3.10", Long: "Tool(s) to start\ne.g.: node@20 python@3.10"},
+ {Key: ArgExecCommand, Short: "Command string to execute (same as --command)", Long: "Command string to execute (same as --command)"},
+ {Key: CmdFmt, Short: "Formats mise.toml", Long: "Formats mise.toml\n\nSorts keys and cleans up whitespace in mise.toml", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise fmt\x1b[22m\n"},
+ {Key: FlagFmtAll, Short: "Format all files from the current directory", Long: "Format all files from the current directory"},
+ {Key: FlagFmtCheck, Short: "Check if the configs are formatted, no formatting is done", Long: "Check if the configs are formatted, no formatting is done"},
+ {Key: FlagFmtStdin, Short: "Read config from stdin and write its formatted version into stdout", Long: "Read config from stdin and write its formatted version into\nstdout"},
+ {Key: CmdGenerate, Short: "Generate files for various tools/services", SubcommandRequired: true, VisibleAliases: []string{"gen"}},
+ {Key: CmdGenerateBootstrap, Short: "Generate a script to download+execute mise", Long: "Generate a script to download+execute mise\n\nThis is designed to be used in a project where contributors may not have mise installed.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise generate bootstrap --write ./bin/mise\x1b[22m\n $ \x1b[1m./bin/mise install\x1b[22m \x1b[2m# downloads mise to .mise if not already installed\x1b[22m\n\n \x1b[2m# add a launcher for contributors who clone the project on Windows\x1b[22m\n $ \x1b[1mmise generate bootstrap --write ./bin/mise --windows\x1b[22m \x1b[2m# also writes bin/mise.cmd\x1b[22m\n $ \x1b[1m.\\bin\\mise.cmd install\x1b[22m\n"},
+ {Key: FlagGenerateBootstrapLocalize, Short: "Sandboxes mise internal directories like MISE_DATA_DIR and MISE_CACHE_DIR into a `.mise` directory in the project", Long: "Sandboxes mise internal directories like MISE_DATA_DIR and MISE_CACHE_DIR into a `.mise` directory in the project\n\nThis is necessary if users may use a different version of mise outside the project."},
+ {Key: FlagGenerateBootstrapVersion, ValueName: "VERSION", ValueDemanded: true, Short: "Specify mise version to fetch", Long: "Specify mise version to fetch"},
+ {Key: FlagGenerateBootstrapWrite, ValueName: "WRITE", Short: "instead of outputting the script to stdout, write to a file and make it executable", Long: "instead of outputting the script to stdout, write to a file and make it executable"},
+ {Key: FlagGenerateBootstrapLocalizedDir, ValueName: "LOCALIZED_DIR", ValueDemanded: true, Short: "Directory to put localized data into", Long: "Directory to put localized data into", Default: []string{".mise"}},
+ {Key: FlagGenerateBootstrapWindows, Short: "Also write a Windows launcher, `.cmd`", Long: "Also write a Windows launcher, `.cmd`\n\nWindows cannot execute the `#!/usr/bin/env bash` script, so a contributor who clones the project on Windows has nothing to run without this.\n\nGenerated on every host, not only on Windows: the file is committed, and whoever runs it on Windows is not the person who generated it. Requires `--write`, since stdout cannot carry two files."},
+ {Key: CmdGenerateConfig, Short: "Generate a mise.toml file", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise generate config\x1b[22m \x1b[2m# generate mise.toml interactively\x1b[22m\n $ \x1b[1mmise generate config .mise.toml\x1b[22m \x1b[2m# generate a specific file\x1b[22m\n $ \x1b[1mmise generate config -g\x1b[22m \x1b[2m# generate the global config file\x1b[22m\n $ \x1b[1mmise generate config -y\x1b[22m \x1b[2m# skip interactive editor\x1b[22m\n $ \x1b[1mmise generate config -n\x1b[22m \x1b[2m# preview without writing\x1b[22m\n"},
+ {Key: FlagGenerateConfigGlobal, Short: "Generate the global config file (~/.config/mise/config.toml)", Long: "Generate the global config file (~/.config/mise/config.toml)"},
+ {Key: FlagGenerateConfigDryRun, Short: "Show what would be generated without writing to file", Long: "Show what would be generated without writing to file"},
+ {Key: FlagGenerateConfigToolVersions, ValueName: "TOOL_VERSIONS", ValueDemanded: true, Short: "Path to a .tool-versions file to import tools from", Long: "Path to a .tool-versions file to import tools from"},
+ {Key: ArgGenerateConfigPath, Short: "Path to the config file to create", Long: "Path to the config file to create"},
+ {Key: CmdGenerateDevcontainer, Short: "Generate a devcontainer to execute mise", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise generate devcontainer\x1b[22m\n"},
+ {Key: FlagGenerateDevcontainerImage, ValueName: "IMAGE", ValueDemanded: true, Short: "The image to use for the devcontainer", Long: "The image to use for the devcontainer"},
+ {Key: FlagGenerateDevcontainerMountMiseData, Short: "Bind the mise-data-volume to the devcontainer", Long: "Bind the mise-data-volume to the devcontainer"},
+ {Key: FlagGenerateDevcontainerName, ValueName: "NAME", ValueDemanded: true, Short: "The name of the devcontainer", Long: "The name of the devcontainer"},
+ {Key: FlagGenerateDevcontainerWrite, Short: "write to .devcontainer/devcontainer.json", Long: "write to .devcontainer/devcontainer.json"},
+ {Key: CmdGenerateGitPreCommit, Short: "Generate a git pre-commit hook", Long: "Generate a git pre-commit hook\n\nThis command generates a git pre-commit hook that runs a mise task like `mise run pre-commit` when you commit changes to your repository.\n\nStaged files are passed to the task as `STAGED`.\n\nFor more advanced pre-commit functionality, see mise's sister project: https://hk.jdx.dev/", VisibleAliases: []string{"pre-commit"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise generate git-pre-commit --write --task=pre-commit\x1b[22m\n $ \x1b[1mgit commit -m \"feat: add new feature\"\x1b[22m \x1b[2m# runs `mise run pre-commit`\x1b[22m\n\n \x1b[2m# config lives in a subdirectory, so the hook has to change into it first\x1b[22m\n $ \x1b[1mmise generate git-pre-commit --write -- -C subdir\x1b[22m\n"},
+ {Key: FlagGenerateGitPreCommitTask, ValueName: "TASK", ValueDemanded: true, Short: "The task to run when the pre-commit hook is triggered", Long: "The task to run when the pre-commit hook is triggered", Default: []string{"pre-commit"}},
+ {Key: FlagGenerateGitPreCommitWrite, Short: "write to .git/hooks/pre-commit and make it executable", Long: "write to .git/hooks/pre-commit and make it executable"},
+ {Key: FlagGenerateGitPreCommitHook, ValueName: "HOOK", ValueDemanded: true, Short: "Which hook to generate (saves to .git/hooks/$hook)", Long: "Which hook to generate (saves to .git/hooks/$hook)", Default: []string{"pre-commit"}},
+ {Key: ArgGenerateGitPreCommitMiseArg, Short: "mise flags to embed in the generated hook, given after `--`", Long: "mise flags to embed in the generated hook, given after `--`\n\nThese are inserted between `mise` and `run`, so the hook carries the same context you would pass on the command line. Useful when the config is not at the repository root, since git runs hooks from the top level: `-- -C subdir` makes the hook find it."},
+ {Key: CmdGenerateGithubAction, Short: "Generate a GitHub Action workflow file", Long: "Generate a GitHub Action workflow file\n\nThis command generates a GitHub Action workflow file that runs a mise task like `mise run ci` when you push changes to your repository.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise generate github-action --write --task=ci\x1b[22m\n $ \x1b[1mgit commit -m \"feat: add new feature\"\x1b[22m\n $ \x1b[1mgit push\x1b[22m \x1b[2m# runs `mise run ci` on GitHub\x1b[22m\n"},
+ {Key: FlagGenerateGithubActionTask, ValueName: "TASK", ValueDemanded: true, Short: "The task to run when the workflow is triggered", Long: "The task to run when the workflow is triggered", Default: []string{"ci"}},
+ {Key: FlagGenerateGithubActionWrite, Short: "write to .github/workflows/$name.yml", Long: "write to .github/workflows/$name.yml"},
+ {Key: FlagGenerateGithubActionName, ValueName: "NAME", ValueDemanded: true, Short: "the name of the workflow to generate", Long: "the name of the workflow to generate", Default: []string{"ci"}},
+ {Key: CmdGenerateTaskDocs, Short: "Generate documentation for tasks in a project", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise generate task-docs\x1b[22m\n"},
+ {Key: FlagGenerateTaskDocsInject, Short: "inserts the documentation into an existing file", Long: "inserts the documentation into an existing file\n\nThis will look for a special comment, ``, and replace it with the generated documentation. It will replace everything between the comment and the next comment, `` so it can be run multiple times on the same file to update the documentation. The file must already contain both comments; mise errors instead of modifying the file if they are missing."},
+ {Key: FlagGenerateTaskDocsIndex, Short: "write only an index of tasks, intended for use with `--multi`", Long: "write only an index of tasks, intended for use with `--multi`"},
+ {Key: FlagGenerateTaskDocsMulti, Short: "render each task as a separate document, requires `--output` to be a directory", Long: "render each task as a separate document, requires `--output` to be a directory"},
+ {Key: FlagGenerateTaskDocsOutput, ValueName: "OUTPUT", ValueDemanded: true, Short: "writes the generated docs to a file/directory", Long: "writes the generated docs to a file/directory"},
+ {Key: FlagGenerateTaskDocsRoot, ValueName: "ROOT", ValueDemanded: true, Short: "root directory to search for tasks", Long: "root directory to search for tasks"},
+ {Key: FlagGenerateTaskDocsStyle, ValueName: "STYLE", ValueDemanded: true, Choices: []string{"simple", "detailed"}, Default: []string{"simple"}},
+ {Key: CmdGenerateTaskStubs, Short: "Generates shims to run mise tasks", Long: "Generates shims to run mise tasks\n\nBy default, this will build shims like ./bin/. These can be paired with `mise generate bootstrap` so contributors to a project can execute mise tasks without installing mise into their system. When a parent and nested task both exist, the parent stub is written to `/_default`.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise tasks add test -- echo 'running tests'\x1b[22m\n $ \x1b[1mmise generate task-stubs\x1b[22m\n $ \x1b[1m./bin/test\x1b[22m\n running tests\n"},
+ {Key: FlagGenerateTaskStubsDir, ValueName: "DIR", ValueDemanded: true, Short: "Directory to create task stubs inside of", Long: "Directory to create task stubs inside of", Default: []string{"bin"}},
+ {Key: FlagGenerateTaskStubsMiseBin, ValueName: "MISE_BIN", ValueDemanded: true, Short: "Path to a mise bin to use when running the task stub.", Long: "Path to a mise bin to use when running the task stub.\n\nUse `--mise-bin=./bin/mise` to use a mise bin generated from `mise generate bootstrap`", Default: []string{"mise"}},
+ {Key: CmdGenerateToolStub, Short: "Generate a tool stub for HTTP-based tools", Long: "Generate a tool stub for HTTP-based tools\n\nThis command generates tool stubs that can automatically download and execute tools from HTTP URLs. It can detect checksums, file sizes, and binary paths automatically by downloading and analyzing the tool.\n\nWhen generating stubs with platform-specific URLs, the command will append new platforms to existing stub files rather than overwriting them. This allows you to incrementally build cross-platform tool stubs.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n Generate a tool stub for a single URL:\n $ \x1b[1mmise generate tool-stub ./bin/gh --url \"https://github.com/cli/cli/releases/download/v2.96.0/gh_2.96.0_linux_amd64.tar.gz\"\x1b[22m\n\n Generate a tool stub with platform-specific URLs:\n $ \x1b[1mmise generate tool-stub ./bin/rg \\\n --platform-url linux-x64:https://github.com/BurntSushi/ripgrep/releases/download/14.0.3/ripgrep-14.0.3-x86_64-unknown-linux-musl.tar.gz \\\n --platform-url darwin-arm64:https://github.com/BurntSushi/ripgrep/releases/download/14.0.3/ripgrep-14.0.3-aarch64-apple-darwin.tar.gz\x1b[22m\n\n Append additional platforms to an existing stub:\n $ \x1b[1mmise generate tool-stub ./bin/rg \\\n --platform-url linux-x64:https://example.com/rg-linux.tar.gz\x1b[22m\n $ \x1b[1mmise generate tool-stub ./bin/rg \\\n --platform-url darwin-arm64:https://example.com/rg-darwin.tar.gz\x1b[22m\n # The stub now contains both platforms\n\n Use auto-detection for platform from URL:\n $ \x1b[1mmise generate tool-stub ./bin/node \\\n --platform-url https://nodejs.org/dist/v22.17.1/node-v22.17.1-darwin-arm64.tar.gz\x1b[22m\n # Platform 'macos-arm64' will be auto-detected from the URL\n\n Generate with platform-specific binary paths:\n $ \x1b[1mmise generate tool-stub ./bin/tool \\\n --platform-url linux-x64:https://example.com/tool-linux.tar.gz \\\n --platform-url windows-x64:https://example.com/tool-windows.zip \\\n --platform-bin windows-x64:tool.exe\x1b[22m\n\n Generate without downloading (faster):\n $ \x1b[1mmise generate tool-stub ./bin/tool --url \"https://example.com/tool.tar.gz\" --skip-download\x1b[22m\n\n Fetch checksums for an existing stub:\n $ \x1b[1mmise generate tool-stub ./bin/jq --fetch\x1b[22m\n # This will read the existing stub and download files to fill in any missing checksums/sizes\n\n Generate a bootstrap stub that installs mise if needed:\n $ \x1b[1mmise generate tool-stub ./bin/tool --url \"https://example.com/tool.tar.gz\" --bootstrap\x1b[22m\n # The stub will check for mise and install it automatically before running the tool\n\n Generate a bootstrap stub with a pinned mise version:\n $ \x1b[1mmise generate tool-stub ./bin/tool --url \"https://example.com/tool.tar.gz\" --bootstrap --bootstrap-version 2025.1.0\x1b[22m\n\n Lock an existing tool stub with pinned version and platform URLs/checksums:\n $ \x1b[1mmise generate tool-stub ./bin/node --lock\x1b[22m\n\n Bump the version in a locked stub:\n $ \x1b[1mmise generate tool-stub ./bin/node --lock --version 22\x1b[22m\n # Resolves the latest node 22.x, pins it, and updates platform URLs/checksums\n"},
+ {Key: FlagGenerateToolStubBin, ValueName: "BIN", ValueDemanded: true, Short: "Binary path within the extracted archive", Long: "Binary path within the extracted archive\n\nIf not specified and the archive is downloaded, will auto-detect the most likely binary"},
+ {Key: FlagGenerateToolStubBootstrap, Short: "Wrap stub in a bootstrap script that installs mise if not already present", Long: "Wrap stub in a bootstrap script that installs mise if not already present\n\nWhen enabled, generates a bash script that: 1. Checks if mise is installed at the expected path 2. If not, downloads and installs mise using the embedded installer 3. Executes the tool stub using mise"},
+ {Key: FlagGenerateToolStubBootstrapVersion, ValueName: "BOOTSTRAP_VERSION", ValueDemanded: true, Short: "Specify mise version for the bootstrap script", Long: "Specify mise version for the bootstrap script\n\nBy default, uses the latest version from the install script. Use this to pin to a specific version (e.g., \"2025.1.0\")."},
+ {Key: FlagGenerateToolStubChecksumAlgorithm, ValueName: "CHECKSUM_ALGORITHM", ValueDemanded: true, Short: "Checksum algorithm to use when downloading artifacts", Long: "Checksum algorithm to use when downloading artifacts\n\nAccepts `blake3` or `sha256` and defaults to `blake3`. Cannot be used with `--lock` or `--skip-download` because those modes do not calculate checksums.", Choices: []string{"blake3", "sha256"}, Default: []string{"blake3"}},
+ {Key: FlagGenerateToolStubFetch, Short: "Fetch checksums and sizes for an existing tool stub file", Long: "Fetch checksums and sizes for an existing tool stub file\n\nThis reads an existing stub file and fills in any missing checksum/size fields by downloading the files. URLs must already be present in the stub."},
+ {Key: FlagGenerateToolStubHttp, ValueName: "HTTP", ValueDemanded: true, Short: "HTTP backend type to use", Long: "HTTP backend type to use", Default: []string{"http"}},
+ {Key: FlagGenerateToolStubLock, Short: "Resolve and embed lockfile data (exact version + platform URLs/checksums) into an existing stub file for reproducible installs without runtime API calls", Long: "Resolve and embed lockfile data (exact version + platform URLs/checksums)\ninto an existing stub file for reproducible installs without runtime API calls"},
+ {Key: FlagGenerateToolStubPlatformBin, Repeatable: true, ValueName: "PLATFORM_BIN", ValueDemanded: true, Short: "Platform-specific binary paths in the format platform:path", Long: "Platform-specific binary paths in the format platform:path\n\nExamples: --platform-bin windows-x64:tool.exe --platform-bin linux-x64:bin/tool"},
+ {Key: FlagGenerateToolStubPlatformUrl, Repeatable: true, ValueName: "PLATFORM_URL", ValueDemanded: true, Short: "Platform-specific URLs in the format platform:url or just url (auto-detect platform)", Long: "Platform-specific URLs in the format platform:url or just url (auto-detect platform)\n\nWhen the output file already exists, new platforms will be appended to the existing platforms table. Existing platform URLs will be updated if specified again.\n\nIf only a URL is provided (without platform:), the platform will be automatically detected from the URL filename.\n\nExamples: --platform-url linux-x64:https://... --platform-url https://nodejs.org/dist/v22.17.1/node-v22.17.1-darwin-arm64.tar.gz"},
+ {Key: FlagGenerateToolStubSkipDownload, Short: "Skip downloading for checksum and binary path detection (faster but less informative)", Long: "Skip downloading for checksum and binary path detection (faster but less informative)"},
+ {Key: FlagGenerateToolStubUrl, ValueName: "URL", ValueDemanded: true, Short: "URL for downloading the tool", Long: "URL for downloading the tool\n\nExample: https://github.com/owner/repo/releases/download/v2.0.0/tool-linux-x64.tar.gz"},
+ {Key: FlagGenerateToolStubVersion, ValueName: "VERSION", ValueDemanded: true, Short: "Version of the tool", Long: "Version of the tool", Default: []string{"latest"}},
+ {Key: ArgGenerateToolStubOutput, Demanded: true, Short: "Output file path for the tool stub", Long: "Output file path for the tool stub"},
+ {Key: CmdGithub, Hide: true, Short: "GitHub related commands", SubcommandRequired: true},
+ {Key: CmdGithubToken, Hide: true, Short: "Display the GitHub token mise will use for a given host", Long: "Display the GitHub token mise will use for a given host\n\nShows which token source mise would use, useful for debugging authentication issues. The token is masked by default.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise github token\x1b[22m\n github.com: ghp_…xxxx (source: GITHUB_TOKEN)\n\n $ \x1b[1mmise github token --unmask\x1b[22m\n github.com: ghp_xxxxxxxxxxxx (source: GITHUB_TOKEN)\n\n $ \x1b[1mmise github token github.mycompany.com\x1b[22m\n github.mycompany.com: (none)\n"},
+ {Key: FlagGithubTokenOauth, Short: "Force native GitHub OAuth device flow instead of normal token resolution", Long: "Force native GitHub OAuth device flow instead of normal token resolution"},
+ {Key: FlagGithubTokenRaw, Short: "Print only the token value", Long: "Print only the token value"},
+ {Key: FlagGithubTokenRefresh, Short: "Mint a fresh OAuth token even if the cached one has not expired, via the refresh-token grant or a new device-code flow", Long: "Mint a fresh OAuth token even if the cached one has not\nexpired, via the refresh-token grant or a new device-code flow"},
+ {Key: FlagGithubTokenUnmask, Short: "Show the full unmasked token", Long: "Show the full unmasked token"},
+ {Key: ArgGithubTokenHost, Short: "GitHub hostname", Long: "GitHub hostname", Default: []string{"github.com"}},
+ {Key: CmdGlobal, Hide: true, Short: "Sets/gets the global tool version(s)", Long: "Sets/gets the global tool version(s)\n\nDisplays the contents of global config after writing. The file is `$HOME/.config/mise/config.toml` by default. It can be changed with `$MISE_GLOBAL_CONFIG_FILE`. If `$MISE_GLOBAL_CONFIG_FILE` is set to anything that ends in `.toml`, it will be parsed as `mise.toml`. Otherwise, it will be parsed as a `.tool-versions` file.\n\nUse MISE_ASDF_COMPAT=1 to default the global config to ~/.tool-versions\n\nUse `mise local` to set a tool version locally in the current directory.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n # set the current version of node to 20.x\n # will use a fuzzy version (e.g.: 20) in .tool-versions file\n $ \x1b[1mmise global --fuzzy node@20\x1b[22m\n\n # set the current version of node to 20.x\n # will use a precise version (e.g.: 20.0.0) in .tool-versions file\n $ \x1b[1mmise global --pin node@20\x1b[22m\n\n # show the current version of node in ~/.tool-versions\n $ \x1b[1mmise global node\x1b[22m\n 20.0.0\n"},
+ {Key: FlagGlobalFuzzy, Short: "Save fuzzy version to `~/.tool-versions`\ne.g.: `mise global --fuzzy node@20` will save `node 20` to ~/.tool-versions\nthis is the default behavior unless MISE_ASDF_COMPAT=1", Long: "Save fuzzy version to `~/.tool-versions`\ne.g.: `mise global --fuzzy node@20` will save `node 20` to ~/.tool-versions\nthis is the default behavior unless MISE_ASDF_COMPAT=1"},
+ {Key: FlagGlobalPath, Short: "Get the path of the global config file", Long: "Get the path of the global config file"},
+ {Key: FlagGlobalPin, Short: "Save exact version to `~/.tool-versions`\ne.g.: `mise global --pin node@20` will save `node 20.0.0` to ~/.tool-versions", Long: "Save exact version to `~/.tool-versions`\ne.g.: `mise global --pin node@20` will save `node 20.0.0` to ~/.tool-versions"},
+ {Key: FlagGlobalRemove, Repeatable: true, ValueName: "TOOL", ValueDemanded: true, Short: "Remove the tool(s) from ~/.tool-versions", Long: "Remove the tool(s) from ~/.tool-versions"},
+ {Key: ArgGlobalToolVersion, Short: "Tool(s) to add to .tool-versions\ne.g.: node@20\nIf this is a single tool with no version, the current value of the global\n.tool-versions will be displayed", Long: "Tool(s) to add to .tool-versions\ne.g.: node@20\nIf this is a single tool with no version, the current value of the global\n.tool-versions will be displayed"},
+ {Key: CmdHookEnv, Hide: true, Short: "[internal] called by activate hook to update env vars directory change"},
+ {Key: FlagHookEnvForce, Short: "Skip early exit check", Long: "Skip early exit check"},
+ {Key: FlagHookEnvQuiet, Short: "Hide warnings such as when a tool is not installed", Long: "Hide warnings such as when a tool is not installed"},
+ {Key: FlagHookEnvShell, ValueName: "SHELL", ValueDemanded: true, Short: "Shell type to generate script for", Long: "Shell type to generate script for"},
+ {Key: FlagHookEnvReason, Hide: true, ValueName: "REASON", ValueDemanded: true, Short: "Reason for calling hook-env (e.g., \"precmd\", \"chpwd\")", Long: "Reason for calling hook-env (e.g., \"precmd\", \"chpwd\")", Choices: []string{"precmd", "chpwd"}},
+ {Key: FlagHookEnvStatus, Hide: true, Short: "Show \"mise: @\" message when changing directories", Long: "Show \"mise: @\" message when changing directories"},
+ {Key: CmdHookNotFound, Hide: true, Short: "[internal] called by shell when a command is not found"},
+ {Key: FlagHookNotFoundShell, ValueName: "SHELL", ValueDemanded: true, Short: "Shell type to generate script for", Long: "Shell type to generate script for"},
+ {Key: ArgHookNotFoundBin, Demanded: true, Short: "Attempted bin to run", Long: "Attempted bin to run"},
+ {Key: CmdImplode, Short: "Removes mise CLI and all related data", Long: "Removes mise CLI and all related data\n\nSkips config directory by default."},
+ {Key: FlagImplodeDryRun, Short: "List directories that would be removed without actually removing them", Long: "List directories that would be removed without actually removing them"},
+ {Key: FlagImplodeConfig, Short: "Also remove config directory", Long: "Also remove config directory"},
+ {Key: CmdEdit, Short: "Edit mise.toml interactively", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise edit\x1b[22m \x1b[2m# edit mise.toml interactively\x1b[22m\n $ \x1b[1mmise edit .mise.toml\x1b[22m \x1b[2m# edit a specific file\x1b[22m\n $ \x1b[1mmise edit -g\x1b[22m \x1b[2m# edit the global config file\x1b[22m\n $ \x1b[1mmise edit -y\x1b[22m \x1b[2m# skip interactive editor\x1b[22m\n $ \x1b[1mmise edit -n\x1b[22m \x1b[2m# preview without writing\x1b[22m\n"},
+ {Key: FlagEditGlobal, Short: "Edit the global config file (~/.config/mise/config.toml)", Long: "Edit the global config file (~/.config/mise/config.toml)"},
+ {Key: FlagEditDryRun, Short: "Show what would be generated without writing to file", Long: "Show what would be generated without writing to file"},
+ {Key: FlagEditToolVersions, ValueName: "TOOL_VERSIONS", ValueDemanded: true, Short: "Path to a .tool-versions file to import tools from", Long: "Path to a .tool-versions file to import tools from"},
+ {Key: ArgEditPath, Short: "Path to the config file to create", Long: "Path to the config file to create"},
+ {Key: CmdInstall, Short: "Install a tool version", Long: "Install a tool version\n\nInstalls a tool version to `~/.local/share/mise/installs//` Installing alone will not activate the tools so they won't be in PATH. To install and/or activate in one command, use `mise use` which will create a `mise.toml` file in the current directory to activate this tool when inside the directory. Alternatively, run `mise exec @ -- ` to execute a tool without creating config files.\n\nTools will be installed in parallel. To disable, set `--jobs=1` or `MISE_JOBS=1`", VisibleAliases: []string{"i"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise install node@20.0.0\x1b[22m # install specific node version\n $ \x1b[1mmise install node@20\x1b[22m # install fuzzy node version\n $ \x1b[1mmise install node\x1b[22m # install version specified in mise.toml\n $ \x1b[1mmise install\x1b[22m # installs everything specified in mise.toml\n $ \x1b[1mmise install --include-task-tools\x1b[22m # also install tools required by tasks\n"},
+ {Key: FlagInstallForce, Short: "Force reinstall even if already installed\nWith no tools specified, reinstall all configured tools", Long: "Force reinstall even if already installed\nWith no tools specified, reinstall all configured tools"},
+ {Key: FlagInstallJobs, ValueName: "JOBS", ValueDemanded: true, Short: "Number of jobs to run in parallel\nValues below 1 are treated as 1\n[default: 4]", Long: "Number of jobs to run in parallel\nValues below 1 are treated as 1\n[default: 4]", Env: "MISE_JOBS"},
+ {Key: FlagInstallDryRun, Short: "Show what would be installed without actually installing", Long: "Show what would be installed without actually installing"},
+ {Key: FlagInstallVerbose, Repeatable: true, Short: "Show installation output", Long: "Show installation output\n\nThis argument will print backend output such as download, configuration, and compilation output."},
+ {Key: FlagInstallDryRunCode, Short: "Like --dry-run but exits with code 1 if there are tools to install", Long: "Like --dry-run but exits with code 1 if there are tools to install\n\nThis is useful for scripts to check if tools need to be installed."},
+ {Key: FlagInstallIncludeTaskTools, Short: "Also install tools required by tasks in the current scope", Long: "Also install tools required by tasks in the current scope\n\nThis prepares task tools without running task commands or dependencies. Combine with --monorepo to include tasks from every configured root."},
+ {Key: FlagInstallMinimumReleaseAge, ValueName: "MINIMUM_RELEASE_AGE", ValueDemanded: true, Short: "Only install versions released before this date or older than this duration", Long: "Only install versions released before this date or older than this duration\n\nSupports absolute dates like \"2024-06-01\" and relative durations like \"90d\" or \"1y\"."},
+ {Key: FlagInstallMonorepo, Short: "Install tools from every [monorepo].config_roots config root", Long: "Install tools from every [monorepo].config_roots config root\n\nUses the active MISE_ENV and requires monorepo_root = true plus explicit [monorepo].config_roots in the monorepo root config.", Env: "MISE_MONOREPO"},
+ {Key: FlagInstallRaw, Short: "Connect backend install command stdin/stdout/stderr directly to the terminal Implies --jobs=1", Long: "Connect backend install command stdin/stdout/stderr directly to the terminal\nImplies --jobs=1"},
+ {Key: FlagInstallShared, ValueName: "SHARED", ValueDemanded: true, Short: "Install tool(s) to a shared directory", Long: "Install tool(s) to a shared directory\n\nInstalls to the specified directory instead of the default install location. May require elevated permissions depending on the path."},
+ {Key: FlagInstallSystem, Short: "Install tool(s) to the system-wide shared directory", Long: "Install tool(s) to the system-wide shared directory\n\nInstalls to /usr/local/share/mise/installs (or MISE_SYSTEM_DATA_DIR/installs). May require elevated permissions (e.g. sudo)."},
+ {Key: ArgInstallToolVersion, Short: "Tool(s) to install e.g.: node@20", Long: "Tool(s) to install\ne.g.: node@20"},
+ {Key: CmdInstallInto, Short: "Install a tool version to a specific path", Long: "Install a tool version to a specific path\n\nUsed for building a tool to a directory for use outside of mise", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n # install node@20.0.0 into ./mynode\n $ \x1b[1mmise install-into node@20.0.0 ./mynode && ./mynode/bin/node -v\x1b[22m\n 20.0.0\n"},
+ {Key: ArgInstallIntoToolVersion, Demanded: true, Short: "Tool to install e.g.: node@20", Long: "Tool to install\ne.g.: node@20"},
+ {Key: ArgInstallIntoPath, Demanded: true, Short: "Path to install the tool into", Long: "Path to install the tool into"},
+ {Key: CmdLatest, Short: "Gets the latest available version for a plugin", Long: "Gets the latest available version for a plugin\n\nSupports prefixes such as `node@20` to get the latest version of node 20.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise latest node@20\x1b[22m # get the latest version of node 20\n 20.0.0\n\n $ \x1b[1mmise latest node\x1b[22m # get the latest stable version of node\n 20.0.0\n\n $ \x1b[1mmise latest node --minimum-release-age 2024-01-01\x1b[22m # latest stable node released before 2024-01-01\n"},
+ {Key: FlagLatestInstalled, Short: "Show latest installed instead of available version", Long: "Show latest installed instead of available version"},
+ {Key: FlagLatestMinimumReleaseAge, ValueName: "MINIMUM_RELEASE_AGE", ValueDemanded: true, Short: "Only consider versions released before this date or older than this duration", Long: "Only consider versions released before this date or older than this duration\n\nSupports absolute dates like \"2024-06-01\" and relative durations like \"90d\" or \"1y\". Overrides per-tool `minimum_release_age` options and the global `minimum_release_age` setting."},
+ {Key: ArgLatestToolVersion, Demanded: true, Short: "Tool to get the latest version of", Long: "Tool to get the latest version of"},
+ {Key: ArgLatestAsdfVersion, Hide: true, Short: "The version prefix to use when querying the latest version same as the first argument after the \"@\" used for asdf compatibility", Long: "The version prefix to use when querying the latest version\nsame as the first argument after the \"@\"\nused for asdf compatibility"},
+ {Key: CmdLink, Short: "Symlinks a tool version into mise", Long: "Symlinks a tool version into mise\n\nUse this for adding installs either custom compiled outside mise or built with a different tool.", VisibleAliases: []string{"ln"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n # build node-20.0.0 with node-build and link it into mise\n $ \x1b[1mnode-build 20.0.0 ~/.nodes/20.0.0\x1b[22m\n $ \x1b[1mmise link node@20.0.0 ~/.nodes/20.0.0\x1b[22m\n\n # have mise use the node version provided by Homebrew\n $ \x1b[1mbrew install node\x1b[22m\n $ \x1b[1mmise link node@brew $(brew --prefix node)\x1b[22m\n $ \x1b[1mmise use node@brew\x1b[22m\n"},
+ {Key: FlagLinkForce, Short: "Overwrite an existing tool version if it exists", Long: "Overwrite an existing tool version if it exists"},
+ {Key: ArgLinkToolVersion, Demanded: true, Short: "Tool name and version to create a symlink for", Long: "Tool name and version to create a symlink for"},
+ {Key: ArgLinkPath, Demanded: true, Short: "The local path to the tool version\ne.g.: ~/.nvm/versions/node/v20.0.0", Long: "The local path to the tool version\ne.g.: ~/.nvm/versions/node/v20.0.0"},
+ {Key: CmdLocal, Hide: true, Short: "Sets/gets tool version in local .tool-versions or mise.toml", Long: "Sets/gets tool version in local .tool-versions or mise.toml\n\nUse this to set a tool's version when within a directory Use `mise global` to set a tool version globally This uses `.tool-version` by default unless there is a `mise.toml` file or if `MISE_USE_TOML` is set. A future v2 release of mise will default to using `mise.toml`.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n # set the current version of node to 20.x for the current directory\n # will use a precise version (e.g.: 20.0.0) in .tool-versions file\n $ \x1b[1mmise local node@20\x1b[22m\n\n # set node to 20.x for the current project (recurses up to find .tool-versions)\n $ \x1b[1mmise local -p node@20\x1b[22m\n\n # set the current version of node to 20.x for the current directory\n # will use a fuzzy version (e.g.: 20) in .tool-versions file\n $ \x1b[1mmise local --fuzzy node@20\x1b[22m\n\n # removes node from .tool-versions\n $ \x1b[1mmise local --remove=node\x1b[22m\n\n # show the current version of node in .tool-versions\n $ \x1b[1mmise local node\x1b[22m\n 20.0.0\n"},
+ {Key: FlagLocalParent, Short: "Recurse up to find a .tool-versions file rather than using the current directory only\nby default this command will only set the tool in the current directory (\"$PWD/.tool-versions\")", Long: "Recurse up to find a .tool-versions file rather than using the current directory only\nby default this command will only set the tool in the current directory (\"$PWD/.tool-versions\")"},
+ {Key: FlagLocalFuzzy, Short: "Save fuzzy version to `.tool-versions` e.g.: `mise local --fuzzy node@20` will save `node 20` to .tool-versions This is the default behavior unless MISE_ASDF_COMPAT=1", Long: "Save fuzzy version to `.tool-versions`\ne.g.: `mise local --fuzzy node@20` will save `node 20` to .tool-versions\nThis is the default behavior unless MISE_ASDF_COMPAT=1"},
+ {Key: FlagLocalPath, Short: "Get the path of the config file", Long: "Get the path of the config file"},
+ {Key: FlagLocalPin, Short: "Save exact version to `.tool-versions`\ne.g.: `mise local --pin node@20` will save `node 20.0.0` to .tool-versions", Long: "Save exact version to `.tool-versions`\ne.g.: `mise local --pin node@20` will save `node 20.0.0` to .tool-versions"},
+ {Key: FlagLocalRemove, Repeatable: true, ValueName: "TOOL", ValueDemanded: true, Short: "Remove the tool(s) from .tool-versions", Long: "Remove the tool(s) from .tool-versions"},
+ {Key: ArgLocalToolVersion, Short: "Tool(s) to add to .tool-versions/mise.toml\ne.g.: node@20\nif this is a single tool with no version,\nthe current value of .tool-versions/mise.toml will be displayed", Long: "Tool(s) to add to .tool-versions/mise.toml\ne.g.: node@20\nif this is a single tool with no version,\nthe current value of .tool-versions/mise.toml will be displayed"},
+ {Key: CmdLock, Short: "Update lockfile checksums and URLs for all specified platforms", Long: "Update lockfile checksums and URLs for all specified platforms\n\nUpdates checksums and download URLs for all platforms already specified in the lockfile. If no lockfile exists, shows what would be created based on the current configuration, including tools declared by tasks. This allows you to refresh lockfile data for platforms other than the one you're currently on. Operates on the lockfile in the current config root. Use TOOL arguments to target specific tools.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise lock\x1b[22m # update lockfile for all common platforms\n $ \x1b[1mmise lock node python\x1b[22m # update only node and python\n $ \x1b[1mmise lock --platform linux-x64\x1b[22m # update only linux-x64 platform\n $ \x1b[1mmise lock --dry-run\x1b[22m # show what would be updated\n $ \x1b[1mmise lock --bump\x1b[22m # re-resolve selectors like \"latest\" or \"20\" to the latest matching versions\n $ \x1b[1mmise lock --bump --dry-run --json\x1b[22m # list available updates as JSON without writing\n $ \x1b[1mmise lock --minimum-release-age 2024-01-01\x1b[22m # lock latest/fuzzy versions released before 2024-01-01\n $ \x1b[1mmise lock --local\x1b[22m # update mise.local.lock for local configs\n $ \x1b[1mmise lock --global\x1b[22m # update only global config lockfiles\n"},
+ {Key: FlagLockGlobal, Short: "Target only global config lockfiles (~/.config/mise/mise.lock and system config)\nBy default, only the active project config root is locked", Long: "Target only global config lockfiles (~/.config/mise/mise.lock and system config)\nBy default, only the active project config root is locked"},
+ {Key: FlagLockJobs, ValueName: "JOBS", ValueDemanded: true, Short: "Number of jobs to run in parallel\nValues below 1 are treated as 1", Long: "Number of jobs to run in parallel\nValues below 1 are treated as 1", Env: "MISE_JOBS"},
+ {Key: FlagLockDryRun, Short: "Show what would be updated without making changes", Long: "Show what would be updated without making changes"},
+ {Key: FlagLockPlatform, Repeatable: true, ValueName: "PLATFORM", ValueDemanded: true, Short: "Comma-separated list of platforms to target\ne.g.: linux-x64,macos-arm64,windows-x64\nIf not specified, all platforms already in lockfile will be updated", Long: "Comma-separated list of platforms to target\ne.g.: linux-x64,macos-arm64,windows-x64\nIf not specified, all platforms already in lockfile will be updated"},
+ {Key: FlagLockBump, Short: "Re-resolve fuzzy version selectors against the latest available versions", Long: "Re-resolve fuzzy version selectors against the latest available versions\n\nBy default, `mise lock` refreshes metadata for the currently locked versions. With this flag, selectors like \"latest\", \"lts\", or prefixes like \"20\" are re-resolved against the latest matching remote versions, so the lockfile advances without installing anything. Config files are never modified: exactly pinned versions resolve to themselves and stay unchanged (use `mise upgrade --bump` to rewrite pins in mise.toml)."},
+ {Key: FlagLockJson, Short: "Output version changes as JSON", Long: "Output version changes as JSON\n\nPrints an array of objects describing lockfile version changes: name, backend, lockfile, old_versions, new_versions. Version lists keep config/lockfile order; they are not sorted. Only version-level changes are reported: checksum/URL refreshes for unchanged versions produce no entries, so plain `mise lock --json` typically prints `[]` while still updating the lockfile. Suppresses the human-readable output. Combine with `--dry-run` to detect available updates without writing the lockfile."},
+ {Key: FlagLockLocal, Short: "Update mise.local.lock instead of mise.lock\nUse for tools defined in .local.toml configs", Long: "Update mise.local.lock instead of mise.lock\nUse for tools defined in .local.toml configs"},
+ {Key: FlagLockMinimumReleaseAge, ValueName: "MINIMUM_RELEASE_AGE", ValueDemanded: true, Short: "Only lock versions released before this age or date", Long: "Only lock versions released before this age or date\n\nSupports absolute dates like \"2024-06-01\" and relative durations like \"90d\" or \"1y\". This only affects fuzzy version matches like \"20\" or \"latest\". Explicitly pinned versions like \"22.5.0\" are not filtered. Existing matching lockfile entries are preserved and are not downgraded solely by this flag."},
+ {Key: ArgLockTool, Short: "Tool(s) to update in lockfile\ne.g.: node python\nIf not specified, all configured and task-specific tools will be updated", Long: "Tool(s) to update in lockfile\ne.g.: node python\nIf not specified, all configured and task-specific tools will be updated"},
+ {Key: CmdLs, Short: "List installed and active tool versions", Long: "List installed and active tool versions\n\nThis command lists tools that mise \"knows about\". These may be tools that are currently installed, or those that are in a config file (active) but may or may not be installed.\n\nIt's a useful command to get the current state of your tools.", VisibleAliases: []string{"list"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise ls\x1b[22m\n node 20.0.0 ~/src/myapp/.tool-versions latest\n python 3.11.0 ~/.tool-versions 3.10\n python 3.10.0\n\n $ \x1b[1mmise ls --current\x1b[22m\n node 20.0.0 ~/src/myapp/.tool-versions 20\n python 3.11.0 ~/.tool-versions 3.11.0\n\n $ \x1b[1mmise ls --json\x1b[22m\n {\n \"node\": [\n {\n \"version\": \"20.0.0\",\n \"install_path\": \"/Users/jdx/.mise/installs/node/20.0.0\",\n \"source\": {\n \"type\": \"mise.toml\",\n \"path\": \"/Users/jdx/mise.toml\"\n }\n }\n ],\n \"python\": [...]\n }\n\n $ \x1b[1mmise ls --all-sources\x1b[22m\n node 20.0.0 ~/src/myapp/mise.toml 20\n ~/.config/mise/config.toml latest\n"},
+ {Key: FlagLsCurrent, Short: "Only show tool versions currently specified in a mise.toml", Long: "Only show tool versions currently specified in a mise.toml"},
+ {Key: FlagLsGlobal, Short: "Only show tool versions currently specified in the global mise.toml", Long: "Only show tool versions currently specified in the global mise.toml"},
+ {Key: FlagLsInstalled, Short: "Only show tool versions that are installed (Hides tools defined in mise.toml but not installed)", Long: "Only show tool versions that are installed\n(Hides tools defined in mise.toml but not installed)"},
+ {Key: FlagLsJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagLsLocal, Short: "Only show tool versions currently specified in the local mise.toml", Long: "Only show tool versions currently specified in the local mise.toml"},
+ {Key: FlagLsMissing, Short: "Display missing tool versions", Long: "Display missing tool versions"},
+ {Key: FlagLsOffline, Hide: true, Short: "Don't fetch information such as outdated versions", Long: "Don't fetch information such as outdated versions"},
+ {Key: FlagLsPlugin, Hide: true, ValueName: "PLUGIN", ValueDemanded: true},
+ {Key: FlagLsAllSources, Short: "Display all tracked config sources for tools", Long: "Display all tracked config sources for tools"},
+ {Key: FlagLsMonorepo, Short: "List tools from every [monorepo].config_roots config root", Long: "List tools from every [monorepo].config_roots config root\n\nUses the active MISE_ENV and requires monorepo_root = true plus explicit [monorepo].config_roots in the monorepo root config.", Env: "MISE_MONOREPO"},
+ {Key: FlagLsNoHeader, Short: "Don't display headers", Long: "Don't display headers"},
+ {Key: FlagLsOutdated, Short: "Display whether a version is outdated", Long: "Display whether a version is outdated"},
+ {Key: FlagLsPrefix, ValueName: "PREFIX", ValueDemanded: true, Short: "Display versions matching this prefix", Long: "Display versions matching this prefix"},
+ {Key: FlagLsPrunable, Short: "List only tools that can be pruned with `mise prune`", Long: "List only tools that can be pruned with `mise prune`"},
+ {Key: ArgLsInstalledTool, Short: "Only show tool versions from [TOOL]", Long: "Only show tool versions from [TOOL]"},
+ {Key: CmdLsRemote, Short: "List runtime versions available for install.", Long: "List runtime versions available for install.\n\nNote that the results may be cached, run `mise cache clean` to clear the cache and get fresh results.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise ls-remote node\x1b[22m\n 18.0.0\n 20.0.0\n\n $ \x1b[1mmise ls-remote node@20\x1b[22m\n 20.0.0\n 20.1.0\n\n $ \x1b[1mmise ls-remote node 20\x1b[22m\n 20.0.0\n 20.1.0\n\n $ \x1b[1mmise ls-remote node --minimum-release-age 2024-01-01\x1b[22m\n 20.0.0\n\n $ \x1b[1mmise ls-remote github:cli/cli --json\x1b[22m\n [{\"version\":\"2.62.0\",\"created_at\":\"2024-11-14T15:40:35Z\",\"prerelease\":false},{\"version\":\"2.61.0\",\"created_at\":\"2024-10-23T19:22:15Z\",\"prerelease\":false}]\n"},
+ {Key: FlagLsRemoteAll, Short: "Show all installed plugins and versions", Long: "Show all installed plugins and versions"},
+ {Key: FlagLsRemoteMinimumReleaseAge, ValueName: "MINIMUM_RELEASE_AGE", ValueDemanded: true, Short: "Only show versions released before this age or date", Long: "Only show versions released before this age or date\n\nSupports absolute dates like \"2024-06-01\" and relative durations like \"90d\" or \"1y\"."},
+ {Key: FlagLsRemoteJson, Short: "Output in JSON format (includes version metadata like created_at timestamps when available)", Long: "Output in JSON format (includes version metadata like created_at timestamps when available)"},
+ {Key: FlagLsRemoteNoVersionsHost, Short: "Disable checking the mise-versions host", Long: "Disable checking the mise-versions host"},
+ {Key: FlagLsRemotePrerelease, Short: "Include pre-release versions in the output for backends that report\nupstream prerelease metadata or opt in to regex-based prerelease\ndetection. Equivalent to setting `MISE_PRERELEASES=1` or the\n`prereleases` setting for the duration of this command.", Long: "Include pre-release versions in the output for backends that report\nupstream prerelease metadata or opt in to regex-based prerelease\ndetection. Equivalent to setting `MISE_PRERELEASES=1` or the\n`prereleases` setting for the duration of this command."},
+ {Key: FlagLsRemoteStrictMetadata, Short: "Fail if release metadata fetches fail", Long: "Fail if release metadata fetches fail\n\nRequires --json and --no-versions-host.\n\nThis prevents metadata consumers from accepting empty fallback results when a backend's metadata-producing upstream request fails."},
+ {Key: ArgLsRemoteToolVersion, Short: "Tool to get versions for", Long: "Tool to get versions for"},
+ {Key: ArgLsRemotePrefix, Short: "The version prefix to use when querying the latest version\nsame as the first argument after the \"@\"", Long: "The version prefix to use when querying the latest version\nsame as the first argument after the \"@\""},
+ {Key: CmdMcp, Short: "Run Model Context Protocol (MCP) server", Long: "Run Model Context Protocol (MCP) server\n\nThis command starts an MCP server that exposes mise functionality to AI assistants over stdin/stdout using JSON-RPC protocol.\n\nThe MCP server provides access to: - Installed and available tools - Task definitions and execution - Environment variables - Configuration information - Task execution via the run_task tool\n\nResources available: - mise://tools - List all tools (use ?include_inactive=true to include inactive tools) - mise://tasks - List all tasks with their configurations - mise://env - List all environment variables - mise://config - Show configuration files and project root\n\nTools available: - list_commands - Every mise command, with its declared effect on the world - install_tool - Install a tool with an optional version (not yet implemented) - run_task - Execute a mise task with optional arguments\n\nNote: This is primarily intended for integration with AI assistants like Claude, Cursor, or other tools that support the Model Context Protocol.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n # Start the MCP server (typically used by AI assistant tools)\n $ \x1b[1mmise mcp\x1b[22m\n\n # Example integration with Claude Desktop (add to claude_desktop_config.json):\n {\n \"mcpServers\": {\n \"mise\": {\n \"command\": \"mise\",\n \"args\": [\"mcp\"],\n \"env\": {}\n }\n }\n }\n\n # Interactive testing with JSON-RPC commands:\n $ \x1b[1mecho '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"test\",\"version\":\"1.0\"}}}' | mise mcp\x1b[22m\n\n # Resources you can query:\n - \x1b[1mmise://tools\x1b[22m - List active tools\n - \x1b[1mmise://tools?include_inactive=true\x1b[22m - List all installed tools\n - \x1b[1mmise://tasks\x1b[22m - List all tasks\n - \x1b[1mmise://env\x1b[22m - List environment variables\n - \x1b[1mmise://config\x1b[22m - Show configuration info\n\n # Tools available:\n - \x1b[1mlist_commands\x1b[22m - Every mise command and what running it does\n Example: {\"include_hidden\": false}\n - \x1b[1minstall_tool\x1b[22m - Install a tool (not yet implemented)\n - \x1b[1mrun_task\x1b[22m - Execute a mise task with optional arguments\n Example: {\"task\": \"build\", \"args\": [\"--verbose\"]}\n"},
+ {Key: CmdOci, Short: "[experimental] Build OCI container images from a mise.toml", Long: "[experimental] Build OCI container images from a mise.toml\n\nEach tool becomes its own OCI layer, so bumping any single tool version only invalidates one content-addressable blob — unlike a Dockerfile where changing an early `RUN` invalidates every layer above it.\n\nThis command is experimental and requires `mise settings experimental=true` (or `MISE_EXPERIMENTAL=1`). Behavior, flags, and output layout may change in future releases.", SubcommandRequired: true},
+ {Key: CmdOciBuild, Short: "[experimental] Build an OCI image from the current mise.toml", Long: "[experimental] Build an OCI image from the current mise.toml\n\nEach tool version becomes its own content-addressable OCI layer. Bumping a tool version only invalidates that tool's layer — other tools, the base image, and config are reused unchanged. The output directory conforms to the OCI image-layout spec and can be consumed by `skopeo`, `crane`, or `podman load`.\n\nRequires `mise settings experimental=true` (or `MISE_EXPERIMENTAL=1`).", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n Build with defaults (debian:bookworm-slim base):\n $ \x1b[1mmise oci build\x1b[22m\n\n Build with a specific base image and tag:\n $ \x1b[1mmise oci build --from ubuntu:24.04 --tag myorg/dev:latest -o ./img\x1b[22m\n\n Inspect the result with skopeo:\n $ \x1b[1mskopeo inspect oci:./mise-oci\x1b[22m\n\n Push to a registry:\n $ \x1b[1mmise oci push --image-dir ./mise-oci ghcr.io/me/dev:latest\x1b[22m\n\n\x1b[1m\x1b[4mNotes:\x1b[22m\x1b[24m\n\n - The image only contains tools from the project's mise config (and\n any configs at-or-below the project root). Tools from\n `~/.config/mise/config.toml` are not included; pass --include-global\n to package them too.\n - asdf and vfox plugins are not supported in v1; use a different backend\n (core, aqua, ubi, github, cargo, npm, go, pipx, spm, http) for each tool.\n - The host mise binary is embedded at /usr/local/bin/mise by default;\n build on the same OS/arch as your target image (or pass --no-mise).\n"},
+ {Key: FlagOciBuildCopy, Repeatable: true, ValueName: "HOST_PATH:IMAGE_PATH", ValueDemanded: true, Short: "Copy a host file, directory, or symlink into the image (repeatable, HOST:IMAGE)", Long: "Copy a host file, directory, or symlink into the image (repeatable, HOST:IMAGE)"},
+ {Key: FlagOciBuildOutput, ValueName: "OUTPUT", ValueDemanded: true, Short: "Output directory for the OCI image layout", Long: "Output directory for the OCI image layout", Default: []string{"./mise-oci"}},
+ {Key: FlagOciBuildFrom, ValueName: "FROM", ValueDemanded: true, Short: "Base image reference (overrides [oci].from and the oci.default_from setting)", Long: "Base image reference (overrides [oci].from and the oci.default_from setting)"},
+ {Key: FlagOciBuildIncludeGlobal, Short: "Also include tools from the global / system config (default: project-only)", Long: "Also include tools from the global / system config (default: project-only)\n\nBy default `mise oci build` only packages tools declared in the project's mise config (and any parent configs at-or-below the project root, e.g. a monorepo root config). Personal dev tools in `~/.config/mise/config.toml` are excluded so they don't bake into a project image. Pass `--include-global` to revert to the old \"merge all loaded configs\" behavior."},
+ {Key: FlagOciBuildTag, ValueName: "TAG", ValueDemanded: true, Short: "Tag to record in the image index (the org.opencontainers.image.ref.name annotation)", Long: "Tag to record in the image index (the org.opencontainers.image.ref.name annotation)"},
+ {Key: FlagOciBuildMountPoint, ValueName: "MOUNT_POINT", ValueDemanded: true, Short: "Where to place tool installs inside the image (default: /mise)", Long: "Where to place tool installs inside the image (default: /mise)"},
+ {Key: FlagOciBuildNoMise, Short: "Do not embed the currently-running mise binary at /usr/local/bin/mise", Long: "Do not embed the currently-running mise binary at /usr/local/bin/mise"},
+ {Key: FlagOciBuildOwner, ValueName: "UID[:GID]", ValueDemanded: true, Short: "UID[:GID] to assign to every tar entry in generated layers", Long: "UID[:GID] to assign to every tar entry in generated layers\n\nOverrides [oci].user_id / [oci].group_id. Defaults to 0:0. If GID is omitted, it defaults to UID. This affects file ownership only; [oci].user controls the image USER directive."},
+ {Key: CmdOciPush, Short: "[experimental] Build an OCI image and push it to a registry", Long: "[experimental] Build an OCI image and push it to a registry\n\nPushes with mise's built-in registry client — no skopeo/crane/docker required. If `--image-dir` is not passed, builds fresh from the current mise.toml first. Only blobs the registry doesn't already have are uploaded, so repeat pushes of mostly-unchanged toolsets are cheap.\n\nTool layers whose tool, version, mount point, and file owner match the previously pushed image (or `--cache-from`) are reused without being rebuilt — those tools don't even need to be installed locally. Pass `--no-cache` to force a full local rebuild.\n\nCredentials are read from the same places docker and podman use: `$REGISTRY_AUTH_FILE`, `$XDG_RUNTIME_DIR/containers/auth.json`, `~/.config/containers/auth.json`, and `~/.docker/config.json` (including credential helpers) — so `docker login` / `podman login` is all the setup needed.\n\nRequires `mise settings experimental=true` (or `MISE_EXPERIMENTAL=1`).", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n Build and push to GHCR:\n $ \x1b[1mmise oci push ghcr.io/me/devenv:latest\x1b[22m\n\n Push an image built earlier:\n $ \x1b[1mmise oci build -o ./img\x1b[22m\n $ \x1b[1mmise oci push --image-dir ./img ghcr.io/me/devenv:v1\x1b[22m\n\n\x1b[1m\x1b[4mAuth:\x1b[22m\x1b[24m\n\n Credentials are resolved the same way docker/podman resolve them:\n \x1b[1m$REGISTRY_AUTH_FILE\x1b[22m, \x1b[1m$XDG_RUNTIME_DIR/containers/auth.json\x1b[22m,\n \x1b[1m~/.config/containers/auth.json\x1b[22m, then \x1b[1m~/.docker/config.json\x1b[22m\n (inline auths and credential helpers). Log in with either:\n $ \x1b[1mdocker login ghcr.io\x1b[22m\n $ \x1b[1mpodman login ghcr.io\x1b[22m\n"},
+ {Key: FlagOciPushCacheFrom, ValueName: "REF", ValueDemanded: true, Short: "Reuse unchanged tool layers from this image instead of the destination ref", Long: "Reuse unchanged tool layers from this image instead of the destination ref\n\nMust live in the same repository as the destination. Useful when each push gets a unique tag (e.g. per-commit tags in CI): `--cache-from ghcr.io/me/dev:latest ghcr.io/me/dev:$SHA`."},
+ {Key: FlagOciPushFrom, ValueName: "FROM", ValueDemanded: true, Short: "Base image for the build (ignored with --image-dir)", Long: "Base image for the build (ignored with --image-dir)"},
+ {Key: FlagOciPushImageDir, ValueName: "IMAGE_DIR", ValueDemanded: true, Short: "Push an already-built OCI image layout (skip the build step)", Long: "Push an already-built OCI image layout (skip the build step)"},
+ {Key: FlagOciPushIncludeGlobal, Short: "Also include tools from the global / system config (default: project-only)", Long: "Also include tools from the global / system config (default: project-only)\n\nSee `mise oci build --help` for details."},
+ {Key: FlagOciPushMountPoint, ValueName: "MOUNT_POINT", ValueDemanded: true, Short: "Override in-image mount point (ignored with --image-dir)", Long: "Override in-image mount point (ignored with --image-dir)"},
+ {Key: FlagOciPushNoCache, Short: "Don't reuse tool layers from the previously pushed image", Long: "Don't reuse tool layers from the previously pushed image"},
+ {Key: FlagOciPushNoMise, Short: "Don't embed the mise binary (ignored with --image-dir)", Long: "Don't embed the mise binary (ignored with --image-dir)"},
+ {Key: FlagOciPushOwner, ValueName: "UID[:GID]", ValueDemanded: true, Short: "UID[:GID] to assign to every tar entry when building (conflicts with --image-dir)", Long: "UID[:GID] to assign to every tar entry when building (conflicts with --image-dir)\n\nOverrides [oci].user_id / [oci].group_id. Defaults to 0:0. If GID is omitted, it defaults to UID. This affects file ownership only; [oci].user controls the image USER directive."},
+ {Key: FlagOciPushUpdateIndex, Short: "Maintain the tag as a multi-arch image index", Long: "Maintain the tag as a multi-arch image index\n\nPushes this build's manifest by digest and points the tag at an OCI image index containing one entry per platform, preserving entries other architectures pushed. Run `mise oci push --update-index` from one runner per platform to assemble a multi-arch tag."},
+ {Key: ArgOciPushRef, Demanded: true, Short: "Destination registry reference (e.g. `ghcr.io/me/devenv:latest`)", Long: "Destination registry reference (e.g. `ghcr.io/me/devenv:latest`)"},
+ {Key: CmdOciRun, Short: "[experimental] Build an OCI image from the current mise.toml and run a command in it", Long: "[experimental] Build an OCI image from the current mise.toml and run a command in it\n\nEquivalent to `mise oci build` followed by `docker run` / `podman run`. The built image is loaded into the local container engine (podman pulls the OCI layout natively; docker receives it via `docker load`) and the given command is executed inside it with stdin/stdout/stderr inherited.\n\nRequires `mise settings experimental=true` (or `MISE_EXPERIMENTAL=1`) and one of: `podman`, `docker`.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n Build the current mise.toml and drop into bash:\n $ \x1b[1mmise oci run -it -- bash\x1b[22m\n\n Run a one-shot command with env + volume (note: `-v` is reserved\n for --verbose, so use `--volume`):\n $ \x1b[1mmise oci run -e DEBUG=1 --volume $PWD:/work -w /work -- npm test\x1b[22m\n\n Re-use a previously built layout (skip the build step):\n $ \x1b[1mmise oci build -o ./img && mise oci run --image-dir ./img -- node -e 'console.log(process.version)'\x1b[22m\n\n\x1b[1m\x1b[4mEngines:\x1b[22m\x1b[24m\n\n Prefers \x1b[1mpodman\x1b[22m (loads OCI layouts natively). Falls back to \x1b[1mdocker\x1b[22m\n (loaded via \x1b[1mdocker load\x1b[22m). Pass \x1b[1m--engine podman\x1b[22m or \x1b[1m--engine docker\x1b[22m to override.\n"},
+ {Key: FlagOciRunEngine, ValueName: "ENGINE", ValueDemanded: true, Short: "Container engine to use (`auto`, `podman`, or `docker`)", Long: "Container engine to use (`auto`, `podman`, or `docker`)", Choices: []string{"auto", "podman", "docker"}, Default: []string{"auto"}},
+ {Key: FlagOciRunFrom, ValueName: "FROM", ValueDemanded: true, Short: "Base image reference for the build (ignored with --image-dir)", Long: "Base image reference for the build (ignored with --image-dir)"},
+ {Key: FlagOciRunImageDir, ValueName: "IMAGE_DIR", ValueDemanded: true, Short: "Use an already-built OCI image layout instead of building fresh", Long: "Use an already-built OCI image layout instead of building fresh"},
+ {Key: FlagOciRunIncludeGlobal, Short: "Also include tools from the global / system config (default: project-only)", Long: "Also include tools from the global / system config (default: project-only)\n\nSee `mise oci build --help` for details."},
+ {Key: FlagOciRunKeep, Short: "Keep the loaded image in the engine's storage after the run", Long: "Keep the loaded image in the engine's storage after the run\n\nBy default, both the container (`--rm`) and the loaded image are removed when the command exits, so repeated `mise oci run` calls don't accumulate images in podman / docker storage. Pass `--keep` to retain the image under the tag mise used (`mise-oci:run-*` for docker; the pulled image ID for podman)."},
+ {Key: FlagOciRunMountPoint, ValueName: "MOUNT_POINT", ValueDemanded: true, Short: "Override in-image mount point (ignored with --image-dir)", Long: "Override in-image mount point (ignored with --image-dir)"},
+ {Key: FlagOciRunNoMise, Short: "Don't embed the mise binary (ignored with --image-dir)", Long: "Don't embed the mise binary (ignored with --image-dir)"},
+ {Key: FlagOciRunOwner, ValueName: "UID[:GID]", ValueDemanded: true, Short: "UID[:GID] to assign to every tar entry when building (conflicts with --image-dir)", Long: "UID[:GID] to assign to every tar entry when building (conflicts with --image-dir)\n\nOverrides [oci].user_id / [oci].group_id. Defaults to 0:0. If GID is omitted, it defaults to UID. This affects file ownership only; [oci].user controls the image USER directive."},
+ {Key: FlagOciRunVolume, Repeatable: true, ValueName: "HOST:CONTAINER", ValueDemanded: true, Short: "Bind-mount a host path (repeatable, `HOST:CONTAINER[:MODE]`)", Long: "Bind-mount a host path (repeatable, `HOST:CONTAINER[:MODE]`)\n\nNote: unlike `docker run -v`, there's no `-v` short flag here because mise reserves `-v` for --verbose. Use `--volume` or `--mount`."},
+ {Key: FlagOciRunEnv, Repeatable: true, ValueName: "KEY=VAL", ValueDemanded: true, Short: "Set environment variable in the container (repeatable, `KEY=VAL`)", Long: "Set environment variable in the container (repeatable, `KEY=VAL`)"},
+ {Key: FlagOciRunInteractive, Short: "Run interactively (pass `-i` to the engine)", Long: "Run interactively (pass `-i` to the engine)"},
+ {Key: FlagOciRunTty, Short: "Allocate a TTY (pass `-t` to the engine)", Long: "Allocate a TTY (pass `-t` to the engine)"},
+ {Key: FlagOciRunWorkdir, ValueName: "WORKDIR", ValueDemanded: true, Short: "Working directory inside the container", Long: "Working directory inside the container"},
+ {Key: ArgOciRunCmd, Short: "Command and arguments to run inside the container (after `--`)", Long: "Command and arguments to run inside the container (after `--`)"},
+ {Key: CmdOutdated, Short: "Shows outdated tool versions", Long: "Shows outdated tool versions\n\nSee `mise upgrade` to upgrade these versions.", AfterLongHelp: "\x1b[1m\x1b[4mDeprecation:\x1b[22m\x1b[24m\n\nThe `-l` shorthand for `--bump` is deprecated and will be removed in mise 2027.8.5.\nAfter removal, `-l` will become shorthand for `--local`. Use `-b` or `--bump` instead.\n\n\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise outdated\x1b[22m\n Plugin Requested Current Latest\n python 3.11 3.11.0 3.11.1\n node 20 20.0.0 20.1.0\n\n $ \x1b[1mmise outdated node\x1b[22m\n Plugin Requested Current Latest\n node 20 20.0.0 20.1.0\n\n $ \x1b[1mmise outdated --json\x1b[22m\n {\"python\": {\"requested\": \"3.11\", \"current\": \"3.11.0\", \"latest\": \"3.11.1\"}, ...}\n\n $ \x1b[1mmise outdated --local\x1b[22m\n Plugin Requested Current Latest\n node 20 20.0.0 20.1.0\n"},
+ {Key: FlagOutdatedBump, Short: "Compares against the latest versions available, not what matches the current config", Long: "Compares against the latest versions available, not what matches the current config\n\nFor example, if you have `node = \"20\"` in your config by default `mise outdated` will only show other 20.x versions, not 21.x or 22.x versions.\n\nUsing this flag, if there are 21.x or newer versions it will display those instead of 20.x."},
+ {Key: FlagOutdatedJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagOutdatedL, Hide: true, Short: "Deprecated shorthand for --bump", Long: "Deprecated shorthand for --bump"},
+ {Key: FlagOutdatedInactive, Short: "Show outdated tools including installed-but-inactive tools not present in the current config", Long: "Show outdated tools including installed-but-inactive tools not present in the current config\n\nBy default, `mise outdated` only shows tools that come from the current config."},
+ {Key: FlagOutdatedLocal, Short: "Only show outdated tools defined in local config files", Long: "Only show outdated tools defined in local config files\n\nThis will only show tools that are defined in project-local mise.toml and will skip tools defined in the global config (~/.config/mise/config.toml)."},
+ {Key: FlagOutdatedMonorepo, Short: "Placeholder for future monorepo outdated checks; `mise outdated --monorepo` is not implemented yet.", Long: "Placeholder for future monorepo outdated checks; `mise outdated --monorepo` is not implemented yet."},
+ {Key: FlagOutdatedNoHeader, Short: "Don't show table header", Long: "Don't show table header"},
+ {Key: ArgOutdatedToolVersion, Short: "Tool(s) to show outdated versions for\ne.g.: node@20 python@3.10\nIf not specified, all tools in global and local configs will be shown", Long: "Tool(s) to show outdated versions for\ne.g.: node@20 python@3.10\nIf not specified, all tools in global and local configs will be shown"},
+ {Key: CmdPatrons, Short: "Show the individuals supporting mise as Patron-tier members", Long: "Show the individuals supporting mise as Patron-tier members\n\nLists the individuals on the Patron tier from . The list refreshes daily; supporting terminals will render each patron's name as a clickable link via OSC 8 hyperlinks.\n\nTo appear here, become a patron at .", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise patrons\x1b[22m\n $ \x1b[1mmise patrons -J\x1b[22m\n $ \x1b[1mmise patrons --refresh\x1b[22m"},
+ {Key: FlagPatronsJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagPatronsRefresh, Short: "Bypass the local cache and re-fetch", Long: "Bypass the local cache and re-fetch"},
+ {Key: CmdPlugins, Short: "Manage plugins", VisibleAliases: []string{"p"}},
+ {Key: FlagPluginsAll, Hide: true, Short: "list all available remote plugins", Long: "list all available remote plugins\n\nsame as `mise plugins ls-remote`"},
+ {Key: FlagPluginsCore, Short: "The built-in plugins only\nNormally these are not shown", Long: "The built-in plugins only\nNormally these are not shown"},
+ {Key: FlagPluginsUrls, Short: "Show the git url for each plugin\ne.g.: https://github.com/mise-plugins/vfox-cmake.git", Long: "Show the git url for each plugin\ne.g.: https://github.com/mise-plugins/vfox-cmake.git"},
+ {Key: FlagPluginsRefs, Hide: true, Short: "Show the git refs for each plugin\ne.g.: main 1234abc", Long: "Show the git refs for each plugin\ne.g.: main 1234abc"},
+ {Key: FlagPluginsUser, Short: "List installed plugins", Long: "List installed plugins\n\nThis is the default behavior but can be used with --core to show core and user plugins"},
+ {Key: CmdPluginsInstall, Short: "Install a plugin", Long: "Install a plugin\n\nnote that mise can automatically install plugins when you install a tool e.g.: `mise install cmake@3.30` will autoinstall the cmake plugin\n\nThis behavior can be modified in ~/.config/mise/config.toml", VisibleAliases: []string{"i", "a", "add"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n # install the poetry via shorthand\n $ \x1b[1mmise plugins install poetry\x1b[22m\n\n # install the poetry plugin using a specific git url\n $ \x1b[1mmise plugins install poetry https://github.com/mise-plugins/mise-poetry.git\x1b[22m\n\n # install the poetry plugin using the git url only\n # (poetry is inferred from the url)\n $ \x1b[1mmise plugins install https://github.com/mise-plugins/mise-poetry.git\x1b[22m\n\n # install the poetry plugin using a specific ref\n $ \x1b[1mmise plugins install poetry https://github.com/mise-plugins/mise-poetry.git#11d0c1e\x1b[22m\n"},
+ {Key: FlagPluginsInstallAll, Short: "Install all missing plugins\nThis will only install plugins that have matching shorthands.\ni.e.: they don't need the full git repo url", Long: "Install all missing plugins\nThis will only install plugins that have matching shorthands.\ni.e.: they don't need the full git repo url"},
+ {Key: FlagPluginsInstallForce, Short: "Reinstall even if plugin exists", Long: "Reinstall even if plugin exists"},
+ {Key: FlagPluginsInstallJobs, ValueName: "JOBS", ValueDemanded: true, Short: "Number of jobs to run in parallel\nValues below 1 are treated as 1", Long: "Number of jobs to run in parallel\nValues below 1 are treated as 1"},
+ {Key: FlagPluginsInstallVerbose, Repeatable: true, Short: "Show installation output", Long: "Show installation output"},
+ {Key: ArgPluginsInstallNewPlugin, Short: "The name of the plugin to install\ne.g.: cmake, poetry\nCan specify multiple plugins: `mise plugins install cmake poetry`", Long: "The name of the plugin to install\ne.g.: cmake, poetry\nCan specify multiple plugins: `mise plugins install cmake poetry`"},
+ {Key: ArgPluginsInstallGitUrl, Short: "The git url of the plugin", Long: "The git url of the plugin"},
+ {Key: ArgPluginsInstallRest, Hide: true},
+ {Key: CmdPluginsLink, Short: "Symlinks a plugin into mise", Long: "Symlinks a plugin into mise\n\nThis is used for developing a plugin.", VisibleAliases: []string{"ln"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n # essentially just `ln -s ./vfox-cmake ~/.local/share/mise/plugins/cmake`\n $ \x1b[1mmise plugins link cmake ./vfox-cmake\x1b[22m\n\n # infer plugin name as \"cmake\"\n $ \x1b[1mmise plugins link ./vfox-cmake\x1b[22m\n"},
+ {Key: FlagPluginsLinkForce, Short: "Overwrite existing plugin", Long: "Overwrite existing plugin"},
+ {Key: ArgPluginsLinkName, Demanded: true, Short: "The name of the plugin\ne.g.: cmake, poetry", Long: "The name of the plugin\ne.g.: cmake, poetry"},
+ {Key: ArgPluginsLinkDir, Short: "The local path to the plugin\ne.g.: ./vfox-cmake", Long: "The local path to the plugin\ne.g.: ./vfox-cmake"},
+ {Key: CmdPluginsLs, Short: "List installed plugins", Long: "List installed plugins\n\nCan also show remotely available plugins to install.", VisibleAliases: []string{"list"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise plugins ls\x1b[22m\n cmake\n poetry\n\n $ \x1b[1mmise plugins ls --urls\x1b[22m\n cmake https://github.com/mise-plugins/vfox-cmake.git\n poetry https://github.com/mise-plugins/vfox-poetry.git\n"},
+ {Key: FlagPluginsLsAll, Hide: true, Short: "List all available remote plugins\nSame as `mise plugins ls-remote`", Long: "List all available remote plugins\nSame as `mise plugins ls-remote`"},
+ {Key: FlagPluginsLsCore, Hide: true, Short: "The built-in plugins only\nNormally these are not shown", Long: "The built-in plugins only\nNormally these are not shown"},
+ {Key: FlagPluginsLsOutdated, Short: "Show plugins with available updates\nChecks the remote for newer versions and only displays plugins that are outdated", Long: "Show plugins with available updates\nChecks the remote for newer versions and only displays plugins that are outdated"},
+ {Key: FlagPluginsLsUrls, Short: "Show the git url for each plugin\ne.g.: https://github.com/mise-plugins/vfox-cmake.git", Long: "Show the git url for each plugin\ne.g.: https://github.com/mise-plugins/vfox-cmake.git"},
+ {Key: FlagPluginsLsRefs, Hide: true, Short: "Show the git refs for each plugin\ne.g.: main 1234abc", Long: "Show the git refs for each plugin\ne.g.: main 1234abc"},
+ {Key: FlagPluginsLsUser, Hide: true, Short: "List installed plugins", Long: "List installed plugins"},
+ {Key: CmdPluginsLsRemote, Short: "List all available remote plugins", Long: "\nList all available remote plugins\n\nThe full list is here: https://github.com/jdx/mise/blob/main/registry/\n\nExamples:\n\n $ mise plugins ls-remote\n", VisibleAliases: []string{"list-remote", "list-all"}},
+ {Key: FlagPluginsLsRemoteUrls, Short: "Show the git url for each plugin e.g.: https://github.com/mise-plugins/mise-poetry.git", Long: "Show the git url for each plugin\ne.g.: https://github.com/mise-plugins/mise-poetry.git"},
+ {Key: FlagPluginsLsRemoteOnlyNames, Short: "Only show the name of each plugin by default it will show a \"*\" next to installed plugins", Long: "Only show the name of each plugin\nby default it will show a \"*\" next to installed plugins"},
+ {Key: CmdPluginsUninstall, Short: "Removes a plugin", VisibleAliases: []string{"remove", "rm"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise plugins uninstall cmake\x1b[22m\n"},
+ {Key: FlagPluginsUninstallAll, Short: "Remove all plugins", Long: "Remove all plugins"},
+ {Key: FlagPluginsUninstallPurge, Short: "Also remove the plugin's installs, downloads, and cache", Long: "Also remove the plugin's installs, downloads, and cache"},
+ {Key: ArgPluginsUninstallPlugin, Short: "Plugin(s) to remove", Long: "Plugin(s) to remove"},
+ {Key: CmdPluginsUpdate, Short: "Updates a plugin to the latest version", Long: "Updates a plugin to the latest version\n\nnote: this updates the plugin itself, not the runtime versions", VisibleAliases: []string{"up", "upgrade"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise plugins update\x1b[22m # update all plugins\n $ \x1b[1mmise plugins update cmake\x1b[22m # update only cmake\n $ \x1b[1mmise plugins update cmake#beta\x1b[22m # specify a ref\n"},
+ {Key: FlagPluginsUpdateJobs, ValueName: "JOBS", ValueDemanded: true, Short: "Number of jobs to run in parallel\nValues below 1 are treated as 1\nDefault: 4", Long: "Number of jobs to run in parallel\nValues below 1 are treated as 1\nDefault: 4"},
+ {Key: ArgPluginsUpdatePlugin, Short: "Plugin(s) to update", Long: "Plugin(s) to update"},
+ {Key: CmdDeps, Short: "[experimental] Manage project dependencies", Long: "[experimental] Manage project dependencies\n\nRuns all applicable dependency install steps for the current project. This checks if dependency lockfiles are newer than installed outputs (e.g., package-lock.json vs node_modules/) and runs install commands if needed.\n\nProviders with `auto = true` are automatically invoked before `mise x` and `mise run` unless skipped with the --no-deps flag.", VisibleAliases: []string{"dep"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise deps\x1b[22m # Install all project dependencies\n $ \x1b[1mmise deps install\x1b[22m # Same as bare `mise deps`\n $ \x1b[1mmise deps install --force\x1b[22m # Force reinstall even if fresh\n $ \x1b[1mmise deps install --dry-run\x1b[22m # Show what would run\n $ \x1b[1mmise deps --monorepo\x1b[22m # Install deps from explicit monorepo config roots\n $ \x1b[1mmise deps add npm:react\x1b[22m # Add a dependency\n $ \x1b[1mmise deps add -D npm:vitest\x1b[22m # Add a dev dependency\n $ \x1b[1mmise deps remove npm:lodash\x1b[22m # Remove a dependency\n\n\x1b[1m\x1b[4mConfiguration:\x1b[22m\x1b[24m\n\n```toml\n# Built-in npm provider (auto-detects lockfile)\n[deps.npm]\nauto = true # Auto-run before mise x/run\n\n# Custom provider\n[deps.codegen]\nauto = true\nsources = [\"schema/*.graphql\"]\noutputs = [\"src/generated/\"]\nrun = \"npm run codegen\"\n\n[deps]\ndisable = [\"npm\"] # Disable specific providers at runtime\n```\n"},
+ {Key: FlagDepsExplain, Short: "Show why a provider is fresh or stale (requires a provider argument)", Long: "Show why a provider is fresh or stale (requires a provider argument)"},
+ {Key: FlagDepsForce, Short: "Force run all deps steps even if outputs are fresh", Long: "Force run all deps steps even if outputs are fresh"},
+ {Key: FlagDepsDryRun, Short: "Only check if deps install is needed, don't run commands", Long: "Only check if deps install is needed, don't run commands"},
+ {Key: FlagDepsList, Short: "Show what deps providers are available", Long: "Show what deps providers are available"},
+ {Key: FlagDepsMonorepo, Short: "Install dependencies from every [monorepo].config_roots config root", Long: "Install dependencies from every [monorepo].config_roots config root\n\nRequires monorepo_root = true plus explicit [monorepo].config_roots in the monorepo root config. Providers are named like //apps/api:uv.", Env: "MISE_MONOREPO"},
+ {Key: FlagDepsOnly, Repeatable: true, ValueName: "ONLY", ValueDemanded: true, Short: "Run specific deps rule(s) only", Long: "Run specific deps rule(s) only"},
+ {Key: FlagDepsSkip, Repeatable: true, ValueName: "SKIP", ValueDemanded: true, Short: "Skip specific deps rule(s)", Long: "Skip specific deps rule(s)"},
+ {Key: ArgDepsProvider, Short: "Provider to operate on (runs only this provider, or use with --explain)", Long: "Provider to operate on (runs only this provider, or use with --explain)"},
+ {Key: CmdDepsAdd, Short: "Add a dependency", Long: "Add a dependency\n\nAdds one or more packages to the project using the appropriate package manager. Package specs use the format `ecosystem:package`, e.g., `npm:react` or `npm:@types/react@19`."},
+ {Key: FlagDepsAddDev, Short: "Add as a development dependency", Long: "Add as a development dependency"},
+ {Key: ArgDepsAddPackages, Demanded: true, Short: "Package(s) to add (e.g., npm:react, npm:@types/react@19)", Long: "Package(s) to add (e.g., npm:react, npm:@types/react@19)"},
+ {Key: CmdDepsInstall, Short: "Install all project dependencies", Long: "Install all project dependencies\n\nChecks if dependency lockfiles are newer than installed outputs and runs install commands if needed."},
+ {Key: FlagDepsInstallExplain, Short: "Show why a provider is fresh or stale (requires a provider argument)", Long: "Show why a provider is fresh or stale (requires a provider argument)"},
+ {Key: FlagDepsInstallForce, Short: "Force run all deps steps even if outputs are fresh", Long: "Force run all deps steps even if outputs are fresh"},
+ {Key: FlagDepsInstallDryRun, Short: "Only check if deps install is needed, don't run commands", Long: "Only check if deps install is needed, don't run commands"},
+ {Key: FlagDepsInstallList, Short: "Show what deps providers are available", Long: "Show what deps providers are available"},
+ {Key: FlagDepsInstallMonorepo, Short: "Install dependencies from every [monorepo].config_roots config root", Long: "Install dependencies from every [monorepo].config_roots config root\n\nRequires monorepo_root = true plus explicit [monorepo].config_roots in the monorepo root config. Providers are named like //apps/api:uv.", Env: "MISE_MONOREPO"},
+ {Key: FlagDepsInstallOnly, Repeatable: true, ValueName: "ONLY", ValueDemanded: true, Short: "Run specific deps rule(s) only", Long: "Run specific deps rule(s) only"},
+ {Key: FlagDepsInstallSkip, Repeatable: true, ValueName: "SKIP", ValueDemanded: true, Short: "Skip specific deps rule(s)", Long: "Skip specific deps rule(s)"},
+ {Key: ArgDepsInstallProvider, Short: "Provider to operate on (runs only this provider, or use with --explain)", Long: "Provider to operate on (runs only this provider, or use with --explain)"},
+ {Key: CmdDepsRemove, Short: "Remove a dependency", Long: "Remove a dependency\n\nRemoves one or more packages from the project using the appropriate package manager. Package specs use the format `ecosystem:package`, e.g., `npm:lodash`."},
+ {Key: ArgDepsRemovePackages, Demanded: true, Short: "Package(s) to remove (e.g., npm:lodash)", Long: "Package(s) to remove (e.g., npm:lodash)"},
+ {Key: CmdPrune, Short: "Delete unused versions of tools", Long: "Delete unused versions of tools\n\nmise tracks which config files have been used in ~/.local/state/mise/tracked-configs Versions which are no longer the latest specified in any of those configs are deleted. Versions installed only with environment variables `MISE__VERSION` will be deleted, as will versions only referenced on the command line `mise exec @`.\n\nTool stubs that have been executed are tracked in ~/.local/state/mise/tracked-stubs. Versions still referenced by a tracked stub are not deleted.\n\nYou can list prunable tools with `mise ls --prunable`", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise prune --dry-run\x1b[22m\n rm -rf ~/.local/share/mise/versions/node/20.0.0\n rm -rf ~/.local/share/mise/versions/node/20.0.1\n"},
+ {Key: FlagPruneDryRun, Short: "Do not actually delete anything", Long: "Do not actually delete anything"},
+ {Key: FlagPruneConfigs, Short: "Prune only tracked and trusted configuration links that point to nonexistent configurations", Long: "Prune only tracked and trusted configuration links that point to nonexistent configurations"},
+ {Key: FlagPruneDryRunCode, Short: "Like --dry-run but exits with code 1 if there are tools to prune", Long: "Like --dry-run but exits with code 1 if there are tools to prune\n\nThis is useful for scripts to check if tools need to be pruned."},
+ {Key: FlagPruneMonorepo, Short: "Placeholder for future monorepo pruning; `mise prune --monorepo` is not implemented yet.", Long: "Placeholder for future monorepo pruning; `mise prune --monorepo` is not implemented yet."},
+ {Key: FlagPruneTools, Short: "Prune only unused versions of tools", Long: "Prune only unused versions of tools"},
+ {Key: ArgPruneInstalledTool, Short: "Prune only these tools", Long: "Prune only these tools"},
+ {Key: CmdRegistry, Short: "List available tools to install", Long: "List available tools to install\n\nThis command lists the tools available in the registry as shorthand names.\n\nFor example, `poetry` is shorthand for `asdf:mise-plugins/mise-poetry`.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise registry\x1b[22m\n node core:node\n poetry asdf:mise-plugins/mise-poetry\n ubi cargo:ubi-cli\n\n $ \x1b[1mmise registry poetry\x1b[22m\n asdf:mise-plugins/mise-poetry\n"},
+ {Key: FlagRegistryBackend, ValueName: "BACKEND", ValueDemanded: true, Short: "Show only tools for this backend", Long: "Show only tools for this backend"},
+ {Key: FlagRegistryComplete, Hide: true, Short: "Print all tools with descriptions for shell completions", Long: "Print all tools with descriptions for shell completions"},
+ {Key: FlagRegistryHideAliased, Short: "Hide aliased tools", Long: "Hide aliased tools"},
+ {Key: FlagRegistryJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagRegistrySecurity, Short: "Include security features for each tool's backends in JSON output.", Long: "Include security features for each tool's backends in JSON output.\n\nRequires --json. Security info is de-duplicated across all of a tool's backends. This can add noticeable time for large listings since each backend's security info is resolved individually."},
+ {Key: ArgRegistryName, Short: "Show only the specified tool's full name", Long: "Show only the specified tool's full name"},
+ {Key: CmdRenderHelp, Hide: true, Short: "internal command to generate markdown from help"},
+ {Key: CmdReshim, Short: "Creates new shims based on bin paths from currently installed tools.", Long: "Creates new shims based on bin paths from currently installed tools.\n\nThis creates new shims in ~/.local/share/mise/shims for CLIs that have been added. mise will try to do this automatically for commands like `npm i -g` but there are other ways to install things (like using yarn or pnpm for node) that mise does not know about and so it will be necessary to call this explicitly.\n\nIf you think mise should automatically call this for a particular command, please open an issue on the mise repo. You can also set up a shell function to reshim automatically (it's really fast so you don't need to worry about overhead):\n\n npm() {\n command npm \"$@\"\n mise reshim\n }\n\nNote that this creates shims for _all_ installed tools, not just the ones that are currently active in mise.toml.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise reshim\x1b[22m\n $ \x1b[1m~/.local/share/mise/shims/node -v\x1b[22m\n v20.0.0\n"},
+ {Key: FlagReshimForce, Short: "Removes all shims before reshimming", Long: "Removes all shims before reshimming"},
+ {Key: ArgReshimTool, Hide: true},
+ {Key: ArgReshimVersion, Hide: true},
+ {Key: CmdRun, Short: "Run task(s)", Long: "Run task(s)\n\nThis command will run a task, or multiple tasks in parallel. Tasks may have dependencies on other tasks or on source files. If source is configured on a task, it will only run if the source files have changed.\n\nTasks can be defined in mise.toml or as standalone scripts. In mise.toml, tasks take this form:\n\n [tasks.build]\n run = \"npm run build\"\n sources = [\"src/**/*.ts\"]\n outputs = [\"dist/**/*.js\"]\n\nAlternatively, tasks can be defined as standalone scripts. These must be located in `mise-tasks`, `.mise-tasks`, `.mise/tasks`, `mise/tasks` or `.config/mise/tasks`. The name of the script will be the name of the tasks.\n\n $ cat .mise/tasks/build<` to create/modify environment-specific config files like `mise..toml`.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise set NODE_ENV=production\x1b[22m\n\n $ \x1b[1mmise set NODE_ENV\x1b[22m\n production\n\n $ \x1b[1mmise set -E staging NODE_ENV=staging\x1b[22m\n # creates or modifies mise.staging.toml\n\n $ \x1b[1mmise set\x1b[22m\n key value source\n NODE_ENV production ~/.config/mise/config.toml\n\n $ \x1b[1mmise set --prompt PASSWORD\x1b[22m\n Enter value for PASSWORD: [hidden input]\n\n \x1b[1m\x1b[4mMultiline Values (--stdin):\x1b[22m\x1b[24m\n\n $ \x1b[1mcat private.key | mise set --stdin MY_KEY\x1b[22m\n\n $ \x1b[1mprintf \"line1\\nline2\" | mise set --stdin MY_KEY\x1b[22m\n\n \x1b[1m\x1b[4m[experimental] Age Encryption:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise set --age-encrypt API_KEY=secret\x1b[22m\n\n $ \x1b[1mmise set --age-encrypt --prompt API_KEY\x1b[22m\n Enter value for API_KEY: [hidden input]\n"},
+ {Key: FlagSetEnv, ValueName: "ENV", ValueDemanded: true, Short: "Create/modify an environment-specific config file like .mise..toml", Long: "Create/modify an environment-specific config file like .mise..toml"},
+ {Key: FlagSetGlobal, Short: "Set the environment variable in the global config file", Long: "Set the environment variable in the global config file"},
+ {Key: FlagSetAgeEncrypt, Short: "[experimental] Encrypt the value with age before storing", Long: "[experimental] Encrypt the value with age before storing"},
+ {Key: FlagSetAgeKeyFile, ValueName: "PATH", ValueDemanded: true, Short: "[experimental] Age identity file for encryption", Long: "[experimental] Age identity file for encryption\n\nDefaults to ~/.config/mise/age.txt if it exists"},
+ {Key: FlagSetAgeRecipient, Repeatable: true, ValueName: "RECIPIENT", ValueDemanded: true, Short: "[experimental] Age recipient (x25519 public key) for encryption", Long: "[experimental] Age recipient (x25519 public key) for encryption\n\nCan be used multiple times. Requires --age-encrypt."},
+ {Key: FlagSetAgeSshRecipient, Repeatable: true, ValueName: "PATH_OR_PUBKEY", ValueDemanded: true, Short: "[experimental] SSH recipient (public key or path) for age encryption", Long: "[experimental] SSH recipient (public key or path) for age encryption\n\nCan be used multiple times. Requires --age-encrypt."},
+ {Key: FlagSetComplete, Hide: true, Short: "Render completions", Long: "Render completions"},
+ {Key: FlagSetFile, ValueName: "FILE", ValueDemanded: true, Short: "The TOML file to update", Long: "The TOML file to update\n\nCan be a file path or directory. If a directory is provided, will create/use mise.toml in that directory. Defaults to [`MISE_DEFAULT_CONFIG_FILENAME`](https://mise.jdx.dev/configuration.html#mise_default_config_filename) environment variable, or `mise.toml`. Use [`MISE_GLOBAL_CONFIG_FILE`](https://mise.jdx.dev/configuration.html#mise_global_config_file) to choose a different global config path."},
+ {Key: FlagSetNoRedact, Short: "Show raw values instead of redacting secrets", Long: "Show raw values instead of redacting secrets"},
+ {Key: FlagSetPrompt, Short: "Prompt for environment variable values", Long: "Prompt for environment variable values"},
+ {Key: FlagSetRemove, Hide: true, Repeatable: true, ValueName: "ENV_KEY", ValueDemanded: true, Short: "Remove the environment variable from config file", Long: "Remove the environment variable from config file\n\nCan be used multiple times."},
+ {Key: FlagSetStdin, Short: "Read the value from stdin (for multiline input)", Long: "Read the value from stdin (for multiline input)\n\nWhen using --stdin, provide a single key without a value. The value will be read from stdin until EOF."},
+ {Key: ArgSetEnvVar, Short: "Environment variable(s) to set\ne.g.: NODE_ENV=production", Long: "Environment variable(s) to set\ne.g.: NODE_ENV=production"},
+ {Key: CmdSettings, Short: "Manage settings", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n # list all settings\n $ \x1b[1mmise settings\x1b[22m\n\n # get the value of the setting \"always_keep_download\"\n $ \x1b[1mmise settings always_keep_download\x1b[22m\n\n # set the value of the setting \"always_keep_download\" to \"true\"\n $ \x1b[1mmise settings always_keep_download=true\x1b[22m\n\n # set the value of the setting \"node.mirror_url\" to \"https://npmmirror.com/mirrors/node/\"\n $ \x1b[1mmise settings node.mirror_url https://npmmirror.com/mirrors/node/\x1b[22m\n"},
+ {Key: FlagSettingsAll, Short: "List all settings", Long: "List all settings"},
+ {Key: FlagSettingsJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagSettingsLocal, Short: "Use the local config file instead of the global one", Long: "Use the local config file instead of the global one"},
+ {Key: FlagSettingsToml, Short: "Output in TOML format", Long: "Output in TOML format"},
+ {Key: FlagSettingsComplete, Hide: true, Short: "Print all settings with descriptions for shell completions", Long: "Print all settings with descriptions for shell completions"},
+ {Key: FlagSettingsJsonExtended, Short: "Output in JSON format with sources", Long: "Output in JSON format with sources"},
+ {Key: ArgSettingsSetting, Short: "Name of setting", Long: "Name of setting"},
+ {Key: ArgSettingsValue, Short: "Setting value to set", Long: "Setting value to set"},
+ {Key: CmdSettingsAdd, Short: "Adds a setting to the configuration file", Long: "Adds a setting to the configuration file\n\nUsed with an array setting, this will append the value to the array. This modifies the contents of ~/.config/mise/config.toml", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise settings add disable_hints python_multi\x1b[22m\n"},
+ {Key: FlagSettingsAddLocal, Short: "Use the local config file instead of the global one", Long: "Use the local config file instead of the global one"},
+ {Key: ArgSettingsAddSetting, Demanded: true, Short: "The setting to set", Long: "The setting to set"},
+ {Key: ArgSettingsAddValue, Short: "The value to set (optional if provided as KEY=VALUE)", Long: "The value to set (optional if provided as KEY=VALUE)"},
+ {Key: CmdSettingsGet, Short: "Show a current setting", Long: "Show a current setting\n\nThis is the contents of a single entry in ~/.config/mise/config.toml\n\nNote that aliases are also stored in this file but managed separately with `mise tool-alias get`", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise settings get idiomatic_version_file\x1b[22m\n true\n"},
+ {Key: FlagSettingsGetLocal, Short: "Use the local config file instead of the global one", Long: "Use the local config file instead of the global one"},
+ {Key: ArgSettingsGetSetting, Demanded: true, Short: "The setting to show", Long: "The setting to show"},
+ {Key: CmdSettingsLs, Short: "Show current settings", Long: "Show current settings\n\nThis is the contents of ~/.config/mise/config.toml\n\nNote that aliases are also stored in this file but managed separately with `mise tool-alias`", VisibleAliases: []string{"list"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise settings ls\x1b[22m\n idiomatic_version_file = false\n ...\n\n $ \x1b[1mmise settings ls python\x1b[22m\n default_packages_file = \"~/.default-python-packages\"\n ...\n"},
+ {Key: FlagSettingsLsAll, Short: "List all settings", Long: "List all settings"},
+ {Key: FlagSettingsLsJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagSettingsLsLocal, Short: "Use the local config file instead of the global one", Long: "Use the local config file instead of the global one"},
+ {Key: FlagSettingsLsToml, Short: "Output in TOML format", Long: "Output in TOML format"},
+ {Key: FlagSettingsLsComplete, Hide: true, Short: "Print all settings with descriptions for shell completions", Long: "Print all settings with descriptions for shell completions"},
+ {Key: FlagSettingsLsJsonExtended, Short: "Output in JSON format with sources", Long: "Output in JSON format with sources"},
+ {Key: ArgSettingsLsSetting, Short: "Name of setting", Long: "Name of setting"},
+ {Key: CmdSettingsSet, Short: "Add/update a setting", Long: "Add/update a setting\n\nThis modifies the contents of ~/.config/mise/config.toml by default. With `--local`, modifies the local config file instead. See https://mise.jdx.dev/configuration.html#target-file-for-write-operations", VisibleAliases: []string{"create"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise settings idiomatic_version_file=true\x1b[22m\n"},
+ {Key: FlagSettingsSetLocal, Short: "Use the local config file instead of the global one", Long: "Use the local config file instead of the global one"},
+ {Key: ArgSettingsSetSetting, Demanded: true, Short: "The setting to set", Long: "The setting to set"},
+ {Key: ArgSettingsSetValue, Short: "The value to set (optional if provided as KEY=VALUE)", Long: "The value to set (optional if provided as KEY=VALUE)"},
+ {Key: CmdSettingsUnset, Short: "Clears a setting", Long: "Clears a setting\n\nThis modifies the contents of ~/.config/mise/config.toml", VisibleAliases: []string{"rm", "remove", "delete", "del"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise settings unset idiomatic_version_file\x1b[22m\n"},
+ {Key: FlagSettingsUnsetLocal, Short: "Use the local config file instead of the global one", Long: "Use the local config file instead of the global one"},
+ {Key: ArgSettingsUnsetKey, Demanded: true, Short: "The setting to remove", Long: "The setting to remove"},
+ {Key: CmdShell, Short: "Sets a tool version for the current session.", Long: "Sets a tool version for the current session.\n\nOnly works in a session where mise is already activated.\n\nThis works by setting environment variables for the current shell session such as `MISE_NODE_VERSION=20` which is \"eval\"ed as a shell function created by `mise activate`.", VisibleAliases: []string{"sh"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise shell node@20\x1b[22m\n $ \x1b[1mnode -v\x1b[22m\n v20.0.0\n"},
+ {Key: FlagShellJobs, ValueName: "JOBS", ValueDemanded: true, Short: "Number of jobs to run in parallel\nValues below 1 are treated as 1\n[default: 4]", Long: "Number of jobs to run in parallel\nValues below 1 are treated as 1\n[default: 4]", Env: "MISE_JOBS"},
+ {Key: FlagShellUnset, Short: "Removes a previously set version", Long: "Removes a previously set version"},
+ {Key: FlagShellRaw, Short: "Connect backend install command stdin/stdout/stderr directly to the terminal Implies --jobs=1", Long: "Connect backend install command stdin/stdout/stderr directly to the terminal\nImplies --jobs=1"},
+ {Key: ArgShellToolVersion, Demanded: true, Short: "Tool(s) to use", Long: "Tool(s) to use"},
+ {Key: CmdShellAlias, Short: "Manage shell aliases."},
+ {Key: FlagShellAliasNoHeader, Short: "Don't show table header", Long: "Don't show table header"},
+ {Key: CmdShellAliasGet, Short: "Show the command for a shell alias", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise shell-alias get ll\x1b[22m\n ls -la\n"},
+ {Key: ArgShellAliasGetShellAlias, Demanded: true, Short: "The alias to show", Long: "The alias to show"},
+ {Key: CmdShellAliasLs, Short: "List shell aliases", Long: "List shell aliases\n\nShows the shell aliases that are set in the current directory. These are defined in `mise.toml` under the `[shell_alias]` section.", VisibleAliases: []string{"list"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise shell-alias ls\x1b[22m\n alias command\n ll ls -la\n gs git status\n"},
+ {Key: FlagShellAliasLsNoHeader, Short: "Don't show table header", Long: "Don't show table header"},
+ {Key: CmdShellAliasSet, Short: "Add/update a shell alias", Long: "Add/update a shell alias\n\nThis modifies the contents of ~/.config/mise/config.toml", VisibleAliases: []string{"add", "create"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise shell-alias set ll \"ls -la\"\x1b[22m\n $ \x1b[1mmise shell-alias set gs \"git status\"\x1b[22m\n"},
+ {Key: ArgShellAliasSetShellAlias, Demanded: true, Short: "The alias name", Long: "The alias name"},
+ {Key: ArgShellAliasSetCommand, Short: "The command to run (optional if provided as ALIAS=COMMAND)", Long: "The command to run (optional if provided as ALIAS=COMMAND)"},
+ {Key: CmdShellAliasUnset, Short: "Removes a shell alias", Long: "Removes a shell alias\n\nThis modifies the contents of ~/.config/mise/config.toml", VisibleAliases: []string{"rm", "remove", "delete", "del"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise shell-alias unset ll\x1b[22m\n"},
+ {Key: ArgShellAliasUnsetShellAlias, Demanded: true, Short: "The alias to remove", Long: "The alias to remove"},
+ {Key: CmdSponsors, Short: "Show the companies sponsoring mise and the jdx.dev open source tools"},
+ {Key: CmdSync, Short: "Synchronize tools from other version managers with mise", SubcommandRequired: true},
+ {Key: CmdSyncNode, Short: "Symlinks all tool versions from an external tool into mise", Long: "Symlinks all tool versions from an external tool into mise\n\nFor example, use this to import all Homebrew node installs into mise\n\nThis won't overwrite managed installs, runtime aliases, or links from other providers.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mbrew install node@18 node@20\x1b[22m\n $ \x1b[1mmise sync node --brew\x1b[22m\n $ \x1b[1mmise use -g node@18\x1b[22m - uses Homebrew-provided node\n"},
+ {Key: FlagSyncNodeBrew, Short: "Get tool versions from Homebrew", Long: "Get tool versions from Homebrew"},
+ {Key: FlagSyncNodeNodenv, Short: "Get tool versions from nodenv", Long: "Get tool versions from nodenv"},
+ {Key: FlagSyncNodeNvm, Short: "Get tool versions from nvm", Long: "Get tool versions from nvm"},
+ {Key: CmdSyncPython, Short: "Symlinks all tool versions from an external tool into mise", Long: "Symlinks all tool versions from an external tool into mise\n\nFor example, use this to import all pyenv installs into mise\n\nThis won't overwrite managed installs, runtime aliases, or links from other providers.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mpyenv install 3.11.0\x1b[22m\n $ \x1b[1mmise sync python --pyenv\x1b[22m\n $ \x1b[1mmise use -g python@3.11.0\x1b[22m - uses pyenv-provided python\n \n $ \x1b[1muv python install 3.11.0\x1b[22m\n $ \x1b[1mmise install python@3.10.0\x1b[22m\n $ \x1b[1mmise sync python --uv\x1b[22m\n $ \x1b[1mmise x python@3.11.0 -- python -V\x1b[22m - uses uv-provided python\n $ \x1b[1muv run -p 3.10.0 -- python -V\x1b[22m - uses mise-provided python\n"},
+ {Key: FlagSyncPythonPyenv, Short: "Get tool versions from pyenv", Long: "Get tool versions from pyenv"},
+ {Key: FlagSyncPythonUv, Short: "Sync tool versions with uv (2-way sync)", Long: "Sync tool versions with uv (2-way sync)"},
+ {Key: CmdSyncRuby, Short: "Symlinks all ruby tool versions from an external tool into mise", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mbrew install ruby\x1b[22m\n $ \x1b[1mmise sync ruby --brew\x1b[22m\n $ \x1b[1mmise use -g ruby\x1b[22m - Use the latest version of Ruby installed by Homebrew\n"},
+ {Key: FlagSyncRubyBrew, Demanded: true, Short: "Get tool versions from Homebrew", Long: "Get tool versions from Homebrew"},
+ {Key: CmdTasks, Short: "Manage tasks", VisibleAliases: []string{"t"}},
+ {Key: FlagTasksGlobal, Short: "Only show global tasks", Long: "Only show global tasks"},
+ {Key: FlagTasksJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagTasksLocal, Short: "Only show non-global tasks", Long: "Only show non-global tasks"},
+ {Key: FlagTasksExtended, Short: "Show all columns", Long: "Show all columns"},
+ {Key: FlagTasksAll, Short: "Load all tasks from the entire monorepo, including sibling directories.\nBy default, only tasks from the current directory hierarchy are loaded.", Long: "Load all tasks from the entire monorepo, including sibling directories.\nBy default, only tasks from the current directory hierarchy are loaded."},
+ {Key: FlagTasksComplete, Hide: true, Short: "Display tasks for usage completion", Long: "Display tasks for usage completion"},
+ {Key: FlagTasksHidden, Short: "Show hidden tasks", Long: "Show hidden tasks"},
+ {Key: FlagTasksNameOnly, Short: "Only show task names, one per line. Useful for piping to fzf and similar tools.", Long: "Only show task names, one per line. Useful for piping to fzf and similar tools."},
+ {Key: FlagTasksNoHeader, Short: "Do not print table header", Long: "Do not print table header"},
+ {Key: FlagTasksSort, ValueName: "COLUMN", ValueDemanded: true, Short: "Sort by column. Default is name.", Long: "Sort by column. Default is name.", Choices: []string{"name", "alias", "description", "source"}},
+ {Key: FlagTasksSortOrder, ValueName: "SORT_ORDER", ValueDemanded: true, Short: "Sort order. Default is asc.", Long: "Sort order. Default is asc.", Choices: []string{"asc", "desc"}},
+ {Key: FlagTasksUsage, Hide: true},
+ {Key: ArgTasksTask, Short: "Task name to get info of", Long: "Task name to get info of"},
+ {Key: CmdTasksAdd, Short: "Create a new task", Long: "Create a new task\n\nAdds a task to the local mise.toml file. See https://mise.jdx.dev/configuration.html#target-file-for-write-operations", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise tasks add pre-commit --depends \"test\" --depends \"render\" -- echo pre-commit\x1b[22m\n"},
+ {Key: FlagTasksAddAlias, Repeatable: true, ValueName: "ALIAS", ValueDemanded: true, Short: "Other names for the task", Long: "Other names for the task"},
+ {Key: FlagTasksAddDepends, Repeatable: true, ValueName: "DEPENDS", ValueDemanded: true, Short: "Add dependencies to the task", Long: "Add dependencies to the task"},
+ {Key: FlagTasksAddDir, ValueName: "DIR", ValueDemanded: true, Short: "Run the task in a specific directory", Long: "Run the task in a specific directory"},
+ {Key: FlagTasksAddFile, Short: "Create a file task instead of a toml task", Long: "Create a file task instead of a toml task"},
+ {Key: FlagTasksAddHide, Short: "Hide the task from `mise tasks` and completions", Long: "Hide the task from `mise tasks` and completions"},
+ {Key: FlagTasksAddQuiet, Short: "Do not print the command before running", Long: "Do not print the command before running"},
+ {Key: FlagTasksAddRaw, Short: "Directly connect stdin/stdout/stderr", Long: "Directly connect stdin/stdout/stderr"},
+ {Key: FlagTasksAddSources, Repeatable: true, ValueName: "SOURCES", ValueDemanded: true, Short: "Glob patterns of files this task uses as input", Long: "Glob patterns of files this task uses as input"},
+ {Key: FlagTasksAddWaitFor, Repeatable: true, ValueName: "WAIT_FOR", ValueDemanded: true, Short: "Wait for these tasks to complete if they are to run", Long: "Wait for these tasks to complete if they are to run"},
+ {Key: FlagTasksAddDependsPost, Repeatable: true, ValueName: "DEPENDS_POST", ValueDemanded: true, Short: "Dependencies to run after the task runs", Long: "Dependencies to run after the task runs"},
+ {Key: FlagTasksAddDescription, ValueName: "DESCRIPTION", ValueDemanded: true, Short: "Description of the task", Long: "Description of the task"},
+ {Key: FlagTasksAddOutputs, Repeatable: true, ValueName: "OUTPUTS", ValueDemanded: true, Short: "Glob patterns of files this task creates, to skip if they are not modified", Long: "Glob patterns of files this task creates, to skip if they are not modified"},
+ {Key: FlagTasksAddRunWindows, ValueName: "RUN_WINDOWS", ValueDemanded: true, Short: "Command to run on windows", Long: "Command to run on windows"},
+ {Key: FlagTasksAddShell, ValueName: "SHELL", ValueDemanded: true, Short: "Run the task in a specific shell", Long: "Run the task in a specific shell"},
+ {Key: FlagTasksAddSilent, Short: "Do not print the command or its output", Long: "Do not print the command or its output"},
+ {Key: ArgTasksAddTask, Demanded: true, Short: "Tasks name to add", Long: "Tasks name to add"},
+ {Key: ArgTasksAddRun},
+ {Key: CmdTasksDeps, Short: "Display a tree visualization of a dependency graph", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n # Show dependencies for all tasks\n $ \x1b[1mmise tasks deps\x1b[22m\n\n # Show dependencies for the \"lint\", \"test\" and \"check\" tasks\n $ \x1b[1mmise tasks deps lint test check\x1b[22m\n\n # Show dependencies in DOT format\n $ \x1b[1mmise tasks deps --dot\x1b[22m\n\n # Collapse repeated dependencies\n $ \x1b[1mmise tasks deps --compact\x1b[22m\n"},
+ {Key: FlagTasksDepsCompact, Short: "Collapse repeated dependencies after their first occurrence", Long: "Collapse repeated dependencies after their first occurrence"},
+ {Key: FlagTasksDepsDot, Short: "Display dependencies in DOT format", Long: "Display dependencies in DOT format"},
+ {Key: FlagTasksDepsHidden, Short: "Show hidden tasks", Long: "Show hidden tasks"},
+ {Key: ArgTasksDepsTasks, Short: "Tasks to show dependencies for\nCan specify multiple tasks by separating with spaces\ne.g.: mise tasks deps lint test check", Long: "Tasks to show dependencies for\nCan specify multiple tasks by separating with spaces\ne.g.: mise tasks deps lint test check"},
+ {Key: CmdTasksEdit, Short: "Edit a task with $EDITOR", Long: "Edit a task with $EDITOR\n\nThe task will be created as a standalone script if it does not already exist.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise tasks edit build\x1b[22m\n $ \x1b[1mmise tasks edit test\x1b[22m\n"},
+ {Key: FlagTasksEditPath, Short: "Display the path to the task instead of editing it", Long: "Display the path to the task instead of editing it"},
+ {Key: ArgTasksEditTask, Demanded: true, Short: "Task to edit", Long: "Task to edit"},
+ {Key: CmdTasksGraph, Short: "[experimental] Inspect the workspace project graph", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n # Inspect projects and their dependency edges\n $ \x1b[1mmise tasks graph\x1b[22m\n\n # Emit the project graph as JSON\n $ \x1b[1mmise tasks graph --json\x1b[22m\n\n # Explain where inferred projects and task fields came from\n $ \x1b[1mmise tasks graph --explain\x1b[22m\n"},
+ {Key: FlagTasksGraphJson, Short: "Output the project graph as JSON", Long: "Output the project graph as JSON"},
+ {Key: FlagTasksGraphExplain, Short: "Explain provider attribution for inferred projects and tasks", Long: "Explain provider attribution for inferred projects and tasks"},
+ {Key: FlagTasksGraphNoHeader, Short: "Do not print table headers", Long: "Do not print table headers"},
+ {Key: CmdTasksInfo, Short: "Get information about a task", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise tasks info\x1b[22m\n Name: test\n Aliases: t\n Description: Test the application\n Source: ~/src/myproj/mise.toml\n\n $ \x1b[1mmise tasks info test --json\x1b[22m\n {\n \"name\": \"test\",\n \"aliases\": \"t\",\n \"description\": \"Test the application\",\n \"source\": \"~/src/myproj/mise.toml\",\n \"config_sources\": [\"~/src/myproj/mise.toml\"],\n \"depends\": [],\n \"env\": {},\n \"dir\": null,\n \"hide\": false,\n \"raw\": false,\n \"sources\": [],\n \"outputs\": [],\n \"run\": [\n \"echo \\\"testing!\\\"\"\n ],\n \"file\": null,\n \"usage_spec\": {}\n }\n"},
+ {Key: FlagTasksInfoJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: ArgTasksInfoTask, Demanded: true, Short: "Name of the task to get information about", Long: "Name of the task to get information about"},
+ {Key: CmdTasksLs, Short: "List available tasks to execute\nThese may be included from the config file or from the project's .mise/tasks directory\nmise will merge all tasks from all parent directories into this list.", Long: "List available tasks to execute\nThese may be included from the config file or from the project's .mise/tasks directory\nmise will merge all tasks from all parent directories into this list.\n\nSo if you have global tasks in `~/.config/mise/tasks/*` and project-specific tasks in\n~/myproject/.mise/tasks/*, then they'll both be available but the project-specific\ntasks will override the global ones if they have the same name.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise tasks ls\x1b[22m\n"},
+ {Key: FlagTasksLsGlobal, Short: "Only show global tasks", Long: "Only show global tasks"},
+ {Key: FlagTasksLsJson, Short: "Output in JSON format", Long: "Output in JSON format"},
+ {Key: FlagTasksLsLocal, Short: "Only show non-global tasks", Long: "Only show non-global tasks"},
+ {Key: FlagTasksLsExtended, Short: "Show all columns", Long: "Show all columns"},
+ {Key: FlagTasksLsAll, Short: "Load all tasks from the entire monorepo, including sibling directories.\nBy default, only tasks from the current directory hierarchy are loaded.", Long: "Load all tasks from the entire monorepo, including sibling directories.\nBy default, only tasks from the current directory hierarchy are loaded."},
+ {Key: FlagTasksLsComplete, Hide: true, Short: "Display tasks for usage completion", Long: "Display tasks for usage completion"},
+ {Key: FlagTasksLsHidden, Short: "Show hidden tasks", Long: "Show hidden tasks"},
+ {Key: FlagTasksLsNameOnly, Short: "Only show task names, one per line. Useful for piping to fzf and similar tools.", Long: "Only show task names, one per line. Useful for piping to fzf and similar tools."},
+ {Key: FlagTasksLsNoHeader, Short: "Do not print table header", Long: "Do not print table header"},
+ {Key: FlagTasksLsSort, ValueName: "COLUMN", ValueDemanded: true, Short: "Sort by column. Default is name.", Long: "Sort by column. Default is name.", Choices: []string{"name", "alias", "description", "source"}},
+ {Key: FlagTasksLsSortOrder, ValueName: "SORT_ORDER", ValueDemanded: true, Short: "Sort order. Default is asc.", Long: "Sort order. Default is asc.", Choices: []string{"asc", "desc"}},
+ {Key: FlagTasksLsUsage, Hide: true},
+ {Key: CmdTasksRun, Short: "Run task(s)", Long: "Run task(s)\n\nThis command will run a task, or multiple tasks in parallel. Tasks may have dependencies on other tasks or on source files. If source is configured on a task, it will only run if the source files have changed.\n\nTasks can be defined in mise.toml or as standalone scripts. In mise.toml, tasks take this form:\n\n [tasks.build]\n run = \"npm run build\"\n sources = [\"src/**/*.ts\"]\n outputs = [\"dist/**/*.js\"]\n\nAlternatively, tasks can be defined as standalone scripts. These must be located in `mise-tasks`, `.mise-tasks`, `.mise/tasks`, `mise/tasks` or `.config/mise/tasks`. The name of the script will be the name of the tasks.\n\n $ cat .mise/tasks/build<`, `mise install`, `mise exec`, and `mise watch`) automatically trust their active config. Paranoid mode requires explicit, content-bound trust for every non-global config.\n\nIn normal mode, safe config files do not require trust: files that only contain `min_version`, `[tools]` entries with plain version strings (or arrays of them), and `[tasks]` without templates or tool options.\n\nTrust is shared across git worktrees: a config file inside a linked worktree is trusted when the equivalent path in the repository's main checkout has been trusted. Paranoid mode disables this sharing since worktrees can check out branches with different config contents.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n # trusts ~/some_dir/mise.toml\n $ \x1b[1mmise trust ~/some_dir/mise.toml\x1b[22m\n\n # trusts mise.toml in the current or parent directory\n $ \x1b[1mmise trust\x1b[22m\n"},
+ {Key: FlagTrustAll, Short: "Trust all config files in the current directory, its parents, and its subdirectories", Long: "Trust all config files in the current directory, its parents, and its subdirectories\n\nSubdirectories are walked respecting .gitignore, skipping hidden directories and common build/dependency directories (node_modules, vendor, target, dist, build)."},
+ {Key: FlagTrustIgnore, Short: "Do not trust this config and ignore it in the future", Long: "Do not trust this config and ignore it in the future"},
+ {Key: FlagTrustShow, Short: "Show the trusted status of config files from the current directory and its parents.\nDoes not trust or untrust any files.", Long: "Show the trusted status of config files from the current directory and its parents.\nDoes not trust or untrust any files."},
+ {Key: FlagTrustUntrust, Short: "Remove explicit trust for this config", Long: "Remove explicit trust for this config"},
+ {Key: ArgTrustConfigFile, Short: "The config file whose trust status to change", Long: "The config file whose trust status to change"},
+ {Key: CmdUninstall, Short: "Removes installed tool versions", Long: "Removes installed tool versions\n\nThis only removes the installed version, it does not modify mise.toml.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n # will uninstall specific version\n $ \x1b[1mmise uninstall node@18.0.0\x1b[22m\n\n # will uninstall the current node version (if only one version is installed)\n $ \x1b[1mmise uninstall node\x1b[22m\n\n # will uninstall all installed versions of node\n $ \x1b[1mmise uninstall --all node@18.0.0\x1b[22m # will uninstall all node versions\n"},
+ {Key: FlagUninstallAll, Short: "Delete all installed versions", Long: "Delete all installed versions"},
+ {Key: FlagUninstallDryRun, Short: "Do not actually delete anything", Long: "Do not actually delete anything"},
+ {Key: FlagUninstallDryRunCode, Short: "Like --dry-run but exits with code 1 if there are tools to uninstall", Long: "Like --dry-run but exits with code 1 if there are tools to uninstall\n\nThis is useful for scripts to check if tools need to be uninstalled."},
+ {Key: ArgUninstallInstalledToolVersion, Short: "Tool(s) to remove", Long: "Tool(s) to remove"},
+ {Key: CmdUnset, Short: "Remove environment variable(s) from the config file.", Long: "Remove environment variable(s) from the config file.\n\nBy default, this command modifies `mise.toml` in the current directory.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n # Remove NODE_ENV from the current directory's config\n $ \x1b[1mmise unset NODE_ENV\x1b[22m\n\n # Remove NODE_ENV from the global config\n $ \x1b[1mmise unset NODE_ENV -g\x1b[22m\n"},
+ {Key: FlagUnsetFile, ValueName: "FILE", ValueDemanded: true, Short: "Specify a file to use instead of `mise.toml`", Long: "Specify a file to use instead of `mise.toml`\n\nCan be a file path or directory. If a directory is provided, will create/use mise.toml in that directory.\n\nDefaults to [`MISE_DEFAULT_CONFIG_FILENAME`](https://mise.jdx.dev/configuration.html#mise_default_config_filename) environment variable, or `mise.toml`. Use [`MISE_GLOBAL_CONFIG_FILE`](https://mise.jdx.dev/configuration.html#mise_global_config_file) to choose a different global config path."},
+ {Key: FlagUnsetGlobal, Short: "Use the global config file", Long: "Use the global config file"},
+ {Key: ArgUnsetEnvKey, Short: "Environment variable(s) to remove\ne.g.: NODE_ENV", Long: "Environment variable(s) to remove\ne.g.: NODE_ENV"},
+ {Key: CmdUntrust, Short: "Remove explicit trust for a config"},
+ {Key: ArgUntrustConfigFile, Short: "The config file to untrust", Long: "The config file to untrust"},
+ {Key: CmdUnuse, Short: "Removes installed tool versions from mise.toml", Long: "Removes installed tool versions from mise.toml\n\nBy default, this will use the `mise.toml` file that has the tool defined. If multiple config files exist (e.g., both `mise.toml` and `mise.local.toml`), the lowest precedence file (`mise.toml`) will be used. See https://mise.jdx.dev/configuration.html#target-file-for-write-operations\n\nIn the following order:\n - If `--global` is set, it will use the global config file.\n - If `--path` is set, it will use the config file at the given path.\n - If `--env` is set, it will use `mise..toml`.\n - If [`MISE_DEFAULT_CONFIG_FILENAME`](https://mise.jdx.dev/configuration.html#mise_default_config_filename) is set, it will use that instead.\n - If `MISE_OVERRIDE_CONFIG_FILENAMES` is set, it will the first from that list.\n - Otherwise just \"mise.toml\" or global config if cwd is home directory.\n\nUse [`MISE_GLOBAL_CONFIG_FILE`](https://mise.jdx.dev/configuration.html#mise_global_config_file) to choose a different global config path.\n\nWill also prune the installed version if no other configurations are using it.", VisibleAliases: []string{"rm", "remove"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n # will uninstall specific version\n $ \x1b[1mmise unuse node@18.0.0\x1b[22m\n\n # will uninstall specific version from global config\n $ \x1b[1mmise unuse -g node@18.0.0\x1b[22m\n\n # will uninstall specific version from .mise.local.toml\n $ \x1b[1mmise unuse --env local node@20\x1b[22m\n\n # will uninstall specific version from .mise.staging.toml\n $ \x1b[1mmise unuse --env staging node@20\x1b[22m\n"},
+ {Key: FlagUnuseEnv, ValueName: "ENV", ValueDemanded: true, Short: "Create/modify an environment-specific config file like .mise..toml", Long: "Create/modify an environment-specific config file like .mise..toml"},
+ {Key: FlagUnuseGlobal, Short: "Use the global config file (`~/.config/mise/config.toml`) instead of the local one", Long: "Use the global config file (`~/.config/mise/config.toml`) instead of the local one"},
+ {Key: FlagUnusePath, ValueName: "PATH", ValueDemanded: true, Short: "Specify a path to a config file or directory", Long: "Specify a path to a config file or directory\n\nIf a directory is specified, it will look for a config file in that directory following the rules above."},
+ {Key: FlagUnuseNoPrune, Short: "Do not also prune the installed version", Long: "Do not also prune the installed version"},
+ {Key: ArgUnuseInstalledToolVersion, Demanded: true, Short: "Tool(s) to remove", Long: "Tool(s) to remove"},
+ {Key: CmdUpgrade, Short: "Upgrades outdated tools", Long: "Upgrades outdated tools\n\nBy default, this keeps the range specified in mise.toml. So if you have node@20 set, it will upgrade to the latest 20.x.x version available. See the `--bump` flag to use the latest version and bump the version in mise.toml.\n\nThis will update mise.lock if it is enabled, see https://mise.jdx.dev/configuration/settings.html#lockfile", VisibleAliases: []string{"up"}, AfterLongHelp: "\x1b[1m\x1b[4mDeprecation:\x1b[22m\x1b[24m\n\nThe `-l` shorthand for `--bump` is deprecated and will be removed in mise 2027.8.5.\nAfter removal, `-l` will become shorthand for `--local`. Use `-b` or `--bump` instead.\n\n\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n # Upgrades node to the latest version matching the range in mise.toml\n $ \x1b[1mmise upgrade node\x1b[22m\n\n # Upgrades node to the latest version and bumps the version in mise.toml\n $ \x1b[1mmise upgrade node --bump\x1b[22m\n\n # Upgrades all tools to the latest versions\n $ \x1b[1mmise upgrade\x1b[22m\n\n # Upgrades all tools to the latest versions and bumps the version in mise.toml\n $ \x1b[1mmise upgrade --bump\x1b[22m\n\n # Just print what would be done, don't actually do it\n $ \x1b[1mmise upgrade --dry-run\x1b[22m\n\n # Upgrades node and python to the latest versions\n $ \x1b[1mmise upgrade node python\x1b[22m\n\n # Upgrade all tools except go\n $ \x1b[1mmise upgrade --exclude go\x1b[22m\n\n # Show a multiselect menu to choose which tools to upgrade\n $ \x1b[1mmise upgrade --interactive\x1b[22m\n\n # Only upgrade tools defined in local mise.toml, not global ones\n $ \x1b[1mmise upgrade --local\x1b[22m\n"},
+ {Key: FlagUpgradeBump, Short: "Upgrades to the latest version available, bumping the version in mise.toml", Long: "Upgrades to the latest version available, bumping the version in mise.toml\n\nFor example, if you have `node = \"20.0.0\"` in your mise.toml but 22.1.0 is the latest available, this will install 22.1.0 and set `node = \"22.1.0\"` in your config.\n\nIt keeps the same precision as what was there before, so if you instead had `node = \"20\"`, it would change your config to `node = \"22\"`."},
+ {Key: FlagUpgradeInteractive, Short: "Display multiselect menu to choose which tools to upgrade", Long: "Display multiselect menu to choose which tools to upgrade"},
+ {Key: FlagUpgradeJobs, ValueName: "JOBS", ValueDemanded: true, Short: "Number of jobs to run in parallel\nValues below 1 are treated as 1\n[default: 4]", Long: "Number of jobs to run in parallel\nValues below 1 are treated as 1\n[default: 4]", Env: "MISE_JOBS"},
+ {Key: FlagUpgradeL, Hide: true, Short: "Deprecated shorthand for --bump", Long: "Deprecated shorthand for --bump"},
+ {Key: FlagUpgradeDryRun, Short: "Just print what would be done, don't actually do it", Long: "Just print what would be done, don't actually do it"},
+ {Key: FlagUpgradeExclude, Repeatable: true, ValueName: "INSTALLED_TOOL", ValueDemanded: true, Short: "Tool(s) to exclude from upgrading\ne.g.: go python", Long: "Tool(s) to exclude from upgrading\ne.g.: go python"},
+ {Key: FlagUpgradeDryRunCode, Short: "Like --dry-run but exits with code 1 if there are outdated tools", Long: "Like --dry-run but exits with code 1 if there are outdated tools\n\nThis is useful for scripts to check if tools need to be upgraded."},
+ {Key: FlagUpgradeInactive, Short: "Upgrade all tools, including installed-but-inactive tools not present in the current config", Long: "Upgrade all tools, including installed-but-inactive tools not present in the current config"},
+ {Key: FlagUpgradeLocal, Short: "Only upgrade tools defined in local config files", Long: "Only upgrade tools defined in local config files\n\nThis will only upgrade tools that are defined in project-local mise.toml and will skip tools defined in the global config (~/.config/mise/config.toml)."},
+ {Key: FlagUpgradeMinimumReleaseAge, ValueName: "MINIMUM_RELEASE_AGE", ValueDemanded: true, Short: "Only upgrade to versions released before this date or older than this duration", Long: "Only upgrade to versions released before this date or older than this duration\n\nSupports absolute dates like \"2024-06-01\" and relative durations like \"90d\" or \"1y\". This can be useful for reproducibility or security purposes.\n\nThis only affects fuzzy version matches like \"20\" or \"latest\". Explicitly pinned versions like \"22.5.0\" are not filtered."},
+ {Key: FlagUpgradeMonorepo, Short: "Placeholder for future monorepo upgrades; `mise upgrade --monorepo` is not implemented yet.", Long: "Placeholder for future monorepo upgrades; `mise upgrade --monorepo` is not implemented yet."},
+ {Key: FlagUpgradeNoPrune, Short: "Do not uninstall the versions that were upgraded away from", Long: "Do not uninstall the versions that were upgraded away from\n\nBy default the old version is removed once the new one installs, unless another tracked config or tool stub still needs it. Use this to keep it anyway, e.g. when something outside of mise points at the old install directory.\n\nSet `upgrade.auto_prune = false` to make this the default."},
+ {Key: FlagUpgradePrune, Short: "Uninstall the versions that were upgraded away from", Long: "Uninstall the versions that were upgraded away from\n\nThis is already the default. Use it to override `upgrade.auto_prune = false` for a single run."},
+ {Key: FlagUpgradeRaw, Short: "Connect backend install command stdin/stdout/stderr directly to the terminal Implies --jobs=1", Long: "Connect backend install command stdin/stdout/stderr directly to the terminal\nImplies --jobs=1"},
+ {Key: ArgUpgradeInstalledToolVersion, Short: "Tool(s) to upgrade\ne.g.: node@20 python@3.10\nIf not specified, all current tools will be upgraded", Long: "Tool(s) to upgrade\ne.g.: node@20 python@3.10\nIf not specified, all current tools will be upgraded"},
+ {Key: CmdUsage, Hide: true, Short: "Generate a usage CLI spec", Long: "Generate a usage CLI spec\n\nSee https://usage.jdx.dev for more information on this specification."},
+ {Key: CmdUse, Short: "Installs a tool and adds the version to mise.toml.", Long: "Installs a tool and adds the version to mise.toml.\n\nThis will install the tool version if it is not already installed. By default, this will use a `mise.toml` file in the current directory. If multiple config files exist (e.g., both `mise.toml` and `mise.local.toml`), the lowest precedence file (`mise.toml`) will be used. See https://mise.jdx.dev/configuration.html#target-file-for-write-operations\n\nIn the following order:\n - If `--global` is set, it will use the global config file.\n - If `--path` is set, it will use the config file at the given path.\n - If `--env` is set, it will use `mise..toml`.\n - If [`MISE_DEFAULT_CONFIG_FILENAME`](https://mise.jdx.dev/configuration.html#mise_default_config_filename) is set, it will use that instead.\n - If `MISE_OVERRIDE_CONFIG_FILENAMES` is set, it will the first from that list.\n - Otherwise just \"mise.toml\" or global config if cwd is home directory.\n\nUse [`MISE_GLOBAL_CONFIG_FILE`](https://mise.jdx.dev/configuration.html#mise_global_config_file) to choose a different global config path.\n\nUse the `--global` flag to use the global config file instead.", VisibleAliases: []string{"u"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n # run with no arguments to use the interactive selector\n $ \x1b[1mmise use\x1b[22m\n\n # set the current version of node to 20.x in mise.toml of current directory\n # will write the fuzzy version (e.g.: 20)\n $ \x1b[1mmise use node@20\x1b[22m\n\n # set the current version of node to 20.x in ~/.config/mise/config.toml\n # will write the precise version (e.g.: 20.0.0)\n $ \x1b[1mmise use -g --pin node@20\x1b[22m\n\n # sets .mise.local.toml (which is intended not to be committed to a project)\n $ \x1b[1mmise use --env local node@20\x1b[22m\n\n # sets .mise.staging.toml (which is used if MISE_ENV=staging)\n $ \x1b[1mmise use --env staging node@20\x1b[22m\n"},
+ {Key: FlagUseEnv, ValueName: "ENV", ValueDemanded: true, Short: "Create/modify an environment-specific config file like .mise..toml", Long: "Create/modify an environment-specific config file like .mise..toml"},
+ {Key: FlagUseForce, Short: "Force reinstall even if already installed", Long: "Force reinstall even if already installed"},
+ {Key: FlagUseGlobal, Short: "Use the global config file (`~/.config/mise/config.toml`) instead of the local one", Long: "Use the global config file (`~/.config/mise/config.toml`) instead of the local one"},
+ {Key: FlagUseJobs, ValueName: "JOBS", ValueDemanded: true, Short: "Number of jobs to run in parallel\nValues below 1 are treated as 1\n[default: 4]", Long: "Number of jobs to run in parallel\nValues below 1 are treated as 1\n[default: 4]", Env: "MISE_JOBS"},
+ {Key: FlagUseDryRun, Short: "Perform a dry run, showing what would be installed and modified without making changes", Long: "Perform a dry run, showing what would be installed and modified without making changes"},
+ {Key: FlagUsePath, ValueName: "PATH", ValueDemanded: true, Short: "Specify a path to a config file or directory", Long: "Specify a path to a config file or directory\n\nIf a directory is specified, it will look for a config file in that directory following the rules above."},
+ {Key: FlagUseDryRunCode, Short: "Like --dry-run but exits with code 1 if there are changes to make", Long: "Like --dry-run but exits with code 1 if there are changes to make\n\nThis is useful for scripts to check if tools need to be added or removed."},
+ {Key: FlagUseFuzzy, Short: "Save fuzzy version to config file", Long: "Save fuzzy version to config file\n\ne.g.: `mise use --fuzzy node@20` will save 20 as the version this is the default behavior unless `MISE_PIN=1`"},
+ {Key: FlagUseMinimumReleaseAge, ValueName: "MINIMUM_RELEASE_AGE", ValueDemanded: true, Short: "Only install versions released before this date or older than this duration", Long: "Only install versions released before this date or older than this duration\n\nSupports absolute dates like \"2024-06-01\" and relative durations like \"90d\" or \"1y\"."},
+ {Key: FlagUsePin, Short: "Save the resolved concrete version to the config file", Long: "Save the resolved concrete version to the config file\n\nIf the request exactly matches an available release, that release is preferred over installed fuzzy matches. Use `prefix:` to explicitly request recursive prefix matching. e.g.: `mise use --pin node@20` will save the resolved `20.x.y` version Set `MISE_PIN=1` to make this the default behavior\n\nConsider using mise.lock as a better alternative to pinning in mise.toml: https://mise.jdx.dev/configuration/settings.html#lockfile"},
+ {Key: FlagUseRaw, Short: "Connect backend install command stdin/stdout/stderr directly to the terminal Implies `--jobs=1`", Long: "Connect backend install command stdin/stdout/stderr directly to the terminal\nImplies `--jobs=1`"},
+ {Key: FlagUseRemove, Repeatable: true, ValueName: "TOOL", ValueDemanded: true, Short: "Remove the tool(s) from config file", Long: "Remove the tool(s) from config file"},
+ {Key: ArgUseToolVersion, Short: "Tool(s) to add to config file", Long: "Tool(s) to add to config file\n\ne.g.: node@20, cargo:ripgrep@latest npm:prettier@3 If no version is specified, it will default to @latest\n\nTool options can be set with this syntax:\n\n mise use ubi:BurntSushi/ripgrep[exe=rg]"},
+ {Key: CmdVersion, Short: "Display the version of mise", Long: "Display the version of mise\n\nDisplays the version, os, architecture, and the date of the build.\n\nIf the version is out of date, it will display a warning.", VisibleAliases: []string{"v"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise version\x1b[22m\n $ \x1b[1mmise --version\x1b[22m\n $ \x1b[1mmise -v\x1b[22m\n $ \x1b[1mmise -V\x1b[22m\n"},
+ {Key: FlagVersionJson, Short: "Print the version information in JSON format", Long: "Print the version information in JSON format"},
+ {Key: CmdWatch, Short: "Run task(s) and watch for changes to rerun it", Long: "Run task(s) and watch for changes to rerun it\n\nThis command uses the `watchexec` tool to watch for changes to files and rerun the specified task(s). It must be installed for this command to work, but you can install it with `mise use -g watchexec@latest`.\n\nFor more advanced process management (daemon management, auto-restart, readiness checks, cron scheduling), see mise's sister project: https://pitchfork.jdx.dev", VisibleAliases: []string{"w"}, AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise watch build\x1b[22m\n Runs the \"build\" tasks. Will re-run the tasks when any of its sources change.\n Uses \"sources\" from the tasks definition to determine which files to watch.\n\n $ \x1b[1mmise watch build --glob src/**/*.rs\x1b[22m\n Runs the \"build\" tasks but specify the files to watch with a glob pattern.\n This overrides the \"sources\" from the tasks definition.\n\n $ \x1b[1mmise watch build --clear\x1b[22m\n Extra arguments are passed to watchexec. See `watchexec --help` for details.\n\n $ \x1b[1mmise watch serve --watch src --exts rs --restart\x1b[22m\n Starts an api server, watching for changes to \"*.rs\" files in \"./src\" and kills/restarts the server when they change.\n"},
+ {Key: FlagWatchTaskFlag, Hide: true, Repeatable: true, ValueName: "TASK_FLAG", ValueDemanded: true, Short: "Tasks to run", Long: "Tasks to run"},
+ {Key: FlagWatchGlob, Hide: true, Repeatable: true, ValueName: "GLOB", ValueDemanded: true, Short: "Files to watch\nDefaults to sources from the task(s)", Long: "Files to watch\nDefaults to sources from the task(s)"},
+ {Key: FlagWatchSkipDeps, Short: "Run only the specified tasks skipping all dependencies", Long: "Run only the specified tasks skipping all dependencies"},
+ {Key: FlagWatchWatch, Repeatable: true, ValueName: "PATH", ValueDemanded: true, Short: "Watch a specific file or directory", Long: "Watch a specific file or directory\n\nBy default, Watchexec watches the current directory.\n\nWhen watching a single file, it's often better to watch the containing directory instead, and filter on the filename. Some editors may replace the file with a new one when saving, and some platforms may not detect that or further changes.\n\nUpon starting, Watchexec resolves a \"project origin\" from the watched paths. See the help for '--project-origin' for more information.\n\nThis option can be specified multiple times to watch multiple files or directories.\n\nThe special value '/dev/null', provided as the only path watched, will cause Watchexec to not watch any paths. Other event sources (like signals or key events) may still be used.", Heading: "Filtering"},
+ {Key: FlagWatchWatchNonRecursive, Repeatable: true, ValueName: "PATH", ValueDemanded: true, Short: "Watch a specific directory, non-recursively", Long: "Watch a specific directory, non-recursively\n\nUnlike '-w', folders watched with this option are not recursed into.\n\nThis option can be specified multiple times to watch multiple directories non-recursively.", Heading: "Filtering"},
+ {Key: FlagWatchWatchFile, ValueName: "PATH", ValueDemanded: true, Short: "Watch files and directories from a file", Long: "Watch files and directories from a file\n\nEach line in the file will be interpreted as if given to '-w'.\n\nFor more complex uses (like watching non-recursively), use the argfile capability: build a file containing command-line options and pass it to watchexec with `@path/to/argfile`.\n\nThe special value '-' will read from STDIN; this in incompatible with '--stdin-quit'.", Heading: "Filtering"},
+ {Key: FlagWatchClear, ValueName: "MODE", Short: "Clear screen before running command", Long: "Clear screen before running command\n\nIf this doesn't completely clear the screen, try '--clear=reset'.", Heading: "Output", Choices: []string{"clear", "reset"}},
+ {Key: FlagWatchOnBusyUpdate, HideDefaultValue: true, ValueName: "MODE", ValueDemanded: true, Short: "What to do when receiving events while the command is running", Long: "What to do when receiving events while the command is running\n\nDefault is to 'do-nothing', which ignores events while the command is running, so that changes that occur due to the command are ignored, like compilation outputs. You can also use 'queue' which will run the command once again when the current run has finished if any events occur while it's running, or 'restart', which terminates the running command and starts a new one. Finally, there's 'signal', which only sends a signal; this can be useful with programs that can reload their configuration without a full restart.\n\nThe signal can be specified with the '--signal' option.", Choices: []string{"queue", "do-nothing", "restart", "signal"}, Default: []string{"do-nothing"}},
+ {Key: FlagWatchRestart, Short: "Restart the process if it's still running", Long: "Restart the process if it's still running\n\nThis is a shorthand for '--on-busy-update=restart'."},
+ {Key: FlagWatchSignal, ValueName: "SIGNAL", ValueDemanded: true, Short: "Send a signal to the process when it's still running", Long: "Send a signal to the process when it's still running\n\nSpecify a signal to send to the process when it's still running. This implies '--on-busy-update=signal'; otherwise the signal used when that mode is 'restart' is controlled by '--stop-signal'.\n\nSee the long documentation for '--stop-signal' for syntax.\n\nSignals are not supported on Windows at the moment, and will always be overridden to 'kill'. See '--stop-signal' for more on Windows \"signals\"."},
+ {Key: FlagWatchStopSignal, ValueName: "SIGNAL", ValueDemanded: true, Short: "Signal to send to stop the command", Long: "Signal to send to stop the command\n\nThis is used by 'restart' and 'signal' modes of '--on-busy-update' (unless '--signal' is provided). The restart behaviour is to send the signal, wait for the command to exit, and if it hasn't exited after some time (see '--timeout-stop'), forcefully terminate it.\n\nThe default on unix is \"SIGTERM\".\n\nInput is parsed as a full signal name (like \"SIGTERM\"), a short signal name (like \"TERM\"), or a signal number (like \"15\"). All input is case-insensitive.\n\nOn Windows this option is technically supported but only supports the \"KILL\" event, as Watchexec cannot yet deliver other events. Windows doesn't have signals as such; instead it has termination (here called \"KILL\" or \"STOP\") and \"CTRL+C\", \"CTRL+BREAK\", and \"CTRL+CLOSE\" events. For portability the unix signals \"SIGKILL\", \"SIGINT\", \"SIGTERM\", and \"SIGHUP\" are respectively mapped to these."},
+ {Key: FlagWatchStopTimeout, HideDefaultValue: true, ValueName: "TIMEOUT", ValueDemanded: true, Short: "Time to wait for the command to exit gracefully", Long: "Time to wait for the command to exit gracefully\n\nThis is used by the 'restart' mode of '--on-busy-update'. After the graceful stop signal is sent, Watchexec will wait for the command to exit. If it hasn't exited after this time, it is forcefully terminated.\n\nTakes a unit-less value in seconds, or a time span value such as \"5min 20s\". Providing a unit-less value is deprecated and will warn; it will be an error in the future.\n\nThe default is 10 seconds. Set to 0 to immediately force-kill the command.\n\nThis has no practical effect on Windows as the command is always forcefully terminated; see '--stop-signal' for why.", Default: []string{"10s"}},
+ {Key: FlagWatchMapSignal, Repeatable: true, ValueName: "SIGNAL:SIGNAL", ValueDemanded: true, Short: "Translate signals from the OS to signals to send to the command", Long: "Translate signals from the OS to signals to send to the command\n\nTakes a pair of signal names, separated by a colon, such as \"TERM:INT\" to map SIGTERM to SIGINT. The first signal is the one received by watchexec, and the second is the one sent to the command. The second can be omitted to discard the first signal, such as \"TERM:\" to not do anything on SIGTERM.\n\nIf SIGINT or SIGTERM are mapped, then they no longer quit Watchexec. Besides making it hard to quit Watchexec itself, this is useful to send pass a Ctrl-C to the command without also terminating Watchexec and the underlying program with it, e.g. with \"INT:INT\".\n\nThis option can be specified multiple times to map multiple signals.\n\nSignal syntax is case-insensitive for short names (like \"TERM\", \"USR2\") and long names (like \"SIGKILL\", \"SIGHUP\"). Signal numbers are also supported (like \"15\", \"31\"). On Windows, the forms \"STOP\", \"CTRL+C\", and \"CTRL+BREAK\" are also supported to receive, but Watchexec cannot yet deliver other \"signals\" than a STOP."},
+ {Key: FlagWatchDebounce, HideDefaultValue: true, ValueName: "TIMEOUT", ValueDemanded: true, Short: "Time to wait for new events before taking action", Long: "Time to wait for new events before taking action\n\nWhen an event is received, Watchexec will wait for up to this amount of time before handling it (such as running the command). This is essential as what you might perceive as a single change may actually emit many events, and without this behaviour, Watchexec would run much too often. Additionally, it's not infrequent that file writes are not atomic, and each write may emit an event, so this is a good way to avoid running a command while a file is partially written.\n\nAn alternative use is to set a high value (like \"30min\" or longer), to save power or bandwidth on intensive tasks, like an ad-hoc backup script. In those use cases, note that every accumulated event will build up in memory.\n\nTakes a unit-less value in milliseconds, or a time span value such as \"5sec 20ms\". Providing a unit-less value is deprecated and will warn; it will be an error in the future.\n\nThe default is 50 milliseconds. Setting to 0 is highly discouraged.", Default: []string{"50ms"}},
+ {Key: FlagWatchStdinQuit, Short: "Exit when stdin closes", Long: "Exit when stdin closes\n\nThis watches the stdin file descriptor for EOF, and exits Watchexec gracefully when it is closed. This is used by some process managers to avoid leaving zombie processes around."},
+ {Key: FlagWatchNoVcsIgnore, Short: "Don't load gitignores", Long: "Don't load gitignores\n\nAmong other VCS exclude files, like for Mercurial, Subversion, Bazaar, DARCS, Fossil. Note that Watchexec will detect which of these is in use, if any, and only load the relevant files. Both global (like '~/.gitignore') and local (like '.gitignore') files are considered.\n\nThis option is useful if you want to watch files that are ignored by Git.", Heading: "Filtering"},
+ {Key: FlagWatchNoProjectIgnore, Short: "Don't load project-local ignores", Long: "Don't load project-local ignores\n\nThis disables loading of project-local ignore files, like '.gitignore' or '.ignore' in the watched project. This is contrasted with '--no-vcs-ignore', which disables loading of Git and other VCS ignore files, and with '--no-global-ignore', which disables loading of global or user ignore files, like '~/.gitignore' or '~/.config/watchexec/ignore'.\n\nSupported project ignore files:\n\n - Git: .gitignore at project root and child directories, .git/info/exclude, and the file pointed to by `core.excludesFile` in .git/config.\n - Mercurial: .hgignore at project root and child directories.\n - Bazaar: .bzrignore at project root.\n - Darcs: _darcs/prefs/boring\n - Fossil: .fossil-settings/ignore-glob\n - Ripgrep/Watchexec/generic: .ignore at project root and child directories.\n\nVCS ignore files (Git, Mercurial, Bazaar, Darcs, Fossil) are only used if the corresponding VCS is discovered to be in use for the project/origin. For example, a .bzrignore in a Git repository will be discarded.", Heading: "Filtering"},
+ {Key: FlagWatchNoGlobalIgnore, Short: "Don't load global ignores", Long: "Don't load global ignores\n\nThis disables loading of global or user ignore files, like '~/.gitignore', '~/.config/watchexec/ignore', or '%APPDATA%\\Bazaar\\2.0\\ignore'. Contrast with '--no-vcs-ignore' and '--no-project-ignore'.\n\nSupported global ignore files\n\n - Git (if core.excludesFile is set): the file at that path\n - Git (otherwise): the first found of $XDG_CONFIG_HOME/git/ignore, %APPDATA%/.gitignore, %USERPROFILE%/.gitignore, $HOME/.config/git/ignore, $HOME/.gitignore.\n - Bazaar: the first found of %APPDATA%/Bazaar/2.0/ignore, $HOME/.bazaar/ignore.\n - Watchexec: the first found of $XDG_CONFIG_HOME/watchexec/ignore, %APPDATA%/watchexec/ignore, %USERPROFILE%/.watchexec/ignore, $HOME/.watchexec/ignore.\n\nLike for project files, Git and Bazaar global files will only be used for the corresponding VCS as used in the project.", Heading: "Filtering"},
+ {Key: FlagWatchNoDefaultIgnore, Short: "Don't use internal default ignores", Long: "Don't use internal default ignores\n\nWatchexec has a set of default ignore patterns, such as editor swap files, `*.pyc`, `*.pyo`, `.DS_Store`, `.bzr`, `_darcs`, `.fossil-settings`, `.git`, `.hg`, `.pijul`, `.svn`, and Watchexec log files.", Heading: "Filtering"},
+ {Key: FlagWatchNoDiscoverIgnore, Short: "Don't discover ignore files at all", Long: "Don't discover ignore files at all\n\nThis is a shorthand for '--no-global-ignore', '--no-vcs-ignore', '--no-project-ignore', but even more efficient as it will skip all the ignore discovery mechanisms from the get go.\n\nNote that default ignores are still loaded, see '--no-default-ignore'.", Heading: "Filtering"},
+ {Key: FlagWatchIgnoreNothing, Short: "Don't ignore anything at all", Long: "Don't ignore anything at all\n\nThis is a shorthand for '--no-discover-ignore', '--no-default-ignore'.\n\nNote that ignores explicitly loaded via other command line options, such as '--ignore' or '--ignore-file', will still be used.", Heading: "Filtering"},
+ {Key: FlagWatchPostpone, Short: "Wait until first change before running command", Long: "Wait until first change before running command\n\nBy default, Watchexec will run the command once immediately. With this option, it will instead wait until an event is detected before running the command as normal."},
+ {Key: FlagWatchDelayRun, ValueName: "DURATION", ValueDemanded: true, Short: "Sleep before running the command", Long: "Sleep before running the command\n\nThis option will cause Watchexec to sleep for the specified amount of time before running the command, after an event is detected. This is like using \"sleep 5 && command\" in a shell, but portable and slightly more efficient.\n\nTakes a unit-less value in seconds, or a time span value such as \"2min 5s\". Providing a unit-less value is deprecated and will warn; it will be an error in the future."},
+ {Key: FlagWatchPoll, ValueName: "INTERVAL", Short: "Poll for filesystem changes", Long: "Poll for filesystem changes\n\nBy default, and where available, Watchexec uses the operating system's native file system watching capabilities. This option disables that and instead uses a polling mechanism, which is less efficient but can work around issues with some file systems (like network shares) or edge cases.\n\nOptionally takes a unit-less value in milliseconds, or a time span value such as \"2s 500ms\", to use as the polling interval. If not specified, the default is 30 seconds. Providing a unit-less value is deprecated and will warn; it will be an error in the future.\n\nAliased as '--force-poll'."},
+ {Key: FlagWatchShell, ValueName: "SHELL", ValueDemanded: true, Short: "Use a different shell", Long: "Use a different shell\n\nBy default, Watchexec will use '$SHELL' if it's defined or a default of 'sh' on Unix-likes, and either 'pwsh', 'powershell', or 'cmd' (CMD.EXE) on Windows, depending on what Watchexec detects is the running shell.\n\nWith this option, you can override that and use a different shell, for example one with more features or one which has your custom aliases and functions.\n\nIf the value has spaces, it is parsed as a command line, and the first word used as the shell program, with the rest as arguments to the shell.\n\nThe command is run with the '-c' flag (except for 'cmd' on Windows, where it's '/C').\n\nThe special value 'none' can be used to disable shell use entirely. In that case, the command provided to Watchexec will be parsed, with the first word being the executable and the rest being the arguments, and executed directly. Note that this parsing is rudimentary, and may not work as expected in all cases.\n\nUsing 'none' is a little more efficient and can enable a stricter interpretation of the input, but it also means that you can't use shell features like globbing, redirection, control flow, logic, or pipes.\n\nExamples:\n\nUse without shell:\n\n $ watchexec -n -- zsh -x -o shwordsplit scr\n\nUse with powershell core:\n\n $ watchexec --shell=pwsh -- Test-Connection localhost\n\nUse with CMD.exe:\n\n $ watchexec --shell=cmd -- dir\n\nUse with a different unix shell:\n\n $ watchexec --shell=bash -- 'echo $BASH_VERSION'\n\nUse with a unix shell and options:\n\n $ watchexec --shell='zsh -x -o shwordsplit' -- scr", Heading: "Command"},
+ {Key: FlagWatchN, Short: "Shorthand for '--shell=none'", Long: "Shorthand for '--shell=none'", Heading: "Command"},
+ {Key: FlagWatchEmitEventsTo, HideDefaultValue: true, ValueName: "MODE", ValueDemanded: true, Short: "Configure event emission", Long: "Configure event emission\n\nWatchexec can emit event information when running a command, which can be used by the child process to target specific changed files.\n\nOne thing to take care with is assuming inherent behaviour where there is only chance. Notably, it could appear as if the `RENAMED` variable contains both the original and the new path being renamed. In previous versions, it would even appear on some platforms as if the original always came before the new. However, none of this was true. It's impossible to reliably and portably know which changed path is the old or new, \"half\" renames may appear (only the original, only the new), \"unknown\" renames may appear (change was a rename, but whether it was the old or new isn't known), rename events might split across two debouncing boundaries, and so on.\n\nThis option controls where that information is emitted. It defaults to 'none', which doesn't emit event information at all. The other options are 'environment' (deprecated), 'stdio', 'file', 'json-stdio', and 'json-file'.\n\nThe 'stdio' and 'file' modes are text-based: 'stdio' writes absolute paths to the stdin of the command, one per line, each prefixed with `create:`, `remove:`, `rename:`, `modify:`, or `other:`, then closes the handle; 'file' writes the same thing to a temporary file, and its path is given with the $WATCHEXEC_EVENTS_FILE environment variable.\n\nThere are also two JSON modes, which are based on JSON objects and can represent the full set of events Watchexec handles. Here's an example of a folder being created on Linux:\n\n```json\n {\n \"tags\": [\n {\n \"kind\": \"path\",\n \"absolute\": \"/home/user/your/new-folder\",\n \"filetype\": \"dir\"\n },\n {\n \"kind\": \"fs\",\n \"simple\": \"create\",\n \"full\": \"Create(Folder)\"\n },\n {\n \"kind\": \"source\",\n \"source\": \"filesystem\",\n }\n ],\n \"metadata\": {\n \"notify-backend\": \"inotify\"\n }\n }\n```\n\nThe fields are as follows:\n\n - `tags`, structured event data.\n - `tags[].kind`, which can be:\n * 'path', along with:\n + `absolute`, an absolute path.\n + `filetype`, a file type if known ('dir', 'file', 'symlink', 'other').\n * 'fs':\n + `simple`, the \"simple\" event type ('access', 'create', 'modify', 'remove', or 'other').\n + `full`, the \"full\" event type, which is too complex to fully describe here, but looks like 'General(Precise(Specific))'.\n * 'source', along with:\n + `source`, the source of the event ('filesystem', 'keyboard', 'mouse', 'os', 'time', 'internal').\n * 'keyboard', along with:\n + `keycode`. Currently only the value 'eof' is supported.\n * 'process', for events caused by processes:\n + `pid`, the process ID.\n * 'signal', for signals sent to Watchexec:\n + `signal`, the normalised signal name ('hangup', 'interrupt', 'quit', 'terminate', 'user1', 'user2').\n * 'completion', for when a command ends:\n + `disposition`, the exit disposition ('success', 'error', 'signal', 'stop', 'exception', 'continued').\n + `code`, the exit, signal, stop, or exception code.\n - `metadata`, additional information about the event.\n\nThe 'json-stdio' mode will emit JSON events to the standard input of the command, one per line, then close stdin. The 'json-file' mode will create a temporary file, write the events to it, and provide the path to the file with the $WATCHEXEC_EVENTS_FILE environment variable.\n\nFinally, the 'environment' mode was the default until 2.0. It sets environment variables with the paths of the affected files, for filesystem events:\n\n$WATCHEXEC_COMMON_PATH is set to the longest common path of all of the below variables, and so should be prepended to each path to obtain the full/real path. Then:\n\n - $WATCHEXEC_CREATED_PATH is set when files/folders were created\n - $WATCHEXEC_REMOVED_PATH is set when files/folders were removed\n - $WATCHEXEC_RENAMED_PATH is set when files/folders were renamed\n - $WATCHEXEC_WRITTEN_PATH is set when files/folders were modified\n - $WATCHEXEC_META_CHANGED_PATH is set when files/folders' metadata were modified\n - $WATCHEXEC_OTHERWISE_CHANGED_PATH is set for every other kind of pathed event\n\nMultiple paths are separated by the system path separator, ';' on Windows and ':' on unix. Within each variable, paths are deduplicated and sorted in binary order (i.e. neither Unicode nor locale aware).\n\nThis is the legacy mode, is deprecated, and will be removed in the future. The environment is a very restricted space, while also limited in what it can usefully represent. Large numbers of files will either cause the environment to be truncated, or may error or crash the process entirely. The $WATCHEXEC_COMMON_PATH is also unintuitive, as demonstrated by the multiple confused queries that have landed in my inbox over the years.", Heading: "Command", Choices: []string{"environment", "stdio", "file", "json-stdio", "json-file", "none"}, Default: []string{"none"}},
+ {Key: FlagWatchOnlyEmitEvents, Short: "Only emit events to stdout, run no commands.", Long: "Only emit events to stdout, run no commands.\n\nThis is a convenience option for using Watchexec as a file watcher, without running any commands. It is almost equivalent to using `cat` as the command, except that it will not spawn a new process for each event.\n\nThis option requires `--emit-events-to` to be set, and restricts the available modes to `stdio` and `json-stdio`, modifying their behaviour to write to stdout instead of the stdin of the command.", Heading: "Output"},
+ {Key: FlagWatchEnv, Repeatable: true, ValueName: "KEY=VALUE", ValueDemanded: true, Short: "Add env vars to the command", Long: "Add env vars to the command\n\nThis is a convenience option for setting environment variables for the command, without setting them for the Watchexec process itself.\n\nUse key=value syntax. Multiple variables can be set by repeating the option.", Heading: "Command"},
+ {Key: FlagWatchWrapProcess, ValueName: "MODE", ValueDemanded: true, Short: "Configure how the process is wrapped", Long: "Configure how the process is wrapped\n\nBy default, Watchexec will run the command in a session on macOS, in a process group on other Unix platforms, and in a Job Object in Windows.\n\nSome Unix programs prefer running in a session, while others do not work in a process group.\n\nUse 'group' to use a process group, 'session' to use a process session, and 'none' to run the command directly. On Windows, either of 'group' or 'session' will use a Job Object.", Heading: "Command", Choices: []string{"group", "session", "none"}},
+ {Key: FlagWatchNotify, Short: "Alert when commands start and end", Long: "Alert when commands start and end\n\nWith this, Watchexec will emit a desktop notification when a command starts and ends, on supported platforms. On unsupported platforms, it may silently do nothing, or log a warning.", Heading: "Output"},
+ {Key: FlagWatchColor, ValueName: "MODE", ValueDemanded: true, Short: "When to use terminal colours", Long: "When to use terminal colours\n\nSetting the environment variable `NO_COLOR` to any value is equivalent to `--color=never`.", Heading: "Output", Choices: []string{"auto", "always", "never"}, Default: []string{"auto"}},
+ {Key: FlagWatchTimings, Short: "Print how long the command took to run", Long: "Print how long the command took to run\n\nThis may not be exactly accurate, as it includes some overhead from Watchexec itself. Use the `time` utility, high-precision timers, or benchmarking tools for more accurate results.", Heading: "Output"},
+ {Key: FlagWatchQuiet, Short: "Don't print starting and stopping messages", Long: "Don't print starting and stopping messages\n\nBy default Watchexec will print a message when the command starts and stops. This option disables this behaviour, so only the command's output, warnings, and errors will be printed.", Heading: "Output"},
+ {Key: FlagWatchBell, Short: "Ring the terminal bell on command completion", Long: "Ring the terminal bell on command completion", Heading: "Output"},
+ {Key: FlagWatchProjectOrigin, ValueName: "DIRECTORY", ValueDemanded: true, Short: "Set the project origin", Long: "Set the project origin\n\nWatchexec will attempt to discover the project's \"origin\" (or \"root\") by searching for a variety of markers, like files or directory patterns. It does its best but sometimes gets it it wrong, and you can override that with this option.\n\nThe project origin is used to determine the path of certain ignore files, which VCS is being used, the meaning of a leading '/' in filtering patterns, and maybe more in the future.\n\nWhen set, Watchexec will also not bother searching, which can be significantly faster."},
+ {Key: FlagWatchWorkdir, ValueName: "DIRECTORY", ValueDemanded: true, Short: "Set the working directory", Long: "Set the working directory\n\nBy default, the working directory of the command is the working directory of Watchexec. You can change that with this option. Note that paths may be less intuitive to use with this."},
+ {Key: FlagWatchExts, Repeatable: true, ValueName: "EXTENSIONS", ValueDemanded: true, Short: "Filename extensions to filter to", Long: "Filename extensions to filter to\n\nThis is a quick filter to only emit events for files with the given extensions. Extensions can be given with or without the leading dot (e.g. 'js' or '.js'). Multiple extensions can be given by repeating the option or by separating them with commas.", Heading: "Filtering"},
+ {Key: FlagWatchFilter, Repeatable: true, ValueName: "PATTERN", ValueDemanded: true, Short: "Filename patterns to filter to", Long: "Filename patterns to filter to\n\nProvide a glob-like filter pattern, and only events for files matching the pattern will be emitted. Multiple patterns can be given by repeating the option. Events that are not from files (e.g. signals, keyboard events) will pass through untouched.", Heading: "Filtering"},
+ {Key: FlagWatchFilterFile, HideEnv: true, Repeatable: true, ValueName: "PATH", ValueDemanded: true, Short: "Files to load filters from", Long: "Files to load filters from\n\nProvide a path to a file containing filters, one per line. Empty lines and lines starting with '#' are ignored. Uses the same pattern format as the '--filter' option.\n\nThis can also be used via the $WATCHEXEC_FILTER_FILES environment variable.", Heading: "Filtering", Env: "WATCHEXEC_FILTER_FILES"},
+ {Key: FlagWatchFilterProg, Repeatable: true, ValueName: "EXPRESSION", ValueDemanded: true, Short: "[experimental] Filter programs.", Long: "[experimental] Filter programs.\n\n/!\\ This option is EXPERIMENTAL and may change and/or vanish without notice.\n\nProvide your own custom filter programs in jaq (similar to jq) syntax. Programs are given an event in the same format as described in '--emit-events-to' and must return a boolean. Invalid programs will make watchexec fail to start; use '-v' to see program runtime errors.\n\nIn addition to the jaq stdlib, watchexec adds some custom filter definitions:\n\n - 'path | file_meta' returns file metadata or null if the file does not exist.\n\n - 'path | file_size' returns the size of the file at path, or null if it does not exist.\n\n - 'path | file_read(bytes)' returns a string with the first n bytes of the file at path.\n If the file is smaller than n bytes, the whole file is returned. There is no filter to\n read the whole file at once to encourage limiting the amount of data read and processed.\n\n - 'string | hash', and 'path | file_hash' return the hash of the string or file at path.\n No guarantee is made about the algorithm used: treat it as an opaque value.\n\n - 'any | kv_store(key)', 'kv_fetch(key)', and 'kv_clear' provide a simple key-value store.\n Data is kept in memory only, there is no persistence. Consistency is not guaranteed.\n\n - 'any | printout', 'any | printerr', and 'any | log(level)' will print or log any given\n value to stdout, stderr, or the log (levels = error, warn, info, debug, trace), and\n pass the value through (so '[1] | log(\"debug\") | .[]' will produce a '1' and log '[1]').\n\nAll filtering done with such programs, and especially those using kv or filesystem access, is much slower than the other filtering methods. If filtering is too slow, events will back up and stall watchexec. Take care when designing your filters.\n\nIf the argument to this option starts with an '@', the rest of the argument is taken to be the path to a file containing a jaq program.\n\nJaq programs are run in order, after all other filters, and short-circuit: if a filter (jaq or not) rejects an event, execution stops there, and no other filters are run. Additionally, they stop after outputting the first value, so you'll want to use 'any' or 'all' when iterating, otherwise only the first item will be processed, which can be quite confusing!\n\nFind user-contributed programs or submit your own useful ones at .\n\n## Examples:\n\nRegexp ignore filter on paths:\n\n 'all(.tags[] | select(.kind == \"path\"); .absolute | test(\"[.]test[.]js$\")) | not'\n\nPass any event that creates a file:\n\n 'any(.tags[] | select(.kind == \"fs\"); .simple == \"create\")'\n\nPass events that touch executable files:\n\n 'any(.tags[] | select(.kind == \"path\" && .filetype == \"file\"); .absolute | metadata | .executable)'\n\nIgnore files that start with shebangs:\n\n 'any(.tags[] | select(.kind == \"path\" && .filetype == \"file\"); .absolute | read(2) == \"#!\") | not'", Heading: "Filtering"},
+ {Key: FlagWatchIgnore, Repeatable: true, ValueName: "PATTERN", ValueDemanded: true, Short: "Filename patterns to filter out", Long: "Filename patterns to filter out\n\nProvide a glob-like filter pattern, and events for files matching the pattern will be excluded. Multiple patterns can be given by repeating the option. Events that are not from files (e.g. signals, keyboard events) will pass through untouched.", Heading: "Filtering"},
+ {Key: FlagWatchIgnoreFile, HideEnv: true, Repeatable: true, ValueName: "PATH", ValueDemanded: true, Short: "Files to load ignores from", Long: "Files to load ignores from\n\nProvide a path to a file containing ignores, one per line. Empty lines and lines starting with '#' are ignored. Uses the same pattern format as the '--ignore' option.\n\nThis can also be used via the $WATCHEXEC_IGNORE_FILES environment variable.", Heading: "Filtering", Env: "WATCHEXEC_IGNORE_FILES"},
+ {Key: FlagWatchFsEvents, HideDefaultValue: true, Repeatable: true, ValueName: "EVENTS", ValueDemanded: true, Short: "Filesystem events to filter to", Long: "Filesystem events to filter to\n\nThis is a quick filter to only emit events for the given types of filesystem changes. Choose from 'access', 'create', 'remove', 'rename', 'modify', 'metadata'. Multiple types can be given by repeating the option or by separating them with commas. By default, this is all types except for 'access'.\n\nThis may apply filtering at the kernel level when possible, which can be more efficient, but may be more confusing when reading the logs.", Heading: "Filtering", Choices: []string{"access", "create", "remove", "rename", "modify", "metadata"}, Default: []string{"create,remove,rename,modify,metadata"}},
+ {Key: FlagWatchNoMeta, Short: "Don't emit fs events for metadata changes", Long: "Don't emit fs events for metadata changes\n\nThis is a shorthand for '--fs-events create,remove,rename,modify'. Using it alongside the '--fs-events' option is non-sensical and not allowed.", Heading: "Filtering"},
+ {Key: FlagWatchPrintEvents, Short: "Print events that trigger actions", Long: "Print events that trigger actions\n\nThis prints the events that triggered the action when handling it (after debouncing), in a human readable form. This is useful for debugging filters.\n\nUse '-vvv' instead when you need more diagnostic information.", Heading: "Debugging"},
+ {Key: FlagWatchManual, Short: "Show the manual page", Long: "Show the manual page\n\nThis shows the manual page for Watchexec, if the output is a terminal and the 'man' program is available. If not, the manual page is printed to stdout in ROFF format (suitable for writing to a watchexec.1 file).", Heading: "Debugging"},
+ {Key: ArgWatchTask, Short: "Tasks to run\nCan specify multiple tasks by separating with `:::`\ne.g.: `mise run task1 arg1 arg2 ::: task2 arg1 arg2`\nDefaults to `default`", Long: "Tasks to run\nCan specify multiple tasks by separating with `:::`\ne.g.: `mise run task1 arg1 arg2 ::: task2 arg1 arg2`\nDefaults to `default`"},
+ {Key: ArgWatchArgs, Short: "Task and arguments to run", Long: "Task and arguments to run"},
+ {Key: CmdWhere, Short: "Display the installation path for a tool", Long: "Display the installation path for a tool\n\nThe tool must be installed for this to work.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n # Show the latest installed version of node\n # If it is is not installed, errors\n $ \x1b[1mmise where node@20\x1b[22m\n /home/jdx/.local/share/mise/installs/node/20.0.0\n\n # Show the current, active install directory of node\n # Errors if node is not referenced in any .tool-version file\n $ \x1b[1mmise where node\x1b[22m\n /home/jdx/.local/share/mise/installs/node/20.0.0\n"},
+ {Key: ArgWhereToolVersion, Demanded: true, Short: "Tool(s) to look up\ne.g.: ruby@3\nif \"@\" is specified, it will show the latest installed version\nthat matches the prefix\notherwise, it will show the current, active installed version", Long: "Tool(s) to look up\ne.g.: ruby@3\nif \"@\" is specified, it will show the latest installed version\nthat matches the prefix\notherwise, it will show the current, active installed version"},
+ {Key: ArgWhereAsdfVersion, Hide: true, Short: "the version prefix to use when querying the latest version\nsame as the first argument after the \"@\"\nused for asdf compatibility", Long: "the version prefix to use when querying the latest version\nsame as the first argument after the \"@\"\nused for asdf compatibility"},
+ {Key: CmdWhich, Short: "Shows the path that a tool's bin points to.", Long: "Shows the path that a tool's bin points to.\n\nUse this to figure out what version of a tool is currently active.", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise which node\x1b[22m\n /home/username/.local/share/mise/installs/node/20.0.0/bin/node\n\n $ \x1b[1mmise which node --plugin\x1b[22m\n node\n\n $ \x1b[1mmise which node --version\x1b[22m\n 20.0.0\n"},
+ {Key: FlagWhichTool, ValueName: "TOOL@VERSION", ValueDemanded: true, Short: "Use a specific tool@version\ne.g.: `mise which npm --tool=node@20`", Long: "Use a specific tool@version\ne.g.: `mise which npm --tool=node@20`"},
+ {Key: FlagWhichComplete, Hide: true},
+ {Key: FlagWhichPlugin, Short: "Show the plugin name instead of the path", Long: "Show the plugin name instead of the path"},
+ {Key: FlagWhichVersion, Short: "Show the version instead of the path", Long: "Show the version instead of the path"},
+ {Key: ArgWhichBinName, Short: "The bin to look up", Long: "The bin to look up"},
+}
+
+// HelpMeta is what a page needs from the spec's root rather than from any one
+// command: the header, and the text that brackets every page.
+var HelpMeta = argv.HelpSpec{Name: "mise", Bin: "mise", About: "Dev tools, env vars, and tasks in one CLI", LongAbout: "mise prepares your development environment before each command runs. https://github.com/jdx/mise", Author: "Jeff Dickey <@jdx>", AfterLongHelp: "\x1b[1m\x1b[4mExamples:\x1b[22m\x1b[24m\n\n $ \x1b[1mmise install node@20.0.0\x1b[22m Install a specific node version\n $ \x1b[1mmise install node@20\x1b[22m Install a version matching a prefix\n $ \x1b[1mmise install node\x1b[22m Install the node version defined in config\n $ \x1b[1mmise install\x1b[22m Install all plugins/tools defined in config\n\n $ \x1b[1mmise install cargo:ripgrep\x1b[22m Install something via cargo\n $ \x1b[1mmise install npm:prettier\x1b[22m Install something via npm\n\n $ \x1b[1mmise use node@20\x1b[22m Use node-20.x in current project\n $ \x1b[1mmise use -g node@20\x1b[22m Use node-20.x as default\n $ \x1b[1mmise use node@latest\x1b[22m Use latest node in current directory\n\n $ \x1b[1mmise up --interactive\x1b[22m Show a menu to upgrade tools\n\n $ \x1b[1mmise x -- npm install\x1b[22m `npm install` w/ config loaded into PATH\n $ \x1b[1mmise x node@20 -- node app.js\x1b[22m `node app.js` w/ config + node-20.x on PATH\n\n $ \x1b[1mmise set NODE_ENV=production\x1b[22m Set NODE_ENV=production in config\n\n $ \x1b[1mmise run build\x1b[22m Run `build` tasks\n $ \x1b[1mmise watch build\x1b[22m Run `build` tasks repeatedly when files change\n\n $ \x1b[1mmise settings\x1b[22m Show settings in use\n $ \x1b[1mmise settings color=0\x1b[22m Disable color by modifying global config file\n"}
+
+// Cli is the whole command line.
+type Cli struct {
+ ContinueOnError bool // FlagContinueOnError
+ Cd string // FlagCd
+ Env []string // FlagEnv
+ Force bool // FlagForce
+ Jobs string // FlagJobs
+ DryRun bool // FlagDryRun
+ Profile []string // FlagProfile
+ Quiet bool // FlagQuiet
+ Shell string // FlagShell
+ Tool []string // FlagTool
+ Verbose int // FlagVerbose
+ Version bool // FlagVersion
+ Yes bool // FlagYes
+ Debug bool // FlagDebug
+ LogLevel string // FlagLogLevel
+ NoConfig bool // FlagNoConfig
+ NoEnv bool // FlagNoEnv
+ NoHooks bool // FlagNoHooks
+ NoTimings bool // FlagNoTimings
+ Output string // FlagOutput
+ Raw bool // FlagRaw
+ Locked bool // FlagLocked
+ Silent bool // FlagSilent
+ Timings bool // FlagTimings
+ Trace bool // FlagTrace
+ Task string // ArgTask
+ TaskArgs []string // ArgTaskArgs
+ TaskArgsLast []string // ArgTaskArgsLast
+ Activate *ActivateCmd // CmdActivate
+ ToolAlias *ToolAliasCmd // CmdToolAlias
+ Asdf *AsdfCmd // CmdAsdf
+ Backends *BackendsCmd // CmdBackends
+ BinPaths *BinPathsCmd // CmdBinPaths
+ Bootstrap *BootstrapCmd // CmdBootstrap
+ Cache *CacheCmd // CmdCache
+ Completion *CompletionCmd // CmdCompletion
+ Config *ConfigCmd // CmdConfig
+ Current *CurrentCmd // CmdCurrent
+ Deactivate *DeactivateCmd // CmdDeactivate
+ Direnv *DirenvCmd // CmdDirenv
+ Dotfiles *DotfilesCmd // CmdDotfiles
+ Doctor *DoctorCmd // CmdDoctor
+ En *EnCmd // CmdEn
+ EnvCmd *EnvCmd // CmdEnv
+ Exec *ExecCmd // CmdExec
+ Fmt *FmtCmd // CmdFmt
+ Generate *GenerateCmd // CmdGenerate
+ Github *GithubCmd // CmdGithub
+ Global *GlobalCmd // CmdGlobal
+ HookEnv *HookEnvCmd // CmdHookEnv
+ HookNotFound *HookNotFoundCmd // CmdHookNotFound
+ Implode *ImplodeCmd // CmdImplode
+ Edit *EditCmd // CmdEdit
+ Install *InstallCmd // CmdInstall
+ InstallInto *InstallIntoCmd // CmdInstallInto
+ Latest *LatestCmd // CmdLatest
+ Link *LinkCmd // CmdLink
+ Local *LocalCmd // CmdLocal
+ Lock *LockCmd // CmdLock
+ Ls *LsCmd // CmdLs
+ LsRemote *LsRemoteCmd // CmdLsRemote
+ Mcp *McpCmd // CmdMcp
+ Oci *OciCmd // CmdOci
+ Outdated *OutdatedCmd // CmdOutdated
+ Patrons *PatronsCmd // CmdPatrons
+ Plugins *PluginsCmd // CmdPlugins
+ Deps *DepsCmd // CmdDeps
+ Prune *PruneCmd // CmdPrune
+ Registry *RegistryCmd // CmdRegistry
+ RenderHelp *RenderHelpCmd // CmdRenderHelp
+ Reshim *ReshimCmd // CmdReshim
+ Run *RunCmd // CmdRun
+ Search *SearchCmd // CmdSearch
+ SelfUpdate *SelfUpdateCmd // CmdSelfUpdate
+ Set *SetCmd // CmdSet
+ Settings *SettingsCmd // CmdSettings
+ ShellCmd *ShellCmd // CmdShell
+ ShellAlias *ShellAliasCmd // CmdShellAlias
+ Sponsors *SponsorsCmd // CmdSponsors
+ Sync *SyncCmd // CmdSync
+ Tasks *TasksCmd // CmdTasks
+ TestTool *TestToolCmd // CmdTestTool
+ Token *TokenCmd // CmdToken
+ ToolCmd *ToolCmd // CmdTool
+ ToolStub *ToolStubCmd // CmdToolStub
+ Trust *TrustCmd // CmdTrust
+ Uninstall *UninstallCmd // CmdUninstall
+ Unset *UnsetCmd // CmdUnset
+ Untrust *UntrustCmd // CmdUntrust
+ Unuse *UnuseCmd // CmdUnuse
+ Upgrade *UpgradeCmd // CmdUpgrade
+ Usage *UsageCmd // CmdUsage
+ Use *UseCmd // CmdUse
+ VersionCmd *VersionCmd // CmdVersion
+ Watch *WatchCmd // CmdWatch
+ Where *WhereCmd // CmdWhere
+ Which *WhichCmd // CmdWhich
+}
+
+// ActivateCmd is `activate`.
+type ActivateCmd struct {
+ Quiet bool // FlagActivateQuiet
+ Shell string // FlagActivateShell
+ NoHookEnv bool // FlagActivateNoHookEnv
+ Shims bool // FlagActivateShims
+ Status bool // FlagActivateStatus
+ ShellType string // ArgActivateShellType
+}
+
+// ToolAliasCmd is `tool-alias`.
+type ToolAliasCmd struct {
+ Tool string // FlagToolAliasTool
+ NoHeader bool // FlagToolAliasNoHeader
+ Get *ToolAliasGetCmd // CmdToolAliasGet
+ Ls *ToolAliasLsCmd // CmdToolAliasLs
+ Set *ToolAliasSetCmd // CmdToolAliasSet
+ Unset *ToolAliasUnsetCmd // CmdToolAliasUnset
+}
+
+// ToolAliasGetCmd is `tool-alias get`.
+type ToolAliasGetCmd struct {
+ Tool string // ArgToolAliasGetTool
+ Alias string // ArgToolAliasGetAlias
+}
+
+// ToolAliasLsCmd is `tool-alias ls`.
+type ToolAliasLsCmd struct {
+ NoHeader bool // FlagToolAliasLsNoHeader
+ Tool string // ArgToolAliasLsTool
+}
+
+// ToolAliasSetCmd is `tool-alias set`.
+type ToolAliasSetCmd struct {
+ Tool string // ArgToolAliasSetTool
+ Alias string // ArgToolAliasSetAlias
+ Value string // ArgToolAliasSetValue
+}
+
+// ToolAliasUnsetCmd is `tool-alias unset`.
+type ToolAliasUnsetCmd struct {
+ Tool string // ArgToolAliasUnsetTool
+ Alias string // ArgToolAliasUnsetAlias
+}
+
+// AsdfCmd is `asdf`.
+type AsdfCmd struct {
+ Args []string // ArgAsdfArgs
+}
+
+// BackendsCmd is `backends`.
+type BackendsCmd struct {
+ Ls *BackendsLsCmd // CmdBackendsLs
+}
+
+// BackendsLsCmd is `backends ls`.
+type BackendsLsCmd struct {
+}
+
+// BinPathsCmd is `bin-paths`.
+type BinPathsCmd struct {
+ BinNames bool // FlagBinPathsBinNames
+ Json bool // FlagBinPathsJson
+ ToolVersion []string // ArgBinPathsToolVersion
+}
+
+// BootstrapCmd is `bootstrap`.
+type BootstrapCmd struct {
+ DryRun bool // FlagBootstrapDryRun
+ Yes bool // FlagBootstrapYes
+ ForceDotfiles bool // FlagBootstrapForceDotfiles
+ Only []string // FlagBootstrapOnly
+ PromptSecrets bool // FlagBootstrapPromptSecrets
+ Skip []string // FlagBootstrapSkip
+ Update bool // FlagBootstrapUpdate
+ ApplyAccountPlan *BootstrapApplyAccountPlanCmd // CmdBootstrapApplyAccountPlan
+ ApplyServicePlan *BootstrapApplyServicePlanCmd // CmdBootstrapApplyServicePlan
+ ApplyFirewallPlan *BootstrapApplyFirewallPlanCmd // CmdBootstrapApplyFirewallPlan
+ ApplySystemPlan *BootstrapApplySystemPlanCmd // CmdBootstrapApplySystemPlan
+ InspectSystemFiles *BootstrapInspectSystemFilesCmd // CmdBootstrapInspectSystemFiles
+ InspectFirewallPlan *BootstrapInspectFirewallPlanCmd // CmdBootstrapInspectFirewallPlan
+ Accounts *BootstrapAccountsCmd // CmdBootstrapAccounts
+ Compose *BootstrapComposeCmd // CmdBootstrapCompose
+ Dotfiles *BootstrapDotfilesCmd // CmdBootstrapDotfiles
+ Files *BootstrapFilesCmd // CmdBootstrapFiles
+ Firewall *BootstrapFirewallCmd // CmdBootstrapFirewall
+ Launchd *BootstrapLaunchdCmd // CmdBootstrapLaunchd
+ Linux *BootstrapLinuxCmd // CmdBootstrapLinux
+ Macos *BootstrapMacosCmd // CmdBootstrapMacos
+ MacosDefaults *BootstrapMacosDefaults2Cmd // CmdBootstrapMacosDefaults2
+ MiseShellActivate *BootstrapMiseShellActivateCmd // CmdBootstrapMiseShellActivate
+ Packages *BootstrapPackagesCmd // CmdBootstrapPackages
+ Plan *BootstrapPlanCmd // CmdBootstrapPlan
+ Plugins *BootstrapPluginsCmd // CmdBootstrapPlugins
+ Remote *BootstrapRemoteCmd // CmdBootstrapRemote
+ Repos *BootstrapReposCmd // CmdBootstrapRepos
+ Secrets *BootstrapSecretsCmd // CmdBootstrapSecrets
+ Services *BootstrapServicesCmd // CmdBootstrapServices
+ Status *BootstrapStatusCmd // CmdBootstrapStatus
+ Systemd *BootstrapSystemdCmd // CmdBootstrapSystemd
+ User *BootstrapUserCmd // CmdBootstrapUser
+}
+
+// BootstrapApplyAccountPlanCmd is `bootstrap __apply-account-plan`.
+type BootstrapApplyAccountPlanCmd struct {
+}
+
+// BootstrapApplyServicePlanCmd is `bootstrap __apply-service-plan`.
+type BootstrapApplyServicePlanCmd struct {
+}
+
+// BootstrapApplyFirewallPlanCmd is `bootstrap __apply-firewall-plan`.
+type BootstrapApplyFirewallPlanCmd struct {
+}
+
+// BootstrapApplySystemPlanCmd is `bootstrap __apply-system-plan`.
+type BootstrapApplySystemPlanCmd struct {
+}
+
+// BootstrapInspectSystemFilesCmd is `bootstrap __inspect-system-files`.
+type BootstrapInspectSystemFilesCmd struct {
+}
+
+// BootstrapInspectFirewallPlanCmd is `bootstrap __inspect-firewall-plan`.
+type BootstrapInspectFirewallPlanCmd struct {
+}
+
+// BootstrapAccountsCmd is `bootstrap accounts`.
+type BootstrapAccountsCmd struct {
+ Apply *BootstrapAccountsApplyCmd // CmdBootstrapAccountsApply
+ Status *BootstrapAccountsStatusCmd // CmdBootstrapAccountsStatus
+}
+
+// BootstrapAccountsApplyCmd is `bootstrap accounts apply`.
+type BootstrapAccountsApplyCmd struct {
+ DryRun bool // FlagBootstrapAccountsApplyDryRun
+ Yes bool // FlagBootstrapAccountsApplyYes
+}
+
+// BootstrapAccountsStatusCmd is `bootstrap accounts status`.
+type BootstrapAccountsStatusCmd struct {
+ Json bool // FlagBootstrapAccountsStatusJson
+ Missing bool // FlagBootstrapAccountsStatusMissing
+}
+
+// BootstrapComposeCmd is `bootstrap compose`.
+type BootstrapComposeCmd struct {
+ Apply *BootstrapComposeApplyCmd // CmdBootstrapComposeApply
+ Status *BootstrapComposeStatusCmd // CmdBootstrapComposeStatus
+}
+
+// BootstrapComposeApplyCmd is `bootstrap compose apply`.
+type BootstrapComposeApplyCmd struct {
+ DryRun bool // FlagBootstrapComposeApplyDryRun
+ Yes bool // FlagBootstrapComposeApplyYes
+}
+
+// BootstrapComposeStatusCmd is `bootstrap compose status`.
+type BootstrapComposeStatusCmd struct {
+ Json bool // FlagBootstrapComposeStatusJson
+ Missing bool // FlagBootstrapComposeStatusMissing
+}
+
+// BootstrapDotfilesCmd is `bootstrap dotfiles`.
+type BootstrapDotfilesCmd struct {
+ Add *BootstrapDotfilesAddCmd // CmdBootstrapDotfilesAdd
+ Apply *BootstrapDotfilesApplyCmd // CmdBootstrapDotfilesApply
+ Edit *BootstrapDotfilesEditCmd // CmdBootstrapDotfilesEdit
+ Status *BootstrapDotfilesStatusCmd // CmdBootstrapDotfilesStatus
+ Unapply *BootstrapDotfilesUnapplyCmd // CmdBootstrapDotfilesUnapply
+}
+
+// BootstrapDotfilesAddCmd is `bootstrap dotfiles add`.
+type BootstrapDotfilesAddCmd struct {
+ Force bool // FlagBootstrapDotfilesAddForce
+ Global bool // FlagBootstrapDotfilesAddGlobal
+ Local bool // FlagBootstrapDotfilesAddLocal
+ Mode string // FlagBootstrapDotfilesAddMode
+ DryRun bool // FlagBootstrapDotfilesAddDryRun
+ NoApply bool // FlagBootstrapDotfilesAddNoApply
+ Path string // FlagBootstrapDotfilesAddPath
+ Source string // FlagBootstrapDotfilesAddSource
+ Yes bool // FlagBootstrapDotfilesAddYes
+ Target []string // ArgBootstrapDotfilesAddTarget
+}
+
+// BootstrapDotfilesApplyCmd is `bootstrap dotfiles apply`.
+type BootstrapDotfilesApplyCmd struct {
+ Force bool // FlagBootstrapDotfilesApplyForce
+ DryRun bool // FlagBootstrapDotfilesApplyDryRun
+ Yes bool // FlagBootstrapDotfilesApplyYes
+ Target []string // ArgBootstrapDotfilesApplyTarget
+}
+
+// BootstrapDotfilesEditCmd is `bootstrap dotfiles edit`.
+type BootstrapDotfilesEditCmd struct {
+ Apply bool // FlagBootstrapDotfilesEditApply
+ Mode string // FlagBootstrapDotfilesEditMode
+ Source string // FlagBootstrapDotfilesEditSource
+ Yes bool // FlagBootstrapDotfilesEditYes
+ Target string // ArgBootstrapDotfilesEditTarget
+}
+
+// BootstrapDotfilesStatusCmd is `bootstrap dotfiles status`.
+type BootstrapDotfilesStatusCmd struct {
+ Json bool // FlagBootstrapDotfilesStatusJson
+ Missing bool // FlagBootstrapDotfilesStatusMissing
+ Target []string // ArgBootstrapDotfilesStatusTarget
+}
+
+// BootstrapDotfilesUnapplyCmd is `bootstrap dotfiles unapply`.
+type BootstrapDotfilesUnapplyCmd struct {
+ Force bool // FlagBootstrapDotfilesUnapplyForce
+ DryRun bool // FlagBootstrapDotfilesUnapplyDryRun
+ Yes bool // FlagBootstrapDotfilesUnapplyYes
+ Target []string // ArgBootstrapDotfilesUnapplyTarget
+}
+
+// BootstrapFilesCmd is `bootstrap files`.
+type BootstrapFilesCmd struct {
+ Apply *BootstrapFilesApplyCmd // CmdBootstrapFilesApply
+ Status *BootstrapFilesStatusCmd // CmdBootstrapFilesStatus
+}
+
+// BootstrapFilesApplyCmd is `bootstrap files apply`.
+type BootstrapFilesApplyCmd struct {
+ DryRun bool // FlagBootstrapFilesApplyDryRun
+ Yes bool // FlagBootstrapFilesApplyYes
+ PromptSecrets bool // FlagBootstrapFilesApplyPromptSecrets
+}
+
+// BootstrapFilesStatusCmd is `bootstrap files status`.
+type BootstrapFilesStatusCmd struct {
+ Json bool // FlagBootstrapFilesStatusJson
+ Missing bool // FlagBootstrapFilesStatusMissing
+ PromptSecrets bool // FlagBootstrapFilesStatusPromptSecrets
+}
+
+// BootstrapFirewallCmd is `bootstrap firewall`.
+type BootstrapFirewallCmd struct {
+ Apply *BootstrapFirewallApplyCmd // CmdBootstrapFirewallApply
+ Status *BootstrapFirewallStatusCmd // CmdBootstrapFirewallStatus
+}
+
+// BootstrapFirewallApplyCmd is `bootstrap firewall apply`.
+type BootstrapFirewallApplyCmd struct {
+ DryRun bool // FlagBootstrapFirewallApplyDryRun
+ Yes bool // FlagBootstrapFirewallApplyYes
+}
+
+// BootstrapFirewallStatusCmd is `bootstrap firewall status`.
+type BootstrapFirewallStatusCmd struct {
+ Json bool // FlagBootstrapFirewallStatusJson
+ Missing bool // FlagBootstrapFirewallStatusMissing
+}
+
+// BootstrapLaunchdCmd is `bootstrap launchd`.
+type BootstrapLaunchdCmd struct {
+ Apply *BootstrapLaunchdApplyCmd // CmdBootstrapLaunchdApply
+ Status *BootstrapLaunchdStatusCmd // CmdBootstrapLaunchdStatus
+}
+
+// BootstrapLaunchdApplyCmd is `bootstrap launchd apply`.
+type BootstrapLaunchdApplyCmd struct {
+ DryRun bool // FlagBootstrapLaunchdApplyDryRun
+ Yes bool // FlagBootstrapLaunchdApplyYes
+}
+
+// BootstrapLaunchdStatusCmd is `bootstrap launchd status`.
+type BootstrapLaunchdStatusCmd struct {
+ Json bool // FlagBootstrapLaunchdStatusJson
+ Missing bool // FlagBootstrapLaunchdStatusMissing
+}
+
+// BootstrapLinuxCmd is `bootstrap linux`.
+type BootstrapLinuxCmd struct {
+ SystemdUnits *BootstrapLinuxSystemdUnitsCmd // CmdBootstrapLinuxSystemdUnits
+}
+
+// BootstrapLinuxSystemdUnitsCmd is `bootstrap linux systemd-units`.
+type BootstrapLinuxSystemdUnitsCmd struct {
+ Apply *BootstrapLinuxSystemdUnitsApplyCmd // CmdBootstrapLinuxSystemdUnitsApply
+ Status *BootstrapLinuxSystemdUnitsStatusCmd // CmdBootstrapLinuxSystemdUnitsStatus
+}
+
+// BootstrapLinuxSystemdUnitsApplyCmd is `bootstrap linux systemd-units apply`.
+type BootstrapLinuxSystemdUnitsApplyCmd struct {
+ DryRun bool // FlagBootstrapLinuxSystemdUnitsApplyDryRun
+ Yes bool // FlagBootstrapLinuxSystemdUnitsApplyYes
+}
+
+// BootstrapLinuxSystemdUnitsStatusCmd is `bootstrap linux systemd-units status`.
+type BootstrapLinuxSystemdUnitsStatusCmd struct {
+ Json bool // FlagBootstrapLinuxSystemdUnitsStatusJson
+ Missing bool // FlagBootstrapLinuxSystemdUnitsStatusMissing
+}
+
+// BootstrapMacosCmd is `bootstrap macos`.
+type BootstrapMacosCmd struct {
+ Defaults *BootstrapMacosDefaultsCmd // CmdBootstrapMacosDefaults
+ LaunchdAgents *BootstrapMacosLaunchdAgentsCmd // CmdBootstrapMacosLaunchdAgents
+}
+
+// BootstrapMacosDefaultsCmd is `bootstrap macos defaults`.
+type BootstrapMacosDefaultsCmd struct {
+ Apply *BootstrapMacosDefaultsApplyCmd // CmdBootstrapMacosDefaultsApply
+ Status *BootstrapMacosDefaultsStatusCmd // CmdBootstrapMacosDefaultsStatus
+}
+
+// BootstrapMacosDefaultsApplyCmd is `bootstrap macos defaults apply`.
+type BootstrapMacosDefaultsApplyCmd struct {
+ DryRun bool // FlagBootstrapMacosDefaultsApplyDryRun
+ Yes bool // FlagBootstrapMacosDefaultsApplyYes
+}
+
+// BootstrapMacosDefaultsStatusCmd is `bootstrap macos defaults status`.
+type BootstrapMacosDefaultsStatusCmd struct {
+ Json bool // FlagBootstrapMacosDefaultsStatusJson
+ Missing bool // FlagBootstrapMacosDefaultsStatusMissing
+}
+
+// BootstrapMacosLaunchdAgentsCmd is `bootstrap macos launchd-agents`.
+type BootstrapMacosLaunchdAgentsCmd struct {
+ Apply *BootstrapMacosLaunchdAgentsApplyCmd // CmdBootstrapMacosLaunchdAgentsApply
+ Status *BootstrapMacosLaunchdAgentsStatusCmd // CmdBootstrapMacosLaunchdAgentsStatus
+}
+
+// BootstrapMacosLaunchdAgentsApplyCmd is `bootstrap macos launchd-agents apply`.
+type BootstrapMacosLaunchdAgentsApplyCmd struct {
+ DryRun bool // FlagBootstrapMacosLaunchdAgentsApplyDryRun
+ Yes bool // FlagBootstrapMacosLaunchdAgentsApplyYes
+}
+
+// BootstrapMacosLaunchdAgentsStatusCmd is `bootstrap macos launchd-agents status`.
+type BootstrapMacosLaunchdAgentsStatusCmd struct {
+ Json bool // FlagBootstrapMacosLaunchdAgentsStatusJson
+ Missing bool // FlagBootstrapMacosLaunchdAgentsStatusMissing
+}
+
+// BootstrapMacosDefaults2Cmd is `bootstrap macos-defaults`.
+type BootstrapMacosDefaults2Cmd struct {
+ Apply *BootstrapMacosDefaultsApply2Cmd // CmdBootstrapMacosDefaultsApply2
+ Status *BootstrapMacosDefaultsStatus2Cmd // CmdBootstrapMacosDefaultsStatus2
+}
+
+// BootstrapMacosDefaultsApply2Cmd is `bootstrap macos-defaults apply`.
+type BootstrapMacosDefaultsApply2Cmd struct {
+ DryRun bool // FlagBootstrapMacosDefaultsApplyDryRun2
+ Yes bool // FlagBootstrapMacosDefaultsApplyYes2
+}
+
+// BootstrapMacosDefaultsStatus2Cmd is `bootstrap macos-defaults status`.
+type BootstrapMacosDefaultsStatus2Cmd struct {
+ Json bool // FlagBootstrapMacosDefaultsStatusJson2
+ Missing bool // FlagBootstrapMacosDefaultsStatusMissing2
+}
+
+// BootstrapMiseShellActivateCmd is `bootstrap mise-shell-activate`.
+type BootstrapMiseShellActivateCmd struct {
+ Apply *BootstrapMiseShellActivateApplyCmd // CmdBootstrapMiseShellActivateApply
+ Status *BootstrapMiseShellActivateStatusCmd // CmdBootstrapMiseShellActivateStatus
+}
+
+// BootstrapMiseShellActivateApplyCmd is `bootstrap mise-shell-activate apply`.
+type BootstrapMiseShellActivateApplyCmd struct {
+ DryRun bool // FlagBootstrapMiseShellActivateApplyDryRun
+ Yes bool // FlagBootstrapMiseShellActivateApplyYes
+}
+
+// BootstrapMiseShellActivateStatusCmd is `bootstrap mise-shell-activate status`.
+type BootstrapMiseShellActivateStatusCmd struct {
+ Json bool // FlagBootstrapMiseShellActivateStatusJson
+ Missing bool // FlagBootstrapMiseShellActivateStatusMissing
+}
+
+// BootstrapPackagesCmd is `bootstrap packages`.
+type BootstrapPackagesCmd struct {
+ Apply *BootstrapPackagesApplyCmd // CmdBootstrapPackagesApply
+ Brew *BootstrapPackagesBrewCmd // CmdBootstrapPackagesBrew
+ Import *BootstrapPackagesImportCmd // CmdBootstrapPackagesImport
+ Prune *BootstrapPackagesPruneCmd // CmdBootstrapPackagesPrune
+ Status *BootstrapPackagesStatusCmd // CmdBootstrapPackagesStatus
+ Upgrade *BootstrapPackagesUpgradeCmd // CmdBootstrapPackagesUpgrade
+ Use *BootstrapPackagesUseCmd // CmdBootstrapPackagesUse
+}
+
+// BootstrapPackagesApplyCmd is `bootstrap packages apply`.
+type BootstrapPackagesApplyCmd struct {
+ Manager string // FlagBootstrapPackagesApplyManager
+ DryRun bool // FlagBootstrapPackagesApplyDryRun
+ Yes bool // FlagBootstrapPackagesApplyYes
+ Update bool // FlagBootstrapPackagesApplyUpdate
+ Package []string // ArgBootstrapPackagesApplyPackage
+}
+
+// BootstrapPackagesBrewCmd is `bootstrap packages brew`.
+type BootstrapPackagesBrewCmd struct {
+ Tap *BootstrapPackagesBrewTapCmd // CmdBootstrapPackagesBrewTap
+ Untap *BootstrapPackagesBrewUntapCmd // CmdBootstrapPackagesBrewUntap
+}
+
+// BootstrapPackagesBrewTapCmd is `bootstrap packages brew tap`.
+type BootstrapPackagesBrewTapCmd struct {
+ Local bool // FlagBootstrapPackagesBrewTapLocal
+ DryRun bool // FlagBootstrapPackagesBrewTapDryRun
+ Path string // FlagBootstrapPackagesBrewTapPath
+ Tap string // ArgBootstrapPackagesBrewTapTap
+ Url string // ArgBootstrapPackagesBrewTapUrl
+}
+
+// BootstrapPackagesBrewUntapCmd is `bootstrap packages brew untap`.
+type BootstrapPackagesBrewUntapCmd struct {
+ Local bool // FlagBootstrapPackagesBrewUntapLocal
+ DryRun bool // FlagBootstrapPackagesBrewUntapDryRun
+ Path string // FlagBootstrapPackagesBrewUntapPath
+ Taps []string // ArgBootstrapPackagesBrewUntapTaps
+}
+
+// BootstrapPackagesImportCmd is `bootstrap packages import`.
+type BootstrapPackagesImportCmd struct {
+ Env string // FlagBootstrapPackagesImportEnv
+ Global bool // FlagBootstrapPackagesImportGlobal
+ Manager string // FlagBootstrapPackagesImportManager
+ All bool // FlagBootstrapPackagesImportAll
+ DryRun bool // FlagBootstrapPackagesImportDryRun
+ Path string // FlagBootstrapPackagesImportPath
+}
+
+// BootstrapPackagesPruneCmd is `bootstrap packages prune`.
+type BootstrapPackagesPruneCmd struct {
+ Manager string // FlagBootstrapPackagesPruneManager
+ DryRun bool // FlagBootstrapPackagesPruneDryRun
+ Yes bool // FlagBootstrapPackagesPruneYes
+}
+
+// BootstrapPackagesStatusCmd is `bootstrap packages status`.
+type BootstrapPackagesStatusCmd struct {
+ Json bool // FlagBootstrapPackagesStatusJson
+ Missing bool // FlagBootstrapPackagesStatusMissing
+}
+
+// BootstrapPackagesUpgradeCmd is `bootstrap packages upgrade`.
+type BootstrapPackagesUpgradeCmd struct {
+ Manager string // FlagBootstrapPackagesUpgradeManager
+ DryRun bool // FlagBootstrapPackagesUpgradeDryRun
+ Yes bool // FlagBootstrapPackagesUpgradeYes
+ Package []string // ArgBootstrapPackagesUpgradePackage
+}
+
+// BootstrapPackagesUseCmd is `bootstrap packages use`.
+type BootstrapPackagesUseCmd struct {
+ Env string // FlagBootstrapPackagesUseEnv
+ Global bool // FlagBootstrapPackagesUseGlobal
+ DryRun bool // FlagBootstrapPackagesUseDryRun
+ Path string // FlagBootstrapPackagesUsePath
+ Yes bool // FlagBootstrapPackagesUseYes
+ Package []string // ArgBootstrapPackagesUsePackage
+}
+
+// BootstrapPlanCmd is `bootstrap plan`.
+type BootstrapPlanCmd struct {
+ Json bool // FlagBootstrapPlanJson
+ DetailedExitcode bool // FlagBootstrapPlanDetailedExitcode
+ PromptSecrets bool // FlagBootstrapPlanPromptSecrets
+}
+
+// BootstrapPluginsCmd is `bootstrap plugins`.
+type BootstrapPluginsCmd struct {
+ Apply *BootstrapPluginsApplyCmd // CmdBootstrapPluginsApply
+ Status *BootstrapPluginsStatusCmd // CmdBootstrapPluginsStatus
+}
+
+// BootstrapPluginsApplyCmd is `bootstrap plugins apply`.
+type BootstrapPluginsApplyCmd struct {
+ DryRun bool // FlagBootstrapPluginsApplyDryRun
+}
+
+// BootstrapPluginsStatusCmd is `bootstrap plugins status`.
+type BootstrapPluginsStatusCmd struct {
+ Missing bool // FlagBootstrapPluginsStatusMissing
+}
+
+// BootstrapRemoteCmd is `bootstrap remote`.
+type BootstrapRemoteCmd struct {
+ All bool // FlagBootstrapRemoteAll
+ BootstrapCommand string // FlagBootstrapRemoteBootstrapCommand
+ ConnectTimeout string // FlagBootstrapRemoteConnectTimeout
+ CopyLink []string // FlagBootstrapRemoteCopyLink
+ CopyLinks bool // FlagBootstrapRemoteCopyLinks
+ Exclude []string // FlagBootstrapRemoteExclude
+ FailFast bool // FlagBootstrapRemoteFailFast
+ ForceDotfiles bool // FlagBootstrapRemoteForceDotfiles
+ Host []string // FlagBootstrapRemoteHost
+ IdentityFile string // FlagBootstrapRemoteIdentityFile
+ DryRun bool // FlagBootstrapRemoteDryRun
+ KeepStaging bool // FlagBootstrapRemoteKeepStaging
+ MiseBin string // FlagBootstrapRemoteMiseBin
+ Only []string // FlagBootstrapRemoteOnly
+ Port string // FlagBootstrapRemotePort
+ PromptSecrets bool // FlagBootstrapRemotePromptSecrets
+ RemoteEnv []string // FlagBootstrapRemoteRemoteEnv
+ RemoteMise string // FlagBootstrapRemoteRemoteMise
+ Skip []string // FlagBootstrapRemoteSkip
+ Source string // FlagBootstrapRemoteSource
+ SshOption []string // FlagBootstrapRemoteSshOption
+ Tag []string // FlagBootstrapRemoteTag
+ Update bool // FlagBootstrapRemoteUpdate
+ Yes bool // FlagBootstrapRemoteYes
+ Target []string // ArgBootstrapRemoteTarget
+}
+
+// BootstrapReposCmd is `bootstrap repos`.
+type BootstrapReposCmd struct {
+ Apply *BootstrapReposApplyCmd // CmdBootstrapReposApply
+ Exec *BootstrapReposExecCmd // CmdBootstrapReposExec
+ Status *BootstrapReposStatusCmd // CmdBootstrapReposStatus
+ Update *BootstrapReposUpdateCmd // CmdBootstrapReposUpdate
+}
+
+// BootstrapReposApplyCmd is `bootstrap repos apply`.
+type BootstrapReposApplyCmd struct {
+ DryRun bool // FlagBootstrapReposApplyDryRun
+ Yes bool // FlagBootstrapReposApplyYes
+}
+
+// BootstrapReposExecCmd is `bootstrap repos exec`.
+type BootstrapReposExecCmd struct {
+ ContinueOnError bool // FlagBootstrapReposExecContinueOnError
+ DryRun bool // FlagBootstrapReposExecDryRun
+ Path []string // ArgBootstrapReposExecPath
+ Command []string // ArgBootstrapReposExecCommand
+}
+
+// BootstrapReposStatusCmd is `bootstrap repos status`.
+type BootstrapReposStatusCmd struct {
+ Json bool // FlagBootstrapReposStatusJson
+ Missing bool // FlagBootstrapReposStatusMissing
+}
+
+// BootstrapReposUpdateCmd is `bootstrap repos update`.
+type BootstrapReposUpdateCmd struct {
+ DryRun bool // FlagBootstrapReposUpdateDryRun
+ Yes bool // FlagBootstrapReposUpdateYes
+ Path []string // ArgBootstrapReposUpdatePath
+}
+
+// BootstrapSecretsCmd is `bootstrap secrets`.
+type BootstrapSecretsCmd struct {
+ Status *BootstrapSecretsStatusCmd // CmdBootstrapSecretsStatus
+}
+
+// BootstrapSecretsStatusCmd is `bootstrap secrets status`.
+type BootstrapSecretsStatusCmd struct {
+ Json bool // FlagBootstrapSecretsStatusJson
+ Missing bool // FlagBootstrapSecretsStatusMissing
+}
+
+// BootstrapServicesCmd is `bootstrap services`.
+type BootstrapServicesCmd struct {
+ Apply *BootstrapServicesApplyCmd // CmdBootstrapServicesApply
+ Status *BootstrapServicesStatusCmd // CmdBootstrapServicesStatus
+}
+
+// BootstrapServicesApplyCmd is `bootstrap services apply`.
+type BootstrapServicesApplyCmd struct {
+ DryRun bool // FlagBootstrapServicesApplyDryRun
+ Yes bool // FlagBootstrapServicesApplyYes
+}
+
+// BootstrapServicesStatusCmd is `bootstrap services status`.
+type BootstrapServicesStatusCmd struct {
+ Json bool // FlagBootstrapServicesStatusJson
+ Missing bool // FlagBootstrapServicesStatusMissing
+}
+
+// BootstrapStatusCmd is `bootstrap status`.
+type BootstrapStatusCmd struct {
+ Json bool // FlagBootstrapStatusJson
+ Missing bool // FlagBootstrapStatusMissing
+ PromptSecrets bool // FlagBootstrapStatusPromptSecrets
+}
+
+// BootstrapSystemdCmd is `bootstrap systemd`.
+type BootstrapSystemdCmd struct {
+ Apply *BootstrapSystemdApplyCmd // CmdBootstrapSystemdApply
+ Status *BootstrapSystemdStatusCmd // CmdBootstrapSystemdStatus
+}
+
+// BootstrapSystemdApplyCmd is `bootstrap systemd apply`.
+type BootstrapSystemdApplyCmd struct {
+ DryRun bool // FlagBootstrapSystemdApplyDryRun
+ Yes bool // FlagBootstrapSystemdApplyYes
+}
+
+// BootstrapSystemdStatusCmd is `bootstrap systemd status`.
+type BootstrapSystemdStatusCmd struct {
+ Json bool // FlagBootstrapSystemdStatusJson
+ Missing bool // FlagBootstrapSystemdStatusMissing
+}
+
+// BootstrapUserCmd is `bootstrap user`.
+type BootstrapUserCmd struct {
+ Apply *BootstrapUserApplyCmd // CmdBootstrapUserApply
+ Status *BootstrapUserStatusCmd // CmdBootstrapUserStatus
+}
+
+// BootstrapUserApplyCmd is `bootstrap user apply`.
+type BootstrapUserApplyCmd struct {
+ DryRun bool // FlagBootstrapUserApplyDryRun
+ Yes bool // FlagBootstrapUserApplyYes
+}
+
+// BootstrapUserStatusCmd is `bootstrap user status`.
+type BootstrapUserStatusCmd struct {
+ Json bool // FlagBootstrapUserStatusJson
+ Missing bool // FlagBootstrapUserStatusMissing
+}
+
+// CacheCmd is `cache`.
+type CacheCmd struct {
+ Clear *CacheClearCmd // CmdCacheClear
+ Path *CachePathCmd // CmdCachePath
+ Prune *CachePruneCmd // CmdCachePrune
+ Task *CacheTaskCmd // CmdCacheTask
+}
+
+// CacheClearCmd is `cache clear`.
+type CacheClearCmd struct {
+ Outdate bool // FlagCacheClearOutdate
+ Task string // FlagCacheClearTask
+ Tool []string // ArgCacheClearTool
+}
+
+// CachePathCmd is `cache path`.
+type CachePathCmd struct {
+}
+
+// CachePruneCmd is `cache prune`.
+type CachePruneCmd struct {
+ Verbose int // FlagCachePruneVerbose
+ DryRun bool // FlagCachePruneDryRun
+ Tool []string // ArgCachePruneTool
+}
+
+// CacheTaskCmd is `cache task`.
+type CacheTaskCmd struct {
+ Json bool // FlagCacheTaskJson
+ Task string // ArgCacheTaskTask
+}
+
+// CompletionCmd is `completion`.
+type CompletionCmd struct {
+ Shell string // FlagCompletionShell
+ IncludeBashCompletionLib bool // FlagCompletionIncludeBashCompletionLib
+ Usage bool // FlagCompletionUsage
+ ShellArg string // ArgCompletionShell
+}
+
+// ConfigCmd is `config`.
+type ConfigCmd struct {
+ Json bool // FlagConfigJson
+ NoHeader bool // FlagConfigNoHeader
+ TrackedConfigs bool // FlagConfigTrackedConfigs
+ Get *ConfigGetCmd // CmdConfigGet
+ Ls *ConfigLsCmd // CmdConfigLs
+ Set *ConfigSetCmd // CmdConfigSet
+}
+
+// ConfigGetCmd is `config get`.
+type ConfigGetCmd struct {
+ File string // FlagConfigGetFile
+ Key string // ArgConfigGetKey
+}
+
+// ConfigLsCmd is `config ls`.
+type ConfigLsCmd struct {
+ Json bool // FlagConfigLsJson
+ NoHeader bool // FlagConfigLsNoHeader
+ TrackedConfigs bool // FlagConfigLsTrackedConfigs
+}
+
+// ConfigSetCmd is `config set`.
+type ConfigSetCmd struct {
+ File string // FlagConfigSetFile
+ Type string // FlagConfigSetType
+ Key string // ArgConfigSetKey
+ Value string // ArgConfigSetValue
+}
+
+// CurrentCmd is `current`.
+type CurrentCmd struct {
+ Plugin string // ArgCurrentPlugin
+}
+
+// DeactivateCmd is `deactivate`.
+type DeactivateCmd struct {
+}
+
+// DirenvCmd is `direnv`.
+type DirenvCmd struct {
+ Activate *DirenvActivateCmd // CmdDirenvActivate
+ Envrc *DirenvEnvrcCmd // CmdDirenvEnvrc
+ Exec *DirenvExecCmd // CmdDirenvExec
+}
+
+// DirenvActivateCmd is `direnv activate`.
+type DirenvActivateCmd struct {
+}
+
+// DirenvEnvrcCmd is `direnv envrc`.
+type DirenvEnvrcCmd struct {
+}
+
+// DirenvExecCmd is `direnv exec`.
+type DirenvExecCmd struct {
+}
+
+// DotfilesCmd is `dotfiles`.
+type DotfilesCmd struct {
+ Add *DotfilesAddCmd // CmdDotfilesAdd
+ Apply *DotfilesApplyCmd // CmdDotfilesApply
+ Edit *DotfilesEditCmd // CmdDotfilesEdit
+ Status *DotfilesStatusCmd // CmdDotfilesStatus
+ Unapply *DotfilesUnapplyCmd // CmdDotfilesUnapply
+}
+
+// DotfilesAddCmd is `dotfiles add`.
+type DotfilesAddCmd struct {
+ Force bool // FlagDotfilesAddForce
+ Global bool // FlagDotfilesAddGlobal
+ Local bool // FlagDotfilesAddLocal
+ Mode string // FlagDotfilesAddMode
+ DryRun bool // FlagDotfilesAddDryRun
+ NoApply bool // FlagDotfilesAddNoApply
+ Path string // FlagDotfilesAddPath
+ Source string // FlagDotfilesAddSource
+ Yes bool // FlagDotfilesAddYes
+ Target []string // ArgDotfilesAddTarget
+}
+
+// DotfilesApplyCmd is `dotfiles apply`.
+type DotfilesApplyCmd struct {
+ Force bool // FlagDotfilesApplyForce
+ DryRun bool // FlagDotfilesApplyDryRun
+ Yes bool // FlagDotfilesApplyYes
+ Target []string // ArgDotfilesApplyTarget
+}
+
+// DotfilesEditCmd is `dotfiles edit`.
+type DotfilesEditCmd struct {
+ Apply bool // FlagDotfilesEditApply
+ Mode string // FlagDotfilesEditMode
+ Source string // FlagDotfilesEditSource
+ Yes bool // FlagDotfilesEditYes
+ Target string // ArgDotfilesEditTarget
+}
+
+// DotfilesStatusCmd is `dotfiles status`.
+type DotfilesStatusCmd struct {
+ Json bool // FlagDotfilesStatusJson
+ Missing bool // FlagDotfilesStatusMissing
+ Target []string // ArgDotfilesStatusTarget
+}
+
+// DotfilesUnapplyCmd is `dotfiles unapply`.
+type DotfilesUnapplyCmd struct {
+ Force bool // FlagDotfilesUnapplyForce
+ DryRun bool // FlagDotfilesUnapplyDryRun
+ Yes bool // FlagDotfilesUnapplyYes
+ Target []string // ArgDotfilesUnapplyTarget
+}
+
+// DoctorCmd is `doctor`.
+type DoctorCmd struct {
+ Json bool // FlagDoctorJson
+ Path *DoctorPathCmd // CmdDoctorPath
+}
+
+// DoctorPathCmd is `doctor path`.
+type DoctorPathCmd struct {
+ Full bool // FlagDoctorPathFull
+}
+
+// EnCmd is `en`.
+type EnCmd struct {
+ Shell string // FlagEnShell
+ Dir string // ArgEnDir
+}
+
+// EnvCmd is `env`.
+type EnvCmd struct {
+ Dotenv bool // FlagEnvDotenv
+ Json bool // FlagEnvJson
+ Shell string // FlagEnvShell
+ JsonExtended bool // FlagEnvJsonExtended
+ Redacted bool // FlagEnvRedacted
+ Values bool // FlagEnvValues
+ ToolVersion []string // ArgEnvToolVersion
+}
+
+// ExecCmd is `exec`.
+type ExecCmd struct {
+ Command string // FlagExecCommand
+ Jobs string // FlagExecJobs
+ AllowEnv []string // FlagExecAllowEnv
+ AllowNet []string // FlagExecAllowNet
+ AllowRead []string // FlagExecAllowRead
+ AllowWrite []string // FlagExecAllowWrite
+ DenyAll bool // FlagExecDenyAll
+ DenyEnv bool // FlagExecDenyEnv
+ DenyNet bool // FlagExecDenyNet
+ DenyRead bool // FlagExecDenyRead
+ DenyWrite bool // FlagExecDenyWrite
+ FreshEnv bool // FlagExecFreshEnv
+ NoDeps bool // FlagExecNoDeps
+ Raw bool // FlagExecRaw
+ ToolVersion []string // ArgExecToolVersion
+ CommandArg []string // ArgExecCommand
+}
+
+// FmtCmd is `fmt`.
+type FmtCmd struct {
+ All bool // FlagFmtAll
+ Check bool // FlagFmtCheck
+ Stdin bool // FlagFmtStdin
+}
+
+// GenerateCmd is `generate`.
+type GenerateCmd struct {
+ Bootstrap *GenerateBootstrapCmd // CmdGenerateBootstrap
+ Config *GenerateConfigCmd // CmdGenerateConfig
+ Devcontainer *GenerateDevcontainerCmd // CmdGenerateDevcontainer
+ GitPreCommit *GenerateGitPreCommitCmd // CmdGenerateGitPreCommit
+ GithubAction *GenerateGithubActionCmd // CmdGenerateGithubAction
+ TaskDocs *GenerateTaskDocsCmd // CmdGenerateTaskDocs
+ TaskStubs *GenerateTaskStubsCmd // CmdGenerateTaskStubs
+ ToolStub *GenerateToolStubCmd // CmdGenerateToolStub
+}
+
+// GenerateBootstrapCmd is `generate bootstrap`.
+type GenerateBootstrapCmd struct {
+ Localize bool // FlagGenerateBootstrapLocalize
+ Version string // FlagGenerateBootstrapVersion
+ Write string // FlagGenerateBootstrapWrite
+ LocalizedDir string // FlagGenerateBootstrapLocalizedDir
+ Windows bool // FlagGenerateBootstrapWindows
+}
+
+// GenerateConfigCmd is `generate config`.
+type GenerateConfigCmd struct {
+ Global bool // FlagGenerateConfigGlobal
+ DryRun bool // FlagGenerateConfigDryRun
+ ToolVersions string // FlagGenerateConfigToolVersions
+ Path string // ArgGenerateConfigPath
+}
+
+// GenerateDevcontainerCmd is `generate devcontainer`.
+type GenerateDevcontainerCmd struct {
+ Image string // FlagGenerateDevcontainerImage
+ MountMiseData bool // FlagGenerateDevcontainerMountMiseData
+ Name string // FlagGenerateDevcontainerName
+ Write bool // FlagGenerateDevcontainerWrite
+}
+
+// GenerateGitPreCommitCmd is `generate git-pre-commit`.
+type GenerateGitPreCommitCmd struct {
+ Task string // FlagGenerateGitPreCommitTask
+ Write bool // FlagGenerateGitPreCommitWrite
+ Hook string // FlagGenerateGitPreCommitHook
+ MiseArg []string // ArgGenerateGitPreCommitMiseArg
+}
+
+// GenerateGithubActionCmd is `generate github-action`.
+type GenerateGithubActionCmd struct {
+ Task string // FlagGenerateGithubActionTask
+ Write bool // FlagGenerateGithubActionWrite
+ Name string // FlagGenerateGithubActionName
+}
+
+// GenerateTaskDocsCmd is `generate task-docs`.
+type GenerateTaskDocsCmd struct {
+ Inject bool // FlagGenerateTaskDocsInject
+ Index bool // FlagGenerateTaskDocsIndex
+ Multi bool // FlagGenerateTaskDocsMulti
+ Output string // FlagGenerateTaskDocsOutput
+ Root string // FlagGenerateTaskDocsRoot
+ Style string // FlagGenerateTaskDocsStyle
+}
+
+// GenerateTaskStubsCmd is `generate task-stubs`.
+type GenerateTaskStubsCmd struct {
+ Dir string // FlagGenerateTaskStubsDir
+ MiseBin string // FlagGenerateTaskStubsMiseBin
+}
+
+// GenerateToolStubCmd is `generate tool-stub`.
+type GenerateToolStubCmd struct {
+ Bin string // FlagGenerateToolStubBin
+ Bootstrap bool // FlagGenerateToolStubBootstrap
+ BootstrapVersion string // FlagGenerateToolStubBootstrapVersion
+ ChecksumAlgorithm string // FlagGenerateToolStubChecksumAlgorithm
+ Fetch bool // FlagGenerateToolStubFetch
+ Http string // FlagGenerateToolStubHttp
+ Lock bool // FlagGenerateToolStubLock
+ PlatformBin []string // FlagGenerateToolStubPlatformBin
+ PlatformUrl []string // FlagGenerateToolStubPlatformUrl
+ SkipDownload bool // FlagGenerateToolStubSkipDownload
+ Url string // FlagGenerateToolStubUrl
+ Version string // FlagGenerateToolStubVersion
+ Output string // ArgGenerateToolStubOutput
+}
+
+// GithubCmd is `github`.
+type GithubCmd struct {
+ Token *GithubTokenCmd // CmdGithubToken
+}
+
+// GithubTokenCmd is `github token`.
+type GithubTokenCmd struct {
+ Oauth bool // FlagGithubTokenOauth
+ Raw bool // FlagGithubTokenRaw
+ Refresh bool // FlagGithubTokenRefresh
+ Unmask bool // FlagGithubTokenUnmask
+ Host string // ArgGithubTokenHost
+}
+
+// GlobalCmd is `global`.
+type GlobalCmd struct {
+ Fuzzy bool // FlagGlobalFuzzy
+ Path bool // FlagGlobalPath
+ Pin bool // FlagGlobalPin
+ Remove []string // FlagGlobalRemove
+ ToolVersion []string // ArgGlobalToolVersion
+}
+
+// HookEnvCmd is `hook-env`.
+type HookEnvCmd struct {
+ Force bool // FlagHookEnvForce
+ Quiet bool // FlagHookEnvQuiet
+ Shell string // FlagHookEnvShell
+ Reason string // FlagHookEnvReason
+ Status bool // FlagHookEnvStatus
+}
+
+// HookNotFoundCmd is `hook-not-found`.
+type HookNotFoundCmd struct {
+ Shell string // FlagHookNotFoundShell
+ Bin string // ArgHookNotFoundBin
+}
+
+// ImplodeCmd is `implode`.
+type ImplodeCmd struct {
+ DryRun bool // FlagImplodeDryRun
+ Config bool // FlagImplodeConfig
+}
+
+// EditCmd is `edit`.
+type EditCmd struct {
+ Global bool // FlagEditGlobal
+ DryRun bool // FlagEditDryRun
+ ToolVersions string // FlagEditToolVersions
+ Path string // ArgEditPath
+}
+
+// InstallCmd is `install`.
+type InstallCmd struct {
+ Force bool // FlagInstallForce
+ Jobs string // FlagInstallJobs
+ DryRun bool // FlagInstallDryRun
+ Verbose int // FlagInstallVerbose
+ DryRunCode bool // FlagInstallDryRunCode
+ IncludeTaskTools bool // FlagInstallIncludeTaskTools
+ MinimumReleaseAge string // FlagInstallMinimumReleaseAge
+ Monorepo bool // FlagInstallMonorepo
+ Raw bool // FlagInstallRaw
+ Shared string // FlagInstallShared
+ System bool // FlagInstallSystem
+ ToolVersion []string // ArgInstallToolVersion
+}
+
+// InstallIntoCmd is `install-into`.
+type InstallIntoCmd struct {
+ ToolVersion string // ArgInstallIntoToolVersion
+ Path string // ArgInstallIntoPath
+}
+
+// LatestCmd is `latest`.
+type LatestCmd struct {
+ Installed bool // FlagLatestInstalled
+ MinimumReleaseAge string // FlagLatestMinimumReleaseAge
+ ToolVersion string // ArgLatestToolVersion
+ AsdfVersion string // ArgLatestAsdfVersion
+}
+
+// LinkCmd is `link`.
+type LinkCmd struct {
+ Force bool // FlagLinkForce
+ ToolVersion string // ArgLinkToolVersion
+ Path string // ArgLinkPath
+}
+
+// LocalCmd is `local`.
+type LocalCmd struct {
+ Parent bool // FlagLocalParent
+ Fuzzy bool // FlagLocalFuzzy
+ Path bool // FlagLocalPath
+ Pin bool // FlagLocalPin
+ Remove []string // FlagLocalRemove
+ ToolVersion []string // ArgLocalToolVersion
+}
+
+// LockCmd is `lock`.
+type LockCmd struct {
+ Global bool // FlagLockGlobal
+ Jobs string // FlagLockJobs
+ DryRun bool // FlagLockDryRun
+ Platform []string // FlagLockPlatform
+ Bump bool // FlagLockBump
+ Json bool // FlagLockJson
+ Local bool // FlagLockLocal
+ MinimumReleaseAge string // FlagLockMinimumReleaseAge
+ Tool []string // ArgLockTool
+}
+
+// LsCmd is `ls`.
+type LsCmd struct {
+ Current bool // FlagLsCurrent
+ Global bool // FlagLsGlobal
+ Installed bool // FlagLsInstalled
+ Json bool // FlagLsJson
+ Local bool // FlagLsLocal
+ Missing bool // FlagLsMissing
+ Offline bool // FlagLsOffline
+ Plugin string // FlagLsPlugin
+ AllSources bool // FlagLsAllSources
+ Monorepo bool // FlagLsMonorepo
+ NoHeader bool // FlagLsNoHeader
+ Outdated bool // FlagLsOutdated
+ Prefix string // FlagLsPrefix
+ Prunable bool // FlagLsPrunable
+ InstalledTool []string // ArgLsInstalledTool
+}
+
+// LsRemoteCmd is `ls-remote`.
+type LsRemoteCmd struct {
+ All bool // FlagLsRemoteAll
+ MinimumReleaseAge string // FlagLsRemoteMinimumReleaseAge
+ Json bool // FlagLsRemoteJson
+ NoVersionsHost bool // FlagLsRemoteNoVersionsHost
+ Prerelease bool // FlagLsRemotePrerelease
+ StrictMetadata bool // FlagLsRemoteStrictMetadata
+ ToolVersion string // ArgLsRemoteToolVersion
+ Prefix string // ArgLsRemotePrefix
+}
+
+// McpCmd is `mcp`.
+type McpCmd struct {
+}
+
+// OciCmd is `oci`.
+type OciCmd struct {
+ Build *OciBuildCmd // CmdOciBuild
+ Push *OciPushCmd // CmdOciPush
+ Run *OciRunCmd // CmdOciRun
+}
+
+// OciBuildCmd is `oci build`.
+type OciBuildCmd struct {
+ Copy []string // FlagOciBuildCopy
+ Output string // FlagOciBuildOutput
+ From string // FlagOciBuildFrom
+ IncludeGlobal bool // FlagOciBuildIncludeGlobal
+ Tag string // FlagOciBuildTag
+ MountPoint string // FlagOciBuildMountPoint
+ NoMise bool // FlagOciBuildNoMise
+ Owner string // FlagOciBuildOwner
+}
+
+// OciPushCmd is `oci push`.
+type OciPushCmd struct {
+ CacheFrom string // FlagOciPushCacheFrom
+ From string // FlagOciPushFrom
+ ImageDir string // FlagOciPushImageDir
+ IncludeGlobal bool // FlagOciPushIncludeGlobal
+ MountPoint string // FlagOciPushMountPoint
+ NoCache bool // FlagOciPushNoCache
+ NoMise bool // FlagOciPushNoMise
+ Owner string // FlagOciPushOwner
+ UpdateIndex bool // FlagOciPushUpdateIndex
+ Ref string // ArgOciPushRef
+}
+
+// OciRunCmd is `oci run`.
+type OciRunCmd struct {
+ Engine string // FlagOciRunEngine
+ From string // FlagOciRunFrom
+ ImageDir string // FlagOciRunImageDir
+ IncludeGlobal bool // FlagOciRunIncludeGlobal
+ Keep bool // FlagOciRunKeep
+ MountPoint string // FlagOciRunMountPoint
+ NoMise bool // FlagOciRunNoMise
+ Owner string // FlagOciRunOwner
+ Volume []string // FlagOciRunVolume
+ Env []string // FlagOciRunEnv
+ Interactive bool // FlagOciRunInteractive
+ Tty bool // FlagOciRunTty
+ Workdir string // FlagOciRunWorkdir
+ Cmd []string // ArgOciRunCmd
+}
+
+// OutdatedCmd is `outdated`.
+type OutdatedCmd struct {
+ Bump bool // FlagOutdatedBump
+ Json bool // FlagOutdatedJson
+ L bool // FlagOutdatedL
+ Inactive bool // FlagOutdatedInactive
+ Local bool // FlagOutdatedLocal
+ Monorepo bool // FlagOutdatedMonorepo
+ NoHeader bool // FlagOutdatedNoHeader
+ ToolVersion []string // ArgOutdatedToolVersion
+}
+
+// PatronsCmd is `patrons`.
+type PatronsCmd struct {
+ Json bool // FlagPatronsJson
+ Refresh bool // FlagPatronsRefresh
+}
+
+// PluginsCmd is `plugins`.
+type PluginsCmd struct {
+ All bool // FlagPluginsAll
+ Core bool // FlagPluginsCore
+ Urls bool // FlagPluginsUrls
+ Refs bool // FlagPluginsRefs
+ User bool // FlagPluginsUser
+ Install *PluginsInstallCmd // CmdPluginsInstall
+ Link *PluginsLinkCmd // CmdPluginsLink
+ Ls *PluginsLsCmd // CmdPluginsLs
+ LsRemote *PluginsLsRemoteCmd // CmdPluginsLsRemote
+ Uninstall *PluginsUninstallCmd // CmdPluginsUninstall
+ Update *PluginsUpdateCmd // CmdPluginsUpdate
+}
+
+// PluginsInstallCmd is `plugins install`.
+type PluginsInstallCmd struct {
+ All bool // FlagPluginsInstallAll
+ Force bool // FlagPluginsInstallForce
+ Jobs string // FlagPluginsInstallJobs
+ Verbose int // FlagPluginsInstallVerbose
+ NewPlugin string // ArgPluginsInstallNewPlugin
+ GitUrl string // ArgPluginsInstallGitUrl
+ Rest []string // ArgPluginsInstallRest
+}
+
+// PluginsLinkCmd is `plugins link`.
+type PluginsLinkCmd struct {
+ Force bool // FlagPluginsLinkForce
+ Name string // ArgPluginsLinkName
+ Dir string // ArgPluginsLinkDir
+}
+
+// PluginsLsCmd is `plugins ls`.
+type PluginsLsCmd struct {
+ All bool // FlagPluginsLsAll
+ Core bool // FlagPluginsLsCore
+ Outdated bool // FlagPluginsLsOutdated
+ Urls bool // FlagPluginsLsUrls
+ Refs bool // FlagPluginsLsRefs
+ User bool // FlagPluginsLsUser
+}
+
+// PluginsLsRemoteCmd is `plugins ls-remote`.
+type PluginsLsRemoteCmd struct {
+ Urls bool // FlagPluginsLsRemoteUrls
+ OnlyNames bool // FlagPluginsLsRemoteOnlyNames
+}
+
+// PluginsUninstallCmd is `plugins uninstall`.
+type PluginsUninstallCmd struct {
+ All bool // FlagPluginsUninstallAll
+ Purge bool // FlagPluginsUninstallPurge
+ Plugin []string // ArgPluginsUninstallPlugin
+}
+
+// PluginsUpdateCmd is `plugins update`.
+type PluginsUpdateCmd struct {
+ Jobs string // FlagPluginsUpdateJobs
+ Plugin []string // ArgPluginsUpdatePlugin
+}
+
+// DepsCmd is `deps`.
+type DepsCmd struct {
+ Explain bool // FlagDepsExplain
+ Force bool // FlagDepsForce
+ DryRun bool // FlagDepsDryRun
+ List bool // FlagDepsList
+ Monorepo bool // FlagDepsMonorepo
+ Only []string // FlagDepsOnly
+ Skip []string // FlagDepsSkip
+ Provider string // ArgDepsProvider
+ Add *DepsAddCmd // CmdDepsAdd
+ Install *DepsInstallCmd // CmdDepsInstall
+ Remove *DepsRemoveCmd // CmdDepsRemove
+}
+
+// DepsAddCmd is `deps add`.
+type DepsAddCmd struct {
+ Dev bool // FlagDepsAddDev
+ Packages []string // ArgDepsAddPackages
+}
+
+// DepsInstallCmd is `deps install`.
+type DepsInstallCmd struct {
+ Explain bool // FlagDepsInstallExplain
+ Force bool // FlagDepsInstallForce
+ DryRun bool // FlagDepsInstallDryRun
+ List bool // FlagDepsInstallList
+ Monorepo bool // FlagDepsInstallMonorepo
+ Only []string // FlagDepsInstallOnly
+ Skip []string // FlagDepsInstallSkip
+ Provider string // ArgDepsInstallProvider
+}
+
+// DepsRemoveCmd is `deps remove`.
+type DepsRemoveCmd struct {
+ Packages []string // ArgDepsRemovePackages
+}
+
+// PruneCmd is `prune`.
+type PruneCmd struct {
+ DryRun bool // FlagPruneDryRun
+ Configs bool // FlagPruneConfigs
+ DryRunCode bool // FlagPruneDryRunCode
+ Monorepo bool // FlagPruneMonorepo
+ Tools bool // FlagPruneTools
+ InstalledTool []string // ArgPruneInstalledTool
+}
+
+// RegistryCmd is `registry`.
+type RegistryCmd struct {
+ Backend string // FlagRegistryBackend
+ Complete bool // FlagRegistryComplete
+ HideAliased bool // FlagRegistryHideAliased
+ Json bool // FlagRegistryJson
+ Security bool // FlagRegistrySecurity
+ Name string // ArgRegistryName
+}
+
+// RenderHelpCmd is `render-help`.
+type RenderHelpCmd struct {
+}
+
+// ReshimCmd is `reshim`.
+type ReshimCmd struct {
+ Force bool // FlagReshimForce
+ Tool string // ArgReshimTool
+ Version string // ArgReshimVersion
+}
+
+// RunCmd is `run`.
+type RunCmd struct {
+ Affected bool // FlagRunAffected
+ AffectedBase string // FlagRunAffectedBase
+ AffectedExplain bool // FlagRunAffectedExplain
+ AffectedHead string // FlagRunAffectedHead
+ AffectedJson bool // FlagRunAffectedJson
+ All bool // FlagRunAll
+ ContinueOnError bool // FlagRunContinueOnError
+ Cd string // FlagRunCd
+ Force bool // FlagRunForce
+ Jobs string // FlagRunJobs
+ DryRun bool // FlagRunDryRun
+ Output string // FlagRunOutput
+ Quiet bool // FlagRunQuiet
+ Raw bool // FlagRunRaw
+ Shell string // FlagRunShell
+ Silent bool // FlagRunSilent
+ Tool []string // FlagRunTool
+ AllowEnv []string // FlagRunAllowEnv
+ AllowNet []string // FlagRunAllowNet
+ AllowRead []string // FlagRunAllowRead
+ AllowWrite []string // FlagRunAllowWrite
+ DenyAll bool // FlagRunDenyAll
+ DenyEnv bool // FlagRunDenyEnv
+ DenyNet bool // FlagRunDenyNet
+ DenyRead bool // FlagRunDenyRead
+ DenyWrite bool // FlagRunDenyWrite
+ FreshEnv bool // FlagRunFreshEnv
+ NoCache bool // FlagRunNoCache
+ NoDeps bool // FlagRunNoDeps
+ NoTimings bool // FlagRunNoTimings
+ SkipDeps bool // FlagRunSkipDeps
+ SkipTools bool // FlagRunSkipTools
+ TaskCache string // FlagRunTaskCache
+ TaskCacheExplain bool // FlagRunTaskCacheExplain
+ TaskCacheExplainJson bool // FlagRunTaskCacheExplainJson
+ TaskCacheStats bool // FlagRunTaskCacheStats
+ Timeout string // FlagRunTimeout
+ Timings bool // FlagRunTimings
+}
+
+// SearchCmd is `search`.
+type SearchCmd struct {
+ Interactive bool // FlagSearchInteractive
+ MatchType string // FlagSearchMatchType
+ NoHeader bool // FlagSearchNoHeader
+ Name string // ArgSearchName
+}
+
+// SelfUpdateCmd is `self-update`.
+type SelfUpdateCmd struct {
+ Force bool // FlagSelfUpdateForce
+ Yes bool // FlagSelfUpdateYes
+ NoPlugins bool // FlagSelfUpdateNoPlugins
+ Version string // ArgSelfUpdateVersion
+}
+
+// SetCmd is `set`.
+type SetCmd struct {
+ Env string // FlagSetEnv
+ Global bool // FlagSetGlobal
+ AgeEncrypt bool // FlagSetAgeEncrypt
+ AgeKeyFile string // FlagSetAgeKeyFile
+ AgeRecipient []string // FlagSetAgeRecipient
+ AgeSshRecipient []string // FlagSetAgeSshRecipient
+ Complete bool // FlagSetComplete
+ File string // FlagSetFile
+ NoRedact bool // FlagSetNoRedact
+ Prompt bool // FlagSetPrompt
+ Remove []string // FlagSetRemove
+ Stdin bool // FlagSetStdin
+ EnvVar []string // ArgSetEnvVar
+}
+
+// SettingsCmd is `settings`.
+type SettingsCmd struct {
+ All bool // FlagSettingsAll
+ Json bool // FlagSettingsJson
+ Local bool // FlagSettingsLocal
+ Toml bool // FlagSettingsToml
+ Complete bool // FlagSettingsComplete
+ JsonExtended bool // FlagSettingsJsonExtended
+ Setting string // ArgSettingsSetting
+ Value string // ArgSettingsValue
+ Add *SettingsAddCmd // CmdSettingsAdd
+ Get *SettingsGetCmd // CmdSettingsGet
+ Ls *SettingsLsCmd // CmdSettingsLs
+ Set *SettingsSetCmd // CmdSettingsSet
+ Unset *SettingsUnsetCmd // CmdSettingsUnset
+}
+
+// SettingsAddCmd is `settings add`.
+type SettingsAddCmd struct {
+ Local bool // FlagSettingsAddLocal
+ Setting string // ArgSettingsAddSetting
+ Value string // ArgSettingsAddValue
+}
+
+// SettingsGetCmd is `settings get`.
+type SettingsGetCmd struct {
+ Local bool // FlagSettingsGetLocal
+ Setting string // ArgSettingsGetSetting
+}
+
+// SettingsLsCmd is `settings ls`.
+type SettingsLsCmd struct {
+ All bool // FlagSettingsLsAll
+ Json bool // FlagSettingsLsJson
+ Local bool // FlagSettingsLsLocal
+ Toml bool // FlagSettingsLsToml
+ Complete bool // FlagSettingsLsComplete
+ JsonExtended bool // FlagSettingsLsJsonExtended
+ Setting string // ArgSettingsLsSetting
+}
+
+// SettingsSetCmd is `settings set`.
+type SettingsSetCmd struct {
+ Local bool // FlagSettingsSetLocal
+ Setting string // ArgSettingsSetSetting
+ Value string // ArgSettingsSetValue
+}
+
+// SettingsUnsetCmd is `settings unset`.
+type SettingsUnsetCmd struct {
+ Local bool // FlagSettingsUnsetLocal
+ Key string // ArgSettingsUnsetKey
+}
+
+// ShellCmd is `shell`.
+type ShellCmd struct {
+ Jobs string // FlagShellJobs
+ Unset bool // FlagShellUnset
+ Raw bool // FlagShellRaw
+ ToolVersion []string // ArgShellToolVersion
+}
+
+// ShellAliasCmd is `shell-alias`.
+type ShellAliasCmd struct {
+ NoHeader bool // FlagShellAliasNoHeader
+ Get *ShellAliasGetCmd // CmdShellAliasGet
+ Ls *ShellAliasLsCmd // CmdShellAliasLs
+ Set *ShellAliasSetCmd // CmdShellAliasSet
+ Unset *ShellAliasUnsetCmd // CmdShellAliasUnset
+}
+
+// ShellAliasGetCmd is `shell-alias get`.
+type ShellAliasGetCmd struct {
+ ShellAlias string // ArgShellAliasGetShellAlias
+}
+
+// ShellAliasLsCmd is `shell-alias ls`.
+type ShellAliasLsCmd struct {
+ NoHeader bool // FlagShellAliasLsNoHeader
+}
+
+// ShellAliasSetCmd is `shell-alias set`.
+type ShellAliasSetCmd struct {
+ ShellAlias string // ArgShellAliasSetShellAlias
+ Command string // ArgShellAliasSetCommand
+}
+
+// ShellAliasUnsetCmd is `shell-alias unset`.
+type ShellAliasUnsetCmd struct {
+ ShellAlias string // ArgShellAliasUnsetShellAlias
+}
+
+// SponsorsCmd is `sponsors`.
+type SponsorsCmd struct {
+}
+
+// SyncCmd is `sync`.
+type SyncCmd struct {
+ Node *SyncNodeCmd // CmdSyncNode
+ Python *SyncPythonCmd // CmdSyncPython
+ Ruby *SyncRubyCmd // CmdSyncRuby
+}
+
+// SyncNodeCmd is `sync node`.
+type SyncNodeCmd struct {
+ Brew bool // FlagSyncNodeBrew
+ Nodenv bool // FlagSyncNodeNodenv
+ Nvm bool // FlagSyncNodeNvm
+}
+
+// SyncPythonCmd is `sync python`.
+type SyncPythonCmd struct {
+ Pyenv bool // FlagSyncPythonPyenv
+ Uv bool // FlagSyncPythonUv
+}
+
+// SyncRubyCmd is `sync ruby`.
+type SyncRubyCmd struct {
+ Brew bool // FlagSyncRubyBrew
+}
+
+// TasksCmd is `tasks`.
+type TasksCmd struct {
+ Global bool // FlagTasksGlobal
+ Json bool // FlagTasksJson
+ Local bool // FlagTasksLocal
+ Extended bool // FlagTasksExtended
+ All bool // FlagTasksAll
+ Complete bool // FlagTasksComplete
+ Hidden bool // FlagTasksHidden
+ NameOnly bool // FlagTasksNameOnly
+ NoHeader bool // FlagTasksNoHeader
+ Sort string // FlagTasksSort
+ SortOrder string // FlagTasksSortOrder
+ Usage bool // FlagTasksUsage
+ Task string // ArgTasksTask
+ Add *TasksAddCmd // CmdTasksAdd
+ Deps *TasksDepsCmd // CmdTasksDeps
+ Edit *TasksEditCmd // CmdTasksEdit
+ Graph *TasksGraphCmd // CmdTasksGraph
+ Info *TasksInfoCmd // CmdTasksInfo
+ Ls *TasksLsCmd // CmdTasksLs
+ Run *TasksRunCmd // CmdTasksRun
+ Validate *TasksValidateCmd // CmdTasksValidate
+}
+
+// TasksAddCmd is `tasks add`.
+type TasksAddCmd struct {
+ Alias []string // FlagTasksAddAlias
+ Depends []string // FlagTasksAddDepends
+ Dir string // FlagTasksAddDir
+ File bool // FlagTasksAddFile
+ Hide bool // FlagTasksAddHide
+ Quiet bool // FlagTasksAddQuiet
+ Raw bool // FlagTasksAddRaw
+ Sources []string // FlagTasksAddSources
+ WaitFor []string // FlagTasksAddWaitFor
+ DependsPost []string // FlagTasksAddDependsPost
+ Description string // FlagTasksAddDescription
+ Outputs []string // FlagTasksAddOutputs
+ RunWindows string // FlagTasksAddRunWindows
+ Shell string // FlagTasksAddShell
+ Silent bool // FlagTasksAddSilent
+ Task string // ArgTasksAddTask
+ Run []string // ArgTasksAddRun
+}
+
+// TasksDepsCmd is `tasks deps`.
+type TasksDepsCmd struct {
+ Compact bool // FlagTasksDepsCompact
+ Dot bool // FlagTasksDepsDot
+ Hidden bool // FlagTasksDepsHidden
+ Tasks []string // ArgTasksDepsTasks
+}
+
+// TasksEditCmd is `tasks edit`.
+type TasksEditCmd struct {
+ Path bool // FlagTasksEditPath
+ Task string // ArgTasksEditTask
+}
+
+// TasksGraphCmd is `tasks graph`.
+type TasksGraphCmd struct {
+ Json bool // FlagTasksGraphJson
+ Explain bool // FlagTasksGraphExplain
+ NoHeader bool // FlagTasksGraphNoHeader
+}
+
+// TasksInfoCmd is `tasks info`.
+type TasksInfoCmd struct {
+ Json bool // FlagTasksInfoJson
+ Task string // ArgTasksInfoTask
+}
+
+// TasksLsCmd is `tasks ls`.
+type TasksLsCmd struct {
+ Global bool // FlagTasksLsGlobal
+ Json bool // FlagTasksLsJson
+ Local bool // FlagTasksLsLocal
+ Extended bool // FlagTasksLsExtended
+ All bool // FlagTasksLsAll
+ Complete bool // FlagTasksLsComplete
+ Hidden bool // FlagTasksLsHidden
+ NameOnly bool // FlagTasksLsNameOnly
+ NoHeader bool // FlagTasksLsNoHeader
+ Sort string // FlagTasksLsSort
+ SortOrder string // FlagTasksLsSortOrder
+ Usage bool // FlagTasksLsUsage
+}
+
+// TasksRunCmd is `tasks run`.
+type TasksRunCmd struct {
+ Affected bool // FlagTasksRunAffected
+ AffectedBase string // FlagTasksRunAffectedBase
+ AffectedExplain bool // FlagTasksRunAffectedExplain
+ AffectedHead string // FlagTasksRunAffectedHead
+ AffectedJson bool // FlagTasksRunAffectedJson
+ All bool // FlagTasksRunAll
+ ContinueOnError bool // FlagTasksRunContinueOnError
+ Cd string // FlagTasksRunCd
+ Force bool // FlagTasksRunForce
+ Jobs string // FlagTasksRunJobs
+ DryRun bool // FlagTasksRunDryRun
+ Output string // FlagTasksRunOutput
+ Quiet bool // FlagTasksRunQuiet
+ Raw bool // FlagTasksRunRaw
+ Shell string // FlagTasksRunShell
+ Silent bool // FlagTasksRunSilent
+ Tool []string // FlagTasksRunTool
+ AllowEnv []string // FlagTasksRunAllowEnv
+ AllowNet []string // FlagTasksRunAllowNet
+ AllowRead []string // FlagTasksRunAllowRead
+ AllowWrite []string // FlagTasksRunAllowWrite
+ DenyAll bool // FlagTasksRunDenyAll
+ DenyEnv bool // FlagTasksRunDenyEnv
+ DenyNet bool // FlagTasksRunDenyNet
+ DenyRead bool // FlagTasksRunDenyRead
+ DenyWrite bool // FlagTasksRunDenyWrite
+ FreshEnv bool // FlagTasksRunFreshEnv
+ NoCache bool // FlagTasksRunNoCache
+ NoDeps bool // FlagTasksRunNoDeps
+ NoTimings bool // FlagTasksRunNoTimings
+ SkipDeps bool // FlagTasksRunSkipDeps
+ SkipTools bool // FlagTasksRunSkipTools
+ TaskCache string // FlagTasksRunTaskCache
+ TaskCacheExplain bool // FlagTasksRunTaskCacheExplain
+ TaskCacheExplainJson bool // FlagTasksRunTaskCacheExplainJson
+ TaskCacheStats bool // FlagTasksRunTaskCacheStats
+ Timeout string // FlagTasksRunTimeout
+ Timings bool // FlagTasksRunTimings
+ Task string // ArgTasksRunTask
+ Args []string // ArgTasksRunArgs
+ ArgsLast []string // ArgTasksRunArgsLast
+}
+
+// TasksValidateCmd is `tasks validate`.
+type TasksValidateCmd struct {
+ ErrorsOnly bool // FlagTasksValidateErrorsOnly
+ Json bool // FlagTasksValidateJson
+ Tasks []string // ArgTasksValidateTasks
+}
+
+// TestToolCmd is `test-tool`.
+type TestToolCmd struct {
+ All bool // FlagTestToolAll
+ Jobs string // FlagTestToolJobs
+ AllConfig bool // FlagTestToolAllConfig
+ IncludeNonDefined bool // FlagTestToolIncludeNonDefined
+ Raw bool // FlagTestToolRaw
+ Tools []string // ArgTestToolTools
+}
+
+// TokenCmd is `token`.
+type TokenCmd struct {
+ Forgejo *TokenForgejoCmd // CmdTokenForgejo
+ Github *TokenGithubCmd // CmdTokenGithub
+ Gitlab *TokenGitlabCmd // CmdTokenGitlab
+}
+
+// TokenForgejoCmd is `token forgejo`.
+type TokenForgejoCmd struct {
+ Unmask bool // FlagTokenForgejoUnmask
+ Host string // ArgTokenForgejoHost
+}
+
+// TokenGithubCmd is `token github`.
+type TokenGithubCmd struct {
+ Oauth bool // FlagTokenGithubOauth
+ Raw bool // FlagTokenGithubRaw
+ Refresh bool // FlagTokenGithubRefresh
+ Unmask bool // FlagTokenGithubUnmask
+ Host string // ArgTokenGithubHost
+}
+
+// TokenGitlabCmd is `token gitlab`.
+type TokenGitlabCmd struct {
+ Unmask bool // FlagTokenGitlabUnmask
+ Host string // ArgTokenGitlabHost
+}
+
+// ToolCmd is `tool`.
+type ToolCmd struct {
+ Json bool // FlagToolJson
+ Active bool // FlagToolActive
+ Backend bool // FlagToolBackend
+ ConfigSource bool // FlagToolConfigSource
+ Description bool // FlagToolDescription
+ Installed bool // FlagToolInstalled
+ Requested bool // FlagToolRequested
+ ToolOptions bool // FlagToolToolOptions
+ Tool string // ArgToolTool
+}
+
+// ToolStubCmd is `tool-stub`.
+type ToolStubCmd struct {
+ File string // ArgToolStubFile
+ Args []string // ArgToolStubArgs
+}
+
+// TrustCmd is `trust`.
+type TrustCmd struct {
+ All bool // FlagTrustAll
+ Ignore bool // FlagTrustIgnore
+ Show bool // FlagTrustShow
+ Untrust bool // FlagTrustUntrust
+ ConfigFile string // ArgTrustConfigFile
+}
+
+// UninstallCmd is `uninstall`.
+type UninstallCmd struct {
+ All bool // FlagUninstallAll
+ DryRun bool // FlagUninstallDryRun
+ DryRunCode bool // FlagUninstallDryRunCode
+ InstalledToolVersion []string // ArgUninstallInstalledToolVersion
+}
+
+// UnsetCmd is `unset`.
+type UnsetCmd struct {
+ File string // FlagUnsetFile
+ Global bool // FlagUnsetGlobal
+ EnvKey []string // ArgUnsetEnvKey
+}
+
+// UntrustCmd is `untrust`.
+type UntrustCmd struct {
+ ConfigFile string // ArgUntrustConfigFile
+}
+
+// UnuseCmd is `unuse`.
+type UnuseCmd struct {
+ Env string // FlagUnuseEnv
+ Global bool // FlagUnuseGlobal
+ Path string // FlagUnusePath
+ NoPrune bool // FlagUnuseNoPrune
+ InstalledToolVersion []string // ArgUnuseInstalledToolVersion
+}
+
+// UpgradeCmd is `upgrade`.
+type UpgradeCmd struct {
+ Bump bool // FlagUpgradeBump
+ Interactive bool // FlagUpgradeInteractive
+ Jobs string // FlagUpgradeJobs
+ L bool // FlagUpgradeL
+ DryRun bool // FlagUpgradeDryRun
+ Exclude []string // FlagUpgradeExclude
+ DryRunCode bool // FlagUpgradeDryRunCode
+ Inactive bool // FlagUpgradeInactive
+ Local bool // FlagUpgradeLocal
+ MinimumReleaseAge string // FlagUpgradeMinimumReleaseAge
+ Monorepo bool // FlagUpgradeMonorepo
+ NoPrune bool // FlagUpgradeNoPrune
+ Prune bool // FlagUpgradePrune
+ Raw bool // FlagUpgradeRaw
+ InstalledToolVersion []string // ArgUpgradeInstalledToolVersion
+}
+
+// UsageCmd is `usage`.
+type UsageCmd struct {
+}
+
+// UseCmd is `use`.
+type UseCmd struct {
+ Env string // FlagUseEnv
+ Force bool // FlagUseForce
+ Global bool // FlagUseGlobal
+ Jobs string // FlagUseJobs
+ DryRun bool // FlagUseDryRun
+ Path string // FlagUsePath
+ DryRunCode bool // FlagUseDryRunCode
+ Fuzzy bool // FlagUseFuzzy
+ MinimumReleaseAge string // FlagUseMinimumReleaseAge
+ Pin bool // FlagUsePin
+ Raw bool // FlagUseRaw
+ Remove []string // FlagUseRemove
+ ToolVersion []string // ArgUseToolVersion
+}
+
+// VersionCmd is `version`.
+type VersionCmd struct {
+ Json bool // FlagVersionJson
+}
+
+// WatchCmd is `watch`.
+type WatchCmd struct {
+ TaskFlag []string // FlagWatchTaskFlag
+ Glob []string // FlagWatchGlob
+ SkipDeps bool // FlagWatchSkipDeps
+ Watch []string // FlagWatchWatch
+ WatchNonRecursive []string // FlagWatchWatchNonRecursive
+ WatchFile string // FlagWatchWatchFile
+ Clear string // FlagWatchClear
+ OnBusyUpdate string // FlagWatchOnBusyUpdate
+ Restart bool // FlagWatchRestart
+ Signal string // FlagWatchSignal
+ StopSignal string // FlagWatchStopSignal
+ StopTimeout string // FlagWatchStopTimeout
+ MapSignal []string // FlagWatchMapSignal
+ Debounce string // FlagWatchDebounce
+ StdinQuit bool // FlagWatchStdinQuit
+ NoVcsIgnore bool // FlagWatchNoVcsIgnore
+ NoProjectIgnore bool // FlagWatchNoProjectIgnore
+ NoGlobalIgnore bool // FlagWatchNoGlobalIgnore
+ NoDefaultIgnore bool // FlagWatchNoDefaultIgnore
+ NoDiscoverIgnore bool // FlagWatchNoDiscoverIgnore
+ IgnoreNothing bool // FlagWatchIgnoreNothing
+ Postpone bool // FlagWatchPostpone
+ DelayRun string // FlagWatchDelayRun
+ Poll string // FlagWatchPoll
+ Shell string // FlagWatchShell
+ N bool // FlagWatchN
+ EmitEventsTo string // FlagWatchEmitEventsTo
+ OnlyEmitEvents bool // FlagWatchOnlyEmitEvents
+ Env []string // FlagWatchEnv
+ WrapProcess string // FlagWatchWrapProcess
+ Notify bool // FlagWatchNotify
+ Color string // FlagWatchColor
+ Timings bool // FlagWatchTimings
+ Quiet bool // FlagWatchQuiet
+ Bell bool // FlagWatchBell
+ ProjectOrigin string // FlagWatchProjectOrigin
+ Workdir string // FlagWatchWorkdir
+ Exts []string // FlagWatchExts
+ Filter []string // FlagWatchFilter
+ FilterFile []string // FlagWatchFilterFile
+ FilterProg []string // FlagWatchFilterProg
+ Ignore []string // FlagWatchIgnore
+ IgnoreFile []string // FlagWatchIgnoreFile
+ FsEvents []string // FlagWatchFsEvents
+ NoMeta bool // FlagWatchNoMeta
+ PrintEvents bool // FlagWatchPrintEvents
+ Manual bool // FlagWatchManual
+ Task string // ArgWatchTask
+ Args []string // ArgWatchArgs
+}
+
+// WhereCmd is `where`.
+type WhereCmd struct {
+ ToolVersion string // ArgWhereToolVersion
+ AsdfVersion string // ArgWhereAsdfVersion
+}
+
+// WhichCmd is `which`.
+type WhichCmd struct {
+ Tool string // FlagWhichTool
+ Complete bool // FlagWhichComplete
+ Plugin bool // FlagWhichPlugin
+ Version bool // FlagWhichVersion
+ BinName string // ArgWhichBinName
+}
+
+// Parse binds a command line and fills the structs above.
+//
+// The rules decided once the last token has been read run here too, so a
+// missing required flag or a value outside its choices comes back rather than
+// reaching your code. A returned error is an *argv.Error; render it with
+// argv.Render.
+//
+// Help and version arrive as errors, because a parse that stops to print a page
+// has produced no value. Check the code before treating one as a failure.
+func Parse(args []string) (*Cli, error) {
+ out := &Cli{}
+ var cmdActivateV *ActivateCmd
+ var cmdToolAliasV *ToolAliasCmd
+ var cmdToolAliasGetV *ToolAliasGetCmd
+ var cmdToolAliasLsV *ToolAliasLsCmd
+ var cmdToolAliasSetV *ToolAliasSetCmd
+ var cmdToolAliasUnsetV *ToolAliasUnsetCmd
+ var cmdAsdfV *AsdfCmd
+ var cmdBackendsV *BackendsCmd
+ var cmdBackendsLsV *BackendsLsCmd
+ var cmdBinPathsV *BinPathsCmd
+ var cmdBootstrapV *BootstrapCmd
+ var cmdBootstrapApplyAccountPlanV *BootstrapApplyAccountPlanCmd
+ var cmdBootstrapApplyServicePlanV *BootstrapApplyServicePlanCmd
+ var cmdBootstrapApplyFirewallPlanV *BootstrapApplyFirewallPlanCmd
+ var cmdBootstrapApplySystemPlanV *BootstrapApplySystemPlanCmd
+ var cmdBootstrapInspectSystemFilesV *BootstrapInspectSystemFilesCmd
+ var cmdBootstrapInspectFirewallPlanV *BootstrapInspectFirewallPlanCmd
+ var cmdBootstrapAccountsV *BootstrapAccountsCmd
+ var cmdBootstrapAccountsApplyV *BootstrapAccountsApplyCmd
+ var cmdBootstrapAccountsStatusV *BootstrapAccountsStatusCmd
+ var cmdBootstrapComposeV *BootstrapComposeCmd
+ var cmdBootstrapComposeApplyV *BootstrapComposeApplyCmd
+ var cmdBootstrapComposeStatusV *BootstrapComposeStatusCmd
+ var cmdBootstrapDotfilesV *BootstrapDotfilesCmd
+ var cmdBootstrapDotfilesAddV *BootstrapDotfilesAddCmd
+ var cmdBootstrapDotfilesApplyV *BootstrapDotfilesApplyCmd
+ var cmdBootstrapDotfilesEditV *BootstrapDotfilesEditCmd
+ var cmdBootstrapDotfilesStatusV *BootstrapDotfilesStatusCmd
+ var cmdBootstrapDotfilesUnapplyV *BootstrapDotfilesUnapplyCmd
+ var cmdBootstrapFilesV *BootstrapFilesCmd
+ var cmdBootstrapFilesApplyV *BootstrapFilesApplyCmd
+ var cmdBootstrapFilesStatusV *BootstrapFilesStatusCmd
+ var cmdBootstrapFirewallV *BootstrapFirewallCmd
+ var cmdBootstrapFirewallApplyV *BootstrapFirewallApplyCmd
+ var cmdBootstrapFirewallStatusV *BootstrapFirewallStatusCmd
+ var cmdBootstrapLaunchdV *BootstrapLaunchdCmd
+ var cmdBootstrapLaunchdApplyV *BootstrapLaunchdApplyCmd
+ var cmdBootstrapLaunchdStatusV *BootstrapLaunchdStatusCmd
+ var cmdBootstrapLinuxV *BootstrapLinuxCmd
+ var cmdBootstrapLinuxSystemdUnitsV *BootstrapLinuxSystemdUnitsCmd
+ var cmdBootstrapLinuxSystemdUnitsApplyV *BootstrapLinuxSystemdUnitsApplyCmd
+ var cmdBootstrapLinuxSystemdUnitsStatusV *BootstrapLinuxSystemdUnitsStatusCmd
+ var cmdBootstrapMacosV *BootstrapMacosCmd
+ var cmdBootstrapMacosDefaultsV *BootstrapMacosDefaultsCmd
+ var cmdBootstrapMacosDefaultsApplyV *BootstrapMacosDefaultsApplyCmd
+ var cmdBootstrapMacosDefaultsStatusV *BootstrapMacosDefaultsStatusCmd
+ var cmdBootstrapMacosLaunchdAgentsV *BootstrapMacosLaunchdAgentsCmd
+ var cmdBootstrapMacosLaunchdAgentsApplyV *BootstrapMacosLaunchdAgentsApplyCmd
+ var cmdBootstrapMacosLaunchdAgentsStatusV *BootstrapMacosLaunchdAgentsStatusCmd
+ var cmdBootstrapMacosDefaults2V *BootstrapMacosDefaults2Cmd
+ var cmdBootstrapMacosDefaultsApply2V *BootstrapMacosDefaultsApply2Cmd
+ var cmdBootstrapMacosDefaultsStatus2V *BootstrapMacosDefaultsStatus2Cmd
+ var cmdBootstrapMiseShellActivateV *BootstrapMiseShellActivateCmd
+ var cmdBootstrapMiseShellActivateApplyV *BootstrapMiseShellActivateApplyCmd
+ var cmdBootstrapMiseShellActivateStatusV *BootstrapMiseShellActivateStatusCmd
+ var cmdBootstrapPackagesV *BootstrapPackagesCmd
+ var cmdBootstrapPackagesApplyV *BootstrapPackagesApplyCmd
+ var cmdBootstrapPackagesBrewV *BootstrapPackagesBrewCmd
+ var cmdBootstrapPackagesBrewTapV *BootstrapPackagesBrewTapCmd
+ var cmdBootstrapPackagesBrewUntapV *BootstrapPackagesBrewUntapCmd
+ var cmdBootstrapPackagesImportV *BootstrapPackagesImportCmd
+ var cmdBootstrapPackagesPruneV *BootstrapPackagesPruneCmd
+ var cmdBootstrapPackagesStatusV *BootstrapPackagesStatusCmd
+ var cmdBootstrapPackagesUpgradeV *BootstrapPackagesUpgradeCmd
+ var cmdBootstrapPackagesUseV *BootstrapPackagesUseCmd
+ var cmdBootstrapPlanV *BootstrapPlanCmd
+ var cmdBootstrapPluginsV *BootstrapPluginsCmd
+ var cmdBootstrapPluginsApplyV *BootstrapPluginsApplyCmd
+ var cmdBootstrapPluginsStatusV *BootstrapPluginsStatusCmd
+ var cmdBootstrapRemoteV *BootstrapRemoteCmd
+ var cmdBootstrapReposV *BootstrapReposCmd
+ var cmdBootstrapReposApplyV *BootstrapReposApplyCmd
+ var cmdBootstrapReposExecV *BootstrapReposExecCmd
+ var cmdBootstrapReposStatusV *BootstrapReposStatusCmd
+ var cmdBootstrapReposUpdateV *BootstrapReposUpdateCmd
+ var cmdBootstrapSecretsV *BootstrapSecretsCmd
+ var cmdBootstrapSecretsStatusV *BootstrapSecretsStatusCmd
+ var cmdBootstrapServicesV *BootstrapServicesCmd
+ var cmdBootstrapServicesApplyV *BootstrapServicesApplyCmd
+ var cmdBootstrapServicesStatusV *BootstrapServicesStatusCmd
+ var cmdBootstrapStatusV *BootstrapStatusCmd
+ var cmdBootstrapSystemdV *BootstrapSystemdCmd
+ var cmdBootstrapSystemdApplyV *BootstrapSystemdApplyCmd
+ var cmdBootstrapSystemdStatusV *BootstrapSystemdStatusCmd
+ var cmdBootstrapUserV *BootstrapUserCmd
+ var cmdBootstrapUserApplyV *BootstrapUserApplyCmd
+ var cmdBootstrapUserStatusV *BootstrapUserStatusCmd
+ var cmdCacheV *CacheCmd
+ var cmdCacheClearV *CacheClearCmd
+ var cmdCachePathV *CachePathCmd
+ var cmdCachePruneV *CachePruneCmd
+ var cmdCacheTaskV *CacheTaskCmd
+ var cmdCompletionV *CompletionCmd
+ var cmdConfigV *ConfigCmd
+ var cmdConfigGetV *ConfigGetCmd
+ var cmdConfigLsV *ConfigLsCmd
+ var cmdConfigSetV *ConfigSetCmd
+ var cmdCurrentV *CurrentCmd
+ var cmdDeactivateV *DeactivateCmd
+ var cmdDirenvV *DirenvCmd
+ var cmdDirenvActivateV *DirenvActivateCmd
+ var cmdDirenvEnvrcV *DirenvEnvrcCmd
+ var cmdDirenvExecV *DirenvExecCmd
+ var cmdDotfilesV *DotfilesCmd
+ var cmdDotfilesAddV *DotfilesAddCmd
+ var cmdDotfilesApplyV *DotfilesApplyCmd
+ var cmdDotfilesEditV *DotfilesEditCmd
+ var cmdDotfilesStatusV *DotfilesStatusCmd
+ var cmdDotfilesUnapplyV *DotfilesUnapplyCmd
+ var cmdDoctorV *DoctorCmd
+ var cmdDoctorPathV *DoctorPathCmd
+ var cmdEnV *EnCmd
+ var cmdEnvV *EnvCmd
+ var cmdExecV *ExecCmd
+ var cmdFmtV *FmtCmd
+ var cmdGenerateV *GenerateCmd
+ var cmdGenerateBootstrapV *GenerateBootstrapCmd
+ var cmdGenerateConfigV *GenerateConfigCmd
+ var cmdGenerateDevcontainerV *GenerateDevcontainerCmd
+ var cmdGenerateGitPreCommitV *GenerateGitPreCommitCmd
+ var cmdGenerateGithubActionV *GenerateGithubActionCmd
+ var cmdGenerateTaskDocsV *GenerateTaskDocsCmd
+ var cmdGenerateTaskStubsV *GenerateTaskStubsCmd
+ var cmdGenerateToolStubV *GenerateToolStubCmd
+ var cmdGithubV *GithubCmd
+ var cmdGithubTokenV *GithubTokenCmd
+ var cmdGlobalV *GlobalCmd
+ var cmdHookEnvV *HookEnvCmd
+ var cmdHookNotFoundV *HookNotFoundCmd
+ var cmdImplodeV *ImplodeCmd
+ var cmdEditV *EditCmd
+ var cmdInstallV *InstallCmd
+ var cmdInstallIntoV *InstallIntoCmd
+ var cmdLatestV *LatestCmd
+ var cmdLinkV *LinkCmd
+ var cmdLocalV *LocalCmd
+ var cmdLockV *LockCmd
+ var cmdLsV *LsCmd
+ var cmdLsRemoteV *LsRemoteCmd
+ var cmdMcpV *McpCmd
+ var cmdOciV *OciCmd
+ var cmdOciBuildV *OciBuildCmd
+ var cmdOciPushV *OciPushCmd
+ var cmdOciRunV *OciRunCmd
+ var cmdOutdatedV *OutdatedCmd
+ var cmdPatronsV *PatronsCmd
+ var cmdPluginsV *PluginsCmd
+ var cmdPluginsInstallV *PluginsInstallCmd
+ var cmdPluginsLinkV *PluginsLinkCmd
+ var cmdPluginsLsV *PluginsLsCmd
+ var cmdPluginsLsRemoteV *PluginsLsRemoteCmd
+ var cmdPluginsUninstallV *PluginsUninstallCmd
+ var cmdPluginsUpdateV *PluginsUpdateCmd
+ var cmdDepsV *DepsCmd
+ var cmdDepsAddV *DepsAddCmd
+ var cmdDepsInstallV *DepsInstallCmd
+ var cmdDepsRemoveV *DepsRemoveCmd
+ var cmdPruneV *PruneCmd
+ var cmdRegistryV *RegistryCmd
+ var cmdRenderHelpV *RenderHelpCmd
+ var cmdReshimV *ReshimCmd
+ var cmdRunV *RunCmd
+ var cmdSearchV *SearchCmd
+ var cmdSelfUpdateV *SelfUpdateCmd
+ var cmdSetV *SetCmd
+ var cmdSettingsV *SettingsCmd
+ var cmdSettingsAddV *SettingsAddCmd
+ var cmdSettingsGetV *SettingsGetCmd
+ var cmdSettingsLsV *SettingsLsCmd
+ var cmdSettingsSetV *SettingsSetCmd
+ var cmdSettingsUnsetV *SettingsUnsetCmd
+ var cmdShellV *ShellCmd
+ var cmdShellAliasV *ShellAliasCmd
+ var cmdShellAliasGetV *ShellAliasGetCmd
+ var cmdShellAliasLsV *ShellAliasLsCmd
+ var cmdShellAliasSetV *ShellAliasSetCmd
+ var cmdShellAliasUnsetV *ShellAliasUnsetCmd
+ var cmdSponsorsV *SponsorsCmd
+ var cmdSyncV *SyncCmd
+ var cmdSyncNodeV *SyncNodeCmd
+ var cmdSyncPythonV *SyncPythonCmd
+ var cmdSyncRubyV *SyncRubyCmd
+ var cmdTasksV *TasksCmd
+ var cmdTasksAddV *TasksAddCmd
+ var cmdTasksDepsV *TasksDepsCmd
+ var cmdTasksEditV *TasksEditCmd
+ var cmdTasksGraphV *TasksGraphCmd
+ var cmdTasksInfoV *TasksInfoCmd
+ var cmdTasksLsV *TasksLsCmd
+ var cmdTasksRunV *TasksRunCmd
+ var cmdTasksValidateV *TasksValidateCmd
+ var cmdTestToolV *TestToolCmd
+ var cmdTokenV *TokenCmd
+ var cmdTokenForgejoV *TokenForgejoCmd
+ var cmdTokenGithubV *TokenGithubCmd
+ var cmdTokenGitlabV *TokenGitlabCmd
+ var cmdToolV *ToolCmd
+ var cmdToolStubV *ToolStubCmd
+ var cmdTrustV *TrustCmd
+ var cmdUninstallV *UninstallCmd
+ var cmdUnsetV *UnsetCmd
+ var cmdUntrustV *UntrustCmd
+ var cmdUnuseV *UnuseCmd
+ var cmdUpgradeV *UpgradeCmd
+ var cmdUsageV *UsageCmd
+ var cmdUseV *UseCmd
+ var cmdVersionV *VersionCmd
+ var cmdWatchV *WatchCmd
+ var cmdWhereV *WhereCmd
+ var cmdWhichV *WhichCmd
+
+ // Collected by key, so the post-binding rules can judge what arrived
+ // before any of it is handed back.
+ given := map[uint64][]string{}
+ seen := map[uint64]int{}
+ chain := []*argv.Command{Root}
+
+ p := argv.New(Root, args)
+ for p.Next() {
+ ev := p.Event()
+ switch ev.Kind {
+ case argv.KindCommand:
+ chain = append(chain, ev.Command)
+ switch ev.Command.Key {
+ case CmdActivate:
+ cmdActivateV = &ActivateCmd{}
+ out.Activate = cmdActivateV
+ case CmdToolAlias:
+ cmdToolAliasV = &ToolAliasCmd{}
+ out.ToolAlias = cmdToolAliasV
+ case CmdToolAliasGet:
+ cmdToolAliasGetV = &ToolAliasGetCmd{}
+ cmdToolAliasV.Get = cmdToolAliasGetV
+ case CmdToolAliasLs:
+ cmdToolAliasLsV = &ToolAliasLsCmd{}
+ cmdToolAliasV.Ls = cmdToolAliasLsV
+ case CmdToolAliasSet:
+ cmdToolAliasSetV = &ToolAliasSetCmd{}
+ cmdToolAliasV.Set = cmdToolAliasSetV
+ case CmdToolAliasUnset:
+ cmdToolAliasUnsetV = &ToolAliasUnsetCmd{}
+ cmdToolAliasV.Unset = cmdToolAliasUnsetV
+ case CmdAsdf:
+ cmdAsdfV = &AsdfCmd{}
+ out.Asdf = cmdAsdfV
+ case CmdBackends:
+ cmdBackendsV = &BackendsCmd{}
+ out.Backends = cmdBackendsV
+ case CmdBackendsLs:
+ cmdBackendsLsV = &BackendsLsCmd{}
+ cmdBackendsV.Ls = cmdBackendsLsV
+ case CmdBinPaths:
+ cmdBinPathsV = &BinPathsCmd{}
+ out.BinPaths = cmdBinPathsV
+ case CmdBootstrap:
+ cmdBootstrapV = &BootstrapCmd{}
+ out.Bootstrap = cmdBootstrapV
+ case CmdBootstrapApplyAccountPlan:
+ cmdBootstrapApplyAccountPlanV = &BootstrapApplyAccountPlanCmd{}
+ cmdBootstrapV.ApplyAccountPlan = cmdBootstrapApplyAccountPlanV
+ case CmdBootstrapApplyServicePlan:
+ cmdBootstrapApplyServicePlanV = &BootstrapApplyServicePlanCmd{}
+ cmdBootstrapV.ApplyServicePlan = cmdBootstrapApplyServicePlanV
+ case CmdBootstrapApplyFirewallPlan:
+ cmdBootstrapApplyFirewallPlanV = &BootstrapApplyFirewallPlanCmd{}
+ cmdBootstrapV.ApplyFirewallPlan = cmdBootstrapApplyFirewallPlanV
+ case CmdBootstrapApplySystemPlan:
+ cmdBootstrapApplySystemPlanV = &BootstrapApplySystemPlanCmd{}
+ cmdBootstrapV.ApplySystemPlan = cmdBootstrapApplySystemPlanV
+ case CmdBootstrapInspectSystemFiles:
+ cmdBootstrapInspectSystemFilesV = &BootstrapInspectSystemFilesCmd{}
+ cmdBootstrapV.InspectSystemFiles = cmdBootstrapInspectSystemFilesV
+ case CmdBootstrapInspectFirewallPlan:
+ cmdBootstrapInspectFirewallPlanV = &BootstrapInspectFirewallPlanCmd{}
+ cmdBootstrapV.InspectFirewallPlan = cmdBootstrapInspectFirewallPlanV
+ case CmdBootstrapAccounts:
+ cmdBootstrapAccountsV = &BootstrapAccountsCmd{}
+ cmdBootstrapV.Accounts = cmdBootstrapAccountsV
+ case CmdBootstrapAccountsApply:
+ cmdBootstrapAccountsApplyV = &BootstrapAccountsApplyCmd{}
+ cmdBootstrapAccountsV.Apply = cmdBootstrapAccountsApplyV
+ case CmdBootstrapAccountsStatus:
+ cmdBootstrapAccountsStatusV = &BootstrapAccountsStatusCmd{}
+ cmdBootstrapAccountsV.Status = cmdBootstrapAccountsStatusV
+ case CmdBootstrapCompose:
+ cmdBootstrapComposeV = &BootstrapComposeCmd{}
+ cmdBootstrapV.Compose = cmdBootstrapComposeV
+ case CmdBootstrapComposeApply:
+ cmdBootstrapComposeApplyV = &BootstrapComposeApplyCmd{}
+ cmdBootstrapComposeV.Apply = cmdBootstrapComposeApplyV
+ case CmdBootstrapComposeStatus:
+ cmdBootstrapComposeStatusV = &BootstrapComposeStatusCmd{}
+ cmdBootstrapComposeV.Status = cmdBootstrapComposeStatusV
+ case CmdBootstrapDotfiles:
+ cmdBootstrapDotfilesV = &BootstrapDotfilesCmd{}
+ cmdBootstrapV.Dotfiles = cmdBootstrapDotfilesV
+ case CmdBootstrapDotfilesAdd:
+ cmdBootstrapDotfilesAddV = &BootstrapDotfilesAddCmd{}
+ cmdBootstrapDotfilesV.Add = cmdBootstrapDotfilesAddV
+ case CmdBootstrapDotfilesApply:
+ cmdBootstrapDotfilesApplyV = &BootstrapDotfilesApplyCmd{}
+ cmdBootstrapDotfilesV.Apply = cmdBootstrapDotfilesApplyV
+ case CmdBootstrapDotfilesEdit:
+ cmdBootstrapDotfilesEditV = &BootstrapDotfilesEditCmd{}
+ cmdBootstrapDotfilesV.Edit = cmdBootstrapDotfilesEditV
+ case CmdBootstrapDotfilesStatus:
+ cmdBootstrapDotfilesStatusV = &BootstrapDotfilesStatusCmd{}
+ cmdBootstrapDotfilesV.Status = cmdBootstrapDotfilesStatusV
+ case CmdBootstrapDotfilesUnapply:
+ cmdBootstrapDotfilesUnapplyV = &BootstrapDotfilesUnapplyCmd{}
+ cmdBootstrapDotfilesV.Unapply = cmdBootstrapDotfilesUnapplyV
+ case CmdBootstrapFiles:
+ cmdBootstrapFilesV = &BootstrapFilesCmd{}
+ cmdBootstrapV.Files = cmdBootstrapFilesV
+ case CmdBootstrapFilesApply:
+ cmdBootstrapFilesApplyV = &BootstrapFilesApplyCmd{}
+ cmdBootstrapFilesV.Apply = cmdBootstrapFilesApplyV
+ case CmdBootstrapFilesStatus:
+ cmdBootstrapFilesStatusV = &BootstrapFilesStatusCmd{}
+ cmdBootstrapFilesV.Status = cmdBootstrapFilesStatusV
+ case CmdBootstrapFirewall:
+ cmdBootstrapFirewallV = &BootstrapFirewallCmd{}
+ cmdBootstrapV.Firewall = cmdBootstrapFirewallV
+ case CmdBootstrapFirewallApply:
+ cmdBootstrapFirewallApplyV = &BootstrapFirewallApplyCmd{}
+ cmdBootstrapFirewallV.Apply = cmdBootstrapFirewallApplyV
+ case CmdBootstrapFirewallStatus:
+ cmdBootstrapFirewallStatusV = &BootstrapFirewallStatusCmd{}
+ cmdBootstrapFirewallV.Status = cmdBootstrapFirewallStatusV
+ case CmdBootstrapLaunchd:
+ cmdBootstrapLaunchdV = &BootstrapLaunchdCmd{}
+ cmdBootstrapV.Launchd = cmdBootstrapLaunchdV
+ case CmdBootstrapLaunchdApply:
+ cmdBootstrapLaunchdApplyV = &BootstrapLaunchdApplyCmd{}
+ cmdBootstrapLaunchdV.Apply = cmdBootstrapLaunchdApplyV
+ case CmdBootstrapLaunchdStatus:
+ cmdBootstrapLaunchdStatusV = &BootstrapLaunchdStatusCmd{}
+ cmdBootstrapLaunchdV.Status = cmdBootstrapLaunchdStatusV
+ case CmdBootstrapLinux:
+ cmdBootstrapLinuxV = &BootstrapLinuxCmd{}
+ cmdBootstrapV.Linux = cmdBootstrapLinuxV
+ case CmdBootstrapLinuxSystemdUnits:
+ cmdBootstrapLinuxSystemdUnitsV = &BootstrapLinuxSystemdUnitsCmd{}
+ cmdBootstrapLinuxV.SystemdUnits = cmdBootstrapLinuxSystemdUnitsV
+ case CmdBootstrapLinuxSystemdUnitsApply:
+ cmdBootstrapLinuxSystemdUnitsApplyV = &BootstrapLinuxSystemdUnitsApplyCmd{}
+ cmdBootstrapLinuxSystemdUnitsV.Apply = cmdBootstrapLinuxSystemdUnitsApplyV
+ case CmdBootstrapLinuxSystemdUnitsStatus:
+ cmdBootstrapLinuxSystemdUnitsStatusV = &BootstrapLinuxSystemdUnitsStatusCmd{}
+ cmdBootstrapLinuxSystemdUnitsV.Status = cmdBootstrapLinuxSystemdUnitsStatusV
+ case CmdBootstrapMacos:
+ cmdBootstrapMacosV = &BootstrapMacosCmd{}
+ cmdBootstrapV.Macos = cmdBootstrapMacosV
+ case CmdBootstrapMacosDefaults:
+ cmdBootstrapMacosDefaultsV = &BootstrapMacosDefaultsCmd{}
+ cmdBootstrapMacosV.Defaults = cmdBootstrapMacosDefaultsV
+ case CmdBootstrapMacosDefaultsApply:
+ cmdBootstrapMacosDefaultsApplyV = &BootstrapMacosDefaultsApplyCmd{}
+ cmdBootstrapMacosDefaultsV.Apply = cmdBootstrapMacosDefaultsApplyV
+ case CmdBootstrapMacosDefaultsStatus:
+ cmdBootstrapMacosDefaultsStatusV = &BootstrapMacosDefaultsStatusCmd{}
+ cmdBootstrapMacosDefaultsV.Status = cmdBootstrapMacosDefaultsStatusV
+ case CmdBootstrapMacosLaunchdAgents:
+ cmdBootstrapMacosLaunchdAgentsV = &BootstrapMacosLaunchdAgentsCmd{}
+ cmdBootstrapMacosV.LaunchdAgents = cmdBootstrapMacosLaunchdAgentsV
+ case CmdBootstrapMacosLaunchdAgentsApply:
+ cmdBootstrapMacosLaunchdAgentsApplyV = &BootstrapMacosLaunchdAgentsApplyCmd{}
+ cmdBootstrapMacosLaunchdAgentsV.Apply = cmdBootstrapMacosLaunchdAgentsApplyV
+ case CmdBootstrapMacosLaunchdAgentsStatus:
+ cmdBootstrapMacosLaunchdAgentsStatusV = &BootstrapMacosLaunchdAgentsStatusCmd{}
+ cmdBootstrapMacosLaunchdAgentsV.Status = cmdBootstrapMacosLaunchdAgentsStatusV
+ case CmdBootstrapMacosDefaults2:
+ cmdBootstrapMacosDefaults2V = &BootstrapMacosDefaults2Cmd{}
+ cmdBootstrapV.MacosDefaults = cmdBootstrapMacosDefaults2V
+ case CmdBootstrapMacosDefaultsApply2:
+ cmdBootstrapMacosDefaultsApply2V = &BootstrapMacosDefaultsApply2Cmd{}
+ cmdBootstrapMacosDefaults2V.Apply = cmdBootstrapMacosDefaultsApply2V
+ case CmdBootstrapMacosDefaultsStatus2:
+ cmdBootstrapMacosDefaultsStatus2V = &BootstrapMacosDefaultsStatus2Cmd{}
+ cmdBootstrapMacosDefaults2V.Status = cmdBootstrapMacosDefaultsStatus2V
+ case CmdBootstrapMiseShellActivate:
+ cmdBootstrapMiseShellActivateV = &BootstrapMiseShellActivateCmd{}
+ cmdBootstrapV.MiseShellActivate = cmdBootstrapMiseShellActivateV
+ case CmdBootstrapMiseShellActivateApply:
+ cmdBootstrapMiseShellActivateApplyV = &BootstrapMiseShellActivateApplyCmd{}
+ cmdBootstrapMiseShellActivateV.Apply = cmdBootstrapMiseShellActivateApplyV
+ case CmdBootstrapMiseShellActivateStatus:
+ cmdBootstrapMiseShellActivateStatusV = &BootstrapMiseShellActivateStatusCmd{}
+ cmdBootstrapMiseShellActivateV.Status = cmdBootstrapMiseShellActivateStatusV
+ case CmdBootstrapPackages:
+ cmdBootstrapPackagesV = &BootstrapPackagesCmd{}
+ cmdBootstrapV.Packages = cmdBootstrapPackagesV
+ case CmdBootstrapPackagesApply:
+ cmdBootstrapPackagesApplyV = &BootstrapPackagesApplyCmd{}
+ cmdBootstrapPackagesV.Apply = cmdBootstrapPackagesApplyV
+ case CmdBootstrapPackagesBrew:
+ cmdBootstrapPackagesBrewV = &BootstrapPackagesBrewCmd{}
+ cmdBootstrapPackagesV.Brew = cmdBootstrapPackagesBrewV
+ case CmdBootstrapPackagesBrewTap:
+ cmdBootstrapPackagesBrewTapV = &BootstrapPackagesBrewTapCmd{}
+ cmdBootstrapPackagesBrewV.Tap = cmdBootstrapPackagesBrewTapV
+ case CmdBootstrapPackagesBrewUntap:
+ cmdBootstrapPackagesBrewUntapV = &BootstrapPackagesBrewUntapCmd{}
+ cmdBootstrapPackagesBrewV.Untap = cmdBootstrapPackagesBrewUntapV
+ case CmdBootstrapPackagesImport:
+ cmdBootstrapPackagesImportV = &BootstrapPackagesImportCmd{}
+ cmdBootstrapPackagesV.Import = cmdBootstrapPackagesImportV
+ case CmdBootstrapPackagesPrune:
+ cmdBootstrapPackagesPruneV = &BootstrapPackagesPruneCmd{}
+ cmdBootstrapPackagesV.Prune = cmdBootstrapPackagesPruneV
+ case CmdBootstrapPackagesStatus:
+ cmdBootstrapPackagesStatusV = &BootstrapPackagesStatusCmd{}
+ cmdBootstrapPackagesV.Status = cmdBootstrapPackagesStatusV
+ case CmdBootstrapPackagesUpgrade:
+ cmdBootstrapPackagesUpgradeV = &BootstrapPackagesUpgradeCmd{}
+ cmdBootstrapPackagesV.Upgrade = cmdBootstrapPackagesUpgradeV
+ case CmdBootstrapPackagesUse:
+ cmdBootstrapPackagesUseV = &BootstrapPackagesUseCmd{}
+ cmdBootstrapPackagesV.Use = cmdBootstrapPackagesUseV
+ case CmdBootstrapPlan:
+ cmdBootstrapPlanV = &BootstrapPlanCmd{}
+ cmdBootstrapV.Plan = cmdBootstrapPlanV
+ case CmdBootstrapPlugins:
+ cmdBootstrapPluginsV = &BootstrapPluginsCmd{}
+ cmdBootstrapV.Plugins = cmdBootstrapPluginsV
+ case CmdBootstrapPluginsApply:
+ cmdBootstrapPluginsApplyV = &BootstrapPluginsApplyCmd{}
+ cmdBootstrapPluginsV.Apply = cmdBootstrapPluginsApplyV
+ case CmdBootstrapPluginsStatus:
+ cmdBootstrapPluginsStatusV = &BootstrapPluginsStatusCmd{}
+ cmdBootstrapPluginsV.Status = cmdBootstrapPluginsStatusV
+ case CmdBootstrapRemote:
+ cmdBootstrapRemoteV = &BootstrapRemoteCmd{}
+ cmdBootstrapV.Remote = cmdBootstrapRemoteV
+ case CmdBootstrapRepos:
+ cmdBootstrapReposV = &BootstrapReposCmd{}
+ cmdBootstrapV.Repos = cmdBootstrapReposV
+ case CmdBootstrapReposApply:
+ cmdBootstrapReposApplyV = &BootstrapReposApplyCmd{}
+ cmdBootstrapReposV.Apply = cmdBootstrapReposApplyV
+ case CmdBootstrapReposExec:
+ cmdBootstrapReposExecV = &BootstrapReposExecCmd{}
+ cmdBootstrapReposV.Exec = cmdBootstrapReposExecV
+ case CmdBootstrapReposStatus:
+ cmdBootstrapReposStatusV = &BootstrapReposStatusCmd{}
+ cmdBootstrapReposV.Status = cmdBootstrapReposStatusV
+ case CmdBootstrapReposUpdate:
+ cmdBootstrapReposUpdateV = &BootstrapReposUpdateCmd{}
+ cmdBootstrapReposV.Update = cmdBootstrapReposUpdateV
+ case CmdBootstrapSecrets:
+ cmdBootstrapSecretsV = &BootstrapSecretsCmd{}
+ cmdBootstrapV.Secrets = cmdBootstrapSecretsV
+ case CmdBootstrapSecretsStatus:
+ cmdBootstrapSecretsStatusV = &BootstrapSecretsStatusCmd{}
+ cmdBootstrapSecretsV.Status = cmdBootstrapSecretsStatusV
+ case CmdBootstrapServices:
+ cmdBootstrapServicesV = &BootstrapServicesCmd{}
+ cmdBootstrapV.Services = cmdBootstrapServicesV
+ case CmdBootstrapServicesApply:
+ cmdBootstrapServicesApplyV = &BootstrapServicesApplyCmd{}
+ cmdBootstrapServicesV.Apply = cmdBootstrapServicesApplyV
+ case CmdBootstrapServicesStatus:
+ cmdBootstrapServicesStatusV = &BootstrapServicesStatusCmd{}
+ cmdBootstrapServicesV.Status = cmdBootstrapServicesStatusV
+ case CmdBootstrapStatus:
+ cmdBootstrapStatusV = &BootstrapStatusCmd{}
+ cmdBootstrapV.Status = cmdBootstrapStatusV
+ case CmdBootstrapSystemd:
+ cmdBootstrapSystemdV = &BootstrapSystemdCmd{}
+ cmdBootstrapV.Systemd = cmdBootstrapSystemdV
+ case CmdBootstrapSystemdApply:
+ cmdBootstrapSystemdApplyV = &BootstrapSystemdApplyCmd{}
+ cmdBootstrapSystemdV.Apply = cmdBootstrapSystemdApplyV
+ case CmdBootstrapSystemdStatus:
+ cmdBootstrapSystemdStatusV = &BootstrapSystemdStatusCmd{}
+ cmdBootstrapSystemdV.Status = cmdBootstrapSystemdStatusV
+ case CmdBootstrapUser:
+ cmdBootstrapUserV = &BootstrapUserCmd{}
+ cmdBootstrapV.User = cmdBootstrapUserV
+ case CmdBootstrapUserApply:
+ cmdBootstrapUserApplyV = &BootstrapUserApplyCmd{}
+ cmdBootstrapUserV.Apply = cmdBootstrapUserApplyV
+ case CmdBootstrapUserStatus:
+ cmdBootstrapUserStatusV = &BootstrapUserStatusCmd{}
+ cmdBootstrapUserV.Status = cmdBootstrapUserStatusV
+ case CmdCache:
+ cmdCacheV = &CacheCmd{}
+ out.Cache = cmdCacheV
+ case CmdCacheClear:
+ cmdCacheClearV = &CacheClearCmd{}
+ cmdCacheV.Clear = cmdCacheClearV
+ case CmdCachePath:
+ cmdCachePathV = &CachePathCmd{}
+ cmdCacheV.Path = cmdCachePathV
+ case CmdCachePrune:
+ cmdCachePruneV = &CachePruneCmd{}
+ cmdCacheV.Prune = cmdCachePruneV
+ case CmdCacheTask:
+ cmdCacheTaskV = &CacheTaskCmd{}
+ cmdCacheV.Task = cmdCacheTaskV
+ case CmdCompletion:
+ cmdCompletionV = &CompletionCmd{}
+ out.Completion = cmdCompletionV
+ case CmdConfig:
+ cmdConfigV = &ConfigCmd{}
+ out.Config = cmdConfigV
+ case CmdConfigGet:
+ cmdConfigGetV = &ConfigGetCmd{}
+ cmdConfigV.Get = cmdConfigGetV
+ case CmdConfigLs:
+ cmdConfigLsV = &ConfigLsCmd{}
+ cmdConfigV.Ls = cmdConfigLsV
+ case CmdConfigSet:
+ cmdConfigSetV = &ConfigSetCmd{}
+ cmdConfigV.Set = cmdConfigSetV
+ case CmdCurrent:
+ cmdCurrentV = &CurrentCmd{}
+ out.Current = cmdCurrentV
+ case CmdDeactivate:
+ cmdDeactivateV = &DeactivateCmd{}
+ out.Deactivate = cmdDeactivateV
+ case CmdDirenv:
+ cmdDirenvV = &DirenvCmd{}
+ out.Direnv = cmdDirenvV
+ case CmdDirenvActivate:
+ cmdDirenvActivateV = &DirenvActivateCmd{}
+ cmdDirenvV.Activate = cmdDirenvActivateV
+ case CmdDirenvEnvrc:
+ cmdDirenvEnvrcV = &DirenvEnvrcCmd{}
+ cmdDirenvV.Envrc = cmdDirenvEnvrcV
+ case CmdDirenvExec:
+ cmdDirenvExecV = &DirenvExecCmd{}
+ cmdDirenvV.Exec = cmdDirenvExecV
+ case CmdDotfiles:
+ cmdDotfilesV = &DotfilesCmd{}
+ out.Dotfiles = cmdDotfilesV
+ case CmdDotfilesAdd:
+ cmdDotfilesAddV = &DotfilesAddCmd{}
+ cmdDotfilesV.Add = cmdDotfilesAddV
+ case CmdDotfilesApply:
+ cmdDotfilesApplyV = &DotfilesApplyCmd{}
+ cmdDotfilesV.Apply = cmdDotfilesApplyV
+ case CmdDotfilesEdit:
+ cmdDotfilesEditV = &DotfilesEditCmd{}
+ cmdDotfilesV.Edit = cmdDotfilesEditV
+ case CmdDotfilesStatus:
+ cmdDotfilesStatusV = &DotfilesStatusCmd{}
+ cmdDotfilesV.Status = cmdDotfilesStatusV
+ case CmdDotfilesUnapply:
+ cmdDotfilesUnapplyV = &DotfilesUnapplyCmd{}
+ cmdDotfilesV.Unapply = cmdDotfilesUnapplyV
+ case CmdDoctor:
+ cmdDoctorV = &DoctorCmd{}
+ out.Doctor = cmdDoctorV
+ case CmdDoctorPath:
+ cmdDoctorPathV = &DoctorPathCmd{}
+ cmdDoctorV.Path = cmdDoctorPathV
+ case CmdEn:
+ cmdEnV = &EnCmd{}
+ out.En = cmdEnV
+ case CmdEnv:
+ cmdEnvV = &EnvCmd{}
+ out.EnvCmd = cmdEnvV
+ case CmdExec:
+ cmdExecV = &ExecCmd{}
+ out.Exec = cmdExecV
+ case CmdFmt:
+ cmdFmtV = &FmtCmd{}
+ out.Fmt = cmdFmtV
+ case CmdGenerate:
+ cmdGenerateV = &GenerateCmd{}
+ out.Generate = cmdGenerateV
+ case CmdGenerateBootstrap:
+ cmdGenerateBootstrapV = &GenerateBootstrapCmd{}
+ cmdGenerateV.Bootstrap = cmdGenerateBootstrapV
+ case CmdGenerateConfig:
+ cmdGenerateConfigV = &GenerateConfigCmd{}
+ cmdGenerateV.Config = cmdGenerateConfigV
+ case CmdGenerateDevcontainer:
+ cmdGenerateDevcontainerV = &GenerateDevcontainerCmd{}
+ cmdGenerateV.Devcontainer = cmdGenerateDevcontainerV
+ case CmdGenerateGitPreCommit:
+ cmdGenerateGitPreCommitV = &GenerateGitPreCommitCmd{}
+ cmdGenerateV.GitPreCommit = cmdGenerateGitPreCommitV
+ case CmdGenerateGithubAction:
+ cmdGenerateGithubActionV = &GenerateGithubActionCmd{}
+ cmdGenerateV.GithubAction = cmdGenerateGithubActionV
+ case CmdGenerateTaskDocs:
+ cmdGenerateTaskDocsV = &GenerateTaskDocsCmd{}
+ cmdGenerateV.TaskDocs = cmdGenerateTaskDocsV
+ case CmdGenerateTaskStubs:
+ cmdGenerateTaskStubsV = &GenerateTaskStubsCmd{}
+ cmdGenerateV.TaskStubs = cmdGenerateTaskStubsV
+ case CmdGenerateToolStub:
+ cmdGenerateToolStubV = &GenerateToolStubCmd{}
+ cmdGenerateV.ToolStub = cmdGenerateToolStubV
+ case CmdGithub:
+ cmdGithubV = &GithubCmd{}
+ out.Github = cmdGithubV
+ case CmdGithubToken:
+ cmdGithubTokenV = &GithubTokenCmd{}
+ cmdGithubV.Token = cmdGithubTokenV
+ case CmdGlobal:
+ cmdGlobalV = &GlobalCmd{}
+ out.Global = cmdGlobalV
+ case CmdHookEnv:
+ cmdHookEnvV = &HookEnvCmd{}
+ out.HookEnv = cmdHookEnvV
+ case CmdHookNotFound:
+ cmdHookNotFoundV = &HookNotFoundCmd{}
+ out.HookNotFound = cmdHookNotFoundV
+ case CmdImplode:
+ cmdImplodeV = &ImplodeCmd{}
+ out.Implode = cmdImplodeV
+ case CmdEdit:
+ cmdEditV = &EditCmd{}
+ out.Edit = cmdEditV
+ case CmdInstall:
+ cmdInstallV = &InstallCmd{}
+ out.Install = cmdInstallV
+ case CmdInstallInto:
+ cmdInstallIntoV = &InstallIntoCmd{}
+ out.InstallInto = cmdInstallIntoV
+ case CmdLatest:
+ cmdLatestV = &LatestCmd{}
+ out.Latest = cmdLatestV
+ case CmdLink:
+ cmdLinkV = &LinkCmd{}
+ out.Link = cmdLinkV
+ case CmdLocal:
+ cmdLocalV = &LocalCmd{}
+ out.Local = cmdLocalV
+ case CmdLock:
+ cmdLockV = &LockCmd{}
+ out.Lock = cmdLockV
+ case CmdLs:
+ cmdLsV = &LsCmd{}
+ out.Ls = cmdLsV
+ case CmdLsRemote:
+ cmdLsRemoteV = &LsRemoteCmd{}
+ out.LsRemote = cmdLsRemoteV
+ case CmdMcp:
+ cmdMcpV = &McpCmd{}
+ out.Mcp = cmdMcpV
+ case CmdOci:
+ cmdOciV = &OciCmd{}
+ out.Oci = cmdOciV
+ case CmdOciBuild:
+ cmdOciBuildV = &OciBuildCmd{}
+ cmdOciV.Build = cmdOciBuildV
+ case CmdOciPush:
+ cmdOciPushV = &OciPushCmd{}
+ cmdOciV.Push = cmdOciPushV
+ case CmdOciRun:
+ cmdOciRunV = &OciRunCmd{}
+ cmdOciV.Run = cmdOciRunV
+ case CmdOutdated:
+ cmdOutdatedV = &OutdatedCmd{}
+ out.Outdated = cmdOutdatedV
+ case CmdPatrons:
+ cmdPatronsV = &PatronsCmd{}
+ out.Patrons = cmdPatronsV
+ case CmdPlugins:
+ cmdPluginsV = &PluginsCmd{}
+ out.Plugins = cmdPluginsV
+ case CmdPluginsInstall:
+ cmdPluginsInstallV = &PluginsInstallCmd{}
+ cmdPluginsV.Install = cmdPluginsInstallV
+ case CmdPluginsLink:
+ cmdPluginsLinkV = &PluginsLinkCmd{}
+ cmdPluginsV.Link = cmdPluginsLinkV
+ case CmdPluginsLs:
+ cmdPluginsLsV = &PluginsLsCmd{}
+ cmdPluginsV.Ls = cmdPluginsLsV
+ case CmdPluginsLsRemote:
+ cmdPluginsLsRemoteV = &PluginsLsRemoteCmd{}
+ cmdPluginsV.LsRemote = cmdPluginsLsRemoteV
+ case CmdPluginsUninstall:
+ cmdPluginsUninstallV = &PluginsUninstallCmd{}
+ cmdPluginsV.Uninstall = cmdPluginsUninstallV
+ case CmdPluginsUpdate:
+ cmdPluginsUpdateV = &PluginsUpdateCmd{}
+ cmdPluginsV.Update = cmdPluginsUpdateV
+ case CmdDeps:
+ cmdDepsV = &DepsCmd{}
+ out.Deps = cmdDepsV
+ case CmdDepsAdd:
+ cmdDepsAddV = &DepsAddCmd{}
+ cmdDepsV.Add = cmdDepsAddV
+ case CmdDepsInstall:
+ cmdDepsInstallV = &DepsInstallCmd{}
+ cmdDepsV.Install = cmdDepsInstallV
+ case CmdDepsRemove:
+ cmdDepsRemoveV = &DepsRemoveCmd{}
+ cmdDepsV.Remove = cmdDepsRemoveV
+ case CmdPrune:
+ cmdPruneV = &PruneCmd{}
+ out.Prune = cmdPruneV
+ case CmdRegistry:
+ cmdRegistryV = &RegistryCmd{}
+ out.Registry = cmdRegistryV
+ case CmdRenderHelp:
+ cmdRenderHelpV = &RenderHelpCmd{}
+ out.RenderHelp = cmdRenderHelpV
+ case CmdReshim:
+ cmdReshimV = &ReshimCmd{}
+ out.Reshim = cmdReshimV
+ case CmdRun:
+ cmdRunV = &RunCmd{}
+ out.Run = cmdRunV
+ case CmdSearch:
+ cmdSearchV = &SearchCmd{}
+ out.Search = cmdSearchV
+ case CmdSelfUpdate:
+ cmdSelfUpdateV = &SelfUpdateCmd{}
+ out.SelfUpdate = cmdSelfUpdateV
+ case CmdSet:
+ cmdSetV = &SetCmd{}
+ out.Set = cmdSetV
+ case CmdSettings:
+ cmdSettingsV = &SettingsCmd{}
+ out.Settings = cmdSettingsV
+ case CmdSettingsAdd:
+ cmdSettingsAddV = &SettingsAddCmd{}
+ cmdSettingsV.Add = cmdSettingsAddV
+ case CmdSettingsGet:
+ cmdSettingsGetV = &SettingsGetCmd{}
+ cmdSettingsV.Get = cmdSettingsGetV
+ case CmdSettingsLs:
+ cmdSettingsLsV = &SettingsLsCmd{}
+ cmdSettingsV.Ls = cmdSettingsLsV
+ case CmdSettingsSet:
+ cmdSettingsSetV = &SettingsSetCmd{}
+ cmdSettingsV.Set = cmdSettingsSetV
+ case CmdSettingsUnset:
+ cmdSettingsUnsetV = &SettingsUnsetCmd{}
+ cmdSettingsV.Unset = cmdSettingsUnsetV
+ case CmdShell:
+ cmdShellV = &ShellCmd{}
+ out.ShellCmd = cmdShellV
+ case CmdShellAlias:
+ cmdShellAliasV = &ShellAliasCmd{}
+ out.ShellAlias = cmdShellAliasV
+ case CmdShellAliasGet:
+ cmdShellAliasGetV = &ShellAliasGetCmd{}
+ cmdShellAliasV.Get = cmdShellAliasGetV
+ case CmdShellAliasLs:
+ cmdShellAliasLsV = &ShellAliasLsCmd{}
+ cmdShellAliasV.Ls = cmdShellAliasLsV
+ case CmdShellAliasSet:
+ cmdShellAliasSetV = &ShellAliasSetCmd{}
+ cmdShellAliasV.Set = cmdShellAliasSetV
+ case CmdShellAliasUnset:
+ cmdShellAliasUnsetV = &ShellAliasUnsetCmd{}
+ cmdShellAliasV.Unset = cmdShellAliasUnsetV
+ case CmdSponsors:
+ cmdSponsorsV = &SponsorsCmd{}
+ out.Sponsors = cmdSponsorsV
+ case CmdSync:
+ cmdSyncV = &SyncCmd{}
+ out.Sync = cmdSyncV
+ case CmdSyncNode:
+ cmdSyncNodeV = &SyncNodeCmd{}
+ cmdSyncV.Node = cmdSyncNodeV
+ case CmdSyncPython:
+ cmdSyncPythonV = &SyncPythonCmd{}
+ cmdSyncV.Python = cmdSyncPythonV
+ case CmdSyncRuby:
+ cmdSyncRubyV = &SyncRubyCmd{}
+ cmdSyncV.Ruby = cmdSyncRubyV
+ case CmdTasks:
+ cmdTasksV = &TasksCmd{}
+ out.Tasks = cmdTasksV
+ case CmdTasksAdd:
+ cmdTasksAddV = &TasksAddCmd{}
+ cmdTasksV.Add = cmdTasksAddV
+ case CmdTasksDeps:
+ cmdTasksDepsV = &TasksDepsCmd{}
+ cmdTasksV.Deps = cmdTasksDepsV
+ case CmdTasksEdit:
+ cmdTasksEditV = &TasksEditCmd{}
+ cmdTasksV.Edit = cmdTasksEditV
+ case CmdTasksGraph:
+ cmdTasksGraphV = &TasksGraphCmd{}
+ cmdTasksV.Graph = cmdTasksGraphV
+ case CmdTasksInfo:
+ cmdTasksInfoV = &TasksInfoCmd{}
+ cmdTasksV.Info = cmdTasksInfoV
+ case CmdTasksLs:
+ cmdTasksLsV = &TasksLsCmd{}
+ cmdTasksV.Ls = cmdTasksLsV
+ case CmdTasksRun:
+ cmdTasksRunV = &TasksRunCmd{}
+ cmdTasksV.Run = cmdTasksRunV
+ case CmdTasksValidate:
+ cmdTasksValidateV = &TasksValidateCmd{}
+ cmdTasksV.Validate = cmdTasksValidateV
+ case CmdTestTool:
+ cmdTestToolV = &TestToolCmd{}
+ out.TestTool = cmdTestToolV
+ case CmdToken:
+ cmdTokenV = &TokenCmd{}
+ out.Token = cmdTokenV
+ case CmdTokenForgejo:
+ cmdTokenForgejoV = &TokenForgejoCmd{}
+ cmdTokenV.Forgejo = cmdTokenForgejoV
+ case CmdTokenGithub:
+ cmdTokenGithubV = &TokenGithubCmd{}
+ cmdTokenV.Github = cmdTokenGithubV
+ case CmdTokenGitlab:
+ cmdTokenGitlabV = &TokenGitlabCmd{}
+ cmdTokenV.Gitlab = cmdTokenGitlabV
+ case CmdTool:
+ cmdToolV = &ToolCmd{}
+ out.ToolCmd = cmdToolV
+ case CmdToolStub:
+ cmdToolStubV = &ToolStubCmd{}
+ out.ToolStub = cmdToolStubV
+ case CmdTrust:
+ cmdTrustV = &TrustCmd{}
+ out.Trust = cmdTrustV
+ case CmdUninstall:
+ cmdUninstallV = &UninstallCmd{}
+ out.Uninstall = cmdUninstallV
+ case CmdUnset:
+ cmdUnsetV = &UnsetCmd{}
+ out.Unset = cmdUnsetV
+ case CmdUntrust:
+ cmdUntrustV = &UntrustCmd{}
+ out.Untrust = cmdUntrustV
+ case CmdUnuse:
+ cmdUnuseV = &UnuseCmd{}
+ out.Unuse = cmdUnuseV
+ case CmdUpgrade:
+ cmdUpgradeV = &UpgradeCmd{}
+ out.Upgrade = cmdUpgradeV
+ case CmdUsage:
+ cmdUsageV = &UsageCmd{}
+ out.Usage = cmdUsageV
+ case CmdUse:
+ cmdUseV = &UseCmd{}
+ out.Use = cmdUseV
+ case CmdVersion:
+ cmdVersionV = &VersionCmd{}
+ out.VersionCmd = cmdVersionV
+ case CmdWatch:
+ cmdWatchV = &WatchCmd{}
+ out.Watch = cmdWatchV
+ case CmdWhere:
+ cmdWhereV = &WhereCmd{}
+ out.Where = cmdWhereV
+ case CmdWhich:
+ cmdWhichV = &WhichCmd{}
+ out.Which = cmdWhichV
+ }
+ case argv.KindFlag:
+ seen[ev.Flag.Key]++
+ if ev.Flag.BoolValue {
+ // Boolean binding is last-one-wins. Replace an earlier attached value even
+ // when the last occurrence is bare, so relationship polarity follows the field.
+ if ev.HasValue {
+ given[ev.Flag.Key] = []string{ev.Value}
+ } else {
+ given[ev.Flag.Key] = []string{}
+ }
+ } else if ev.HasValue {
+ given[ev.Flag.Key] = append(given[ev.Flag.Key], argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ } else if given[ev.Flag.Key] == nil {
+ // Given without a value is still given, and nil would read as
+ // absent when the fallbacks are applied.
+ given[ev.Flag.Key] = []string{}
+ }
+ switch ev.Flag.Key {
+ case FlagContinueOnError:
+ out.ContinueOnError = !ev.Negated
+ case FlagCd:
+ out.Cd = ev.Value
+ case FlagEnv:
+ if ev.HasValue {
+ out.Env = append(out.Env, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagForce:
+ out.Force = !ev.Negated
+ case FlagJobs:
+ out.Jobs = ev.Value
+ case FlagDryRun:
+ out.DryRun = !ev.Negated
+ case FlagProfile:
+ if ev.HasValue {
+ out.Profile = append(out.Profile, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagQuiet:
+ out.Quiet = !ev.Negated
+ case FlagShell:
+ out.Shell = ev.Value
+ case FlagTool:
+ if ev.HasValue {
+ out.Tool = append(out.Tool, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagVerbose:
+ out.Verbose++
+ case FlagVersion:
+ out.Version = !ev.Negated
+ case FlagYes:
+ out.Yes = !ev.Negated
+ case FlagDebug:
+ out.Debug = !ev.Negated
+ case FlagLogLevel:
+ out.LogLevel = ev.Value
+ case FlagNoConfig:
+ out.NoConfig = !ev.Negated
+ case FlagNoEnv:
+ out.NoEnv = !ev.Negated
+ case FlagNoHooks:
+ out.NoHooks = !ev.Negated
+ case FlagNoTimings:
+ out.NoTimings = !ev.Negated
+ case FlagOutput:
+ out.Output = ev.Value
+ case FlagRaw:
+ out.Raw = !ev.Negated
+ case FlagLocked:
+ out.Locked = !ev.Negated
+ case FlagSilent:
+ out.Silent = !ev.Negated
+ case FlagTimings:
+ out.Timings = !ev.Negated
+ case FlagTrace:
+ out.Trace = !ev.Negated
+ case FlagActivateQuiet:
+ cmdActivateV.Quiet = !ev.Negated
+ case FlagActivateShell:
+ cmdActivateV.Shell = ev.Value
+ case FlagActivateNoHookEnv:
+ cmdActivateV.NoHookEnv = !ev.Negated
+ case FlagActivateShims:
+ cmdActivateV.Shims = !ev.Negated
+ case FlagActivateStatus:
+ cmdActivateV.Status = !ev.Negated
+ case FlagToolAliasTool:
+ cmdToolAliasV.Tool = ev.Value
+ case FlagToolAliasNoHeader:
+ cmdToolAliasV.NoHeader = !ev.Negated
+ case FlagToolAliasLsNoHeader:
+ cmdToolAliasLsV.NoHeader = !ev.Negated
+ case FlagBinPathsBinNames:
+ cmdBinPathsV.BinNames = !ev.Negated
+ case FlagBinPathsJson:
+ cmdBinPathsV.Json = !ev.Negated
+ case FlagBootstrapDryRun:
+ cmdBootstrapV.DryRun = !ev.Negated
+ case FlagBootstrapYes:
+ cmdBootstrapV.Yes = !ev.Negated
+ case FlagBootstrapForceDotfiles:
+ cmdBootstrapV.ForceDotfiles = !ev.Negated
+ case FlagBootstrapOnly:
+ if ev.HasValue {
+ cmdBootstrapV.Only = append(cmdBootstrapV.Only, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagBootstrapPromptSecrets:
+ cmdBootstrapV.PromptSecrets = !ev.Negated
+ case FlagBootstrapSkip:
+ if ev.HasValue {
+ cmdBootstrapV.Skip = append(cmdBootstrapV.Skip, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagBootstrapUpdate:
+ cmdBootstrapV.Update = !ev.Negated
+ case FlagBootstrapAccountsApplyDryRun:
+ cmdBootstrapAccountsApplyV.DryRun = !ev.Negated
+ case FlagBootstrapAccountsApplyYes:
+ cmdBootstrapAccountsApplyV.Yes = !ev.Negated
+ case FlagBootstrapAccountsStatusJson:
+ cmdBootstrapAccountsStatusV.Json = !ev.Negated
+ case FlagBootstrapAccountsStatusMissing:
+ cmdBootstrapAccountsStatusV.Missing = !ev.Negated
+ case FlagBootstrapComposeApplyDryRun:
+ cmdBootstrapComposeApplyV.DryRun = !ev.Negated
+ case FlagBootstrapComposeApplyYes:
+ cmdBootstrapComposeApplyV.Yes = !ev.Negated
+ case FlagBootstrapComposeStatusJson:
+ cmdBootstrapComposeStatusV.Json = !ev.Negated
+ case FlagBootstrapComposeStatusMissing:
+ cmdBootstrapComposeStatusV.Missing = !ev.Negated
+ case FlagBootstrapDotfilesAddForce:
+ cmdBootstrapDotfilesAddV.Force = !ev.Negated
+ case FlagBootstrapDotfilesAddGlobal:
+ cmdBootstrapDotfilesAddV.Global = !ev.Negated
+ case FlagBootstrapDotfilesAddLocal:
+ cmdBootstrapDotfilesAddV.Local = !ev.Negated
+ case FlagBootstrapDotfilesAddMode:
+ cmdBootstrapDotfilesAddV.Mode = ev.Value
+ case FlagBootstrapDotfilesAddDryRun:
+ cmdBootstrapDotfilesAddV.DryRun = !ev.Negated
+ case FlagBootstrapDotfilesAddNoApply:
+ cmdBootstrapDotfilesAddV.NoApply = !ev.Negated
+ case FlagBootstrapDotfilesAddPath:
+ cmdBootstrapDotfilesAddV.Path = ev.Value
+ case FlagBootstrapDotfilesAddSource:
+ cmdBootstrapDotfilesAddV.Source = ev.Value
+ case FlagBootstrapDotfilesAddYes:
+ cmdBootstrapDotfilesAddV.Yes = !ev.Negated
+ case FlagBootstrapDotfilesApplyForce:
+ cmdBootstrapDotfilesApplyV.Force = !ev.Negated
+ case FlagBootstrapDotfilesApplyDryRun:
+ cmdBootstrapDotfilesApplyV.DryRun = !ev.Negated
+ case FlagBootstrapDotfilesApplyYes:
+ cmdBootstrapDotfilesApplyV.Yes = !ev.Negated
+ case FlagBootstrapDotfilesEditApply:
+ cmdBootstrapDotfilesEditV.Apply = !ev.Negated
+ case FlagBootstrapDotfilesEditMode:
+ cmdBootstrapDotfilesEditV.Mode = ev.Value
+ case FlagBootstrapDotfilesEditSource:
+ cmdBootstrapDotfilesEditV.Source = ev.Value
+ case FlagBootstrapDotfilesEditYes:
+ cmdBootstrapDotfilesEditV.Yes = !ev.Negated
+ case FlagBootstrapDotfilesStatusJson:
+ cmdBootstrapDotfilesStatusV.Json = !ev.Negated
+ case FlagBootstrapDotfilesStatusMissing:
+ cmdBootstrapDotfilesStatusV.Missing = !ev.Negated
+ case FlagBootstrapDotfilesUnapplyForce:
+ cmdBootstrapDotfilesUnapplyV.Force = !ev.Negated
+ case FlagBootstrapDotfilesUnapplyDryRun:
+ cmdBootstrapDotfilesUnapplyV.DryRun = !ev.Negated
+ case FlagBootstrapDotfilesUnapplyYes:
+ cmdBootstrapDotfilesUnapplyV.Yes = !ev.Negated
+ case FlagBootstrapFilesApplyDryRun:
+ cmdBootstrapFilesApplyV.DryRun = !ev.Negated
+ case FlagBootstrapFilesApplyYes:
+ cmdBootstrapFilesApplyV.Yes = !ev.Negated
+ case FlagBootstrapFilesApplyPromptSecrets:
+ cmdBootstrapFilesApplyV.PromptSecrets = !ev.Negated
+ case FlagBootstrapFilesStatusJson:
+ cmdBootstrapFilesStatusV.Json = !ev.Negated
+ case FlagBootstrapFilesStatusMissing:
+ cmdBootstrapFilesStatusV.Missing = !ev.Negated
+ case FlagBootstrapFilesStatusPromptSecrets:
+ cmdBootstrapFilesStatusV.PromptSecrets = !ev.Negated
+ case FlagBootstrapFirewallApplyDryRun:
+ cmdBootstrapFirewallApplyV.DryRun = !ev.Negated
+ case FlagBootstrapFirewallApplyYes:
+ cmdBootstrapFirewallApplyV.Yes = !ev.Negated
+ case FlagBootstrapFirewallStatusJson:
+ cmdBootstrapFirewallStatusV.Json = !ev.Negated
+ case FlagBootstrapFirewallStatusMissing:
+ cmdBootstrapFirewallStatusV.Missing = !ev.Negated
+ case FlagBootstrapLaunchdApplyDryRun:
+ cmdBootstrapLaunchdApplyV.DryRun = !ev.Negated
+ case FlagBootstrapLaunchdApplyYes:
+ cmdBootstrapLaunchdApplyV.Yes = !ev.Negated
+ case FlagBootstrapLaunchdStatusJson:
+ cmdBootstrapLaunchdStatusV.Json = !ev.Negated
+ case FlagBootstrapLaunchdStatusMissing:
+ cmdBootstrapLaunchdStatusV.Missing = !ev.Negated
+ case FlagBootstrapLinuxSystemdUnitsApplyDryRun:
+ cmdBootstrapLinuxSystemdUnitsApplyV.DryRun = !ev.Negated
+ case FlagBootstrapLinuxSystemdUnitsApplyYes:
+ cmdBootstrapLinuxSystemdUnitsApplyV.Yes = !ev.Negated
+ case FlagBootstrapLinuxSystemdUnitsStatusJson:
+ cmdBootstrapLinuxSystemdUnitsStatusV.Json = !ev.Negated
+ case FlagBootstrapLinuxSystemdUnitsStatusMissing:
+ cmdBootstrapLinuxSystemdUnitsStatusV.Missing = !ev.Negated
+ case FlagBootstrapMacosDefaultsApplyDryRun:
+ cmdBootstrapMacosDefaultsApplyV.DryRun = !ev.Negated
+ case FlagBootstrapMacosDefaultsApplyYes:
+ cmdBootstrapMacosDefaultsApplyV.Yes = !ev.Negated
+ case FlagBootstrapMacosDefaultsStatusJson:
+ cmdBootstrapMacosDefaultsStatusV.Json = !ev.Negated
+ case FlagBootstrapMacosDefaultsStatusMissing:
+ cmdBootstrapMacosDefaultsStatusV.Missing = !ev.Negated
+ case FlagBootstrapMacosLaunchdAgentsApplyDryRun:
+ cmdBootstrapMacosLaunchdAgentsApplyV.DryRun = !ev.Negated
+ case FlagBootstrapMacosLaunchdAgentsApplyYes:
+ cmdBootstrapMacosLaunchdAgentsApplyV.Yes = !ev.Negated
+ case FlagBootstrapMacosLaunchdAgentsStatusJson:
+ cmdBootstrapMacosLaunchdAgentsStatusV.Json = !ev.Negated
+ case FlagBootstrapMacosLaunchdAgentsStatusMissing:
+ cmdBootstrapMacosLaunchdAgentsStatusV.Missing = !ev.Negated
+ case FlagBootstrapMacosDefaultsApplyDryRun2:
+ cmdBootstrapMacosDefaultsApply2V.DryRun = !ev.Negated
+ case FlagBootstrapMacosDefaultsApplyYes2:
+ cmdBootstrapMacosDefaultsApply2V.Yes = !ev.Negated
+ case FlagBootstrapMacosDefaultsStatusJson2:
+ cmdBootstrapMacosDefaultsStatus2V.Json = !ev.Negated
+ case FlagBootstrapMacosDefaultsStatusMissing2:
+ cmdBootstrapMacosDefaultsStatus2V.Missing = !ev.Negated
+ case FlagBootstrapMiseShellActivateApplyDryRun:
+ cmdBootstrapMiseShellActivateApplyV.DryRun = !ev.Negated
+ case FlagBootstrapMiseShellActivateApplyYes:
+ cmdBootstrapMiseShellActivateApplyV.Yes = !ev.Negated
+ case FlagBootstrapMiseShellActivateStatusJson:
+ cmdBootstrapMiseShellActivateStatusV.Json = !ev.Negated
+ case FlagBootstrapMiseShellActivateStatusMissing:
+ cmdBootstrapMiseShellActivateStatusV.Missing = !ev.Negated
+ case FlagBootstrapPackagesApplyManager:
+ cmdBootstrapPackagesApplyV.Manager = ev.Value
+ case FlagBootstrapPackagesApplyDryRun:
+ cmdBootstrapPackagesApplyV.DryRun = !ev.Negated
+ case FlagBootstrapPackagesApplyYes:
+ cmdBootstrapPackagesApplyV.Yes = !ev.Negated
+ case FlagBootstrapPackagesApplyUpdate:
+ cmdBootstrapPackagesApplyV.Update = !ev.Negated
+ case FlagBootstrapPackagesBrewTapLocal:
+ cmdBootstrapPackagesBrewTapV.Local = !ev.Negated
+ case FlagBootstrapPackagesBrewTapDryRun:
+ cmdBootstrapPackagesBrewTapV.DryRun = !ev.Negated
+ case FlagBootstrapPackagesBrewTapPath:
+ cmdBootstrapPackagesBrewTapV.Path = ev.Value
+ case FlagBootstrapPackagesBrewUntapLocal:
+ cmdBootstrapPackagesBrewUntapV.Local = !ev.Negated
+ case FlagBootstrapPackagesBrewUntapDryRun:
+ cmdBootstrapPackagesBrewUntapV.DryRun = !ev.Negated
+ case FlagBootstrapPackagesBrewUntapPath:
+ cmdBootstrapPackagesBrewUntapV.Path = ev.Value
+ case FlagBootstrapPackagesImportEnv:
+ cmdBootstrapPackagesImportV.Env = ev.Value
+ case FlagBootstrapPackagesImportGlobal:
+ cmdBootstrapPackagesImportV.Global = !ev.Negated
+ case FlagBootstrapPackagesImportManager:
+ cmdBootstrapPackagesImportV.Manager = ev.Value
+ case FlagBootstrapPackagesImportAll:
+ cmdBootstrapPackagesImportV.All = !ev.Negated
+ case FlagBootstrapPackagesImportDryRun:
+ cmdBootstrapPackagesImportV.DryRun = !ev.Negated
+ case FlagBootstrapPackagesImportPath:
+ cmdBootstrapPackagesImportV.Path = ev.Value
+ case FlagBootstrapPackagesPruneManager:
+ cmdBootstrapPackagesPruneV.Manager = ev.Value
+ case FlagBootstrapPackagesPruneDryRun:
+ cmdBootstrapPackagesPruneV.DryRun = !ev.Negated
+ case FlagBootstrapPackagesPruneYes:
+ cmdBootstrapPackagesPruneV.Yes = !ev.Negated
+ case FlagBootstrapPackagesStatusJson:
+ cmdBootstrapPackagesStatusV.Json = !ev.Negated
+ case FlagBootstrapPackagesStatusMissing:
+ cmdBootstrapPackagesStatusV.Missing = !ev.Negated
+ case FlagBootstrapPackagesUpgradeManager:
+ cmdBootstrapPackagesUpgradeV.Manager = ev.Value
+ case FlagBootstrapPackagesUpgradeDryRun:
+ cmdBootstrapPackagesUpgradeV.DryRun = !ev.Negated
+ case FlagBootstrapPackagesUpgradeYes:
+ cmdBootstrapPackagesUpgradeV.Yes = !ev.Negated
+ case FlagBootstrapPackagesUseEnv:
+ cmdBootstrapPackagesUseV.Env = ev.Value
+ case FlagBootstrapPackagesUseGlobal:
+ cmdBootstrapPackagesUseV.Global = !ev.Negated
+ case FlagBootstrapPackagesUseDryRun:
+ cmdBootstrapPackagesUseV.DryRun = !ev.Negated
+ case FlagBootstrapPackagesUsePath:
+ cmdBootstrapPackagesUseV.Path = ev.Value
+ case FlagBootstrapPackagesUseYes:
+ cmdBootstrapPackagesUseV.Yes = !ev.Negated
+ case FlagBootstrapPlanJson:
+ cmdBootstrapPlanV.Json = !ev.Negated
+ case FlagBootstrapPlanDetailedExitcode:
+ cmdBootstrapPlanV.DetailedExitcode = !ev.Negated
+ case FlagBootstrapPlanPromptSecrets:
+ cmdBootstrapPlanV.PromptSecrets = !ev.Negated
+ case FlagBootstrapPluginsApplyDryRun:
+ cmdBootstrapPluginsApplyV.DryRun = !ev.Negated
+ case FlagBootstrapPluginsStatusMissing:
+ cmdBootstrapPluginsStatusV.Missing = !ev.Negated
+ case FlagBootstrapRemoteAll:
+ cmdBootstrapRemoteV.All = !ev.Negated
+ case FlagBootstrapRemoteBootstrapCommand:
+ cmdBootstrapRemoteV.BootstrapCommand = ev.Value
+ case FlagBootstrapRemoteConnectTimeout:
+ cmdBootstrapRemoteV.ConnectTimeout = ev.Value
+ case FlagBootstrapRemoteCopyLink:
+ if ev.HasValue {
+ cmdBootstrapRemoteV.CopyLink = append(cmdBootstrapRemoteV.CopyLink, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagBootstrapRemoteCopyLinks:
+ cmdBootstrapRemoteV.CopyLinks = !ev.Negated
+ case FlagBootstrapRemoteExclude:
+ if ev.HasValue {
+ cmdBootstrapRemoteV.Exclude = append(cmdBootstrapRemoteV.Exclude, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagBootstrapRemoteFailFast:
+ cmdBootstrapRemoteV.FailFast = !ev.Negated
+ case FlagBootstrapRemoteForceDotfiles:
+ cmdBootstrapRemoteV.ForceDotfiles = !ev.Negated
+ case FlagBootstrapRemoteHost:
+ if ev.HasValue {
+ cmdBootstrapRemoteV.Host = append(cmdBootstrapRemoteV.Host, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagBootstrapRemoteIdentityFile:
+ cmdBootstrapRemoteV.IdentityFile = ev.Value
+ case FlagBootstrapRemoteDryRun:
+ cmdBootstrapRemoteV.DryRun = !ev.Negated
+ case FlagBootstrapRemoteKeepStaging:
+ cmdBootstrapRemoteV.KeepStaging = !ev.Negated
+ case FlagBootstrapRemoteMiseBin:
+ cmdBootstrapRemoteV.MiseBin = ev.Value
+ case FlagBootstrapRemoteOnly:
+ if ev.HasValue {
+ cmdBootstrapRemoteV.Only = append(cmdBootstrapRemoteV.Only, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagBootstrapRemotePort:
+ cmdBootstrapRemoteV.Port = ev.Value
+ case FlagBootstrapRemotePromptSecrets:
+ cmdBootstrapRemoteV.PromptSecrets = !ev.Negated
+ case FlagBootstrapRemoteRemoteEnv:
+ if ev.HasValue {
+ cmdBootstrapRemoteV.RemoteEnv = append(cmdBootstrapRemoteV.RemoteEnv, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagBootstrapRemoteRemoteMise:
+ cmdBootstrapRemoteV.RemoteMise = ev.Value
+ case FlagBootstrapRemoteSkip:
+ if ev.HasValue {
+ cmdBootstrapRemoteV.Skip = append(cmdBootstrapRemoteV.Skip, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagBootstrapRemoteSource:
+ cmdBootstrapRemoteV.Source = ev.Value
+ case FlagBootstrapRemoteSshOption:
+ if ev.HasValue {
+ cmdBootstrapRemoteV.SshOption = append(cmdBootstrapRemoteV.SshOption, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagBootstrapRemoteTag:
+ if ev.HasValue {
+ cmdBootstrapRemoteV.Tag = append(cmdBootstrapRemoteV.Tag, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagBootstrapRemoteUpdate:
+ cmdBootstrapRemoteV.Update = !ev.Negated
+ case FlagBootstrapRemoteYes:
+ cmdBootstrapRemoteV.Yes = !ev.Negated
+ case FlagBootstrapReposApplyDryRun:
+ cmdBootstrapReposApplyV.DryRun = !ev.Negated
+ case FlagBootstrapReposApplyYes:
+ cmdBootstrapReposApplyV.Yes = !ev.Negated
+ case FlagBootstrapReposExecContinueOnError:
+ cmdBootstrapReposExecV.ContinueOnError = !ev.Negated
+ case FlagBootstrapReposExecDryRun:
+ cmdBootstrapReposExecV.DryRun = !ev.Negated
+ case FlagBootstrapReposStatusJson:
+ cmdBootstrapReposStatusV.Json = !ev.Negated
+ case FlagBootstrapReposStatusMissing:
+ cmdBootstrapReposStatusV.Missing = !ev.Negated
+ case FlagBootstrapReposUpdateDryRun:
+ cmdBootstrapReposUpdateV.DryRun = !ev.Negated
+ case FlagBootstrapReposUpdateYes:
+ cmdBootstrapReposUpdateV.Yes = !ev.Negated
+ case FlagBootstrapSecretsStatusJson:
+ cmdBootstrapSecretsStatusV.Json = !ev.Negated
+ case FlagBootstrapSecretsStatusMissing:
+ cmdBootstrapSecretsStatusV.Missing = !ev.Negated
+ case FlagBootstrapServicesApplyDryRun:
+ cmdBootstrapServicesApplyV.DryRun = !ev.Negated
+ case FlagBootstrapServicesApplyYes:
+ cmdBootstrapServicesApplyV.Yes = !ev.Negated
+ case FlagBootstrapServicesStatusJson:
+ cmdBootstrapServicesStatusV.Json = !ev.Negated
+ case FlagBootstrapServicesStatusMissing:
+ cmdBootstrapServicesStatusV.Missing = !ev.Negated
+ case FlagBootstrapStatusJson:
+ cmdBootstrapStatusV.Json = !ev.Negated
+ case FlagBootstrapStatusMissing:
+ cmdBootstrapStatusV.Missing = !ev.Negated
+ case FlagBootstrapStatusPromptSecrets:
+ cmdBootstrapStatusV.PromptSecrets = !ev.Negated
+ case FlagBootstrapSystemdApplyDryRun:
+ cmdBootstrapSystemdApplyV.DryRun = !ev.Negated
+ case FlagBootstrapSystemdApplyYes:
+ cmdBootstrapSystemdApplyV.Yes = !ev.Negated
+ case FlagBootstrapSystemdStatusJson:
+ cmdBootstrapSystemdStatusV.Json = !ev.Negated
+ case FlagBootstrapSystemdStatusMissing:
+ cmdBootstrapSystemdStatusV.Missing = !ev.Negated
+ case FlagBootstrapUserApplyDryRun:
+ cmdBootstrapUserApplyV.DryRun = !ev.Negated
+ case FlagBootstrapUserApplyYes:
+ cmdBootstrapUserApplyV.Yes = !ev.Negated
+ case FlagBootstrapUserStatusJson:
+ cmdBootstrapUserStatusV.Json = !ev.Negated
+ case FlagBootstrapUserStatusMissing:
+ cmdBootstrapUserStatusV.Missing = !ev.Negated
+ case FlagCacheClearOutdate:
+ cmdCacheClearV.Outdate = !ev.Negated
+ case FlagCacheClearTask:
+ cmdCacheClearV.Task = ev.Value
+ case FlagCachePruneVerbose:
+ cmdCachePruneV.Verbose++
+ case FlagCachePruneDryRun:
+ cmdCachePruneV.DryRun = !ev.Negated
+ case FlagCacheTaskJson:
+ cmdCacheTaskV.Json = !ev.Negated
+ case FlagCompletionShell:
+ cmdCompletionV.Shell = ev.Value
+ case FlagCompletionIncludeBashCompletionLib:
+ cmdCompletionV.IncludeBashCompletionLib = !ev.Negated
+ case FlagCompletionUsage:
+ cmdCompletionV.Usage = !ev.Negated
+ case FlagConfigJson:
+ cmdConfigV.Json = !ev.Negated
+ case FlagConfigNoHeader:
+ cmdConfigV.NoHeader = !ev.Negated
+ case FlagConfigTrackedConfigs:
+ cmdConfigV.TrackedConfigs = !ev.Negated
+ case FlagConfigGetFile:
+ cmdConfigGetV.File = ev.Value
+ case FlagConfigLsJson:
+ cmdConfigLsV.Json = !ev.Negated
+ case FlagConfigLsNoHeader:
+ cmdConfigLsV.NoHeader = !ev.Negated
+ case FlagConfigLsTrackedConfigs:
+ cmdConfigLsV.TrackedConfigs = !ev.Negated
+ case FlagConfigSetFile:
+ cmdConfigSetV.File = ev.Value
+ case FlagConfigSetType:
+ cmdConfigSetV.Type = ev.Value
+ case FlagDotfilesAddForce:
+ cmdDotfilesAddV.Force = !ev.Negated
+ case FlagDotfilesAddGlobal:
+ cmdDotfilesAddV.Global = !ev.Negated
+ case FlagDotfilesAddLocal:
+ cmdDotfilesAddV.Local = !ev.Negated
+ case FlagDotfilesAddMode:
+ cmdDotfilesAddV.Mode = ev.Value
+ case FlagDotfilesAddDryRun:
+ cmdDotfilesAddV.DryRun = !ev.Negated
+ case FlagDotfilesAddNoApply:
+ cmdDotfilesAddV.NoApply = !ev.Negated
+ case FlagDotfilesAddPath:
+ cmdDotfilesAddV.Path = ev.Value
+ case FlagDotfilesAddSource:
+ cmdDotfilesAddV.Source = ev.Value
+ case FlagDotfilesAddYes:
+ cmdDotfilesAddV.Yes = !ev.Negated
+ case FlagDotfilesApplyForce:
+ cmdDotfilesApplyV.Force = !ev.Negated
+ case FlagDotfilesApplyDryRun:
+ cmdDotfilesApplyV.DryRun = !ev.Negated
+ case FlagDotfilesApplyYes:
+ cmdDotfilesApplyV.Yes = !ev.Negated
+ case FlagDotfilesEditApply:
+ cmdDotfilesEditV.Apply = !ev.Negated
+ case FlagDotfilesEditMode:
+ cmdDotfilesEditV.Mode = ev.Value
+ case FlagDotfilesEditSource:
+ cmdDotfilesEditV.Source = ev.Value
+ case FlagDotfilesEditYes:
+ cmdDotfilesEditV.Yes = !ev.Negated
+ case FlagDotfilesStatusJson:
+ cmdDotfilesStatusV.Json = !ev.Negated
+ case FlagDotfilesStatusMissing:
+ cmdDotfilesStatusV.Missing = !ev.Negated
+ case FlagDotfilesUnapplyForce:
+ cmdDotfilesUnapplyV.Force = !ev.Negated
+ case FlagDotfilesUnapplyDryRun:
+ cmdDotfilesUnapplyV.DryRun = !ev.Negated
+ case FlagDotfilesUnapplyYes:
+ cmdDotfilesUnapplyV.Yes = !ev.Negated
+ case FlagDoctorJson:
+ cmdDoctorV.Json = !ev.Negated
+ case FlagDoctorPathFull:
+ cmdDoctorPathV.Full = !ev.Negated
+ case FlagEnShell:
+ cmdEnV.Shell = ev.Value
+ case FlagEnvDotenv:
+ cmdEnvV.Dotenv = !ev.Negated
+ case FlagEnvJson:
+ cmdEnvV.Json = !ev.Negated
+ case FlagEnvShell:
+ cmdEnvV.Shell = ev.Value
+ case FlagEnvJsonExtended:
+ cmdEnvV.JsonExtended = !ev.Negated
+ case FlagEnvRedacted:
+ cmdEnvV.Redacted = !ev.Negated
+ case FlagEnvValues:
+ cmdEnvV.Values = !ev.Negated
+ case FlagExecCommand:
+ cmdExecV.Command = ev.Value
+ case FlagExecJobs:
+ cmdExecV.Jobs = ev.Value
+ case FlagExecAllowEnv:
+ if ev.HasValue {
+ cmdExecV.AllowEnv = append(cmdExecV.AllowEnv, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagExecAllowNet:
+ if ev.HasValue {
+ cmdExecV.AllowNet = append(cmdExecV.AllowNet, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagExecAllowRead:
+ if ev.HasValue {
+ cmdExecV.AllowRead = append(cmdExecV.AllowRead, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagExecAllowWrite:
+ if ev.HasValue {
+ cmdExecV.AllowWrite = append(cmdExecV.AllowWrite, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagExecDenyAll:
+ cmdExecV.DenyAll = !ev.Negated
+ case FlagExecDenyEnv:
+ cmdExecV.DenyEnv = !ev.Negated
+ case FlagExecDenyNet:
+ cmdExecV.DenyNet = !ev.Negated
+ case FlagExecDenyRead:
+ cmdExecV.DenyRead = !ev.Negated
+ case FlagExecDenyWrite:
+ cmdExecV.DenyWrite = !ev.Negated
+ case FlagExecFreshEnv:
+ cmdExecV.FreshEnv = !ev.Negated
+ case FlagExecNoDeps:
+ cmdExecV.NoDeps = !ev.Negated
+ case FlagExecRaw:
+ cmdExecV.Raw = !ev.Negated
+ case FlagFmtAll:
+ cmdFmtV.All = !ev.Negated
+ case FlagFmtCheck:
+ cmdFmtV.Check = !ev.Negated
+ case FlagFmtStdin:
+ cmdFmtV.Stdin = !ev.Negated
+ case FlagGenerateBootstrapLocalize:
+ cmdGenerateBootstrapV.Localize = !ev.Negated
+ case FlagGenerateBootstrapVersion:
+ cmdGenerateBootstrapV.Version = ev.Value
+ case FlagGenerateBootstrapWrite:
+ cmdGenerateBootstrapV.Write = ev.Value
+ case FlagGenerateBootstrapLocalizedDir:
+ cmdGenerateBootstrapV.LocalizedDir = ev.Value
+ case FlagGenerateBootstrapWindows:
+ cmdGenerateBootstrapV.Windows = !ev.Negated
+ case FlagGenerateConfigGlobal:
+ cmdGenerateConfigV.Global = !ev.Negated
+ case FlagGenerateConfigDryRun:
+ cmdGenerateConfigV.DryRun = !ev.Negated
+ case FlagGenerateConfigToolVersions:
+ cmdGenerateConfigV.ToolVersions = ev.Value
+ case FlagGenerateDevcontainerImage:
+ cmdGenerateDevcontainerV.Image = ev.Value
+ case FlagGenerateDevcontainerMountMiseData:
+ cmdGenerateDevcontainerV.MountMiseData = !ev.Negated
+ case FlagGenerateDevcontainerName:
+ cmdGenerateDevcontainerV.Name = ev.Value
+ case FlagGenerateDevcontainerWrite:
+ cmdGenerateDevcontainerV.Write = !ev.Negated
+ case FlagGenerateGitPreCommitTask:
+ cmdGenerateGitPreCommitV.Task = ev.Value
+ case FlagGenerateGitPreCommitWrite:
+ cmdGenerateGitPreCommitV.Write = !ev.Negated
+ case FlagGenerateGitPreCommitHook:
+ cmdGenerateGitPreCommitV.Hook = ev.Value
+ case FlagGenerateGithubActionTask:
+ cmdGenerateGithubActionV.Task = ev.Value
+ case FlagGenerateGithubActionWrite:
+ cmdGenerateGithubActionV.Write = !ev.Negated
+ case FlagGenerateGithubActionName:
+ cmdGenerateGithubActionV.Name = ev.Value
+ case FlagGenerateTaskDocsInject:
+ cmdGenerateTaskDocsV.Inject = !ev.Negated
+ case FlagGenerateTaskDocsIndex:
+ cmdGenerateTaskDocsV.Index = !ev.Negated
+ case FlagGenerateTaskDocsMulti:
+ cmdGenerateTaskDocsV.Multi = !ev.Negated
+ case FlagGenerateTaskDocsOutput:
+ cmdGenerateTaskDocsV.Output = ev.Value
+ case FlagGenerateTaskDocsRoot:
+ cmdGenerateTaskDocsV.Root = ev.Value
+ case FlagGenerateTaskDocsStyle:
+ cmdGenerateTaskDocsV.Style = ev.Value
+ case FlagGenerateTaskStubsDir:
+ cmdGenerateTaskStubsV.Dir = ev.Value
+ case FlagGenerateTaskStubsMiseBin:
+ cmdGenerateTaskStubsV.MiseBin = ev.Value
+ case FlagGenerateToolStubBin:
+ cmdGenerateToolStubV.Bin = ev.Value
+ case FlagGenerateToolStubBootstrap:
+ cmdGenerateToolStubV.Bootstrap = !ev.Negated
+ case FlagGenerateToolStubBootstrapVersion:
+ cmdGenerateToolStubV.BootstrapVersion = ev.Value
+ case FlagGenerateToolStubChecksumAlgorithm:
+ cmdGenerateToolStubV.ChecksumAlgorithm = ev.Value
+ case FlagGenerateToolStubFetch:
+ cmdGenerateToolStubV.Fetch = !ev.Negated
+ case FlagGenerateToolStubHttp:
+ cmdGenerateToolStubV.Http = ev.Value
+ case FlagGenerateToolStubLock:
+ cmdGenerateToolStubV.Lock = !ev.Negated
+ case FlagGenerateToolStubPlatformBin:
+ if ev.HasValue {
+ cmdGenerateToolStubV.PlatformBin = append(cmdGenerateToolStubV.PlatformBin, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagGenerateToolStubPlatformUrl:
+ if ev.HasValue {
+ cmdGenerateToolStubV.PlatformUrl = append(cmdGenerateToolStubV.PlatformUrl, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagGenerateToolStubSkipDownload:
+ cmdGenerateToolStubV.SkipDownload = !ev.Negated
+ case FlagGenerateToolStubUrl:
+ cmdGenerateToolStubV.Url = ev.Value
+ case FlagGenerateToolStubVersion:
+ cmdGenerateToolStubV.Version = ev.Value
+ case FlagGithubTokenOauth:
+ cmdGithubTokenV.Oauth = !ev.Negated
+ case FlagGithubTokenRaw:
+ cmdGithubTokenV.Raw = !ev.Negated
+ case FlagGithubTokenRefresh:
+ cmdGithubTokenV.Refresh = !ev.Negated
+ case FlagGithubTokenUnmask:
+ cmdGithubTokenV.Unmask = !ev.Negated
+ case FlagGlobalFuzzy:
+ cmdGlobalV.Fuzzy = !ev.Negated
+ case FlagGlobalPath:
+ cmdGlobalV.Path = !ev.Negated
+ case FlagGlobalPin:
+ cmdGlobalV.Pin = !ev.Negated
+ case FlagGlobalRemove:
+ if ev.HasValue {
+ cmdGlobalV.Remove = append(cmdGlobalV.Remove, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagHookEnvForce:
+ cmdHookEnvV.Force = !ev.Negated
+ case FlagHookEnvQuiet:
+ cmdHookEnvV.Quiet = !ev.Negated
+ case FlagHookEnvShell:
+ cmdHookEnvV.Shell = ev.Value
+ case FlagHookEnvReason:
+ cmdHookEnvV.Reason = ev.Value
+ case FlagHookEnvStatus:
+ cmdHookEnvV.Status = !ev.Negated
+ case FlagHookNotFoundShell:
+ cmdHookNotFoundV.Shell = ev.Value
+ case FlagImplodeDryRun:
+ cmdImplodeV.DryRun = !ev.Negated
+ case FlagImplodeConfig:
+ cmdImplodeV.Config = !ev.Negated
+ case FlagEditGlobal:
+ cmdEditV.Global = !ev.Negated
+ case FlagEditDryRun:
+ cmdEditV.DryRun = !ev.Negated
+ case FlagEditToolVersions:
+ cmdEditV.ToolVersions = ev.Value
+ case FlagInstallForce:
+ cmdInstallV.Force = !ev.Negated
+ case FlagInstallJobs:
+ cmdInstallV.Jobs = ev.Value
+ case FlagInstallDryRun:
+ cmdInstallV.DryRun = !ev.Negated
+ case FlagInstallVerbose:
+ cmdInstallV.Verbose++
+ case FlagInstallDryRunCode:
+ cmdInstallV.DryRunCode = !ev.Negated
+ case FlagInstallIncludeTaskTools:
+ cmdInstallV.IncludeTaskTools = !ev.Negated
+ case FlagInstallMinimumReleaseAge:
+ cmdInstallV.MinimumReleaseAge = ev.Value
+ case FlagInstallMonorepo:
+ cmdInstallV.Monorepo = !ev.Negated
+ case FlagInstallRaw:
+ cmdInstallV.Raw = !ev.Negated
+ case FlagInstallShared:
+ cmdInstallV.Shared = ev.Value
+ case FlagInstallSystem:
+ cmdInstallV.System = !ev.Negated
+ case FlagLatestInstalled:
+ cmdLatestV.Installed = !ev.Negated
+ case FlagLatestMinimumReleaseAge:
+ cmdLatestV.MinimumReleaseAge = ev.Value
+ case FlagLinkForce:
+ cmdLinkV.Force = !ev.Negated
+ case FlagLocalParent:
+ cmdLocalV.Parent = !ev.Negated
+ case FlagLocalFuzzy:
+ cmdLocalV.Fuzzy = !ev.Negated
+ case FlagLocalPath:
+ cmdLocalV.Path = !ev.Negated
+ case FlagLocalPin:
+ cmdLocalV.Pin = !ev.Negated
+ case FlagLocalRemove:
+ if ev.HasValue {
+ cmdLocalV.Remove = append(cmdLocalV.Remove, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagLockGlobal:
+ cmdLockV.Global = !ev.Negated
+ case FlagLockJobs:
+ cmdLockV.Jobs = ev.Value
+ case FlagLockDryRun:
+ cmdLockV.DryRun = !ev.Negated
+ case FlagLockPlatform:
+ if ev.HasValue {
+ cmdLockV.Platform = append(cmdLockV.Platform, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagLockBump:
+ cmdLockV.Bump = !ev.Negated
+ case FlagLockJson:
+ cmdLockV.Json = !ev.Negated
+ case FlagLockLocal:
+ cmdLockV.Local = !ev.Negated
+ case FlagLockMinimumReleaseAge:
+ cmdLockV.MinimumReleaseAge = ev.Value
+ case FlagLsCurrent:
+ cmdLsV.Current = !ev.Negated
+ case FlagLsGlobal:
+ cmdLsV.Global = !ev.Negated
+ case FlagLsInstalled:
+ cmdLsV.Installed = !ev.Negated
+ case FlagLsJson:
+ cmdLsV.Json = !ev.Negated
+ case FlagLsLocal:
+ cmdLsV.Local = !ev.Negated
+ case FlagLsMissing:
+ cmdLsV.Missing = !ev.Negated
+ case FlagLsOffline:
+ cmdLsV.Offline = !ev.Negated
+ case FlagLsPlugin:
+ cmdLsV.Plugin = ev.Value
+ case FlagLsAllSources:
+ cmdLsV.AllSources = !ev.Negated
+ case FlagLsMonorepo:
+ cmdLsV.Monorepo = !ev.Negated
+ case FlagLsNoHeader:
+ cmdLsV.NoHeader = !ev.Negated
+ case FlagLsOutdated:
+ cmdLsV.Outdated = !ev.Negated
+ case FlagLsPrefix:
+ cmdLsV.Prefix = ev.Value
+ case FlagLsPrunable:
+ cmdLsV.Prunable = !ev.Negated
+ case FlagLsRemoteAll:
+ cmdLsRemoteV.All = !ev.Negated
+ case FlagLsRemoteMinimumReleaseAge:
+ cmdLsRemoteV.MinimumReleaseAge = ev.Value
+ case FlagLsRemoteJson:
+ cmdLsRemoteV.Json = !ev.Negated
+ case FlagLsRemoteNoVersionsHost:
+ cmdLsRemoteV.NoVersionsHost = !ev.Negated
+ case FlagLsRemotePrerelease:
+ cmdLsRemoteV.Prerelease = !ev.Negated
+ case FlagLsRemoteStrictMetadata:
+ cmdLsRemoteV.StrictMetadata = !ev.Negated
+ case FlagOciBuildCopy:
+ if ev.HasValue {
+ cmdOciBuildV.Copy = append(cmdOciBuildV.Copy, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagOciBuildOutput:
+ cmdOciBuildV.Output = ev.Value
+ case FlagOciBuildFrom:
+ cmdOciBuildV.From = ev.Value
+ case FlagOciBuildIncludeGlobal:
+ cmdOciBuildV.IncludeGlobal = !ev.Negated
+ case FlagOciBuildTag:
+ cmdOciBuildV.Tag = ev.Value
+ case FlagOciBuildMountPoint:
+ cmdOciBuildV.MountPoint = ev.Value
+ case FlagOciBuildNoMise:
+ cmdOciBuildV.NoMise = !ev.Negated
+ case FlagOciBuildOwner:
+ cmdOciBuildV.Owner = ev.Value
+ case FlagOciPushCacheFrom:
+ cmdOciPushV.CacheFrom = ev.Value
+ case FlagOciPushFrom:
+ cmdOciPushV.From = ev.Value
+ case FlagOciPushImageDir:
+ cmdOciPushV.ImageDir = ev.Value
+ case FlagOciPushIncludeGlobal:
+ cmdOciPushV.IncludeGlobal = !ev.Negated
+ case FlagOciPushMountPoint:
+ cmdOciPushV.MountPoint = ev.Value
+ case FlagOciPushNoCache:
+ cmdOciPushV.NoCache = !ev.Negated
+ case FlagOciPushNoMise:
+ cmdOciPushV.NoMise = !ev.Negated
+ case FlagOciPushOwner:
+ cmdOciPushV.Owner = ev.Value
+ case FlagOciPushUpdateIndex:
+ cmdOciPushV.UpdateIndex = !ev.Negated
+ case FlagOciRunEngine:
+ cmdOciRunV.Engine = ev.Value
+ case FlagOciRunFrom:
+ cmdOciRunV.From = ev.Value
+ case FlagOciRunImageDir:
+ cmdOciRunV.ImageDir = ev.Value
+ case FlagOciRunIncludeGlobal:
+ cmdOciRunV.IncludeGlobal = !ev.Negated
+ case FlagOciRunKeep:
+ cmdOciRunV.Keep = !ev.Negated
+ case FlagOciRunMountPoint:
+ cmdOciRunV.MountPoint = ev.Value
+ case FlagOciRunNoMise:
+ cmdOciRunV.NoMise = !ev.Negated
+ case FlagOciRunOwner:
+ cmdOciRunV.Owner = ev.Value
+ case FlagOciRunVolume:
+ if ev.HasValue {
+ cmdOciRunV.Volume = append(cmdOciRunV.Volume, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagOciRunEnv:
+ if ev.HasValue {
+ cmdOciRunV.Env = append(cmdOciRunV.Env, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagOciRunInteractive:
+ cmdOciRunV.Interactive = !ev.Negated
+ case FlagOciRunTty:
+ cmdOciRunV.Tty = !ev.Negated
+ case FlagOciRunWorkdir:
+ cmdOciRunV.Workdir = ev.Value
+ case FlagOutdatedBump:
+ cmdOutdatedV.Bump = !ev.Negated
+ case FlagOutdatedJson:
+ cmdOutdatedV.Json = !ev.Negated
+ case FlagOutdatedL:
+ cmdOutdatedV.L = !ev.Negated
+ case FlagOutdatedInactive:
+ cmdOutdatedV.Inactive = !ev.Negated
+ case FlagOutdatedLocal:
+ cmdOutdatedV.Local = !ev.Negated
+ case FlagOutdatedMonorepo:
+ cmdOutdatedV.Monorepo = !ev.Negated
+ case FlagOutdatedNoHeader:
+ cmdOutdatedV.NoHeader = !ev.Negated
+ case FlagPatronsJson:
+ cmdPatronsV.Json = !ev.Negated
+ case FlagPatronsRefresh:
+ cmdPatronsV.Refresh = !ev.Negated
+ case FlagPluginsAll:
+ cmdPluginsV.All = !ev.Negated
+ case FlagPluginsCore:
+ cmdPluginsV.Core = !ev.Negated
+ case FlagPluginsUrls:
+ cmdPluginsV.Urls = !ev.Negated
+ case FlagPluginsRefs:
+ cmdPluginsV.Refs = !ev.Negated
+ case FlagPluginsUser:
+ cmdPluginsV.User = !ev.Negated
+ case FlagPluginsInstallAll:
+ cmdPluginsInstallV.All = !ev.Negated
+ case FlagPluginsInstallForce:
+ cmdPluginsInstallV.Force = !ev.Negated
+ case FlagPluginsInstallJobs:
+ cmdPluginsInstallV.Jobs = ev.Value
+ case FlagPluginsInstallVerbose:
+ cmdPluginsInstallV.Verbose++
+ case FlagPluginsLinkForce:
+ cmdPluginsLinkV.Force = !ev.Negated
+ case FlagPluginsLsAll:
+ cmdPluginsLsV.All = !ev.Negated
+ case FlagPluginsLsCore:
+ cmdPluginsLsV.Core = !ev.Negated
+ case FlagPluginsLsOutdated:
+ cmdPluginsLsV.Outdated = !ev.Negated
+ case FlagPluginsLsUrls:
+ cmdPluginsLsV.Urls = !ev.Negated
+ case FlagPluginsLsRefs:
+ cmdPluginsLsV.Refs = !ev.Negated
+ case FlagPluginsLsUser:
+ cmdPluginsLsV.User = !ev.Negated
+ case FlagPluginsLsRemoteUrls:
+ cmdPluginsLsRemoteV.Urls = !ev.Negated
+ case FlagPluginsLsRemoteOnlyNames:
+ cmdPluginsLsRemoteV.OnlyNames = !ev.Negated
+ case FlagPluginsUninstallAll:
+ cmdPluginsUninstallV.All = !ev.Negated
+ case FlagPluginsUninstallPurge:
+ cmdPluginsUninstallV.Purge = !ev.Negated
+ case FlagPluginsUpdateJobs:
+ cmdPluginsUpdateV.Jobs = ev.Value
+ case FlagDepsExplain:
+ cmdDepsV.Explain = !ev.Negated
+ case FlagDepsForce:
+ cmdDepsV.Force = !ev.Negated
+ case FlagDepsDryRun:
+ cmdDepsV.DryRun = !ev.Negated
+ case FlagDepsList:
+ cmdDepsV.List = !ev.Negated
+ case FlagDepsMonorepo:
+ cmdDepsV.Monorepo = !ev.Negated
+ case FlagDepsOnly:
+ if ev.HasValue {
+ cmdDepsV.Only = append(cmdDepsV.Only, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagDepsSkip:
+ if ev.HasValue {
+ cmdDepsV.Skip = append(cmdDepsV.Skip, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagDepsAddDev:
+ cmdDepsAddV.Dev = !ev.Negated
+ case FlagDepsInstallExplain:
+ cmdDepsInstallV.Explain = !ev.Negated
+ case FlagDepsInstallForce:
+ cmdDepsInstallV.Force = !ev.Negated
+ case FlagDepsInstallDryRun:
+ cmdDepsInstallV.DryRun = !ev.Negated
+ case FlagDepsInstallList:
+ cmdDepsInstallV.List = !ev.Negated
+ case FlagDepsInstallMonorepo:
+ cmdDepsInstallV.Monorepo = !ev.Negated
+ case FlagDepsInstallOnly:
+ if ev.HasValue {
+ cmdDepsInstallV.Only = append(cmdDepsInstallV.Only, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagDepsInstallSkip:
+ if ev.HasValue {
+ cmdDepsInstallV.Skip = append(cmdDepsInstallV.Skip, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagPruneDryRun:
+ cmdPruneV.DryRun = !ev.Negated
+ case FlagPruneConfigs:
+ cmdPruneV.Configs = !ev.Negated
+ case FlagPruneDryRunCode:
+ cmdPruneV.DryRunCode = !ev.Negated
+ case FlagPruneMonorepo:
+ cmdPruneV.Monorepo = !ev.Negated
+ case FlagPruneTools:
+ cmdPruneV.Tools = !ev.Negated
+ case FlagRegistryBackend:
+ cmdRegistryV.Backend = ev.Value
+ case FlagRegistryComplete:
+ cmdRegistryV.Complete = !ev.Negated
+ case FlagRegistryHideAliased:
+ cmdRegistryV.HideAliased = !ev.Negated
+ case FlagRegistryJson:
+ cmdRegistryV.Json = !ev.Negated
+ case FlagRegistrySecurity:
+ cmdRegistryV.Security = !ev.Negated
+ case FlagReshimForce:
+ cmdReshimV.Force = !ev.Negated
+ case FlagRunAffected:
+ cmdRunV.Affected = !ev.Negated
+ case FlagRunAffectedBase:
+ cmdRunV.AffectedBase = ev.Value
+ case FlagRunAffectedExplain:
+ cmdRunV.AffectedExplain = !ev.Negated
+ case FlagRunAffectedHead:
+ cmdRunV.AffectedHead = ev.Value
+ case FlagRunAffectedJson:
+ cmdRunV.AffectedJson = !ev.Negated
+ case FlagRunAll:
+ cmdRunV.All = !ev.Negated
+ case FlagRunContinueOnError:
+ cmdRunV.ContinueOnError = !ev.Negated
+ case FlagRunCd:
+ cmdRunV.Cd = ev.Value
+ case FlagRunForce:
+ cmdRunV.Force = !ev.Negated
+ case FlagRunJobs:
+ cmdRunV.Jobs = ev.Value
+ case FlagRunDryRun:
+ cmdRunV.DryRun = !ev.Negated
+ case FlagRunOutput:
+ cmdRunV.Output = ev.Value
+ case FlagRunQuiet:
+ cmdRunV.Quiet = !ev.Negated
+ case FlagRunRaw:
+ cmdRunV.Raw = !ev.Negated
+ case FlagRunShell:
+ cmdRunV.Shell = ev.Value
+ case FlagRunSilent:
+ cmdRunV.Silent = !ev.Negated
+ case FlagRunTool:
+ if ev.HasValue {
+ cmdRunV.Tool = append(cmdRunV.Tool, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagRunAllowEnv:
+ if ev.HasValue {
+ cmdRunV.AllowEnv = append(cmdRunV.AllowEnv, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagRunAllowNet:
+ if ev.HasValue {
+ cmdRunV.AllowNet = append(cmdRunV.AllowNet, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagRunAllowRead:
+ if ev.HasValue {
+ cmdRunV.AllowRead = append(cmdRunV.AllowRead, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagRunAllowWrite:
+ if ev.HasValue {
+ cmdRunV.AllowWrite = append(cmdRunV.AllowWrite, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagRunDenyAll:
+ cmdRunV.DenyAll = !ev.Negated
+ case FlagRunDenyEnv:
+ cmdRunV.DenyEnv = !ev.Negated
+ case FlagRunDenyNet:
+ cmdRunV.DenyNet = !ev.Negated
+ case FlagRunDenyRead:
+ cmdRunV.DenyRead = !ev.Negated
+ case FlagRunDenyWrite:
+ cmdRunV.DenyWrite = !ev.Negated
+ case FlagRunFreshEnv:
+ cmdRunV.FreshEnv = !ev.Negated
+ case FlagRunNoCache:
+ cmdRunV.NoCache = !ev.Negated
+ case FlagRunNoDeps:
+ cmdRunV.NoDeps = !ev.Negated
+ case FlagRunNoTimings:
+ cmdRunV.NoTimings = !ev.Negated
+ case FlagRunSkipDeps:
+ cmdRunV.SkipDeps = !ev.Negated
+ case FlagRunSkipTools:
+ cmdRunV.SkipTools = !ev.Negated
+ case FlagRunTaskCache:
+ cmdRunV.TaskCache = ev.Value
+ case FlagRunTaskCacheExplain:
+ cmdRunV.TaskCacheExplain = !ev.Negated
+ case FlagRunTaskCacheExplainJson:
+ cmdRunV.TaskCacheExplainJson = !ev.Negated
+ case FlagRunTaskCacheStats:
+ cmdRunV.TaskCacheStats = !ev.Negated
+ case FlagRunTimeout:
+ cmdRunV.Timeout = ev.Value
+ case FlagRunTimings:
+ cmdRunV.Timings = !ev.Negated
+ case FlagSearchInteractive:
+ cmdSearchV.Interactive = !ev.Negated
+ case FlagSearchMatchType:
+ cmdSearchV.MatchType = ev.Value
+ case FlagSearchNoHeader:
+ cmdSearchV.NoHeader = !ev.Negated
+ case FlagSelfUpdateForce:
+ cmdSelfUpdateV.Force = !ev.Negated
+ case FlagSelfUpdateYes:
+ cmdSelfUpdateV.Yes = !ev.Negated
+ case FlagSelfUpdateNoPlugins:
+ cmdSelfUpdateV.NoPlugins = !ev.Negated
+ case FlagSetEnv:
+ cmdSetV.Env = ev.Value
+ case FlagSetGlobal:
+ cmdSetV.Global = !ev.Negated
+ case FlagSetAgeEncrypt:
+ cmdSetV.AgeEncrypt = !ev.Negated
+ case FlagSetAgeKeyFile:
+ cmdSetV.AgeKeyFile = ev.Value
+ case FlagSetAgeRecipient:
+ if ev.HasValue {
+ cmdSetV.AgeRecipient = append(cmdSetV.AgeRecipient, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagSetAgeSshRecipient:
+ if ev.HasValue {
+ cmdSetV.AgeSshRecipient = append(cmdSetV.AgeSshRecipient, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagSetComplete:
+ cmdSetV.Complete = !ev.Negated
+ case FlagSetFile:
+ cmdSetV.File = ev.Value
+ case FlagSetNoRedact:
+ cmdSetV.NoRedact = !ev.Negated
+ case FlagSetPrompt:
+ cmdSetV.Prompt = !ev.Negated
+ case FlagSetRemove:
+ if ev.HasValue {
+ cmdSetV.Remove = append(cmdSetV.Remove, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagSetStdin:
+ cmdSetV.Stdin = !ev.Negated
+ case FlagSettingsAll:
+ cmdSettingsV.All = !ev.Negated
+ case FlagSettingsJson:
+ cmdSettingsV.Json = !ev.Negated
+ case FlagSettingsLocal:
+ cmdSettingsV.Local = !ev.Negated
+ case FlagSettingsToml:
+ cmdSettingsV.Toml = !ev.Negated
+ case FlagSettingsComplete:
+ cmdSettingsV.Complete = !ev.Negated
+ case FlagSettingsJsonExtended:
+ cmdSettingsV.JsonExtended = !ev.Negated
+ case FlagSettingsAddLocal:
+ cmdSettingsAddV.Local = !ev.Negated
+ case FlagSettingsGetLocal:
+ cmdSettingsGetV.Local = !ev.Negated
+ case FlagSettingsLsAll:
+ cmdSettingsLsV.All = !ev.Negated
+ case FlagSettingsLsJson:
+ cmdSettingsLsV.Json = !ev.Negated
+ case FlagSettingsLsLocal:
+ cmdSettingsLsV.Local = !ev.Negated
+ case FlagSettingsLsToml:
+ cmdSettingsLsV.Toml = !ev.Negated
+ case FlagSettingsLsComplete:
+ cmdSettingsLsV.Complete = !ev.Negated
+ case FlagSettingsLsJsonExtended:
+ cmdSettingsLsV.JsonExtended = !ev.Negated
+ case FlagSettingsSetLocal:
+ cmdSettingsSetV.Local = !ev.Negated
+ case FlagSettingsUnsetLocal:
+ cmdSettingsUnsetV.Local = !ev.Negated
+ case FlagShellJobs:
+ cmdShellV.Jobs = ev.Value
+ case FlagShellUnset:
+ cmdShellV.Unset = !ev.Negated
+ case FlagShellRaw:
+ cmdShellV.Raw = !ev.Negated
+ case FlagShellAliasNoHeader:
+ cmdShellAliasV.NoHeader = !ev.Negated
+ case FlagShellAliasLsNoHeader:
+ cmdShellAliasLsV.NoHeader = !ev.Negated
+ case FlagSyncNodeBrew:
+ cmdSyncNodeV.Brew = !ev.Negated
+ case FlagSyncNodeNodenv:
+ cmdSyncNodeV.Nodenv = !ev.Negated
+ case FlagSyncNodeNvm:
+ cmdSyncNodeV.Nvm = !ev.Negated
+ case FlagSyncPythonPyenv:
+ cmdSyncPythonV.Pyenv = !ev.Negated
+ case FlagSyncPythonUv:
+ cmdSyncPythonV.Uv = !ev.Negated
+ case FlagSyncRubyBrew:
+ cmdSyncRubyV.Brew = !ev.Negated
+ case FlagTasksGlobal:
+ cmdTasksV.Global = !ev.Negated
+ case FlagTasksJson:
+ cmdTasksV.Json = !ev.Negated
+ case FlagTasksLocal:
+ cmdTasksV.Local = !ev.Negated
+ case FlagTasksExtended:
+ cmdTasksV.Extended = !ev.Negated
+ case FlagTasksAll:
+ cmdTasksV.All = !ev.Negated
+ case FlagTasksComplete:
+ cmdTasksV.Complete = !ev.Negated
+ case FlagTasksHidden:
+ cmdTasksV.Hidden = !ev.Negated
+ case FlagTasksNameOnly:
+ cmdTasksV.NameOnly = !ev.Negated
+ case FlagTasksNoHeader:
+ cmdTasksV.NoHeader = !ev.Negated
+ case FlagTasksSort:
+ cmdTasksV.Sort = ev.Value
+ case FlagTasksSortOrder:
+ cmdTasksV.SortOrder = ev.Value
+ case FlagTasksUsage:
+ cmdTasksV.Usage = !ev.Negated
+ case FlagTasksAddAlias:
+ if ev.HasValue {
+ cmdTasksAddV.Alias = append(cmdTasksAddV.Alias, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagTasksAddDepends:
+ if ev.HasValue {
+ cmdTasksAddV.Depends = append(cmdTasksAddV.Depends, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagTasksAddDir:
+ cmdTasksAddV.Dir = ev.Value
+ case FlagTasksAddFile:
+ cmdTasksAddV.File = !ev.Negated
+ case FlagTasksAddHide:
+ cmdTasksAddV.Hide = !ev.Negated
+ case FlagTasksAddQuiet:
+ cmdTasksAddV.Quiet = !ev.Negated
+ case FlagTasksAddRaw:
+ cmdTasksAddV.Raw = !ev.Negated
+ case FlagTasksAddSources:
+ if ev.HasValue {
+ cmdTasksAddV.Sources = append(cmdTasksAddV.Sources, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagTasksAddWaitFor:
+ if ev.HasValue {
+ cmdTasksAddV.WaitFor = append(cmdTasksAddV.WaitFor, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagTasksAddDependsPost:
+ if ev.HasValue {
+ cmdTasksAddV.DependsPost = append(cmdTasksAddV.DependsPost, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagTasksAddDescription:
+ cmdTasksAddV.Description = ev.Value
+ case FlagTasksAddOutputs:
+ if ev.HasValue {
+ cmdTasksAddV.Outputs = append(cmdTasksAddV.Outputs, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagTasksAddRunWindows:
+ cmdTasksAddV.RunWindows = ev.Value
+ case FlagTasksAddShell:
+ cmdTasksAddV.Shell = ev.Value
+ case FlagTasksAddSilent:
+ cmdTasksAddV.Silent = !ev.Negated
+ case FlagTasksDepsCompact:
+ cmdTasksDepsV.Compact = !ev.Negated
+ case FlagTasksDepsDot:
+ cmdTasksDepsV.Dot = !ev.Negated
+ case FlagTasksDepsHidden:
+ cmdTasksDepsV.Hidden = !ev.Negated
+ case FlagTasksEditPath:
+ cmdTasksEditV.Path = !ev.Negated
+ case FlagTasksGraphJson:
+ cmdTasksGraphV.Json = !ev.Negated
+ case FlagTasksGraphExplain:
+ cmdTasksGraphV.Explain = !ev.Negated
+ case FlagTasksGraphNoHeader:
+ cmdTasksGraphV.NoHeader = !ev.Negated
+ case FlagTasksInfoJson:
+ cmdTasksInfoV.Json = !ev.Negated
+ case FlagTasksLsGlobal:
+ cmdTasksLsV.Global = !ev.Negated
+ case FlagTasksLsJson:
+ cmdTasksLsV.Json = !ev.Negated
+ case FlagTasksLsLocal:
+ cmdTasksLsV.Local = !ev.Negated
+ case FlagTasksLsExtended:
+ cmdTasksLsV.Extended = !ev.Negated
+ case FlagTasksLsAll:
+ cmdTasksLsV.All = !ev.Negated
+ case FlagTasksLsComplete:
+ cmdTasksLsV.Complete = !ev.Negated
+ case FlagTasksLsHidden:
+ cmdTasksLsV.Hidden = !ev.Negated
+ case FlagTasksLsNameOnly:
+ cmdTasksLsV.NameOnly = !ev.Negated
+ case FlagTasksLsNoHeader:
+ cmdTasksLsV.NoHeader = !ev.Negated
+ case FlagTasksLsSort:
+ cmdTasksLsV.Sort = ev.Value
+ case FlagTasksLsSortOrder:
+ cmdTasksLsV.SortOrder = ev.Value
+ case FlagTasksLsUsage:
+ cmdTasksLsV.Usage = !ev.Negated
+ case FlagTasksRunAffected:
+ cmdTasksRunV.Affected = !ev.Negated
+ case FlagTasksRunAffectedBase:
+ cmdTasksRunV.AffectedBase = ev.Value
+ case FlagTasksRunAffectedExplain:
+ cmdTasksRunV.AffectedExplain = !ev.Negated
+ case FlagTasksRunAffectedHead:
+ cmdTasksRunV.AffectedHead = ev.Value
+ case FlagTasksRunAffectedJson:
+ cmdTasksRunV.AffectedJson = !ev.Negated
+ case FlagTasksRunAll:
+ cmdTasksRunV.All = !ev.Negated
+ case FlagTasksRunContinueOnError:
+ cmdTasksRunV.ContinueOnError = !ev.Negated
+ case FlagTasksRunCd:
+ cmdTasksRunV.Cd = ev.Value
+ case FlagTasksRunForce:
+ cmdTasksRunV.Force = !ev.Negated
+ case FlagTasksRunJobs:
+ cmdTasksRunV.Jobs = ev.Value
+ case FlagTasksRunDryRun:
+ cmdTasksRunV.DryRun = !ev.Negated
+ case FlagTasksRunOutput:
+ cmdTasksRunV.Output = ev.Value
+ case FlagTasksRunQuiet:
+ cmdTasksRunV.Quiet = !ev.Negated
+ case FlagTasksRunRaw:
+ cmdTasksRunV.Raw = !ev.Negated
+ case FlagTasksRunShell:
+ cmdTasksRunV.Shell = ev.Value
+ case FlagTasksRunSilent:
+ cmdTasksRunV.Silent = !ev.Negated
+ case FlagTasksRunTool:
+ if ev.HasValue {
+ cmdTasksRunV.Tool = append(cmdTasksRunV.Tool, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagTasksRunAllowEnv:
+ if ev.HasValue {
+ cmdTasksRunV.AllowEnv = append(cmdTasksRunV.AllowEnv, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagTasksRunAllowNet:
+ if ev.HasValue {
+ cmdTasksRunV.AllowNet = append(cmdTasksRunV.AllowNet, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagTasksRunAllowRead:
+ if ev.HasValue {
+ cmdTasksRunV.AllowRead = append(cmdTasksRunV.AllowRead, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagTasksRunAllowWrite:
+ if ev.HasValue {
+ cmdTasksRunV.AllowWrite = append(cmdTasksRunV.AllowWrite, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagTasksRunDenyAll:
+ cmdTasksRunV.DenyAll = !ev.Negated
+ case FlagTasksRunDenyEnv:
+ cmdTasksRunV.DenyEnv = !ev.Negated
+ case FlagTasksRunDenyNet:
+ cmdTasksRunV.DenyNet = !ev.Negated
+ case FlagTasksRunDenyRead:
+ cmdTasksRunV.DenyRead = !ev.Negated
+ case FlagTasksRunDenyWrite:
+ cmdTasksRunV.DenyWrite = !ev.Negated
+ case FlagTasksRunFreshEnv:
+ cmdTasksRunV.FreshEnv = !ev.Negated
+ case FlagTasksRunNoCache:
+ cmdTasksRunV.NoCache = !ev.Negated
+ case FlagTasksRunNoDeps:
+ cmdTasksRunV.NoDeps = !ev.Negated
+ case FlagTasksRunNoTimings:
+ cmdTasksRunV.NoTimings = !ev.Negated
+ case FlagTasksRunSkipDeps:
+ cmdTasksRunV.SkipDeps = !ev.Negated
+ case FlagTasksRunSkipTools:
+ cmdTasksRunV.SkipTools = !ev.Negated
+ case FlagTasksRunTaskCache:
+ cmdTasksRunV.TaskCache = ev.Value
+ case FlagTasksRunTaskCacheExplain:
+ cmdTasksRunV.TaskCacheExplain = !ev.Negated
+ case FlagTasksRunTaskCacheExplainJson:
+ cmdTasksRunV.TaskCacheExplainJson = !ev.Negated
+ case FlagTasksRunTaskCacheStats:
+ cmdTasksRunV.TaskCacheStats = !ev.Negated
+ case FlagTasksRunTimeout:
+ cmdTasksRunV.Timeout = ev.Value
+ case FlagTasksRunTimings:
+ cmdTasksRunV.Timings = !ev.Negated
+ case FlagTasksValidateErrorsOnly:
+ cmdTasksValidateV.ErrorsOnly = !ev.Negated
+ case FlagTasksValidateJson:
+ cmdTasksValidateV.Json = !ev.Negated
+ case FlagTestToolAll:
+ cmdTestToolV.All = !ev.Negated
+ case FlagTestToolJobs:
+ cmdTestToolV.Jobs = ev.Value
+ case FlagTestToolAllConfig:
+ cmdTestToolV.AllConfig = !ev.Negated
+ case FlagTestToolIncludeNonDefined:
+ cmdTestToolV.IncludeNonDefined = !ev.Negated
+ case FlagTestToolRaw:
+ cmdTestToolV.Raw = !ev.Negated
+ case FlagTokenForgejoUnmask:
+ cmdTokenForgejoV.Unmask = !ev.Negated
+ case FlagTokenGithubOauth:
+ cmdTokenGithubV.Oauth = !ev.Negated
+ case FlagTokenGithubRaw:
+ cmdTokenGithubV.Raw = !ev.Negated
+ case FlagTokenGithubRefresh:
+ cmdTokenGithubV.Refresh = !ev.Negated
+ case FlagTokenGithubUnmask:
+ cmdTokenGithubV.Unmask = !ev.Negated
+ case FlagTokenGitlabUnmask:
+ cmdTokenGitlabV.Unmask = !ev.Negated
+ case FlagToolJson:
+ cmdToolV.Json = !ev.Negated
+ case FlagToolActive:
+ cmdToolV.Active = !ev.Negated
+ case FlagToolBackend:
+ cmdToolV.Backend = !ev.Negated
+ case FlagToolConfigSource:
+ cmdToolV.ConfigSource = !ev.Negated
+ case FlagToolDescription:
+ cmdToolV.Description = !ev.Negated
+ case FlagToolInstalled:
+ cmdToolV.Installed = !ev.Negated
+ case FlagToolRequested:
+ cmdToolV.Requested = !ev.Negated
+ case FlagToolToolOptions:
+ cmdToolV.ToolOptions = !ev.Negated
+ case FlagTrustAll:
+ cmdTrustV.All = !ev.Negated
+ case FlagTrustIgnore:
+ cmdTrustV.Ignore = !ev.Negated
+ case FlagTrustShow:
+ cmdTrustV.Show = !ev.Negated
+ case FlagTrustUntrust:
+ cmdTrustV.Untrust = !ev.Negated
+ case FlagUninstallAll:
+ cmdUninstallV.All = !ev.Negated
+ case FlagUninstallDryRun:
+ cmdUninstallV.DryRun = !ev.Negated
+ case FlagUninstallDryRunCode:
+ cmdUninstallV.DryRunCode = !ev.Negated
+ case FlagUnsetFile:
+ cmdUnsetV.File = ev.Value
+ case FlagUnsetGlobal:
+ cmdUnsetV.Global = !ev.Negated
+ case FlagUnuseEnv:
+ cmdUnuseV.Env = ev.Value
+ case FlagUnuseGlobal:
+ cmdUnuseV.Global = !ev.Negated
+ case FlagUnusePath:
+ cmdUnuseV.Path = ev.Value
+ case FlagUnuseNoPrune:
+ cmdUnuseV.NoPrune = !ev.Negated
+ case FlagUpgradeBump:
+ cmdUpgradeV.Bump = !ev.Negated
+ case FlagUpgradeInteractive:
+ cmdUpgradeV.Interactive = !ev.Negated
+ case FlagUpgradeJobs:
+ cmdUpgradeV.Jobs = ev.Value
+ case FlagUpgradeL:
+ cmdUpgradeV.L = !ev.Negated
+ case FlagUpgradeDryRun:
+ cmdUpgradeV.DryRun = !ev.Negated
+ case FlagUpgradeExclude:
+ if ev.HasValue {
+ cmdUpgradeV.Exclude = append(cmdUpgradeV.Exclude, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagUpgradeDryRunCode:
+ cmdUpgradeV.DryRunCode = !ev.Negated
+ case FlagUpgradeInactive:
+ cmdUpgradeV.Inactive = !ev.Negated
+ case FlagUpgradeLocal:
+ cmdUpgradeV.Local = !ev.Negated
+ case FlagUpgradeMinimumReleaseAge:
+ cmdUpgradeV.MinimumReleaseAge = ev.Value
+ case FlagUpgradeMonorepo:
+ cmdUpgradeV.Monorepo = !ev.Negated
+ case FlagUpgradeNoPrune:
+ cmdUpgradeV.NoPrune = !ev.Negated
+ case FlagUpgradePrune:
+ cmdUpgradeV.Prune = !ev.Negated
+ case FlagUpgradeRaw:
+ cmdUpgradeV.Raw = !ev.Negated
+ case FlagUseEnv:
+ cmdUseV.Env = ev.Value
+ case FlagUseForce:
+ cmdUseV.Force = !ev.Negated
+ case FlagUseGlobal:
+ cmdUseV.Global = !ev.Negated
+ case FlagUseJobs:
+ cmdUseV.Jobs = ev.Value
+ case FlagUseDryRun:
+ cmdUseV.DryRun = !ev.Negated
+ case FlagUsePath:
+ cmdUseV.Path = ev.Value
+ case FlagUseDryRunCode:
+ cmdUseV.DryRunCode = !ev.Negated
+ case FlagUseFuzzy:
+ cmdUseV.Fuzzy = !ev.Negated
+ case FlagUseMinimumReleaseAge:
+ cmdUseV.MinimumReleaseAge = ev.Value
+ case FlagUsePin:
+ cmdUseV.Pin = !ev.Negated
+ case FlagUseRaw:
+ cmdUseV.Raw = !ev.Negated
+ case FlagUseRemove:
+ if ev.HasValue {
+ cmdUseV.Remove = append(cmdUseV.Remove, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagVersionJson:
+ cmdVersionV.Json = !ev.Negated
+ case FlagWatchTaskFlag:
+ if ev.HasValue {
+ cmdWatchV.TaskFlag = append(cmdWatchV.TaskFlag, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagWatchGlob:
+ if ev.HasValue {
+ cmdWatchV.Glob = append(cmdWatchV.Glob, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagWatchSkipDeps:
+ cmdWatchV.SkipDeps = !ev.Negated
+ case FlagWatchWatch:
+ if ev.HasValue {
+ cmdWatchV.Watch = append(cmdWatchV.Watch, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagWatchWatchNonRecursive:
+ if ev.HasValue {
+ cmdWatchV.WatchNonRecursive = append(cmdWatchV.WatchNonRecursive, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagWatchWatchFile:
+ cmdWatchV.WatchFile = ev.Value
+ case FlagWatchClear:
+ cmdWatchV.Clear = ev.Value
+ case FlagWatchOnBusyUpdate:
+ cmdWatchV.OnBusyUpdate = ev.Value
+ case FlagWatchRestart:
+ cmdWatchV.Restart = !ev.Negated
+ case FlagWatchSignal:
+ cmdWatchV.Signal = ev.Value
+ case FlagWatchStopSignal:
+ cmdWatchV.StopSignal = ev.Value
+ case FlagWatchStopTimeout:
+ cmdWatchV.StopTimeout = ev.Value
+ case FlagWatchMapSignal:
+ if ev.HasValue {
+ cmdWatchV.MapSignal = append(cmdWatchV.MapSignal, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagWatchDebounce:
+ cmdWatchV.Debounce = ev.Value
+ case FlagWatchStdinQuit:
+ cmdWatchV.StdinQuit = !ev.Negated
+ case FlagWatchNoVcsIgnore:
+ cmdWatchV.NoVcsIgnore = !ev.Negated
+ case FlagWatchNoProjectIgnore:
+ cmdWatchV.NoProjectIgnore = !ev.Negated
+ case FlagWatchNoGlobalIgnore:
+ cmdWatchV.NoGlobalIgnore = !ev.Negated
+ case FlagWatchNoDefaultIgnore:
+ cmdWatchV.NoDefaultIgnore = !ev.Negated
+ case FlagWatchNoDiscoverIgnore:
+ cmdWatchV.NoDiscoverIgnore = !ev.Negated
+ case FlagWatchIgnoreNothing:
+ cmdWatchV.IgnoreNothing = !ev.Negated
+ case FlagWatchPostpone:
+ cmdWatchV.Postpone = !ev.Negated
+ case FlagWatchDelayRun:
+ cmdWatchV.DelayRun = ev.Value
+ case FlagWatchPoll:
+ cmdWatchV.Poll = ev.Value
+ case FlagWatchShell:
+ cmdWatchV.Shell = ev.Value
+ case FlagWatchN:
+ cmdWatchV.N = !ev.Negated
+ case FlagWatchEmitEventsTo:
+ cmdWatchV.EmitEventsTo = ev.Value
+ case FlagWatchOnlyEmitEvents:
+ cmdWatchV.OnlyEmitEvents = !ev.Negated
+ case FlagWatchEnv:
+ if ev.HasValue {
+ cmdWatchV.Env = append(cmdWatchV.Env, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagWatchWrapProcess:
+ cmdWatchV.WrapProcess = ev.Value
+ case FlagWatchNotify:
+ cmdWatchV.Notify = !ev.Negated
+ case FlagWatchColor:
+ cmdWatchV.Color = ev.Value
+ case FlagWatchTimings:
+ cmdWatchV.Timings = !ev.Negated
+ case FlagWatchQuiet:
+ cmdWatchV.Quiet = !ev.Negated
+ case FlagWatchBell:
+ cmdWatchV.Bell = !ev.Negated
+ case FlagWatchProjectOrigin:
+ cmdWatchV.ProjectOrigin = ev.Value
+ case FlagWatchWorkdir:
+ cmdWatchV.Workdir = ev.Value
+ case FlagWatchExts:
+ if ev.HasValue {
+ cmdWatchV.Exts = append(cmdWatchV.Exts, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagWatchFilter:
+ if ev.HasValue {
+ cmdWatchV.Filter = append(cmdWatchV.Filter, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagWatchFilterFile:
+ if ev.HasValue {
+ cmdWatchV.FilterFile = append(cmdWatchV.FilterFile, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagWatchFilterProg:
+ if ev.HasValue {
+ cmdWatchV.FilterProg = append(cmdWatchV.FilterProg, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagWatchIgnore:
+ if ev.HasValue {
+ cmdWatchV.Ignore = append(cmdWatchV.Ignore, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagWatchIgnoreFile:
+ if ev.HasValue {
+ cmdWatchV.IgnoreFile = append(cmdWatchV.IgnoreFile, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagWatchFsEvents:
+ if ev.HasValue {
+ cmdWatchV.FsEvents = append(cmdWatchV.FsEvents, argv.SplitValue(ev.Value, ev.Flag.Delimiter, true)...)
+ }
+ case FlagWatchNoMeta:
+ cmdWatchV.NoMeta = !ev.Negated
+ case FlagWatchPrintEvents:
+ cmdWatchV.PrintEvents = !ev.Negated
+ case FlagWatchManual:
+ cmdWatchV.Manual = !ev.Negated
+ case FlagWhichTool:
+ cmdWhichV.Tool = ev.Value
+ case FlagWhichComplete:
+ cmdWhichV.Complete = !ev.Negated
+ case FlagWhichPlugin:
+ cmdWhichV.Plugin = !ev.Negated
+ case FlagWhichVersion:
+ cmdWhichV.Version = !ev.Negated
+ }
+ case argv.KindArg:
+ seen[ev.Arg.Key]++
+ values := argv.SplitValue(ev.Value, ev.Arg.Delimiter, ev.Delimit)
+ given[ev.Arg.Key] = append(given[ev.Arg.Key], values...)
+ switch ev.Arg.Key {
+ case ArgTask:
+ out.Task = ev.Value
+ case ArgTaskArgs:
+ out.TaskArgs = append(out.TaskArgs, values...)
+ case ArgTaskArgsLast:
+ out.TaskArgsLast = append(out.TaskArgsLast, values...)
+ case ArgActivateShellType:
+ cmdActivateV.ShellType = ev.Value
+ case ArgToolAliasGetTool:
+ cmdToolAliasGetV.Tool = ev.Value
+ case ArgToolAliasGetAlias:
+ cmdToolAliasGetV.Alias = ev.Value
+ case ArgToolAliasLsTool:
+ cmdToolAliasLsV.Tool = ev.Value
+ case ArgToolAliasSetTool:
+ cmdToolAliasSetV.Tool = ev.Value
+ case ArgToolAliasSetAlias:
+ cmdToolAliasSetV.Alias = ev.Value
+ case ArgToolAliasSetValue:
+ cmdToolAliasSetV.Value = ev.Value
+ case ArgToolAliasUnsetTool:
+ cmdToolAliasUnsetV.Tool = ev.Value
+ case ArgToolAliasUnsetAlias:
+ cmdToolAliasUnsetV.Alias = ev.Value
+ case ArgAsdfArgs:
+ cmdAsdfV.Args = append(cmdAsdfV.Args, values...)
+ case ArgBinPathsToolVersion:
+ cmdBinPathsV.ToolVersion = append(cmdBinPathsV.ToolVersion, values...)
+ case ArgBootstrapDotfilesAddTarget:
+ cmdBootstrapDotfilesAddV.Target = append(cmdBootstrapDotfilesAddV.Target, values...)
+ case ArgBootstrapDotfilesApplyTarget:
+ cmdBootstrapDotfilesApplyV.Target = append(cmdBootstrapDotfilesApplyV.Target, values...)
+ case ArgBootstrapDotfilesEditTarget:
+ cmdBootstrapDotfilesEditV.Target = ev.Value
+ case ArgBootstrapDotfilesStatusTarget:
+ cmdBootstrapDotfilesStatusV.Target = append(cmdBootstrapDotfilesStatusV.Target, values...)
+ case ArgBootstrapDotfilesUnapplyTarget:
+ cmdBootstrapDotfilesUnapplyV.Target = append(cmdBootstrapDotfilesUnapplyV.Target, values...)
+ case ArgBootstrapPackagesApplyPackage:
+ cmdBootstrapPackagesApplyV.Package = append(cmdBootstrapPackagesApplyV.Package, values...)
+ case ArgBootstrapPackagesBrewTapTap:
+ cmdBootstrapPackagesBrewTapV.Tap = ev.Value
+ case ArgBootstrapPackagesBrewTapUrl:
+ cmdBootstrapPackagesBrewTapV.Url = ev.Value
+ case ArgBootstrapPackagesBrewUntapTaps:
+ cmdBootstrapPackagesBrewUntapV.Taps = append(cmdBootstrapPackagesBrewUntapV.Taps, values...)
+ case ArgBootstrapPackagesUpgradePackage:
+ cmdBootstrapPackagesUpgradeV.Package = append(cmdBootstrapPackagesUpgradeV.Package, values...)
+ case ArgBootstrapPackagesUsePackage:
+ cmdBootstrapPackagesUseV.Package = append(cmdBootstrapPackagesUseV.Package, values...)
+ case ArgBootstrapRemoteTarget:
+ cmdBootstrapRemoteV.Target = append(cmdBootstrapRemoteV.Target, values...)
+ case ArgBootstrapReposExecPath:
+ cmdBootstrapReposExecV.Path = append(cmdBootstrapReposExecV.Path, values...)
+ case ArgBootstrapReposExecCommand:
+ cmdBootstrapReposExecV.Command = append(cmdBootstrapReposExecV.Command, values...)
+ case ArgBootstrapReposUpdatePath:
+ cmdBootstrapReposUpdateV.Path = append(cmdBootstrapReposUpdateV.Path, values...)
+ case ArgCacheClearTool:
+ cmdCacheClearV.Tool = append(cmdCacheClearV.Tool, values...)
+ case ArgCachePruneTool:
+ cmdCachePruneV.Tool = append(cmdCachePruneV.Tool, values...)
+ case ArgCacheTaskTask:
+ cmdCacheTaskV.Task = ev.Value
+ case ArgCompletionShell:
+ cmdCompletionV.ShellArg = ev.Value
+ case ArgConfigGetKey:
+ cmdConfigGetV.Key = ev.Value
+ case ArgConfigSetKey:
+ cmdConfigSetV.Key = ev.Value
+ case ArgConfigSetValue:
+ cmdConfigSetV.Value = ev.Value
+ case ArgCurrentPlugin:
+ cmdCurrentV.Plugin = ev.Value
+ case ArgDotfilesAddTarget:
+ cmdDotfilesAddV.Target = append(cmdDotfilesAddV.Target, values...)
+ case ArgDotfilesApplyTarget:
+ cmdDotfilesApplyV.Target = append(cmdDotfilesApplyV.Target, values...)
+ case ArgDotfilesEditTarget:
+ cmdDotfilesEditV.Target = ev.Value
+ case ArgDotfilesStatusTarget:
+ cmdDotfilesStatusV.Target = append(cmdDotfilesStatusV.Target, values...)
+ case ArgDotfilesUnapplyTarget:
+ cmdDotfilesUnapplyV.Target = append(cmdDotfilesUnapplyV.Target, values...)
+ case ArgEnDir:
+ cmdEnV.Dir = ev.Value
+ case ArgEnvToolVersion:
+ cmdEnvV.ToolVersion = append(cmdEnvV.ToolVersion, values...)
+ case ArgExecToolVersion:
+ cmdExecV.ToolVersion = append(cmdExecV.ToolVersion, values...)
+ case ArgExecCommand:
+ cmdExecV.CommandArg = append(cmdExecV.CommandArg, values...)
+ case ArgGenerateConfigPath:
+ cmdGenerateConfigV.Path = ev.Value
+ case ArgGenerateGitPreCommitMiseArg:
+ cmdGenerateGitPreCommitV.MiseArg = append(cmdGenerateGitPreCommitV.MiseArg, values...)
+ case ArgGenerateToolStubOutput:
+ cmdGenerateToolStubV.Output = ev.Value
+ case ArgGithubTokenHost:
+ cmdGithubTokenV.Host = ev.Value
+ case ArgGlobalToolVersion:
+ cmdGlobalV.ToolVersion = append(cmdGlobalV.ToolVersion, values...)
+ case ArgHookNotFoundBin:
+ cmdHookNotFoundV.Bin = ev.Value
+ case ArgEditPath:
+ cmdEditV.Path = ev.Value
+ case ArgInstallToolVersion:
+ cmdInstallV.ToolVersion = append(cmdInstallV.ToolVersion, values...)
+ case ArgInstallIntoToolVersion:
+ cmdInstallIntoV.ToolVersion = ev.Value
+ case ArgInstallIntoPath:
+ cmdInstallIntoV.Path = ev.Value
+ case ArgLatestToolVersion:
+ cmdLatestV.ToolVersion = ev.Value
+ case ArgLatestAsdfVersion:
+ cmdLatestV.AsdfVersion = ev.Value
+ case ArgLinkToolVersion:
+ cmdLinkV.ToolVersion = ev.Value
+ case ArgLinkPath:
+ cmdLinkV.Path = ev.Value
+ case ArgLocalToolVersion:
+ cmdLocalV.ToolVersion = append(cmdLocalV.ToolVersion, values...)
+ case ArgLockTool:
+ cmdLockV.Tool = append(cmdLockV.Tool, values...)
+ case ArgLsInstalledTool:
+ cmdLsV.InstalledTool = append(cmdLsV.InstalledTool, values...)
+ case ArgLsRemoteToolVersion:
+ cmdLsRemoteV.ToolVersion = ev.Value
+ case ArgLsRemotePrefix:
+ cmdLsRemoteV.Prefix = ev.Value
+ case ArgOciPushRef:
+ cmdOciPushV.Ref = ev.Value
+ case ArgOciRunCmd:
+ cmdOciRunV.Cmd = append(cmdOciRunV.Cmd, values...)
+ case ArgOutdatedToolVersion:
+ cmdOutdatedV.ToolVersion = append(cmdOutdatedV.ToolVersion, values...)
+ case ArgPluginsInstallNewPlugin:
+ cmdPluginsInstallV.NewPlugin = ev.Value
+ case ArgPluginsInstallGitUrl:
+ cmdPluginsInstallV.GitUrl = ev.Value
+ case ArgPluginsInstallRest:
+ cmdPluginsInstallV.Rest = append(cmdPluginsInstallV.Rest, values...)
+ case ArgPluginsLinkName:
+ cmdPluginsLinkV.Name = ev.Value
+ case ArgPluginsLinkDir:
+ cmdPluginsLinkV.Dir = ev.Value
+ case ArgPluginsUninstallPlugin:
+ cmdPluginsUninstallV.Plugin = append(cmdPluginsUninstallV.Plugin, values...)
+ case ArgPluginsUpdatePlugin:
+ cmdPluginsUpdateV.Plugin = append(cmdPluginsUpdateV.Plugin, values...)
+ case ArgDepsProvider:
+ cmdDepsV.Provider = ev.Value
+ case ArgDepsAddPackages:
+ cmdDepsAddV.Packages = append(cmdDepsAddV.Packages, values...)
+ case ArgDepsInstallProvider:
+ cmdDepsInstallV.Provider = ev.Value
+ case ArgDepsRemovePackages:
+ cmdDepsRemoveV.Packages = append(cmdDepsRemoveV.Packages, values...)
+ case ArgPruneInstalledTool:
+ cmdPruneV.InstalledTool = append(cmdPruneV.InstalledTool, values...)
+ case ArgRegistryName:
+ cmdRegistryV.Name = ev.Value
+ case ArgReshimTool:
+ cmdReshimV.Tool = ev.Value
+ case ArgReshimVersion:
+ cmdReshimV.Version = ev.Value
+ case ArgSearchName:
+ cmdSearchV.Name = ev.Value
+ case ArgSelfUpdateVersion:
+ cmdSelfUpdateV.Version = ev.Value
+ case ArgSetEnvVar:
+ cmdSetV.EnvVar = append(cmdSetV.EnvVar, values...)
+ case ArgSettingsSetting:
+ cmdSettingsV.Setting = ev.Value
+ case ArgSettingsValue:
+ cmdSettingsV.Value = ev.Value
+ case ArgSettingsAddSetting:
+ cmdSettingsAddV.Setting = ev.Value
+ case ArgSettingsAddValue:
+ cmdSettingsAddV.Value = ev.Value
+ case ArgSettingsGetSetting:
+ cmdSettingsGetV.Setting = ev.Value
+ case ArgSettingsLsSetting:
+ cmdSettingsLsV.Setting = ev.Value
+ case ArgSettingsSetSetting:
+ cmdSettingsSetV.Setting = ev.Value
+ case ArgSettingsSetValue:
+ cmdSettingsSetV.Value = ev.Value
+ case ArgSettingsUnsetKey:
+ cmdSettingsUnsetV.Key = ev.Value
+ case ArgShellToolVersion:
+ cmdShellV.ToolVersion = append(cmdShellV.ToolVersion, values...)
+ case ArgShellAliasGetShellAlias:
+ cmdShellAliasGetV.ShellAlias = ev.Value
+ case ArgShellAliasSetShellAlias:
+ cmdShellAliasSetV.ShellAlias = ev.Value
+ case ArgShellAliasSetCommand:
+ cmdShellAliasSetV.Command = ev.Value
+ case ArgShellAliasUnsetShellAlias:
+ cmdShellAliasUnsetV.ShellAlias = ev.Value
+ case ArgTasksTask:
+ cmdTasksV.Task = ev.Value
+ case ArgTasksAddTask:
+ cmdTasksAddV.Task = ev.Value
+ case ArgTasksAddRun:
+ cmdTasksAddV.Run = append(cmdTasksAddV.Run, values...)
+ case ArgTasksDepsTasks:
+ cmdTasksDepsV.Tasks = append(cmdTasksDepsV.Tasks, values...)
+ case ArgTasksEditTask:
+ cmdTasksEditV.Task = ev.Value
+ case ArgTasksInfoTask:
+ cmdTasksInfoV.Task = ev.Value
+ case ArgTasksRunTask:
+ cmdTasksRunV.Task = ev.Value
+ case ArgTasksRunArgs:
+ cmdTasksRunV.Args = append(cmdTasksRunV.Args, values...)
+ case ArgTasksRunArgsLast:
+ cmdTasksRunV.ArgsLast = append(cmdTasksRunV.ArgsLast, values...)
+ case ArgTasksValidateTasks:
+ cmdTasksValidateV.Tasks = append(cmdTasksValidateV.Tasks, values...)
+ case ArgTestToolTools:
+ cmdTestToolV.Tools = append(cmdTestToolV.Tools, values...)
+ case ArgTokenForgejoHost:
+ cmdTokenForgejoV.Host = ev.Value
+ case ArgTokenGithubHost:
+ cmdTokenGithubV.Host = ev.Value
+ case ArgTokenGitlabHost:
+ cmdTokenGitlabV.Host = ev.Value
+ case ArgToolTool:
+ cmdToolV.Tool = ev.Value
+ case ArgToolStubFile:
+ cmdToolStubV.File = ev.Value
+ case ArgToolStubArgs:
+ cmdToolStubV.Args = append(cmdToolStubV.Args, values...)
+ case ArgTrustConfigFile:
+ cmdTrustV.ConfigFile = ev.Value
+ case ArgUninstallInstalledToolVersion:
+ cmdUninstallV.InstalledToolVersion = append(cmdUninstallV.InstalledToolVersion, values...)
+ case ArgUnsetEnvKey:
+ cmdUnsetV.EnvKey = append(cmdUnsetV.EnvKey, values...)
+ case ArgUntrustConfigFile:
+ cmdUntrustV.ConfigFile = ev.Value
+ case ArgUnuseInstalledToolVersion:
+ cmdUnuseV.InstalledToolVersion = append(cmdUnuseV.InstalledToolVersion, values...)
+ case ArgUpgradeInstalledToolVersion:
+ cmdUpgradeV.InstalledToolVersion = append(cmdUpgradeV.InstalledToolVersion, values...)
+ case ArgUseToolVersion:
+ cmdUseV.ToolVersion = append(cmdUseV.ToolVersion, values...)
+ case ArgWatchTask:
+ cmdWatchV.Task = ev.Value
+ case ArgWatchArgs:
+ cmdWatchV.Args = append(cmdWatchV.Args, values...)
+ case ArgWhereToolVersion:
+ cmdWhereV.ToolVersion = ev.Value
+ case ArgWhereAsdfVersion:
+ cmdWhereV.AsdfVersion = ev.Value
+ case ArgWhichBinName:
+ cmdWhichV.BinName = ev.Value
+ }
+ }
+ }
+ if err := p.Err(); err != nil {
+ return nil, err
+ }
+ if p.Command().ArgRequiredElseHelp && p.CommandStart() == len(args) {
+ return nil, &argv.Error{Code: argv.CodeHelp, Cmd: p.Command()}
+ }
+
+ // Only the commands the words actually selected are judged: a required
+ // flag on a command nobody ran is not missing.
+ var scope []uint64
+ requirements := map[uint64]bool{}
+ for i, cmd := range chain {
+ checkRequirements := i == len(chain)-1 || !cmd.SubcommandNegatesReqs
+ for _, f := range cmd.Flags {
+ scope = append(scope, f.Key)
+ requirements[f.Key] = checkRequirements
+ }
+ for _, a := range cmd.Args {
+ scope = append(scope, a.Key)
+ requirements[a.Key] = checkRequirements
+ }
+ }
+ sources := map[uint64]argv.Source{}
+ filled := map[uint64][]string{}
+ for _, key := range scope {
+ values, source := argv.Fill(Meta.Lookup(key), given[key], argv.LookupEnv)
+ filled[key] = values
+ sources[key] = source
+ }
+ argv.ApplyDefaultIf(Meta, scope, filled, sources, nil)
+ for _, key := range scope {
+ values, source := filled[key], sources[key]
+ entryMeta := Meta.Lookup(key)
+ if entryMeta != nil && !requirements[key] {
+ copy := *entryMeta
+ copy.Required = false
+ entryMeta = ©
+ }
+ if err := argv.Check(entryMeta, values, seen[key]); err != nil {
+ return nil, err
+ }
+ // What the environment or a default supplied has to reach the field
+ // too. A front door that enforces a default and then hands back the
+ // zero value is worse than one that has no defaults at all.
+ //
+ // Written here rather than in a function of its own because a
+ // subcommand's struct is reachable only from inside this one: the
+ // variable holding it is local, and only the keys of commands the
+ // words selected are in scope, so it is never nil when its key is.
+ if source == argv.FromEnv || source == argv.FromDefault {
+ switch key {
+ case FlagContinueOnError:
+ if source == argv.FromEnv {
+ out.ContinueOnError = argv.EnvTruth(values[0])
+ } else {
+ out.ContinueOnError = values[0] == "true"
+ }
+ case FlagCd:
+ out.Cd = values[len(values)-1]
+ case FlagEnv:
+ out.Env = append(out.Env, values...)
+ case FlagForce:
+ if source == argv.FromEnv {
+ out.Force = argv.EnvTruth(values[0])
+ } else {
+ out.Force = values[0] == "true"
+ }
+ case FlagJobs:
+ out.Jobs = values[len(values)-1]
+ case FlagDryRun:
+ if source == argv.FromEnv {
+ out.DryRun = argv.EnvTruth(values[0])
+ } else {
+ out.DryRun = values[0] == "true"
+ }
+ case FlagProfile:
+ out.Profile = append(out.Profile, values...)
+ case FlagQuiet:
+ if source == argv.FromEnv {
+ out.Quiet = argv.EnvTruth(values[0])
+ } else {
+ out.Quiet = values[0] == "true"
+ }
+ case FlagShell:
+ out.Shell = values[len(values)-1]
+ case FlagTool:
+ out.Tool = append(out.Tool, values...)
+ case FlagVersion:
+ if source == argv.FromEnv {
+ out.Version = argv.EnvTruth(values[0])
+ } else {
+ out.Version = values[0] == "true"
+ }
+ case FlagYes:
+ if source == argv.FromEnv {
+ out.Yes = argv.EnvTruth(values[0])
+ } else {
+ out.Yes = values[0] == "true"
+ }
+ case FlagDebug:
+ if source == argv.FromEnv {
+ out.Debug = argv.EnvTruth(values[0])
+ } else {
+ out.Debug = values[0] == "true"
+ }
+ case FlagLogLevel:
+ out.LogLevel = values[len(values)-1]
+ case FlagNoConfig:
+ if source == argv.FromEnv {
+ out.NoConfig = argv.EnvTruth(values[0])
+ } else {
+ out.NoConfig = values[0] == "true"
+ }
+ case FlagNoEnv:
+ if source == argv.FromEnv {
+ out.NoEnv = argv.EnvTruth(values[0])
+ } else {
+ out.NoEnv = values[0] == "true"
+ }
+ case FlagNoHooks:
+ if source == argv.FromEnv {
+ out.NoHooks = argv.EnvTruth(values[0])
+ } else {
+ out.NoHooks = values[0] == "true"
+ }
+ case FlagNoTimings:
+ if source == argv.FromEnv {
+ out.NoTimings = argv.EnvTruth(values[0])
+ } else {
+ out.NoTimings = values[0] == "true"
+ }
+ case FlagOutput:
+ out.Output = values[len(values)-1]
+ case FlagRaw:
+ if source == argv.FromEnv {
+ out.Raw = argv.EnvTruth(values[0])
+ } else {
+ out.Raw = values[0] == "true"
+ }
+ case FlagLocked:
+ if source == argv.FromEnv {
+ out.Locked = argv.EnvTruth(values[0])
+ } else {
+ out.Locked = values[0] == "true"
+ }
+ case FlagSilent:
+ if source == argv.FromEnv {
+ out.Silent = argv.EnvTruth(values[0])
+ } else {
+ out.Silent = values[0] == "true"
+ }
+ case FlagTimings:
+ if source == argv.FromEnv {
+ out.Timings = argv.EnvTruth(values[0])
+ } else {
+ out.Timings = values[0] == "true"
+ }
+ case FlagTrace:
+ if source == argv.FromEnv {
+ out.Trace = argv.EnvTruth(values[0])
+ } else {
+ out.Trace = values[0] == "true"
+ }
+ case ArgTask:
+ out.Task = values[len(values)-1]
+ case ArgTaskArgs:
+ out.TaskArgs = append(out.TaskArgs, values...)
+ case ArgTaskArgsLast:
+ out.TaskArgsLast = append(out.TaskArgsLast, values...)
+ case FlagActivateQuiet:
+ if source == argv.FromEnv {
+ cmdActivateV.Quiet = argv.EnvTruth(values[0])
+ } else {
+ cmdActivateV.Quiet = values[0] == "true"
+ }
+ case FlagActivateShell:
+ cmdActivateV.Shell = values[len(values)-1]
+ case FlagActivateNoHookEnv:
+ if source == argv.FromEnv {
+ cmdActivateV.NoHookEnv = argv.EnvTruth(values[0])
+ } else {
+ cmdActivateV.NoHookEnv = values[0] == "true"
+ }
+ case FlagActivateShims:
+ if source == argv.FromEnv {
+ cmdActivateV.Shims = argv.EnvTruth(values[0])
+ } else {
+ cmdActivateV.Shims = values[0] == "true"
+ }
+ case FlagActivateStatus:
+ if source == argv.FromEnv {
+ cmdActivateV.Status = argv.EnvTruth(values[0])
+ } else {
+ cmdActivateV.Status = values[0] == "true"
+ }
+ case ArgActivateShellType:
+ cmdActivateV.ShellType = values[len(values)-1]
+ case FlagToolAliasTool:
+ cmdToolAliasV.Tool = values[len(values)-1]
+ case FlagToolAliasNoHeader:
+ if source == argv.FromEnv {
+ cmdToolAliasV.NoHeader = argv.EnvTruth(values[0])
+ } else {
+ cmdToolAliasV.NoHeader = values[0] == "true"
+ }
+ case ArgToolAliasGetTool:
+ cmdToolAliasGetV.Tool = values[len(values)-1]
+ case ArgToolAliasGetAlias:
+ cmdToolAliasGetV.Alias = values[len(values)-1]
+ case FlagToolAliasLsNoHeader:
+ if source == argv.FromEnv {
+ cmdToolAliasLsV.NoHeader = argv.EnvTruth(values[0])
+ } else {
+ cmdToolAliasLsV.NoHeader = values[0] == "true"
+ }
+ case ArgToolAliasLsTool:
+ cmdToolAliasLsV.Tool = values[len(values)-1]
+ case ArgToolAliasSetTool:
+ cmdToolAliasSetV.Tool = values[len(values)-1]
+ case ArgToolAliasSetAlias:
+ cmdToolAliasSetV.Alias = values[len(values)-1]
+ case ArgToolAliasSetValue:
+ cmdToolAliasSetV.Value = values[len(values)-1]
+ case ArgToolAliasUnsetTool:
+ cmdToolAliasUnsetV.Tool = values[len(values)-1]
+ case ArgToolAliasUnsetAlias:
+ cmdToolAliasUnsetV.Alias = values[len(values)-1]
+ case ArgAsdfArgs:
+ cmdAsdfV.Args = append(cmdAsdfV.Args, values...)
+ case FlagBinPathsBinNames:
+ if source == argv.FromEnv {
+ cmdBinPathsV.BinNames = argv.EnvTruth(values[0])
+ } else {
+ cmdBinPathsV.BinNames = values[0] == "true"
+ }
+ case FlagBinPathsJson:
+ if source == argv.FromEnv {
+ cmdBinPathsV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBinPathsV.Json = values[0] == "true"
+ }
+ case ArgBinPathsToolVersion:
+ cmdBinPathsV.ToolVersion = append(cmdBinPathsV.ToolVersion, values...)
+ case FlagBootstrapDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapYes:
+ if source == argv.FromEnv {
+ cmdBootstrapV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapV.Yes = values[0] == "true"
+ }
+ case FlagBootstrapForceDotfiles:
+ if source == argv.FromEnv {
+ cmdBootstrapV.ForceDotfiles = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapV.ForceDotfiles = values[0] == "true"
+ }
+ case FlagBootstrapOnly:
+ cmdBootstrapV.Only = append(cmdBootstrapV.Only, values...)
+ case FlagBootstrapPromptSecrets:
+ if source == argv.FromEnv {
+ cmdBootstrapV.PromptSecrets = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapV.PromptSecrets = values[0] == "true"
+ }
+ case FlagBootstrapSkip:
+ cmdBootstrapV.Skip = append(cmdBootstrapV.Skip, values...)
+ case FlagBootstrapUpdate:
+ if source == argv.FromEnv {
+ cmdBootstrapV.Update = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapV.Update = values[0] == "true"
+ }
+ case FlagBootstrapAccountsApplyDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapAccountsApplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapAccountsApplyV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapAccountsApplyYes:
+ if source == argv.FromEnv {
+ cmdBootstrapAccountsApplyV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapAccountsApplyV.Yes = values[0] == "true"
+ }
+ case FlagBootstrapAccountsStatusJson:
+ if source == argv.FromEnv {
+ cmdBootstrapAccountsStatusV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapAccountsStatusV.Json = values[0] == "true"
+ }
+ case FlagBootstrapAccountsStatusMissing:
+ if source == argv.FromEnv {
+ cmdBootstrapAccountsStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapAccountsStatusV.Missing = values[0] == "true"
+ }
+ case FlagBootstrapComposeApplyDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapComposeApplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapComposeApplyV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapComposeApplyYes:
+ if source == argv.FromEnv {
+ cmdBootstrapComposeApplyV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapComposeApplyV.Yes = values[0] == "true"
+ }
+ case FlagBootstrapComposeStatusJson:
+ if source == argv.FromEnv {
+ cmdBootstrapComposeStatusV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapComposeStatusV.Json = values[0] == "true"
+ }
+ case FlagBootstrapComposeStatusMissing:
+ if source == argv.FromEnv {
+ cmdBootstrapComposeStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapComposeStatusV.Missing = values[0] == "true"
+ }
+ case FlagBootstrapDotfilesAddForce:
+ if source == argv.FromEnv {
+ cmdBootstrapDotfilesAddV.Force = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapDotfilesAddV.Force = values[0] == "true"
+ }
+ case FlagBootstrapDotfilesAddGlobal:
+ if source == argv.FromEnv {
+ cmdBootstrapDotfilesAddV.Global = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapDotfilesAddV.Global = values[0] == "true"
+ }
+ case FlagBootstrapDotfilesAddLocal:
+ if source == argv.FromEnv {
+ cmdBootstrapDotfilesAddV.Local = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapDotfilesAddV.Local = values[0] == "true"
+ }
+ case FlagBootstrapDotfilesAddMode:
+ cmdBootstrapDotfilesAddV.Mode = values[len(values)-1]
+ case FlagBootstrapDotfilesAddDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapDotfilesAddV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapDotfilesAddV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapDotfilesAddNoApply:
+ if source == argv.FromEnv {
+ cmdBootstrapDotfilesAddV.NoApply = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapDotfilesAddV.NoApply = values[0] == "true"
+ }
+ case FlagBootstrapDotfilesAddPath:
+ cmdBootstrapDotfilesAddV.Path = values[len(values)-1]
+ case FlagBootstrapDotfilesAddSource:
+ cmdBootstrapDotfilesAddV.Source = values[len(values)-1]
+ case FlagBootstrapDotfilesAddYes:
+ if source == argv.FromEnv {
+ cmdBootstrapDotfilesAddV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapDotfilesAddV.Yes = values[0] == "true"
+ }
+ case ArgBootstrapDotfilesAddTarget:
+ cmdBootstrapDotfilesAddV.Target = append(cmdBootstrapDotfilesAddV.Target, values...)
+ case FlagBootstrapDotfilesApplyForce:
+ if source == argv.FromEnv {
+ cmdBootstrapDotfilesApplyV.Force = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapDotfilesApplyV.Force = values[0] == "true"
+ }
+ case FlagBootstrapDotfilesApplyDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapDotfilesApplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapDotfilesApplyV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapDotfilesApplyYes:
+ if source == argv.FromEnv {
+ cmdBootstrapDotfilesApplyV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapDotfilesApplyV.Yes = values[0] == "true"
+ }
+ case ArgBootstrapDotfilesApplyTarget:
+ cmdBootstrapDotfilesApplyV.Target = append(cmdBootstrapDotfilesApplyV.Target, values...)
+ case FlagBootstrapDotfilesEditApply:
+ if source == argv.FromEnv {
+ cmdBootstrapDotfilesEditV.Apply = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapDotfilesEditV.Apply = values[0] == "true"
+ }
+ case FlagBootstrapDotfilesEditMode:
+ cmdBootstrapDotfilesEditV.Mode = values[len(values)-1]
+ case FlagBootstrapDotfilesEditSource:
+ cmdBootstrapDotfilesEditV.Source = values[len(values)-1]
+ case FlagBootstrapDotfilesEditYes:
+ if source == argv.FromEnv {
+ cmdBootstrapDotfilesEditV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapDotfilesEditV.Yes = values[0] == "true"
+ }
+ case ArgBootstrapDotfilesEditTarget:
+ cmdBootstrapDotfilesEditV.Target = values[len(values)-1]
+ case FlagBootstrapDotfilesStatusJson:
+ if source == argv.FromEnv {
+ cmdBootstrapDotfilesStatusV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapDotfilesStatusV.Json = values[0] == "true"
+ }
+ case FlagBootstrapDotfilesStatusMissing:
+ if source == argv.FromEnv {
+ cmdBootstrapDotfilesStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapDotfilesStatusV.Missing = values[0] == "true"
+ }
+ case ArgBootstrapDotfilesStatusTarget:
+ cmdBootstrapDotfilesStatusV.Target = append(cmdBootstrapDotfilesStatusV.Target, values...)
+ case FlagBootstrapDotfilesUnapplyForce:
+ if source == argv.FromEnv {
+ cmdBootstrapDotfilesUnapplyV.Force = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapDotfilesUnapplyV.Force = values[0] == "true"
+ }
+ case FlagBootstrapDotfilesUnapplyDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapDotfilesUnapplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapDotfilesUnapplyV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapDotfilesUnapplyYes:
+ if source == argv.FromEnv {
+ cmdBootstrapDotfilesUnapplyV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapDotfilesUnapplyV.Yes = values[0] == "true"
+ }
+ case ArgBootstrapDotfilesUnapplyTarget:
+ cmdBootstrapDotfilesUnapplyV.Target = append(cmdBootstrapDotfilesUnapplyV.Target, values...)
+ case FlagBootstrapFilesApplyDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapFilesApplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapFilesApplyV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapFilesApplyYes:
+ if source == argv.FromEnv {
+ cmdBootstrapFilesApplyV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapFilesApplyV.Yes = values[0] == "true"
+ }
+ case FlagBootstrapFilesApplyPromptSecrets:
+ if source == argv.FromEnv {
+ cmdBootstrapFilesApplyV.PromptSecrets = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapFilesApplyV.PromptSecrets = values[0] == "true"
+ }
+ case FlagBootstrapFilesStatusJson:
+ if source == argv.FromEnv {
+ cmdBootstrapFilesStatusV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapFilesStatusV.Json = values[0] == "true"
+ }
+ case FlagBootstrapFilesStatusMissing:
+ if source == argv.FromEnv {
+ cmdBootstrapFilesStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapFilesStatusV.Missing = values[0] == "true"
+ }
+ case FlagBootstrapFilesStatusPromptSecrets:
+ if source == argv.FromEnv {
+ cmdBootstrapFilesStatusV.PromptSecrets = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapFilesStatusV.PromptSecrets = values[0] == "true"
+ }
+ case FlagBootstrapFirewallApplyDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapFirewallApplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapFirewallApplyV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapFirewallApplyYes:
+ if source == argv.FromEnv {
+ cmdBootstrapFirewallApplyV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapFirewallApplyV.Yes = values[0] == "true"
+ }
+ case FlagBootstrapFirewallStatusJson:
+ if source == argv.FromEnv {
+ cmdBootstrapFirewallStatusV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapFirewallStatusV.Json = values[0] == "true"
+ }
+ case FlagBootstrapFirewallStatusMissing:
+ if source == argv.FromEnv {
+ cmdBootstrapFirewallStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapFirewallStatusV.Missing = values[0] == "true"
+ }
+ case FlagBootstrapLaunchdApplyDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapLaunchdApplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapLaunchdApplyV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapLaunchdApplyYes:
+ if source == argv.FromEnv {
+ cmdBootstrapLaunchdApplyV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapLaunchdApplyV.Yes = values[0] == "true"
+ }
+ case FlagBootstrapLaunchdStatusJson:
+ if source == argv.FromEnv {
+ cmdBootstrapLaunchdStatusV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapLaunchdStatusV.Json = values[0] == "true"
+ }
+ case FlagBootstrapLaunchdStatusMissing:
+ if source == argv.FromEnv {
+ cmdBootstrapLaunchdStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapLaunchdStatusV.Missing = values[0] == "true"
+ }
+ case FlagBootstrapLinuxSystemdUnitsApplyDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapLinuxSystemdUnitsApplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapLinuxSystemdUnitsApplyV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapLinuxSystemdUnitsApplyYes:
+ if source == argv.FromEnv {
+ cmdBootstrapLinuxSystemdUnitsApplyV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapLinuxSystemdUnitsApplyV.Yes = values[0] == "true"
+ }
+ case FlagBootstrapLinuxSystemdUnitsStatusJson:
+ if source == argv.FromEnv {
+ cmdBootstrapLinuxSystemdUnitsStatusV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapLinuxSystemdUnitsStatusV.Json = values[0] == "true"
+ }
+ case FlagBootstrapLinuxSystemdUnitsStatusMissing:
+ if source == argv.FromEnv {
+ cmdBootstrapLinuxSystemdUnitsStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapLinuxSystemdUnitsStatusV.Missing = values[0] == "true"
+ }
+ case FlagBootstrapMacosDefaultsApplyDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapMacosDefaultsApplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapMacosDefaultsApplyV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapMacosDefaultsApplyYes:
+ if source == argv.FromEnv {
+ cmdBootstrapMacosDefaultsApplyV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapMacosDefaultsApplyV.Yes = values[0] == "true"
+ }
+ case FlagBootstrapMacosDefaultsStatusJson:
+ if source == argv.FromEnv {
+ cmdBootstrapMacosDefaultsStatusV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapMacosDefaultsStatusV.Json = values[0] == "true"
+ }
+ case FlagBootstrapMacosDefaultsStatusMissing:
+ if source == argv.FromEnv {
+ cmdBootstrapMacosDefaultsStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapMacosDefaultsStatusV.Missing = values[0] == "true"
+ }
+ case FlagBootstrapMacosLaunchdAgentsApplyDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapMacosLaunchdAgentsApplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapMacosLaunchdAgentsApplyV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapMacosLaunchdAgentsApplyYes:
+ if source == argv.FromEnv {
+ cmdBootstrapMacosLaunchdAgentsApplyV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapMacosLaunchdAgentsApplyV.Yes = values[0] == "true"
+ }
+ case FlagBootstrapMacosLaunchdAgentsStatusJson:
+ if source == argv.FromEnv {
+ cmdBootstrapMacosLaunchdAgentsStatusV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapMacosLaunchdAgentsStatusV.Json = values[0] == "true"
+ }
+ case FlagBootstrapMacosLaunchdAgentsStatusMissing:
+ if source == argv.FromEnv {
+ cmdBootstrapMacosLaunchdAgentsStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapMacosLaunchdAgentsStatusV.Missing = values[0] == "true"
+ }
+ case FlagBootstrapMacosDefaultsApplyDryRun2:
+ if source == argv.FromEnv {
+ cmdBootstrapMacosDefaultsApply2V.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapMacosDefaultsApply2V.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapMacosDefaultsApplyYes2:
+ if source == argv.FromEnv {
+ cmdBootstrapMacosDefaultsApply2V.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapMacosDefaultsApply2V.Yes = values[0] == "true"
+ }
+ case FlagBootstrapMacosDefaultsStatusJson2:
+ if source == argv.FromEnv {
+ cmdBootstrapMacosDefaultsStatus2V.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapMacosDefaultsStatus2V.Json = values[0] == "true"
+ }
+ case FlagBootstrapMacosDefaultsStatusMissing2:
+ if source == argv.FromEnv {
+ cmdBootstrapMacosDefaultsStatus2V.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapMacosDefaultsStatus2V.Missing = values[0] == "true"
+ }
+ case FlagBootstrapMiseShellActivateApplyDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapMiseShellActivateApplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapMiseShellActivateApplyV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapMiseShellActivateApplyYes:
+ if source == argv.FromEnv {
+ cmdBootstrapMiseShellActivateApplyV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapMiseShellActivateApplyV.Yes = values[0] == "true"
+ }
+ case FlagBootstrapMiseShellActivateStatusJson:
+ if source == argv.FromEnv {
+ cmdBootstrapMiseShellActivateStatusV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapMiseShellActivateStatusV.Json = values[0] == "true"
+ }
+ case FlagBootstrapMiseShellActivateStatusMissing:
+ if source == argv.FromEnv {
+ cmdBootstrapMiseShellActivateStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapMiseShellActivateStatusV.Missing = values[0] == "true"
+ }
+ case FlagBootstrapPackagesApplyManager:
+ cmdBootstrapPackagesApplyV.Manager = values[len(values)-1]
+ case FlagBootstrapPackagesApplyDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesApplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesApplyV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapPackagesApplyYes:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesApplyV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesApplyV.Yes = values[0] == "true"
+ }
+ case FlagBootstrapPackagesApplyUpdate:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesApplyV.Update = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesApplyV.Update = values[0] == "true"
+ }
+ case ArgBootstrapPackagesApplyPackage:
+ cmdBootstrapPackagesApplyV.Package = append(cmdBootstrapPackagesApplyV.Package, values...)
+ case FlagBootstrapPackagesBrewTapLocal:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesBrewTapV.Local = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesBrewTapV.Local = values[0] == "true"
+ }
+ case FlagBootstrapPackagesBrewTapDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesBrewTapV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesBrewTapV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapPackagesBrewTapPath:
+ cmdBootstrapPackagesBrewTapV.Path = values[len(values)-1]
+ case ArgBootstrapPackagesBrewTapTap:
+ cmdBootstrapPackagesBrewTapV.Tap = values[len(values)-1]
+ case ArgBootstrapPackagesBrewTapUrl:
+ cmdBootstrapPackagesBrewTapV.Url = values[len(values)-1]
+ case FlagBootstrapPackagesBrewUntapLocal:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesBrewUntapV.Local = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesBrewUntapV.Local = values[0] == "true"
+ }
+ case FlagBootstrapPackagesBrewUntapDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesBrewUntapV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesBrewUntapV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapPackagesBrewUntapPath:
+ cmdBootstrapPackagesBrewUntapV.Path = values[len(values)-1]
+ case ArgBootstrapPackagesBrewUntapTaps:
+ cmdBootstrapPackagesBrewUntapV.Taps = append(cmdBootstrapPackagesBrewUntapV.Taps, values...)
+ case FlagBootstrapPackagesImportEnv:
+ cmdBootstrapPackagesImportV.Env = values[len(values)-1]
+ case FlagBootstrapPackagesImportGlobal:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesImportV.Global = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesImportV.Global = values[0] == "true"
+ }
+ case FlagBootstrapPackagesImportManager:
+ cmdBootstrapPackagesImportV.Manager = values[len(values)-1]
+ case FlagBootstrapPackagesImportAll:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesImportV.All = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesImportV.All = values[0] == "true"
+ }
+ case FlagBootstrapPackagesImportDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesImportV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesImportV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapPackagesImportPath:
+ cmdBootstrapPackagesImportV.Path = values[len(values)-1]
+ case FlagBootstrapPackagesPruneManager:
+ cmdBootstrapPackagesPruneV.Manager = values[len(values)-1]
+ case FlagBootstrapPackagesPruneDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesPruneV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesPruneV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapPackagesPruneYes:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesPruneV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesPruneV.Yes = values[0] == "true"
+ }
+ case FlagBootstrapPackagesStatusJson:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesStatusV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesStatusV.Json = values[0] == "true"
+ }
+ case FlagBootstrapPackagesStatusMissing:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesStatusV.Missing = values[0] == "true"
+ }
+ case FlagBootstrapPackagesUpgradeManager:
+ cmdBootstrapPackagesUpgradeV.Manager = values[len(values)-1]
+ case FlagBootstrapPackagesUpgradeDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesUpgradeV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesUpgradeV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapPackagesUpgradeYes:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesUpgradeV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesUpgradeV.Yes = values[0] == "true"
+ }
+ case ArgBootstrapPackagesUpgradePackage:
+ cmdBootstrapPackagesUpgradeV.Package = append(cmdBootstrapPackagesUpgradeV.Package, values...)
+ case FlagBootstrapPackagesUseEnv:
+ cmdBootstrapPackagesUseV.Env = values[len(values)-1]
+ case FlagBootstrapPackagesUseGlobal:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesUseV.Global = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesUseV.Global = values[0] == "true"
+ }
+ case FlagBootstrapPackagesUseDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesUseV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesUseV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapPackagesUsePath:
+ cmdBootstrapPackagesUseV.Path = values[len(values)-1]
+ case FlagBootstrapPackagesUseYes:
+ if source == argv.FromEnv {
+ cmdBootstrapPackagesUseV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPackagesUseV.Yes = values[0] == "true"
+ }
+ case ArgBootstrapPackagesUsePackage:
+ cmdBootstrapPackagesUseV.Package = append(cmdBootstrapPackagesUseV.Package, values...)
+ case FlagBootstrapPlanJson:
+ if source == argv.FromEnv {
+ cmdBootstrapPlanV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPlanV.Json = values[0] == "true"
+ }
+ case FlagBootstrapPlanDetailedExitcode:
+ if source == argv.FromEnv {
+ cmdBootstrapPlanV.DetailedExitcode = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPlanV.DetailedExitcode = values[0] == "true"
+ }
+ case FlagBootstrapPlanPromptSecrets:
+ if source == argv.FromEnv {
+ cmdBootstrapPlanV.PromptSecrets = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPlanV.PromptSecrets = values[0] == "true"
+ }
+ case FlagBootstrapPluginsApplyDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapPluginsApplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPluginsApplyV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapPluginsStatusMissing:
+ if source == argv.FromEnv {
+ cmdBootstrapPluginsStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapPluginsStatusV.Missing = values[0] == "true"
+ }
+ case FlagBootstrapRemoteAll:
+ if source == argv.FromEnv {
+ cmdBootstrapRemoteV.All = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapRemoteV.All = values[0] == "true"
+ }
+ case FlagBootstrapRemoteBootstrapCommand:
+ cmdBootstrapRemoteV.BootstrapCommand = values[len(values)-1]
+ case FlagBootstrapRemoteConnectTimeout:
+ cmdBootstrapRemoteV.ConnectTimeout = values[len(values)-1]
+ case FlagBootstrapRemoteCopyLink:
+ cmdBootstrapRemoteV.CopyLink = append(cmdBootstrapRemoteV.CopyLink, values...)
+ case FlagBootstrapRemoteCopyLinks:
+ if source == argv.FromEnv {
+ cmdBootstrapRemoteV.CopyLinks = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapRemoteV.CopyLinks = values[0] == "true"
+ }
+ case FlagBootstrapRemoteExclude:
+ cmdBootstrapRemoteV.Exclude = append(cmdBootstrapRemoteV.Exclude, values...)
+ case FlagBootstrapRemoteFailFast:
+ if source == argv.FromEnv {
+ cmdBootstrapRemoteV.FailFast = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapRemoteV.FailFast = values[0] == "true"
+ }
+ case FlagBootstrapRemoteForceDotfiles:
+ if source == argv.FromEnv {
+ cmdBootstrapRemoteV.ForceDotfiles = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapRemoteV.ForceDotfiles = values[0] == "true"
+ }
+ case FlagBootstrapRemoteHost:
+ cmdBootstrapRemoteV.Host = append(cmdBootstrapRemoteV.Host, values...)
+ case FlagBootstrapRemoteIdentityFile:
+ cmdBootstrapRemoteV.IdentityFile = values[len(values)-1]
+ case FlagBootstrapRemoteDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapRemoteV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapRemoteV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapRemoteKeepStaging:
+ if source == argv.FromEnv {
+ cmdBootstrapRemoteV.KeepStaging = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapRemoteV.KeepStaging = values[0] == "true"
+ }
+ case FlagBootstrapRemoteMiseBin:
+ cmdBootstrapRemoteV.MiseBin = values[len(values)-1]
+ case FlagBootstrapRemoteOnly:
+ cmdBootstrapRemoteV.Only = append(cmdBootstrapRemoteV.Only, values...)
+ case FlagBootstrapRemotePort:
+ cmdBootstrapRemoteV.Port = values[len(values)-1]
+ case FlagBootstrapRemotePromptSecrets:
+ if source == argv.FromEnv {
+ cmdBootstrapRemoteV.PromptSecrets = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapRemoteV.PromptSecrets = values[0] == "true"
+ }
+ case FlagBootstrapRemoteRemoteEnv:
+ cmdBootstrapRemoteV.RemoteEnv = append(cmdBootstrapRemoteV.RemoteEnv, values...)
+ case FlagBootstrapRemoteRemoteMise:
+ cmdBootstrapRemoteV.RemoteMise = values[len(values)-1]
+ case FlagBootstrapRemoteSkip:
+ cmdBootstrapRemoteV.Skip = append(cmdBootstrapRemoteV.Skip, values...)
+ case FlagBootstrapRemoteSource:
+ cmdBootstrapRemoteV.Source = values[len(values)-1]
+ case FlagBootstrapRemoteSshOption:
+ cmdBootstrapRemoteV.SshOption = append(cmdBootstrapRemoteV.SshOption, values...)
+ case FlagBootstrapRemoteTag:
+ cmdBootstrapRemoteV.Tag = append(cmdBootstrapRemoteV.Tag, values...)
+ case FlagBootstrapRemoteUpdate:
+ if source == argv.FromEnv {
+ cmdBootstrapRemoteV.Update = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapRemoteV.Update = values[0] == "true"
+ }
+ case FlagBootstrapRemoteYes:
+ if source == argv.FromEnv {
+ cmdBootstrapRemoteV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapRemoteV.Yes = values[0] == "true"
+ }
+ case ArgBootstrapRemoteTarget:
+ cmdBootstrapRemoteV.Target = append(cmdBootstrapRemoteV.Target, values...)
+ case FlagBootstrapReposApplyDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapReposApplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapReposApplyV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapReposApplyYes:
+ if source == argv.FromEnv {
+ cmdBootstrapReposApplyV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapReposApplyV.Yes = values[0] == "true"
+ }
+ case FlagBootstrapReposExecContinueOnError:
+ if source == argv.FromEnv {
+ cmdBootstrapReposExecV.ContinueOnError = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapReposExecV.ContinueOnError = values[0] == "true"
+ }
+ case FlagBootstrapReposExecDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapReposExecV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapReposExecV.DryRun = values[0] == "true"
+ }
+ case ArgBootstrapReposExecPath:
+ cmdBootstrapReposExecV.Path = append(cmdBootstrapReposExecV.Path, values...)
+ case ArgBootstrapReposExecCommand:
+ cmdBootstrapReposExecV.Command = append(cmdBootstrapReposExecV.Command, values...)
+ case FlagBootstrapReposStatusJson:
+ if source == argv.FromEnv {
+ cmdBootstrapReposStatusV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapReposStatusV.Json = values[0] == "true"
+ }
+ case FlagBootstrapReposStatusMissing:
+ if source == argv.FromEnv {
+ cmdBootstrapReposStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapReposStatusV.Missing = values[0] == "true"
+ }
+ case FlagBootstrapReposUpdateDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapReposUpdateV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapReposUpdateV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapReposUpdateYes:
+ if source == argv.FromEnv {
+ cmdBootstrapReposUpdateV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapReposUpdateV.Yes = values[0] == "true"
+ }
+ case ArgBootstrapReposUpdatePath:
+ cmdBootstrapReposUpdateV.Path = append(cmdBootstrapReposUpdateV.Path, values...)
+ case FlagBootstrapSecretsStatusJson:
+ if source == argv.FromEnv {
+ cmdBootstrapSecretsStatusV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapSecretsStatusV.Json = values[0] == "true"
+ }
+ case FlagBootstrapSecretsStatusMissing:
+ if source == argv.FromEnv {
+ cmdBootstrapSecretsStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapSecretsStatusV.Missing = values[0] == "true"
+ }
+ case FlagBootstrapServicesApplyDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapServicesApplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapServicesApplyV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapServicesApplyYes:
+ if source == argv.FromEnv {
+ cmdBootstrapServicesApplyV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapServicesApplyV.Yes = values[0] == "true"
+ }
+ case FlagBootstrapServicesStatusJson:
+ if source == argv.FromEnv {
+ cmdBootstrapServicesStatusV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapServicesStatusV.Json = values[0] == "true"
+ }
+ case FlagBootstrapServicesStatusMissing:
+ if source == argv.FromEnv {
+ cmdBootstrapServicesStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapServicesStatusV.Missing = values[0] == "true"
+ }
+ case FlagBootstrapStatusJson:
+ if source == argv.FromEnv {
+ cmdBootstrapStatusV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapStatusV.Json = values[0] == "true"
+ }
+ case FlagBootstrapStatusMissing:
+ if source == argv.FromEnv {
+ cmdBootstrapStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapStatusV.Missing = values[0] == "true"
+ }
+ case FlagBootstrapStatusPromptSecrets:
+ if source == argv.FromEnv {
+ cmdBootstrapStatusV.PromptSecrets = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapStatusV.PromptSecrets = values[0] == "true"
+ }
+ case FlagBootstrapSystemdApplyDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapSystemdApplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapSystemdApplyV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapSystemdApplyYes:
+ if source == argv.FromEnv {
+ cmdBootstrapSystemdApplyV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapSystemdApplyV.Yes = values[0] == "true"
+ }
+ case FlagBootstrapSystemdStatusJson:
+ if source == argv.FromEnv {
+ cmdBootstrapSystemdStatusV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapSystemdStatusV.Json = values[0] == "true"
+ }
+ case FlagBootstrapSystemdStatusMissing:
+ if source == argv.FromEnv {
+ cmdBootstrapSystemdStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapSystemdStatusV.Missing = values[0] == "true"
+ }
+ case FlagBootstrapUserApplyDryRun:
+ if source == argv.FromEnv {
+ cmdBootstrapUserApplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapUserApplyV.DryRun = values[0] == "true"
+ }
+ case FlagBootstrapUserApplyYes:
+ if source == argv.FromEnv {
+ cmdBootstrapUserApplyV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapUserApplyV.Yes = values[0] == "true"
+ }
+ case FlagBootstrapUserStatusJson:
+ if source == argv.FromEnv {
+ cmdBootstrapUserStatusV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapUserStatusV.Json = values[0] == "true"
+ }
+ case FlagBootstrapUserStatusMissing:
+ if source == argv.FromEnv {
+ cmdBootstrapUserStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdBootstrapUserStatusV.Missing = values[0] == "true"
+ }
+ case FlagCacheClearOutdate:
+ if source == argv.FromEnv {
+ cmdCacheClearV.Outdate = argv.EnvTruth(values[0])
+ } else {
+ cmdCacheClearV.Outdate = values[0] == "true"
+ }
+ case FlagCacheClearTask:
+ cmdCacheClearV.Task = values[len(values)-1]
+ case ArgCacheClearTool:
+ cmdCacheClearV.Tool = append(cmdCacheClearV.Tool, values...)
+ case FlagCachePruneDryRun:
+ if source == argv.FromEnv {
+ cmdCachePruneV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdCachePruneV.DryRun = values[0] == "true"
+ }
+ case ArgCachePruneTool:
+ cmdCachePruneV.Tool = append(cmdCachePruneV.Tool, values...)
+ case FlagCacheTaskJson:
+ if source == argv.FromEnv {
+ cmdCacheTaskV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdCacheTaskV.Json = values[0] == "true"
+ }
+ case ArgCacheTaskTask:
+ cmdCacheTaskV.Task = values[len(values)-1]
+ case FlagCompletionShell:
+ cmdCompletionV.Shell = values[len(values)-1]
+ case FlagCompletionIncludeBashCompletionLib:
+ if source == argv.FromEnv {
+ cmdCompletionV.IncludeBashCompletionLib = argv.EnvTruth(values[0])
+ } else {
+ cmdCompletionV.IncludeBashCompletionLib = values[0] == "true"
+ }
+ case FlagCompletionUsage:
+ if source == argv.FromEnv {
+ cmdCompletionV.Usage = argv.EnvTruth(values[0])
+ } else {
+ cmdCompletionV.Usage = values[0] == "true"
+ }
+ case ArgCompletionShell:
+ cmdCompletionV.ShellArg = values[len(values)-1]
+ case FlagConfigJson:
+ if source == argv.FromEnv {
+ cmdConfigV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdConfigV.Json = values[0] == "true"
+ }
+ case FlagConfigNoHeader:
+ if source == argv.FromEnv {
+ cmdConfigV.NoHeader = argv.EnvTruth(values[0])
+ } else {
+ cmdConfigV.NoHeader = values[0] == "true"
+ }
+ case FlagConfigTrackedConfigs:
+ if source == argv.FromEnv {
+ cmdConfigV.TrackedConfigs = argv.EnvTruth(values[0])
+ } else {
+ cmdConfigV.TrackedConfigs = values[0] == "true"
+ }
+ case FlagConfigGetFile:
+ cmdConfigGetV.File = values[len(values)-1]
+ case ArgConfigGetKey:
+ cmdConfigGetV.Key = values[len(values)-1]
+ case FlagConfigLsJson:
+ if source == argv.FromEnv {
+ cmdConfigLsV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdConfigLsV.Json = values[0] == "true"
+ }
+ case FlagConfigLsNoHeader:
+ if source == argv.FromEnv {
+ cmdConfigLsV.NoHeader = argv.EnvTruth(values[0])
+ } else {
+ cmdConfigLsV.NoHeader = values[0] == "true"
+ }
+ case FlagConfigLsTrackedConfigs:
+ if source == argv.FromEnv {
+ cmdConfigLsV.TrackedConfigs = argv.EnvTruth(values[0])
+ } else {
+ cmdConfigLsV.TrackedConfigs = values[0] == "true"
+ }
+ case FlagConfigSetFile:
+ cmdConfigSetV.File = values[len(values)-1]
+ case FlagConfigSetType:
+ cmdConfigSetV.Type = values[len(values)-1]
+ case ArgConfigSetKey:
+ cmdConfigSetV.Key = values[len(values)-1]
+ case ArgConfigSetValue:
+ cmdConfigSetV.Value = values[len(values)-1]
+ case ArgCurrentPlugin:
+ cmdCurrentV.Plugin = values[len(values)-1]
+ case FlagDotfilesAddForce:
+ if source == argv.FromEnv {
+ cmdDotfilesAddV.Force = argv.EnvTruth(values[0])
+ } else {
+ cmdDotfilesAddV.Force = values[0] == "true"
+ }
+ case FlagDotfilesAddGlobal:
+ if source == argv.FromEnv {
+ cmdDotfilesAddV.Global = argv.EnvTruth(values[0])
+ } else {
+ cmdDotfilesAddV.Global = values[0] == "true"
+ }
+ case FlagDotfilesAddLocal:
+ if source == argv.FromEnv {
+ cmdDotfilesAddV.Local = argv.EnvTruth(values[0])
+ } else {
+ cmdDotfilesAddV.Local = values[0] == "true"
+ }
+ case FlagDotfilesAddMode:
+ cmdDotfilesAddV.Mode = values[len(values)-1]
+ case FlagDotfilesAddDryRun:
+ if source == argv.FromEnv {
+ cmdDotfilesAddV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdDotfilesAddV.DryRun = values[0] == "true"
+ }
+ case FlagDotfilesAddNoApply:
+ if source == argv.FromEnv {
+ cmdDotfilesAddV.NoApply = argv.EnvTruth(values[0])
+ } else {
+ cmdDotfilesAddV.NoApply = values[0] == "true"
+ }
+ case FlagDotfilesAddPath:
+ cmdDotfilesAddV.Path = values[len(values)-1]
+ case FlagDotfilesAddSource:
+ cmdDotfilesAddV.Source = values[len(values)-1]
+ case FlagDotfilesAddYes:
+ if source == argv.FromEnv {
+ cmdDotfilesAddV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdDotfilesAddV.Yes = values[0] == "true"
+ }
+ case ArgDotfilesAddTarget:
+ cmdDotfilesAddV.Target = append(cmdDotfilesAddV.Target, values...)
+ case FlagDotfilesApplyForce:
+ if source == argv.FromEnv {
+ cmdDotfilesApplyV.Force = argv.EnvTruth(values[0])
+ } else {
+ cmdDotfilesApplyV.Force = values[0] == "true"
+ }
+ case FlagDotfilesApplyDryRun:
+ if source == argv.FromEnv {
+ cmdDotfilesApplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdDotfilesApplyV.DryRun = values[0] == "true"
+ }
+ case FlagDotfilesApplyYes:
+ if source == argv.FromEnv {
+ cmdDotfilesApplyV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdDotfilesApplyV.Yes = values[0] == "true"
+ }
+ case ArgDotfilesApplyTarget:
+ cmdDotfilesApplyV.Target = append(cmdDotfilesApplyV.Target, values...)
+ case FlagDotfilesEditApply:
+ if source == argv.FromEnv {
+ cmdDotfilesEditV.Apply = argv.EnvTruth(values[0])
+ } else {
+ cmdDotfilesEditV.Apply = values[0] == "true"
+ }
+ case FlagDotfilesEditMode:
+ cmdDotfilesEditV.Mode = values[len(values)-1]
+ case FlagDotfilesEditSource:
+ cmdDotfilesEditV.Source = values[len(values)-1]
+ case FlagDotfilesEditYes:
+ if source == argv.FromEnv {
+ cmdDotfilesEditV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdDotfilesEditV.Yes = values[0] == "true"
+ }
+ case ArgDotfilesEditTarget:
+ cmdDotfilesEditV.Target = values[len(values)-1]
+ case FlagDotfilesStatusJson:
+ if source == argv.FromEnv {
+ cmdDotfilesStatusV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdDotfilesStatusV.Json = values[0] == "true"
+ }
+ case FlagDotfilesStatusMissing:
+ if source == argv.FromEnv {
+ cmdDotfilesStatusV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdDotfilesStatusV.Missing = values[0] == "true"
+ }
+ case ArgDotfilesStatusTarget:
+ cmdDotfilesStatusV.Target = append(cmdDotfilesStatusV.Target, values...)
+ case FlagDotfilesUnapplyForce:
+ if source == argv.FromEnv {
+ cmdDotfilesUnapplyV.Force = argv.EnvTruth(values[0])
+ } else {
+ cmdDotfilesUnapplyV.Force = values[0] == "true"
+ }
+ case FlagDotfilesUnapplyDryRun:
+ if source == argv.FromEnv {
+ cmdDotfilesUnapplyV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdDotfilesUnapplyV.DryRun = values[0] == "true"
+ }
+ case FlagDotfilesUnapplyYes:
+ if source == argv.FromEnv {
+ cmdDotfilesUnapplyV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdDotfilesUnapplyV.Yes = values[0] == "true"
+ }
+ case ArgDotfilesUnapplyTarget:
+ cmdDotfilesUnapplyV.Target = append(cmdDotfilesUnapplyV.Target, values...)
+ case FlagDoctorJson:
+ if source == argv.FromEnv {
+ cmdDoctorV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdDoctorV.Json = values[0] == "true"
+ }
+ case FlagDoctorPathFull:
+ if source == argv.FromEnv {
+ cmdDoctorPathV.Full = argv.EnvTruth(values[0])
+ } else {
+ cmdDoctorPathV.Full = values[0] == "true"
+ }
+ case FlagEnShell:
+ cmdEnV.Shell = values[len(values)-1]
+ case ArgEnDir:
+ cmdEnV.Dir = values[len(values)-1]
+ case FlagEnvDotenv:
+ if source == argv.FromEnv {
+ cmdEnvV.Dotenv = argv.EnvTruth(values[0])
+ } else {
+ cmdEnvV.Dotenv = values[0] == "true"
+ }
+ case FlagEnvJson:
+ if source == argv.FromEnv {
+ cmdEnvV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdEnvV.Json = values[0] == "true"
+ }
+ case FlagEnvShell:
+ cmdEnvV.Shell = values[len(values)-1]
+ case FlagEnvJsonExtended:
+ if source == argv.FromEnv {
+ cmdEnvV.JsonExtended = argv.EnvTruth(values[0])
+ } else {
+ cmdEnvV.JsonExtended = values[0] == "true"
+ }
+ case FlagEnvRedacted:
+ if source == argv.FromEnv {
+ cmdEnvV.Redacted = argv.EnvTruth(values[0])
+ } else {
+ cmdEnvV.Redacted = values[0] == "true"
+ }
+ case FlagEnvValues:
+ if source == argv.FromEnv {
+ cmdEnvV.Values = argv.EnvTruth(values[0])
+ } else {
+ cmdEnvV.Values = values[0] == "true"
+ }
+ case ArgEnvToolVersion:
+ cmdEnvV.ToolVersion = append(cmdEnvV.ToolVersion, values...)
+ case FlagExecCommand:
+ cmdExecV.Command = values[len(values)-1]
+ case FlagExecJobs:
+ cmdExecV.Jobs = values[len(values)-1]
+ case FlagExecAllowEnv:
+ cmdExecV.AllowEnv = append(cmdExecV.AllowEnv, values...)
+ case FlagExecAllowNet:
+ cmdExecV.AllowNet = append(cmdExecV.AllowNet, values...)
+ case FlagExecAllowRead:
+ cmdExecV.AllowRead = append(cmdExecV.AllowRead, values...)
+ case FlagExecAllowWrite:
+ cmdExecV.AllowWrite = append(cmdExecV.AllowWrite, values...)
+ case FlagExecDenyAll:
+ if source == argv.FromEnv {
+ cmdExecV.DenyAll = argv.EnvTruth(values[0])
+ } else {
+ cmdExecV.DenyAll = values[0] == "true"
+ }
+ case FlagExecDenyEnv:
+ if source == argv.FromEnv {
+ cmdExecV.DenyEnv = argv.EnvTruth(values[0])
+ } else {
+ cmdExecV.DenyEnv = values[0] == "true"
+ }
+ case FlagExecDenyNet:
+ if source == argv.FromEnv {
+ cmdExecV.DenyNet = argv.EnvTruth(values[0])
+ } else {
+ cmdExecV.DenyNet = values[0] == "true"
+ }
+ case FlagExecDenyRead:
+ if source == argv.FromEnv {
+ cmdExecV.DenyRead = argv.EnvTruth(values[0])
+ } else {
+ cmdExecV.DenyRead = values[0] == "true"
+ }
+ case FlagExecDenyWrite:
+ if source == argv.FromEnv {
+ cmdExecV.DenyWrite = argv.EnvTruth(values[0])
+ } else {
+ cmdExecV.DenyWrite = values[0] == "true"
+ }
+ case FlagExecFreshEnv:
+ if source == argv.FromEnv {
+ cmdExecV.FreshEnv = argv.EnvTruth(values[0])
+ } else {
+ cmdExecV.FreshEnv = values[0] == "true"
+ }
+ case FlagExecNoDeps:
+ if source == argv.FromEnv {
+ cmdExecV.NoDeps = argv.EnvTruth(values[0])
+ } else {
+ cmdExecV.NoDeps = values[0] == "true"
+ }
+ case FlagExecRaw:
+ if source == argv.FromEnv {
+ cmdExecV.Raw = argv.EnvTruth(values[0])
+ } else {
+ cmdExecV.Raw = values[0] == "true"
+ }
+ case ArgExecToolVersion:
+ cmdExecV.ToolVersion = append(cmdExecV.ToolVersion, values...)
+ case ArgExecCommand:
+ cmdExecV.CommandArg = append(cmdExecV.CommandArg, values...)
+ case FlagFmtAll:
+ if source == argv.FromEnv {
+ cmdFmtV.All = argv.EnvTruth(values[0])
+ } else {
+ cmdFmtV.All = values[0] == "true"
+ }
+ case FlagFmtCheck:
+ if source == argv.FromEnv {
+ cmdFmtV.Check = argv.EnvTruth(values[0])
+ } else {
+ cmdFmtV.Check = values[0] == "true"
+ }
+ case FlagFmtStdin:
+ if source == argv.FromEnv {
+ cmdFmtV.Stdin = argv.EnvTruth(values[0])
+ } else {
+ cmdFmtV.Stdin = values[0] == "true"
+ }
+ case FlagGenerateBootstrapLocalize:
+ if source == argv.FromEnv {
+ cmdGenerateBootstrapV.Localize = argv.EnvTruth(values[0])
+ } else {
+ cmdGenerateBootstrapV.Localize = values[0] == "true"
+ }
+ case FlagGenerateBootstrapVersion:
+ cmdGenerateBootstrapV.Version = values[len(values)-1]
+ case FlagGenerateBootstrapWrite:
+ cmdGenerateBootstrapV.Write = values[len(values)-1]
+ case FlagGenerateBootstrapLocalizedDir:
+ cmdGenerateBootstrapV.LocalizedDir = values[len(values)-1]
+ case FlagGenerateBootstrapWindows:
+ if source == argv.FromEnv {
+ cmdGenerateBootstrapV.Windows = argv.EnvTruth(values[0])
+ } else {
+ cmdGenerateBootstrapV.Windows = values[0] == "true"
+ }
+ case FlagGenerateConfigGlobal:
+ if source == argv.FromEnv {
+ cmdGenerateConfigV.Global = argv.EnvTruth(values[0])
+ } else {
+ cmdGenerateConfigV.Global = values[0] == "true"
+ }
+ case FlagGenerateConfigDryRun:
+ if source == argv.FromEnv {
+ cmdGenerateConfigV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdGenerateConfigV.DryRun = values[0] == "true"
+ }
+ case FlagGenerateConfigToolVersions:
+ cmdGenerateConfigV.ToolVersions = values[len(values)-1]
+ case ArgGenerateConfigPath:
+ cmdGenerateConfigV.Path = values[len(values)-1]
+ case FlagGenerateDevcontainerImage:
+ cmdGenerateDevcontainerV.Image = values[len(values)-1]
+ case FlagGenerateDevcontainerMountMiseData:
+ if source == argv.FromEnv {
+ cmdGenerateDevcontainerV.MountMiseData = argv.EnvTruth(values[0])
+ } else {
+ cmdGenerateDevcontainerV.MountMiseData = values[0] == "true"
+ }
+ case FlagGenerateDevcontainerName:
+ cmdGenerateDevcontainerV.Name = values[len(values)-1]
+ case FlagGenerateDevcontainerWrite:
+ if source == argv.FromEnv {
+ cmdGenerateDevcontainerV.Write = argv.EnvTruth(values[0])
+ } else {
+ cmdGenerateDevcontainerV.Write = values[0] == "true"
+ }
+ case FlagGenerateGitPreCommitTask:
+ cmdGenerateGitPreCommitV.Task = values[len(values)-1]
+ case FlagGenerateGitPreCommitWrite:
+ if source == argv.FromEnv {
+ cmdGenerateGitPreCommitV.Write = argv.EnvTruth(values[0])
+ } else {
+ cmdGenerateGitPreCommitV.Write = values[0] == "true"
+ }
+ case FlagGenerateGitPreCommitHook:
+ cmdGenerateGitPreCommitV.Hook = values[len(values)-1]
+ case ArgGenerateGitPreCommitMiseArg:
+ cmdGenerateGitPreCommitV.MiseArg = append(cmdGenerateGitPreCommitV.MiseArg, values...)
+ case FlagGenerateGithubActionTask:
+ cmdGenerateGithubActionV.Task = values[len(values)-1]
+ case FlagGenerateGithubActionWrite:
+ if source == argv.FromEnv {
+ cmdGenerateGithubActionV.Write = argv.EnvTruth(values[0])
+ } else {
+ cmdGenerateGithubActionV.Write = values[0] == "true"
+ }
+ case FlagGenerateGithubActionName:
+ cmdGenerateGithubActionV.Name = values[len(values)-1]
+ case FlagGenerateTaskDocsInject:
+ if source == argv.FromEnv {
+ cmdGenerateTaskDocsV.Inject = argv.EnvTruth(values[0])
+ } else {
+ cmdGenerateTaskDocsV.Inject = values[0] == "true"
+ }
+ case FlagGenerateTaskDocsIndex:
+ if source == argv.FromEnv {
+ cmdGenerateTaskDocsV.Index = argv.EnvTruth(values[0])
+ } else {
+ cmdGenerateTaskDocsV.Index = values[0] == "true"
+ }
+ case FlagGenerateTaskDocsMulti:
+ if source == argv.FromEnv {
+ cmdGenerateTaskDocsV.Multi = argv.EnvTruth(values[0])
+ } else {
+ cmdGenerateTaskDocsV.Multi = values[0] == "true"
+ }
+ case FlagGenerateTaskDocsOutput:
+ cmdGenerateTaskDocsV.Output = values[len(values)-1]
+ case FlagGenerateTaskDocsRoot:
+ cmdGenerateTaskDocsV.Root = values[len(values)-1]
+ case FlagGenerateTaskDocsStyle:
+ cmdGenerateTaskDocsV.Style = values[len(values)-1]
+ case FlagGenerateTaskStubsDir:
+ cmdGenerateTaskStubsV.Dir = values[len(values)-1]
+ case FlagGenerateTaskStubsMiseBin:
+ cmdGenerateTaskStubsV.MiseBin = values[len(values)-1]
+ case FlagGenerateToolStubBin:
+ cmdGenerateToolStubV.Bin = values[len(values)-1]
+ case FlagGenerateToolStubBootstrap:
+ if source == argv.FromEnv {
+ cmdGenerateToolStubV.Bootstrap = argv.EnvTruth(values[0])
+ } else {
+ cmdGenerateToolStubV.Bootstrap = values[0] == "true"
+ }
+ case FlagGenerateToolStubBootstrapVersion:
+ cmdGenerateToolStubV.BootstrapVersion = values[len(values)-1]
+ case FlagGenerateToolStubChecksumAlgorithm:
+ cmdGenerateToolStubV.ChecksumAlgorithm = values[len(values)-1]
+ case FlagGenerateToolStubFetch:
+ if source == argv.FromEnv {
+ cmdGenerateToolStubV.Fetch = argv.EnvTruth(values[0])
+ } else {
+ cmdGenerateToolStubV.Fetch = values[0] == "true"
+ }
+ case FlagGenerateToolStubHttp:
+ cmdGenerateToolStubV.Http = values[len(values)-1]
+ case FlagGenerateToolStubLock:
+ if source == argv.FromEnv {
+ cmdGenerateToolStubV.Lock = argv.EnvTruth(values[0])
+ } else {
+ cmdGenerateToolStubV.Lock = values[0] == "true"
+ }
+ case FlagGenerateToolStubPlatformBin:
+ cmdGenerateToolStubV.PlatformBin = append(cmdGenerateToolStubV.PlatformBin, values...)
+ case FlagGenerateToolStubPlatformUrl:
+ cmdGenerateToolStubV.PlatformUrl = append(cmdGenerateToolStubV.PlatformUrl, values...)
+ case FlagGenerateToolStubSkipDownload:
+ if source == argv.FromEnv {
+ cmdGenerateToolStubV.SkipDownload = argv.EnvTruth(values[0])
+ } else {
+ cmdGenerateToolStubV.SkipDownload = values[0] == "true"
+ }
+ case FlagGenerateToolStubUrl:
+ cmdGenerateToolStubV.Url = values[len(values)-1]
+ case FlagGenerateToolStubVersion:
+ cmdGenerateToolStubV.Version = values[len(values)-1]
+ case ArgGenerateToolStubOutput:
+ cmdGenerateToolStubV.Output = values[len(values)-1]
+ case FlagGithubTokenOauth:
+ if source == argv.FromEnv {
+ cmdGithubTokenV.Oauth = argv.EnvTruth(values[0])
+ } else {
+ cmdGithubTokenV.Oauth = values[0] == "true"
+ }
+ case FlagGithubTokenRaw:
+ if source == argv.FromEnv {
+ cmdGithubTokenV.Raw = argv.EnvTruth(values[0])
+ } else {
+ cmdGithubTokenV.Raw = values[0] == "true"
+ }
+ case FlagGithubTokenRefresh:
+ if source == argv.FromEnv {
+ cmdGithubTokenV.Refresh = argv.EnvTruth(values[0])
+ } else {
+ cmdGithubTokenV.Refresh = values[0] == "true"
+ }
+ case FlagGithubTokenUnmask:
+ if source == argv.FromEnv {
+ cmdGithubTokenV.Unmask = argv.EnvTruth(values[0])
+ } else {
+ cmdGithubTokenV.Unmask = values[0] == "true"
+ }
+ case ArgGithubTokenHost:
+ cmdGithubTokenV.Host = values[len(values)-1]
+ case FlagGlobalFuzzy:
+ if source == argv.FromEnv {
+ cmdGlobalV.Fuzzy = argv.EnvTruth(values[0])
+ } else {
+ cmdGlobalV.Fuzzy = values[0] == "true"
+ }
+ case FlagGlobalPath:
+ if source == argv.FromEnv {
+ cmdGlobalV.Path = argv.EnvTruth(values[0])
+ } else {
+ cmdGlobalV.Path = values[0] == "true"
+ }
+ case FlagGlobalPin:
+ if source == argv.FromEnv {
+ cmdGlobalV.Pin = argv.EnvTruth(values[0])
+ } else {
+ cmdGlobalV.Pin = values[0] == "true"
+ }
+ case FlagGlobalRemove:
+ cmdGlobalV.Remove = append(cmdGlobalV.Remove, values...)
+ case ArgGlobalToolVersion:
+ cmdGlobalV.ToolVersion = append(cmdGlobalV.ToolVersion, values...)
+ case FlagHookEnvForce:
+ if source == argv.FromEnv {
+ cmdHookEnvV.Force = argv.EnvTruth(values[0])
+ } else {
+ cmdHookEnvV.Force = values[0] == "true"
+ }
+ case FlagHookEnvQuiet:
+ if source == argv.FromEnv {
+ cmdHookEnvV.Quiet = argv.EnvTruth(values[0])
+ } else {
+ cmdHookEnvV.Quiet = values[0] == "true"
+ }
+ case FlagHookEnvShell:
+ cmdHookEnvV.Shell = values[len(values)-1]
+ case FlagHookEnvReason:
+ cmdHookEnvV.Reason = values[len(values)-1]
+ case FlagHookEnvStatus:
+ if source == argv.FromEnv {
+ cmdHookEnvV.Status = argv.EnvTruth(values[0])
+ } else {
+ cmdHookEnvV.Status = values[0] == "true"
+ }
+ case FlagHookNotFoundShell:
+ cmdHookNotFoundV.Shell = values[len(values)-1]
+ case ArgHookNotFoundBin:
+ cmdHookNotFoundV.Bin = values[len(values)-1]
+ case FlagImplodeDryRun:
+ if source == argv.FromEnv {
+ cmdImplodeV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdImplodeV.DryRun = values[0] == "true"
+ }
+ case FlagImplodeConfig:
+ if source == argv.FromEnv {
+ cmdImplodeV.Config = argv.EnvTruth(values[0])
+ } else {
+ cmdImplodeV.Config = values[0] == "true"
+ }
+ case FlagEditGlobal:
+ if source == argv.FromEnv {
+ cmdEditV.Global = argv.EnvTruth(values[0])
+ } else {
+ cmdEditV.Global = values[0] == "true"
+ }
+ case FlagEditDryRun:
+ if source == argv.FromEnv {
+ cmdEditV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdEditV.DryRun = values[0] == "true"
+ }
+ case FlagEditToolVersions:
+ cmdEditV.ToolVersions = values[len(values)-1]
+ case ArgEditPath:
+ cmdEditV.Path = values[len(values)-1]
+ case FlagInstallForce:
+ if source == argv.FromEnv {
+ cmdInstallV.Force = argv.EnvTruth(values[0])
+ } else {
+ cmdInstallV.Force = values[0] == "true"
+ }
+ case FlagInstallJobs:
+ cmdInstallV.Jobs = values[len(values)-1]
+ case FlagInstallDryRun:
+ if source == argv.FromEnv {
+ cmdInstallV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdInstallV.DryRun = values[0] == "true"
+ }
+ case FlagInstallDryRunCode:
+ if source == argv.FromEnv {
+ cmdInstallV.DryRunCode = argv.EnvTruth(values[0])
+ } else {
+ cmdInstallV.DryRunCode = values[0] == "true"
+ }
+ case FlagInstallIncludeTaskTools:
+ if source == argv.FromEnv {
+ cmdInstallV.IncludeTaskTools = argv.EnvTruth(values[0])
+ } else {
+ cmdInstallV.IncludeTaskTools = values[0] == "true"
+ }
+ case FlagInstallMinimumReleaseAge:
+ cmdInstallV.MinimumReleaseAge = values[len(values)-1]
+ case FlagInstallMonorepo:
+ if source == argv.FromEnv {
+ cmdInstallV.Monorepo = argv.EnvTruth(values[0])
+ } else {
+ cmdInstallV.Monorepo = values[0] == "true"
+ }
+ case FlagInstallRaw:
+ if source == argv.FromEnv {
+ cmdInstallV.Raw = argv.EnvTruth(values[0])
+ } else {
+ cmdInstallV.Raw = values[0] == "true"
+ }
+ case FlagInstallShared:
+ cmdInstallV.Shared = values[len(values)-1]
+ case FlagInstallSystem:
+ if source == argv.FromEnv {
+ cmdInstallV.System = argv.EnvTruth(values[0])
+ } else {
+ cmdInstallV.System = values[0] == "true"
+ }
+ case ArgInstallToolVersion:
+ cmdInstallV.ToolVersion = append(cmdInstallV.ToolVersion, values...)
+ case ArgInstallIntoToolVersion:
+ cmdInstallIntoV.ToolVersion = values[len(values)-1]
+ case ArgInstallIntoPath:
+ cmdInstallIntoV.Path = values[len(values)-1]
+ case FlagLatestInstalled:
+ if source == argv.FromEnv {
+ cmdLatestV.Installed = argv.EnvTruth(values[0])
+ } else {
+ cmdLatestV.Installed = values[0] == "true"
+ }
+ case FlagLatestMinimumReleaseAge:
+ cmdLatestV.MinimumReleaseAge = values[len(values)-1]
+ case ArgLatestToolVersion:
+ cmdLatestV.ToolVersion = values[len(values)-1]
+ case ArgLatestAsdfVersion:
+ cmdLatestV.AsdfVersion = values[len(values)-1]
+ case FlagLinkForce:
+ if source == argv.FromEnv {
+ cmdLinkV.Force = argv.EnvTruth(values[0])
+ } else {
+ cmdLinkV.Force = values[0] == "true"
+ }
+ case ArgLinkToolVersion:
+ cmdLinkV.ToolVersion = values[len(values)-1]
+ case ArgLinkPath:
+ cmdLinkV.Path = values[len(values)-1]
+ case FlagLocalParent:
+ if source == argv.FromEnv {
+ cmdLocalV.Parent = argv.EnvTruth(values[0])
+ } else {
+ cmdLocalV.Parent = values[0] == "true"
+ }
+ case FlagLocalFuzzy:
+ if source == argv.FromEnv {
+ cmdLocalV.Fuzzy = argv.EnvTruth(values[0])
+ } else {
+ cmdLocalV.Fuzzy = values[0] == "true"
+ }
+ case FlagLocalPath:
+ if source == argv.FromEnv {
+ cmdLocalV.Path = argv.EnvTruth(values[0])
+ } else {
+ cmdLocalV.Path = values[0] == "true"
+ }
+ case FlagLocalPin:
+ if source == argv.FromEnv {
+ cmdLocalV.Pin = argv.EnvTruth(values[0])
+ } else {
+ cmdLocalV.Pin = values[0] == "true"
+ }
+ case FlagLocalRemove:
+ cmdLocalV.Remove = append(cmdLocalV.Remove, values...)
+ case ArgLocalToolVersion:
+ cmdLocalV.ToolVersion = append(cmdLocalV.ToolVersion, values...)
+ case FlagLockGlobal:
+ if source == argv.FromEnv {
+ cmdLockV.Global = argv.EnvTruth(values[0])
+ } else {
+ cmdLockV.Global = values[0] == "true"
+ }
+ case FlagLockJobs:
+ cmdLockV.Jobs = values[len(values)-1]
+ case FlagLockDryRun:
+ if source == argv.FromEnv {
+ cmdLockV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdLockV.DryRun = values[0] == "true"
+ }
+ case FlagLockPlatform:
+ cmdLockV.Platform = append(cmdLockV.Platform, values...)
+ case FlagLockBump:
+ if source == argv.FromEnv {
+ cmdLockV.Bump = argv.EnvTruth(values[0])
+ } else {
+ cmdLockV.Bump = values[0] == "true"
+ }
+ case FlagLockJson:
+ if source == argv.FromEnv {
+ cmdLockV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdLockV.Json = values[0] == "true"
+ }
+ case FlagLockLocal:
+ if source == argv.FromEnv {
+ cmdLockV.Local = argv.EnvTruth(values[0])
+ } else {
+ cmdLockV.Local = values[0] == "true"
+ }
+ case FlagLockMinimumReleaseAge:
+ cmdLockV.MinimumReleaseAge = values[len(values)-1]
+ case ArgLockTool:
+ cmdLockV.Tool = append(cmdLockV.Tool, values...)
+ case FlagLsCurrent:
+ if source == argv.FromEnv {
+ cmdLsV.Current = argv.EnvTruth(values[0])
+ } else {
+ cmdLsV.Current = values[0] == "true"
+ }
+ case FlagLsGlobal:
+ if source == argv.FromEnv {
+ cmdLsV.Global = argv.EnvTruth(values[0])
+ } else {
+ cmdLsV.Global = values[0] == "true"
+ }
+ case FlagLsInstalled:
+ if source == argv.FromEnv {
+ cmdLsV.Installed = argv.EnvTruth(values[0])
+ } else {
+ cmdLsV.Installed = values[0] == "true"
+ }
+ case FlagLsJson:
+ if source == argv.FromEnv {
+ cmdLsV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdLsV.Json = values[0] == "true"
+ }
+ case FlagLsLocal:
+ if source == argv.FromEnv {
+ cmdLsV.Local = argv.EnvTruth(values[0])
+ } else {
+ cmdLsV.Local = values[0] == "true"
+ }
+ case FlagLsMissing:
+ if source == argv.FromEnv {
+ cmdLsV.Missing = argv.EnvTruth(values[0])
+ } else {
+ cmdLsV.Missing = values[0] == "true"
+ }
+ case FlagLsOffline:
+ if source == argv.FromEnv {
+ cmdLsV.Offline = argv.EnvTruth(values[0])
+ } else {
+ cmdLsV.Offline = values[0] == "true"
+ }
+ case FlagLsPlugin:
+ cmdLsV.Plugin = values[len(values)-1]
+ case FlagLsAllSources:
+ if source == argv.FromEnv {
+ cmdLsV.AllSources = argv.EnvTruth(values[0])
+ } else {
+ cmdLsV.AllSources = values[0] == "true"
+ }
+ case FlagLsMonorepo:
+ if source == argv.FromEnv {
+ cmdLsV.Monorepo = argv.EnvTruth(values[0])
+ } else {
+ cmdLsV.Monorepo = values[0] == "true"
+ }
+ case FlagLsNoHeader:
+ if source == argv.FromEnv {
+ cmdLsV.NoHeader = argv.EnvTruth(values[0])
+ } else {
+ cmdLsV.NoHeader = values[0] == "true"
+ }
+ case FlagLsOutdated:
+ if source == argv.FromEnv {
+ cmdLsV.Outdated = argv.EnvTruth(values[0])
+ } else {
+ cmdLsV.Outdated = values[0] == "true"
+ }
+ case FlagLsPrefix:
+ cmdLsV.Prefix = values[len(values)-1]
+ case FlagLsPrunable:
+ if source == argv.FromEnv {
+ cmdLsV.Prunable = argv.EnvTruth(values[0])
+ } else {
+ cmdLsV.Prunable = values[0] == "true"
+ }
+ case ArgLsInstalledTool:
+ cmdLsV.InstalledTool = append(cmdLsV.InstalledTool, values...)
+ case FlagLsRemoteAll:
+ if source == argv.FromEnv {
+ cmdLsRemoteV.All = argv.EnvTruth(values[0])
+ } else {
+ cmdLsRemoteV.All = values[0] == "true"
+ }
+ case FlagLsRemoteMinimumReleaseAge:
+ cmdLsRemoteV.MinimumReleaseAge = values[len(values)-1]
+ case FlagLsRemoteJson:
+ if source == argv.FromEnv {
+ cmdLsRemoteV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdLsRemoteV.Json = values[0] == "true"
+ }
+ case FlagLsRemoteNoVersionsHost:
+ if source == argv.FromEnv {
+ cmdLsRemoteV.NoVersionsHost = argv.EnvTruth(values[0])
+ } else {
+ cmdLsRemoteV.NoVersionsHost = values[0] == "true"
+ }
+ case FlagLsRemotePrerelease:
+ if source == argv.FromEnv {
+ cmdLsRemoteV.Prerelease = argv.EnvTruth(values[0])
+ } else {
+ cmdLsRemoteV.Prerelease = values[0] == "true"
+ }
+ case FlagLsRemoteStrictMetadata:
+ if source == argv.FromEnv {
+ cmdLsRemoteV.StrictMetadata = argv.EnvTruth(values[0])
+ } else {
+ cmdLsRemoteV.StrictMetadata = values[0] == "true"
+ }
+ case ArgLsRemoteToolVersion:
+ cmdLsRemoteV.ToolVersion = values[len(values)-1]
+ case ArgLsRemotePrefix:
+ cmdLsRemoteV.Prefix = values[len(values)-1]
+ case FlagOciBuildCopy:
+ cmdOciBuildV.Copy = append(cmdOciBuildV.Copy, values...)
+ case FlagOciBuildOutput:
+ cmdOciBuildV.Output = values[len(values)-1]
+ case FlagOciBuildFrom:
+ cmdOciBuildV.From = values[len(values)-1]
+ case FlagOciBuildIncludeGlobal:
+ if source == argv.FromEnv {
+ cmdOciBuildV.IncludeGlobal = argv.EnvTruth(values[0])
+ } else {
+ cmdOciBuildV.IncludeGlobal = values[0] == "true"
+ }
+ case FlagOciBuildTag:
+ cmdOciBuildV.Tag = values[len(values)-1]
+ case FlagOciBuildMountPoint:
+ cmdOciBuildV.MountPoint = values[len(values)-1]
+ case FlagOciBuildNoMise:
+ if source == argv.FromEnv {
+ cmdOciBuildV.NoMise = argv.EnvTruth(values[0])
+ } else {
+ cmdOciBuildV.NoMise = values[0] == "true"
+ }
+ case FlagOciBuildOwner:
+ cmdOciBuildV.Owner = values[len(values)-1]
+ case FlagOciPushCacheFrom:
+ cmdOciPushV.CacheFrom = values[len(values)-1]
+ case FlagOciPushFrom:
+ cmdOciPushV.From = values[len(values)-1]
+ case FlagOciPushImageDir:
+ cmdOciPushV.ImageDir = values[len(values)-1]
+ case FlagOciPushIncludeGlobal:
+ if source == argv.FromEnv {
+ cmdOciPushV.IncludeGlobal = argv.EnvTruth(values[0])
+ } else {
+ cmdOciPushV.IncludeGlobal = values[0] == "true"
+ }
+ case FlagOciPushMountPoint:
+ cmdOciPushV.MountPoint = values[len(values)-1]
+ case FlagOciPushNoCache:
+ if source == argv.FromEnv {
+ cmdOciPushV.NoCache = argv.EnvTruth(values[0])
+ } else {
+ cmdOciPushV.NoCache = values[0] == "true"
+ }
+ case FlagOciPushNoMise:
+ if source == argv.FromEnv {
+ cmdOciPushV.NoMise = argv.EnvTruth(values[0])
+ } else {
+ cmdOciPushV.NoMise = values[0] == "true"
+ }
+ case FlagOciPushOwner:
+ cmdOciPushV.Owner = values[len(values)-1]
+ case FlagOciPushUpdateIndex:
+ if source == argv.FromEnv {
+ cmdOciPushV.UpdateIndex = argv.EnvTruth(values[0])
+ } else {
+ cmdOciPushV.UpdateIndex = values[0] == "true"
+ }
+ case ArgOciPushRef:
+ cmdOciPushV.Ref = values[len(values)-1]
+ case FlagOciRunEngine:
+ cmdOciRunV.Engine = values[len(values)-1]
+ case FlagOciRunFrom:
+ cmdOciRunV.From = values[len(values)-1]
+ case FlagOciRunImageDir:
+ cmdOciRunV.ImageDir = values[len(values)-1]
+ case FlagOciRunIncludeGlobal:
+ if source == argv.FromEnv {
+ cmdOciRunV.IncludeGlobal = argv.EnvTruth(values[0])
+ } else {
+ cmdOciRunV.IncludeGlobal = values[0] == "true"
+ }
+ case FlagOciRunKeep:
+ if source == argv.FromEnv {
+ cmdOciRunV.Keep = argv.EnvTruth(values[0])
+ } else {
+ cmdOciRunV.Keep = values[0] == "true"
+ }
+ case FlagOciRunMountPoint:
+ cmdOciRunV.MountPoint = values[len(values)-1]
+ case FlagOciRunNoMise:
+ if source == argv.FromEnv {
+ cmdOciRunV.NoMise = argv.EnvTruth(values[0])
+ } else {
+ cmdOciRunV.NoMise = values[0] == "true"
+ }
+ case FlagOciRunOwner:
+ cmdOciRunV.Owner = values[len(values)-1]
+ case FlagOciRunVolume:
+ cmdOciRunV.Volume = append(cmdOciRunV.Volume, values...)
+ case FlagOciRunEnv:
+ cmdOciRunV.Env = append(cmdOciRunV.Env, values...)
+ case FlagOciRunInteractive:
+ if source == argv.FromEnv {
+ cmdOciRunV.Interactive = argv.EnvTruth(values[0])
+ } else {
+ cmdOciRunV.Interactive = values[0] == "true"
+ }
+ case FlagOciRunTty:
+ if source == argv.FromEnv {
+ cmdOciRunV.Tty = argv.EnvTruth(values[0])
+ } else {
+ cmdOciRunV.Tty = values[0] == "true"
+ }
+ case FlagOciRunWorkdir:
+ cmdOciRunV.Workdir = values[len(values)-1]
+ case ArgOciRunCmd:
+ cmdOciRunV.Cmd = append(cmdOciRunV.Cmd, values...)
+ case FlagOutdatedBump:
+ if source == argv.FromEnv {
+ cmdOutdatedV.Bump = argv.EnvTruth(values[0])
+ } else {
+ cmdOutdatedV.Bump = values[0] == "true"
+ }
+ case FlagOutdatedJson:
+ if source == argv.FromEnv {
+ cmdOutdatedV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdOutdatedV.Json = values[0] == "true"
+ }
+ case FlagOutdatedL:
+ if source == argv.FromEnv {
+ cmdOutdatedV.L = argv.EnvTruth(values[0])
+ } else {
+ cmdOutdatedV.L = values[0] == "true"
+ }
+ case FlagOutdatedInactive:
+ if source == argv.FromEnv {
+ cmdOutdatedV.Inactive = argv.EnvTruth(values[0])
+ } else {
+ cmdOutdatedV.Inactive = values[0] == "true"
+ }
+ case FlagOutdatedLocal:
+ if source == argv.FromEnv {
+ cmdOutdatedV.Local = argv.EnvTruth(values[0])
+ } else {
+ cmdOutdatedV.Local = values[0] == "true"
+ }
+ case FlagOutdatedMonorepo:
+ if source == argv.FromEnv {
+ cmdOutdatedV.Monorepo = argv.EnvTruth(values[0])
+ } else {
+ cmdOutdatedV.Monorepo = values[0] == "true"
+ }
+ case FlagOutdatedNoHeader:
+ if source == argv.FromEnv {
+ cmdOutdatedV.NoHeader = argv.EnvTruth(values[0])
+ } else {
+ cmdOutdatedV.NoHeader = values[0] == "true"
+ }
+ case ArgOutdatedToolVersion:
+ cmdOutdatedV.ToolVersion = append(cmdOutdatedV.ToolVersion, values...)
+ case FlagPatronsJson:
+ if source == argv.FromEnv {
+ cmdPatronsV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdPatronsV.Json = values[0] == "true"
+ }
+ case FlagPatronsRefresh:
+ if source == argv.FromEnv {
+ cmdPatronsV.Refresh = argv.EnvTruth(values[0])
+ } else {
+ cmdPatronsV.Refresh = values[0] == "true"
+ }
+ case FlagPluginsAll:
+ if source == argv.FromEnv {
+ cmdPluginsV.All = argv.EnvTruth(values[0])
+ } else {
+ cmdPluginsV.All = values[0] == "true"
+ }
+ case FlagPluginsCore:
+ if source == argv.FromEnv {
+ cmdPluginsV.Core = argv.EnvTruth(values[0])
+ } else {
+ cmdPluginsV.Core = values[0] == "true"
+ }
+ case FlagPluginsUrls:
+ if source == argv.FromEnv {
+ cmdPluginsV.Urls = argv.EnvTruth(values[0])
+ } else {
+ cmdPluginsV.Urls = values[0] == "true"
+ }
+ case FlagPluginsRefs:
+ if source == argv.FromEnv {
+ cmdPluginsV.Refs = argv.EnvTruth(values[0])
+ } else {
+ cmdPluginsV.Refs = values[0] == "true"
+ }
+ case FlagPluginsUser:
+ if source == argv.FromEnv {
+ cmdPluginsV.User = argv.EnvTruth(values[0])
+ } else {
+ cmdPluginsV.User = values[0] == "true"
+ }
+ case FlagPluginsInstallAll:
+ if source == argv.FromEnv {
+ cmdPluginsInstallV.All = argv.EnvTruth(values[0])
+ } else {
+ cmdPluginsInstallV.All = values[0] == "true"
+ }
+ case FlagPluginsInstallForce:
+ if source == argv.FromEnv {
+ cmdPluginsInstallV.Force = argv.EnvTruth(values[0])
+ } else {
+ cmdPluginsInstallV.Force = values[0] == "true"
+ }
+ case FlagPluginsInstallJobs:
+ cmdPluginsInstallV.Jobs = values[len(values)-1]
+ case ArgPluginsInstallNewPlugin:
+ cmdPluginsInstallV.NewPlugin = values[len(values)-1]
+ case ArgPluginsInstallGitUrl:
+ cmdPluginsInstallV.GitUrl = values[len(values)-1]
+ case ArgPluginsInstallRest:
+ cmdPluginsInstallV.Rest = append(cmdPluginsInstallV.Rest, values...)
+ case FlagPluginsLinkForce:
+ if source == argv.FromEnv {
+ cmdPluginsLinkV.Force = argv.EnvTruth(values[0])
+ } else {
+ cmdPluginsLinkV.Force = values[0] == "true"
+ }
+ case ArgPluginsLinkName:
+ cmdPluginsLinkV.Name = values[len(values)-1]
+ case ArgPluginsLinkDir:
+ cmdPluginsLinkV.Dir = values[len(values)-1]
+ case FlagPluginsLsAll:
+ if source == argv.FromEnv {
+ cmdPluginsLsV.All = argv.EnvTruth(values[0])
+ } else {
+ cmdPluginsLsV.All = values[0] == "true"
+ }
+ case FlagPluginsLsCore:
+ if source == argv.FromEnv {
+ cmdPluginsLsV.Core = argv.EnvTruth(values[0])
+ } else {
+ cmdPluginsLsV.Core = values[0] == "true"
+ }
+ case FlagPluginsLsOutdated:
+ if source == argv.FromEnv {
+ cmdPluginsLsV.Outdated = argv.EnvTruth(values[0])
+ } else {
+ cmdPluginsLsV.Outdated = values[0] == "true"
+ }
+ case FlagPluginsLsUrls:
+ if source == argv.FromEnv {
+ cmdPluginsLsV.Urls = argv.EnvTruth(values[0])
+ } else {
+ cmdPluginsLsV.Urls = values[0] == "true"
+ }
+ case FlagPluginsLsRefs:
+ if source == argv.FromEnv {
+ cmdPluginsLsV.Refs = argv.EnvTruth(values[0])
+ } else {
+ cmdPluginsLsV.Refs = values[0] == "true"
+ }
+ case FlagPluginsLsUser:
+ if source == argv.FromEnv {
+ cmdPluginsLsV.User = argv.EnvTruth(values[0])
+ } else {
+ cmdPluginsLsV.User = values[0] == "true"
+ }
+ case FlagPluginsLsRemoteUrls:
+ if source == argv.FromEnv {
+ cmdPluginsLsRemoteV.Urls = argv.EnvTruth(values[0])
+ } else {
+ cmdPluginsLsRemoteV.Urls = values[0] == "true"
+ }
+ case FlagPluginsLsRemoteOnlyNames:
+ if source == argv.FromEnv {
+ cmdPluginsLsRemoteV.OnlyNames = argv.EnvTruth(values[0])
+ } else {
+ cmdPluginsLsRemoteV.OnlyNames = values[0] == "true"
+ }
+ case FlagPluginsUninstallAll:
+ if source == argv.FromEnv {
+ cmdPluginsUninstallV.All = argv.EnvTruth(values[0])
+ } else {
+ cmdPluginsUninstallV.All = values[0] == "true"
+ }
+ case FlagPluginsUninstallPurge:
+ if source == argv.FromEnv {
+ cmdPluginsUninstallV.Purge = argv.EnvTruth(values[0])
+ } else {
+ cmdPluginsUninstallV.Purge = values[0] == "true"
+ }
+ case ArgPluginsUninstallPlugin:
+ cmdPluginsUninstallV.Plugin = append(cmdPluginsUninstallV.Plugin, values...)
+ case FlagPluginsUpdateJobs:
+ cmdPluginsUpdateV.Jobs = values[len(values)-1]
+ case ArgPluginsUpdatePlugin:
+ cmdPluginsUpdateV.Plugin = append(cmdPluginsUpdateV.Plugin, values...)
+ case FlagDepsExplain:
+ if source == argv.FromEnv {
+ cmdDepsV.Explain = argv.EnvTruth(values[0])
+ } else {
+ cmdDepsV.Explain = values[0] == "true"
+ }
+ case FlagDepsForce:
+ if source == argv.FromEnv {
+ cmdDepsV.Force = argv.EnvTruth(values[0])
+ } else {
+ cmdDepsV.Force = values[0] == "true"
+ }
+ case FlagDepsDryRun:
+ if source == argv.FromEnv {
+ cmdDepsV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdDepsV.DryRun = values[0] == "true"
+ }
+ case FlagDepsList:
+ if source == argv.FromEnv {
+ cmdDepsV.List = argv.EnvTruth(values[0])
+ } else {
+ cmdDepsV.List = values[0] == "true"
+ }
+ case FlagDepsMonorepo:
+ if source == argv.FromEnv {
+ cmdDepsV.Monorepo = argv.EnvTruth(values[0])
+ } else {
+ cmdDepsV.Monorepo = values[0] == "true"
+ }
+ case FlagDepsOnly:
+ cmdDepsV.Only = append(cmdDepsV.Only, values...)
+ case FlagDepsSkip:
+ cmdDepsV.Skip = append(cmdDepsV.Skip, values...)
+ case ArgDepsProvider:
+ cmdDepsV.Provider = values[len(values)-1]
+ case FlagDepsAddDev:
+ if source == argv.FromEnv {
+ cmdDepsAddV.Dev = argv.EnvTruth(values[0])
+ } else {
+ cmdDepsAddV.Dev = values[0] == "true"
+ }
+ case ArgDepsAddPackages:
+ cmdDepsAddV.Packages = append(cmdDepsAddV.Packages, values...)
+ case FlagDepsInstallExplain:
+ if source == argv.FromEnv {
+ cmdDepsInstallV.Explain = argv.EnvTruth(values[0])
+ } else {
+ cmdDepsInstallV.Explain = values[0] == "true"
+ }
+ case FlagDepsInstallForce:
+ if source == argv.FromEnv {
+ cmdDepsInstallV.Force = argv.EnvTruth(values[0])
+ } else {
+ cmdDepsInstallV.Force = values[0] == "true"
+ }
+ case FlagDepsInstallDryRun:
+ if source == argv.FromEnv {
+ cmdDepsInstallV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdDepsInstallV.DryRun = values[0] == "true"
+ }
+ case FlagDepsInstallList:
+ if source == argv.FromEnv {
+ cmdDepsInstallV.List = argv.EnvTruth(values[0])
+ } else {
+ cmdDepsInstallV.List = values[0] == "true"
+ }
+ case FlagDepsInstallMonorepo:
+ if source == argv.FromEnv {
+ cmdDepsInstallV.Monorepo = argv.EnvTruth(values[0])
+ } else {
+ cmdDepsInstallV.Monorepo = values[0] == "true"
+ }
+ case FlagDepsInstallOnly:
+ cmdDepsInstallV.Only = append(cmdDepsInstallV.Only, values...)
+ case FlagDepsInstallSkip:
+ cmdDepsInstallV.Skip = append(cmdDepsInstallV.Skip, values...)
+ case ArgDepsInstallProvider:
+ cmdDepsInstallV.Provider = values[len(values)-1]
+ case ArgDepsRemovePackages:
+ cmdDepsRemoveV.Packages = append(cmdDepsRemoveV.Packages, values...)
+ case FlagPruneDryRun:
+ if source == argv.FromEnv {
+ cmdPruneV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdPruneV.DryRun = values[0] == "true"
+ }
+ case FlagPruneConfigs:
+ if source == argv.FromEnv {
+ cmdPruneV.Configs = argv.EnvTruth(values[0])
+ } else {
+ cmdPruneV.Configs = values[0] == "true"
+ }
+ case FlagPruneDryRunCode:
+ if source == argv.FromEnv {
+ cmdPruneV.DryRunCode = argv.EnvTruth(values[0])
+ } else {
+ cmdPruneV.DryRunCode = values[0] == "true"
+ }
+ case FlagPruneMonorepo:
+ if source == argv.FromEnv {
+ cmdPruneV.Monorepo = argv.EnvTruth(values[0])
+ } else {
+ cmdPruneV.Monorepo = values[0] == "true"
+ }
+ case FlagPruneTools:
+ if source == argv.FromEnv {
+ cmdPruneV.Tools = argv.EnvTruth(values[0])
+ } else {
+ cmdPruneV.Tools = values[0] == "true"
+ }
+ case ArgPruneInstalledTool:
+ cmdPruneV.InstalledTool = append(cmdPruneV.InstalledTool, values...)
+ case FlagRegistryBackend:
+ cmdRegistryV.Backend = values[len(values)-1]
+ case FlagRegistryComplete:
+ if source == argv.FromEnv {
+ cmdRegistryV.Complete = argv.EnvTruth(values[0])
+ } else {
+ cmdRegistryV.Complete = values[0] == "true"
+ }
+ case FlagRegistryHideAliased:
+ if source == argv.FromEnv {
+ cmdRegistryV.HideAliased = argv.EnvTruth(values[0])
+ } else {
+ cmdRegistryV.HideAliased = values[0] == "true"
+ }
+ case FlagRegistryJson:
+ if source == argv.FromEnv {
+ cmdRegistryV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdRegistryV.Json = values[0] == "true"
+ }
+ case FlagRegistrySecurity:
+ if source == argv.FromEnv {
+ cmdRegistryV.Security = argv.EnvTruth(values[0])
+ } else {
+ cmdRegistryV.Security = values[0] == "true"
+ }
+ case ArgRegistryName:
+ cmdRegistryV.Name = values[len(values)-1]
+ case FlagReshimForce:
+ if source == argv.FromEnv {
+ cmdReshimV.Force = argv.EnvTruth(values[0])
+ } else {
+ cmdReshimV.Force = values[0] == "true"
+ }
+ case ArgReshimTool:
+ cmdReshimV.Tool = values[len(values)-1]
+ case ArgReshimVersion:
+ cmdReshimV.Version = values[len(values)-1]
+ case FlagRunAffected:
+ if source == argv.FromEnv {
+ cmdRunV.Affected = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.Affected = values[0] == "true"
+ }
+ case FlagRunAffectedBase:
+ cmdRunV.AffectedBase = values[len(values)-1]
+ case FlagRunAffectedExplain:
+ if source == argv.FromEnv {
+ cmdRunV.AffectedExplain = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.AffectedExplain = values[0] == "true"
+ }
+ case FlagRunAffectedHead:
+ cmdRunV.AffectedHead = values[len(values)-1]
+ case FlagRunAffectedJson:
+ if source == argv.FromEnv {
+ cmdRunV.AffectedJson = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.AffectedJson = values[0] == "true"
+ }
+ case FlagRunAll:
+ if source == argv.FromEnv {
+ cmdRunV.All = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.All = values[0] == "true"
+ }
+ case FlagRunContinueOnError:
+ if source == argv.FromEnv {
+ cmdRunV.ContinueOnError = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.ContinueOnError = values[0] == "true"
+ }
+ case FlagRunCd:
+ cmdRunV.Cd = values[len(values)-1]
+ case FlagRunForce:
+ if source == argv.FromEnv {
+ cmdRunV.Force = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.Force = values[0] == "true"
+ }
+ case FlagRunJobs:
+ cmdRunV.Jobs = values[len(values)-1]
+ case FlagRunDryRun:
+ if source == argv.FromEnv {
+ cmdRunV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.DryRun = values[0] == "true"
+ }
+ case FlagRunOutput:
+ cmdRunV.Output = values[len(values)-1]
+ case FlagRunQuiet:
+ if source == argv.FromEnv {
+ cmdRunV.Quiet = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.Quiet = values[0] == "true"
+ }
+ case FlagRunRaw:
+ if source == argv.FromEnv {
+ cmdRunV.Raw = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.Raw = values[0] == "true"
+ }
+ case FlagRunShell:
+ cmdRunV.Shell = values[len(values)-1]
+ case FlagRunSilent:
+ if source == argv.FromEnv {
+ cmdRunV.Silent = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.Silent = values[0] == "true"
+ }
+ case FlagRunTool:
+ cmdRunV.Tool = append(cmdRunV.Tool, values...)
+ case FlagRunAllowEnv:
+ cmdRunV.AllowEnv = append(cmdRunV.AllowEnv, values...)
+ case FlagRunAllowNet:
+ cmdRunV.AllowNet = append(cmdRunV.AllowNet, values...)
+ case FlagRunAllowRead:
+ cmdRunV.AllowRead = append(cmdRunV.AllowRead, values...)
+ case FlagRunAllowWrite:
+ cmdRunV.AllowWrite = append(cmdRunV.AllowWrite, values...)
+ case FlagRunDenyAll:
+ if source == argv.FromEnv {
+ cmdRunV.DenyAll = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.DenyAll = values[0] == "true"
+ }
+ case FlagRunDenyEnv:
+ if source == argv.FromEnv {
+ cmdRunV.DenyEnv = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.DenyEnv = values[0] == "true"
+ }
+ case FlagRunDenyNet:
+ if source == argv.FromEnv {
+ cmdRunV.DenyNet = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.DenyNet = values[0] == "true"
+ }
+ case FlagRunDenyRead:
+ if source == argv.FromEnv {
+ cmdRunV.DenyRead = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.DenyRead = values[0] == "true"
+ }
+ case FlagRunDenyWrite:
+ if source == argv.FromEnv {
+ cmdRunV.DenyWrite = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.DenyWrite = values[0] == "true"
+ }
+ case FlagRunFreshEnv:
+ if source == argv.FromEnv {
+ cmdRunV.FreshEnv = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.FreshEnv = values[0] == "true"
+ }
+ case FlagRunNoCache:
+ if source == argv.FromEnv {
+ cmdRunV.NoCache = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.NoCache = values[0] == "true"
+ }
+ case FlagRunNoDeps:
+ if source == argv.FromEnv {
+ cmdRunV.NoDeps = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.NoDeps = values[0] == "true"
+ }
+ case FlagRunNoTimings:
+ if source == argv.FromEnv {
+ cmdRunV.NoTimings = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.NoTimings = values[0] == "true"
+ }
+ case FlagRunSkipDeps:
+ if source == argv.FromEnv {
+ cmdRunV.SkipDeps = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.SkipDeps = values[0] == "true"
+ }
+ case FlagRunSkipTools:
+ if source == argv.FromEnv {
+ cmdRunV.SkipTools = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.SkipTools = values[0] == "true"
+ }
+ case FlagRunTaskCache:
+ cmdRunV.TaskCache = values[len(values)-1]
+ case FlagRunTaskCacheExplain:
+ if source == argv.FromEnv {
+ cmdRunV.TaskCacheExplain = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.TaskCacheExplain = values[0] == "true"
+ }
+ case FlagRunTaskCacheExplainJson:
+ if source == argv.FromEnv {
+ cmdRunV.TaskCacheExplainJson = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.TaskCacheExplainJson = values[0] == "true"
+ }
+ case FlagRunTaskCacheStats:
+ if source == argv.FromEnv {
+ cmdRunV.TaskCacheStats = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.TaskCacheStats = values[0] == "true"
+ }
+ case FlagRunTimeout:
+ cmdRunV.Timeout = values[len(values)-1]
+ case FlagRunTimings:
+ if source == argv.FromEnv {
+ cmdRunV.Timings = argv.EnvTruth(values[0])
+ } else {
+ cmdRunV.Timings = values[0] == "true"
+ }
+ case FlagSearchInteractive:
+ if source == argv.FromEnv {
+ cmdSearchV.Interactive = argv.EnvTruth(values[0])
+ } else {
+ cmdSearchV.Interactive = values[0] == "true"
+ }
+ case FlagSearchMatchType:
+ cmdSearchV.MatchType = values[len(values)-1]
+ case FlagSearchNoHeader:
+ if source == argv.FromEnv {
+ cmdSearchV.NoHeader = argv.EnvTruth(values[0])
+ } else {
+ cmdSearchV.NoHeader = values[0] == "true"
+ }
+ case ArgSearchName:
+ cmdSearchV.Name = values[len(values)-1]
+ case FlagSelfUpdateForce:
+ if source == argv.FromEnv {
+ cmdSelfUpdateV.Force = argv.EnvTruth(values[0])
+ } else {
+ cmdSelfUpdateV.Force = values[0] == "true"
+ }
+ case FlagSelfUpdateYes:
+ if source == argv.FromEnv {
+ cmdSelfUpdateV.Yes = argv.EnvTruth(values[0])
+ } else {
+ cmdSelfUpdateV.Yes = values[0] == "true"
+ }
+ case FlagSelfUpdateNoPlugins:
+ if source == argv.FromEnv {
+ cmdSelfUpdateV.NoPlugins = argv.EnvTruth(values[0])
+ } else {
+ cmdSelfUpdateV.NoPlugins = values[0] == "true"
+ }
+ case ArgSelfUpdateVersion:
+ cmdSelfUpdateV.Version = values[len(values)-1]
+ case FlagSetEnv:
+ cmdSetV.Env = values[len(values)-1]
+ case FlagSetGlobal:
+ if source == argv.FromEnv {
+ cmdSetV.Global = argv.EnvTruth(values[0])
+ } else {
+ cmdSetV.Global = values[0] == "true"
+ }
+ case FlagSetAgeEncrypt:
+ if source == argv.FromEnv {
+ cmdSetV.AgeEncrypt = argv.EnvTruth(values[0])
+ } else {
+ cmdSetV.AgeEncrypt = values[0] == "true"
+ }
+ case FlagSetAgeKeyFile:
+ cmdSetV.AgeKeyFile = values[len(values)-1]
+ case FlagSetAgeRecipient:
+ cmdSetV.AgeRecipient = append(cmdSetV.AgeRecipient, values...)
+ case FlagSetAgeSshRecipient:
+ cmdSetV.AgeSshRecipient = append(cmdSetV.AgeSshRecipient, values...)
+ case FlagSetComplete:
+ if source == argv.FromEnv {
+ cmdSetV.Complete = argv.EnvTruth(values[0])
+ } else {
+ cmdSetV.Complete = values[0] == "true"
+ }
+ case FlagSetFile:
+ cmdSetV.File = values[len(values)-1]
+ case FlagSetNoRedact:
+ if source == argv.FromEnv {
+ cmdSetV.NoRedact = argv.EnvTruth(values[0])
+ } else {
+ cmdSetV.NoRedact = values[0] == "true"
+ }
+ case FlagSetPrompt:
+ if source == argv.FromEnv {
+ cmdSetV.Prompt = argv.EnvTruth(values[0])
+ } else {
+ cmdSetV.Prompt = values[0] == "true"
+ }
+ case FlagSetRemove:
+ cmdSetV.Remove = append(cmdSetV.Remove, values...)
+ case FlagSetStdin:
+ if source == argv.FromEnv {
+ cmdSetV.Stdin = argv.EnvTruth(values[0])
+ } else {
+ cmdSetV.Stdin = values[0] == "true"
+ }
+ case ArgSetEnvVar:
+ cmdSetV.EnvVar = append(cmdSetV.EnvVar, values...)
+ case FlagSettingsAll:
+ if source == argv.FromEnv {
+ cmdSettingsV.All = argv.EnvTruth(values[0])
+ } else {
+ cmdSettingsV.All = values[0] == "true"
+ }
+ case FlagSettingsJson:
+ if source == argv.FromEnv {
+ cmdSettingsV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdSettingsV.Json = values[0] == "true"
+ }
+ case FlagSettingsLocal:
+ if source == argv.FromEnv {
+ cmdSettingsV.Local = argv.EnvTruth(values[0])
+ } else {
+ cmdSettingsV.Local = values[0] == "true"
+ }
+ case FlagSettingsToml:
+ if source == argv.FromEnv {
+ cmdSettingsV.Toml = argv.EnvTruth(values[0])
+ } else {
+ cmdSettingsV.Toml = values[0] == "true"
+ }
+ case FlagSettingsComplete:
+ if source == argv.FromEnv {
+ cmdSettingsV.Complete = argv.EnvTruth(values[0])
+ } else {
+ cmdSettingsV.Complete = values[0] == "true"
+ }
+ case FlagSettingsJsonExtended:
+ if source == argv.FromEnv {
+ cmdSettingsV.JsonExtended = argv.EnvTruth(values[0])
+ } else {
+ cmdSettingsV.JsonExtended = values[0] == "true"
+ }
+ case ArgSettingsSetting:
+ cmdSettingsV.Setting = values[len(values)-1]
+ case ArgSettingsValue:
+ cmdSettingsV.Value = values[len(values)-1]
+ case FlagSettingsAddLocal:
+ if source == argv.FromEnv {
+ cmdSettingsAddV.Local = argv.EnvTruth(values[0])
+ } else {
+ cmdSettingsAddV.Local = values[0] == "true"
+ }
+ case ArgSettingsAddSetting:
+ cmdSettingsAddV.Setting = values[len(values)-1]
+ case ArgSettingsAddValue:
+ cmdSettingsAddV.Value = values[len(values)-1]
+ case FlagSettingsGetLocal:
+ if source == argv.FromEnv {
+ cmdSettingsGetV.Local = argv.EnvTruth(values[0])
+ } else {
+ cmdSettingsGetV.Local = values[0] == "true"
+ }
+ case ArgSettingsGetSetting:
+ cmdSettingsGetV.Setting = values[len(values)-1]
+ case FlagSettingsLsAll:
+ if source == argv.FromEnv {
+ cmdSettingsLsV.All = argv.EnvTruth(values[0])
+ } else {
+ cmdSettingsLsV.All = values[0] == "true"
+ }
+ case FlagSettingsLsJson:
+ if source == argv.FromEnv {
+ cmdSettingsLsV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdSettingsLsV.Json = values[0] == "true"
+ }
+ case FlagSettingsLsLocal:
+ if source == argv.FromEnv {
+ cmdSettingsLsV.Local = argv.EnvTruth(values[0])
+ } else {
+ cmdSettingsLsV.Local = values[0] == "true"
+ }
+ case FlagSettingsLsToml:
+ if source == argv.FromEnv {
+ cmdSettingsLsV.Toml = argv.EnvTruth(values[0])
+ } else {
+ cmdSettingsLsV.Toml = values[0] == "true"
+ }
+ case FlagSettingsLsComplete:
+ if source == argv.FromEnv {
+ cmdSettingsLsV.Complete = argv.EnvTruth(values[0])
+ } else {
+ cmdSettingsLsV.Complete = values[0] == "true"
+ }
+ case FlagSettingsLsJsonExtended:
+ if source == argv.FromEnv {
+ cmdSettingsLsV.JsonExtended = argv.EnvTruth(values[0])
+ } else {
+ cmdSettingsLsV.JsonExtended = values[0] == "true"
+ }
+ case ArgSettingsLsSetting:
+ cmdSettingsLsV.Setting = values[len(values)-1]
+ case FlagSettingsSetLocal:
+ if source == argv.FromEnv {
+ cmdSettingsSetV.Local = argv.EnvTruth(values[0])
+ } else {
+ cmdSettingsSetV.Local = values[0] == "true"
+ }
+ case ArgSettingsSetSetting:
+ cmdSettingsSetV.Setting = values[len(values)-1]
+ case ArgSettingsSetValue:
+ cmdSettingsSetV.Value = values[len(values)-1]
+ case FlagSettingsUnsetLocal:
+ if source == argv.FromEnv {
+ cmdSettingsUnsetV.Local = argv.EnvTruth(values[0])
+ } else {
+ cmdSettingsUnsetV.Local = values[0] == "true"
+ }
+ case ArgSettingsUnsetKey:
+ cmdSettingsUnsetV.Key = values[len(values)-1]
+ case FlagShellJobs:
+ cmdShellV.Jobs = values[len(values)-1]
+ case FlagShellUnset:
+ if source == argv.FromEnv {
+ cmdShellV.Unset = argv.EnvTruth(values[0])
+ } else {
+ cmdShellV.Unset = values[0] == "true"
+ }
+ case FlagShellRaw:
+ if source == argv.FromEnv {
+ cmdShellV.Raw = argv.EnvTruth(values[0])
+ } else {
+ cmdShellV.Raw = values[0] == "true"
+ }
+ case ArgShellToolVersion:
+ cmdShellV.ToolVersion = append(cmdShellV.ToolVersion, values...)
+ case FlagShellAliasNoHeader:
+ if source == argv.FromEnv {
+ cmdShellAliasV.NoHeader = argv.EnvTruth(values[0])
+ } else {
+ cmdShellAliasV.NoHeader = values[0] == "true"
+ }
+ case ArgShellAliasGetShellAlias:
+ cmdShellAliasGetV.ShellAlias = values[len(values)-1]
+ case FlagShellAliasLsNoHeader:
+ if source == argv.FromEnv {
+ cmdShellAliasLsV.NoHeader = argv.EnvTruth(values[0])
+ } else {
+ cmdShellAliasLsV.NoHeader = values[0] == "true"
+ }
+ case ArgShellAliasSetShellAlias:
+ cmdShellAliasSetV.ShellAlias = values[len(values)-1]
+ case ArgShellAliasSetCommand:
+ cmdShellAliasSetV.Command = values[len(values)-1]
+ case ArgShellAliasUnsetShellAlias:
+ cmdShellAliasUnsetV.ShellAlias = values[len(values)-1]
+ case FlagSyncNodeBrew:
+ if source == argv.FromEnv {
+ cmdSyncNodeV.Brew = argv.EnvTruth(values[0])
+ } else {
+ cmdSyncNodeV.Brew = values[0] == "true"
+ }
+ case FlagSyncNodeNodenv:
+ if source == argv.FromEnv {
+ cmdSyncNodeV.Nodenv = argv.EnvTruth(values[0])
+ } else {
+ cmdSyncNodeV.Nodenv = values[0] == "true"
+ }
+ case FlagSyncNodeNvm:
+ if source == argv.FromEnv {
+ cmdSyncNodeV.Nvm = argv.EnvTruth(values[0])
+ } else {
+ cmdSyncNodeV.Nvm = values[0] == "true"
+ }
+ case FlagSyncPythonPyenv:
+ if source == argv.FromEnv {
+ cmdSyncPythonV.Pyenv = argv.EnvTruth(values[0])
+ } else {
+ cmdSyncPythonV.Pyenv = values[0] == "true"
+ }
+ case FlagSyncPythonUv:
+ if source == argv.FromEnv {
+ cmdSyncPythonV.Uv = argv.EnvTruth(values[0])
+ } else {
+ cmdSyncPythonV.Uv = values[0] == "true"
+ }
+ case FlagSyncRubyBrew:
+ if source == argv.FromEnv {
+ cmdSyncRubyV.Brew = argv.EnvTruth(values[0])
+ } else {
+ cmdSyncRubyV.Brew = values[0] == "true"
+ }
+ case FlagTasksGlobal:
+ if source == argv.FromEnv {
+ cmdTasksV.Global = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksV.Global = values[0] == "true"
+ }
+ case FlagTasksJson:
+ if source == argv.FromEnv {
+ cmdTasksV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksV.Json = values[0] == "true"
+ }
+ case FlagTasksLocal:
+ if source == argv.FromEnv {
+ cmdTasksV.Local = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksV.Local = values[0] == "true"
+ }
+ case FlagTasksExtended:
+ if source == argv.FromEnv {
+ cmdTasksV.Extended = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksV.Extended = values[0] == "true"
+ }
+ case FlagTasksAll:
+ if source == argv.FromEnv {
+ cmdTasksV.All = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksV.All = values[0] == "true"
+ }
+ case FlagTasksComplete:
+ if source == argv.FromEnv {
+ cmdTasksV.Complete = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksV.Complete = values[0] == "true"
+ }
+ case FlagTasksHidden:
+ if source == argv.FromEnv {
+ cmdTasksV.Hidden = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksV.Hidden = values[0] == "true"
+ }
+ case FlagTasksNameOnly:
+ if source == argv.FromEnv {
+ cmdTasksV.NameOnly = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksV.NameOnly = values[0] == "true"
+ }
+ case FlagTasksNoHeader:
+ if source == argv.FromEnv {
+ cmdTasksV.NoHeader = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksV.NoHeader = values[0] == "true"
+ }
+ case FlagTasksSort:
+ cmdTasksV.Sort = values[len(values)-1]
+ case FlagTasksSortOrder:
+ cmdTasksV.SortOrder = values[len(values)-1]
+ case FlagTasksUsage:
+ if source == argv.FromEnv {
+ cmdTasksV.Usage = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksV.Usage = values[0] == "true"
+ }
+ case ArgTasksTask:
+ cmdTasksV.Task = values[len(values)-1]
+ case FlagTasksAddAlias:
+ cmdTasksAddV.Alias = append(cmdTasksAddV.Alias, values...)
+ case FlagTasksAddDepends:
+ cmdTasksAddV.Depends = append(cmdTasksAddV.Depends, values...)
+ case FlagTasksAddDir:
+ cmdTasksAddV.Dir = values[len(values)-1]
+ case FlagTasksAddFile:
+ if source == argv.FromEnv {
+ cmdTasksAddV.File = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksAddV.File = values[0] == "true"
+ }
+ case FlagTasksAddHide:
+ if source == argv.FromEnv {
+ cmdTasksAddV.Hide = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksAddV.Hide = values[0] == "true"
+ }
+ case FlagTasksAddQuiet:
+ if source == argv.FromEnv {
+ cmdTasksAddV.Quiet = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksAddV.Quiet = values[0] == "true"
+ }
+ case FlagTasksAddRaw:
+ if source == argv.FromEnv {
+ cmdTasksAddV.Raw = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksAddV.Raw = values[0] == "true"
+ }
+ case FlagTasksAddSources:
+ cmdTasksAddV.Sources = append(cmdTasksAddV.Sources, values...)
+ case FlagTasksAddWaitFor:
+ cmdTasksAddV.WaitFor = append(cmdTasksAddV.WaitFor, values...)
+ case FlagTasksAddDependsPost:
+ cmdTasksAddV.DependsPost = append(cmdTasksAddV.DependsPost, values...)
+ case FlagTasksAddDescription:
+ cmdTasksAddV.Description = values[len(values)-1]
+ case FlagTasksAddOutputs:
+ cmdTasksAddV.Outputs = append(cmdTasksAddV.Outputs, values...)
+ case FlagTasksAddRunWindows:
+ cmdTasksAddV.RunWindows = values[len(values)-1]
+ case FlagTasksAddShell:
+ cmdTasksAddV.Shell = values[len(values)-1]
+ case FlagTasksAddSilent:
+ if source == argv.FromEnv {
+ cmdTasksAddV.Silent = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksAddV.Silent = values[0] == "true"
+ }
+ case ArgTasksAddTask:
+ cmdTasksAddV.Task = values[len(values)-1]
+ case ArgTasksAddRun:
+ cmdTasksAddV.Run = append(cmdTasksAddV.Run, values...)
+ case FlagTasksDepsCompact:
+ if source == argv.FromEnv {
+ cmdTasksDepsV.Compact = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksDepsV.Compact = values[0] == "true"
+ }
+ case FlagTasksDepsDot:
+ if source == argv.FromEnv {
+ cmdTasksDepsV.Dot = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksDepsV.Dot = values[0] == "true"
+ }
+ case FlagTasksDepsHidden:
+ if source == argv.FromEnv {
+ cmdTasksDepsV.Hidden = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksDepsV.Hidden = values[0] == "true"
+ }
+ case ArgTasksDepsTasks:
+ cmdTasksDepsV.Tasks = append(cmdTasksDepsV.Tasks, values...)
+ case FlagTasksEditPath:
+ if source == argv.FromEnv {
+ cmdTasksEditV.Path = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksEditV.Path = values[0] == "true"
+ }
+ case ArgTasksEditTask:
+ cmdTasksEditV.Task = values[len(values)-1]
+ case FlagTasksGraphJson:
+ if source == argv.FromEnv {
+ cmdTasksGraphV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksGraphV.Json = values[0] == "true"
+ }
+ case FlagTasksGraphExplain:
+ if source == argv.FromEnv {
+ cmdTasksGraphV.Explain = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksGraphV.Explain = values[0] == "true"
+ }
+ case FlagTasksGraphNoHeader:
+ if source == argv.FromEnv {
+ cmdTasksGraphV.NoHeader = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksGraphV.NoHeader = values[0] == "true"
+ }
+ case FlagTasksInfoJson:
+ if source == argv.FromEnv {
+ cmdTasksInfoV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksInfoV.Json = values[0] == "true"
+ }
+ case ArgTasksInfoTask:
+ cmdTasksInfoV.Task = values[len(values)-1]
+ case FlagTasksLsGlobal:
+ if source == argv.FromEnv {
+ cmdTasksLsV.Global = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksLsV.Global = values[0] == "true"
+ }
+ case FlagTasksLsJson:
+ if source == argv.FromEnv {
+ cmdTasksLsV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksLsV.Json = values[0] == "true"
+ }
+ case FlagTasksLsLocal:
+ if source == argv.FromEnv {
+ cmdTasksLsV.Local = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksLsV.Local = values[0] == "true"
+ }
+ case FlagTasksLsExtended:
+ if source == argv.FromEnv {
+ cmdTasksLsV.Extended = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksLsV.Extended = values[0] == "true"
+ }
+ case FlagTasksLsAll:
+ if source == argv.FromEnv {
+ cmdTasksLsV.All = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksLsV.All = values[0] == "true"
+ }
+ case FlagTasksLsComplete:
+ if source == argv.FromEnv {
+ cmdTasksLsV.Complete = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksLsV.Complete = values[0] == "true"
+ }
+ case FlagTasksLsHidden:
+ if source == argv.FromEnv {
+ cmdTasksLsV.Hidden = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksLsV.Hidden = values[0] == "true"
+ }
+ case FlagTasksLsNameOnly:
+ if source == argv.FromEnv {
+ cmdTasksLsV.NameOnly = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksLsV.NameOnly = values[0] == "true"
+ }
+ case FlagTasksLsNoHeader:
+ if source == argv.FromEnv {
+ cmdTasksLsV.NoHeader = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksLsV.NoHeader = values[0] == "true"
+ }
+ case FlagTasksLsSort:
+ cmdTasksLsV.Sort = values[len(values)-1]
+ case FlagTasksLsSortOrder:
+ cmdTasksLsV.SortOrder = values[len(values)-1]
+ case FlagTasksLsUsage:
+ if source == argv.FromEnv {
+ cmdTasksLsV.Usage = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksLsV.Usage = values[0] == "true"
+ }
+ case FlagTasksRunAffected:
+ if source == argv.FromEnv {
+ cmdTasksRunV.Affected = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.Affected = values[0] == "true"
+ }
+ case FlagTasksRunAffectedBase:
+ cmdTasksRunV.AffectedBase = values[len(values)-1]
+ case FlagTasksRunAffectedExplain:
+ if source == argv.FromEnv {
+ cmdTasksRunV.AffectedExplain = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.AffectedExplain = values[0] == "true"
+ }
+ case FlagTasksRunAffectedHead:
+ cmdTasksRunV.AffectedHead = values[len(values)-1]
+ case FlagTasksRunAffectedJson:
+ if source == argv.FromEnv {
+ cmdTasksRunV.AffectedJson = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.AffectedJson = values[0] == "true"
+ }
+ case FlagTasksRunAll:
+ if source == argv.FromEnv {
+ cmdTasksRunV.All = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.All = values[0] == "true"
+ }
+ case FlagTasksRunContinueOnError:
+ if source == argv.FromEnv {
+ cmdTasksRunV.ContinueOnError = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.ContinueOnError = values[0] == "true"
+ }
+ case FlagTasksRunCd:
+ cmdTasksRunV.Cd = values[len(values)-1]
+ case FlagTasksRunForce:
+ if source == argv.FromEnv {
+ cmdTasksRunV.Force = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.Force = values[0] == "true"
+ }
+ case FlagTasksRunJobs:
+ cmdTasksRunV.Jobs = values[len(values)-1]
+ case FlagTasksRunDryRun:
+ if source == argv.FromEnv {
+ cmdTasksRunV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.DryRun = values[0] == "true"
+ }
+ case FlagTasksRunOutput:
+ cmdTasksRunV.Output = values[len(values)-1]
+ case FlagTasksRunQuiet:
+ if source == argv.FromEnv {
+ cmdTasksRunV.Quiet = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.Quiet = values[0] == "true"
+ }
+ case FlagTasksRunRaw:
+ if source == argv.FromEnv {
+ cmdTasksRunV.Raw = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.Raw = values[0] == "true"
+ }
+ case FlagTasksRunShell:
+ cmdTasksRunV.Shell = values[len(values)-1]
+ case FlagTasksRunSilent:
+ if source == argv.FromEnv {
+ cmdTasksRunV.Silent = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.Silent = values[0] == "true"
+ }
+ case FlagTasksRunTool:
+ cmdTasksRunV.Tool = append(cmdTasksRunV.Tool, values...)
+ case FlagTasksRunAllowEnv:
+ cmdTasksRunV.AllowEnv = append(cmdTasksRunV.AllowEnv, values...)
+ case FlagTasksRunAllowNet:
+ cmdTasksRunV.AllowNet = append(cmdTasksRunV.AllowNet, values...)
+ case FlagTasksRunAllowRead:
+ cmdTasksRunV.AllowRead = append(cmdTasksRunV.AllowRead, values...)
+ case FlagTasksRunAllowWrite:
+ cmdTasksRunV.AllowWrite = append(cmdTasksRunV.AllowWrite, values...)
+ case FlagTasksRunDenyAll:
+ if source == argv.FromEnv {
+ cmdTasksRunV.DenyAll = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.DenyAll = values[0] == "true"
+ }
+ case FlagTasksRunDenyEnv:
+ if source == argv.FromEnv {
+ cmdTasksRunV.DenyEnv = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.DenyEnv = values[0] == "true"
+ }
+ case FlagTasksRunDenyNet:
+ if source == argv.FromEnv {
+ cmdTasksRunV.DenyNet = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.DenyNet = values[0] == "true"
+ }
+ case FlagTasksRunDenyRead:
+ if source == argv.FromEnv {
+ cmdTasksRunV.DenyRead = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.DenyRead = values[0] == "true"
+ }
+ case FlagTasksRunDenyWrite:
+ if source == argv.FromEnv {
+ cmdTasksRunV.DenyWrite = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.DenyWrite = values[0] == "true"
+ }
+ case FlagTasksRunFreshEnv:
+ if source == argv.FromEnv {
+ cmdTasksRunV.FreshEnv = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.FreshEnv = values[0] == "true"
+ }
+ case FlagTasksRunNoCache:
+ if source == argv.FromEnv {
+ cmdTasksRunV.NoCache = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.NoCache = values[0] == "true"
+ }
+ case FlagTasksRunNoDeps:
+ if source == argv.FromEnv {
+ cmdTasksRunV.NoDeps = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.NoDeps = values[0] == "true"
+ }
+ case FlagTasksRunNoTimings:
+ if source == argv.FromEnv {
+ cmdTasksRunV.NoTimings = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.NoTimings = values[0] == "true"
+ }
+ case FlagTasksRunSkipDeps:
+ if source == argv.FromEnv {
+ cmdTasksRunV.SkipDeps = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.SkipDeps = values[0] == "true"
+ }
+ case FlagTasksRunSkipTools:
+ if source == argv.FromEnv {
+ cmdTasksRunV.SkipTools = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.SkipTools = values[0] == "true"
+ }
+ case FlagTasksRunTaskCache:
+ cmdTasksRunV.TaskCache = values[len(values)-1]
+ case FlagTasksRunTaskCacheExplain:
+ if source == argv.FromEnv {
+ cmdTasksRunV.TaskCacheExplain = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.TaskCacheExplain = values[0] == "true"
+ }
+ case FlagTasksRunTaskCacheExplainJson:
+ if source == argv.FromEnv {
+ cmdTasksRunV.TaskCacheExplainJson = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.TaskCacheExplainJson = values[0] == "true"
+ }
+ case FlagTasksRunTaskCacheStats:
+ if source == argv.FromEnv {
+ cmdTasksRunV.TaskCacheStats = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.TaskCacheStats = values[0] == "true"
+ }
+ case FlagTasksRunTimeout:
+ cmdTasksRunV.Timeout = values[len(values)-1]
+ case FlagTasksRunTimings:
+ if source == argv.FromEnv {
+ cmdTasksRunV.Timings = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksRunV.Timings = values[0] == "true"
+ }
+ case ArgTasksRunTask:
+ cmdTasksRunV.Task = values[len(values)-1]
+ case ArgTasksRunArgs:
+ cmdTasksRunV.Args = append(cmdTasksRunV.Args, values...)
+ case ArgTasksRunArgsLast:
+ cmdTasksRunV.ArgsLast = append(cmdTasksRunV.ArgsLast, values...)
+ case FlagTasksValidateErrorsOnly:
+ if source == argv.FromEnv {
+ cmdTasksValidateV.ErrorsOnly = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksValidateV.ErrorsOnly = values[0] == "true"
+ }
+ case FlagTasksValidateJson:
+ if source == argv.FromEnv {
+ cmdTasksValidateV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdTasksValidateV.Json = values[0] == "true"
+ }
+ case ArgTasksValidateTasks:
+ cmdTasksValidateV.Tasks = append(cmdTasksValidateV.Tasks, values...)
+ case FlagTestToolAll:
+ if source == argv.FromEnv {
+ cmdTestToolV.All = argv.EnvTruth(values[0])
+ } else {
+ cmdTestToolV.All = values[0] == "true"
+ }
+ case FlagTestToolJobs:
+ cmdTestToolV.Jobs = values[len(values)-1]
+ case FlagTestToolAllConfig:
+ if source == argv.FromEnv {
+ cmdTestToolV.AllConfig = argv.EnvTruth(values[0])
+ } else {
+ cmdTestToolV.AllConfig = values[0] == "true"
+ }
+ case FlagTestToolIncludeNonDefined:
+ if source == argv.FromEnv {
+ cmdTestToolV.IncludeNonDefined = argv.EnvTruth(values[0])
+ } else {
+ cmdTestToolV.IncludeNonDefined = values[0] == "true"
+ }
+ case FlagTestToolRaw:
+ if source == argv.FromEnv {
+ cmdTestToolV.Raw = argv.EnvTruth(values[0])
+ } else {
+ cmdTestToolV.Raw = values[0] == "true"
+ }
+ case ArgTestToolTools:
+ cmdTestToolV.Tools = append(cmdTestToolV.Tools, values...)
+ case FlagTokenForgejoUnmask:
+ if source == argv.FromEnv {
+ cmdTokenForgejoV.Unmask = argv.EnvTruth(values[0])
+ } else {
+ cmdTokenForgejoV.Unmask = values[0] == "true"
+ }
+ case ArgTokenForgejoHost:
+ cmdTokenForgejoV.Host = values[len(values)-1]
+ case FlagTokenGithubOauth:
+ if source == argv.FromEnv {
+ cmdTokenGithubV.Oauth = argv.EnvTruth(values[0])
+ } else {
+ cmdTokenGithubV.Oauth = values[0] == "true"
+ }
+ case FlagTokenGithubRaw:
+ if source == argv.FromEnv {
+ cmdTokenGithubV.Raw = argv.EnvTruth(values[0])
+ } else {
+ cmdTokenGithubV.Raw = values[0] == "true"
+ }
+ case FlagTokenGithubRefresh:
+ if source == argv.FromEnv {
+ cmdTokenGithubV.Refresh = argv.EnvTruth(values[0])
+ } else {
+ cmdTokenGithubV.Refresh = values[0] == "true"
+ }
+ case FlagTokenGithubUnmask:
+ if source == argv.FromEnv {
+ cmdTokenGithubV.Unmask = argv.EnvTruth(values[0])
+ } else {
+ cmdTokenGithubV.Unmask = values[0] == "true"
+ }
+ case ArgTokenGithubHost:
+ cmdTokenGithubV.Host = values[len(values)-1]
+ case FlagTokenGitlabUnmask:
+ if source == argv.FromEnv {
+ cmdTokenGitlabV.Unmask = argv.EnvTruth(values[0])
+ } else {
+ cmdTokenGitlabV.Unmask = values[0] == "true"
+ }
+ case ArgTokenGitlabHost:
+ cmdTokenGitlabV.Host = values[len(values)-1]
+ case FlagToolJson:
+ if source == argv.FromEnv {
+ cmdToolV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdToolV.Json = values[0] == "true"
+ }
+ case FlagToolActive:
+ if source == argv.FromEnv {
+ cmdToolV.Active = argv.EnvTruth(values[0])
+ } else {
+ cmdToolV.Active = values[0] == "true"
+ }
+ case FlagToolBackend:
+ if source == argv.FromEnv {
+ cmdToolV.Backend = argv.EnvTruth(values[0])
+ } else {
+ cmdToolV.Backend = values[0] == "true"
+ }
+ case FlagToolConfigSource:
+ if source == argv.FromEnv {
+ cmdToolV.ConfigSource = argv.EnvTruth(values[0])
+ } else {
+ cmdToolV.ConfigSource = values[0] == "true"
+ }
+ case FlagToolDescription:
+ if source == argv.FromEnv {
+ cmdToolV.Description = argv.EnvTruth(values[0])
+ } else {
+ cmdToolV.Description = values[0] == "true"
+ }
+ case FlagToolInstalled:
+ if source == argv.FromEnv {
+ cmdToolV.Installed = argv.EnvTruth(values[0])
+ } else {
+ cmdToolV.Installed = values[0] == "true"
+ }
+ case FlagToolRequested:
+ if source == argv.FromEnv {
+ cmdToolV.Requested = argv.EnvTruth(values[0])
+ } else {
+ cmdToolV.Requested = values[0] == "true"
+ }
+ case FlagToolToolOptions:
+ if source == argv.FromEnv {
+ cmdToolV.ToolOptions = argv.EnvTruth(values[0])
+ } else {
+ cmdToolV.ToolOptions = values[0] == "true"
+ }
+ case ArgToolTool:
+ cmdToolV.Tool = values[len(values)-1]
+ case ArgToolStubFile:
+ cmdToolStubV.File = values[len(values)-1]
+ case ArgToolStubArgs:
+ cmdToolStubV.Args = append(cmdToolStubV.Args, values...)
+ case FlagTrustAll:
+ if source == argv.FromEnv {
+ cmdTrustV.All = argv.EnvTruth(values[0])
+ } else {
+ cmdTrustV.All = values[0] == "true"
+ }
+ case FlagTrustIgnore:
+ if source == argv.FromEnv {
+ cmdTrustV.Ignore = argv.EnvTruth(values[0])
+ } else {
+ cmdTrustV.Ignore = values[0] == "true"
+ }
+ case FlagTrustShow:
+ if source == argv.FromEnv {
+ cmdTrustV.Show = argv.EnvTruth(values[0])
+ } else {
+ cmdTrustV.Show = values[0] == "true"
+ }
+ case FlagTrustUntrust:
+ if source == argv.FromEnv {
+ cmdTrustV.Untrust = argv.EnvTruth(values[0])
+ } else {
+ cmdTrustV.Untrust = values[0] == "true"
+ }
+ case ArgTrustConfigFile:
+ cmdTrustV.ConfigFile = values[len(values)-1]
+ case FlagUninstallAll:
+ if source == argv.FromEnv {
+ cmdUninstallV.All = argv.EnvTruth(values[0])
+ } else {
+ cmdUninstallV.All = values[0] == "true"
+ }
+ case FlagUninstallDryRun:
+ if source == argv.FromEnv {
+ cmdUninstallV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdUninstallV.DryRun = values[0] == "true"
+ }
+ case FlagUninstallDryRunCode:
+ if source == argv.FromEnv {
+ cmdUninstallV.DryRunCode = argv.EnvTruth(values[0])
+ } else {
+ cmdUninstallV.DryRunCode = values[0] == "true"
+ }
+ case ArgUninstallInstalledToolVersion:
+ cmdUninstallV.InstalledToolVersion = append(cmdUninstallV.InstalledToolVersion, values...)
+ case FlagUnsetFile:
+ cmdUnsetV.File = values[len(values)-1]
+ case FlagUnsetGlobal:
+ if source == argv.FromEnv {
+ cmdUnsetV.Global = argv.EnvTruth(values[0])
+ } else {
+ cmdUnsetV.Global = values[0] == "true"
+ }
+ case ArgUnsetEnvKey:
+ cmdUnsetV.EnvKey = append(cmdUnsetV.EnvKey, values...)
+ case ArgUntrustConfigFile:
+ cmdUntrustV.ConfigFile = values[len(values)-1]
+ case FlagUnuseEnv:
+ cmdUnuseV.Env = values[len(values)-1]
+ case FlagUnuseGlobal:
+ if source == argv.FromEnv {
+ cmdUnuseV.Global = argv.EnvTruth(values[0])
+ } else {
+ cmdUnuseV.Global = values[0] == "true"
+ }
+ case FlagUnusePath:
+ cmdUnuseV.Path = values[len(values)-1]
+ case FlagUnuseNoPrune:
+ if source == argv.FromEnv {
+ cmdUnuseV.NoPrune = argv.EnvTruth(values[0])
+ } else {
+ cmdUnuseV.NoPrune = values[0] == "true"
+ }
+ case ArgUnuseInstalledToolVersion:
+ cmdUnuseV.InstalledToolVersion = append(cmdUnuseV.InstalledToolVersion, values...)
+ case FlagUpgradeBump:
+ if source == argv.FromEnv {
+ cmdUpgradeV.Bump = argv.EnvTruth(values[0])
+ } else {
+ cmdUpgradeV.Bump = values[0] == "true"
+ }
+ case FlagUpgradeInteractive:
+ if source == argv.FromEnv {
+ cmdUpgradeV.Interactive = argv.EnvTruth(values[0])
+ } else {
+ cmdUpgradeV.Interactive = values[0] == "true"
+ }
+ case FlagUpgradeJobs:
+ cmdUpgradeV.Jobs = values[len(values)-1]
+ case FlagUpgradeL:
+ if source == argv.FromEnv {
+ cmdUpgradeV.L = argv.EnvTruth(values[0])
+ } else {
+ cmdUpgradeV.L = values[0] == "true"
+ }
+ case FlagUpgradeDryRun:
+ if source == argv.FromEnv {
+ cmdUpgradeV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdUpgradeV.DryRun = values[0] == "true"
+ }
+ case FlagUpgradeExclude:
+ cmdUpgradeV.Exclude = append(cmdUpgradeV.Exclude, values...)
+ case FlagUpgradeDryRunCode:
+ if source == argv.FromEnv {
+ cmdUpgradeV.DryRunCode = argv.EnvTruth(values[0])
+ } else {
+ cmdUpgradeV.DryRunCode = values[0] == "true"
+ }
+ case FlagUpgradeInactive:
+ if source == argv.FromEnv {
+ cmdUpgradeV.Inactive = argv.EnvTruth(values[0])
+ } else {
+ cmdUpgradeV.Inactive = values[0] == "true"
+ }
+ case FlagUpgradeLocal:
+ if source == argv.FromEnv {
+ cmdUpgradeV.Local = argv.EnvTruth(values[0])
+ } else {
+ cmdUpgradeV.Local = values[0] == "true"
+ }
+ case FlagUpgradeMinimumReleaseAge:
+ cmdUpgradeV.MinimumReleaseAge = values[len(values)-1]
+ case FlagUpgradeMonorepo:
+ if source == argv.FromEnv {
+ cmdUpgradeV.Monorepo = argv.EnvTruth(values[0])
+ } else {
+ cmdUpgradeV.Monorepo = values[0] == "true"
+ }
+ case FlagUpgradeNoPrune:
+ if source == argv.FromEnv {
+ cmdUpgradeV.NoPrune = argv.EnvTruth(values[0])
+ } else {
+ cmdUpgradeV.NoPrune = values[0] == "true"
+ }
+ case FlagUpgradePrune:
+ if source == argv.FromEnv {
+ cmdUpgradeV.Prune = argv.EnvTruth(values[0])
+ } else {
+ cmdUpgradeV.Prune = values[0] == "true"
+ }
+ case FlagUpgradeRaw:
+ if source == argv.FromEnv {
+ cmdUpgradeV.Raw = argv.EnvTruth(values[0])
+ } else {
+ cmdUpgradeV.Raw = values[0] == "true"
+ }
+ case ArgUpgradeInstalledToolVersion:
+ cmdUpgradeV.InstalledToolVersion = append(cmdUpgradeV.InstalledToolVersion, values...)
+ case FlagUseEnv:
+ cmdUseV.Env = values[len(values)-1]
+ case FlagUseForce:
+ if source == argv.FromEnv {
+ cmdUseV.Force = argv.EnvTruth(values[0])
+ } else {
+ cmdUseV.Force = values[0] == "true"
+ }
+ case FlagUseGlobal:
+ if source == argv.FromEnv {
+ cmdUseV.Global = argv.EnvTruth(values[0])
+ } else {
+ cmdUseV.Global = values[0] == "true"
+ }
+ case FlagUseJobs:
+ cmdUseV.Jobs = values[len(values)-1]
+ case FlagUseDryRun:
+ if source == argv.FromEnv {
+ cmdUseV.DryRun = argv.EnvTruth(values[0])
+ } else {
+ cmdUseV.DryRun = values[0] == "true"
+ }
+ case FlagUsePath:
+ cmdUseV.Path = values[len(values)-1]
+ case FlagUseDryRunCode:
+ if source == argv.FromEnv {
+ cmdUseV.DryRunCode = argv.EnvTruth(values[0])
+ } else {
+ cmdUseV.DryRunCode = values[0] == "true"
+ }
+ case FlagUseFuzzy:
+ if source == argv.FromEnv {
+ cmdUseV.Fuzzy = argv.EnvTruth(values[0])
+ } else {
+ cmdUseV.Fuzzy = values[0] == "true"
+ }
+ case FlagUseMinimumReleaseAge:
+ cmdUseV.MinimumReleaseAge = values[len(values)-1]
+ case FlagUsePin:
+ if source == argv.FromEnv {
+ cmdUseV.Pin = argv.EnvTruth(values[0])
+ } else {
+ cmdUseV.Pin = values[0] == "true"
+ }
+ case FlagUseRaw:
+ if source == argv.FromEnv {
+ cmdUseV.Raw = argv.EnvTruth(values[0])
+ } else {
+ cmdUseV.Raw = values[0] == "true"
+ }
+ case FlagUseRemove:
+ cmdUseV.Remove = append(cmdUseV.Remove, values...)
+ case ArgUseToolVersion:
+ cmdUseV.ToolVersion = append(cmdUseV.ToolVersion, values...)
+ case FlagVersionJson:
+ if source == argv.FromEnv {
+ cmdVersionV.Json = argv.EnvTruth(values[0])
+ } else {
+ cmdVersionV.Json = values[0] == "true"
+ }
+ case FlagWatchTaskFlag:
+ cmdWatchV.TaskFlag = append(cmdWatchV.TaskFlag, values...)
+ case FlagWatchGlob:
+ cmdWatchV.Glob = append(cmdWatchV.Glob, values...)
+ case FlagWatchSkipDeps:
+ if source == argv.FromEnv {
+ cmdWatchV.SkipDeps = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.SkipDeps = values[0] == "true"
+ }
+ case FlagWatchWatch:
+ cmdWatchV.Watch = append(cmdWatchV.Watch, values...)
+ case FlagWatchWatchNonRecursive:
+ cmdWatchV.WatchNonRecursive = append(cmdWatchV.WatchNonRecursive, values...)
+ case FlagWatchWatchFile:
+ cmdWatchV.WatchFile = values[len(values)-1]
+ case FlagWatchClear:
+ cmdWatchV.Clear = values[len(values)-1]
+ case FlagWatchOnBusyUpdate:
+ cmdWatchV.OnBusyUpdate = values[len(values)-1]
+ case FlagWatchRestart:
+ if source == argv.FromEnv {
+ cmdWatchV.Restart = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.Restart = values[0] == "true"
+ }
+ case FlagWatchSignal:
+ cmdWatchV.Signal = values[len(values)-1]
+ case FlagWatchStopSignal:
+ cmdWatchV.StopSignal = values[len(values)-1]
+ case FlagWatchStopTimeout:
+ cmdWatchV.StopTimeout = values[len(values)-1]
+ case FlagWatchMapSignal:
+ cmdWatchV.MapSignal = append(cmdWatchV.MapSignal, values...)
+ case FlagWatchDebounce:
+ cmdWatchV.Debounce = values[len(values)-1]
+ case FlagWatchStdinQuit:
+ if source == argv.FromEnv {
+ cmdWatchV.StdinQuit = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.StdinQuit = values[0] == "true"
+ }
+ case FlagWatchNoVcsIgnore:
+ if source == argv.FromEnv {
+ cmdWatchV.NoVcsIgnore = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.NoVcsIgnore = values[0] == "true"
+ }
+ case FlagWatchNoProjectIgnore:
+ if source == argv.FromEnv {
+ cmdWatchV.NoProjectIgnore = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.NoProjectIgnore = values[0] == "true"
+ }
+ case FlagWatchNoGlobalIgnore:
+ if source == argv.FromEnv {
+ cmdWatchV.NoGlobalIgnore = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.NoGlobalIgnore = values[0] == "true"
+ }
+ case FlagWatchNoDefaultIgnore:
+ if source == argv.FromEnv {
+ cmdWatchV.NoDefaultIgnore = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.NoDefaultIgnore = values[0] == "true"
+ }
+ case FlagWatchNoDiscoverIgnore:
+ if source == argv.FromEnv {
+ cmdWatchV.NoDiscoverIgnore = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.NoDiscoverIgnore = values[0] == "true"
+ }
+ case FlagWatchIgnoreNothing:
+ if source == argv.FromEnv {
+ cmdWatchV.IgnoreNothing = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.IgnoreNothing = values[0] == "true"
+ }
+ case FlagWatchPostpone:
+ if source == argv.FromEnv {
+ cmdWatchV.Postpone = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.Postpone = values[0] == "true"
+ }
+ case FlagWatchDelayRun:
+ cmdWatchV.DelayRun = values[len(values)-1]
+ case FlagWatchPoll:
+ cmdWatchV.Poll = values[len(values)-1]
+ case FlagWatchShell:
+ cmdWatchV.Shell = values[len(values)-1]
+ case FlagWatchN:
+ if source == argv.FromEnv {
+ cmdWatchV.N = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.N = values[0] == "true"
+ }
+ case FlagWatchEmitEventsTo:
+ cmdWatchV.EmitEventsTo = values[len(values)-1]
+ case FlagWatchOnlyEmitEvents:
+ if source == argv.FromEnv {
+ cmdWatchV.OnlyEmitEvents = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.OnlyEmitEvents = values[0] == "true"
+ }
+ case FlagWatchEnv:
+ cmdWatchV.Env = append(cmdWatchV.Env, values...)
+ case FlagWatchWrapProcess:
+ cmdWatchV.WrapProcess = values[len(values)-1]
+ case FlagWatchNotify:
+ if source == argv.FromEnv {
+ cmdWatchV.Notify = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.Notify = values[0] == "true"
+ }
+ case FlagWatchColor:
+ cmdWatchV.Color = values[len(values)-1]
+ case FlagWatchTimings:
+ if source == argv.FromEnv {
+ cmdWatchV.Timings = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.Timings = values[0] == "true"
+ }
+ case FlagWatchQuiet:
+ if source == argv.FromEnv {
+ cmdWatchV.Quiet = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.Quiet = values[0] == "true"
+ }
+ case FlagWatchBell:
+ if source == argv.FromEnv {
+ cmdWatchV.Bell = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.Bell = values[0] == "true"
+ }
+ case FlagWatchProjectOrigin:
+ cmdWatchV.ProjectOrigin = values[len(values)-1]
+ case FlagWatchWorkdir:
+ cmdWatchV.Workdir = values[len(values)-1]
+ case FlagWatchExts:
+ cmdWatchV.Exts = append(cmdWatchV.Exts, values...)
+ case FlagWatchFilter:
+ cmdWatchV.Filter = append(cmdWatchV.Filter, values...)
+ case FlagWatchFilterFile:
+ cmdWatchV.FilterFile = append(cmdWatchV.FilterFile, values...)
+ case FlagWatchFilterProg:
+ cmdWatchV.FilterProg = append(cmdWatchV.FilterProg, values...)
+ case FlagWatchIgnore:
+ cmdWatchV.Ignore = append(cmdWatchV.Ignore, values...)
+ case FlagWatchIgnoreFile:
+ cmdWatchV.IgnoreFile = append(cmdWatchV.IgnoreFile, values...)
+ case FlagWatchFsEvents:
+ cmdWatchV.FsEvents = append(cmdWatchV.FsEvents, values...)
+ case FlagWatchNoMeta:
+ if source == argv.FromEnv {
+ cmdWatchV.NoMeta = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.NoMeta = values[0] == "true"
+ }
+ case FlagWatchPrintEvents:
+ if source == argv.FromEnv {
+ cmdWatchV.PrintEvents = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.PrintEvents = values[0] == "true"
+ }
+ case FlagWatchManual:
+ if source == argv.FromEnv {
+ cmdWatchV.Manual = argv.EnvTruth(values[0])
+ } else {
+ cmdWatchV.Manual = values[0] == "true"
+ }
+ case ArgWatchTask:
+ cmdWatchV.Task = values[len(values)-1]
+ case ArgWatchArgs:
+ cmdWatchV.Args = append(cmdWatchV.Args, values...)
+ case ArgWhereToolVersion:
+ cmdWhereV.ToolVersion = values[len(values)-1]
+ case ArgWhereAsdfVersion:
+ cmdWhereV.AsdfVersion = values[len(values)-1]
+ case FlagWhichTool:
+ cmdWhichV.Tool = values[len(values)-1]
+ case FlagWhichComplete:
+ if source == argv.FromEnv {
+ cmdWhichV.Complete = argv.EnvTruth(values[0])
+ } else {
+ cmdWhichV.Complete = values[0] == "true"
+ }
+ case FlagWhichPlugin:
+ if source == argv.FromEnv {
+ cmdWhichV.Plugin = argv.EnvTruth(values[0])
+ } else {
+ cmdWhichV.Plugin = values[0] == "true"
+ }
+ case FlagWhichVersion:
+ if source == argv.FromEnv {
+ cmdWhichV.Version = argv.EnvTruth(values[0])
+ } else {
+ cmdWhichV.Version = values[0] == "true"
+ }
+ case ArgWhichBinName:
+ cmdWhichV.BinName = values[len(values)-1]
+ }
+ }
+ }
+ if err := argv.CheckRelationshipsWithValuesAndRequirements(Meta, scope, func(k uint64) argv.Source {
+ return sources[k]
+ }, nil, func(k uint64) bool { return requirements[k] }); err != nil {
+ return nil, err
+ }
+ return out, nil
+}
diff --git a/benches/go/shadows_test.go b/benches/go/shadows_test.go
new file mode 100644
index 000000000..ca1615d4d
--- /dev/null
+++ b/benches/go/shadows_test.go
@@ -0,0 +1,77 @@
+// Package benches is the module that holds the mise-scale shadows, and this is the one
+// assertion that keeps them worth measuring: every framework has to arrive at the same
+// place on the same command line.
+//
+// A shadow that stopped resolving `mise use -g node@20` would still be timed by
+// `cmd/sweep` — the sweep refuses to report a parser that does not reach a subcommand,
+// but only when somebody runs it. This runs in CI, where a generator change that broke a
+// shadow shows up as a failure rather than as a benchmark nobody took that week.
+package benches
+
+import (
+ "testing"
+
+ "github.com/jdx/usage/benches/go/mise"
+ misecobra "github.com/jdx/usage/benches/go/mise-cobra"
+ misekong "github.com/jdx/usage/benches/go/mise-kong"
+ miseurfave "github.com/jdx/usage/benches/go/mise-urfave"
+ "github.com/jdx/usage/go/argv"
+)
+
+var words = []string{"use", "-g", "node@20"}
+
+func TestEveryShadowResolvesTheBenchmarkArgv(t *testing.T) {
+ for _, tc := range []struct {
+ name string
+ resolve func([]string) bool
+ }{
+ {"cobra", misecobra.Resolve},
+ {"urfave", miseurfave.Resolve},
+ {"kong", misekong.Resolve},
+ } {
+ if !tc.resolve(words) {
+ t.Errorf("%s did not reach a subcommand on `mise %v`", tc.name, words)
+ }
+ }
+}
+
+// The usage side, asserted the same way and in more detail, because it is the only one
+// here that hands back what it bound rather than a yes.
+func TestUsageShadowBindsTheBenchmarkArgv(t *testing.T) {
+ cli, err := mise.Parse(words)
+ if err != nil {
+ t.Fatalf("mise.Parse: %v", err)
+ }
+ if cli.Use == nil {
+ t.Fatal("mise.Parse did not reach `use`")
+ }
+ if !cli.Use.Global {
+ t.Error("`-g` did not reach Use.Global")
+ }
+ if got := cli.Use.ToolVersion; len(got) != 1 || got[0] != "node@20" {
+ t.Errorf("Use.ToolVersion = %v, want [node@20]", got)
+ }
+}
+
+// What the sweep's second usage-go row measures, checked here so the row cannot quietly
+// become a parse that binds nothing.
+func TestUsageShadowBindsAsEvents(t *testing.T) {
+ p := argv.New(mise.Root, words)
+ commands, flags, args := 0, 0, 0
+ for p.Next() {
+ switch p.Event().Kind {
+ case argv.KindCommand:
+ commands++
+ case argv.KindFlag:
+ flags++
+ case argv.KindArg:
+ args++
+ }
+ }
+ if err := p.Err(); err != nil {
+ t.Fatalf("argv.New: %v", err)
+ }
+ if commands != 1 || flags != 1 || args != 1 {
+ t.Errorf("bound %d commands, %d flags, %d args; want 1, 1, 1", commands, flags, args)
+ }
+}
diff --git a/docs/.vitepress/theme/UsageBenches.vue b/docs/.vitepress/theme/UsageBenches.vue
index a7ccabe41..4d91d09dc 100644
--- a/docs/.vitepress/theme/UsageBenches.vue
+++ b/docs/.vitepress/theme/UsageBenches.vue
@@ -37,18 +37,25 @@ const rustRows = [
{ name: "bpaf", value: 1597028, label: "1,600 µs", note: "~8,200× more", us: false },
];
-// Go figures from go/README.md are whole-process wall time and subtract the
-// ~950 µs a do-nothing Go process costs, so they are deliberately approximate.
+// Go figures from go/README.md, taken the same way as the Rust card's and by a harness
+// written to match it: `benches/go/cmd/sweep` runs each parser repeatedly in one process
+// and keeps the fastest of many short rounds. The card used to show whole-process wall
+// time with the Go runtime's ~1 ms startup subtracted, which made every bar a difference
+// between two much larger numbers — and compared usage-go's binder against the other
+// three frameworks' whole job, which was not a like-for-like row.
//
-// Ratios read the same way as the Rust card's: what each framework costs against
-// usage-go, on the row that costs it. Whole multiples, because every figure here is
-// a difference between two numbers already rounded to two significant figures — a
-// ratio of those does not deserve a decimal place.
+// So this is `Parse`: argv to a filled struct, which is what cobra, urfave and kong each
+// do in one call. What a whole process costs is in go/README.md rather than here, because
+// it is mostly the Go runtime rather than the parser.
+//
+// Values in microseconds. Quoted to two significant figures: across four runs on one
+// machine the minima moved a few percent and the ratios by about 10% — cobra read 18x,
+// 19x and 21x — so the ratios carry a `~`.
const goRows = [
- { name: "usage-go", value: 0.15, label: "~150 µs", us: true },
- { name: "urfave/cli v3", value: 0.75, label: "~750 µs", note: "~5× more", us: false },
- { name: "cobra", value: 1.05, label: "~1.05 ms", note: "~7× more", us: false },
- { name: "kong", value: 5.2, label: "~5.2 ms", note: "~35× more", us: false },
+ { name: "usage-go", value: 5.9, label: "5.9 µs", us: true },
+ { name: "cobra", value: 110, label: "110 µs", note: "~18× more", us: false },
+ { name: "urfave/cli v3", value: 200, label: "200 µs", note: "~34× more", us: false },
+ { name: "kong", value: 2970, label: "3.0 ms", note: "~500× more", us: false },
];
const rustMax = Math.max(...rustRows.map((r) => r.value));
@@ -126,15 +133,14 @@ onBeforeUnmount(() => window.removeEventListener("resize", replace));
What parsing mise use -g node@20 costs each framework, against a shadow
of mise's CLI: 211 commands, 711 flags.
- The usage, clap, bpaf, and cobra programs are generated from the same checked-in
- spec; urfave/cli and kong are still hand-measured.
+ Every program on both cards is generated from that one checked-in spec.
The usage, clap, and bpaf programs are generated from the same checked-in spec.
- usage-go and cobra are generated from the same checked-in spec; urfave/cli and kong
- are still hand-measured.
+ The usage-go, cobra, urfave/cli and kong programs are generated from the same
+ checked-in spec.
@@ -216,14 +222,17 @@ onBeforeUnmount(() => window.removeEventListener("resize", replace));
@mouseenter="clamp"
@focusin="clamp"
:aria-describedby="`${idPrefix}-tip-cold`"
- >startup-adjusted process cost
+ >in-process parse throughput
How this is measured
- Whole-process wall time with the ~950 µs startup cost of a do-nothing Go
- process subtracted. usage-go and cobra have generated mise-scale shadows;
- urfave/cli and kong are hand-measured and should be read as orders of
- magnitude. The subtraction makes every bar approximate.
+ The same way as the Rust card, by a harness written to match it: each
+ parser runs repeatedly inside one process and the fastest per-parse time
+ from many short rounds is reported, with the collector run between rounds
+ rather than inside them. Process startup is excluded — a Go process is
+ about a millisecond old before main, which no parser can
+ touch. Whole-process cost, and instructions for one parse:
+ go/README.md.
@@ -247,10 +256,12 @@ onBeforeUnmount(() => window.removeEventListener("resize", replace));
diff --git a/docs/go/index.md b/docs/go/index.md
index e8e20560a..e80db38ff 100644
--- a/docs/go/index.md
+++ b/docs/go/index.md
@@ -31,7 +31,11 @@ The generated package contains plain command and flag tables that the linker lay
shipped program. The event parser keeps its state and 16-entry command stack inline, borrows
values from argv, and scans only the flags in scope. Those are the zero-allocation,
57–110ns measurements. Generated `Parse` does more work to produce the typed result shown
-below, so the zero-allocation claim deliberately does not apply to that higher layer.
+below, so the zero-allocation claim deliberately does not apply to that higher layer — and
+it is `Parse` the chart above measures, at about 5.9µs on mise's spec, because binding to a
+filled struct is the whole of what cobra, urfave/cli and kong each do in one call. The
+[Go README](https://github.com/jdx/usage/blob/main/go/README.md) has both numbers, what a
+whole process costs, and where `Parse` spends its time.
## Quick start
diff --git a/go/README.md b/go/README.md
index 577f466bf..2e80ff756 100644
--- a/go/README.md
+++ b/go/README.md
@@ -20,69 +20,104 @@ assembled at run time.
## Why
Every Go CLI framework builds a model of the CLI at run time. cobra constructs a
-`cobra.Command` per subcommand, each with its own flag set; kong walks a struct
-with reflection. Both pay for the whole CLI on every invocation, including the two
-hundred commands the user did not type.
+`cobra.Command` per subcommand, each with its own flag set; urfave/cli assembles the
+same shape out of `cli.Command` values; kong walks a struct with reflection. All
+three pay for the whole CLI on every invocation, including the two hundred commands
+the user did not type.
Measured against a shadow of [mise](https://mise.jdx.dev)'s spec — 211 commands,
711 flags, 128 positionals — parsing `mise use -g node@20`:
-| | instructions | wall, whole process | binary |
-| ----------------------- | -----------: | ------------------: | ------: |
-| a do-nothing Go process | — | 0.95 ms | 2.31 MB |
-| **usage-go**, amortized | **~1,600** | **1.1 ms** | 2.37 MB |
-| cobra, amortized | 3,249,052 | 2.0 ms | 3.41 MB |
-| urfave/cli v3, likewise | 5,591,321 | 1.7 ms | 5.74 MB |
-| kong, likewise | 57,889,084 | 6.1 ms | 5.34 MB |
-
-Instruction counts are cachegrind, against mise's committed spec, on the argv the
-Rust shadows use so the two tables describe the same work. The column is labelled
-per row rather than once at the top, because the rows are not all the same
-measurement:
-
-- **usage-go**, amortized over 1,000 binds, because a single one of ours is below
- the Go runtime's own startup jitter and cannot be measured at all — see below.
-- **cobra**, amortized over 20 resolves, each including the command tree it builds
- on every process start. Twenty rather than a thousand because one of them is
- three orders of magnitude dearer, and a thousand under cachegrind's 50x
- slowdown would take minutes.
-- **urfave/cli v3 and kong**, one cold parse each, taken by hand.
-
-**usage-go's row is reproducible: `mise run perf:go`.** That harness
-([`tasks/perf-go.sh`](../tasks/perf-go.sh)) reports the bind amortized over 1,000
-binds and the runtime floor beside it, rather than subtracting the floor once and
-forgetting it — because a single bind is _below the Go runtime's own startup
-jitter_, ±50,000 instructions run to run, which is thirty times the whole bind.
-Differencing `PARSE_N=1` against `PARSE_N=0` the way the Rust harness does gives a
-number here that changes sign between runs.
-
-cobra's row is reproducible too, and by the same command. `xtask gen-shadow
-benches/mise.usage.kdl benches/go/cobra cobra` writes mise's CLI out as a cobra
-program — 211 commands, each with its own flag set — which is checked in under
-[`benches/go/cobra`](../benches/go/cobra) and measured beside usage-go. So the two
-rows describe the same CLI rather than two people's transcriptions of it.
-
-Its figure includes building the command tree, because that is what cobra does on
-every process start. Hoisting that out of the loop would measure its parser
-against a program that had already paid for its model, which no CLI gets to do.
-
-That measurement replaced a hand-taken one of 2,008,880, which was lower because
-the program it was taken against was written by hand and smaller than mise: the
-generated one declares every command and flag the spec has. What cobra cannot
-express is printed when the shadow is generated rather than passed over — 128
-positionals, since cobra validates a count and not a name, 17 hidden aliases, 13
-second long forms, and one short-only flag.
-
-urfave/cli v3's and kong's rows are still hand-measured against programs that are
-not in the repository, and until they are generated the same way those two numbers
-should be read as an order of magnitude rather than as a measurement.
-
-Two things are worth reading off that table honestly. The win against cobra is
-real — about 40% of process startup — but it is bounded: 0.95 ms of usage-go's
-1.1 ms is Go runtime startup that no parser can touch. And the framework that
-gives Go the ergonomics people actually want, kong's struct tags, costs 29× cobra
-to do it, because reflection is the only way to get them without a build step.
-Generated tables are the way to have both.
+| | one parse | vs usage-go | median |
+| ------------------------------- | ---------: | ----------: | -----: |
+| **usage-go**, argv → struct | **5.9 µs** | | 6.5 µs |
+| cobra, build tree + resolve | 110 µs | ~18x | 120 µs |
+| urfave/cli v3, build tree + run | 200 µs | ~34x | 220 µs |
+| kong, reflect + parse | 3.0 ms | ~500x | 3.3 ms |
+| usage-go, argv → events | 73 ns | | 79 ns |
+
+**In-process parse throughput**: each parser run repeatedly in one process, the
+fastest of many short rounds reported. This is the measurement
+[`benches/gate/src/bin/time-sweep.rs`](../benches/gate/src/bin/time-sweep.rs) takes
+for usage-rs against clap and bpaf, and it is here for the same reason: what a parse
+costs is a question about parsing, and a whole Go process is about a millisecond of
+runtime startup before `main` — two orders of magnitude larger than the thing being
+compared, and varying run to run by more than most of these rows cost. Reproduce with
+`mise run perf:go`, which runs
+[`benches/go/cmd/sweep`](../benches/go/cmd/sweep/main.go).
+
+The four rows are the same work: from argv to a value the program can use. usage-go's
+is `Parse` — bind, apply the post-binding rules, fill the typed structs — because that
+is the whole of what the other three do, and comparing our cheapest half against their
+whole is how a benchmark flatters its author. The binder alone is the last row, kept out
+of the comparison: no other framework here has a stage that answers "which token is
+which" and stops.
+
+Each framework's row includes building its model, because that is what it does on every
+process start. Hoisting that out would measure a parser against a program that had
+already paid for its model, which no CLI gets to do. The collector is switched off
+during a round and asked to run between rounds — a process that parses one command line
+and gets on with it usually exits before the collector would have run at all, and left
+on it lands unevenly enough to move a minimum by 2x.
+
+**All four programs are generated from that one spec**, by `mise run gen-shadow`, and
+checked in under [`benches/go`](../benches/go) so a reviewer sees the diff when an
+emitter changes. That is what makes this a comparison between parsers rather than
+between transcriptions of mise: the hand-written cobra program these replaced was a
+third of mise's size, and read as though cobra were three times faster than it is.
+
+What a framework cannot express is printed when its shadow is generated rather than
+passed over, since a shadow that quietly dropped half the spec would measure a smaller
+CLI. cobra takes every positional as a count rather than as a name, and has no vocabulary
+for a short-only flag or a second long form. urfave has no arity check for a single
+positional. kong is the one that loses most: 222 flags that a subcommand redeclares
+cannot be said at all, because a kong flag reaches every command below the one that
+declares it and redeclaring it is a duplicate `kong.New` refuses; and seven commands'
+positionals go, because kong cannot mix positionals with subcommands on one node.
+
+### What a whole process costs
+
+The number an adopter feels, and mostly not the parser:
+
+| | instructions | whole process | binary |
+| ------------------------------- | -----------: | ------------: | ------: |
+| the Go runtime, parsing nothing | ~1,010,000 | 1.14 ms | — |
+| **usage-go**, argv → struct | **123,293** | **1.16 ms** | 6.83 MB |
+| usage-go, argv → events | 1,955 | 1.09 ms | 4.80 MB |
+| cobra | 2,807,995 | 1.62 ms | 3.42 MB |
+| urfave/cli v3 | 5,763,828 | 1.69 ms | 5.48 MB |
+| kong | 66,688,959 | 5.62 ms | 5.38 MB |
+
+Instruction counts are cachegrind, amortized over 1,000 parses for usage-go and fewer
+for the frameworks that cost three to five orders of magnitude more — 20 each for cobra
+and urfave, 2 for kong, since a thousand kong parses under cachegrind would take
+minutes. Amortized rather than differenced from a single parse because Go's startup
+varies run to run by ±50,000 instructions, which is twenty-five times what usage-go's
+binder costs.
+Taken with `GOMAXPROCS=1`, which is what makes them a measurement at all: valgrind
+serializes every thread onto one core, and a Go runtime with more than one to schedule
+spends the wait spinning, so unpinned counts pick up instructions proportional to wall
+time — twenty cobra resolves read 56M on one run and 5,002M on the next.
+
+The wall column is the fastest of 200 whole processes, and the floor is reported beside
+it rather than subtracted from it. The floor and the row under it are one binary asked
+for nought parses and for one, and they differ by less than a process launch varies: a
+usage-go parse is _below the resolution of that column_, which is the honest thing for
+it to say rather than an ordering to read. The same caution applies to cobra's row
+against urfave's: they are 0.1 ms apart on a clock whose runs vary by more than that,
+and which of them comes out ahead changes between runs — the parse table above is where
+those two are separated. A millisecond of every row here is the Go runtime coming up,
+and no parser wins that back.
+
+Three things are worth reading off these two tables honestly. The win over cobra is
+real and it is a factor of eighteen, but on the clock a user feels it is 0.46 ms of a
+1.6 ms process. The framework that gives Go the ergonomics people actually want —
+kong's struct tags — costs 24x cobra to do it, because reflection is the only way to
+get them without a build step; generated tables are how to have both. And usage-go's
+typed front door costs about eighty times its own binder on the clock, and sixty-three
+times by instruction count, most of it in two maps the generated `Parse` allocates per
+call: the binder is as fast as this repository claims, and the layer above it has not
+had the same attention.
## The design
@@ -168,11 +203,12 @@ says what a value is _called_ and never what type it is. Turning `"8"` into an
unreferenced package-level table entirely, so the split is enforced by the linker
rather than by a feature flag:
-| a CLI that… | carries | mise-sized binary |
-| ------------------------------ | ---------------- | ----------------: |
-| only binds | the parse tables | 2.60 MB |
-| applies the post-binding rules | `+ Meta` | 2.82 MB |
-| prints help | `+ HelpText` | 2.82 MB |
+| a CLI that… | carries | mise-sized binary |
+| ------------------------------ | ------------------- | ----------------: |
+| only binds | the parse tables | 4.65 MB |
+| applies the post-binding rules | `+ Meta` | 5.18 MB |
+| prints help | `+ HelpText` | 5.77 MB |
+| takes the typed front door | `+ Meta`, `+ Parse` | 6.68 MB |
None of them has an init function. That is what Rust gets from putting the cold
half behind a feature flag, except nobody has to remember the flag — which is also
@@ -180,6 +216,11 @@ why help text is a third table rather than more fields on `Meta`: folding them
together would make every CLI that applies a rule carry every help string in the
spec.
+The last row is the one to be uncomfortable about: `Parse` is a generated function
+with a case per entry in the spec, and at mise's scale that is two megabytes of code
+on top of the tables it reads. A CLI with two hundred commands pays it; the split
+above is what a CLI that wants less can reach for instead.
+
Dispatch on the key constants rather than on `Name`: it costs no string
comparison, and a flag renamed in the spec then fails to compile instead of
silently never matching.
@@ -292,16 +333,25 @@ sees a spec.
`internal/shadow/mise` holds the tables generated from mise's committed spec — 211
commands, 711 flags — checked in so a reviewer sees the diff when the emitter
-changes, and regenerated by `mise run gen-go`. It is where the zero-allocation
-claim is measured at real scale rather than against a fixture with four flags:
-110 ns per parse, 0 allocations.
+changes, and regenerated by `mise run gen-go`. It is where the zero-allocation claim is
+measured at real scale rather than against a fixture with four flags: 110 ns per parse,
+0 allocations.
+
+The same tables are generated a second time into
+[`benches/go/mise`](../benches/go/mise). The sweep that times four frameworks in one
+process has to live in the module that depends on the other three, and Go's `internal`
+rule means that module cannot import this copy however the two are laid out.
## What is missing
-- **Shadow programs for the other frameworks.** usage-go's own numbers are
- reproducible with `mise run perf:go`; urfave's and kong's are still
- hand-measured, because generating mise-sized programs for them from the spec is
- its own piece of work.
+- **Typed fields.** `Parse` fills a struct, but with the three types a spec knows.
+ The conversions in [typed values](#typed-values) exist and generated code does not
+ call them, so `--jobs 8` reaches your program as `"8"`.
+- **A front door as fast as the binder.** `Parse` costs about eighty times the bind
+ it wraps, most of it in two maps it allocates per call to collect what arrived
+ before the post-binding rules judge it. Nothing about that is inherent — a spec's
+ entries are known at generation time and could be slots in an array — and until it
+ is done the number in the table above is the honest one to quote.
- **Running a spec's `complete` scripts.** A `run=` block shells out, which this
package has no business doing on a Tab. Everything else about completion is
here: the request, the answer, and the script that registers it with each of
diff --git a/go/internal/bench/bind-n/main.go b/go/internal/bench/bind-n/main.go
new file mode 100644
index 000000000..b6330eb0a
--- /dev/null
+++ b/go/internal/bench/bind-n/main.go
@@ -0,0 +1,44 @@
+// Command bind-n binds the same command line N times, N coming from the environment,
+// stopping at the events rather than going on to fill a struct.
+//
+// The same protocol as `parse-n` and the same reasons for it; what differs is where it
+// stops. This is the half of usage-go that has no counterpart in the frameworks it is
+// compared against — cobra, urfave and kong each have one entry point that resolves and
+// converts together — so it is reported as a row about usage-go rather than as a row in the
+// comparison, and its binary is what a CLI that only binds actually carries.
+package main
+
+import (
+ "fmt"
+ "os"
+ "strconv"
+
+ "github.com/jdx/usage/go/argv"
+ "github.com/jdx/usage/go/internal/shadow/mise"
+)
+
+func main() {
+ n := 1
+ if v, err := strconv.Atoi(os.Getenv("PARSE_N")); err == nil {
+ n = v
+ }
+
+ seen := 0
+ for i := 0; i < n; i++ {
+ p := argv.New(mise.Root, os.Args[1:])
+ reached := 0
+ for p.Next() {
+ if ev := p.Event(); ev.Kind == argv.KindCommand {
+ reached = 1
+ }
+ }
+ if p.Err() == nil {
+ seen += reached
+ }
+ }
+ if seen > 0 {
+ fmt.Println(1)
+ return
+ }
+ fmt.Println(0)
+}
diff --git a/go/internal/bench/parse-n/main.go b/go/internal/bench/parse-n/main.go
index 46aa927a9..e3f67ec68 100644
--- a/go/internal/bench/parse-n/main.go
+++ b/go/internal/bench/parse-n/main.go
@@ -1,21 +1,22 @@
-// Command parse-n binds the same command line N times, N coming from the
-// environment.
+// Command parse-n parses the same command line N times, N coming from the environment,
+// through the typed front door the generator emits.
//
-// Differencing two runs of *this* program separates the first bind from the ones
-// after it: N=1 minus N=0 is what a cold parse costs in a fresh process, and N=2
-// minus N=1 is what each costs with the caches warm. A CLI only ever does the
-// first, which is why the cold number is the one that matters.
+// `mise.Parse` rather than the binder alone, because this is the harness whose numbers sit
+// in a table beside cobra's, urfave's and kong's, and those three have no stage that stops
+// after deciding which token is which. Comparing our cheapest half against their whole is
+// how a benchmark flatters its author. `bind-n` is the binder alone, for the rows that are
+// about usage-go rather than about the comparison.
//
-// Differencing two runs of the same program rather than two different programs is
-// the part worth being careful about. Subtracting a separate do-nothing binary
-// looks equivalent and is not: two Go binaries do measurably different amounts of
-// work before `main` — the runtime's own startup is ~950,000 instructions and
-// varies with what the linker kept — and that difference lands in whatever you
-// attribute to parsing. Holding the binary fixed and varying only how many binds
-// it does leaves nothing else to explain.
+// Differencing two runs of *this* program separates the parses from the runtime that starts
+// before them: N=1000 minus N=0, over a thousand, is what one parse costs. Differencing two
+// runs of the same program rather than two different programs is the part worth being
+// careful about — two Go binaries do measurably different amounts of work before `main`, and
+// that difference would land in whatever you attributed to parsing.
//
-// This is the counterpart of `benches/gate/src/bin/parse-n.rs`, which measures the
-// Rust side the same way. Same protocol, so the numbers can sit in one table.
+// Why amortized rather than N=1 minus N=0, which is what `benches/gate/src/bin/parse-n.rs`
+// does for Rust: Go's startup is not deterministic enough. The runtime creates threads,
+// starts the collector and varies with what the linker kept, and repeated N=0 runs differ by
+// ±50,000 instructions, which is twenty-five times a whole parse here.
package main
import (
@@ -23,7 +24,6 @@ import (
"os"
"strconv"
- "github.com/jdx/usage/go/argv"
"github.com/jdx/usage/go/internal/shadow/mise"
)
@@ -34,27 +34,17 @@ func main() {
}
// Printed at the end, and it is what keeps the measurement honest: a rejected
- // command line is cheap to bind, so a harness that did not check would happily
- // report the cost of failing early. The script that drives this refuses to
- // measure a binary that does not say 1.
+ // command line is cheap to parse, so a harness that did not check would happily
+ // report the cost of failing early. The script that drives this refuses to measure a
+ // binary that does not say 1.
seen := 0
for i := 0; i < n; i++ {
- p := argv.New(mise.Root, os.Args[1:])
- reached := 0
- for p.Next() {
- if ev := p.Event(); ev.Kind == argv.KindCommand {
- reached = 1
- }
+ cli, err := mise.Parse(os.Args[1:])
+ if err == nil && cli.Use != nil {
+ seen = 1
}
- if p.Err() == nil {
- seen += reached
- }
- }
- // One line, so a shell can read it. Not the count of binds: what matters is
- // whether the last one arrived somewhere, and N is already known to the caller.
- if seen > 0 {
- fmt.Println(1)
- return
}
- fmt.Println(0)
+ // One line, so a shell can read it. Not the count of parses: what matters is whether
+ // the last one arrived somewhere, and N is already known to the caller.
+ fmt.Println(seen)
}
diff --git a/mise.toml b/mise.toml
index a463c84f9..d019d3813 100644
--- a/mise.toml
+++ b/mise.toml
@@ -67,9 +67,16 @@ run = 'cargo test --all --all-features'
# `usage` CLI: a vector's spec is KDL, and lowering it is the CLI's job rather than
# something the Go module carries a parser for. `build` puts one on PATH.
[tasks."test:go"]
-dir = 'go'
+dir = '{{config_root}}'
depends = ['build']
-run = 'go test ./...'
+# The shadows are the second line, and skipped when the frameworks cannot be fetched: they
+# are a benchmark fixture, and a machine without a proxy should still get the suite that
+# matters. Asked as its own question rather than with `|| true`, so a generator change that
+# broke a shadow is a failure rather than a skip.
+run = [
+ 'cd go && go test ./...',
+ 'cd benches/go && if go mod download >/dev/null 2>&1; then go test ./...; else echo "skipped: the benchmark frameworks could not be fetched"; fi',
+]
[tasks.lint]
depends = ['lint:*']
@@ -138,11 +145,12 @@ dir = "{{config_root}}"
# `gofmt -l` prints what it would change and exits 0 either way, so the output is
# the failure condition.
#
-# Both modules. `benches/go/cobra` is generated, and a generated file that gofmt would
-# reformat is one the generator is not finished with.
+# Both modules. Everything under `benches/go` is generated, and a generated file that gofmt
+# would reformat is one the generator is not finished with — `gen-shadow` runs gofmt for
+# exactly that reason.
#
-# The cobra module is skipped only when its dependency cannot be *fetched* — asked as its own
-# question, because `go vet ./... || true` would swallow a generator regression as well: a
+# The benches module is skipped only when its dependencies cannot be *fetched* — asked as its
+# own question, because `go vet ./... || true` would swallow a generator regression as well: a
# shadow that no longer compiles would pass the lint and then report itself unmeasured.
run = [
# The status as well as the output: a file gofmt cannot *parse* is reported on stderr with
@@ -150,7 +158,7 @@ run = [
# the answer matters most.
'list=$(gofmt -l go benches/go) || { echo "gofmt could not parse a file; see above"; exit 1; }; test -z "$list" || { echo "$list"; echo "gofmt would change these; run mise run lint-fix"; exit 1; }',
'cd go && go vet ./...',
- 'cd benches/go/cobra && if go mod download >/dev/null 2>&1; then go vet ./...; else echo "skipped: cobra could not be fetched"; fi',
+ 'cd benches/go && if go mod download >/dev/null 2>&1; then go vet ./...; else echo "skipped: the benchmark frameworks could not be fetched"; fi',
]
[tasks.lint-fix]
@@ -224,9 +232,11 @@ run = [
"cargo run -q -p xtask -- gen-shadow benches/mise.usage.kdl benches/shadows/mise-clap clap",
"cargo run -q -p xtask -- gen-shadow benches/mise.usage.kdl benches/shadows/mise-argh argh",
"cargo run -q -p xtask -- gen-shadow benches/mise.usage.kdl benches/shadows/mise-bpaf bpaf",
- # Go, and a module of its own: cobra is what usage-go is compared against, so it must not
- # be a dependency of the module being measured.
- "cargo run -q -p xtask -- gen-shadow benches/mise.usage.kdl benches/go/cobra cobra",
+ # Go, in a module of its own: these three are what usage-go is compared against, so they
+ # must not be dependencies of the module being measured.
+ "cargo run -q -p xtask -- gen-shadow benches/mise.usage.kdl benches/go/mise-cobra cobra",
+ "cargo run -q -p xtask -- gen-shadow benches/mise.usage.kdl benches/go/mise-urfave urfave",
+ "cargo run -q -p xtask -- gen-shadow benches/mise.usage.kdl benches/go/mise-kong kong",
"cargo run -q -p xtask -- gen-shadow benches/fleet/hk.usage.kdl benches/shadows/hk usage",
"cargo run -q -p xtask -- gen-shadow benches/fleet/fnox.usage.kdl benches/shadows/fnox usage",
"cargo run -q -p xtask -- gen-shadow benches/fleet/pitchfork.usage.kdl benches/shadows/pitchfork usage",
@@ -236,6 +246,11 @@ run = [
"cargo run -q -p xtask -- gen-shadow benches/external/fd.usage.kdl benches/shadows/external-fd usage",
"cargo run -q -p xtask -- gen-shadow benches/external/tokei.usage.kdl benches/shadows/external-tokei usage",
"cargo run -q -p xtask -- gen-shadow benches/external/starship.usage.kdl benches/shadows/external-starship usage",
+ # The Go emitters write valid Go and leave the columns to gofmt, which is the tool that
+ # decides where they go. Emitting pre-aligned struct fields would mean reimplementing
+ # tabwriter's heuristics to guess what it would have done, and being wrong about it
+ # every time `lint:go` ran.
+ "gofmt -w benches/go",
]
# The Go tables the shadow test parses against, from the same spec and for the same
@@ -245,10 +260,20 @@ run = [
# No formatter afterwards, unlike `render:fig`. `usage generate go` emits
# gofmt-clean output, which `lint:go` then checks — a generated file an adopter has
# to reformat before committing is one the generator is not finished with.
+#
+# Twice, into two modules, on purpose. `go/internal/shadow/mise` is the Go module's own
+# fixture: its tests measure allocations at mise's scale and must keep running on a machine
+# with no network, so the module they live in has no dependencies to fetch.
+# `benches/go/mise` is the same tables in the module that has cobra, urfave and kong, which
+# is where the four are timed in one process — and Go's `internal` rule means that module
+# cannot import the first copy however the two are laid out.
[tasks."gen-go"]
dir = "{{config_root}}"
depends = ['build']
-run = "usage generate go -f benches/mise.usage.kdl --package mise -o go/internal/shadow/mise/tables.go"
+run = [
+ "usage generate go -f benches/mise.usage.kdl --package mise -o go/internal/shadow/mise/tables.go",
+ "usage generate go -f benches/mise.usage.kdl --package mise -o benches/go/mise/tables.go",
+]
# The shadow comparison: usage against clap, at mise's scale. Reported, never gated — see
# the note in tak.toml. Takes an optional path to write the markdown to.
diff --git a/tasks/perf-go.sh b/tasks/perf-go.sh
index afa8287bf..480aaae12 100755
--- a/tasks/perf-go.sh
+++ b/tasks/perf-go.sh
@@ -1,66 +1,51 @@
#!/usr/bin/env bash
-# What binding a mise-sized command line costs a Go CLI built on usage.
+# What parsing a mise-sized command line costs a Go CLI, framework by framework.
#
-# Reported, never gated. The shadow is mise's committed spec, which grows on purpose, so
+# Reported, never gated. The shadows are mise's committed spec, which grows on purpose, so
# comparing one commit's number against another's partly measures the fixture. What holds
-# steady is the shape: a bind that costs about as much as one page fault, against a runtime
-# floor three orders of magnitude larger.
+# steady is the shape: a parse that costs microseconds against frameworks that cost
+# hundreds of them, and a Go runtime floor larger than either.
#
-# The protocol is `benches/gate`'s, with one change forced by the language. The Rust harness
-# differences N=1 against N=0 and calls that a cold parse, because Rust's startup is
-# deterministic to within a few hundred instructions. Go's is not: the runtime creates threads,
-# starts the collector and varies with what the linker kept, and repeated N=0 runs here differ
-# by ±50,000 instructions — twenty times the thing being measured. So the per-bind figure is
-# amortized over many binds, where the jitter cancels, and the floor is reported beside it
-# rather than subtracted and forgotten.
+# Two measurements, in this order, because they answer different questions:
+#
+# 1. In-process parse throughput — `benches/go/cmd/sweep`, which is
+# `benches/gate/src/bin/time-sweep.rs` in Go: every parser run repeatedly in one
+# process, the fastest of many short rounds reported. This is the number the
+# landing page charts, and the same estimator the Rust card uses, because "what does
+# a parse cost" is a question about parsing.
+#
+# 2. Whole-process cost — the five `parse-n` binaries under cachegrind and a clock.
+# This is the number an adopter feels, and most of it is the Go runtime coming up:
+# ~0.95 ms and ~950,000 instructions before `main`, which no parser can touch. It is
+# reported beside the parse rather than subtracted from it, because a subtraction
+# hides how much of a Go CLI's latency is not the parser's to win.
+#
+# Why not difference N=1 against N=0 and call that a cold parse, the way the Rust harness
+# does: Go's startup is not deterministic. The runtime creates threads, starts the
+# collector and varies with what the linker kept, and repeated N=0 runs here differ by
+# ±50,000 instructions — twenty times what a bind costs. So the instruction figures are
+# amortized over many resolves, where the jitter cancels.
set -euo pipefail
out=${1:-/dev/stdout}
-# One argv, the same one the Rust shadow uses, so the two tables describe the same work.
+# One argv, the same one the Rust shadows use, so the two tables describe the same work.
ARGV="use -g node@20"
-# Enough binds that the startup jitter is a rounding error, few enough that cachegrind's
-# 50x slowdown stays under a second.
-BINDS=1000
-
-# cobra builds its whole command tree on every iteration, which is the cost being compared and
-# about a thousand times usage-go's. Fewer iterations, so cachegrind's 50x slowdown still
-# finishes: 20 of them is 40M instructions, where 1000 would be two billion.
-COBRA_BINDS=20
-
root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
work=$(mktemp -d)
-bin=$work/parse-n
# Only what this script made. cachegrind writes `cachegrind.out.` into the working
# directory by default, and a glob for those in the caller's would delete a report they were
# in the middle of reading — or one a concurrent valgrind was still writing. It is told where
# to put its own instead, which is the directory that goes away here.
trap 'rm -rf "$work"' EXIT
-(cd "$root/go" && go build -o "$bin" ./internal/bench/parse-n)
-
-# cobra, from the same spec — `xtask gen-shadow … cobra`, checked in under benches/go/cobra.
-#
-# Its own module, so cobra is not a dependency of `github.com/jdx/usage/go`, and its build is
-# allowed to fail: it needs the dependency fetched, and a machine without a proxy should still
-# get the row this harness is mainly about. What it must not do is silently report nothing, so
-# the reason lands in the table.
-cobra_bin=$work/cobra
-cobra_why=""
-if [ -d "$root/benches/go/cobra" ]; then
- if ! (cd "$root/benches/go/cobra" && go build -o "$cobra_bin" . 2>"$work/cobra.log"); then
- cobra_why="build failed: $(tr -d '\n' <"$work/cobra.log" | cut -c1-120)"
- fi
-else
- cobra_why="benches/go/cobra is missing; run \`mise run gen-shadow\`"
-fi
-# shellcheck disable=SC2086
-if [ -z "$cobra_why" ] && [ "$(PARSE_N=1 "$cobra_bin" $ARGV)" != "1" ]; then
- cobra_why="the shadow did not reach a subcommand"
-fi
+# The usage-go harnesses live in the Go module itself and have no dependencies to fetch, so
+# this much works on a machine with no network.
+bin=$work/parse-n
+(cd "$root/go" && go build -o "$work/" ./internal/bench/parse-n ./internal/bench/bind-n)
-# Each harness prints 1 when the bind reached a subcommand. Anything else means the numbers
+# Each harness prints 1 when the parse reached a subcommand. Anything else means the numbers
# below would be describing a rejected command line, which is cheap for the wrong reason.
# shellcheck disable=SC2086 # the argv is several words on purpose
if [ "$(PARSE_N=1 "$bin" $ARGV)" != "1" ]; then
@@ -68,30 +53,34 @@ if [ "$(PARSE_N=1 "$bin" $ARGV)" != "1" ]; then
exit 1
fi
-instructions() {
- local binary=$1 n=$2
- # shellcheck disable=SC2086
- PARSE_N="$n" valgrind --tool=cachegrind --cache-sim=no --branch-sim=no \
- --cachegrind-out-file="$work/cachegrind.out.%p" "$binary" $ARGV 2>&1 |
- sed -n 's/.*I *refs: *//p' | tr -d ','
-}
+# The other three frameworks live in `benches/go`, the one module in the repository that
+# depends on them — and its build is allowed to fail, since it needs those modules fetched
+# and a machine without a proxy should still get the row this harness is mainly about. What
+# it must not do is silently report nothing, so the reason lands in the report.
+shadows_why=""
+if ! (cd "$root/benches/go" && go build -o "$work/" ./cmd/... 2>"$work/build.log"); then
+ shadows_why="build failed: $(tr -d '\n' <"$work/build.log" | cut -c1-160)"
+fi
# How the wall column is measured, decided once.
#
-# `date +%s%N` is GNU's. BSD `date` prints a literal `N`, which arithmetic under `set -u`
-# then fails on — and it failed *before* the valgrind check below, so the wall-clock-only
-# path meant for machines without cachegrind was the one path that could not run on a Mac.
+# The figure wanted is the *minimum* of many whole processes, for the reason the sweep
+# takes minima: noise from other tenants is additive, so the fastest run is the one least
+# spoiled by them. That needs a clock this script can read between runs without paying for
+# it — `date` is a fork, and a fork costs about what a whole Go process does, so timing
+# each run with two of them would measure `date`.
#
-# PERF_GO_CLOCK=gnu two reads of `date +%s%N` around the loop
-# PERF_GO_CLOCK=py python times the loop itself
+# PERF_GO_CLOCK=bash bash 5's $EPOCHREALTIME, read in-process, once per run
+# PERF_GO_CLOCK=py python times each run and reports the fastest
# PERF_GO_CLOCK=none neither, and the column says so
#
# Overridable so the fallbacks can be exercised: a path that only runs on a machine nobody
-# here has is a path nobody has run.
+# here has is a path nobody has run. macOS ships bash 3.2, which has no $EPOCHREALTIME,
+# which is what the python path is for.
if [ -n "${PERF_GO_CLOCK:-}" ]; then
clock=$PERF_GO_CLOCK
-elif [ -n "$(date +%s%N 2>/dev/null)" ] && [ "$(date +%s%N 2>/dev/null | tr -d '0-9')" = "" ]; then
- clock=gnu
+elif [ -n "${EPOCHREALTIME:-}" ]; then
+ clock=bash
elif command -v python3 >/dev/null 2>&1; then
clock=py
else
@@ -99,56 +88,63 @@ else
fi
case $clock in
-gnu | py | none) ;;
+bash | py | none) ;;
*)
- echo "PERF_GO_CLOCK=$clock is not one of gnu, py, none" >&2
+ echo "PERF_GO_CLOCK=$clock is not one of bash, py, none" >&2
exit 2
;;
esac
-runs=10
+# Enough processes that the fastest is a process that got a clear run at the machine, few
+# enough that the slowest row here — kong, at several milliseconds a parse — still finishes
+# in about a second. Fifty was not enough: the floor and usage-go's row are separated by
+# less than a fork's worth of noise, and at fifty runs the floor came out *slower* than the
+# row that does a parse on top of it.
+runs=200
-# Ten whole processes, timed from outside: a timer inside the program cannot see the runtime
+# Whole processes, timed from outside: a timer inside the program cannot see the runtime
# starting up, and that is most of what is being reported here.
wall_ms() {
local binary=$1 n=$2
case $clock in
- gnu)
- local start end
- start=$(date +%s%N 2>/dev/null) || start=
+ bash)
+ local start end pairs=""
for _ in $(seq "$runs"); do
+ start=$EPOCHREALTIME
# shellcheck disable=SC2086
PARSE_N="$n" "$binary" $ARGV >/dev/null
+ end=$EPOCHREALTIME
+ # Collected and reduced once at the end. An `awk` per run would be a fork inside the
+ # loop, which is the cost this clock exists to avoid — though it would land between
+ # two measured intervals rather than inside one.
+ pairs="$pairs$start $end
+"
done
- end=$(date +%s%N 2>/dev/null) || end=
- # Validated rather than trusted: a `date` that answers with anything else would
+ # Validated rather than trusted: a shell whose $EPOCHREALTIME is not a number would
# otherwise be reported as 0.00 ms, which reads as a measurement.
- case $start$end in
- '' | *[!0-9]*)
- echo "unavailable"
- return
- ;;
- esac
- awk -v ns="$((end - start))" -v runs="$runs" \
- 'BEGIN { printf "%.2f", ns / runs / 1000000 }'
+ printf '%s' "$pairs" | awk '
+ { ms = ($2 - $1) * 1000; if (ms <= 0) bad = 1; if (best == "" || ms < best) best = ms }
+ END { if (bad || best == "") { print "unavailable" } else { printf "%.2f", best } }'
;;
py)
# Timed inside python, not around two `python3` invocations. Reading the clock that way
# put a whole interpreter startup — tens of milliseconds — inside an interval measuring
- # ten runs of about one millisecond each, so the fallback reported python rather than
- # the program it was pointed at.
+ # a program that takes about one.
# shellcheck disable=SC2086
python3 - "$binary" "$n" "$runs" $ARGV <<'PYTHON' 2>/dev/null || echo "unavailable"
import os, subprocess, sys, time
binary, parse_n, runs, *argv = sys.argv[1:]
env = dict(os.environ, PARSE_N=parse_n)
+best = None
with open(os.devnull, "wb") as quiet:
- started = time.perf_counter_ns()
for _ in range(int(runs)):
+ started = time.perf_counter_ns()
subprocess.run([binary, *argv], stdout=quiet, env=env, check=False)
- elapsed = time.perf_counter_ns() - started
-print("%.2f" % (elapsed / int(runs) / 1e6))
+ elapsed = time.perf_counter_ns() - started
+ if best is None or elapsed < best:
+ best = elapsed
+print("%.2f" % (best / 1e6))
PYTHON
;;
none) echo "unavailable" ;;
@@ -170,75 +166,154 @@ size_mb() {
awk -v b="$bytes" 'BEGIN { printf "%.2f", b / 1048576 }'
}
-size_mb=$(size_mb "$bin")
-one_wall=$(wall_ms "$bin" 1)
+# Instructions for `n` parses, cachegrind, with the runtime pinned to one thread.
+#
+# GOMAXPROCS=1 is what makes this a measurement. valgrind serializes every thread onto one
+# core, and a Go runtime with more than one to schedule spends the wait spinning — so the
+# count picks up instructions proportional to *wall time*, which under cachegrind is fifty
+# times a normal run's and varies with whatever else the machine is doing. Unpinned, twenty
+# cobra resolves read 56M on one run and 5,002M on the next. Pinned, three consecutive runs
+# agreed to 0.1%.
+instructions() {
+ local binary=$1 n=$2
+ # shellcheck disable=SC2086
+ GOMAXPROCS=1 PARSE_N="$n" valgrind --tool=cachegrind --cache-sim=no --branch-sim=no \
+ --cachegrind-out-file="$work/cachegrind.out.%p" "$binary" $ARGV 2>&1 |
+ sed -n 's/.*I *refs: *//p' | tr -d ','
+}
-if ! command -v valgrind >/dev/null 2>&1; then
- {
- printf '### Go harness\n\n'
- printf 'valgrind is not installed, so there are no instruction counts — wall clock only.\n\n'
- printf '| measurement | value |\n|---|---:|\n'
- printf '| whole process, one bind | %s |\n' "$(wall_cell "$one_wall")"
- printf '| binary | %s MB |\n' "$size_mb"
- } >"$out"
- exit 0
-fi
+# Nanoseconds as something to read: µs to two significant figures until a parse costs
+# milliseconds, which kong's does.
+ns_cell() {
+ awk -v ns="$1" 'BEGIN {
+ if (ns < 1000) { printf "%.0f ns", ns }
+ else if (ns < 100000) { printf "%.1f µs", ns / 1000 }
+ else if (ns < 1000000) { printf "%.0f µs", ns / 1000 }
+ else { printf "%.2f ms", ns / 1000000 }
+ }'
+}
-floor=$(instructions "$bin" 0)
-many=$(instructions "$bin" "$BINDS")
-per=$(( (many - floor) / BINDS ))
+# Each framework: the label the sweep prints, the parse-n binary, and how many resolves to
+# amortize its instruction count over. Few enough that cachegrind's 50x slowdown stays
+# inside a few seconds, many enough that the ±50,000-instruction startup jitter is a
+# rounding error against the total.
+#
+# usage-go gets a thousand because one of its parses is the smallest thing here; kong gets
+# two because one of them is 57 million instructions, and a thousand would take minutes.
+#
+# Two usage-go rows, for the reason `parse-n`'s own comment gives: the row in the comparison
+# is the typed front door, because that is the whole of what the other three do, and the
+# binder alone is reported separately rather than in their column.
+frameworks=(
+ "usage-go, argv -> struct|parse-n|1000"
+ "usage-go, argv -> events|bind-n|1000"
+ "cobra|parse-n-cobra|20"
+ "urfave/cli v3|parse-n-urfave|20"
+ "kong|parse-n-kong|2"
+)
+
+# The sweep, once, tab separated: label, then min, p01, p10 and median in nanoseconds.
+sweep_tsv=""
+if [ -z "$shadows_why" ]; then
+ sweep_tsv=$("$work/sweep" -tsv)
+fi
{
printf '### Go harness\n\n'
- # The backticks are markdown; the single quotes keep them literal.
- # shellcheck disable=SC2016
# shellcheck disable=SC2016 # the backticks are markdown, not command substitution
- printf 'Binding `mise %s` against mise'"'"'s committed spec, through the generated tables in\n' "$ARGV"
+ printf 'Parsing `mise %s` against mise'"'"'s committed spec, through the tables in\n' "$ARGV"
# shellcheck disable=SC2016
- printf '`go/internal/shadow/mise`. Reproduce with `mise run perf:go`.\n\n'
- printf '| measurement | value |\n|---|---:|\n'
- printf '| one bind, amortized over %s | %s instructions |\n' "$BINDS" "$(printf "%'d" "$per")"
- printf '| Go runtime floor, no bind at all | %s instructions |\n' "$(printf "%'d" "$floor")"
- printf '| whole process, one bind | %s |\n' "$(wall_cell "$one_wall")"
- printf '| binary | %s MB |\n' "$size_mb"
- printf '\n'
- printf 'The floor is reported rather than subtracted once and forgotten: it is what a Go CLI\n'
+ printf '`benches/go/mise` and the same spec declared in each of the other three frameworks by\n'
# shellcheck disable=SC2016
- printf 'pays before `main`, it is three orders of magnitude larger than the bind, and it\n'
- printf 'varies between runs by more than the bind costs. Any single-bind measurement here is\n'
- printf 'a measurement of the runtime.\n'
+ printf '`xtask gen-shadow`. Reproduce with `mise run perf:go`.\n\n'
- printf '\n#### Against cobra\n\n'
- if [ -n "$cobra_why" ]; then
- printf 'Not measured this run — %s.\n' "$cobra_why"
+ printf '#### What a parse costs\n\n'
+ if [ -n "$shadows_why" ]; then
+ printf 'Not measured this run — %s.\n\n' "$shadows_why"
else
- cobra_floor=$(instructions "$cobra_bin" 0)
- cobra_many=$(instructions "$cobra_bin" "$COBRA_BINDS")
- cobra_per=$(( (cobra_many - cobra_floor) / COBRA_BINDS ))
- cobra_wall=$(wall_ms "$cobra_bin" 1)
- ratio=$(awk -v a="$cobra_per" -v b="$per" 'BEGIN { printf "%.0f", a / b }')
-
- # shellcheck disable=SC2016 # the backticks are markdown, not command substitution
- printf 'The same spec, declared in cobra by `xtask gen-shadow … cobra` and checked in under\n'
+ printf 'In-process parse throughput: every parser run repeatedly in one process, the\n'
+ printf 'fastest of many short rounds reported. The same measurement, and the same\n'
# shellcheck disable=SC2016
- printf '`benches/go/cobra`, so the two rows describe the same CLI rather than two people'"'"'s\n'
- printf 'transcriptions of mise.\n\n'
- printf '| | one resolve | whole process | binary |\n|---|---:|---:|---:|\n'
- printf '| usage-go | %s | %s | %s MB |\n' \
- "$(printf "%'d" "$per")" "$(wall_cell "$one_wall")" "$size_mb"
- printf '| cobra | %s | %s | %s MB |\n' \
- "$(printf "%'d" "$cobra_per")" "$(wall_cell "$cobra_wall")" "$(size_mb "$cobra_bin")"
- printf '| ratio | %sx | | |\n' "$ratio"
+ printf 'estimator, that `benches/gate/src/bin/time-sweep.rs` takes for the Rust four.\n\n'
+ printf '| | one parse | median | vs usage-go |\n|---|---:|---:|---:|\n'
+ base=$(printf '%s\n' "$sweep_tsv" | awk -F'\t' '/^usage-go, argv -> struct/ { print $2 }')
+ printf '%s\n' "$sweep_tsv" | while IFS=$'\t' read -r label min _p01 _p10 median; do
+ ratio=""
+ case $label in
+ "usage-go, argv -> struct") ratio="" ;;
+ "usage-go, argv -> events") ratio="" ;;
+ *) ratio=$(awk -v a="$min" -v b="$base" 'BEGIN { printf "%.0fx", a / b }') ;;
+ esac
+ printf '| %s | %s | %s | %s |\n' \
+ "$label" "$(ns_cell "$min")" "$(ns_cell "$median")" "$ratio"
+ done
printf '\n'
- printf 'cobra'"'"'s figure includes building its command tree, because that is what it does on\n'
- # shellcheck disable=SC2016
- printf 'every process start: a `cobra.Command` per subcommand, each with its own flag set.\n'
- printf 'Hoisting it out of the loop would measure its parser against a program that had\n'
- printf 'already paid for its model, which no CLI gets to do. usage-go has no such step —\n'
- printf 'the tables are laid out by the linker — so the two figures are what each framework\n'
- printf 'costs to answer one command line in a fresh process.\n'
- printf '\nAmortized over %s iterations for usage-go and %s for cobra: one cobra resolve is\n' \
- "$BINDS" "$COBRA_BINDS"
- printf 'dear enough that a thousand of them under cachegrind would take minutes.\n'
+ printf 'The minimum is the estimator to want on a shared machine — noise from other\n'
+ printf 'tenants is additive, and nothing another process does can make this one faster —\n'
+ printf 'and short rounds are the ones an interruption can only spoil individually. The\n'
+ printf 'median is beside it because that is where garbage collection shows up: the three\n'
+ printf 'frameworks build a model per parse and the collector eventually charges for it,\n'
+ printf 'which a minimum over short rounds mostly steps around.\n\n'
+ printf 'Two rows for usage-go because it has two answers. `argv -> struct` is the front\n'
+ printf 'door, and the row comparable to the other three: bind, apply the post-binding\n'
+ printf 'rules, fill the typed structs. `argv -> events` is the binder alone, which no\n'
+ printf 'other framework here has as a separate stage.\n\n'
+ # Rendered from the same TSV the table above reads, rather than by running the sweep a
+ # second time: two runs are two measurements, and printing one beside the other as
+ # though they were the same one is how a table starts disagreeing with itself.
+ printf '```\n'
+ printf '%s\n' "$sweep_tsv" | awk -F'\t' '
+ BEGIN { printf "%-40s%9s %9s %9s %9s\n", "", "min", "p01", "p10", "median" }
+ { printf "%-40s%9d %9d %9d %9d ns\n", $1, $2, $3, $4, $5 }'
+ printf '```\n\n'
fi
+
+ printf '#### What a whole process costs\n\n'
+ printf 'The number an adopter feels, and mostly not the parser: a Go process is ~0.95 ms\n'
+ printf 'and ~950,000 instructions old by the time `main` runs, whatever it then parses.\n'
+ printf 'Reported beside the parse rather than subtracted from it, because the subtraction\n'
+ printf 'hides how much of a Go CLI'"'"'s latency no parser can win back.\n\n'
+
+ if ! command -v valgrind >/dev/null 2>&1; then
+ printf 'valgrind is not installed, so there are no instruction counts — wall clock only.\n\n'
+ fi
+
+ printf '| | instructions | whole process | binary |\n|---|---:|---:|---:|\n'
+ floor_wall=$(wall_ms "$bin" 0)
+ floor_instr="not measured"
+ if command -v valgrind >/dev/null 2>&1; then
+ floor_instr="$(printf "%'d" "$(instructions "$bin" 0)")"
+ fi
+ printf '| the Go runtime, parsing nothing | %s | %s | — |\n' \
+ "$floor_instr" "$(wall_cell "$floor_wall")"
+ for framework in "${frameworks[@]}"; do
+ IFS='|' read -r label binary iters <<<"$framework"
+ path=$work/$binary
+ if [ ! -x "$path" ]; then
+ printf '| %s | not measured — %s | | |\n' "$label" "$shadows_why"
+ continue
+ fi
+ instr="not measured"
+ if command -v valgrind >/dev/null 2>&1; then
+ many=$(instructions "$path" "$iters")
+ floor=$(instructions "$path" 0)
+ instr="$(printf "%'d" "$(((many - floor) / iters))")"
+ fi
+ printf '| %s | %s | %s | %s MB |\n' \
+ "$label" "$instr" "$(wall_cell "$(wall_ms "$path" 1)")" "$(size_mb "$path")"
+ done
+ printf '\n'
+ printf 'The wall column is the fastest of %s whole processes. The floor and the row\n' "$runs"
+ printf 'under it are one binary asked for nought parses and for one, and they differ by\n'
+ printf 'less than a process launch varies: a usage-go parse is below the resolution of\n'
+ printf 'this column, which is the honest thing for it to say rather than an ordering to\n'
+ printf 'read. The same caution applies between cobra and urfave, which land a tenth of a\n'
+ printf 'millisecond apart here and swap places between runs; the table above is where\n'
+ printf 'those two are separated.\n\n'
+ printf 'Instruction counts are cachegrind, amortized over 1,000 parses for usage-go and\n'
+ printf 'fewer for the frameworks that cost three to five orders of magnitude more — 20\n'
+ printf 'each for cobra and urfave, 2 for kong, because a thousand kong parses under\n'
+ printf 'cachegrind would take minutes. They are amortized rather than differenced from a\n'
+ printf 'single parse because Go'"'"'s startup varies run to run by ±50,000 instructions,\n'
+ printf 'which is twenty times what a usage-go bind costs.\n'
} >"$out"
diff --git a/xtask/src/cobra.rs b/xtask/src/go/cobra.rs
similarity index 50%
rename from xtask/src/cobra.rs
rename to xtask/src/go/cobra.rs
index 178dc2b0f..fc3676b91 100644
--- a/xtask/src/cobra.rs
+++ b/xtask/src/go/cobra.rs
@@ -1,73 +1,17 @@
-//! Turning a spec into a Go program that declares the same CLI in cobra.
+//! mise declared in cobra.
//!
-//! The point is a measurement nobody has to take on trust. usage-go's row in
-//! `go/README.md` is reproducible — `mise run perf:go` — and cobra's was measured
-//! by hand against a program that was not in the repository, which makes it a
-//! claim rather than a number. Generated from the same spec, by the same
-//! traversal that writes the usage tables, the two rows describe the same CLI and
-//! the comparison is between parsers rather than between two people's
-//! transcriptions of mise.
+//! A library package rather than a program: the benchmark that times it links all
+//! four frameworks into one binary and sweeps them in the same process, the way
+//! `benches/gate/src/bin/time-sweep.rs` does for the Rust four.
//!
-//! Emitted as Go rather than through `shadow.rs`, which writes Rust: the shape is
-//! not a variation on the derive's — cobra builds its tree with statements, one
-//! `&cobra.Command{…}` and a `Flags()` call per entry — and threading a language
-//! through that emitter would obscure both.
-//!
-//! What cobra cannot express is counted and printed, as the Rust dialects do. A
-//! shadow that quietly dropped half the spec would measure a smaller CLI and
-//! flatter the framework it was declaring.
+//! The tree is built inside `Resolve` on purpose. That is what cobra does on every
+//! process start — a `&cobra.Command` per subcommand, each with its own flag set — and
+//! it is the cost the comparison is about. Hoisting it out would measure a parser
+//! against a program that had already paid for its model.
use super::*;
-/// What a spec property turned into, or why it did not.
-#[derive(Default)]
-struct Skipped {
- counts: BTreeMap<&'static str, usize>,
-}
-
-impl Skipped {
- fn note(&mut self, what: &'static str) {
- *self.counts.entry(what).or_default() += 1;
- }
-
- fn report(&self) {
- if self.counts.is_empty() {
- println!(" nothing dropped: cobra expressed the whole spec");
- return;
- }
- println!(" dropped, because cobra cannot express it:");
- for (what, n) in &self.counts {
- println!(" {what}: {n}");
- }
- }
-}
-
-/// Write a cobra program declaring `spec_path`'s CLI into `out_dir`.
-pub fn generate(spec_path: &Path, out_dir: &Path) {
- let kdl = match std::fs::read_to_string(spec_path) {
- Ok(kdl) => kdl,
- Err(e) => fail(&format!("reading {}: {e}", spec_path.display())),
- };
- let spec: Spec = match kdl.parse() {
- Ok(spec) => spec,
- Err(e) => fail(&format!("parsing {}: {e}", spec_path.display())),
- };
-
- let mut skipped = Skipped::default();
- let source = render(&spec, spec_path, &mut skipped);
-
- if let Err(e) = std::fs::create_dir_all(out_dir) {
- fail(&format!("creating {}: {e}", out_dir.display()));
- }
- let main = out_dir.join("main.go");
- if let Err(e) = std::fs::write(&main, source) {
- fail(&format!("writing {}: {e}", main.display()));
- }
- println!("cobra shadow: {}", main.display());
- skipped.report();
-}
-
-fn render(spec: &Spec, spec_path: &Path, skipped: &mut Skipped) -> String {
+pub fn render(spec: &Spec, spec_path: &Path, skipped: &mut Skipped) -> String {
let mut out = String::new();
let bin = &spec.bin;
@@ -75,24 +19,13 @@ fn render(spec: &Spec, spec_path: &Path, skipped: &mut Skipped) -> String {
out,
"// Code generated by `xtask gen-shadow {} cobra`. DO NOT EDIT.\n\
//\n\
- // {} declared in cobra, from the same spec the usage tables are generated from, so\n\
- // that the two rows of `go/README.md`'s table describe the same CLI. Regenerate with\n\
- // `mise run gen-shadow` rather than editing: a hand-edit here is a difference no\n\
- // reviewer can see, in a program whose whole job is to be comparable.\n\
- //\n\
- // The tree is built inside the loop on purpose. That is what cobra does on every\n\
- // process start — a `&cobra.Command` per subcommand, each with its own flag set — and\n\
- // it is the cost the comparison is about. Hoisting it out would measure a parser\n\
- // against a program that had already paid for its model.\n\
- package main\n\n\
- import (\n\
- \t\"fmt\"\n\
- \t\"os\"\n\
- \t\"strconv\"\n\n\
- \t\"github.com/spf13/cobra\"\n\
- )\n",
+ // {bin} declared in cobra, from the same spec the usage tables are generated\n\
+ // from, so that the rows of `go/README.md`'s tables describe the same CLI.\n\
+ // Regenerate with `mise run gen-shadow` rather than editing: a hand-edit here is a\n\
+ // difference no reviewer can see, in a program whose whole job is to be comparable.\n\
+ package {bin}cobra\n\n\
+ import \"github.com/spf13/cobra\"\n",
spec_path.display(),
- bin,
);
let mut body = String::new();
@@ -109,31 +42,21 @@ fn render(spec: &Spec, spec_path: &Path, skipped: &mut Skipped) -> String {
}}\n"
);
- // The same protocol as `go/internal/bench/parse-n`, so the two programs' numbers can sit
- // in one table: N binds of the same command line, and one line saying whether the last
- // one arrived somewhere.
+ // Find and ParseFlags rather than Execute: the comparison is about resolving a command
+ // line, and Execute would run the command as well. This is the same work the usage side
+ // does — reach a command, bind its flags — and no more.
let _ = writeln!(
out,
- "func main() {{\n\
- \tn := 1\n\
- \tif v, err := strconv.Atoi(os.Getenv(\"PARSE_N\")); err == nil {{\n\
- \t\tn = v\n\
- \t}}\n\n\
- \t// Find and ParseFlags rather than Execute: the comparison is about resolving a\n\
- \t// command line, and Execute would run the command as well. This is the same work\n\
- \t// the usage side does — reach a command, bind its flags — and no more.\n\
- \tseen := 0\n\
- \tfor i := 0; i < n; i++ {{\n\
- \t\troot := build()\n\
- \t\tcmd, flags, err := root.Find(os.Args[1:])\n\
- \t\tif err == nil {{\n\
- \t\t\terr = cmd.ParseFlags(flags)\n\
- \t\t}}\n\
- \t\tif err == nil && cmd != root {{\n\
- \t\t\tseen = 1\n\
- \t\t}}\n\
+ "// Resolve builds cobra's model of the CLI and resolves argv against it, reporting\n\
+ // whether a subcommand was reached. Both halves are the measurement: cobra has no\n\
+ // way to answer a command line without first constructing the tree.\n\
+ func Resolve(argv []string) bool {{\n\
+ \troot := build()\n\
+ \tcmd, flags, err := root.Find(argv)\n\
+ \tif err == nil {{\n\
+ \t\terr = cmd.ParseFlags(flags)\n\
\t}}\n\
- \tfmt.Println(seen)\n\
+ \treturn err == nil && cmd != root\n\
}}"
);
out
@@ -184,12 +107,7 @@ fn emit_command(
note_arg(arg, skipped);
}
- for (name, sub) in &cmd.subcommands {
- // An alias is keyed beside the canonical name in this map, and declaring the command
- // twice would say the tree is bigger than it is.
- if name != &sub.name {
- continue;
- }
+ for (name, sub) in subcommands(cmd) {
*next += 1;
let child = format!("cmd{next}");
emit_command(out, sub, &child, name, next, skipped);
@@ -283,28 +201,3 @@ fn note_arg(arg: &SpecArg, skipped: &mut Skipped) {
let _ = arg;
skipped.note("positional arguments (cobra validates a count, not a name)");
}
-
-fn go_string(s: &str) -> String {
- let mut out = String::with_capacity(s.len() + 2);
- out.push('"');
- for c in s.chars() {
- match c {
- '"' => out.push_str("\\\""),
- '\\' => out.push_str("\\\\"),
- '\n' => out.push_str("\\n"),
- '\r' => out.push_str("\\r"),
- '\t' => out.push_str("\\t"),
- c if (c as u32) < 0x20 => {
- let _ = write!(out, "\\x{:02x}", c as u32);
- }
- c => out.push(c),
- }
- }
- out.push('"');
- out
-}
-
-fn string_slice(items: &[String]) -> String {
- let quoted: Vec = items.iter().map(|s| go_string(s)).collect();
- format!("[]string{{{}}}", quoted.join(", "))
-}
diff --git a/xtask/src/go/kong.rs b/xtask/src/go/kong.rs
new file mode 100644
index 000000000..11e0ac3d0
--- /dev/null
+++ b/xtask/src/go/kong.rs
@@ -0,0 +1,412 @@
+//! mise declared in kong.
+//!
+//! kong is the framework that gives Go the ergonomics people actually want — the CLI
+//! is a struct, and the tags on it say what the flags are — and this is what that
+//! costs: the grammar is discovered by walking the struct with reflection on every
+//! process start, because reflection is the only way to read tags without a build
+//! step.
+//!
+//! So a struct per command, and a tag per flag, which is what an author would write
+//! by hand. `kong.New` is called inside `Resolve` for the same reason cobra's tree is
+//! built there: it is not a step a CLI gets to skip.
+
+use super::*;
+
+use std::collections::{HashMap, HashSet};
+
+pub fn render(spec: &Spec, spec_path: &Path, skipped: &mut Skipped) -> String {
+ let mut out = String::new();
+ let bin = &spec.bin;
+
+ let _ = writeln!(
+ out,
+ "// Code generated by `xtask gen-shadow {} kong`. DO NOT EDIT.\n\
+ //\n\
+ // {bin} declared in kong, from the same spec the usage tables are generated from,\n\
+ // so that the rows of `go/README.md`'s tables describe the same CLI. Regenerate\n\
+ // with `mise run gen-shadow` rather than editing.\n\
+ //\n\
+ // One struct per command and one tag per flag, as an author would write them.\n\
+ // `kong.New` walks all of it with reflection inside `Resolve`, because that is\n\
+ // what a kong program does on every process start.\n\
+ package {bin}kong\n\n\
+ import (\n\
+ \t\"io\"\n\n\
+ \t\"github.com/alecthomas/kong\"\n\
+ )\n",
+ spec_path.display(),
+ );
+
+ let mut types = Types::default();
+ let root = types.emit(&spec.cmd, "Cli", &Inherited::default(), skipped);
+ debug_assert_eq!(root, "Cli");
+ for decl in &types.decls {
+ out.push_str(decl);
+ out.push('\n');
+ }
+
+ // Writers and Exit rather than the defaults: kong prints to stderr and calls
+ // os.Exit when it is asked for help, and a harness that let it would measure the
+ // page being written or not finish at all.
+ let _ = writeln!(
+ out,
+ "// Resolve builds kong's model of the CLI by reflecting over the structs above and\n\
+ // parses argv against it, reporting whether a subcommand was reached.\n\
+ //\n\
+ // Both halves are the measurement: kong has no way to answer a command line\n\
+ // without first walking the whole grammar.\n\
+ func Resolve(argv []string) bool {{\n\
+ \tvar target Cli\n\
+ \tparser, err := kong.New(&target, kong.Name({}),\n\
+ \t\tkong.Exit(func(int) {{}}), kong.Writers(io.Discard, io.Discard))\n\
+ \tif err != nil {{\n\
+ \t\treturn false\n\
+ \t}}\n\
+ \tctx, err := parser.Parse(argv)\n\
+ \tif err != nil {{\n\
+ \t\treturn false\n\
+ \t}}\n\
+ \treturn ctx.Selected() != nil\n\
+ }}",
+ go_string(bin),
+ );
+ out
+}
+
+/// The struct declarations, and the names already taken by one.
+#[derive(Default)]
+struct Types {
+ decls: Vec,
+ taken: HashMap,
+}
+
+impl Types {
+ /// Declare a type for `cmd` and everything under it, returning its name.
+ fn emit(
+ &mut self,
+ cmd: &SpecCommand,
+ suggested: &str,
+ inherited: &Inherited,
+ skipped: &mut Skipped,
+ ) -> String {
+ let name = self.reserve(suggested);
+ // Reserved before the children are walked, so a child cannot take this name, and
+ // the declaration is pushed afterwards: the body needs the children's names.
+ let slot = self.decls.len();
+ self.decls.push(String::new());
+
+ let has_subcommands = subcommands(cmd).next().is_some();
+
+ let mut scope = inherited.clone();
+ let mut fields = Fields::default();
+ for flag in &cmd.flags {
+ if let Some(field) = flag_field(flag, has_subcommands, &mut scope, &mut fields, skipped)
+ {
+ fields.push(field);
+ }
+ }
+ // kong wants the optional positionals last and refuses the grammar outright
+ // otherwise. A spec is free to say ` [b] `, so once one is optional the rest
+ // are declared that way too, which is a looser CLI than the spec describes.
+ let mut after_optional = false;
+ // And a variadic one has to be the last of them: kong reads it as taking
+ // everything that is left, so nothing can follow it.
+ let mut after_variadic = false;
+ for arg in &cmd.args {
+ if has_subcommands {
+ // kong refuses the mix outright — "can't mix positional arguments and
+ // branching arguments" — so on a command that has subcommands the
+ // positionals are what has to go. mise's root is one of these: `mise
+ // ` and `mise use …` cannot both be said here.
+ skipped.note("positionals on a command that also has subcommands");
+ continue;
+ }
+ if after_variadic {
+ skipped.note("positionals after a variadic one (kong's takes what is left)");
+ continue;
+ }
+ if let Some(field) = arg_field(arg, after_optional, &mut fields, skipped) {
+ fields.push(field);
+ }
+ after_optional |= !arg.required;
+ after_variadic |= arg.var;
+ }
+
+ for (child_name, sub) in subcommands(cmd) {
+ let suggested = format!("{}{}Cmd", trim_cmd(&name), pascal(child_name));
+ let ty = self.emit(sub, &suggested, &scope, skipped);
+ let ident = fields.ident(&pascal(child_name));
+ let mut tag = vec![format!("cmd:\"\" name:{}", tag_value(child_name))];
+ if let Some(help) = sub.help.as_deref().or(sub.help_long.as_deref()) {
+ tag.push(format!("help:{}", tag_value(help)));
+ }
+ // Both lists, as the other shadows do: kong has one `aliases` and no way to
+ // say that one of them is hidden.
+ let aliases: Vec = sub
+ .aliases
+ .iter()
+ .chain(sub.hidden_aliases.iter())
+ .cloned()
+ .collect();
+ if !aliases.is_empty() {
+ tag.push(format!("aliases:{}", tag_value(&aliases.join(","))));
+ }
+ if !sub.hidden_aliases.is_empty() {
+ skipped.note("hidden aliases (kong hides a command, not an alias)");
+ }
+ if sub.hide {
+ tag.push("hidden:\"\"".to_string());
+ }
+ fields.push(format!("\t{ident} {ty} {}\n", go_string(&tag.join(" "))));
+ }
+
+ for _ in &cmd.mounts {
+ skipped.note("mounts (another spec grafted in at run time)");
+ }
+
+ // The root's `full_cmd` is empty, and a doc comment reading "Cli is ``" says
+ // less than nothing.
+ let path = cmd.full_cmd.join(" ");
+ let mut decl = String::new();
+ match (
+ path.is_empty(),
+ cmd.help.as_deref().or(cmd.help_long.as_deref()),
+ ) {
+ (true, _) => {
+ let _ = writeln!(decl, "// {name} is the root command.");
+ }
+ (false, Some(help)) => {
+ // One line: a doc comment is `//` per line, and mise's help runs to
+ // paragraphs.
+ let line = help.lines().next().unwrap_or_default();
+ let _ = writeln!(decl, "// {name} is `{path}`: {line}");
+ }
+ (false, None) => {
+ let _ = writeln!(decl, "// {name} is `{path}`.");
+ }
+ }
+ let _ = write!(decl, "type {name} struct {{\n{}}}\n", fields.body);
+ self.decls[slot] = decl;
+ name
+ }
+
+ /// A type name nothing else has taken.
+ ///
+ /// Two commands of the same name under different parents produce the same suggestion
+ /// — mise has thirteen `status` commands — and Go says so at compile time rather than
+ /// quietly using one of them.
+ fn reserve(&mut self, suggested: &str) -> String {
+ let n = self.taken.entry(suggested.to_string()).or_insert(0);
+ *n += 1;
+ if *n == 1 {
+ suggested.to_string()
+ } else {
+ format!("{suggested}{n}")
+ }
+ }
+}
+
+/// The fields of one struct, and the names already taken by one.
+#[derive(Default)]
+struct Fields {
+ body: String,
+ taken: HashMap,
+}
+
+impl Fields {
+ fn push(&mut self, field: String) {
+ self.body.push_str(&field);
+ }
+
+ /// A field name nothing else in this struct has taken. `--dry-run` and `--dryRun`
+ /// both want to be `DryRun`, and a struct with the field twice does not compile.
+ fn ident(&mut self, suggested: &str) -> String {
+ let n = self.taken.entry(suggested.to_string()).or_insert(0);
+ *n += 1;
+ if *n == 1 {
+ suggested.to_string()
+ } else {
+ format!("{suggested}{n}")
+ }
+ }
+}
+
+/// The flag names an ancestor has already declared.
+///
+/// kong has no shadowing: a flag on a parent is in scope for every child, and a child
+/// that declares the same name is a duplicate that `kong.New` refuses outright. mise
+/// redeclares `--quiet` and friends on subcommands, where a spec means "this one wins
+/// here", so those are dropped rather than declared twice.
+#[derive(Clone, Default)]
+struct Inherited {
+ longs: HashSet,
+ shorts: HashSet,
+}
+
+/// One flag, as a struct field with the tags a kong author would write.
+fn flag_field(
+ flag: &SpecFlag,
+ has_subcommands: bool,
+ scope: &mut Inherited,
+ fields: &mut Fields,
+ skipped: &mut Skipped,
+) -> Option {
+ let Some(long) = flag.long.first() else {
+ // Every kong flag is a struct field, and a field has a name, so the long form is
+ // not optional the way it is in a spec.
+ skipped.note("short-only flags");
+ return None;
+ };
+ if long == "help" {
+ // kong declares `--help` itself and rejects the duplicate at `New` time, which
+ // would fail every parse rather than measuring one.
+ skipped.note("`--help` (kong declares its own)");
+ return None;
+ }
+ if !scope.longs.insert(long.clone()) {
+ skipped.note("flags a parent already declares (kong has no shadowing)");
+ return None;
+ }
+
+ let mut tag = vec![format!("name:{}", tag_value(long))];
+ // The short form goes only to the first flag that asks for it, for the same reason:
+ // an inherited `-q` is still `-q` inside a subcommand.
+ if let Some(short) = flag.short.first().filter(|c| scope.shorts.insert(**c)) {
+ tag.push(format!("short:{}", tag_value(&short.to_string())));
+ } else if !flag.short.is_empty() {
+ skipped.note("short forms a parent already declares (kong has no shadowing)");
+ }
+ if flag.short.len() > 1 {
+ skipped.note("second and later short forms");
+ }
+ if flag.long.len() > 1 {
+ tag.push(format!("aliases:{}", tag_value(&flag.long[1..].join(","))));
+ }
+ if let Some(help) = flag.help.as_deref().or(flag.help_first_line.as_deref()) {
+ tag.push(format!("help:{}", tag_value(help)));
+ }
+ if flag.hide {
+ tag.push("hidden:\"\"".to_string());
+ }
+ if flag.required {
+ tag.push("required:\"\"".to_string());
+ }
+ if let Some(env) = flag.env.as_deref() {
+ tag.push(format!("env:{}", tag_value(env)));
+ }
+ if flag.negate.is_some() {
+ // kong's `negatable` derives the negated spelling from the flag's own name, and a
+ // spec says it outright — `--no-config` for `--config` is not `--no-config`'s
+ // business to guess.
+ skipped.note("negations (kong derives the spelling rather than taking it)");
+ }
+ if !flag.global && has_subcommands {
+ // A kong flag declared on a node is in scope for every node below it, which is
+ // what a spec calls global. There is no way to say "here and no deeper" — so this
+ // is only a difference on a command that has subcommands to leak into.
+ skipped.note("command-local flags on a branch (kong's reach everything below)");
+ }
+
+ let ty = match (&flag.arg, flag.count, flag.var) {
+ (None, true, _) => {
+ tag.push("type:\"counter\"".to_string());
+ "int"
+ }
+ (None, false, _) => "bool",
+ (Some(_), _, true) => "[]string",
+ (Some(_), _, false) => {
+ if let Some(default) = flag.default.first() {
+ tag.push(format!("default:{}", tag_value(default)));
+ }
+ "string"
+ }
+ };
+ if flag.arg.as_ref().is_some_and(|a| a.choices.is_some()) {
+ // `enum` is expressible and left out: kong requires an enum flag to be required
+ // or to have a default that is one of the values, and a spec's choices carry
+ // neither, so declaring them would change which command lines parse.
+ skipped.note("choices (kong's enum needs a default or required)");
+ }
+
+ let ident = fields.ident(&pascal(long));
+ Some(format!("\t{ident} {ty} {}\n", go_string(&tag.join(" "))))
+}
+
+/// One positional, as a struct field with `arg:""`.
+fn arg_field(
+ arg: &SpecArg,
+ after_optional: bool,
+ fields: &mut Fields,
+ skipped: &mut Skipped,
+) -> Option {
+ let mut tag = vec![format!("arg:\"\" name:{}", tag_value(&arg.name))];
+ if !arg.required {
+ tag.push("optional:\"\"".to_string());
+ } else if after_optional {
+ skipped.note("required positionals after an optional one (kong wants those last)");
+ tag.push("optional:\"\"".to_string());
+ }
+ if let Some(help) = arg.help.as_deref().or(arg.help_first_line.as_deref()) {
+ tag.push(format!("help:{}", tag_value(help)));
+ }
+ if arg.choices.is_some() {
+ skipped.note("choices (kong's enum needs a default or required)");
+ }
+ let ty = if arg.var { "[]string" } else { "string" };
+ let ident = fields.ident(&pascal(&arg.name));
+ Some(format!("\t{ident} {ty} {}\n", go_string(&tag.join(" "))))
+}
+
+/// `"use"` as a struct-tag value: quoted, and quoted again by the caller's `go_string`.
+///
+/// A struct tag is a string whose values are themselves quoted strings, so a help line
+/// with a `"` in it has to survive two layers. `reflect.StructTag` reads the inner one
+/// and Go's lexer the outer.
+fn tag_value(s: &str) -> String {
+ let mut out = String::with_capacity(s.len() + 2);
+ out.push('"');
+ for c in s.chars() {
+ match c {
+ '"' => out.push_str("\\\""),
+ '\\' => out.push_str("\\\\"),
+ // A tag value is one line by the time reflect reads it: kong prints help as
+ // it finds it, and a newline inside a tag is not something `StructTag` gives
+ // back intact.
+ '\n' | '\r' | '\t' => out.push(' '),
+ c => out.push(c),
+ }
+ }
+ out.push('"');
+ out
+}
+
+/// `tool-alias` as `ToolAlias`.
+fn pascal(s: &str) -> String {
+ let mut out = String::with_capacity(s.len());
+ let mut upper = true;
+ for c in s.chars() {
+ if c.is_ascii_alphanumeric() {
+ if upper {
+ out.extend(c.to_uppercase());
+ } else {
+ out.push(c);
+ }
+ upper = false;
+ } else {
+ upper = true;
+ }
+ }
+ if out.is_empty() || out.starts_with(|c: char| c.is_ascii_digit()) {
+ out.insert(0, 'X');
+ }
+ out
+}
+
+/// `ToolAliasCmd` as `ToolAlias`, so a grandchild reads `ToolAliasGetCmd` rather than
+/// `ToolAliasCmdGetCmd`.
+fn trim_cmd(name: &str) -> &str {
+ if name == "Cli" {
+ return "";
+ }
+ name.strip_suffix("Cmd").unwrap_or(name)
+}
diff --git a/xtask/src/go/mod.rs b/xtask/src/go/mod.rs
new file mode 100644
index 000000000..02274a2a3
--- /dev/null
+++ b/xtask/src/go/mod.rs
@@ -0,0 +1,148 @@
+//! Turning a spec into Go programs that declare the same CLI in another framework.
+//!
+//! One emitter per framework, and everything they share lives here: reading the
+//! spec, quoting Go, and the report of what a framework could not express.
+//!
+//! Why generate them at all. usage-go's numbers are taken against tables generated
+//! from mise's committed spec, and a comparison against a program somebody wrote by
+//! hand is a comparison between two transcriptions rather than between two parsers —
+//! the hand-written cobra program these replaced was a third of mise's size, and read
+//! as though cobra were three times faster than it is. Generated from one spec by one
+//! traversal, every row of `go/README.md`'s table describes the same CLI.
+//!
+//! Emitted as Go rather than through `shadow.rs`, which writes Rust: cobra and
+//! urfave build their trees with statements, kong wants a struct per command, and
+//! threading a language through that emitter would obscure all of it.
+//!
+//! What a framework cannot express is counted and printed rather than passed over.
+//! A shadow that quietly dropped half the spec would measure a smaller CLI and
+//! flatter the framework it was declaring.
+
+use super::*;
+
+pub mod cobra;
+pub mod kong;
+pub mod urfave;
+
+/// Which framework's vocabulary to write the CLI in.
+#[derive(Clone, Copy, PartialEq, Eq)]
+pub enum Dialect {
+ Cobra,
+ Urfave,
+ Kong,
+}
+
+impl Dialect {
+ pub fn as_str(self) -> &'static str {
+ match self {
+ Dialect::Cobra => "cobra",
+ Dialect::Urfave => "urfave",
+ Dialect::Kong => "kong",
+ }
+ }
+
+ /// The file each emitter writes, named after the package rather than `main.go`:
+ /// these are library packages, imported by one benchmark binary that links all
+ /// four frameworks and times them in the same process.
+ fn file(self) -> &'static str {
+ match self {
+ Dialect::Cobra => "cobra.go",
+ Dialect::Urfave => "urfave.go",
+ Dialect::Kong => "kong.go",
+ }
+ }
+}
+
+/// Write a shadow of `spec_path`'s CLI, in `dialect`, into `out_dir`.
+pub fn generate(spec_path: &Path, out_dir: &Path, dialect: Dialect) {
+ let kdl = match std::fs::read_to_string(spec_path) {
+ Ok(kdl) => kdl,
+ Err(e) => fail(&format!("reading {}: {e}", spec_path.display())),
+ };
+ let spec: Spec = match kdl.parse() {
+ Ok(spec) => spec,
+ Err(e) => fail(&format!("parsing {}: {e}", spec_path.display())),
+ };
+
+ let mut skipped = Skipped::default();
+ let source = match dialect {
+ Dialect::Cobra => cobra::render(&spec, spec_path, &mut skipped),
+ Dialect::Urfave => urfave::render(&spec, spec_path, &mut skipped),
+ Dialect::Kong => kong::render(&spec, spec_path, &mut skipped),
+ };
+
+ if let Err(e) = std::fs::create_dir_all(out_dir) {
+ fail(&format!("creating {}: {e}", out_dir.display()));
+ }
+ let path = out_dir.join(dialect.file());
+ if let Err(e) = std::fs::write(&path, source) {
+ fail(&format!("writing {}: {e}", path.display()));
+ }
+ println!("{} shadow: {}", dialect.as_str(), path.display());
+ skipped.report(dialect);
+}
+
+/// What a spec property turned into, or why it did not.
+///
+/// Collected rather than warned about one at a time: a spec of mise's size drops
+/// enough on the floor that a reader needs the totals, and silence would read as
+/// "everything was expressible".
+#[derive(Default)]
+pub struct Skipped {
+ counts: BTreeMap<&'static str, usize>,
+}
+
+impl Skipped {
+ pub fn note(&mut self, what: &'static str) {
+ *self.counts.entry(what).or_default() += 1;
+ }
+
+ fn report(&self, dialect: Dialect) {
+ let what = dialect.as_str();
+ if self.counts.is_empty() {
+ println!(" nothing dropped: {what} expressed the whole spec");
+ return;
+ }
+ println!(" dropped, because {what} cannot express it:");
+ for (what, n) in &self.counts {
+ println!(" {what}: {n}");
+ }
+ }
+}
+
+/// The subcommands of `cmd`, in declaration order, without the alias keys.
+///
+/// An alias is keyed beside the canonical name in that map, and declaring the command
+/// once per key would say the tree is bigger than it is.
+pub fn subcommands(cmd: &SpecCommand) -> impl Iterator- {
+ cmd.subcommands
+ .iter()
+ .filter(|(name, sub)| *name == &sub.name)
+}
+
+/// A Go string literal.
+pub fn go_string(s: &str) -> String {
+ let mut out = String::with_capacity(s.len() + 2);
+ out.push('"');
+ for c in s.chars() {
+ match c {
+ '"' => out.push_str("\\\""),
+ '\\' => out.push_str("\\\\"),
+ '\n' => out.push_str("\\n"),
+ '\r' => out.push_str("\\r"),
+ '\t' => out.push_str("\\t"),
+ c if (c as u32) < 0x20 => {
+ let _ = write!(out, "\\x{:02x}", c as u32);
+ }
+ c => out.push(c),
+ }
+ }
+ out.push('"');
+ out
+}
+
+/// A `[]string{…}` literal.
+pub fn string_slice(items: &[String]) -> String {
+ let quoted: Vec = items.iter().map(|s| go_string(s)).collect();
+ format!("[]string{{{}}}", quoted.join(", "))
+}
diff --git a/xtask/src/go/urfave.rs b/xtask/src/go/urfave.rs
new file mode 100644
index 000000000..39b89eaaa
--- /dev/null
+++ b/xtask/src/go/urfave.rs
@@ -0,0 +1,254 @@
+//! mise declared in urfave/cli v3.
+//!
+//! Where cobra hands out a `Find` that resolves a command line without running it,
+//! urfave has one entry point: `Run` sets the tree up, parses, and calls the action
+//! it arrived at. So the shadow's actions are empty and `Resolve` reports which one
+//! fired. That is a hair more than the other three rows do — a dispatch through one
+//! empty closure — and it is what an urfave program cannot avoid doing.
+
+use super::*;
+
+pub fn render(spec: &Spec, spec_path: &Path, skipped: &mut Skipped) -> String {
+ let mut out = String::new();
+ let bin = &spec.bin;
+
+ let _ = writeln!(
+ out,
+ "// Code generated by `xtask gen-shadow {} urfave`. DO NOT EDIT.\n\
+ //\n\
+ // {bin} declared in urfave/cli v3, from the same spec the usage tables are\n\
+ // generated from, so that the rows of `go/README.md`'s tables describe the same\n\
+ // CLI. Regenerate with `mise run gen-shadow` rather than editing.\n\
+ //\n\
+ // The tree is built inside `Resolve` on purpose: that is what an urfave program\n\
+ // does on every process start, and it is the cost the comparison is about.\n\
+ package {bin}urfave\n\n\
+ import (\n\
+ \t\"context\"\n\
+ \t\"io\"\n\n\
+ \t\"github.com/urfave/cli/v3\"\n\
+ )\n",
+ spec_path.display(),
+ );
+
+ let has_subcommands = subcommands(&spec.cmd).next().is_some();
+
+ let mut body = String::new();
+ let mut next = 0usize;
+ let root = emit_command(&mut body, &spec.cmd, bin, true, &mut next, skipped);
+
+ // Declared once and shared, rather than a closure per command: a func value that
+ // captures nothing is laid out by the compiler, and one that captures `hit` would
+ // otherwise be allocated 211 times and charged to urfave's model-building.
+ let mut helpers =
+ String::from("\tnoop := func(context.Context, *cli.Command) error { return nil }\n");
+ if has_subcommands {
+ helpers.push_str(
+ "\treached := func(context.Context, *cli.Command) error { *hit = true; return nil }\n",
+ );
+ }
+
+ let _ = writeln!(
+ out,
+ "// build declares the whole CLI, as an urfave program's `main` would.\n\
+ //\n\
+ // `hit` is set by the action of whichever subcommand the parse arrives at, which is\n\
+ // how this shadow answers the same question the others do — was a subcommand\n\
+ // reached — without an action that does any work.\n\
+ func build(hit *bool) *cli.Command {{\n\
+ {helpers}{body}\treturn {root}\n\
+ }}\n"
+ );
+
+ let _ = writeln!(
+ out,
+ "// Resolve builds urfave's model of the CLI and runs argv against it, reporting\n\
+ // whether a subcommand was reached.\n\
+ //\n\
+ // argv arrives without the program name, the way the other shadows take it, and\n\
+ // `Run` wants it with one — hence the copy, which is a few dozen nanoseconds\n\
+ // against a parse three orders of magnitude larger.\n\
+ func Resolve(argv []string) bool {{\n\
+ \thit := false\n\
+ \troot := build(&hit)\n\
+ \targs := make([]string, 0, len(argv)+1)\n\
+ \targs = append(args, {})\n\
+ \targs = append(args, argv...)\n\
+ \tif err := root.Run(context.Background(), args); err != nil {{\n\
+ \t\treturn false\n\
+ \t}}\n\
+ \treturn hit\n\
+ }}",
+ go_string(bin),
+ );
+ out
+}
+
+/// One command and everything under it. Children are declared first, so the parent can
+/// name them in its `Commands` list; the returned name is this command's variable.
+fn emit_command(
+ out: &mut String,
+ cmd: &SpecCommand,
+ name: &str,
+ is_root: bool,
+ next: &mut usize,
+ skipped: &mut Skipped,
+) -> String {
+ let children: Vec = subcommands(cmd)
+ .map(|(child_name, sub)| emit_command(out, sub, child_name, false, next, skipped))
+ .collect();
+
+ let var = if is_root {
+ "root".to_string()
+ } else {
+ *next += 1;
+ format!("cmd{next}")
+ };
+
+ let mut fields = vec![format!("Name: {}", go_string(name))];
+ if let Some(help) = cmd.help.as_deref().or(cmd.help_long.as_deref()) {
+ fields.push(format!("Usage: {}", go_string(help)));
+ }
+ if let Some(long) = &cmd.help_long {
+ fields.push(format!("Description: {}", go_string(long)));
+ }
+ // Both lists: urfave has one `Aliases`, and hiding an alias is not something it can say.
+ let aliases: Vec = cmd
+ .aliases
+ .iter()
+ .chain(cmd.hidden_aliases.iter())
+ .cloned()
+ .collect();
+ if !aliases.is_empty() {
+ fields.push(format!("Aliases: {}", string_slice(&aliases)));
+ }
+ if !cmd.hidden_aliases.is_empty() {
+ skipped.note("hidden aliases (urfave hides a command, not an alias)");
+ }
+ if cmd.hide {
+ fields.push("Hidden: true".to_string());
+ }
+ if is_root {
+ // A parse that fails must not print a help page down the harness's stdout, and a
+ // program that printed one would be measured writing it.
+ fields.push("Writer: io.Discard".to_string());
+ fields.push("ErrWriter: io.Discard".to_string());
+ }
+ fields.push(format!(
+ "Action: {}",
+ if is_root { "noop" } else { "reached" }
+ ));
+
+ let flags: Vec = cmd
+ .flags
+ .iter()
+ .filter_map(|flag| emit_flag(flag, skipped))
+ .collect();
+ if !flags.is_empty() {
+ fields.push(format!("Flags: []cli.Flag{{{}}}", flags.join(", ")));
+ }
+
+ let args: Vec = cmd.args.iter().map(|arg| emit_arg(arg, skipped)).collect();
+ if !args.is_empty() {
+ fields.push(format!("Arguments: []cli.Argument{{{}}}", args.join(", ")));
+ }
+
+ if !children.is_empty() {
+ fields.push(format!(
+ "Commands: []*cli.Command{{{}}}",
+ children.join(", ")
+ ));
+ }
+
+ for _ in &cmd.mounts {
+ skipped.note("mounts (another spec grafted in at run time)");
+ }
+
+ let _ = writeln!(out, "\t{var} := &cli.Command{{{}}}", fields.join(", "));
+ var
+}
+
+/// One flag, as a `cli.Flag` literal.
+fn emit_flag(flag: &SpecFlag, skipped: &mut Skipped) -> Option {
+ let Some(long) = flag.long.first() else {
+ // urfave takes a name and a list of aliases, all of them spelled without dashes,
+ // and decides `-x` from the length. A one-character name is a short flag with no
+ // long form — which is expressible — but its `Name` is then what help prints and
+ // what `cmd.Bool` looks up, so a spec that has only `-x` becomes a different flag.
+ skipped.note("short-only flags");
+ return None;
+ };
+
+ let mut fields = vec![format!("Name: {}", go_string(long))];
+ // urfave has no separate vocabulary for a short form: an alias of one character is
+ // matched as `-x`, and the second long form is matched as `--long`. Both go in the
+ // same list, which is why nothing is dropped here.
+ let aliases: Vec = flag
+ .short
+ .iter()
+ .map(|c| c.to_string())
+ .chain(flag.long.iter().skip(1).cloned())
+ .collect();
+ if !aliases.is_empty() {
+ fields.push(format!("Aliases: {}", string_slice(&aliases)));
+ }
+ if let Some(help) = flag.help.as_deref().or(flag.help_first_line.as_deref()) {
+ fields.push(format!("Usage: {}", go_string(help)));
+ }
+ if flag.hide {
+ fields.push("Hidden: true".to_string());
+ }
+ if flag.required {
+ fields.push("Required: true".to_string());
+ }
+ // A global is in scope for everything below, which urfave spells by *not* marking the
+ // flag local. The default is the inherited one, so it is the local flags that say so.
+ if !flag.global {
+ fields.push("Local: true".to_string());
+ }
+ if let Some(env) = flag.env.as_deref() {
+ fields.push(format!("Sources: cli.EnvVars({})", go_string(env)));
+ }
+
+ let kind = match (&flag.arg, flag.count, flag.var) {
+ // A counter is a bool flag with somewhere to keep the tally. The destination is
+ // per build, as every other part of urfave's model is.
+ (None, true, _) => {
+ fields.push("Config: cli.BoolConfig{Count: new(int)}".to_string());
+ "BoolFlag"
+ }
+ (None, false, _) => "BoolFlag",
+ (Some(_), _, true) => "StringSliceFlag",
+ (Some(_), _, false) => {
+ if let Some(default) = flag.default.first() {
+ fields.push(format!("Value: {}", go_string(default)));
+ }
+ "StringFlag"
+ }
+ };
+
+ if flag.negate.is_some() {
+ skipped.note("negations (`--no-x` is a flag of its own in urfave)");
+ }
+
+ Some(format!("&cli.{kind}{{{}}}", fields.join(", ")))
+}
+
+/// One positional, as a `cli.Argument` literal.
+fn emit_arg(arg: &SpecArg, skipped: &mut Skipped) -> String {
+ let name = go_string(&arg.name);
+ if arg.var {
+ let min = if arg.required { 1 } else { 0 };
+ format!("&cli.StringArgs{{Name: {name}, Min: {min}, Max: -1}}")
+ } else {
+ if !arg.required {
+ // `StringArg` parses one value if there is one and does not mind if there is
+ // not, which is what an optional positional means. What it cannot say is that
+ // a *required* one is missing — see below — so only that direction is dropped.
+ skipped.note("optional positionals (urfave parses one either way)");
+ } else {
+ skipped.note("required positionals (urfave has no arity check for one value)");
+ }
+ format!("&cli.StringArg{{Name: {name}}}")
+ }
+}
diff --git a/xtask/src/main.rs b/xtask/src/main.rs
index e00e6f90b..3559bb0dd 100644
--- a/xtask/src/main.rs
+++ b/xtask/src/main.rs
@@ -15,7 +15,7 @@ use std::path::Path;
use usage::{Spec, SpecArg, SpecChoices, SpecCommand, SpecFlag, SpecGroup};
-mod cobra;
+mod go;
mod help_pages;
mod shadow;
@@ -37,11 +37,13 @@ fn main() {
"clap" => shadow::generate(Path::new(spec), Path::new(out), shadow::Dialect::Clap),
"argh" => shadow::generate(Path::new(spec), Path::new(out), shadow::Dialect::Argh),
"bpaf" => shadow::generate(Path::new(spec), Path::new(out), shadow::Dialect::Bpaf),
- // Go rather than Rust, so it has an emitter of its own.
- "cobra" => cobra::generate(Path::new(spec), Path::new(out)),
+ // Go rather than Rust, so these have emitters of their own.
+ "cobra" => go::generate(Path::new(spec), Path::new(out), go::Dialect::Cobra),
+ "urfave" => go::generate(Path::new(spec), Path::new(out), go::Dialect::Urfave),
+ "kong" => go::generate(Path::new(spec), Path::new(out), go::Dialect::Kong),
other => fail(&format!(
- "unknown dialect `{other}`; the dialects are \
- `usage`, `clap`, `argh`, `bpaf` and `cobra`"
+ "unknown dialect `{other}`; the dialects are `usage`, `clap`, \
+ `argh`, `bpaf`, `cobra`, `urfave` and `kong`"
)),
},
_ => {
@@ -56,7 +58,7 @@ fn main() {
},
other => fail(&format!(
"unknown task `{other}`; the tasks are: \
- gen-shadow [usage|clap|argh|bpaf|cobra], \
+ gen-shadow [usage|clap|argh|bpaf|cobra|urfave|kong], \
help-pages "
)),
}
From c0ef575554c02281de121e4d994a108a9681d6a9 Mon Sep 17 00:00:00 2001
From: default <216188+jdx@users.noreply.github.com>
Date: Sun, 23 Aug 2026 22:26:52 +0000
Subject: [PATCH 2/2] fix(go): check every harness reaches a subcommand, label
the binder numbers
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Review found the honesty check had a hole and the prose had four loose ends.
`bind-n` was built, measured and reported without being asked whether it reached a
subcommand — the check `parse-n` gets, and the exact failure this protocol exists to
catch, since a rejected command line is cheap to parse. The check is a function now
and every harness passes through it: fatal for the two usage-go rows, a cell saying
why for a framework whose shadow stopped resolving.
The sweep reads `sink` after each row rather than only writing it, which turns a
variable that existed to defeat dead-code elimination into the same check applied to
the millions of parses between the guard and the report.
Prose: the kong-to-cobra ratio said 24x without saying by what measure — it is 27x on
the clock and 24x by instruction count. Field types said `string`, `bool` and
`[]string` where a `count` flag has always generated an `int`, which docs/go said
correctly and this did not. Both binary columns now say what was built and with which
flags. And the three binder numbers in the file — 57 ns, 73 ns, 110 ns — are three
harnesses on two machines, so each is labelled and the sweep's 73 ns is named as the
one every ratio uses.
Co-Authored-By: Claude Opus 5
---
benches/go/cmd/sweep/main.go | 11 +++++++++-
go/README.md | 42 ++++++++++++++++++++++++++++--------
tasks/perf-go.sh | 28 ++++++++++++++++++------
3 files changed, 64 insertions(+), 17 deletions(-)
diff --git a/benches/go/cmd/sweep/main.go b/benches/go/cmd/sweep/main.go
index 5b419f1c8..46ee44836 100644
--- a/benches/go/cmd/sweep/main.go
+++ b/benches/go/cmd/sweep/main.go
@@ -49,7 +49,9 @@ var words = []string{"use", "-g", "node@20"}
const rounds = 4000
// sink keeps a parse from being optimized away. Go has no `black_box`, and a compiler
-// that can see the result is unused is within its rights to skip producing it.
+// that can see the result is unused is within its rights to skip producing it. A store to
+// a package-level variable is a side effect it has to perform, and `main` reads the last
+// one before exiting, so the parse is observed as well as performed.
var sink bool
type stats struct {
@@ -159,6 +161,13 @@ func main() {
}
for _, r := range rows {
s := sweep(r.rounds, r.iters, r.f)
+ // The last parse this row made, read after it was timed: the guard above proves each
+ // parser can reach a subcommand once, and this proves the millions in between were
+ // the same parse rather than a cheap failure the timing loop never looked at.
+ if !sink {
+ fmt.Fprintf(os.Stderr, "sweep: %s stopped reaching a subcommand mid-round\n", r.label)
+ os.Exit(1)
+ }
if *tsv {
fmt.Printf("%s\t%.0f\t%.0f\t%.0f\t%.0f\n", r.label, s.min, s.p01, s.p10, s.median)
continue
diff --git a/go/README.md b/go/README.md
index 2e80ff756..6c9acaf0c 100644
--- a/go/README.md
+++ b/go/README.md
@@ -99,6 +99,12 @@ serializes every thread onto one core, and a Go runtime with more than one to sc
spends the wait spinning, so unpinned counts pick up instructions proportional to wall
time — twenty cobra resolves read 56M on one run and 5,002M on the next.
+The binary column is each row's harness — `go/internal/bench/parse-n` and `bind-n` for
+the two usage-go rows, `benches/go/cmd/parse-n-cobra` and its siblings for the other
+three — built with a plain `go build`, no `-ldflags` and nothing stripped. A harness is a
+`main` that parses N times and prints whether it arrived, so what the column compares is
+what each framework drags in, plus a few lines.
+
The wall column is the fastest of 200 whole processes, and the floor is reported beside
it rather than subtracted from it. The floor and the row under it are one binary asked
for nought parses and for one, and they differ by less than a process launch varies: a
@@ -112,8 +118,9 @@ and no parser wins that back.
Three things are worth reading off these two tables honestly. The win over cobra is
real and it is a factor of eighteen, but on the clock a user feels it is 0.46 ms of a
1.6 ms process. The framework that gives Go the ergonomics people actually want —
-kong's struct tags — costs 24x cobra to do it, because reflection is the only way to
-get them without a build step; generated tables are how to have both. And usage-go's
+kong's struct tags — costs 27x cobra to do it on the clock, and 24x by instruction
+count, because reflection is the only way to get them without a build step; generated
+tables are how to have both. And usage-go's
typed front door costs about eighty times its own binder on the clock, and sixty-three
times by instruction count, most of it in two maps the generated `Parse` allocates per
call: the binder is as fast as this repository claims, and the layer above it has not
@@ -131,7 +138,8 @@ initialized data and zero instructions.
**A parse allocates nothing.** The parser holds its state, its ancestor chain and
its error inline; a bound value is a slice of the argv string rather than a copy.
`TestParseAllocatesNothing` measures this with `testing.AllocsPerRun`, on the
-failure paths as well as the success ones. A mise-sized binding runs in 57 ns.
+failure paths as well as the success ones. `argv`'s own `BenchmarkParse` binds a
+four-flag fixture in 57 ns.
**Binding stays separate from judging.** The parser answers one question — which
token becomes which flag or argument — and reports each occurrence as an event.
@@ -195,9 +203,9 @@ if cli.Run != nil {
required flag or a value outside its choices comes back rather than reaching your
code, and `env` and `default` values reach the fields.
-Fields are `string`, `bool` and `[]string`, because that is what a spec knows: it
-says what a value is _called_ and never what type it is. Turning `"8"` into an
-`int` is what the conversions above are for.
+Fields are `string`, `bool`, `[]string`, and `int` for a `count` flag — which is what a
+spec knows, since it says what a value is _called_ and never what type it is. Turning
+`--jobs 8`'s `"8"` into an `int` is what the conversions above are for.
**Three tables, and you pay for the ones you use.** Go's linker drops an
unreferenced package-level table entirely, so the split is enforced by the linker
@@ -210,6 +218,12 @@ rather than by a feature flag:
| prints help | `+ HelpText` | 5.77 MB |
| takes the typed front door | `+ Meta`, `+ Parse` | 6.68 MB |
+Four `main` packages over `internal/shadow/mise`, each referencing one more table than
+the last and each built with a plain `go build` — the same toolchain and flags as the
+harnesses above, so the two tables' megabytes are comparable. They are throwaways rather
+than checked in: what is being measured is which table the linker keeps, and a reference
+is all it takes to make it keep one.
+
None of them has an init function. That is what Rust gets from putting the cold
half behind a feature flag, except nobody has to remember the flag — which is also
why help text is a third table rather than more fields on `Meta`: folding them
@@ -342,11 +356,21 @@ The same tables are generated a second time into
process has to live in the module that depends on the other three, and Go's `internal`
rule means that module cannot import this copy however the two are laid out.
+Three binder numbers appear in this file, from three harnesses, so the labels matter.
+**73 ns** is the canonical one: the sweep's minimum for `mise use -g node@20`, which
+every ratio above uses and `mise run perf:go` reprints. 110 ns is this package's
+`BenchmarkParse` on that same argv — `go test -bench` reports a mean over one long run
+where the sweep reports a minimum over short ones, and on the machine that took the
+73 ns that benchmark reads about 80 ns, so read the two as one measurement taken two
+ways on two machines rather than as a change. 57 ns is `argv`'s own `BenchmarkParse`,
+which binds a four-flag fixture rather than mise's spec.
+
## What is missing
-- **Typed fields.** `Parse` fills a struct, but with the three types a spec knows.
- The conversions in [typed values](#typed-values) exist and generated code does not
- call them, so `--jobs 8` reaches your program as `"8"`.
+- **Typed fields.** `Parse` fills a struct, but only with the types a spec knows —
+ `string`, `bool`, `[]string`, and `int` for a `count`. The conversions in
+ [typed values](#typed-values) exist and generated code does not call them, so
+ `--jobs 8` reaches your program as `"8"`.
- **A front door as fast as the binder.** `Parse` costs about eighty times the bind
it wraps, most of it in two maps it allocates per call to collect what arrived
before the post-binding rules judge it. Nothing about that is inherent — a spec's
diff --git a/tasks/perf-go.sh b/tasks/perf-go.sh
index 480aaae12..6490f6ebb 100755
--- a/tasks/perf-go.sh
+++ b/tasks/perf-go.sh
@@ -45,13 +45,23 @@ trap 'rm -rf "$work"' EXIT
bin=$work/parse-n
(cd "$root/go" && go build -o "$work/" ./internal/bench/parse-n ./internal/bench/bind-n)
-# Each harness prints 1 when the parse reached a subcommand. Anything else means the numbers
-# below would be describing a rejected command line, which is cheap for the wrong reason.
-# shellcheck disable=SC2086 # the argv is several words on purpose
-if [ "$(PARSE_N=1 "$bin" $ARGV)" != "1" ]; then
- echo "the harness did not reach a subcommand, so there is nothing worth measuring" >&2
- exit 1
-fi
+# Every harness prints 1 when the parse reached a subcommand, and none of them is measured
+# until it has: a rejected command line is cheap to parse, so a row taken without asking
+# would be reporting the cost of failing early — the exact thing this protocol exists to
+# catch. Asked per binary rather than once, because they are separate programs.
+reaches() {
+ # shellcheck disable=SC2086 # the argv is several words on purpose
+ [ "$(PARSE_N=1 "$1" $ARGV 2>/dev/null)" = "1" ]
+}
+
+# The two usage-go rows are this script's whole reason to exist, so a failure in either is
+# fatal rather than a cell that says why.
+for harness in parse-n bind-n; do
+ if ! reaches "$work/$harness"; then
+ echo "$harness did not reach a subcommand, so there is nothing worth measuring" >&2
+ exit 1
+ fi
+done
# The other three frameworks live in `benches/go`, the one module in the repository that
# depends on them — and its build is allowed to fail, since it needs those modules fetched
@@ -293,6 +303,10 @@ fi
printf '| %s | not measured — %s | | |\n' "$label" "$shadows_why"
continue
fi
+ if ! reaches "$path"; then
+ printf '| %s | not measured — the shadow did not reach a subcommand | | |\n' "$label"
+ continue
+ fi
instr="not measured"
if command -v valgrind >/dev/null 2>&1; then
many=$(instructions "$path" "$iters")