// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements.  See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License.  You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

== Ignite CLI Tool

The Ignite CLI tool uses REST API as a communication protocol between the node and the CLI,
allowing you to configure the node.

Below is a list of Ignite CLI tool commands with short descriptions:

[cols="1,3",opts="header", stripes=none]
|===
| Command | Description
| `init` | Installs Ignite core modules locally.
| `module` | Manages optional Ignite modules and external artifacts.
| `module list` | Shows the list of available optional Ignite modules.
| `module add` | Adds an optional Ignite module or an external artifact.
| `module remove` | Adds an optional Ignite module or an external artifact.
| `node`| Starts, stops, and manages locally running Ignite nodes.
| `node start` | Starts an Ignite node locally.
| `node stop` | Stops a locally running Ignite node.
| `node classpath` | Shows the current classpath used by the Ignite nodes.
| `node list` | Shows the list of currently running local Ignite nodes.
|===

NOTE: While `config`, `config get`, `config set` commands are listed in command output, they do not work in alpha 2.