Vale is a command-line tool that brings code-like linting to prose

Overview

Vale: Your style, our editor Build status Go Report Card GitHub All Releases Docker Pulls

Vale is a command-line tool that brings code-like linting to prose. It's fast, cross-platform (Windows, macOS, and Linux), and highly customizable.

DocumentationExample ConfigurationsStyles LibraryGitHub Action

❤️ Sponsors

Hi there! I'm @jdkato, the sole developer of Vale. If you'd like to help me dedicate more time to developing, documenting, and supporting Vale, feel free to donate through the Open Collective. Any donation—big, small, one-time, or recurring—is greatly appreciated!

Organizations

Individuals

💥 Key Features

  • Support for markup: Vale has a rich understanding of many markup formats, allowing it to avoid syntax-related false positives and intelligently exclude code snippets from prose-related rules.

  • A highly customizable extension system: Vale is capable of enforcing your style—be it a standard editorial style guide or a custom in-house set of rules (such as those created by GitLab, Homebrew, Linode, CockroachDB, and Spotify).

  • Easy-to-install, stand-alone binaries: Unlike other tools, Vale doesn't require you to install and configure a particular programming language and its related tooling (such as Python/pip or Node.js/npm).

See the documentation for more information.

🔍 At a Glance: Vale vs. <...>

NOTE: While all of the options listed below are open-source (CLI-based) linters for prose, their implementations and features vary significantly. And so, the "best" option will depends on your specific needs and preferences.

Functionality

Tool Extensible Checks Supports Markup Built With License
Vale Yes (via YAML) spelling, style Yes (Markdown, AsciiDoc, reStructuredText, HTML, XML) Go MIT
textlint Yes (via JavaScript) spelling, style Yes (Markdown, AsciiDoc, reStructuredText, HTML, Re:VIEW) JavaScript MIT
RedPen Yes (via Java) spelling, style Yes (Markdown, AsciiDoc, reStructuredText, Textile, Re:VIEW, and LaTeX) Java Apache-2.0
write-good Yes (via JavaScript) style No JavaScript MIT
proselint No style No Python BSD 3-Clause
Joblint No style No JavaScript MIT
alex No style Yes (Markdown) JavaScript MIT

The exact definition of "Supports Markup" varies by tool but, in general, it means that the format is understood at a higher level than a regular plain-text file (for example, features like excluding code blocks from spell check).

Extensibility means that there's a built-in means of creating your own rules without modifying the original source code.

Benchmarks

This benchmark has all three tools configured to use their implementations of the write-good rule set and Unix-style output. This benchmark runs Vale's implementation of proselint's rule set against the original. Both tools are configured to use JSON output.
This benchmark runs Vale's implementation of Joblint's rule set against the original. Both tools are configured to use JSON output. This benchmark has all three tools configured to perform only English spell checking using their default output styles.

All benchmarking was performed using the open-source hyperfine tool on a MacBook Pro (2.9 GHz Intel Core i7):

hyperfine --warmup 3 ''

The corpus IDs in the above plots—gitlab and ydkjs—correspond to the following files:

  • A snapshot of GitLab's open-source documentation (1,500 Markdown files).

  • A chapter from the open-source book You Don't Know JS.

📄 License

FOSSA Status

Comments
  • Improve the release workflow

    Improve the release workflow

    For v2.0.0+ versions of Vale, there are going to be some development and release workflow changes.

    Currently, the process is quite simple: development takes place on master and releases are tagged at various times.

    Going forward, this is going to change. The goal will be for master to always represent the state of the latest release (in terms of both go get and the state of the live documentation) -- Essentially, it's going to be a read-only release branch. Development will take place on versioned branches (e.g., v2.0.1).

    Status: Resolved Type: Enhancement 
    opened by jdkato 29
  • Integrate with existing tools

    Integrate with existing tools

    Editors + CLI tools

    • [x] Sublime Text (https://github.com/ValeLint/SubVale)
    • [x] Atom (https://github.com/TimKam/atomic-vale)
    • [x] VS Code (https://github.com/lunaryorn/vscode-vale)
    • [ ] coala CI
    • [x] Vim (via ALE, thanks to @chew-z)
    • [x] Emacs (https://github.com/abingham/flycheck-vale)
    • [ ] JetBrains

    Other

    The following would be nice to have, but will probably need to access Vale through an API of some sort (see languagetool-msword10-addin, for example).

    • [ ] Chrome + Firefox + Thunderbird
    • [ ] MS Word
    • [ ] WordPress
    • [ ] Slack
    Status: In Progress Type: Enhancement 
    opened by jdkato 23
  • Extend base config

    Extend base config

    There is no way to extend a base config, is there?

    I mean, I'd like to have a base .vale.ini config file somewhere, and then in each project's .vale.ini do something like:

    Extend = path/to/base/.vale.ini
    # and here override some config
    
    Status: Pending Type: Enhancement 
    opened by acalvo 17
  • Markdown in ERB files

    Markdown in ERB files

    I'm trying to lint a combination of markdown and ERB templating, but I'm finding the ignore syntax isn't working.

    I'm trying to exclude syntax like

    <%= image_tag "#{ENV["BADGE_DOMAIN"]}/sample.svg?status=unknown" %>
    
    and 
    <% for theme in ["slack", "github", "saturn", "flickr", "solarized", "mono"] %>
    
    

    The following config works for the markdown just fine, but doesn't exclude the ERB syntax.

    [formats]
    erb = md
    txt = md
    
    [*.erb]
    TokenIgnores = (<%.*%>), \
                              (<%=.*?%>)
    
    [*]
    Vale.Spelling = error
    

    and the same regex in BlockIgnores also doesn't work.

    Thanks

    Status: Resolved Type: Question 
    opened by plaindocs 15
  • Vale should ignore quoted text in RST

    Vale should ignore quoted text in RST

    • OS (e.g., macOS, Windows, Linux, etc.): Linux
    • Install method (e.g., Go, Homebrew, direct download, etc.): go get
    • Vale version (the result of vale -v): vale version master

    I have some text in a quote block:

      | I have a very large collection
    

    I have added the following configuration:

    SkippedScopes = script, style, pre, figure, blockquote
    

    But vale still complains about the use of very.

    Status: Fixed Type: Bug Type: Markup 
    opened by thedrow 15
  • Spellcheck is testing substrings of URL

    Spellcheck is testing substrings of URL

    After upgrading from 1.7.1 to 2.1.0, Vale is splitting the contents of URLs apart on word boundaries and testing the individual words in spell-check. I've been reading over the spelling style description to see if there were any scope parameters we've been missing, and I don't think there are.

    The branch is docs-aqualls-vale-spelling, and the Spelling.yml file contains:

    extends: spelling
    message: 'Spelling check: "%s"?'
    level: warning
    ignore:
      - gitlab/spelling-exceptions.txt
    

    (Note that in the branch it's warning but I'm modifying it locally to error so the problems are easier to see.)

    Here's the command I run, and the results:

    $ vale --no-wrap --minAlertLevel error doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
    
     doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
     288:82  error  Spelling check: "dev"?     gitlab.Spelling
     675:29  error  Spelling check: "gitlab"?  gitlab.Spelling
     675:70  error  Spelling check: "ee"?      gitlab.Spelling
     693:38  error  Spelling check: "gitlab"?  gitlab.Spelling
     736:5   error  Spelling check: "ee"?      gitlab.Spelling
    

    When I look at gitlab_rails_cheat_sheet.md:

    # Line 675
    Features listed in <https://gitlab.com/gitlab-org/gitlab/blob/master/ee/app/models/license.rb>.
    
    # Line 693
    From [Zendesk ticket #91083](https://gitlab.zendesk.com/agent/tickets/91083) (internal)
    

    At first I thought it was the <…> format of the links, but I've tried converting them over to the more standard Markdown syntax of [link word](url) and I'm still getting the same issue.

    Ideas?

    • OS (e.g., macOS, Windows, Linux, etc.) - MacOS
    • Install method: Homebrew
    • Vale version: 2.1.0
    Status: Resolved Type: Question 
    opened by amyq 14
  • Question: Writing .vale.ini to work around Hugo translations (article.fr.md)

    Question: Writing .vale.ini to work around Hugo translations (article.fr.md)

    We use Hugo and have translated pages living in the same repository as our standard language content. (article.md, article.fr.md, and so on.)

    Most of our Vale rules are specific to the English content (article.md), but some operate on all files.

    I’ve been using a configuration file like this:

    [*.{de,es,fr,it,jp,ru}.md]
    BasedOnStyles = 
    OurStyle.general_rule = YES
    
    [*.md]
    BasedOnStyles = OurStyle
    

    I did it this way to avoid turning off all the rules that don’t apply to the translations. Is this the best way to accomplish this, or is there a better way?

    (Copied from WTD Slack for posterity and visibility.)

    Status: Resolved Type: Question 
    opened by nostodnayr 13
  • [RFC] On regular expression lookarounds

    [RFC] On regular expression lookarounds

    This is one of the most common feature requests / misunderstandings about how Vale's rules work. So, I'd like to take some time to try to get this right—whether that means changing existing functionality or simply improving the documentation on the topic.

    Why things are the way they are

    To provide some background: Vale is written in Go and uses its stdlib regexp package to evaluate all rules. The implementation is based on Google's RE2 library:

    RE2 is a fast, safe, thread-friendly alternative to backtracking regular expression engines like those used in PCRE, Perl, and Python. It is a C++ library.

    If you'd like to learn more about the decisions that went into RE2, the wiki on google/re2 goes into some detail.

    A different take, but not a limitation

    The academics of the issue aside, my stance has always been that I don't want this to be a limitation of Vale; all else equal, I'd rather Vale be a little slower but more capable.

    I've written a lot of general-purpose regex (using many languages) and even more Vale-specific regex, and I've yet to find something that seemed impossible or unnecessarily difficult to implement with Vale in comparison to other tools. This leads me to believe that the problem is more related to documentation than implementation.

    The documentation currently mentions the limitation of Go and links to a blog post that goes into detail about how Vale approaches the problem. But it's clear that this could be explained better.

    Go's stdlib regex engine doesn't support lookarounds, but Vale does

    Vale supports both positive and negative lookarounds. It does so by taking advantage of the YAML wrapper around its rules.

    Positive lookarounds

    The first variation of lookarounds are the positive lookahead and lookbehind assertions:

    • lookahead (x(?=y)): "I want to match x only if it precedes y without matching y."
    • lookbehind ((?<=y)x): "I want to match x only if it is preceded by y without matching y."

    For Vale’s purposes, this should be straightforward to implement:

    extends: existence
    message: "Consider removing 'dialog'."
    level: warning
    ignorecase: true
    tokens:
      - 'dialog (?:box)'
    

    The basic idea here is that you don't have show the end-user every thing that the rule matched; you can use the message to gain control over what you show.

    Negative lookarounds

    The second variation of lookarounds are the negative lookahead and lookbehind assertions:

    • lookahead (x(?!y)): "I want to match x only if it does not precede y.”
    • lookbehind ((?<!y)x): "I want to match x only if it is not preceded by y."

    For Vale’s purposes, these cases can be emulated using substitution checks:

    extends: substitution
    message: "Use '%s' instead of '%s'"
    level: error
    ignorecase: false
    swap:
      '(?:[^\s]*) ?VS Code': Microsoft VS Code
    

    This rule will flag any instance of "VS Code" that isn't preceded by "Microsoft"; it's functionally equivalent to (?<!Micrsoft )VS Code. The key takeaway is that you can write patterns that include the accepted case since Vale will only raise alerts for those that don't match it.

    So, instead of looking for (?<!Micrsoft ) (anything that isn't 'Microsoft'), you can look for anything and Vale will compare it to the user-provided accepted case.

    Feedback

    I know I haven't written rules that cover every possible use case, so I'd be quite interested in seeing examples of rules you either can't implement or find hard to implement without using raw lookarounds.

    @ravlen: I know this specifically came up in your research session. Do you have any thoughts on the existing support or hard-to-implement examples you could share?

    Status: Resolved Type: Docs Type: Enhancement 
    opened by jdkato 12
  • Passing content through stdin doesn't seem to work

    Passing content through stdin doesn't seem to work

    Hello,

    I'm trying to run vale from the command line on Windows 10 and pass text via stdin.

    Running vale against a file vale --config="D:\tools\tmp\vale\.vale.ini" sample.md gets me a correct warning:

    sample.md
     1:1  warning  Use the Oxford comma in a list  base.OxfordComa
                   of three or more items...
    

    But when I try this: vale --config="D:\tools\tmp\vale\.vale.ini" --ext='.md' 'A,B and C' I get no warning whatsoever.

    • OS: Windows 10
    • Install method: direct download
    • Vale version: 2.2.2

    I apologize if it's something obvious that escapes me...

    Thank you, Alex

    Status: Resolved Type: Question 
    opened by AlexJitianu 11
  • Problem with TokenIgnores not ignoring certain content

    Problem with TokenIgnores not ignoring certain content

    I'm currently evaluating using Vale to lint the GitHub documentation at https://github.com/github/docs but I'm running into a problem with TokenIgnores seemingly not ignoring content it should be. I have a minimal repro case at https://github.com/lee-dohm/vale-test. Is there something I'm doing wrong?

    Steps to reproduce

    1. Clone the repo at https://github.com/lee-dohm/vale-test
    2. Execute the command: vale test.md

    Expected: No errors
    Actual: 1 error

    Notice that the first Liquid tag containing the text is flagged as an error, but the second identical Liquid tag on the same line is not.

    Extra info

    • I've created a test case at regex101 that shows that the pattern that I'm using for TokenIgnores is ignoring what I expect, no more, no less
    • Using vale ls-config shows that there doesn't seem to be a parsing error in the configuration file

    Configuration

    • OS: macOS 11.2.1
    • Installation method: Homebrew
    • Vale version: vale version 2.9.1
    documentation Status: Resolved Type: Question 
    opened by lee-dohm 9
  • Vale should ignore xref target (even when the macro has no attribute)

    Vale should ignore xref target (even when the macro has no attribute)

    • OS: Linux
    • Install method: Direct download
    • Vale version: vale version 2.6.8

    .vale.ini

    StylesPath = docs/.vale
    MinAlertLevel = suggestion
    
    [*.adoc]
    BasedOnStyles = test
    

    docs/.vale/test/Substitutions.yml

    extends: substitution
    message: Consider using '%s' instead of '%s'
    level: error
    ignorecase: true
    swap:
      ruby: Ruby
    

    docs/test.adoc

    = Document Title
    
    Head over to xref:ruby.adoc[].
    

    Current result

    $ vale docs/test.adoc
    
     docs/test.adoc
     3:19  error  Consider using 'Ruby' instead   test.Substitutions 
                  of 'ruby
    

    Expected result

    I would expect the target of the xref to be ignored by Vale.

    xref does not necessarily have attribute. In some context, the xref text can be inferred so it's actually a good practice to not explicitly define a cross reference text.

    Status: Resolved Type: Question 
    opened by Mogztter 9
  • Does IgnoreClasses ignore just a DOM element, or a DOM element and all of its children?

    Does IgnoreClasses ignore just a DOM element, or a DOM element and all of its children?

    I'm on macOS 12.5, M1 Pro, vale 2.20.1.

    In my vale.ini, when I specify:

    IgnoredClasses = metrics
    

    I would expect Google style definitions (from https://github.com/errata-ai/Google) to skip processing this HTML:

    <div class="sidebarblock metrics">
    <div class="content">
    <div class="title">Query&#160;metrics:</div>
    <div class="ulist">
    <ul>
    <li>
    <p><strong>&#160;queryTime</strong>: 33ms</p>
    </li>
    </ul>
    </div>
    </div>
    </div>
    </div>
    

    But I still get the error:

    1624:38   error    Put a nonbreaking space         Google.Units       
                       between the number and the                         
                       unit in '33ms'.
    

    Does IgnoredClasses only work on the DOM element where the class is specified, or does it work on the DOM element and its child elements?

    Supplementary question: If IgnoreClasses only works on the DOM element where the class is specified, how can I cause the style rule to be ignored for the child element without introducing Vale on/off comments? That content is machine-generated and must appear unmodified.

    Type: Enhancement 
    opened by faunaee 1
  • Error in substitution rule when encountering term + URL + linebreak + URL

    Error in substitution rule when encountering term + URL + linebreak + URL

    Hi,

    I encountered some unexpected behaviour, which is shown only in a very special situation. I defined a substitution rule, which searches for a simple term:

    extends: substitution
    message: Use '%s' instead of '%s'
    level: error
    swap:
      'term': Term
    

    Then I defined some text, which must be exactly as follow:

    • It must contain the term
    • then a URL containing the same term (can be in the same line as the first term)
    • at least one line break
    • the exact same URL again

    The substitution is unexpectedly reported in the URL, not in the first word "term".

    term                            <- i'd expect the substitution to be applied here, ....
    https://abc.com/term
    
    https://abc.com/term            <- ..., but the substitution is applied here. the word "term" in the URL is reported to be bad
    

    The CLI reports following:

     some-path/error.md
     4:17  error  Use 'Term' instead of 'term'  Rules.test 
    

    The rule works as expected, when you add following change to above example:

    • remove the line break between the two URLs
    • make the URLs different (for example remove an 'a' from any of the URL)
    • remove one of both URLs
    • remove the term from at least one of the both URLs

    Any of above changes lead to following outout (which is correct in my opinion)

     some-path/error.md
     1:1  error  Use 'Term' instead of 'term'  Rules.test 
    

    The issue feels kind of similar to https://github.com/errata-ai/vale/issues/455, but I am not able to tell that for sure.

    Setup

    • macOS Monterey, 12.3.1
    • I installed vale through the nix package manager
    • vale version 2.20.0

    .vale.ini

    StylesPath = styles
    
    [*.md]
    BasedOnStyles = Vale, Rules
    

    Folder Structure

    styles/Rules/test.yml (contains substitution shown above)
    some-path/error.md
    .vale.ini
    

    vale Command

    I execute vale ./some-path/*

    opened by mrjerzy 0
  • Allow linting files with a single style or a subset of styles

    Allow linting files with a single style or a subset of styles

    It would be great if one could run vale on files and provide either a single style or a subset of styles to apply.

    This would help in testing new styles and allows creating reports for a specific violation.

    AFAIK this option is currently not available. I guess one could work around it by creating a specific configuration for running a specific style but that is quite cumbersome in comparison to providing styles as command line options.

    Type: Enhancement 
    opened by MLNW 1
  • Vale spell check affected by surrounding lines

    Vale spell check affected by surrounding lines

    Vale's spell check does not always capture misspellings depending on the surrounding lines. For the following snippet,

    This is a typpo.
    A sentence with [remark-gfm](i-am-a-link).
    A sentence with remark-gfm.
    A sentence with remark-gfm.
    A sentence with gfm.
    A sentence with remark.
    A sentence with remmark.
    
    A sentence with [remark-gfm](i-am-a-link).
    

    We've noticed the following:

    • Line 3 does not trigger a spelling error on gfm unless line 2 is removed and line 3 moves up to line 2.
    • Line 5 does not trigger a spelling error unless a new line is added before it.
    • However, putting a new line before line 5 causes line 2 to stop triggering an error.

    Screen capture of the findings: https://user-images.githubusercontent.com/7747997/178799223-483de64f-e432-4302-b1f5-49203534032a.mp4

    A few screenshots to try to capture the issue:

    • Lines 3, 4, 5, 9 should have an error image
    • Lines 3, 4, 8 should have an error image
    • Lines 2, 3, 4, 10 should have an error image

    We installed vale using Homebrew on macOS. We saw these results in VS code as well as with the Vale CLI. Tested with vale versions 2.15.5 and 2.18.0

    Vale config file, .vale.ini:

    StylesPath = "valestyles"
    MinAlertLevel = suggestion
    Vale.Terms = NO
    [formats]
    [*.md]
    BasedOnStyles = Vale
    
    Type: Bug 
    opened by vtlim 2
  • Multi-document rule support

    Multi-document rule support

    Vale appears to not support multi-document YAML inputs:

    extends: substitution
    message: There may not be an objecti...
    level: error
    ignorecase: true
    swap:
      '(?:perfect|perfected|perfection)': required|necessary|needed|reasonable|agreed|specified|adequate|compliant
    
    ---
    
    extends: substitution
    message: The use of this word could imply ...
    level: error
    ignorecase: true
    swap:
      '(?:experts?|expertise)': skilled|practiced|knowledgeable|proficient|practitioner|consultant|experienced
    

    From this rule, it only picks up the first yaml document.

    Most YAML parsers support reading multi-doc inputs. Could vale leverage this too?

    Type: Enhancement 
    opened by brsolomon-deloitte 0
  • TokenIgnores not working in DITA

    TokenIgnores not working in DITA

    Hi,

    I have the TokenIgnores setting as follows in the .vale.ini:

    [*]
    TokenIgnores = (\[.+\][^(])
    

    This rule should ignore anything wrapped with the square brackets except markdown links. It works for the following content in markdown, but it's not working for the same content in .dita (still reporting errors): [if it rains, i will not go].

    Type: Enhancement 
    opened by jiewang2 3
Releases(v2.20.2)
Owner
errata.ai
Innovative tools for collaborative writing.
errata.ai
Hanan - A terminal that brings out a form for inputs to a program (incomplete)

hanan a terminal that brings out a form for inputs to a program (incomplete) Dev

Bankole Ojo 1 Aug 29, 2022
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

Clement Sam 2.1k Oct 2, 2022
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

Venky 0 Dec 22, 2021
A simple command line tool using which you can skip phone number based SMS verification by using a temporary phone number that acts like a proxy.

Fake-SMS A simple command line tool using which you can skip phone number based SMS verification by using a temporary phone number that acts like a pr

Narasimha Prasanna HN 726 Sep 23, 2022
git-glimpse is a command-line tool that is aimed at generating a git prompt like the one from zsh-vcs-prompt.

Git GoGlimpse git-glimpse is a command-line tool that is aimed at generating a git prompt like the one from zsh-vcs-prompt. The particularity of this

Corentin de Boisset 0 Jan 27, 2022
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

Gruntwork 650 Sep 28, 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. You give git-xargs:

Maxar Infrastructure 1 Feb 5, 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

Moh Achun Armando 0 Dec 18, 2021
Hosty is a command-line utility that allows for fast inspection and editing of /etc/hosts-like files

Hosty Description Hosty is a command-line utility that allows for fast inspection and editing of /etc/hosts-like files. It is written in golang and us

null 11 Sep 3, 2021
dog is a command-line DNS client, like dig.

dog is a command-line DNS client, like dig. It has colourful output, understands normal command-line argument syntax, supports the DNS-over-TLS and DNS-over-HTTPS protocols, and can emit JSON.

Benjamin Sago 4.6k Sep 26, 2022
ls Xtended : A command line utility which lets you navigate through terminal like a pro 😎.

Navigate through terminal like a pro ?? ?? Demo • ⚗️ Installation • ?? Contribution • ❗ Known Issues ❓ Why? It's a pain to cd and ls multiple times to

Souvik 162 Aug 25, 2022
Hasura-fzf - This command has a fzf-like UI that allows you to find and run the file version used by the hasura command

hasura-fzf This command has a fzf-like UI that allows you to find and run the fi

Shoki Hata 4 Jun 25, 2022
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

null 0 Dec 11, 2021
fofax is a fofa query tool written in go, positioned as a command-line tool and characterized by simplicity and speed.

fofaX 0x00 Introduction fofax is a fofa query tool written in go, positioned as

null 461 Sep 24, 2022
Go package to make lightweight ASCII line graph ╭┈╯ in command line apps with no other dependencies.

asciigraph Go package to make lightweight ASCII line graphs ╭┈╯. Installation go get github.com/guptarohit/asciigraph Usage Basic graph package main

Rohit Gupta 2k Sep 22, 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

chenen 0 Jan 16, 2022
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

Geet Sethi 1 Mar 27, 2022
It‘s a cmd-line tool like `make` and `task`, supporting nested args and alias using `cobra`

It‘s a cmd-line tool like `make` and `task`, supporting nested args and alias using `cobra`. It's a makefile alternative and a shell wrapper.

null 2 Apr 14, 2022
I like reading news but I also like the terminal. I am leaning and practicing my go.

I made an api and didn't know how to use it. Screenshots The initial screen when you first run the app. The screen after you specify an id. This app u

Daniel M. Matongo 2 Jan 14, 2022