..
   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.

CLI
===

.. click:: aria.cli.main:_aria
   :prog: aria

.. click:: aria.cli.commands.reset:reset
   :prog: aria reset
   :show-nested:

.. click:: aria.cli.commands.plugins:plugins
   :prog: aria plugins
   :show-nested:

.. click:: aria.cli.commands.service_templates:service_templates
   :prog: aria service_templates
   :show-nested:

.. click:: aria.cli.commands.node_templates:node_templates
   :prog: aria node_templates
   :show-nested:

.. click:: aria.cli.commands.services:services
   :prog: aria services
   :show-nested:

.. click:: aria.cli.commands.nodes:nodes
   :prog: aria nodes
   :show-nested:

.. click:: aria.cli.commands.workflows:workflows
   :prog: aria workflows
   :show-nested:

.. click:: aria.cli.commands.executions:executions
   :prog: aria executions
   :show-nested:

.. click:: aria.cli.commands.logs:logs
   :prog: aria logs
   :show-nested:
