Start Go command line apps with ease

Start

Start Go command line apps with ease

Build Status BSD 3-clause License Godoc Reference goreportcard

Flag

Executive Summary

The start package for Go provides two basic features for command line applications:

  1. Read your application settings transparently from either

    • command line flags,
    • environment variables,
    • config file entries,
    • or hardcoded defaults
      in this order. You are free to decide where to put your configuration, start will find it!
  2. Parse commands and subcommands. This includes:

    • Mapping commands and subcommands to functions.
    • Providing an auto-generated help command for every command and subcommand.

Motivation

I built the start package mainly because existing flag packages did not provide any option for getting default values from environment variables or from a config file (let alone in a transparent way). And I decided to include command and subcommand parsing as well, making this package a complete "starter kit".

Status

(start uses Semantic Versioning 2.0.0.)

Version Release

Basic functionality is implemented.
Unit tests pass but no real-world tests were done yet.

Tested with:

  • Go 1.13.5 darwin/amd64 on macOS Catalina
  • Go 1.8.0 darwin/amd64 on macOS Sierra
  • Go 1.7.0 darwin/amd64 on macOS Sierra
  • Go 1.6.3 darwin/amd64 on macOS Sierra
  • Go 1.6.0 darwin/amd64 on Mac/OSX El Capitan
  • Go 1.5.1 darwin/amd64 on Mac/OSX El Capitan
  • Go 1.4.2 darwin/amd64 on Mac/OSX Yosemite
  • Go 1.4.2 linux/arm on a Banana Pi running Bananian OS 15.01 r01
  • Go 1.4.2 win32/amd64 on Windows 7

Usage

import (
	"github.com/christophberger/start"
)

Define application settings:

Define your application settings using pflag:

var ip *int = flag.IntP("intname", "n", 1234, "help message")
var sp *string = flag.StringP("strname", "s", "default", "help message")
var bp *bool = flag.BoolP("boolname", "b", "help message") // default is false if boolean flag is missing

var flagvar int
flag.IntVarP(&flagvar, "flagname", "f" 1234, "help message")

...you know this already from the standard flag package - almost no learning curve here. The pflag package adds POSIX compatibility: --help and -h instead of -help. See the pflag readme for details.

Then (optionally, if not using commands as well) call

start.Parse()

(instead of pflag.Parse()) to initialize each variable from these sources, in the given order:

  1. From a commandline flag of the long or short name.
  2. From an environment variable named <APPNAME>_<LONGNAME>, if the commandline flag does not exist. (<APPNAME> is the executable's name (without extension, if any), and <LONGNAME> is the flag's long name.) [1]
  3. From an entry in the config file, if the environment variable does not exist.
  4. From the default value if the config file entry does not exist.

This way, you are free to decide whether to use a config file, environment variables, flags, or any combination of these. For example, let's assume you want to implement an HTTP server. Some of the settings will depend on the environment (development, test, or production), such as the HTTP port. Using environment variables, you can define, for example, port 8080 on the test server, and port 80 on the production server. Other settings will be the same across environments, so put them into the config file. And finally, you can overwrite any default setting at any time via command line flags.

And best of all, each setting has the same name in the config file, for the environment variable, and for the command line flag (but the latter can also have a short form).

[1] NOTE: If your executable's name contains characters other than a-zA-Z0-9_, then <APPLICATION> must be set to the executable's name with all special characters replaced by an underscore. For example: If your executable is named "start.test", then the environment variable is expected to read START_TEST_CFGPATH.

Define commands:

Use Add() to define a new command. Pass the name, a short and a long help message, optionally a list of command-specific flag names, and the function to call.

start.Add(&start.Command{
		Name:  "command",
		Short: "short help message",
		Long:  "long help for 'help command'",
		Flags: []string{"socket", "port"},
		Cmd:   func(cmd *start.Command) error {
				fmt.Println("Done.")
		}
})

The Cmd function receives its Command struct. It can get the command line via the cmd.Args slice.

Define subcommands in the same way but add the name of the parent command:

start.Add(&start.Command{
		Name:  "command",
		Parent: "parentcmd"
		Short: "short help message",
		Long:  "long help for 'help command'",
		Flags: []string{"socket", "port"},
		Cmd:   func(cmd *start.Command) error {
				fmt.Println("Done.")
		}
})

The parent command's Cmd is then optional. If you specify one, it will only be invoked if no subcommand is used.

For evaluating the command line, call

start.Up()

This method calls start.Parse() and then executes the given command. The command receives its originating Command as input can access cmd.Args (a string array) to get all parameters (minus the flags)

Notes about the config file

By default, start looks for a configuration file in the following places:

  • In the path defined through the environment variable <APPNAME>_CFGPATH
  • In the working directory
  • In the user's config dir:
    • in $XDG_CONFIG_HOME (if defined)
    • in the .config/<appname> directory
    • for Windows, in %LOCALAPPDATA%

The name of the configuration file is either <appname>.toml except if the file is located in $HOME/.config/<appname>; in this case the name is config.toml.

You can also set a custom name:

start.UseConfigFile("<your_config_file>")

start then searches for this file name in the places listed above.

You may as well specify a full path to your configuration file:

start.UseConfigFile("<path_to_your_config_file>")

The above places do not get searched in this case.

Or simply set <APPNAME>_CFGPATH to a path of your choice. If this path does not end in ".toml", start assumes that the path is a directory and tries to find <appname>.toml inside this directory.

The configuration file is a TOML file. By convention, all of the application's global variables are top-level "key=value" entries, outside any section. Besides this, you can include your own sections as well. This is useful if you want to provide defaults for more complex data structures (arrays, tables, nested settings, etc). Access the parsed TOML document directly if you want to read values from TOML sections.

start uses toml-go for parsing the config file. The parsed contents are available via a property named "CfgFile", and you can use toml-go methods for accessing the contents (after having invoked start.Parse()or start.Up()):

langs := start.CfgFile.GetArray("colors")
langs := start.CfgFile.GetDate("publish")

(See the toml-go project for all avaialble methods.)

Example

For this example, let's assume you want to build a fictitious application for translating text. We will go through the steps of setting up a config file, environment variables, command line flags, and commands.

First, set up a config file consisting of key/value pairs:

targetlang = bavarian
sourcelang = english_us
voice = Janet

Set an environment variable. Let's assume your executable is named "gotranslate":

$ export GOTRANSLATE_VOICE = Sepp

Define the global variables in your code, just as you would do with the pflag package:

tl := flag.StringP("targetlang", "t", "danish", "The language to translate into")
var sl string
flag.StringVarP("sourcelang", "s", "english_uk", "The language to translate from")
v := flag.StringP("voice", "v", "Homer", "The voice used for text-to-speech")
speak := flag.BoolP("speak", "p", false, "Speak out the translated string")

Define and implement some commands:

func main() {
	start.Add(&start.Command{
		Name: "translate",
		OwnFlags: []string{"voice", "speak"}, // voice and speak make only sense for the translate command
		Short: "translate [<options>] <string>",
		Long: "Translate a string from a source language into a target language, optionally speaking it out",
		Cmd: translate,
	})

	start.Add(&start.Command{
		Name: "check",
		Short: "check [style|spelling]",
		Long: "Perform various checks",
	})

	start.Add(&start.Command{
		Parent: "check"
		Name: "style",
		Short: "check style <string>",
		Long: "Check the string for slang words or phrases",
		Cmd: checkstyle,
	})

	start.Add("check", &start.Command{
		Parent: "check"
		Name: "spelling",
		Short: "check spelling <string>",
		Long: "Check the string for spelling errors",
		Cmd: checkspelling,
	})

	start.Up()
}


func translate(cmd *start.Command) error {
	source := cmd.Args[0]
	target := google.Translate(sl, source, tl)  // this API method is completely made up

	if speak {
		apple.VoiceKit.SpeakOutString(target).WithVoice(v)  // this also
	}
	return nil
}

func checkstyle(cmd *start.Command) error  {
	// real-life code should check for len(cmd.Args) first
	source := cmd.Args[0]
	stdout.Println(office.StyleChecker(source))  // also made up
	return nil
}

func checkspelling(cmd *start.Command) error {
	source := cmd.Args[0]
	stdout.Println(aspell.Check(source))  // just an imaginary method
	return nil
}

TODO

  • Add predefined "version" and "help" commands OR flags.
  • Factor out most of this large README into [[Wiki|TOC]] pages.
  • Change the mock-up code from the Example section into executable code.

Change Log

See CHANGES.md for details.

About the name

For this package, I chose the name "start" for three reasons:

  1. The package is all about starting a Go application: Read preferences, fetch environment variables, parse the command line.
  2. The package helps starting a new commandline application project quickly.
  3. Last not least this is my starter project on GitHub, and at the same time my first public Go project. (Oh, I am sooo excited!)
Comments
  • starttest do: index out of range

    starttest do: index out of range

    > ./starttest do
    panic: runtime error: index out of range
    
    goroutine 1 [running]:
    github.com/christophberger/start.readCommand(0xc820012ac0, 0x0, 0x0, 0xc820053df0, 0x0, 0x0)
            /Users/christoph/Development/Go/Code/src/github.com/christophberger/start/command.go:245 +0x957
    github.com/christophberger/start.Up()
            /Users/christoph/Development/Go/Code/src/github.com/christophberger/start/start.go:164 +0x7e0
    main.main()
            /Users/christoph/Development/Go/Code/src/github.com/christophberger/start/examples/test/starttest.go:82 +0x54c
    
    goroutine 17 [syscall, locked to thread]:
    runtime.goexit()
            /usr/local/go/src/runtime/asm_amd64.s:1721 +0x1> 
    
  • Add help command

    Add help command

    Situation

    Calling an application without command, or calling a command without a required subcommand, automatically prints the usage information. No additional help exists yet.

    New Feature

    Add a help command that prints a command specific help text.

    Syntax

    app help [command [subcommand]] 
    
  • Bump github.com/spf13/pflag from 1.0.3 to 1.0.4

    Bump github.com/spf13/pflag from 1.0.3 to 1.0.4

    Bumps github.com/spf13/pflag from 1.0.3 to 1.0.4.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Note: This repo was added to Dependabot recently, so you'll receive a maximum of 5 PRs for your first few update runs. Once an update run creates fewer than 5 PRs we'll remove that limit.

    You can always request more updates by clicking Bump now in your Dependabot dashboard.

    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language
    • @dependabot badge me will comment on this PR with code to add a "Dependabot enabled" badge to your readme

    Additionally, you can set the following in your Dependabot dashboard:

    • Update frequency (including time of day and day of week)
    • Pull request limits (per update run and/or open at any time)
    • Out-of-range updates (receive only lockfile updates, if desired)
    • Security updates (receive only security updates, if desired)

    Finally, you can contact us by mentioning @dependabot.

  • Bump github.com/smartystreets/goconvey from 1.7.0 to 1.7.2

    Bump github.com/smartystreets/goconvey from 1.7.0 to 1.7.2

    Bumps github.com/smartystreets/goconvey from 1.7.0 to 1.7.2.

    Release notes

    Sourced from github.com/smartystreets/goconvey's releases.

    v1.7.2

    What's Changed

    Full Changelog: https://github.com/smartystreets/goconvey/compare/v1.7.1...v1.7.2

    v1.7.1

    What's Changed

    Full Changelog: https://github.com/smartystreets/goconvey/compare/v1.7.0...v1.7.1

    Commits
    • 6119263 Merge pull request #649 from smartystreets/serverVersion
    • 13a1c07 Report server version on startup.
    • 2fa2eeb Merge pull request #648 from smartystreets/smallBugs
    • be5a1dc Fix reports routing and http.Server usage.
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
  • Bump github.com/smartystreets/goconvey from 1.6.7 to 1.7.0

    Bump github.com/smartystreets/goconvey from 1.6.7 to 1.7.0

    Bumps github.com/smartystreets/goconvey from 1.6.7 to 1.7.0.

    Release notes

    Sourced from github.com/smartystreets/goconvey's releases.

    v1.7.0

    NOTE: This release drops support for Go 1.15 and earlier, since I only have a limited amount of time to maintain this project, and convey previously included workarounds and hacks for some VERY old versions of Go (at least down to Go 1.2!!). If you want to become an active maintainer to preserve support for older Go releases, let's please discuss in smartystreets/goconvey#643.

    What's Changed

    New Contributors

    Full Changelog: https://github.com/smartystreets/goconvey/compare/v1.6.7...v1.7.0

    Commits
    • badebba Merge pull request #647 from smartystreets/covertempdir
    • 180ccef Use temporary directory for coverage reports.
    • 3e04cfe Merge pull request #646 from smartystreets/removeGo12
    • 2967ec0 Merge pull request #644 from smartystreets/embed_static
    • 8a06cad Merge pull request #643 from smartystreets/go116
    • 44c3137 Remove >go1.2 detection logic.
    • 29d2f9a Use go:embed to serve static resources.
    • 3bb3368 Set minimum Go version to 1.16
    • e098f86 Merge pull request #642 from smartystreets/check_scripts
    • a47feb4 Refine third-party lib checking scripts.
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
  • Bump github.com/smartystreets/goconvey from 1.6.6 to 1.6.7

    Bump github.com/smartystreets/goconvey from 1.6.6 to 1.6.7

    Bumps github.com/smartystreets/goconvey from 1.6.6 to 1.6.7.

    Release notes

    Sourced from github.com/smartystreets/goconvey's releases.

    v1.6.7

    What's Changed

    New Contributors

    Full Changelog: https://github.com/smartystreets/goconvey/compare/v1.6.6...v1.6.7

    Commits
    • a743bd0 Merge pull request #640 from smartystreets/fix_dropped_test_results
    • 5531d05 Fix #639: Disable pre-compilation for Go 1.16+
    • 2b209bb Update Travis CI badge
    • c84ba39 Add simple update script and CI check for 3rd party libs.
    • 96b4785 Merge pull request #628 from paudley/patch-1
    • 22c4983 Add ShouldEqualJSON to the assertion export list.
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
  • Bump github.com/smartystreets/goconvey from 1.6.4 to 1.6.6

    Bump github.com/smartystreets/goconvey from 1.6.4 to 1.6.6

    Bumps github.com/smartystreets/goconvey from 1.6.4 to 1.6.6.

    Release notes

    Sourced from github.com/smartystreets/goconvey's releases.

    v1.6.6

    What's Changed

    New Contributors

    Full Changelog: https://github.com/smartystreets/goconvey/compare/v1.6.5...v1.6.6

    v1.6.5

    What's Changed

    New Contributors

    Full Changelog: https://github.com/smartystreets/goconvey/compare/v1.6.4...v1.6.5

    Commits
    • 33a2c59 Merge pull request #633 from ezk84/master
    • 5f11d69 Merge branch 'smartystreets:master' into master
    • 8cae8f6 Merge pull request #588 from miketonks/stack-mode
    • 19a1d6d Fix compilation error
    • 6115295 Merge branch 'smartystreets:master' into master
    • 0fc5ef5 Merge pull request #488 from CtrlZvi/ignore_testdata_packages
    • c1c3b7b Add Go1.16 to travis.yml
    • c7f2782 Fixup s/assertion/Assertion post-merge.
    • 677d5b6 Merge pull request #451 from kormat/SoMsg
    • f724034 Merge branch 'master' into SoMsg
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
  • Upgrade to GitHub-native Dependabot

    Upgrade to GitHub-native Dependabot

    Dependabot Preview will be shut down on August 3rd, 2021. In order to keep getting Dependabot updates, please merge this PR and migrate to GitHub-native Dependabot before then.

    Dependabot has been fully integrated into GitHub, so you no longer have to install and manage a separate app. This pull request migrates your configuration from Dependabot.com to a config file, using the new syntax. When merged, we'll swap out dependabot-preview (me) for a new dependabot app, and you'll be all set!

    With this change, you'll now use the Dependabot page in GitHub, rather than the Dependabot dashboard, to monitor your version updates, and you'll configure Dependabot through the new config file rather than a UI.

    If you've got any questions or feedback for us, please let us know by creating an issue in the dependabot/dependabot-core repository.

    Learn more about migrating to GitHub-native Dependabot

    Please note that regular @dependabot commands do not work on this pull request.

  • Bump github.com/spf13/pflag from 1.0.3 to 1.0.5

    Bump github.com/spf13/pflag from 1.0.3 to 1.0.5

    Bumps github.com/spf13/pflag from 1.0.3 to 1.0.5.

    Release notes

    Sourced from github.com/spf13/pflag's releases.

    1.0.5

    No release notes provided.

    v1.0.5-rc1

    This hopefully fixes #218, and will be promoted when the fix has been verified.

    1.0.4

    No release notes provided.

    Commits
    • 2e9d26c Merge pull request #219 from cfromknecht/fix-mod
    • 14457a6 Remove require pflag v1.0.3
    • e8f2996 Fix typo in go.mod
    • 7b22f68 Merge pull request #216 from therealmitchconnors/elegant
    • 8e39cc4 gofmt
    • 68f4136 Add SliceValue Comments
    • b22fc70 Expand SliceValue support to all slice and array types.
    • c6c0f0f Add first SliceValue implementations
    • 9722382 Added String-To-Int64 option parsing (#211)
    • 6d93a82 Merge pull request #201 from Fedosin/fix_descriptions
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language
    • @dependabot badge me will comment on this PR with code to add a "Dependabot enabled" badge to your readme

    Additionally, you can set the following in your Dependabot dashboard:

    • Update frequency (including time of day and day of week)
    • Pull request limits (per update run and/or open at any time)
    • Out-of-range updates (receive only lockfile updates, if desired)
    • Security updates (receive only security updates, if desired)

    Finally, you can contact us by mentioning @dependabot.

  • Add git-style subcommands

    Add git-style subcommands

    If a command is not implemented, try finding an executable named <application>-<command> and call it.

    Example:
    Application name = start, command = now. Command now is not implemented.
    User calls start now.
    Then search for start-now in $PATH and invoke this command instead, if found.

A tool to enumerate all the command-line arguments used to start a Linux process written in Go.
A tool to enumerate all the command-line arguments used to start a Linux process written in Go.

ranwith A tool to enumerate all the command-line arguments used to start a Linux process written in Go. ranwith uses the Linux /proc directory to obta

Jun 30, 2022
Vfkit - Simple command line tool to start VMs through virtualization framework

vfkit - Simple command line tool to start VMs through virtualization framework v

Oct 21, 2022
A simple, fast, and fun package for building command line apps in Go

cli cli is a simple, fast, and fun package for building command line apps in Go. The goal is to enable developers to write fast and distributable comm

Dec 31, 2022
cli is a simple, fast, and fun package for building command line apps in Go.

cli cli is a simple, fast, and fun package for building command line apps in Go. The goal is to enable developers to write fast and distributable comm

Jul 10, 2022
A simple library to build golang command line (cli / cmd)apps

A simple library to build golang command line (cli / cmd)apps

Jan 11, 2022
An open-source GitLab command line tool bringing GitLab's cool features to your command line
An open-source GitLab command line tool bringing GitLab's cool features to your command line

GLab is an open source GitLab CLI tool bringing GitLab to your terminal next to where you are already working with git and your code without switching

Dec 30, 2022
A command line tool that builds and (re)starts your web application everytime you save a Go or template fileA command line tool that builds and (re)starts your web application everytime you save a Go or template file

# Fresh Fresh is a command line tool that builds and (re)starts your web application everytime you save a Go or template file. If the web framework yo

Nov 22, 2021
A command line tool to prompt for a value to be included in another command line.

readval is a command line tool which is designed for one specific purpose—to prompt for a value to be included in another command line. readval prints

Dec 22, 2021
Softsuite - Start from gofiber boilerplate and plan to build large projects

Softsuite Thanks to Cozy (ItsCosmas) to build gofiber boilerplate. I start learn

Apr 25, 2022
git-xargs is a command-line tool (CLI) for making updates across multiple Github repositories with a single command.
git-xargs is a command-line tool (CLI) for making updates across multiple Github repositories with a single command.

Table of contents Introduction Reference Contributing Introduction Overview git-xargs is a command-line tool (CLI) for making updates across multiple

Dec 31, 2022
git-xargs is a command-line tool (CLI) for making updates across multiple GitHub repositories with a single command
git-xargs is a command-line tool (CLI) for making updates across multiple GitHub repositories with a single command

git-xargs is a command-line tool (CLI) for making updates across multiple GitHub repositories with a single command. You give git-xargs:

Feb 5, 2022
Package command provide simple API to create modern command-line interface

Package command Package command provide simple API to create modern command-line interface, mainly for lightweight usage, inspired by cobra Usage pack

Jan 16, 2022
A command line tool for simplified docker volume command built with go

dockervol A command line tool for simplified docker volume command built with go. Features: Remove anonymous volume (beta) Remove volume by matching n

Dec 18, 2021
Watcher - A simple command line app to watch files in a directory for changes and run a command when files change!

Watcher - Develop your programs easily Watcher watches all the files present in the directory it is run from of the directory that is specified while

Mar 27, 2022
The power of curl, the ease of use of httpie.
The power of curl, the ease of use of httpie.

Curlie If you like the interface of HTTPie but miss the features of curl, curlie is what you are searching for. Curlie is a frontend to curl that adds

Dec 27, 2022
A tiny Nano wallet, focused on ease of use through simplicity

atto is a tiny Nano wallet, which focuses on ease of use through simplicity. Disclaimer: I am no cryptographer and atto has not been audited. I cannot

Nov 14, 2022
CLI client for docat, Manage your docat documentation with ease.
CLI client for docat, Manage your docat documentation with ease.

docatl, the docat cli Manage your docat documentation with ease. Getting Started Download the latest Release binary for your platform and start pushin

Nov 10, 2022
LINE account link: Sample code for LINE account link
LINE account link: Sample code for LINE account link

LINE account link: Sample code for LINE account link This is sample code to demostration LINE chatbot account link, refer to document https://develope

Dec 11, 2021
A collection of terminal-based widgets for richer Golang CLI apps.
A collection of terminal-based widgets for richer Golang CLI apps.

Flinch A collection of terminal-based widgets for richer Golang CLI apps. Ships with a library to build your own widgets/TUIs too. Warning: This modul

Jan 7, 2023