diff --git a/.github/workflows/sync-commands.yaml b/.github/workflows/sync-commands.yaml new file mode 100644 index 0000000..d0a33c5 --- /dev/null +++ b/.github/workflows/sync-commands.yaml @@ -0,0 +1,19 @@ +--- +name: 🔄 Sync commands to ws-meta +on: + push: + branches: + - main + paths: + - commands.yaml + +jobs: + sync: + runs-on: ubuntu-latest + steps: + - name: 🔄 Sync to ws-meta + uses: kloudkit/ws-meta/.github/actions/sync@main + with: + token: ${{ secrets.KLOUD_BOT_ORG_PAT }} + files: | + commands.yaml diff --git a/cmd/clip/clip.go b/cmd/clip/clip.go index 0eb7b6c..cbc1df6 100644 --- a/cmd/clip/clip.go +++ b/cmd/clip/clip.go @@ -7,4 +7,5 @@ import ( var ClipCmd = &cobra.Command{ Use: "clip", Short: "Interact with the native clipboard", + Long: "Reach the browser clipboard from the terminal over the workspace IPC socket.", } diff --git a/cmd/clip/paste.go b/cmd/clip/paste.go index 1a1b746..6cf1d9e 100644 --- a/cmd/clip/paste.go +++ b/cmd/clip/paste.go @@ -8,6 +8,7 @@ import ( var pasteCmd = &cobra.Command{ Use: "paste", Short: "Paste clipboard content", + Long: "Read the browser clipboard over the workspace IPC socket and write it to stdout — redirect it to a file or pipe it onward. Pairs with the pbcopy/xclip/xsel shims for terminal clipboard access.", RunE: func(cmd *cobra.Command, args []string) error { return clipboard.Paste(cmd.OutOrStdout()) }, diff --git a/cmd/commands_test.go b/cmd/commands_test.go new file mode 100644 index 0000000..9010611 --- /dev/null +++ b/cmd/commands_test.go @@ -0,0 +1,31 @@ +package cmd_test + +import ( + "os" + "path/filepath" + "testing" + + "github.com/kloudkit/ws-cli/cmd" + "github.com/kloudkit/ws-cli/internals/docs" + "gotest.tools/v3/assert" +) + +func TestCommandsManifestMatchesCommittedFile(t *testing.T) { + want, err := os.ReadFile(filepath.Join("..", "commands.yaml")) + assert.NilError(t, err) + + got, err := docs.Serialize(cmd.RootCmd()) + assert.NilError(t, err) + + assert.Equal(t, string(got), string(want)) +} + +func TestSerializeIsDeterministic(t *testing.T) { + first, err := docs.Serialize(cmd.RootCmd()) + assert.NilError(t, err) + + second, err := docs.Serialize(cmd.RootCmd()) + assert.NilError(t, err) + + assert.Equal(t, string(first), string(second)) +} diff --git a/cmd/editor/diagnostics.go b/cmd/editor/diagnostics.go index 6e953e6..4a46b73 100644 --- a/cmd/editor/diagnostics.go +++ b/cmd/editor/diagnostics.go @@ -13,6 +13,7 @@ import ( var diagnosticsCmd = &cobra.Command{ Use: "diagnostics", Short: "Show language diagnostics for the workspace (or a single file)", + Long: "Pull language-server diagnostics (errors, warnings) from the editor over the IPC socket, across the whole workspace or a single file with --uri. Styled table by default, --raw for the JSON.", RunE: func(cmd *cobra.Command, args []string) error { uri, _ := cmd.Flags().GetString("uri") diff --git a/cmd/editor/editor.go b/cmd/editor/editor.go index b8a96f5..fa15623 100644 --- a/cmd/editor/editor.go +++ b/cmd/editor/editor.go @@ -18,6 +18,7 @@ var errNoEditorOverSSH = errors.New( var EditorCmd = &cobra.Command{ Use: "editor", Short: "Inspect and drive the active editor session", + Long: "Query and control the running VS Code / code-server window over the workspace IPC socket — list open tabs, read diagnostics and the current selection, or open a file. Blocked over SSH, where there is no browser editor to reach.", PersistentPreRunE: func(cmd *cobra.Command, args []string) error { if env.IsSSHSession() { return errNoEditorOverSSH diff --git a/cmd/editor/list.go b/cmd/editor/list.go index 6dd43bc..f1b0f31 100644 --- a/cmd/editor/list.go +++ b/cmd/editor/list.go @@ -13,6 +13,7 @@ import ( var listCmd = &cobra.Command{ Use: "list", Short: "List the currently open editor tabs", + Long: "List the editor's open tabs over the IPC socket, with each tab's path, language, and active or dirty state.", RunE: func(cmd *cobra.Command, args []string) error { body, err := editoripc.FetchEditors() if err != nil { diff --git a/cmd/editor/open.go b/cmd/editor/open.go index 2ec2b9b..b80f31c 100644 --- a/cmd/editor/open.go +++ b/cmd/editor/open.go @@ -12,6 +12,7 @@ import ( var openCmd = &cobra.Command{ Use: "open ", Short: "Open a file in the editor", + Long: "Open a file in the running editor window over the workspace IPC socket — a tab in the current window by default, a separate one with --new-window, jumping to a range with --selection. Fails fast over SSH, where there is no browser editor to open into.", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { newWindow, _ := cmd.Flags().GetBool("new-window") diff --git a/cmd/editor/selection.go b/cmd/editor/selection.go index 5151c0d..be2bced 100644 --- a/cmd/editor/selection.go +++ b/cmd/editor/selection.go @@ -13,6 +13,7 @@ import ( var selectionCmd = &cobra.Command{ Use: "selection", Short: "Show the active editor's current selection", + Long: "Report the active editor's current selection — file, range, and selected text — over the IPC socket. Empty when nothing is selected.", RunE: func(cmd *cobra.Command, args []string) error { body, err := editoripc.FetchSelection() if err != nil { diff --git a/cmd/feature/feature.go b/cmd/feature/feature.go index 7870692..4afd7e2 100644 --- a/cmd/feature/feature.go +++ b/cmd/feature/feature.go @@ -9,6 +9,7 @@ import ( var FeatureCmd = &cobra.Command{ Use: "feature", Short: "Install additional pre-configured features", + Long: "Install and inspect optional workspace features — Ansible playbooks that add tools on top of the base image. Ships a curated set; --root points at your own under ~/.ws/features.d.", } func featureDirs(cmd *cobra.Command) []string { diff --git a/cmd/feature/info.go b/cmd/feature/info.go index afd636b..7ca7d2d 100644 --- a/cmd/feature/info.go +++ b/cmd/feature/info.go @@ -11,6 +11,7 @@ import ( var infoCmd = &cobra.Command{ Use: "info ", Short: "Show detailed information about a feature", + Long: "Show a feature's description and the variables it accepts, so you know what --opt values install will take.", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { featureName := args[0] diff --git a/cmd/feature/install.go b/cmd/feature/install.go index 61b7930..002a4fc 100644 --- a/cmd/feature/install.go +++ b/cmd/feature/install.go @@ -25,6 +25,7 @@ var skippableSections = []struct { var installCmd = &cobra.Command{ Use: "install", Short: "Install additional pre-configured features", + Long: "Run a feature's playbook to install it. Pass variables with --opt KEY=VAL, and skip parts you do not want with --skip-extensions, --skip-completion, or --skip-repository.", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { featureName := args[0] diff --git a/cmd/feature/list.go b/cmd/feature/list.go index d79f9ec..4ac4144 100644 --- a/cmd/feature/list.go +++ b/cmd/feature/list.go @@ -11,6 +11,7 @@ import ( var listCmd = &cobra.Command{ Use: "list", Short: "List available features that can be installed", + Long: "List the features you can install, marking where each comes from — the shipped set, a workspace override, or your own ~/.ws/features.d.", Aliases: []string{"ls"}, RunE: func(cmd *cobra.Command, args []string) error { result, err := features.ListFeatures(featureDirs(cmd)) diff --git a/cmd/feature/store.go b/cmd/feature/store.go index f6942d4..ed615a1 100644 --- a/cmd/feature/store.go +++ b/cmd/feature/store.go @@ -12,6 +12,7 @@ import ( var storeCmd = &cobra.Command{ Use: "store", Short: "List packages available in the feature store", + Long: "List the artifacts published to the feature store (WS_FEATURES_STORE_URL) — the offline mirror features install from when the network is locked down.", RunE: func(cmd *cobra.Command, args []string) error { storeURL, _ := config.Resolve("features", "store_url") if storeURL == "" { diff --git a/cmd/info/env.go b/cmd/info/env.go index 6de5d98..689f686 100644 --- a/cmd/info/env.go +++ b/cmd/info/env.go @@ -33,6 +33,7 @@ func showEnvironment(writer io.Writer) { var envCmd = &cobra.Command{ Use: "env", Short: "Display effective workspace environment variables", + Long: "Print every WS_* variable in effect, sorted — the resolved environment the workspace booted with.", RunE: func(cmd *cobra.Command, args []string) error { showEnvironment(cmd.OutOrStdout()) return nil diff --git a/cmd/info/extensions.go b/cmd/info/extensions.go index b8453a2..769d1d7 100644 --- a/cmd/info/extensions.go +++ b/cmd/info/extensions.go @@ -12,6 +12,7 @@ import ( var extensionsCmd = &cobra.Command{ Use: "extensions", Short: "Display installed extensions", + Long: "List the installed VS Code extensions with their versions.", RunE: func(cmd *cobra.Command, args []string) error { extensions, _ := config.GetExtensions() diff --git a/cmd/info/info.go b/cmd/info/info.go index e4195ff..0f569a8 100644 --- a/cmd/info/info.go +++ b/cmd/info/info.go @@ -36,11 +36,13 @@ func showVersion(writer io.Writer) { var InfoCmd = &cobra.Command{ Use: "info", Short: "Display workspace information", + Long: "Report facts about the running workspace — version, effective environment, installed extensions, live resource metrics, and uptime.", } var showVersionCmd = &cobra.Command{ Use: "version", Short: "Display installed workspace version", + Long: "Print the workspace version. --all expands to the full table — workspace, ws-cli, and VS Code.", Run: func(cmd *cobra.Command, args []string) { if all, _ := cmd.Flags().GetBool("all"); all { showVersion(cmd.OutOrStdout()) diff --git a/cmd/info/metrics.go b/cmd/info/metrics.go index 1d2563f..3179a7b 100644 --- a/cmd/info/metrics.go +++ b/cmd/info/metrics.go @@ -12,6 +12,7 @@ import ( var metricsCmd = &cobra.Command{ Use: "metrics", Short: "Display workspace metrics", + Long: "Show live resource usage — CPU, memory, disk, and file descriptors, plus GPU with --gpu.", RunE: func(cmd *cobra.Command, args []string) error { includeGPU, _ := cmd.Flags().GetBool("gpu") diff --git a/cmd/info/uptime.go b/cmd/info/uptime.go index a45683f..7b5d913 100644 --- a/cmd/info/uptime.go +++ b/cmd/info/uptime.go @@ -12,6 +12,7 @@ import ( var uptimeCmd = &cobra.Command{ Use: "uptime", Short: "Display the workspace uptime", + Long: "Show when the workspace session started and how long it has been running.", RunE: func(cmd *cobra.Command, args []string) error { started, running, err := config.GetSessionInfo() diff --git a/cmd/log/log.go b/cmd/log/log.go index c4a770a..83aac41 100644 --- a/cmd/log/log.go +++ b/cmd/log/log.go @@ -10,6 +10,7 @@ import ( var LogCmd = &cobra.Command{ Use: "log", Short: "Log messages", + Long: "Emit styled, level-tagged log lines — the same formatting the startup scripts use. --pipe runs each line of piped input through the logger.", } var debugCmd = createCommand("debug", "debugging") @@ -19,6 +20,7 @@ var warnCmd = createCommand("warn", "warning") var stampCmd = &cobra.Command{ Use: "stamp", Short: "Log the current timestamp", + Long: "Print just the current timestamp in the workspace log style — handy for marking phases in a startup log.", Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { withPipe, _ := cmd.Flags().GetBool("pipe") @@ -36,6 +38,7 @@ func createCommand(short, long string) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("%s message", short), Short: fmt.Sprintf("Log %s messages", long), + Long: fmt.Sprintf("Emit a log line at %s level in the workspace style — the same formatting the startup scripts use. --indent nests it under a preceding line, --stamp prefixes a timestamp.", short), Args: validate, RunE: execute(short), } diff --git a/cmd/logs/logs.go b/cmd/logs/logs.go index 05656c8..bb6dd25 100644 --- a/cmd/logs/logs.go +++ b/cmd/logs/logs.go @@ -17,6 +17,7 @@ var validLogTargets = []string{"main", "metrics", "docker", "auth_proxy", "cloud var LogsCmd = &cobra.Command{ Use: "logs", Short: "Retrieve workspace logs", + Long: "Read a workspace daemon's log — the main log by default, or --target metrics|docker|auth_proxy|cloudflared. Filter by --level, limit with --tail, or stream live with --follow.", Args: cobra.NoArgs, RunE: execute, } diff --git a/cmd/root.go b/cmd/root.go index 1027623..ee663af 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -24,6 +24,7 @@ import ( var rootCmd = &cobra.Command{ Use: "ws-cli", Short: "⚡ CLI companion to charge the workspace batteries", + Long: "The workspace command-line companion. Groups helpers for inspecting the running workspace, managing settings and secrets, driving the editor, and serving local assets — most are called by the startup scripts, all are yours in the terminal.", Version: "v" + info.Version, Aliases: []string{"ws"}, SilenceErrors: true, @@ -32,6 +33,10 @@ var rootCmd = &cobra.Command{ }, } +func RootCmd() *cobra.Command { + return rootCmd +} + func Execute() { ctx := context.Background() diff --git a/cmd/secrets/decrypt.go b/cmd/secrets/decrypt.go index 533b6f1..08e8753 100644 --- a/cmd/secrets/decrypt.go +++ b/cmd/secrets/decrypt.go @@ -9,6 +9,7 @@ import ( var decryptCmd = &cobra.Command{ Use: "decrypt ", Short: "Decrypt an encrypted value", + Long: "Decrypt a value produced by encrypt, under the master key. Reads from the argument or stdin (-); writes the plaintext to stdout, or a file with --output.", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { cfg := getOutputConfig(cmd) diff --git a/cmd/secrets/encrypt.go b/cmd/secrets/encrypt.go index 12dc4c4..4a5b0f7 100644 --- a/cmd/secrets/encrypt.go +++ b/cmd/secrets/encrypt.go @@ -12,6 +12,7 @@ import ( var encryptCmd = &cobra.Command{ Use: "encrypt ", Short: "Encrypt a plaintext value", + Long: "Encrypt a value under the master key. Reads the plaintext from the argument or stdin (-); writes the ciphertext to stdout, or a file with --output.", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { cfg := getOutputConfig(cmd) diff --git a/cmd/secrets/generate.go b/cmd/secrets/generate.go index 5c432b0..7ba92f0 100644 --- a/cmd/secrets/generate.go +++ b/cmd/secrets/generate.go @@ -5,6 +5,7 @@ import "github.com/spf13/cobra" var generateCmd = &cobra.Command{ Use: "generate", Short: "Generate master keys or login password hashes", + Long: "Generate the credentials the workspace needs — a master key for secrets, or a login password hash for the server.", } func init() { diff --git a/cmd/secrets/login.go b/cmd/secrets/login.go index df6acd5..e635c75 100644 --- a/cmd/secrets/login.go +++ b/cmd/secrets/login.go @@ -13,6 +13,7 @@ import ( var loginCmd = &cobra.Command{ Use: "login", Short: "Generate a workspace password hash for authentication", + Long: "Prompt for a password and print its hash for the workspace server login (WS_AUTH_PASSWORD_HASHED). Store the hash, never the password.", Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { cfg := getOutputConfig(cmd) diff --git a/cmd/secrets/master.go b/cmd/secrets/master.go index fb3a70b..4d2f3f2 100644 --- a/cmd/secrets/master.go +++ b/cmd/secrets/master.go @@ -14,6 +14,7 @@ import ( var masterCmd = &cobra.Command{ Use: "master", Short: "Generate a cryptographically secure master key", + Long: "Generate a random master key, printed base64-encoded — the key encrypt, decrypt, and the seed engine use. --length sets the byte size (default 32).", Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { cfg := getOutputConfig(cmd) diff --git a/cmd/secrets/secrets.go b/cmd/secrets/secrets.go index 8db7c41..5acfcb8 100644 --- a/cmd/secrets/secrets.go +++ b/cmd/secrets/secrets.go @@ -7,6 +7,7 @@ import ( var SecretsCmd = &cobra.Command{ Use: "secrets", Short: "Manage encryption and decryption of secrets", + Long: "Encrypt and decrypt values under a master key, and generate the keys themselves. Encrypted values are what the seed engine's secrets: map stores and decrypts at boot.", } func init() { diff --git a/cmd/seed/apply.go b/cmd/seed/apply.go index c51c300..6648503 100644 --- a/cmd/seed/apply.go +++ b/cmd/seed/apply.go @@ -12,6 +12,7 @@ import ( var applyCmd = &cobra.Command{ Use: "apply [dest...]", Short: "Project seed content onto the filesystem", + Long: "Apply the seed source to the filesystem — mirror bare files and run the .seed.yaml operations. Writes only where the destination is missing unless --force; pass destinations to limit the run to those paths.", SilenceUsage: true, RunE: runApply, } diff --git a/cmd/seed/ls.go b/cmd/seed/ls.go index a42e123..169ff34 100644 --- a/cmd/seed/ls.go +++ b/cmd/seed/ls.go @@ -11,6 +11,7 @@ import ( var lsCmd = &cobra.Command{ Use: "ls", Short: "List seed destinations and their behaviors", + Long: "List what apply would write — each destination with its operation and whether it carries a secret or a template — without touching the filesystem.", RunE: runLs, } diff --git a/cmd/seed/rotate.go b/cmd/seed/rotate.go index bed40b6..0c9ad4a 100644 --- a/cmd/seed/rotate.go +++ b/cmd/seed/rotate.go @@ -8,6 +8,7 @@ import ( var rotateCmd = &cobra.Command{ Use: "rotate", Short: "Re-encrypt managed secrets under a new master key", + Long: "Re-encrypt every managed secret from the old master key (--master) to a new one (--new-master), in place. All-or-nothing: it verifies every secret decrypts before writing anything.", SilenceUsage: true, RunE: runRotate, } diff --git a/cmd/seed/seed.go b/cmd/seed/seed.go index b244032..9cc88f9 100644 --- a/cmd/seed/seed.go +++ b/cmd/seed/seed.go @@ -8,6 +8,7 @@ import ( var SeedCmd = &cobra.Command{ Use: "seed", Short: "Project declarative content onto the filesystem", + Long: "Copy files and apply small edits from a seed source onto the filesystem at boot. Bare files mirror verbatim; a .seed.yaml manifest overlays behavior — copy, merge, append — and decrypts secrets under the master key. Point --source at a mounted volume to seed a container from durable storage.", } func init() { diff --git a/cmd/serve/current.go b/cmd/serve/current.go index 54ef741..0ab9e21 100644 --- a/cmd/serve/current.go +++ b/cmd/serve/current.go @@ -12,6 +12,7 @@ import ( var currentCmd = &cobra.Command{ Use: "current", Short: "Serve current directory as a static site", + Long: "Serve the current directory over HTTP as a static site — a quick way to preview built files.", RunE: func(cmd *cobra.Command, args []string) error { port, _ := cmd.Flags().GetInt("port") bind, _ := cmd.Flags().GetString("bind") diff --git a/cmd/serve/font.go b/cmd/serve/font.go index 4130433..d8d1ef9 100644 --- a/cmd/serve/font.go +++ b/cmd/serve/font.go @@ -11,6 +11,7 @@ import ( var fontCmd = &cobra.Command{ Use: "font", Short: "Serve fonts for local download", + Long: "Serve the installed fonts over HTTP so a browser can fetch them for local install.", RunE: func(cmd *cobra.Command, args []string) error { port, _ := cmd.Flags().GetInt("port") bind, _ := cmd.Flags().GetString("bind") diff --git a/cmd/serve/serve.go b/cmd/serve/serve.go index 70d8159..ae62bc3 100644 --- a/cmd/serve/serve.go +++ b/cmd/serve/serve.go @@ -5,6 +5,7 @@ import "github.com/spf13/cobra" var ServeCmd = &cobra.Command{ Use: "serve", Short: "Serve internal assets", + Long: "Run a small HTTP server for local assets — fonts or the current directory — on --port (default 38080).", } func init() { diff --git a/cmd/show/env.go b/cmd/show/env.go index 3d5b42e..41c4ae4 100644 --- a/cmd/show/env.go +++ b/cmd/show/env.go @@ -17,6 +17,7 @@ var osExit = os.Exit var envCmd = &cobra.Command{ Use: "env ", Short: "Display the resolved value of a workspace environment variable", + Long: "Resolve a setting by its dotted key (server.port) and print it with its source and description. --value emits just the value for scripts, --as bool|int|list validates the shape, --check tests whether it is set so a startup script can guard on it.", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { dotted := args[0] diff --git a/cmd/show/ip.go b/cmd/show/ip.go index 48174fb..e52b904 100644 --- a/cmd/show/ip.go +++ b/cmd/show/ip.go @@ -9,12 +9,14 @@ import ( var ipCmd = &cobra.Command{ Use: "ip", Short: "Display IP addresses", + Long: "Print the workspace's IP addresses — the internal container address or the node it runs on.", } -func makeIPCmd(use, short, title string, getter func() (string, error)) *cobra.Command { +func makeIPCmd(use, short, long, title string, getter func() (string, error)) *cobra.Command { return &cobra.Command{ Use: use, Short: short, + Long: long, RunE: func(cmd *cobra.Command, args []string) error { ip, err := getter() if err != nil { @@ -36,8 +38,8 @@ func makeIPCmd(use, short, title string, getter func() (string, error)) *cobra.C func init() { ipCmd.AddCommand( - makeIPCmd("internal", "Display the internal IP address", "Internal IP Address", net.GetInternalIP), - makeIPCmd("node", "Display the node/host IP address", "Node IP Address", net.GetNodeIP), + makeIPCmd("internal", "Display the internal IP address", "Print the workspace container's internal IP address.", "Internal IP Address", net.GetInternalIP), + makeIPCmd("node", "Display the node/host IP address", "Print the IP address of the node hosting the workspace.", "Node IP Address", net.GetNodeIP), ) ShowCmd.AddCommand(ipCmd) diff --git a/cmd/show/ip_test.go b/cmd/show/ip_test.go index 05e4489..dcdcbab 100644 --- a/cmd/show/ip_test.go +++ b/cmd/show/ip_test.go @@ -11,7 +11,7 @@ import ( func _runIPCmd(t *testing.T, title string, getter func() (string, error)) (stdout, stderr string, err error) { t.Helper() - cmd := makeIPCmd("ip", "Display an IP address", title, getter) + cmd := makeIPCmd("ip", "Display an IP address", "", title, getter) var outBuf, errBuf bytes.Buffer cmd.SetOut(&outBuf) diff --git a/cmd/show/path.go b/cmd/show/path.go index b927674..837b462 100644 --- a/cmd/show/path.go +++ b/cmd/show/path.go @@ -10,11 +10,13 @@ import ( var pathCmd = &cobra.Command{ Use: "path", Short: "Display various paths", + Long: "Print well-known workspace paths — the home root or the VS Code settings file.", } var pathHomeCmd = &cobra.Command{ Use: "home", Short: "Display the workspace home path", + Long: "Print the workspace home (server root) path.", RunE: func(cmd *cobra.Command, args []string) error { homePath := config.MustResolve("server", "root") @@ -33,6 +35,7 @@ var pathHomeCmd = &cobra.Command{ var pathVscodeCmd = &cobra.Command{ Use: "vscode-settings", Short: "Display the VS Code settings path", + Long: "Print the path to the VS Code settings file — the user file by default, or the folder's with --workspace.", RunE: func(cmd *cobra.Command, args []string) error { useWorkspace, _ := cmd.Flags().GetBool("workspace") diff --git a/cmd/show/show.go b/cmd/show/show.go index e61387f..8167cca 100644 --- a/cmd/show/show.go +++ b/cmd/show/show.go @@ -7,6 +7,7 @@ import ( var ShowCmd = &cobra.Command{ Use: "show", Short: "Display information about the current workspace instance", + Long: "Resolve and print facts about this workspace instance — settings, IP addresses, and paths. --raw drops the styling for use in scripts.", } func init() { diff --git a/cmd/template/apply.go b/cmd/template/apply.go index 9f44a50..b0f943e 100644 --- a/cmd/template/apply.go +++ b/cmd/template/apply.go @@ -11,6 +11,7 @@ import ( var applyCmd = &cobra.Command{ Use: "apply