202 lines
		
	
	
	
		
			8.7 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			202 lines
		
	
	
	
		
			8.7 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!doctype html>
 | 
						|
<html>
 | 
						|
<head>
 | 
						|
  <title>Wroten - team-cli</title>
 | 
						|
  <meta charset="UTF-8" />
 | 
						|
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
						|
  <link href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel="stylesheet">
 | 
						|
</head>
 | 
						|
 | 
						|
<body class="bg-gray-100">
 | 
						|
  <header>
 | 
						|
    <nav class="bg-white shadow">
 | 
						|
      <div class="max-w-7xl mx-auto px-2 sm:px-6 lg:px-8">
 | 
						|
        <div class="relative flex justify-between h-16">
 | 
						|
          <div class="absolute inset-y-0 left-0 flex items-center sm:hidden">
 | 
						|
            <!-- Mobile menu button -->
 | 
						|
            <button class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500" aria-expanded="false">
 | 
						|
              <span class="sr-only">Open main menu</span>
 | 
						|
              <!-- Icon when menu is closed. -->
 | 
						|
              <!--
 | 
						|
                Heroicon name: menu
 | 
						|
 | 
						|
                Menu open: "hidden", Menu closed: "block"
 | 
						|
              -->
 | 
						|
              <svg class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
 | 
						|
                <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
 | 
						|
              </svg>
 | 
						|
              <!-- Icon when menu is open. -->
 | 
						|
              <!--
 | 
						|
                Heroicon name: x
 | 
						|
 | 
						|
                Menu open: "block", Menu closed: "hidden"
 | 
						|
              -->
 | 
						|
              <svg class="hidden h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
 | 
						|
                <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
 | 
						|
              </svg>
 | 
						|
            </button>
 | 
						|
          </div>
 | 
						|
          <div class="flex-1 flex items-center justify-center sm:items-stretch sm:justify-start">
 | 
						|
            <div class="flex-shrink-0 flex items-center">
 | 
						|
              <img class="h-12 w-12 rounded-full w-auto" src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" alt="">
 | 
						|
            </div>
 | 
						|
            <div class="hidden sm:ml-6 sm:flex sm:space-x-8"><a
 | 
						|
                  href="/"
 | 
						|
                  class="border-transparent text-gray-500 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium"
 | 
						|
                  
 | 
						|
                >
 | 
						|
                  Welcome
 | 
						|
                </a><a
 | 
						|
                  href="/repos/"
 | 
						|
                  class="border-transparent text-gray-500 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium"
 | 
						|
                  
 | 
						|
                >
 | 
						|
                  Repos
 | 
						|
                </a><a
 | 
						|
                  href="/work-history/"
 | 
						|
                  class="border-transparent text-gray-500 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium"
 | 
						|
                  
 | 
						|
                >
 | 
						|
                  Work
 | 
						|
                </a><a
 | 
						|
                  href="/volunteering/"
 | 
						|
                  class="border-transparent text-gray-500 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium"
 | 
						|
                  
 | 
						|
                >
 | 
						|
                  Volunteering
 | 
						|
                </a><a
 | 
						|
                  href="/uses/"
 | 
						|
                  class="border-transparent text-gray-500 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium"
 | 
						|
                  
 | 
						|
                >
 | 
						|
                  About | Uses
 | 
						|
                </a></div>
 | 
						|
          </div>
 | 
						|
        </div>
 | 
						|
      </div>
 | 
						|
 | 
						|
      <!--
 | 
						|
        Mobile menu, toggle classes based on menu state.
 | 
						|
 | 
						|
        Menu open: "block", Menu closed: "hidden"
 | 
						|
      -->
 | 
						|
      <div class="hidden sm:hidden">
 | 
						|
        <div class="pt-2 pb-4 space-y-1">
 | 
						|
          <!-- Current: "bg-indigo-50 border-indigo-500 text-indigo-700", Default: "border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700" -->
 | 
						|
          <a href="#" class="bg-indigo-50 border-indigo-500 text-indigo-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Dashboard</a>
 | 
						|
          <a href="#" class="border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Team</a>
 | 
						|
          <a href="#" class="border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Projects</a>
 | 
						|
          <a href="#" class="border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Calendar</a>
 | 
						|
        </div>
 | 
						|
      </div>
 | 
						|
    </nav>
 | 
						|
  </header>
 | 
						|
 | 
						|
 | 
						|
<main class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
 | 
						|
  <div class="max-w-3x1 mx-auto mb-5">
 | 
						|
    <div class="-ml-2 mt-8 flex flex-wrap items-baseline">
 | 
						|
      <h1 class="ml-8 mt-2 text-lg font-medium text-gray-900">
 | 
						|
        team-cli
 | 
						|
      </h1>
 | 
						|
      <p class="ml-2 mt-1 text-sm text-gray-500 truncate">in Repos</p>
 | 
						|
    </div>
 | 
						|
  </div>
 | 
						|
  <div class="bg-white overflow-hidden shadow sm:rounded-lg">
 | 
						|
    <div class="px-4 py-5 sm:p-6">
 | 
						|
      <p><a href="https://github.com/q2ebanking/team-cli">Fork on Github</a></p>
 | 
						|
<h1>team-cli</h1>
 | 
						|
<p><a href="https://badge.fury.io/js/team-cli"><img src="https://badge.fury.io/js/team-cli.svg" alt="npm version"></a></p>
 | 
						|
<p>Automate all the things with a team-centric CLI. Abstract away annoying day-to-day tasks and eliminate tribal team knowledge by building your team their very own CLI.</p>
 | 
						|
<h2>Getting Started</h2>
 | 
						|
<h3>Initialize Project</h3>
 | 
						|
<pre><code class="language-bash">mkdir teamname-cli
 | 
						|
cd teamname-cli
 | 
						|
git init
 | 
						|
npm init
 | 
						|
npm install --save team-cli
 | 
						|
</code></pre>
 | 
						|
<h3>Create Bin index.js</h3>
 | 
						|
<p>Then in an <code>index.js</code> you could write the following:</p>
 | 
						|
<pre><code class="language-javascript">#!/usr/bin/env node
 | 
						|
 | 
						|
const { resolve } = require('path');
 | 
						|
const cli = require('team-cli');
 | 
						|
 | 
						|
const commandsDir = resolve(__dirname, 'commands');
 | 
						|
cli(commandsDir);
 | 
						|
</code></pre>
 | 
						|
<h3>Point to Bin index.js in Package</h3>
 | 
						|
<p>Then customize your <code>package.json</code> to include a path to the bin:</p>
 | 
						|
<pre><code class="language-json">"bin": {
 | 
						|
  "NAME_OF_TOOL": "./index.js"
 | 
						|
}
 | 
						|
</code></pre>
 | 
						|
<h3>Create Commands</h3>
 | 
						|
<p>Then you may make a <code>commands</code> directory with files like <code>command-foo.js</code>:</p>
 | 
						|
<pre><code class="language-javascript">const run = require('team-cli/terminal');
 | 
						|
const { resolve } = require('path');
 | 
						|
 | 
						|
const script = resolve(__dirname, 'foo.sh'); // also supports bash .ps1 scripts
 | 
						|
 | 
						|
const action = async param => {
 | 
						|
  await run(script, param)
 | 
						|
  // Or, run any Node code you wish
 | 
						|
};
 | 
						|
 | 
						|
module.exports = {
 | 
						|
  title: 'foo <param>',
 | 
						|
  description: 'Calls foo',
 | 
						|
  action,
 | 
						|
}
 | 
						|
</code></pre>
 | 
						|
<h3>Try it out!</h3>
 | 
						|
<pre><code class="language-bash">node ./index.js --help
 | 
						|
</code></pre>
 | 
						|
<h2>Options</h2>
 | 
						|
<p>Any command can export the following options:</p>
 | 
						|
<pre><code class="language-javascript">{
 | 
						|
  title: 'foo', // or 'foo <required_param>' or 'foo [optional_param]'
 | 
						|
  action: (param) => {} // function with param as a string or undefined
 | 
						|
  description: 'Calls foo', // optional
 | 
						|
  alias: 'f', // optional
 | 
						|
  option: ['-f, --force', 'Forces something to happen'], // optional, this will become available globally not just per-command
 | 
						|
}
 | 
						|
</code></pre>
 | 
						|
<h2>For Your Users</h2>
 | 
						|
<p>At any time a <code>--help</code> or <code>-h</code> may be passed to log commands to the console.</p>
 | 
						|
<h3>Prompts</h3>
 | 
						|
<p>Optionally, you may find it useful to walk users through a guided CLI experience with prompts to your users. I suggest <a href="https://www.npmjs.com/package/prompts">prompts</a> for this task, but any tool of your choice will work within an action.</p>
 | 
						|
<h4>Example usage with prompts:</h4>
 | 
						|
<pre><code class="language-javascript">const action = async (cmd) => {
 | 
						|
  if (!cmd) {
 | 
						|
    let { value: cmdResponse } = await prompts({
 | 
						|
        type: 'text',
 | 
						|
        name: 'value',
 | 
						|
        message: 'Which git command would you like to run?',
 | 
						|
    });
 | 
						|
    cmd = cmdResponse
 | 
						|
  }
 | 
						|
  await run(`git ${cmd}`, '~/aCoolRepo');
 | 
						|
};
 | 
						|
</code></pre>
 | 
						|
<h3>Logging</h3>
 | 
						|
<p>The environment's log level can be changed with <code>process.env.LOG_LEVEL</code> to any of <a href="https://github.com/winstonjs/winston">winston's</a> supported log levels including <code>verbose</code>.</p>
 | 
						|
<p>To customize where logs are saved, pass a second param in your <code>index.js</code>'s <code>cli</code> call like so:</p>
 | 
						|
<pre><code class="language-javascript">cli(commandsDir, logsDir)
 | 
						|
</code></pre>
 | 
						|
 | 
						|
    </div>
 | 
						|
  </div>
 | 
						|
</main>
 | 
						|
 | 
						|
    <footer class="mt-12 max-w-7xl mx-auto py-12 px-4 sm:px-6 md:flex md:items-center md:justify-between lg:px-8">
 | 
						|
      <div class="text-gray-500">
 | 
						|
        Built in <a href="https://www.11ty.dev/">Eleventy</a> with <a href="https://tailwindui.com/">Tailwind UI</a>
 | 
						|
      </div>
 | 
						|
    </footer>
 | 
						|
  </body>
 | 
						|
</html>
 | 
						|
 | 
						|
 | 
						|
 |