diff --git a/uroboros/command.py b/uroboros/command.py
index 8167aba..963cba2 100644
--- a/uroboros/command.py
+++ b/uroboros/command.py
@@ -134,25 +134,26 @@ class Command(metaclass=abc.ABCMeta):
         parser.set_defaults(func=self.run)
         return parser
 
-    def add_command(self, command: 'Command') -> 'Command':
+    def add_command(self, *commands: 'Command') -> 'Command':
         """
         Add sub command to this command.
-        :param command: An instance of `uroboros.command.Command`
+        :param commands: An instance of `uroboros.command.Command`
         :return: None
         """
-        assert isinstance(command, Command), \
-            "Given command is not an instance of `uroboros.Command` or" \
-            "an instance of its subclass."
-        assert getattr(command, "name", None) is not None, \
-            "{} does not have `name` attribute.".format(
-                command.__class__.__name__)
-        command_id = id(command)
-        if command_id in self._parent_ids or \
-                command_id in self._sub_command_ids:
-            raise errors.CommandDuplicateError(command, self)
-        command.register_parent(self._parent_ids)
-        command.increment_nest(self._layer)
-        self.sub_commands.append(command)
+        for command in commands:
+            assert isinstance(command, Command), \
+                "Given command is not an instance of `uroboros.Command` or" \
+                "an instance of its subclass."
+            assert getattr(command, "name", None) is not None, \
+                "{} does not have `name` attribute.".format(
+                    command.__class__.__name__)
+            command_id = id(command)
+            if command_id in self._parent_ids or \
+                    command_id in self._sub_command_ids:
+                raise errors.CommandDuplicateError(command, self)
+            command.register_parent(self._parent_ids)
+            command.increment_nest(self._layer)
+            self.sub_commands.append(command)
         return self
 
     @property

Support multiple argument for `add_command()`
## What is this?

`uroboros.Command.add_command()` supports only one `Command` now.
This feature will support multiple `Command`.

Before

```python
root = RootCommand()
root.add_command(ACommand())
root.add_command(BCommand())
root.add_command(CCommand())
```

After

```python
root = RootCommand()
root.add_command(
    ACommand(),
    BCommand(),
    CCommand(),
)
```

## How to implement?

Just use `for` loop
diff --git a/tests/test_command.py b/tests/test_command.py
index cfa85f1..b80b64f 100644
--- a/tests/test_command.py
+++ b/tests/test_command.py
@@ -134,6 +134,18 @@ class TestCommand(object):
             actual = command._sub_command_ids
             assert actual == expected
 
+    @pytest.mark.parametrize(
+        'root_cmd,add_commands', [
+            (RootCommand(), [SecondCommand()]),
+            (RootCommand(), [SecondCommand(), ThirdCommand()]),
+        ]
+    )
+    def test_multiple_add_command(self, root_cmd, add_commands):
+        root_cmd.add_command(*add_commands)
+        actual = root_cmd._sub_command_ids
+        expected = set([id(c) for c in add_commands])
+        assert actual == expected
+
     def test_add_others(self):
         root = RootCommand()
         with pytest.raises(AssertionError):

pip install -e .[dev]
parse_log_pytest
pytest
pytest
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///croot/attrs_1668696182826/work
certifi @ file:///croot/certifi_1671487769961/work/certifi
flit_core @ file:///opt/conda/conda-bld/flit-core_1644941570762/work/source/flit_core
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1648562407465/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
packaging @ file:///croot/packaging_1671697413597/work
pluggy @ file:///tmp/build/80754af9/pluggy_1648042572264/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pytest==7.1.2
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
typing_extensions @ file:///croot/typing_extensions_1669924550328/work
-e git+https://github.com/pddg/uroboros.git@f1eb29a42b6f75f573db2185eaba3762bd2ae71e#egg=uroboros
zipp @ file:///croot/zipp_1672387121353/work

name: uroboros
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=22.1.0=py37h06a4308_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - flit-core=3.6.0=pyhd3eb1b0_0
  - importlib-metadata=4.11.3=py37h06a4308_0
  - importlib_metadata=4.11.3=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=22.0=py37h06a4308_0
  - pip=22.3.1=py37h06a4308_0
  - pluggy=1.0.0=py37h06a4308_1
  - py=1.11.0=pyhd3eb1b0_0
  - pytest=7.1.2=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py37h06a4308_0
  - typing_extensions=4.4.0=py37h06a4308_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.11.0=py37h06a4308_0
  - zlib=1.2.13=h5eee18b_1
prefix: /opt/conda/envs/uroboros

tests/test_command.py::TestCommand::test_multiple_add_command[root_cmd1-add_commands1]
tests/test_command.py::TestCommand::test_build_option[command0] tests/test_command.py::TestCommand::test_build_option[command1] tests/test_command.py::TestCommand::test_build_option[command2] tests/test_command.py::TestCommand::test_validate[command0] tests/test_command.py::TestCommand::test_validate[command1] tests/test_command.py::TestCommand::test_validate[command2] tests/test_command.py::TestCommand::test_increment_nest[command_set0] tests/test_command.py::TestCommand::test_increment_nest[command_set1] tests/test_command.py::TestCommand::test_increment_nest[command_set2] tests/test_command.py::TestCommand::test_register_parent[command_set0] tests/test_command.py::TestCommand::test_register_parent[command_set1] tests/test_command.py::TestCommand::test_register_parent[command_set2] tests/test_command.py::TestCommand::test_add_command[command_set0] tests/test_command.py::TestCommand::test_add_command[command_set1] tests/test_command.py::TestCommand::test_add_command[command_set2] tests/test_command.py::TestCommand::test_multiple_add_command[root_cmd0-add_commands0] tests/test_command.py::TestCommand::test_add_others tests/test_command.py::TestCommand::test_get_all_sub_commands[command_set0] tests/test_command.py::TestCommand::test_get_all_sub_commands[command_set1] tests/test_command.py::TestCommand::test_get_all_sub_commands[command_set2] tests/test_command.py::TestCommand::test_get_all_sub_commands[command_set3] tests/test_command.py::TestCommand::test_get_sub_commands[command_set0-argv0] tests/test_command.py::TestCommand::test_get_sub_commands[command_set1-argv1] tests/test_command.py::TestCommand::test_get_sub_commands[command_set2-argv2] tests/test_command.py::TestCommand::test_get_sub_commands[command_set3-argv3] tests/test_command.py::TestCommand::test_get_sub_commands[command_set4-argv4] tests/test_command.py::TestCommand::test_add_duplicate_command[command_set0] tests/test_command.py::TestCommand::test_add_duplicate_command[command_set1] tests/test_command.py::TestCommand::test_execute[command_set0-root tests/test_command.py::TestCommand::test_execute[command_set1-root tests/test_command.py::TestCommand::test_execute[command_set2-root-False] tests/test_command.py::TestCommand::test_execute[command_set3-root tests/test_command.py::TestCommand::test_execute[command_set4-root tests/test_command.py::TestCommand::test_execute[command_set5-root-False] tests/test_command.py::TestCommand::test_violates_validation_argv[command_set0-root tests/test_command.py::TestCommand::test_violates_validation_argv[command_set1-root tests/test_command.py::TestCommand::test_violates_validation_argv[command_set2-root tests/test_command.py::TestCommand::test_violates_validation_argv[command_set3-root tests/test_command.py::TestCommand::test_violates_validation_argv[command_set4-root tests/test_command.py::TestCommand::test_violates_validation_argv[command_set5-root tests/test_command.py::TestCommand::test_before_validate tests/test_command.py::TestCommand::test_pre_hook[commands0] tests/test_command.py::TestCommand::test_pre_hook[commands1] tests/test_command.py::TestCommand::test_pre_hook[commands2] tests/test_command.py::TestCommand::test_after_validate tests/test_command.py::TestCommand::test_pre_hook_validated[commands0] tests/test_command.py::TestCommand::test_pre_hook_validated[commands1] tests/test_command.py::TestCommand::test_pre_hook_validated[commands2]
uroboros/command.py
uroboros/command.py