docs/Lix/contributing/cli-guideline/index.html

2989 lines
93 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Aux Documentation">
<meta name="author" content="Nixpkgs Aux, and Lix Contributors">
<link rel="canonical" href="https://docs.auxolotl.org/Lix/contributing/cli-guideline/">
<link rel="prev" href="../">
<link rel="next" href="../cxx/">
<link rel="icon" href="../../../assets/aux-logo.svg">
<meta name="generator" content="mkdocs-1.6.0, mkdocs-material-9.5.29">
<title>CLI guideline - Aux Docs</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.76a95c52.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.bunny.net/css?family=IBM+Plex+Sans:300,300i,400,400i,700,700i%7CIBM+Plex+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"IBM Plex Sans";--md-code-font:"IBM Plex Mono"}</style>
<script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<meta property="og:type" content="website" >
<meta property="og:title" content="CLI guideline - Aux Docs" >
<meta property="og:description" content="Aux Documentation" >
<meta property="og:image" content="https://docs.auxolotl.org/assets/images/social/Lix/contributing/cli-guideline.png" >
<meta property="og:image:type" content="image/png" >
<meta property="og:image:width" content="1200" >
<meta property="og:image:height" content="630" >
<meta property="og:url" content="https://docs.auxolotl.org/Lix/contributing/cli-guideline/" >
<meta name="twitter:card" content="summary_large_image" >
<meta name="twitter:title" content="CLI guideline - Aux Docs" >
<meta name="twitter:description" content="Aux Documentation" >
<meta name="twitter:image" content="https://docs.auxolotl.org/assets/images/social/Lix/contributing/cli-guideline.png" >
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="blue">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#cli-guideline" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../../.." title="Aux Docs" class="md-header__button md-logo" aria-label="Aux Docs" data-md-component="logo">
<img src="../../../assets/aux-logo.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Aux Docs
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
CLI guideline
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="blue" aria-label="Dark Mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Dark Mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3 3.19.09m3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95 2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31Z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="indigo" data-md-color-accent="blue" aria-label="Light Mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Light Mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5c-.84 0-1.65.15-2.39.42L12 2M3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29L3.34 7m.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14L3.36 17M20.65 7l-1.77 3.79a7.023 7.023 0 0 0-2.38-4.15l4.15.36m-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29L20.64 17M12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44L12 22Z"/></svg>
</label>
</form>
<script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://git.auxolotl.org/auxolotl/docs" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.076 7.076 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422 2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24 2.9 2.9 0 0 1 5.8 18.57V8.589a7.109 7.109 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0ZM7.223 19.905a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Zm9.554-10.464a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.39Zm0-7.735a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Z"/></svg>
</div>
<div class="md-source__repository">
auxolotl/docs
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../.." class="md-tabs__link">
Aux Documentation Hub
</a>
</li>
<li class="md-tabs__item">
<a href="../../../TODO/" class="md-tabs__link">
TODO
</a>
</li>
<li class="md-tabs__item">
<a href="../../../Aux/" class="md-tabs__link">
Aux
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../../" class="md-tabs__link">
Lix
</a>
</li>
<li class="md-tabs__item">
<a href="../../../NixOS/appstream/" class="md-tabs__link">
NixOS
</a>
</li>
<li class="md-tabs__item">
<a href="../../../Nixpkgs/" class="md-tabs__link">
Nixpkgs
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../../.." title="Aux Docs" class="md-nav__button md-logo" aria-label="Aux Docs" data-md-component="logo">
<img src="../../../assets/aux-logo.svg" alt="logo">
</a>
Aux Docs
</label>
<div class="md-nav__source">
<a href="https://git.auxolotl.org/auxolotl/docs" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.076 7.076 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422 2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24 2.9 2.9 0 0 1 5.8 18.57V8.589a7.109 7.109 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0ZM7.223 19.905a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Zm9.554-10.464a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.39Zm0-7.735a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Z"/></svg>
</div>
<div class="md-source__repository">
auxolotl/docs
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../.." class="md-nav__link">
<span class="md-ellipsis">
Aux Documentation Hub
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../TODO/" class="md-nav__link">
<span class="md-ellipsis">
TODO
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../Aux/" class="md-nav__link">
<span class="md-ellipsis">
Aux
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked>
<div class="md-nav__link md-nav__container">
<a href="../../" class="md-nav__link ">
<span class="md-ellipsis">
Lix
</span>
</a>
<label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Lix
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../glossary/" class="md-nav__link">
<span class="md-ellipsis">
Glossary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../quick-start/" class="md-nav__link">
<span class="md-ellipsis">
Quick Start
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Advanced-Topics/" class="md-nav__link">
<span class="md-ellipsis">
Advanced Topics
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Command-Reference/" class="md-nav__link">
<span class="md-ellipsis">
Command Reference
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Package-Management/" class="md-nav__link">
<span class="md-ellipsis">
Package Management
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../architecture/" class="md-nav__link">
<span class="md-ellipsis">
Architecture
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_8" checked>
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
Contributing
</span>
</a>
<label class="md-nav__link " for="__nav_4_8" id="__nav_4_8_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_8_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_4_8">
<span class="md-nav__icon md-icon"></span>
Contributing
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
CLI guideline
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
CLI guideline
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#goals" class="md-nav__link">
<span class="md-ellipsis">
Goals
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#overview" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#naming-the-commands" class="md-nav__link">
<span class="md-ellipsis">
Naming the COMMANDS
</span>
</a>
<nav class="md-nav" aria-label="Naming the COMMANDS">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#naming-rules" class="md-nav__link">
<span class="md-ellipsis">
Naming rules
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#classification" class="md-nav__link">
<span class="md-ellipsis">
Classification
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#help-is-essential" class="md-nav__link">
<span class="md-ellipsis">
Help is essential
</span>
</a>
<nav class="md-nav" aria-label="Help is essential">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#looking-for-help" class="md-nav__link">
<span class="md-ellipsis">
Looking for help
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#anticipate-where-help-is-needed" class="md-nav__link">
<span class="md-ellipsis">
Anticipate where help is needed
</span>
</a>
<nav class="md-nav" aria-label="Anticipate where help is needed">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#shell-completion" class="md-nav__link">
<span class="md-ellipsis">
Shell completion
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#wrong-input" class="md-nav__link">
<span class="md-ellipsis">
Wrong input
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#next-steps" class="md-nav__link">
<span class="md-ellipsis">
Next steps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#educate-the-user" class="md-nav__link">
<span class="md-ellipsis">
Educate the user
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#input" class="md-nav__link">
<span class="md-ellipsis">
Input
</span>
</a>
<nav class="md-nav" aria-label="Input">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#naming-the-options" class="md-nav__link">
<span class="md-ellipsis">
Naming the OPTIONS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#prompt-when-input-not-provided" class="md-nav__link">
<span class="md-ellipsis">
Prompt when input not provided
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#output" class="md-nav__link">
<span class="md-ellipsis">
Output
</span>
</a>
<nav class="md-nav" aria-label="Output">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#follow-best-practices" class="md-nav__link">
<span class="md-ellipsis">
Follow best practices
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#errors-wip" class="md-nav__link">
<span class="md-ellipsis">
Errors (WIP)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#not-only-for-humans" class="md-nav__link">
<span class="md-ellipsis">
Not only for humans
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#returning-future-proof-json" class="md-nav__link">
<span class="md-ellipsis">
Returning future proof JSON
</span>
</a>
<nav class="md-nav" aria-label="Returning future proof JSON">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#examples" class="md-nav__link">
<span class="md-ellipsis">
Examples
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#dialog-with-the-user" class="md-nav__link">
<span class="md-ellipsis">
Dialog with the user
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#text-alignment" class="md-nav__link">
<span class="md-ellipsis">
Text alignment
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#dim-bright" class="md-nav__link">
<span class="md-ellipsis">
Dim / Bright
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#colors" class="md-nav__link">
<span class="md-ellipsis">
Colors
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#special-unicode-characters" class="md-nav__link">
<span class="md-ellipsis">
Special (Unicode) characters
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#emojis" class="md-nav__link">
<span class="md-ellipsis">
Emojis
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#tables" class="md-nav__link">
<span class="md-ellipsis">
Tables
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#interactive-output" class="md-nav__link">
<span class="md-ellipsis">
Interactive output
</span>
</a>
<nav class="md-nav" aria-label="Interactive output">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#progress" class="md-nav__link">
<span class="md-ellipsis">
Progress
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#search" class="md-nav__link">
<span class="md-ellipsis">
Search
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#prompt" class="md-nav__link">
<span class="md-ellipsis">
Prompt
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#verbosity" class="md-nav__link">
<span class="md-ellipsis">
Verbosity
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#appendix-1-commands-naming-exceptions" class="md-nav__link">
<span class="md-ellipsis">
Appendix 1: Commands naming exceptions
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../cxx/" class="md-nav__link">
<span class="md-ellipsis">
C++ style guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../experimental-features/" class="md-nav__link">
<span class="md-ellipsis">
What are experimental features?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../hacking/" class="md-nav__link">
<span class="md-ellipsis">
Hacking
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../testing/" class="md-nav__link">
<span class="md-ellipsis">
Running tests
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../installation/" class="md-nav__link">
<span class="md-ellipsis">
Installation
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../language/" class="md-nav__link">
<span class="md-ellipsis">
Language
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../protocols/" class="md-nav__link">
<span class="md-ellipsis">
Protocols
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../release-notes/" class="md-nav__link">
<span class="md-ellipsis">
Release notes
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../NixOS/appstream/" class="md-nav__link">
<span class="md-ellipsis">
NixOS
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../Nixpkgs/" class="md-nav__link">
<span class="md-ellipsis">
Nixpkgs
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#goals" class="md-nav__link">
<span class="md-ellipsis">
Goals
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#overview" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#naming-the-commands" class="md-nav__link">
<span class="md-ellipsis">
Naming the COMMANDS
</span>
</a>
<nav class="md-nav" aria-label="Naming the COMMANDS">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#naming-rules" class="md-nav__link">
<span class="md-ellipsis">
Naming rules
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#classification" class="md-nav__link">
<span class="md-ellipsis">
Classification
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#help-is-essential" class="md-nav__link">
<span class="md-ellipsis">
Help is essential
</span>
</a>
<nav class="md-nav" aria-label="Help is essential">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#looking-for-help" class="md-nav__link">
<span class="md-ellipsis">
Looking for help
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#anticipate-where-help-is-needed" class="md-nav__link">
<span class="md-ellipsis">
Anticipate where help is needed
</span>
</a>
<nav class="md-nav" aria-label="Anticipate where help is needed">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#shell-completion" class="md-nav__link">
<span class="md-ellipsis">
Shell completion
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#wrong-input" class="md-nav__link">
<span class="md-ellipsis">
Wrong input
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#next-steps" class="md-nav__link">
<span class="md-ellipsis">
Next steps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#educate-the-user" class="md-nav__link">
<span class="md-ellipsis">
Educate the user
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#input" class="md-nav__link">
<span class="md-ellipsis">
Input
</span>
</a>
<nav class="md-nav" aria-label="Input">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#naming-the-options" class="md-nav__link">
<span class="md-ellipsis">
Naming the OPTIONS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#prompt-when-input-not-provided" class="md-nav__link">
<span class="md-ellipsis">
Prompt when input not provided
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#output" class="md-nav__link">
<span class="md-ellipsis">
Output
</span>
</a>
<nav class="md-nav" aria-label="Output">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#follow-best-practices" class="md-nav__link">
<span class="md-ellipsis">
Follow best practices
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#errors-wip" class="md-nav__link">
<span class="md-ellipsis">
Errors (WIP)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#not-only-for-humans" class="md-nav__link">
<span class="md-ellipsis">
Not only for humans
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#returning-future-proof-json" class="md-nav__link">
<span class="md-ellipsis">
Returning future proof JSON
</span>
</a>
<nav class="md-nav" aria-label="Returning future proof JSON">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#examples" class="md-nav__link">
<span class="md-ellipsis">
Examples
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#dialog-with-the-user" class="md-nav__link">
<span class="md-ellipsis">
Dialog with the user
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#text-alignment" class="md-nav__link">
<span class="md-ellipsis">
Text alignment
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#dim-bright" class="md-nav__link">
<span class="md-ellipsis">
Dim / Bright
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#colors" class="md-nav__link">
<span class="md-ellipsis">
Colors
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#special-unicode-characters" class="md-nav__link">
<span class="md-ellipsis">
Special (Unicode) characters
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#emojis" class="md-nav__link">
<span class="md-ellipsis">
Emojis
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#tables" class="md-nav__link">
<span class="md-ellipsis">
Tables
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#interactive-output" class="md-nav__link">
<span class="md-ellipsis">
Interactive output
</span>
</a>
<nav class="md-nav" aria-label="Interactive output">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#progress" class="md-nav__link">
<span class="md-ellipsis">
Progress
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#search" class="md-nav__link">
<span class="md-ellipsis">
Search
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#prompt" class="md-nav__link">
<span class="md-ellipsis">
Prompt
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#verbosity" class="md-nav__link">
<span class="md-ellipsis">
Verbosity
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#appendix-1-commands-naming-exceptions" class="md-nav__link">
<span class="md-ellipsis">
Appendix 1: Commands naming exceptions
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="cli-guideline">CLI guideline</h1>
<h3 id="goals">Goals</h3>
<p>Purpose of this document is to provide a clear direction to <strong>help design
delightful command line</strong> experience. This document contains guidelines to
follow to ensure a consistent and approachable user experience.</p>
<h3 id="overview">Overview</h3>
<p><code>nix</code> command provides a single entry to a number of sub-commands that help
<strong>developers and system administrators</strong> in the life-cycle of a software
project. We particularly need to pay special attention to help and assist new
users of Lix.</p>
<h2 id="naming-the-commands">Naming the <code>COMMANDS</code></h2>
<p>Words matter. Naming is an important part of the usability. Users will be
interacting with Lix on a regular basis so we should <strong>name things for ease of
understanding</strong>.</p>
<p>We recommend following the <a href="https://en.wikipedia.org/wiki/Principle_of_least_astonishment">Principle of Least
Astonishment</a>.
This means that you should <strong>never use acronyms or abbreviations</strong> unless they
are commonly used in other tools (e.g. <code>nix init</code>). And if the command name is
too long (&gt; 10-12 characters) then shortening it makes sense (e.g.
“prioritization” → “priority”).</p>
<p>Commands should <strong>follow a noun-verb dialogue</strong>. Although noun-verb formatting
seems backwards from a speaking perspective (i.e. <code>nix store copy</code> vs. <code>nix
copy store</code>) it allows us to organize commands the same way users think about
completing an action (the group first, then the command).</p>
<h3 id="naming-rules">Naming rules</h3>
<p>Rules are there to guide you by limiting your options. But not everything can
fit the rules all the time. In those cases document the exceptions in <a href="#appendix-1-commands-naming-exceptions">Appendix
1: Commands naming exceptions</a> and
provide reason. The rules want to force a Nix developer to look, not just at
the command at hand, but also the command in a full context alongside other
<code>nix</code> commands.</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix<span class="w"> </span><span class="o">[</span>&lt;GROUP&gt;<span class="o">]</span><span class="w"> </span>&lt;COMMAND&gt;<span class="w"> </span><span class="o">[</span>&lt;ARGUMENTS&gt;<span class="o">]</span><span class="w"> </span><span class="o">[</span>&lt;OPTIONS&gt;<span class="o">]</span>
</code></pre></div>
<ul>
<li><code>GROUP</code>, <code>COMMAND</code>, <code>ARGUMENTS</code> and <code>OPTIONS</code> should be lowercase and in a
singular form.</li>
<li><code>GROUP</code> should be a <strong>NOUN</strong>.</li>
<li><code>COMMAND</code> should be a <strong>VERB</strong>.</li>
<li><code>ARGUMENTS</code> and <code>OPTIONS</code> are discussed in <a href="#input"><em>Input</em> section</a>.</li>
</ul>
<h3 id="classification">Classification</h3>
<p>Some commands are more important, some less. While we want all of our commands
to be perfect we can only spend limited amount of time testing and improving
them.</p>
<p>This classification tries to separate commands in 3 categories in terms of
their importance in regards to the new users. Users who are likely to be
impacted the most by bad user experience.</p>
<ul>
<li><strong>Main commands</strong></li>
</ul>
<p>Commands used for our main use cases and most likely used by new users. We
expect attention to details, such as:</p>
<div class="highlight"><pre><span></span><code>- Proper use of [colors](#colors), [emojis](#special-unicode-characters)
and [aligning of text](#text-alignment).
- [Autocomplete](#shell-completion) of options.
- Show [next possible steps](#next-steps).
- Showing some [“tips”](#educate-the-user) when running logs running tasks
(eg. building / downloading) in order to teach users interesting bits of
Nix ecosystem.
- [Help pages](#help-is-essential) to be as good as we can write them
pointing to external documentation and tutorials for more.
</code></pre></div>
<p>Examples of such commands: <code>nix init</code>, <code>nix develop</code>, <code>nix build</code>, <code>nix run</code>,
...</p>
<ul>
<li><strong>Infrequently used commands</strong></li>
</ul>
<p>From infrequently used commands we expect less attention to details, but
still some:</p>
<div class="highlight"><pre><span></span><code>- Proper use of [colors](#colors), [emojis](#special-unicode-characters)
and [aligning of text](#text-alignment).
- [Autocomplete](#shell-completion) of options.
</code></pre></div>
<p>Examples of such commands: <code>nix doctor</code>, <code>nix edit</code>, <code>nix eval</code>, ...</p>
<ul>
<li><strong>Utility and scripting commands</strong></li>
</ul>
<p>Commands that expose certain internal functionality of <code>nix</code>, mostly used by
other scripts.</p>
<div class="highlight"><pre><span></span><code>- [Autocomplete](#shell-completion) of options.
</code></pre></div>
<p>Examples of such commands: <code>nix store copy</code>, <code>nix hash base16</code>, <code>nix store
ping</code>, ...</p>
<h2 id="help-is-essential">Help is essential</h2>
<p>Help should be built into your command line so that new users can gradually
discover new features when they need them.</p>
<h3 id="looking-for-help">Looking for help</h3>
<p>Since there is no standard way how user will look for help we rely on ways help
is provided by commonly used tools. As a guide for this we took <code>git</code> and
whenever in doubt look at it as a preferred direction.</p>
<p>The rules are:</p>
<ul>
<li>Help is shown by using <code>--help</code> or <code>help</code> command (eg <code>nix</code> <code>--``help</code> or
<code>nix help</code>).</li>
<li>For non-COMMANDs (eg. <code>nix</code> <code>--``help</code> and <code>nix store</code> <code>--``help</code>) we <strong>show
a summary</strong> of most common use cases. Summary is presented on the STDOUT
without any use of PAGER.</li>
<li>For COMMANDs (eg. <code>nix init</code> <code>--``help</code> or <code>nix help init</code>) we display the
man page of that command. By default the PAGER is used (as in <code>git</code>).</li>
<li>At the end of either summary or man page there should be an URL pointing to
an online version of more detailed documentation.</li>
<li>The structure of summaries and man pages should be the same as in <code>git</code>.</li>
</ul>
<h3 id="anticipate-where-help-is-needed">Anticipate where help is needed</h3>
<p>Even better then requiring the user to search for help is to anticipate and
predict when user might need it. Either because the lack of discoverability,
typo in the input or simply taking the opportunity to teach the user of
interesting - but less visible - details.</p>
<h4 id="shell-completion">Shell completion</h4>
<p>This type of help is most common and almost expected by users. We need to
<strong>provide the best shell completion</strong> for <code>bash</code>, <code>zsh</code> and <code>fish</code>.</p>
<p>Completion needs to be <strong>context aware</strong>, this mean when a user types:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix<span class="w"> </span>build<span class="w"> </span>n&lt;TAB&gt;
</code></pre></div>
<p>we need to display a list of flakes starting with <code>n</code>.</p>
<h4 id="wrong-input">Wrong input</h4>
<p>As we all know we humans make mistakes, all the time. When a typo - intentional
or unintentional - is made, we should prompt for closest possible options or
point to the documentation which would educate user to not make the same
errors. Here are few examples:</p>
<p>In first example we prompt the user for typing wrong command name:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix<span class="w"> </span>int
------------------------------------------------------------------------
<span class="w"> </span>Error!<span class="w"> </span>Command<span class="w"> </span><span class="sb">`</span>int<span class="sb">`</span><span class="w"> </span>not<span class="w"> </span>found.
------------------------------------------------------------------------
<span class="w"> </span>Did<span class="w"> </span>you<span class="w"> </span>mean:
<span class="w"> </span><span class="p">|</span>&gt;<span class="w"> </span>nix<span class="w"> </span>init
<span class="w"> </span><span class="p">|</span>&gt;<span class="w"> </span>nix<span class="w"> </span>input
</code></pre></div>
<p>Sometimes users will make mistake either because of a typo or simply because of
lack of discoverability. Our handling of this cases needs to be context
sensitive.</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix<span class="w"> </span>init<span class="w"> </span>--template<span class="o">=</span>template#pyton
------------------------------------------------------------------------
<span class="w"> </span>Error!<span class="w"> </span>Template<span class="w"> </span><span class="sb">`</span>template#pyton<span class="sb">`</span><span class="w"> </span>not<span class="w"> </span>found.
------------------------------------------------------------------------
Initializing<span class="w"> </span>Nix<span class="w"> </span>project<span class="w"> </span>at<span class="w"> </span><span class="sb">`</span>/path/to/here<span class="sb">`</span>.
<span class="w"> </span>Select<span class="w"> </span>a<span class="w"> </span>template<span class="w"> </span><span class="k">for</span><span class="w"> </span>you<span class="w"> </span>new<span class="w"> </span>project:
<span class="w"> </span><span class="p">|</span>&gt;<span class="w"> </span>template#python
<span class="w"> </span>template#python-pip
<span class="w"> </span>template#python-poetry
</code></pre></div>
<h4 id="next-steps">Next steps</h4>
<p>It can be invaluable to newcomers to show what a possible next steps and what
is the usual development workflow with Lix. For example:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix<span class="w"> </span>init<span class="w"> </span>--template<span class="o">=</span>template#python
Initializing<span class="w"> </span>project<span class="w"> </span><span class="sb">`</span>template#python<span class="sb">`</span>
<span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="sb">`</span>/home/USER/dev/new-project<span class="sb">`</span>
<span class="w"> </span>Next<span class="w"> </span>steps
<span class="w"> </span><span class="p">|</span>&gt;<span class="w"> </span>nix<span class="w"> </span>develop<span class="w"> </span>--<span class="w"> </span>to<span class="w"> </span>enter<span class="w"> </span>development<span class="w"> </span>environment
<span class="w"> </span><span class="p">|</span>&gt;<span class="w"> </span>nix<span class="w"> </span>build<span class="w"> </span>--<span class="w"> </span>to<span class="w"> </span>build<span class="w"> </span>your<span class="w"> </span>project
</code></pre></div>
<h4 id="educate-the-user">Educate the user</h4>
<p>We should take any opportunity to <strong>educate users</strong>, but at the same time we
must <strong>be very very careful to not annoy users</strong>. There is a thin line between
being helpful and being annoying.</p>
<p>An example of educating users might be to provide <em>Tips</em> in places where they
are waiting.</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix<span class="w"> </span>build
<span class="w"> </span>Started<span class="w"> </span>building<span class="w"> </span>my-project<span class="w"> </span><span class="m">1</span>.2.3
<span class="w"> </span>Downloaded<span class="w"> </span>python3.8-poetry<span class="w"> </span><span class="m">1</span>.2.3<span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="m">5</span>.3<span class="w"> </span>seconds
<span class="w"> </span>Downloaded<span class="w"> </span>python3.8-requests<span class="w"> </span><span class="m">1</span>.2.3<span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="m">5</span>.3<span class="w"> </span>seconds
------------------------------------------------------------------------
<span class="w"> </span>Press<span class="w"> </span><span class="sb">`</span>v<span class="sb">`</span><span class="w"> </span>to<span class="w"> </span>increase<span class="w"> </span>logs<span class="w"> </span>verbosity
<span class="w"> </span><span class="p">|</span>&gt;<span class="w"> </span><span class="sb">`</span>?<span class="sb">`</span><span class="w"> </span>to<span class="w"> </span>see<span class="w"> </span>other<span class="w"> </span>options
------------------------------------------------------------------------
<span class="w"> </span>Learn<span class="w"> </span>something<span class="w"> </span>new<span class="w"> </span>with<span class="w"> </span>every<span class="w"> </span>build...
<span class="w"> </span><span class="p">|</span>&gt;<span class="w"> </span>See<span class="w"> </span>last<span class="w"> </span>logs<span class="w"> </span>of<span class="w"> </span>a<span class="w"> </span>build<span class="w"> </span>with<span class="w"> </span><span class="sb">`</span>nix<span class="w"> </span>log<span class="w"> </span>--last<span class="sb">`</span><span class="w"> </span>command.
------------------------------------------------------------------------
<span class="w"> </span>Evaluated<span class="w"> </span>my-project<span class="w"> </span><span class="m">1</span>.2.3<span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="m">14</span>.43<span class="w"> </span>seconds
Downloading<span class="w"> </span><span class="o">[</span><span class="m">12</span><span class="w"> </span>/<span class="w"> </span><span class="m">200</span><span class="o">]</span>
<span class="w"> </span><span class="p">|</span>&gt;<span class="w"> </span>firefox<span class="w"> </span><span class="m">1</span>.2.3<span class="w"> </span><span class="o">[</span><span class="c1">#########&gt; ] 10Mb/s | 2min left</span>
<span class="w"> </span>Building<span class="w"> </span><span class="o">[</span><span class="m">2</span><span class="w"> </span>/<span class="w"> </span><span class="m">20</span><span class="o">]</span>
<span class="w"> </span><span class="p">|</span>&gt;<span class="w"> </span>glibc<span class="w"> </span><span class="m">1</span>.2.3<span class="w"> </span>-&gt;<span class="w"> </span>buildPhase:<span class="w"> </span>&lt;last<span class="w"> </span>log<span class="w"> </span>line&gt;
------------------------------------------------------------------------
</code></pre></div>
<p>Now <strong>Learn</strong> part of the output is where you educate users. You should only
show it when you know that a build will take some time and not annoy users of
the builds that take only few seconds.</p>
<p>Every feature like this should go through an intensive review and testing to
collect as much feedback as possible and to fine tune every little detail. If
done right this can be an awesome features beginners and advance users will
love, but if not done perfectly it will annoy users and leave bad impression.</p>
<h2 id="input">Input</h2>
<p>Input to a command is provided via <code>ARGUMENTS</code> and <code>OPTIONS</code>.</p>
<p><code>ARGUMENTS</code> represent a required input for a function. When choosing to use
<code>ARGUMENTS</code> over <code>OPTIONS</code> please be aware of the downsides that come with it:</p>
<ul>
<li>User will need to remember the order of <code>ARGUMENTS</code>. This is not a problem if
there is only one <code>ARGUMENT</code>.</li>
<li>With <code>OPTIONS</code> it is possible to provide much better auto completion.</li>
<li>With <code>OPTIONS</code> it is possible to provide much better error message.</li>
<li>Using <code>OPTIONS</code> it will mean there is a little bit more typing.</li>
</ul>
<p>We dont discourage the use of <code>ARGUMENTS</code>, but simply want to make every
developer consider the downsides and choose wisely.</p>
<h3 id="naming-the-options">Naming the <code>OPTIONS</code></h3>
<p>The only naming convention - apart from the ones mentioned in Naming the
<code>COMMANDS</code> section is how flags are named.</p>
<p>Flags are a type of <code>OPTION</code> that represent an option that can be turned ON of
OFF. We can say <strong>flags are boolean type of</strong> <code>**OPTION**</code>.</p>
<p>Here are few examples of flag <code>OPTIONS</code>:</p>
<ul>
<li><code>--colors</code> vs. <code>--no-colors</code> (showing colors in the output)</li>
<li><code>--emojis</code> vs. <code>--no-emojis</code> (showing emojis in the output)</li>
</ul>
<h3 id="prompt-when-input-not-provided">Prompt when input not provided</h3>
<p>For <em>main commands</em> (as <a href="#classification">per classification</a>) we want command
to improve the discoverability of possible input. A new user will most likely
not know which <code>ARGUMENTS</code> and <code>OPTIONS</code> are required or which values are
possible for those options.</p>
<p>In case the user does not provide the input or they provide wrong input,
rather than show the error, prompt a user with an option to find and select
correct input (see examples).</p>
<p>Prompting is of course not required when TTY is not attached to STDIN. This
would mean that scripts won't need to handle prompt, but rather handle errors.</p>
<p>A place to use prompt and provide user with interactive select</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix<span class="w"> </span>init
Initializing<span class="w"> </span>Nix<span class="w"> </span>project<span class="w"> </span>at<span class="w"> </span><span class="sb">`</span>/path/to/here<span class="sb">`</span>.
<span class="w"> </span>Select<span class="w"> </span>a<span class="w"> </span>template<span class="w"> </span><span class="k">for</span><span class="w"> </span>you<span class="w"> </span>new<span class="w"> </span>project:
<span class="w"> </span><span class="p">|</span>&gt;<span class="w"> </span>py
<span class="w"> </span>template#python-pip
<span class="w"> </span>template#python-poetry
<span class="w"> </span><span class="o">[</span><span class="w"> </span>Showing<span class="w"> </span><span class="m">2</span><span class="w"> </span>templates<span class="w"> </span>from<span class="w"> </span><span class="m">1345</span><span class="w"> </span>templates<span class="w"> </span><span class="o">]</span>
</code></pre></div>
<p>Another great place to add prompts are <strong>confirmation dialogues for dangerous
actions</strong>. For example when adding new substitutor via <code>OPTIONS</code> or via
<code>flake.nix</code> we should prompt - for the first time - and let user review what is
going to happen.</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix<span class="w"> </span>build<span class="w"> </span>--option<span class="w"> </span>substitutors<span class="w"> </span>https://cache.example.org
------------------------------------------------------------------------
<span class="w"> </span>Warning!<span class="w"> </span>A<span class="w"> </span>security<span class="w"> </span>related<span class="w"> </span>question<span class="w"> </span>needs<span class="w"> </span>to<span class="w"> </span>be<span class="w"> </span>answered.
------------------------------------------------------------------------
<span class="w"> </span>The<span class="w"> </span>following<span class="w"> </span>substitutors<span class="w"> </span>will<span class="w"> </span>be<span class="w"> </span>used<span class="w"> </span>to<span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="sb">`</span>my-project<span class="sb">`</span>:
<span class="w"> </span>-<span class="w"> </span>https://cache.example.org
<span class="w"> </span>Do<span class="w"> </span>you<span class="w"> </span>allow<span class="w"> </span><span class="sb">`</span>my-project<span class="sb">`</span><span class="w"> </span>to<span class="w"> </span>use<span class="w"> </span>above<span class="w"> </span>mentioned<span class="w"> </span>substitutors?
<span class="w"> </span><span class="o">[</span>y/N<span class="o">]</span><span class="w"> </span><span class="p">|</span>&gt;<span class="w"> </span>y
</code></pre></div>
<h2 id="output">Output</h2>
<p>Terminal output can be quite limiting in many ways. Which should force us to
think about the experience even more. As with every design the output is a
compromise between being terse and being verbose, between showing help to
beginners and annoying advance users. For this it is important that we know
what are the priorities.</p>
<p>Lix command line should be first and foremost written with beginners in mind.
But users won't stay beginners for long and what was once useful might quickly
become annoying. There is no golden rule that we can give in this guideline
that would make it easier how to draw a line and find best compromise.</p>
<p>What we would encourage is to <strong>build prototypes</strong>, do some <strong>user testing</strong>
and collect <strong>feedback</strong>. Then repeat the cycle few times.</p>
<p>First design the <em>happy path</em> and only after your iron it out, continue to work
on <strong>edge cases</strong> (handling and displaying errors, changes of the output by
certain <code>OPTIONS</code>, etc…)</p>
<h3 id="follow-best-practices">Follow best practices</h3>
<p>Needless to say we Lix must be a good citizen and follow best practices in
command line.</p>
<p>In short: <strong>STDOUT is for output, STDERR is for (human) messaging.</strong></p>
<p>STDOUT and STDERR provide a way for you to output messages to the user while
also allowing them to redirect content to a file. For example:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix<span class="w"> </span>build<span class="w"> </span>&gt;<span class="w"> </span>build.txt
------------------------------------------------------------------------
<span class="w"> </span>Error!<span class="w"> </span>Attribute<span class="w"> </span><span class="sb">`</span>bin<span class="sb">`</span><span class="w"> </span>missing<span class="w"> </span>at<span class="w"> </span><span class="o">(</span><span class="m">1</span>:94<span class="o">)</span><span class="w"> </span>from<span class="w"> </span>string.
------------------------------------------------------------------------
<span class="w"> </span><span class="m">1</span><span class="p">|</span><span class="w"> </span>with<span class="w"> </span>import<span class="w"> </span>&lt;nixpkgs&gt;<span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="o">}</span><span class="p">;</span><span class="w"> </span><span class="o">(</span>pkgs.runCommandCC<span class="w"> </span>or<span class="w"> </span>pkgs.runCommand<span class="o">)</span><span class="w"> </span><span class="s2">&quot;shell&quot;</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="nv">buildInputs</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">[</span><span class="w"> </span><span class="o">(</span>surge.bin<span class="o">)</span><span class="w"> </span><span class="o">]</span><span class="p">;</span><span class="w"> </span><span class="o">}</span><span class="w"> </span><span class="s2">&quot;&quot;</span>
</code></pre></div>
<p>Because this warning is on STDERR, it doesnt end up in the file.</p>
<p>But not everything on STDERR is an error though. For example, you can run <code>nix
build</code> and collect logs in a file while still seeing the progress.</p>
<div class="highlight"><pre><span></span><code>$ nix build &gt; build.txt
Evaluated 1234 files in 1.2 seconds
Downloaded python3.8-poetry 1.2.3 in 5.3 seconds
Downloaded python3.8-requests 1.2.3 in 5.3 seconds
------------------------------------------------------------------------
Press `v` to increase logs verbosity
|&gt; `?` to see other options
------------------------------------------------------------------------
Learn something new with every build...
|&gt; See last logs of a build with `nix log --last` command.
------------------------------------------------------------------------
Evaluated my-project 1.2.3 in 14.43 seconds
Downloading [12 / 200]
|&gt; firefox 1.2.3 [#########&gt; ] 10Mb/s | 2min left
Building [2 / 20]
|&gt; glibc 1.2.3 -&gt; buildPhase: &lt;last log line&gt;
------------------------------------------------------------------------
</code></pre></div>
<h3 id="errors-wip">Errors (WIP)</h3>
<p><strong>TODO</strong>: Once we have implementation for the <em>happy path</em> then we will think
how to present errors.</p>
<h3 id="not-only-for-humans">Not only for humans</h3>
<p>Terse, machine-readable output formats can also be useful but shouldnt get in
the way of making beautiful CLI output. When needed, commands should offer a
<code>--json</code> flag to allow users to easily parse and script the CLI.</p>
<p>When TTY is not detected on STDOUT we should remove all design elements (no
colors, no emojis and using ASCII instead of Unicode symbols). The same should
happen when TTY is not detected on STDERR. We should not display progress /
status section, but only print warnings and errors.</p>
<h3 id="returning-future-proof-json">Returning future proof JSON</h3>
<p>The schema of JSON output should allow for backwards compatible extension. This section explains how to achieve this.</p>
<p>Two definitions are helpful here, because while JSON only defines one "key-value"
object type, we use it to cover two use cases:</p>
<ul>
<li><strong>dictionary</strong>: a map from names to value that all have the same type. In
C++ this would be a <code>std::map</code> with string keys.</li>
<li><strong>record</strong>: a fixed set of attributes each with their own type. In C++, this
would be represented by a <code>struct</code>.</li>
</ul>
<p>It is best not to mix these use cases, as that may lead to incompatibilities when the schema changes. For example, adding a record field to a dictionary breaks consumers that assume all JSON object fields to have the same meaning and type.</p>
<p>This leads to the following guidelines:</p>
<ul>
<li>The top-level (root) value must be a record.</li>
</ul>
<p>Otherwise, one can not change the structure of a command's output.</p>
<ul>
<li>The value of a dictionary item must be a record.</li>
</ul>
<p>Otherwise, the item type can not be extended.</p>
<ul>
<li>List items should be records.</li>
</ul>
<p>Otherwise, one can not change the structure of the list items.</p>
<p>If the order of the items does not matter, and each item has a unique key that is a string, consider representing the list as a dictionary instead. If the order of the items needs to be preserved, return a list of records.</p>
<ul>
<li>Streaming JSON should return records.</li>
</ul>
<p>An example of a streaming JSON format is <a href="https://jsonlines.org/">JSON lines</a>, where each line represents a JSON value. These JSON values can be considered top-level values or list items, and they must be records.</p>
<h4 id="examples">Examples</h4>
<p>This is bad, because all keys must be assumed to be store implementations:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;local&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="err">...</span><span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="nt">&quot;remote&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="err">...</span><span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="nt">&quot;http&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="err">...</span><span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</code></pre></div>
<p>This is good, because the it is extensible at the root, and is somewhat self-documenting:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;storeTypes&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nt">&quot;local&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="err">...</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="err">...</span><span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="nt">&quot;pluginSupport&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span>
<span class="p">}</span>
</code></pre></div>
<p>While the dictionary of store types seems like a very complete response at first, a use case may arise that warrants returning additional information.
For example, the presence of plugin support may be crucial information for a client to proceed when their desired store type is missing.</p>
<p>The following representation is bad because it is not extensible:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span><span class="w"> </span><span class="nt">&quot;outputs&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="s2">&quot;out&quot;</span><span class="w"> </span><span class="s2">&quot;bin&quot;</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">}</span>
</code></pre></div>
<p>However, simply converting everything to records is not enough, because the order of outputs must be preserved:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span><span class="w"> </span><span class="nt">&quot;outputs&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nt">&quot;bin&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{},</span><span class="w"> </span><span class="nt">&quot;out&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span>
</code></pre></div>
<p>The first item is the default output. Deriving this information from the outputs ordering is not great, but this is how Lix currently happens to work.
While it is possible for a JSON parser to preserve the order of fields, we can not rely on this capability to be present in all JSON libraries.</p>
<p>This representation is extensible and preserves the ordering:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span><span class="w"> </span><span class="nt">&quot;outputs&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nt">&quot;outputName&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;out&quot;</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nt">&quot;outputName&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;bin&quot;</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">}</span>
</code></pre></div>
<h3 id="dialog-with-the-user">Dialog with the user</h3>
<p>CLIs don't always make it clear when an action has taken place. For every
action a user performs, your CLI should provide an equal and appropriate
reaction, clearly highlighting the what just happened. For example:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix<span class="w"> </span>build
<span class="w"> </span>Downloaded<span class="w"> </span>python3.8-poetry<span class="w"> </span><span class="m">1</span>.2.3<span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="m">5</span>.3<span class="w"> </span>seconds
<span class="w"> </span>Downloaded<span class="w"> </span>python3.8-requests<span class="w"> </span><span class="m">1</span>.2.3<span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="m">5</span>.3<span class="w"> </span>seconds
...
<span class="w"> </span>Success!<span class="w"> </span>You<span class="w"> </span>have<span class="w"> </span>successfully<span class="w"> </span>built<span class="w"> </span>my-project.
$
</code></pre></div>
<p>Above command clearly states that command successfully completed. And in case
of <code>nix build</code>, which is a command that might take some time to complete, it is
equally important to also show that a command started.</p>
<h3 id="text-alignment">Text alignment</h3>
<p>Text alignment is the number one design element that will present all of the
Nix commands as a family and not as separate tools glued together.</p>
<p>The format we should follow is:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix<span class="w"> </span>COMMAND
<span class="w"> </span>VERB_1<span class="w"> </span>NOUN<span class="w"> </span>and<span class="w"> </span>other<span class="w"> </span>words
<span class="w"> </span>VERB__1<span class="w"> </span>NOUN<span class="w"> </span>and<span class="w"> </span>other<span class="w"> </span>words
<span class="w"> </span><span class="p">|</span>&gt;<span class="w"> </span>Some<span class="w"> </span>details
</code></pre></div>
<p>Few rules that we can extract from above example:</p>
<ul>
<li>Each line should start at least with one space.</li>
<li>First word should be a VERB and must be aligned to the right.</li>
<li>Second word should be a NOUN and must be aligned to the left.</li>
<li>If you can not find a good VERB / NOUN pair, dont worry make it as
understandable to the user as possible.</li>
<li>More details of each line can be provided by <code>|&gt;</code> character which is serving
as the first word when aligning the text</li>
</ul>
<p>Dont forget you should also test your terminal output with colors and emojis
off (<code>--no-colors --no-emojis</code>).</p>
<h3 id="dim-bright">Dim / Bright</h3>
<p>After comparing few terminals with different color schemes we would <strong>recommend
to avoid using dimmed text</strong>. The difference from the rest of the text is very
little in many terminal and color scheme combinations. Sometimes the difference
is not even notable, therefore relying on it wouldnt make much sense.</p>
<p><strong>The bright text is much better supported</strong> across terminals and color
schemes. Most of the time the difference is perceived as if the bright text
would be bold.</p>
<h3 id="colors">Colors</h3>
<p>Humans are already conditioned by society to attach certain meaning to certain
colors. While the meaning is not universal, a simple collection of colors is
used to represent basic emotions.</p>
<p>Colors that can be used in output</p>
<ul>
<li>Red = error, danger, stop</li>
<li>Green = success, good</li>
<li>Yellow/Orange = proceed with caution, warning, in progress</li>
<li>Blue/Magenta = stability, calm</li>
</ul>
<p>While colors are nice, when command line is used by machines (in automation
scripts) you want to remove the colors. There should be a global <code>--no-colors</code>
option that would remove the colors.</p>
<h3 id="special-unicode-characters">Special (Unicode) characters</h3>
<p>Most of the terminal have good support for Unicode characters and you should
use them in your output by default. But always have a backup solution that is
implemented only with ASCII characters and will be used when <code>--ascii</code> option
is going to be passed in. Please make sure that you test your output also
without Unicode characters</p>
<p>More they showing all the different Unicode characters it is important to
<strong>establish common set of characters</strong> that we use for certain situations.</p>
<h3 id="emojis">Emojis</h3>
<p>Emojis help channel emotions even better than text, colors and special
characters.</p>
<p>We recommend <strong>keeping the set of emojis to a minimum</strong>. This will enable each
emoji to stand out more.</p>
<p>As not everybody is happy about emojis we should provide an <code>--no-emojis</code>
option to disable them. Please make sure that you test your output also without
emojis.</p>
<h3 id="tables">Tables</h3>
<p>All commands that are listing certain data can be implemented in some sort of a
table. Its important that each row of your output is a single entry of data.
Never output table borders. Its noisy and a huge pain for parsing using other
tools such as <code>grep</code>.</p>
<p>Be mindful of the screen width. Only show a few columns by default with the
table header, for more the table can be manipulated by the following options:</p>
<ul>
<li><code>--no-headers</code>: Show column headers by default but allow to hide them.</li>
<li><code>--columns</code>: Comma-separated list of column names to add.</li>
<li><code>--sort</code>: Allow sorting by column. Allow inverse and multi-column sort as well.</li>
</ul>
<h3 id="interactive-output">Interactive output</h3>
<p>Interactive output was selected to be able to strike the balance between
beginners and advance users. While the default output will target beginners it
can, with a few key strokes, be changed into and advance introspection tool.</p>
<h4 id="progress">Progress</h4>
<p>For longer running commands we should provide and overview the progress.
This is shown best in <code>nix build</code> example:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix<span class="w"> </span>build
<span class="w"> </span>Started<span class="w"> </span>building<span class="w"> </span>my-project<span class="w"> </span><span class="m">1</span>.2.3
<span class="w"> </span>Downloaded<span class="w"> </span>python3.8-poetry<span class="w"> </span><span class="m">1</span>.2.3<span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="m">5</span>.3<span class="w"> </span>seconds
<span class="w"> </span>Downloaded<span class="w"> </span>python3.8-requests<span class="w"> </span><span class="m">1</span>.2.3<span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="m">5</span>.3<span class="w"> </span>seconds
------------------------------------------------------------------------
<span class="w"> </span>Press<span class="w"> </span><span class="sb">`</span>v<span class="sb">`</span><span class="w"> </span>to<span class="w"> </span>increase<span class="w"> </span>logs<span class="w"> </span>verbosity
<span class="w"> </span><span class="p">|</span>&gt;<span class="w"> </span><span class="sb">`</span>?<span class="sb">`</span><span class="w"> </span>to<span class="w"> </span>see<span class="w"> </span>other<span class="w"> </span>options
------------------------------------------------------------------------
<span class="w"> </span>Learn<span class="w"> </span>something<span class="w"> </span>new<span class="w"> </span>with<span class="w"> </span>every<span class="w"> </span>build...
<span class="w"> </span><span class="p">|</span>&gt;<span class="w"> </span>See<span class="w"> </span>last<span class="w"> </span>logs<span class="w"> </span>of<span class="w"> </span>a<span class="w"> </span>build<span class="w"> </span>with<span class="w"> </span><span class="sb">`</span>nix<span class="w"> </span>log<span class="w"> </span>--last<span class="sb">`</span><span class="w"> </span>command.
------------------------------------------------------------------------
<span class="w"> </span>Evaluated<span class="w"> </span>my-project<span class="w"> </span><span class="m">1</span>.2.3<span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="m">14</span>.43<span class="w"> </span>seconds
Downloading<span class="w"> </span><span class="o">[</span><span class="m">12</span><span class="w"> </span>/<span class="w"> </span><span class="m">200</span><span class="o">]</span>
<span class="w"> </span><span class="p">|</span>&gt;<span class="w"> </span>firefox<span class="w"> </span><span class="m">1</span>.2.3<span class="w"> </span><span class="o">[</span><span class="c1">#########&gt; ] 10Mb/s | 2min left</span>
<span class="w"> </span>Building<span class="w"> </span><span class="o">[</span><span class="m">2</span><span class="w"> </span>/<span class="w"> </span><span class="m">20</span><span class="o">]</span>
<span class="w"> </span><span class="p">|</span>&gt;<span class="w"> </span>glibc<span class="w"> </span><span class="m">1</span>.2.3<span class="w"> </span>-&gt;<span class="w"> </span>buildPhase:<span class="w"> </span>&lt;last<span class="w"> </span>log<span class="w"> </span>line&gt;
------------------------------------------------------------------------
</code></pre></div>
<h4 id="search">Search</h4>
<p>Use a <code>fzf</code> like fuzzy search when there are multiple options to choose from.</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix<span class="w"> </span>init
Initializing<span class="w"> </span>Nix<span class="w"> </span>project<span class="w"> </span>at<span class="w"> </span><span class="sb">`</span>/path/to/here<span class="sb">`</span>.
<span class="w"> </span>Select<span class="w"> </span>a<span class="w"> </span>template<span class="w"> </span><span class="k">for</span><span class="w"> </span>you<span class="w"> </span>new<span class="w"> </span>project:
<span class="w"> </span><span class="p">|</span>&gt;<span class="w"> </span>py
<span class="w"> </span>template#python-pip
<span class="w"> </span>template#python-poetry
<span class="w"> </span><span class="o">[</span><span class="w"> </span>Showing<span class="w"> </span><span class="m">2</span><span class="w"> </span>templates<span class="w"> </span>from<span class="w"> </span><span class="m">1345</span><span class="w"> </span>templates<span class="w"> </span><span class="o">]</span>
</code></pre></div>
<h4 id="prompt">Prompt</h4>
<p>In some situations we need to prompt the user and inform the user about what is
going to happen.</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix<span class="w"> </span>build<span class="w"> </span>--option<span class="w"> </span>substitutors<span class="w"> </span>https://cache.example.org
------------------------------------------------------------------------
<span class="w"> </span>Warning!<span class="w"> </span>A<span class="w"> </span>security<span class="w"> </span>related<span class="w"> </span>question<span class="w"> </span>needs<span class="w"> </span>to<span class="w"> </span>be<span class="w"> </span>answered.
------------------------------------------------------------------------
<span class="w"> </span>The<span class="w"> </span>following<span class="w"> </span>substitutors<span class="w"> </span>will<span class="w"> </span>be<span class="w"> </span>used<span class="w"> </span>to<span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="sb">`</span>my-project<span class="sb">`</span>:
<span class="w"> </span>-<span class="w"> </span>https://cache.example.org
<span class="w"> </span>Do<span class="w"> </span>you<span class="w"> </span>allow<span class="w"> </span><span class="sb">`</span>my-project<span class="sb">`</span><span class="w"> </span>to<span class="w"> </span>use<span class="w"> </span>above<span class="w"> </span>mentioned<span class="w"> </span>substitutors?
<span class="w"> </span><span class="o">[</span>y/N<span class="o">]</span><span class="w"> </span><span class="p">|</span>&gt;<span class="w"> </span>y
</code></pre></div>
<h3 id="verbosity">Verbosity</h3>
<p>There are many ways that you can control verbosity.</p>
<p>Verbosity levels are:</p>
<ul>
<li><code>ERROR</code> (level 0)</li>
<li><code>WARN</code> (level 1)</li>
<li><code>NOTICE</code> (level 2)</li>
<li><code>INFO</code> (level 3)</li>
<li><code>TALKATIVE</code> (level 4)</li>
<li><code>CHATTY</code> (level 5)</li>
<li><code>DEBUG</code> (level 6)</li>
<li><code>VOMIT</code> (level 7)</li>
</ul>
<p>The default level that the command starts is <code>ERROR</code>. The simplest way to
increase the verbosity by stacking <code>-v</code> option (eg: <code>-vvv == level 3 == INFO</code>).
There are also two shortcuts, <code>--debug</code> to run in <code>DEBUG</code> verbosity level and
<code>--quiet</code> to run in <code>ERROR</code> verbosity level.</p>
<hr />
<h2 id="appendix-1-commands-naming-exceptions">Appendix 1: Commands naming exceptions</h2>
<p><code>nix init</code> and <code>nix repl</code> are well established</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Licenced MIT
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
<div class="md-social">
<a href="https://git.auxolotl.org/auxolotl/docs" target="_blank" rel="noopener" title="Aux Docs Repo" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.076 7.076 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422 2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24 2.9 2.9 0 0 1 5.8 18.57V8.589a7.109 7.109 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0ZM7.223 19.905a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Zm9.554-10.464a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.39Zm0-7.735a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Z"/></svg>
</a>
<a href="https://forum.aux.computer/" target="_blank" rel="noopener" title="Aux Forum" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12.103 0C18.666 0 24 5.485 24 11.997c0 6.51-5.33 11.99-11.9 11.99L0 24V11.79C0 5.28 5.532 0 12.103 0zm.116 4.563a7.395 7.395 0 0 0-6.337 3.57 7.247 7.247 0 0 0-.148 7.22L4.4 19.61l4.794-1.074a7.424 7.424 0 0 0 8.136-1.39 7.256 7.256 0 0 0 1.737-7.997 7.375 7.375 0 0 0-6.84-4.585h-.008z"/></svg>
</a>
<a href="https://wiki.auxolotl.org/" target="_blank" rel="noopener" title="Aux Wiki" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17.801 13.557c.148.098.288.202.417.313 1.854 1.6 3.127 4.656 2.582 7.311-1.091-.255-5.747-1.055-7.638-3.383-.91-1.12-1.366-2.081-1.569-2.885a5.65 5.65 0 0 0 .034-.219c.089.198.197.35.313.466.24.24.521.335.766.372.304.046.594-.006.806-.068l.001.001c.05-.015.433-.116.86-.342.325-.173 2.008-.931 3.428-1.566Zm-7.384 1.435C9.156 16.597 6.6 18.939.614 18.417c.219-1.492 1.31-3.019 2.51-4.11.379-.345.906-.692 1.506-1.009.286.168.598.332.939.486 2.689 1.221 3.903 1.001 4.89.573a1.3 1.3 0 0 0 .054-.025 6.156 6.156 0 0 0-.096.66Zm4.152-.462c.38-.341.877-.916 1.383-1.559-.389-.15-.866-.371-1.319-.591-.598-.29-1.305-.283-2.073-.315a4.685 4.685 0 0 1-.804-.103c.014-.123.027-.246.038-.369.062.104.673.057.871.057.354 0 1.621.034 3.074-.574 1.452-.608 2.55-1.706 3.022-3.225.474-1.52.22-3.091-.168-3.952-.169.709-1.453 2.381-1.926 2.871-.473.489-2.381 2.296-2.972 2.921-.7.74-.688.793-1.332 1.302-.202.19-.499.402-.563.53.027-.338.039-.675.027-.997a7.653 7.653 0 0 0-.032-.523c.322-.059.567-.522.567-.861 0-.224-.106-.247-.271-.229.075-.894.382-3.923 1.254-4.281.218.109.831.068.649-.295-.182-.364-.825-.074-1.081.266-.28.374-.956 2.046-.92 4.324-.113.014-.174.033-.322.033-.171 0-.321-.04-.433-.05.034-2.275-.714-3.772-.84-4.169-.12-.375-.491-.596-.781-.596-.146 0-.272.056-.333.179-.182.363.459.417.677.308.706.321 1.156 3.519 1.254 4.277-.125-.006-.199.035-.199.233 0 .311.17.756.452.843a.442.442 0 0 0-.007.03s-.287.99-.413 2.189a4.665 4.665 0 0 1-.718-.225c-.714-.286-1.355-.583-2.019-.566-.664.018-1.366.023-1.804-.036-.438-.058-.649-.15-.649-.15s-.234.365.257 1.075c.42.607 1.055 1.047 1.644 1.18.589.134 1.972.18 2.785-.377.16-.109.317-.228.459-.34a8.717 8.717 0 0 0-.013.626c-.289.753-.571 1.993-.268 3.338 0-.001.701-.842.787-2.958.006-.144.009-.271.01-.383.052-.248.103-.518.148-.799.072.135.151.277.234.413.511.842 1.791 1.37 2.383 1.49.091.019.187.032.285.038Zm-1.12.745c-.188.055-.445.1-.713.059-.21-.031-.45-.11-.655-.316-.169-.168-.312-.419-.401-.789a9.837 9.837 0 0 0 .039-.82l.049-.243c.563.855 1.865 1.398 2.476 1.522.036.008.072.014.109.02l-.013.009c-.579.415-.76.503-.891.558Zm6.333-2.818c-.257.114-4.111 1.822-5.246 2.363.98-.775 3.017-3.59 3.699-4.774 1.062.661 1.468 1.109 1.623 1.441.101.217.09.38.096.515a.57.57 0 0 1-.172.455Zm-9.213 1.62a1.606 1.606 0 0 1-.19.096c-.954.414-2.126.61-4.728-.571-2.023-.918-3.024-2.157-3.371-2.666.476.161 1.471.473 2.157.524.282.021.703.068 1.167.125.021.209.109.486.345.829l.001.001c.451.651 1.134 1.119 1.765 1.262.622.141 2.083.182 2.942-.407a3.12 3.12 0 0 0 .132-.093l.001.179a6.052 6.052 0 0 0-.221.721Zm5.512-1.271a17.49 17.49 0 0 1-1.326-.589c.437.042 1.054.083 1.692.108-.121.162-.244.323-.366.481Zm.932-1.26c-.12.17-.245.343-.373.517-.241.018-.478.03-.709.038a29.05 29.05 0 0 1-.741-.048c.608-.065 1.228-.252 1.823-.507Zm.22-.315c-.809.382-1.679.648-2.507.648-.472 0-.833.018-1.139.039v.001c-.324-.031-.665-.039-1.019-.054a3.555 3.555 0 0 1-.152-.009c.102-.002.192-.006.249-.006.363 0 1.662.034 3.151-.589 1.508-.632 2.645-1.773 3.136-3.351.37-1.186.31-2.402.086-3.312.458-.336.86-.651 1.147-.91.501-.451.743-.733.848-.869.199.206.714.864.685 2.138-.036 1.611-.606 3.187-1.501 4.154a9.099 9.099 0 0 1-1.321 1.132 11.978 11.978 0 0 0-.644-.422l-.089-.055-.051.091c-.184.332-.5.825-.879 1.374ZM4.763 5.817c-.157 1.144.113 2.323.652 3.099.539.776 2.088 2.29 3.614 2.505.991.14 2.055.134 2.055.134s-.593-.576-1.114-1.66c-.521-1.085-.948-2.104-1.734-2.786-.785-.681-1.601-1.416-2.045-1.945-.444-.53-.59-.86-.59-.86s-.656.175-.838 1.513Zm14.301 4.549a9.162 9.162 0 0 0 1.3-1.12c.326-.352.611-.782.845-1.265 1.315.145 2.399.371 2.791.434 0 0-.679 1.971-3.945 3.022l-.016-.035c-.121-.26-.385-.594-.975-1.036Zm-11.634.859a8.537 8.537 0 0 1-.598-.224c-1.657-.693-2.91-1.944-3.449-3.678-.498-1.601-.292-3.251.091-4.269.225.544.758 1.34 1.262 2.01a3.58 3.58 0 0 0-.172.726c-.163 1.197.123 2.428.687 3.24.416.599 1.417 1.62 2.555 2.193-.128.002-.253.003-.376.002Zm-1.758-.077c-.958-.341-1.901-.787-2.697-1.368C-.07 7.559 0 6.827 0 6.827s1.558-.005 3.088.179c.03.126.065.251.104.377.557 1.791 1.851 3.086 3.562 3.803l.047.019a4.254 4.254 0 0 1-.267-.026h-.001c-.401-.053-.595-.135-.595-.135l-.157-.069-.092.144-.017.029Zm6.807-1.59c.086.017.136.058.136.145 0 .197-.242.5-.597.597l-.01-.161a.887.887 0 0 0 .283-.243c.078-.099.142-.217.188-.338Zm-1.591.006c.033.1.076.197.129.282.061.097.134.18.217.24l-.021.083c-.276-.093-.424-.293-.424-.466 0-.078.035-.119.099-.139Zm-.025-.664c-.275-.816-.795-2.022-1.505-2.179-.296.072-.938.096-.691-.145.246-.24 1.085-.048 1.283.217.145.194.744.806 1.011 1.737l.032.227a.324.324 0 0 0-.13.143Zm1.454-.266c.251-.99.889-1.639 1.039-1.841.197-.265 1.036-.457 1.283-.217.247.241-.395.217-.691.145-.69.152-1.2 1.296-1.481 2.109a.364.364 0 0 0-.067-.059.37.37 0 0 0-.092-.043l.009-.094Zm4.802-2.708a9.875 9.875 0 0 1-.596.705c-.304.315-1.203 1.176-1.963 1.916.647-.955 1.303-1.806 2.184-2.376.123-.08.249-.161.375-.245Z"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.tooltips", "search.highlight", "navigation.tabs", "navigation.indexes", "navigation.prune"], "search": "../../../assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.fe8b6f2b.min.js"></script>
</body>
</html>