diff --git a/cmd/cue/cmd/add.go b/cmd/cue/cmd/add.go
index 559b911..a4b2b3e 100644
--- a/cmd/cue/cmd/add.go
+++ b/cmd/cue/cmd/add.go
@@ -34,7 +34,7 @@
 	"github.com/spf13/cobra"
 )
 
-func newAddCmd() *cobra.Command {
+func newAddCmd(c *Command) *cobra.Command {
 	cmd := &cobra.Command{
 		// TODO: this command is still experimental, don't show it in
 		// the documentation just yet.
@@ -44,7 +44,7 @@
 		Short: "bulk append to CUE files",
 		Long: `Append a common snippet of CUE to many files and commit atomically.
 `,
-		RunE: runAdd,
+		RunE: mkRunE(c, runAdd),
 	}
 
 	f := cmd.Flags()
@@ -56,13 +56,13 @@
 	return cmd
 }
 
-func runAdd(cmd *cobra.Command, args []string) (err error) {
+func runAdd(cmd *Command, args []string) (err error) {
 	return doAdd(cmd, stdin, args)
 }
 
 var stdin io.Reader = os.Stdin
 
-func doAdd(cmd *cobra.Command, stdin io.Reader, args []string) (err error) {
+func doAdd(cmd *Command, stdin io.Reader, args []string) (err error) {
 	// Offsets at which to restore original files, if any, if any of the
 	// appends fail.
 	// Ideally this is placed below where it is used, but we want to make
@@ -192,7 +192,7 @@
 	contents []byte
 }
 
-func restoreOriginals(cmd *cobra.Command, originals []originalFile) {
+func restoreOriginals(cmd *Command, originals []originalFile) {
 	for _, fo := range originals {
 		if err := fo.restore(); err != nil {
 			fmt.Fprintln(cmd.OutOrStderr(), "Error restoring file: ", err)
@@ -214,7 +214,7 @@
 	build    *build.Instance
 }
 
-func initFile(cmd *cobra.Command, file string, getBuild func(path string) *build.Instance) (todo *fileInfo, err error) {
+func initFile(cmd *Command, file string, getBuild func(path string) *build.Instance) (todo *fileInfo, err error) {
 	defer func() {
 		if err != nil {
 			err = fmt.Errorf("init file: %v", err)
diff --git a/cmd/cue/cmd/cmd.go b/cmd/cue/cmd/cmd.go
index ad466c5..9e5fb0c 100644
--- a/cmd/cue/cmd/cmd.go
+++ b/cmd/cue/cmd/cmd.go
@@ -23,7 +23,7 @@
 
 // TODO: generate long description from documentation.
 
-func newCmdCmd() *cobra.Command {
+func newCmdCmd(c *Command) *cobra.Command {
 	return &cobra.Command{
 		Use:   "cmd <name> [-x] [instances]",
 		Short: "run a user-defined shell command",
@@ -210,7 +210,7 @@
 	}
 
 `,
-		RunE: func(cmd *cobra.Command, args []string) error {
+		RunE: mkRunE(c, func(cmd *Command, args []string) error {
 			if len(args) == 0 {
 				fmt.Println("cmd must be run as one of its subcommands")
 			} else {
@@ -219,6 +219,6 @@
 			fmt.Println("Run 'cue help cmd' for known subcommands.")
 			os.Exit(1) // TODO: get rid of this
 			return nil
-		},
+		}),
 	}
 }
diff --git a/cmd/cue/cmd/cmd_test.go b/cmd/cue/cmd/cmd_test.go
index c24e638..d09c41f 100644
--- a/cmd/cue/cmd/cmd_test.go
+++ b/cmd/cue/cmd/cmd_test.go
@@ -38,13 +38,13 @@
 		stderr = os.Stderr
 	}()
 	for _, name := range testCases {
-		rootCmd := newRootCmd().root
+		c := newRootCmd()
 		run := func(cmd *cobra.Command, args []string) error {
 			stdout = cmd.OutOrStdout()
 			stderr = cmd.OutOrStderr()
 
-			tools, _ := buildTools(rootCmd, args)
-			cmd, err := addCustom(rootCmd, "command", name, tools)
+			tools, _ := buildTools(c, args)
+			cmd, err := addCustom(c, c.root, "command", name, tools)
 			if err != nil {
 				return err
 			}
diff --git a/cmd/cue/cmd/common.go b/cmd/cue/cmd/common.go
index 9908328..2bf9f37 100644
--- a/cmd/cue/cmd/common.go
+++ b/cmd/cue/cmd/common.go
@@ -40,7 +40,7 @@
 	}
 }
 
-func exitIfErr(cmd *cobra.Command, inst *cue.Instance, err error, fatal bool) {
+func exitIfErr(cmd *Command, inst *cue.Instance, err error, fatal bool) {
 	exitOnErr(cmd, err, fatal)
 }
 
@@ -53,7 +53,7 @@
 	return language.Make(loc)
 }
 
-func exitOnErr(cmd *cobra.Command, err error, fatal bool) {
+func exitOnErr(cmd *Command, err error, fatal bool) {
 	if err == nil {
 		return
 	}
@@ -80,7 +80,7 @@
 	}
 }
 
-func buildFromArgs(cmd *cobra.Command, args []string) []*cue.Instance {
+func buildFromArgs(cmd *Command, args []string) []*cue.Instance {
 	binst := loadFromArgs(cmd, args)
 	if binst == nil {
 		return nil
@@ -88,7 +88,7 @@
 	return buildInstances(cmd, binst)
 }
 
-func loadFromArgs(cmd *cobra.Command, args []string) []*build.Instance {
+func loadFromArgs(cmd *Command, args []string) []*build.Instance {
 	log.SetOutput(cmd.OutOrStderr())
 	binst := load.Instances(args, nil)
 	if len(binst) == 0 {
@@ -97,7 +97,7 @@
 	return binst
 }
 
-func buildInstances(cmd *cobra.Command, binst []*build.Instance) []*cue.Instance {
+func buildInstances(cmd *Command, binst []*build.Instance) []*cue.Instance {
 	instances := cue.Build(binst)
 	for _, inst := range instances {
 		// TODO: consider merging errors of multiple files, but ensure
@@ -118,7 +118,7 @@
 	return instances
 }
 
-func buildToolInstances(cmd *cobra.Command, binst []*build.Instance) ([]*cue.Instance, error) {
+func buildToolInstances(cmd *Command, binst []*build.Instance) ([]*cue.Instance, error) {
 	instances := cue.Build(binst)
 	for _, inst := range instances {
 		if inst.Err != nil {
@@ -135,7 +135,7 @@
 	return instances, nil
 }
 
-func buildTools(cmd *cobra.Command, args []string) (*cue.Instance, error) {
+func buildTools(cmd *Command, args []string) (*cue.Instance, error) {
 	binst := loadFromArgs(cmd, args)
 	if len(binst) == 0 {
 		return nil, nil
diff --git a/cmd/cue/cmd/common_test.go b/cmd/cue/cmd/common_test.go
index 9d8c73b..58333d9 100644
--- a/cmd/cue/cmd/common_test.go
+++ b/cmd/cue/cmd/common_test.go
@@ -121,5 +121,5 @@
 }
 
 func TestLoadError(t *testing.T) {
-	runCommand(t, newEvalCmd(), "loaderr", "non-existing", ".")
+	runCommand(t, newEvalCmd(newRootCmd()), "loaderr", "non-existing", ".")
 }
diff --git a/cmd/cue/cmd/custom.go b/cmd/cue/cmd/custom.go
index 63eb3d8..f04dc94 100644
--- a/cmd/cue/cmd/custom.go
+++ b/cmd/cue/cmd/custom.go
@@ -58,7 +58,7 @@
 	stderr io.Writer = os.Stderr
 )
 
-func addCustom(parent *cobra.Command, typ, name string, tools *cue.Instance) (*cobra.Command, error) {
+func addCustom(c *Command, parent *cobra.Command, typ, name string, tools *cue.Instance) (*cobra.Command, error) {
 	if tools == nil {
 		return nil, errors.New("no commands defined")
 	}
@@ -77,13 +77,13 @@
 		Use:   usage,
 		Short: lookupString(o, "short"),
 		Long:  lookupString(o, "long"),
-		RunE: func(cmd *cobra.Command, args []string) error {
+		RunE: mkRunE(c, func(cmd *Command, args []string) error {
 			// TODO:
 			// - parse flags and env vars
 			// - constrain current config with config section
 
 			return doTasks(cmd, typ, name, tools)
-		},
+		}),
 	}
 	parent.AddCommand(sub)
 
@@ -121,7 +121,7 @@
 	return root.Lookup(k.typ, k.name, taskSection)
 }
 
-func doTasks(cmd *cobra.Command, typ, command string, root *cue.Instance) error {
+func doTasks(cmd *Command, typ, command string, root *cue.Instance) error {
 	err := executeTasks(typ, command, root)
 	exitIfErr(cmd, root, err, true)
 	return err
diff --git a/cmd/cue/cmd/eval.go b/cmd/cue/cmd/eval.go
index a8e667d..bd70b73 100644
--- a/cmd/cue/cmd/eval.go
+++ b/cmd/cue/cmd/eval.go
@@ -25,7 +25,7 @@
 )
 
 // newEvalCmd creates a new eval command
-func newEvalCmd() *cobra.Command {
+func newEvalCmd(c *Command) *cobra.Command {
 	cmd := &cobra.Command{
 		Use:   "eval",
 		Short: "evaluate and print a configuration",
@@ -46,7 +46,7 @@
   "a"
   "c"
 `,
-		RunE: runEval,
+		RunE: mkRunE(c, runEval),
 	}
 
 	cmd.Flags().StringArrayP(string(flagExpression), "e", nil, "evaluate this expression only")
@@ -77,7 +77,7 @@
 	flagAttributes flagName = "attributes"
 )
 
-func runEval(cmd *cobra.Command, args []string) error {
+func runEval(cmd *Command, args []string) error {
 	instances := buildFromArgs(cmd, args)
 
 	var exprs []ast.Expr
diff --git a/cmd/cue/cmd/eval_test.go b/cmd/cue/cmd/eval_test.go
index 1d7d20a..56c4c5a 100644
--- a/cmd/cue/cmd/eval_test.go
+++ b/cmd/cue/cmd/eval_test.go
@@ -17,13 +17,13 @@
 import "testing"
 
 func TestEval(t *testing.T) {
-	runCommand(t, newEvalCmd(), "eval")
+	runCommand(t, newEvalCmd(newRootCmd()), "eval")
 
-	cmd := newEvalCmd()
+	cmd := newEvalCmd(newRootCmd())
 	mustParseFlags(t, cmd, "-c", "-a")
 	runCommand(t, cmd, "eval_conc")
 
-	cmd = newEvalCmd()
+	cmd = newEvalCmd(newRootCmd())
 	mustParseFlags(t, cmd, "-c", "-e", "b.a.b", "-e", "b.idx")
 	runCommand(t, cmd, "eval_expr")
 }
diff --git a/cmd/cue/cmd/export.go b/cmd/cue/cmd/export.go
index beee972..783c983 100644
--- a/cmd/cue/cmd/export.go
+++ b/cmd/cue/cmd/export.go
@@ -24,7 +24,7 @@
 )
 
 // newExportCmd creates and export command
-func newExportCmd() *cobra.Command {
+func newExportCmd(c *Command) *cobra.Command {
 	cmd := &cobra.Command{
 		Use:   "export",
 		Short: "output data in a standard format",
@@ -86,7 +86,7 @@
         The evaluated value must be of type string.
 `,
 
-		RunE: runExport,
+		RunE: mkRunE(c, runExport),
 	}
 	flagMedia.Add(cmd)
 	cmd.Flags().Bool(string(flagEscape), false, "use HTML escaping")
@@ -94,7 +94,7 @@
 	return cmd
 }
 
-func runExport(cmd *cobra.Command, args []string) error {
+func runExport(cmd *Command, args []string) error {
 	instances := buildFromArgs(cmd, args)
 	w := cmd.OutOrStdout()
 
@@ -117,7 +117,7 @@
 	return nil
 }
 
-func outputJSON(cmd *cobra.Command, w io.Writer, v cue.Value) error {
+func outputJSON(cmd *Command, w io.Writer, v cue.Value) error {
 	e := json.NewEncoder(w)
 	e.SetIndent("", "    ")
 	e.SetEscapeHTML(flagEscape.Bool(cmd))
diff --git a/cmd/cue/cmd/export_test.go b/cmd/cue/cmd/export_test.go
index 9067630..9b9aac5 100644
--- a/cmd/cue/cmd/export_test.go
+++ b/cmd/cue/cmd/export_test.go
@@ -17,6 +17,6 @@
 import "testing"
 
 func TestExport(t *testing.T) {
-	runCommand(t, newExportCmd(), "export")
-	runCommand(t, newExportCmd(), "export_err")
+	runCommand(t, newExportCmd(newRootCmd()), "export")
+	runCommand(t, newExportCmd(newRootCmd()), "export_err")
 }
diff --git a/cmd/cue/cmd/flags.go b/cmd/cue/cmd/flags.go
index 815ec79..f202eab 100644
--- a/cmd/cue/cmd/flags.go
+++ b/cmd/cue/cmd/flags.go
@@ -69,17 +69,17 @@
 
 type flagName string
 
-func (f flagName) Bool(cmd *cobra.Command) bool {
+func (f flagName) Bool(cmd *Command) bool {
 	v, _ := cmd.Flags().GetBool(string(f))
 	return v
 }
 
-func (f flagName) String(cmd *cobra.Command) string {
+func (f flagName) String(cmd *Command) string {
 	v, _ := cmd.Flags().GetString(string(f))
 	return v
 }
 
-func (f flagName) StringArray(cmd *cobra.Command) []string {
+func (f flagName) StringArray(cmd *Command) []string {
 	v, _ := cmd.Flags().GetStringArray(string(f))
 	return v
 }
@@ -95,7 +95,7 @@
 	cmd.Flags().StringP(f.name, f.short, f.def, f.text)
 }
 
-func (f *stringFlag) String(cmd *cobra.Command) string {
+func (f *stringFlag) String(cmd *Command) string {
 	v, err := cmd.Flags().GetString(f.name)
 	if err != nil {
 		return f.def
diff --git a/cmd/cue/cmd/fmt.go b/cmd/cue/cmd/fmt.go
index b2f1b75..93298a2 100644
--- a/cmd/cue/cmd/fmt.go
+++ b/cmd/cue/cmd/fmt.go
@@ -23,13 +23,13 @@
 	"github.com/spf13/cobra"
 )
 
-func newFmtCmd() *cobra.Command {
+func newFmtCmd(c *Command) *cobra.Command {
 	cmd := &cobra.Command{
 		Use:   "fmt [-s] [packages]",
 		Short: "formats CUE configuration files",
 		Long: `Fmt formats the given files or the files for the given packages in place
 `,
-		RunE: func(cmd *cobra.Command, args []string) error {
+		RunE: mkRunE(c, func(cmd *Command, args []string) error {
 			for _, inst := range load.Instances(args, nil) {
 				all := []string{}
 				all = append(all, inst.CUEFiles...)
@@ -65,7 +65,7 @@
 				}
 			}
 			return nil
-		},
+		}),
 	}
 	return cmd
 }
diff --git a/cmd/cue/cmd/get.go b/cmd/cue/cmd/get.go
index 6cf6049..499e62c 100644
--- a/cmd/cue/cmd/get.go
+++ b/cmd/cue/cmd/get.go
@@ -21,7 +21,7 @@
 	"github.com/spf13/cobra"
 )
 
-func newGetCmd() *cobra.Command {
+func newGetCmd(c *Command) *cobra.Command {
 	cmd := &cobra.Command{
 		Use:   "get <language> [packages]",
 		Short: "add dependencies to the current module",
@@ -35,7 +35,7 @@
 The specifics on how dependencies are fechted and converted vary
 per language and are documented in the respective subcommands.
 `,
-		RunE: func(cmd *cobra.Command, args []string) error {
+		RunE: mkRunE(c, func(cmd *Command, args []string) error {
 			if len(args) == 0 {
 				fmt.Println("get must be run as one of its subcommands")
 			} else {
@@ -44,8 +44,8 @@
 			fmt.Println("Run 'cue help get' for known subcommands.")
 			os.Exit(1) // TODO: get rid of this
 			return nil
-		},
+		}),
 	}
-	cmd.AddCommand(newGoCmd())
+	cmd.AddCommand(newGoCmd(c))
 	return cmd
 }
diff --git a/cmd/cue/cmd/get_go.go b/cmd/cue/cmd/get_go.go
index f9f5821..411cf71 100644
--- a/cmd/cue/cmd/get_go.go
+++ b/cmd/cue/cmd/get_go.go
@@ -50,7 +50,7 @@
 //   package foo
 //   Type: enumType
 
-func newGoCmd() *cobra.Command {
+func newGoCmd(c *Command) *cobra.Command {
 	cmd := &cobra.Command{
 		Use:   "go [packages]",
 		Short: "add Go dependencies to the current module",
@@ -201,9 +201,7 @@
 `,
 		// - TODO: interpret cuego's struct tags and annotations.
 
-		RunE: func(cmd *cobra.Command, args []string) error {
-			return extract(cmd, args)
-		},
+		RunE: mkRunE(c, extract),
 	}
 
 	cmd.Flags().StringP(string(flagExclude), "e", "",
@@ -240,7 +238,7 @@
 }
 
 type extractor struct {
-	cmd *cobra.Command
+	cmd *Command
 
 	stderr io.Writer
 	pkgs   []*packages.Package
@@ -313,7 +311,7 @@
 // TODO:
 // - consider not including types with any dropped fields.
 
-func extract(cmd *cobra.Command, args []string) error {
+func extract(cmd *Command, args []string) error {
 	// determine module root:
 	binst := loadFromArgs(cmd, []string{"."})[0]
 
diff --git a/cmd/cue/cmd/get_go_test.go b/cmd/cue/cmd/get_go_test.go
index 577ab8a..509be39 100644
--- a/cmd/cue/cmd/get_go_test.go
+++ b/cmd/cue/cmd/get_go_test.go
@@ -38,7 +38,7 @@
 	cueTestRoot = tmp
 
 	// We don't use runCommand here, as we are interested in generated packages.
-	cmd := newGoCmd()
+	cmd := newGoCmd(newRootCmd())
 	cmd.SetArgs([]string{"./testdata/code/go/..."})
 	err = cmd.Execute()
 	if err != nil {
diff --git a/cmd/cue/cmd/import.go b/cmd/cue/cmd/import.go
index 52df22e..612f64d 100644
--- a/cmd/cue/cmd/import.go
+++ b/cmd/cue/cmd/import.go
@@ -42,7 +42,7 @@
 	"golang.org/x/sync/errgroup"
 )
 
-func newImportCmd() *cobra.Command {
+func newImportCmd(c *Command) *cobra.Command {
 	cmd := &cobra.Command{
 		Use:   "import",
 		Short: "convert other data formats to CUE files",
@@ -193,7 +193,7 @@
       }
   }
 `,
-		RunE: runImport,
+		RunE: mkRunE(c, runImport),
 	}
 
 	flagOut.Add(cmd)
@@ -220,7 +220,7 @@
 )
 
 type importStreamFunc func(path string, r io.Reader) ([]ast.Expr, error)
-type importFileFunc func(cmd *cobra.Command, path string, r io.Reader) (*ast.File, error)
+type importFileFunc func(cmd *Command, path string, r io.Reader) (*ast.File, error)
 
 type encodingInfo struct {
 	fnStream importStreamFunc
@@ -250,7 +250,7 @@
 	return nil
 }
 
-func runImport(cmd *cobra.Command, args []string) error {
+func runImport(cmd *Command, args []string) error {
 	log.SetOutput(cmd.OutOrStderr())
 
 	var group errgroup.Group
@@ -307,7 +307,7 @@
 	return nil
 }
 
-func handleFile(cmd *cobra.Command, pkg, filename string) (err error) {
+func handleFile(cmd *Command, pkg, filename string) (err error) {
 	re, err := regexp.Compile(flagGlob.String(cmd))
 	if err != nil {
 		return err
@@ -348,7 +348,7 @@
 	}
 }
 
-func processFile(cmd *cobra.Command, file *ast.File) (err error) {
+func processFile(cmd *Command, file *ast.File) (err error) {
 	name := file.Filename + ".cue"
 
 	b, err := format.Node(file)
@@ -359,7 +359,7 @@
 	return ioutil.WriteFile(name, b, 0644)
 }
 
-func processStream(cmd *cobra.Command, pkg, filename string, objs []ast.Expr) error {
+func processStream(cmd *Command, pkg, filename string, objs []ast.Expr) error {
 	if flagFiles.Bool(cmd) {
 		for i, f := range objs {
 			err := combineExpressions(cmd, pkg, newName(filename, i), f)
@@ -379,7 +379,7 @@
 // TODO: implement a more fine-grained approach.
 var mutex sync.Mutex
 
-func combineExpressions(cmd *cobra.Command, pkg, cueFile string, objs ...ast.Expr) error {
+func combineExpressions(cmd *Command, pkg, cueFile string, objs ...ast.Expr) error {
 	mutex.Lock()
 	defer mutex.Unlock()
 
@@ -640,7 +640,7 @@
 	return objects, nil
 }
 
-func handleProtoDef(cmd *cobra.Command, path string, r io.Reader) (f *ast.File, err error) {
+func handleProtoDef(cmd *Command, path string, r io.Reader) (f *ast.File, err error) {
 	return protobuf.Extract(path, r, &protobuf.Config{Paths: flagProtoPath.StringArray(cmd)})
 }
 
diff --git a/cmd/cue/cmd/import_test.go b/cmd/cue/cmd/import_test.go
index 9d8d3cd..c892fbd 100644
--- a/cmd/cue/cmd/import_test.go
+++ b/cmd/cue/cmd/import_test.go
@@ -19,22 +19,22 @@
 )
 
 func TestImport(t *testing.T) {
-	cmd := newImportCmd()
+	cmd := newImportCmd(newRootCmd())
 	mustParseFlags(t, cmd,
 		"-o", "-", "-f", "--files")
 	runCommand(t, cmd, "import_files")
 
-	cmd = newImportCmd()
+	cmd = newImportCmd(newRootCmd())
 	mustParseFlags(t, cmd,
 		"-o", "-", "-f", "-l", `"\(strings.ToLower(kind))" "\(name)"`)
 	runCommand(t, cmd, "import_path")
 
-	cmd = newImportCmd()
+	cmd = newImportCmd(newRootCmd())
 	mustParseFlags(t, cmd,
 		"-o", "-", "-f", "-l", `"\(strings.ToLower(kind))"`, "--list")
 	runCommand(t, cmd, "import_list")
 
-	cmd = newImportCmd()
+	cmd = newImportCmd(newRootCmd())
 	mustParseFlags(t, cmd,
 		"-o", "-", "-f", "--list",
 		"-l", `"\(strings.ToLower(kind))" "\(name)"`, "--recursive")
diff --git a/cmd/cue/cmd/root.go b/cmd/cue/cmd/root.go
index e34a40a..433ffe4 100644
--- a/cmd/cue/cmd/root.go
+++ b/cmd/cue/cmd/root.go
@@ -41,6 +41,15 @@
 
 var log = logger.New(os.Stderr, "", logger.Lshortfile)
 
+type runFunction func(cmd *Command, args []string) error
+
+func mkRunE(c *Command, f runFunction) func(*cobra.Command, []string) error {
+	return func(cmd *cobra.Command, args []string) error {
+		c.Command = cmd
+		return f(c, args)
+	}
+}
+
 // newRootCmd creates the base command when called without any subcommands
 func newRootCmd() *Command {
 	cmd := &cobra.Command{
@@ -69,19 +78,22 @@
 		SilenceUsage: true,
 	}
 
-	cmdCmd := newCmdCmd()
+	c := &Command{Command: cmd, root: cmd}
+
+	cmdCmd := newCmdCmd(c)
+	c.cmd = cmdCmd
 
 	subCommands := []*cobra.Command{
-		newTrimCmd(),
-		newImportCmd(),
-		newEvalCmd(),
-		newGetCmd(),
-		newFmtCmd(),
-		newExportCmd(),
+		newTrimCmd(c),
+		newImportCmd(c),
+		newEvalCmd(c),
+		newGetCmd(c),
+		newFmtCmd(c),
+		newExportCmd(c),
 		cmdCmd,
-		newVersionCmd(),
-		newVetCmd(),
-		newAddCmd(),
+		newVersionCmd(c),
+		newVetCmd(c),
+		newAddCmd(c),
 	}
 
 	addGlobalFlags(cmd.PersistentFlags())
@@ -90,7 +102,7 @@
 		cmd.AddCommand(sub)
 	}
 
-	return &Command{root: cmd, cmd: cmdCmd}
+	return c
 }
 
 // Main runs the cue tool. It loads the tool flags.
@@ -106,6 +118,9 @@
 }
 
 type Command struct {
+	// The currently active command.
+	*cobra.Command
+
 	root *cobra.Command
 
 	// Subcommands
@@ -178,11 +193,11 @@
 		return cmd, nil // Forces unknown command message from Cobra.
 	}
 
-	tools, err := buildTools(rootCmd, args[1:])
+	tools, err := buildTools(cmd, args[1:])
 	if err != nil {
 		return cmd, err
 	}
-	_, err = addCustom(rootCmd, commandSection, args[0], tools)
+	_, err = addCustom(cmd, rootCmd, commandSection, args[0], tools)
 	if err != nil {
 		fmt.Printf("command %s %q is not defined\n", commandSection, args[0])
 		fmt.Println("Run 'cue help' to show available commands.")
@@ -212,7 +227,7 @@
 		args = args[1:]
 	}
 
-	tools, err := buildTools(cmd.root, args)
+	tools, err := buildTools(cmd, args)
 	if err != nil {
 		return err
 	}
@@ -230,7 +245,7 @@
 			return errors.Newf(token.NoPos, "could not create command definitions: %v", err)
 		}
 		for i.Next() {
-			_, _ = addCustom(spec.cmd, spec.name, i.Label(), tools)
+			_, _ = addCustom(cmd, spec.cmd, spec.name, i.Label(), tools)
 		}
 	}
 	return nil
diff --git a/cmd/cue/cmd/trim.go b/cmd/cue/cmd/trim.go
index 1ca999f..0e13c26 100644
--- a/cmd/cue/cmd/trim.go
+++ b/cmd/cue/cmd/trim.go
@@ -35,7 +35,7 @@
 // - implement verification post-processing as extra safety
 
 // newTrimCmd creates a trim command
-func newTrimCmd() *cobra.Command {
+func newTrimCmd(c *Command) *cobra.Command {
 	cmd := &cobra.Command{
 		Use:   "trim",
 		Short: "remove superfluous fields",
@@ -84,14 +84,14 @@
 It is guaranteed that the resulting files give the same output as before the
 removal.
 `,
-		RunE: runTrim,
+		RunE: mkRunE(c, runTrim),
 	}
 
 	flagOut.Add(cmd)
 	return cmd
 }
 
-func runTrim(cmd *cobra.Command, args []string) error {
+func runTrim(cmd *Command, args []string) error {
 	// TODO: Do something more fine-grained. Optional fields are mostly not
 	// useful to consider as an optional field will almost never subsume
 	// another value. However, an optional field may subsume and therefore
@@ -167,14 +167,14 @@
 }
 
 type trimSet struct {
-	cmd       *cobra.Command
+	cmd       *Command
 	stack     []string
 	exclude   map[ast.Node]bool // don't remove fields marked here
 	alwaysGen map[ast.Node]bool // node is always from a generated source
 	fromComp  map[ast.Node]bool // node originated from a comprehension
 }
 
-func newTrimSet(cmd *cobra.Command) *trimSet {
+func newTrimSet(cmd *Command) *trimSet {
 	return &trimSet{
 		cmd:       cmd,
 		exclude:   map[ast.Node]bool{},
diff --git a/cmd/cue/cmd/trim_test.go b/cmd/cue/cmd/trim_test.go
index bc8001f..6326f31 100644
--- a/cmd/cue/cmd/trim_test.go
+++ b/cmd/cue/cmd/trim_test.go
@@ -19,7 +19,7 @@
 )
 
 func TestTrim(t *testing.T) {
-	cmd := newTrimCmd()
+	cmd := newTrimCmd(newRootCmd())
 	mustParseFlags(t, cmd, "-o", "-")
 	runCommand(t, cmd, "trim")
 }
diff --git a/cmd/cue/cmd/version.go b/cmd/cue/cmd/version.go
index d605469..be58c82 100644
--- a/cmd/cue/cmd/version.go
+++ b/cmd/cue/cmd/version.go
@@ -21,12 +21,12 @@
 	"github.com/spf13/cobra"
 )
 
-func newVersionCmd() *cobra.Command {
+func newVersionCmd(c *Command) *cobra.Command {
 	cmd := &cobra.Command{
 		Use:   "version",
 		Short: "print CUE version",
 		Long:  ``,
-		RunE:  runVersion,
+		RunE:  mkRunE(c, runVersion),
 	}
 	return cmd
 }
@@ -37,7 +37,7 @@
 	version = "custom"
 )
 
-func runVersion(cmd *cobra.Command, args []string) error {
+func runVersion(cmd *Command, args []string) error {
 	w := cmd.OutOrStdout()
 	fmt.Fprintf(w, "cue version %v %s/%s\n",
 		version,
diff --git a/cmd/cue/cmd/vet.go b/cmd/cue/cmd/vet.go
index 5c9818c..6e5e49a 100644
--- a/cmd/cue/cmd/vet.go
+++ b/cmd/cue/cmd/vet.go
@@ -67,12 +67,12 @@
 If more than one expression is given, all must match all values.
 `
 
-func newVetCmd() *cobra.Command {
+func newVetCmd(c *Command) *cobra.Command {
 	cmd := &cobra.Command{
 		Use:   "vet",
 		Short: "validate data",
 		Long:  vetDoc,
-		RunE:  doVet,
+		RunE:  mkRunE(c, doVet),
 	}
 
 	cmd.Flags().BoolP(string(flagConcrete), "c", false,
@@ -84,7 +84,7 @@
 	return cmd
 }
 
-func doVet(cmd *cobra.Command, args []string) error {
+func doVet(cmd *Command, args []string) error {
 	builds := loadFromArgs(cmd, args)
 	if builds == nil {
 		return nil
@@ -135,7 +135,7 @@
 	return nil
 }
 
-func vetFiles(cmd *cobra.Command, inst *cue.Instance, files []string) {
+func vetFiles(cmd *Command, inst *cue.Instance, files []string) {
 	expressions := flagExpression.StringArray(cmd)
 
 	var check cue.Value
diff --git a/cmd/cue/cmd/vet_test.go b/cmd/cue/cmd/vet_test.go
index 0786095..6856daa 100644
--- a/cmd/cue/cmd/vet_test.go
+++ b/cmd/cue/cmd/vet_test.go
@@ -17,16 +17,16 @@
 import "testing"
 
 func TestVet(t *testing.T) {
-	runCommand(t, newVetCmd(), "vet")
+	runCommand(t, newVetCmd(newRootCmd()), "vet")
 
-	cmd := newVetCmd()
+	cmd := newVetCmd(newRootCmd())
 	mustParseFlags(t, cmd, "-c")
 	runCommand(t, cmd, "vet_conc")
 
-	cmd = newVetCmd()
+	cmd = newVetCmd(newRootCmd())
 	runCommand(t, cmd, "vet_file", "./testdata/vet/vet.cue", "./testdata/vet/data.yaml")
 
-	cmd = newVetCmd()
+	cmd = newVetCmd(newRootCmd())
 	mustParseFlags(t, cmd, "-e", "File")
 	runCommand(t, cmd, "vet_expr", "./testdata/vet/vet.cue", "./testdata/vet/data.yaml")
 
