--- title: Command-line interface description: Use built-in commands and write your own. --- import Create from '@site/helpers/create'; # Command-line interface flecks has a command-line interface for building, linting, testing, and so much more. ## Built-in commands ### `add` Add a fleck to your application. ``` Usage: flecks add [options] Arguments: fleck fleck ``` ### `build` Build a target in your application. ``` Usage: flecks build [options] [target] Arguments: target target (choices: "...") Options: -d, --no-production dev build -h, --hot build with hot module reloading -w, --watch watch for changes ``` ### `lint` Run linter. ``` Usage: flecks lint [options] ``` ### `docusaurus` (Implemented by `@flecks/dox`) Create a documentation website for this project. ``` Usage: flecks docusaurus [options] [siteDir] Arguments: subcommand Docusaurus command to run (choices: "build", "create", "start") siteDir Docusaurus directory (default: "website") ``` The `build` and `start` subcommands are sugar on top of the corresponding Docusaurus commands. The `create` subcommand will create a documentation website starter template for you at `siteDir` if `siteDir` doesn't already exist (defaults to `website`). A `docusaurus.config.js` starter configuration will also be copied to your `build` directory if it doesn't already exist. ## Your commands You can implement your own command by implementing [`@flecks/core.commands`](/docs/flecks/@flecks/dox/hooks#fleckscorecommands) in your fleck. Let's run through the process. ### Implement @flecks/core​.commands First, create an application: Move into the new project and create a fleck: ```bash npx create-fleck fortune ``` We're going to be creating a fortune teller command that will tell you when you will find love. :heart_eyes: ### Create a command that takes an option Now, edit `packages/fortune/src/index.js` to look like this: ```javascript export const hooks = { '@flecks/core.commands': () => ({ fortune: { options: [ ['-n, --be-nice', 'be nice'], ], description: 'find your true love', action: async ({beNice}) => { console.log(`It will be ${Math.floor(Math.random() * 10) + 2} days until you meet your true love!`); if (!beNice) { console.log('You might also stub your toe.'); } }, }, }), }; ``` ### Inspect and invoke your command Now, invoke flecks like so: ```bash npx flecks --help ``` You will see among the commands listed: ``` fortune [options] find your true love ``` Run the command with the `--help` option: ```bash npx flecks fortune --help ``` You will see this output: ``` Usage: flecks fortune [options] find your true love Options: -n, --be-nice be nice ``` Let's try it! ```bash npx flecks fortune --be-nice ``` You will see something like: ``` It will be 11 days until you meet your true love! ``` How about without our option: ```bash npx flecks fortune ``` You will see something like: ``` It will be 7 days until you meet your true love! You might also stub your toe. ``` ### Define arguments You can also define arguments in addition to options. Let's add an argument that takes the user's name to personalize the output: ```javascript export const hooks = { // highlight-start '@flecks/core.commands': (program, flecks) => { const {Argument} = flecks.fleck('@flecks/core/server'); return { // highlight-end fortune: { // highlight-start args: [ new Argument('[name]', 'your name') ], // highlight-end options: [ ['-n, --be-nice', 'be nice'], ], description: 'find your true love', // highlight-next-line action: async (name = 'person', {beNice}) => { // highlight-next-line console.log(`Hey, ${name}. It will be ${Math.floor(Math.random() * 10) + 2} days until you meet your true love!`); if (!beNice) { console.log('You might also stub your toe.'); } }, }, // highlight-start }; }, // highlight-end }; ``` Notice that we added the argument to... the arguments. Try it again: ```bash npx flecks fortune --be-nice ``` You will see e.g.: ``` Hey, person. It will be 7 days until you meet your true love! ``` That's because we set the default name to `'person'` in the code above. Let's try passing in a name: ```bash npx flecks fortune cha0s ``` Now the output looks like: ``` Hey, cha0s. It will be 4 days until you meet your true love! You might also stub your toe. ``` ### Going further flecks uses [Commander.js](https://github.com/tj/commander.js#quick-start) under the hood to build its CLI. It might be worth checking out their documentation for any more advanced usage.