Repository: airtai/nbdev-mkdocs (language: python)

Issue:
Integrate docstring-gen into nbdev-mkdocs
- [ ] Wrap the functionality into a CLI command 'nbdev_mkdocs docstring generate'
- [ ] Update guide


Discussion / hints:

Fix patch:
diff --git a/README.md b/README.md
index aaa20ad2..a6f8e3e6 100644
--- a/README.md
+++ b/README.md
@@ -191,6 +191,8 @@ nbdev_mkdocs --help
     ╭─ Commands ───────────────────────────────────────────────────────────────────╮
     │ docs                   Prepares files in **mkdocs/docs** and then runs       │
     │                        **mkdocs build** command on them                      │
+    │ docstring              Command for adding docstrings to classes and methods  │
+    │                        that don't have one using docstring-gen library.      │
     │ generate-social-image  Generate a custom social share image                  │
     │ new                    Creates files in **mkdocs** subdirectory needed for   │
     │                        other **nbdev_mkdocs** subcommands                    │
diff --git a/mkdocs/mkdocs.yml b/mkdocs/mkdocs.yml
index 7ae4f826..a6f478c1 100644
--- a/mkdocs/mkdocs.yml
+++ b/mkdocs/mkdocs.yml
@@ -71,6 +71,7 @@ theme:
   - search.suggest
   - search.highlight
   - search.share
+  - content.code.copy
   palette:
   - scheme: slate
     primary: black
diff --git a/nbdev_mkdocs/_cli.py b/nbdev_mkdocs/_cli.py
index 07db5a6c..7c9466e3 100644
--- a/nbdev_mkdocs/_cli.py
+++ b/nbdev_mkdocs/_cli.py
@@ -9,11 +9,13 @@
 from asyncio import run as aiorun
 
 import typer
+from nbdev.config import get_config
 
 import nbdev_mkdocs
 import nbdev_mkdocs.mkdocs
+from docstring_gen.docstring_generator import add_docstring_to_source
 
-# %% ../nbs/CLI.ipynb 3
+# %% ../nbs/CLI.ipynb 4
 _app = typer.Typer(help="")
 
 
@@ -93,6 +95,21 @@ def generate_social_image(
     """CLI command for generating a custom social share image"""
 
     async def _generate_social_image(root_path, generator, prompt, image_path):
+        """Generate a social image.
+
+        Args:
+            root_path: The root path of the project.
+            generator: The generator to use.
+            prompt: The prompt to use.
+            image_path: The path to save the image to.
+
+        Raises:
+            typer.Exit: If an unexpected internal error occurs.
+
+        !!! note
+
+            The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+        """
         try:
             await nbdev_mkdocs.social_image_generator.generate_social_image(
                 root_path=root_path,
@@ -107,3 +124,110 @@ async def _generate_social_image(root_path, generator, prompt, image_path):
             raise typer.Exit(1)
 
     aiorun(_generate_social_image(root_path, generator, prompt, image_path))
+
+# %% ../nbs/CLI.ipynb 6
+def _create_docstring_gen_sub_cmd(_app: typer.Typer = _app) -> None:
+    """Create docstring gen sub command"""
+    _docstring_gen_app = typer.Typer(
+        help="Command for adding docstrings to classes and methods that don't have one using docstring-gen library."
+    )
+
+    @_docstring_gen_app.command(
+        help="Add docstring to classes and methods that don't have one using docstring-gen library.",
+    )
+    def generate(
+        path: str = typer.Option(
+            None,
+            "--path",
+            "-p",
+            help='The path to the directory containing Jupyter notebooks. If None, then the "nbs_path" from the settings.ini will be used.',
+        ),
+        include_auto_gen_txt: bool = typer.Option(
+            True,
+            help="If set to True, a note indicating that the docstring was autogenerated by docstring-gen library will be added to the end.",
+        ),
+        recreate_auto_gen_docs: bool = typer.Option(
+            False,
+            "--force-recreate-auto-generated",
+            "-f",
+            help="If set to True, the autogenerated docstrings from the previous runs will be replaced with the new one.",
+        ),
+        model: str = typer.Option(
+            "code-davinci-002",
+            help="The name of the Codex model that will be used to generate docstrings.",
+        ),
+        temperature: float = typer.Option(
+            0.2,
+            help="Setting the temperature close to zero produces better results, whereas higher temperatures produce more complex, and sometimes irrelevant docstrings.",
+            min=0.0,
+            max=1.0,
+        ),
+        max_tokens: int = typer.Option(
+            250,
+            help="The maximum number of tokens to be used when generating a docstring for a function or class. Please note that a higher number will deplete your token quota faster.",
+        ),
+        top_p: float = typer.Option(
+            1.0,
+            help="You can also specify a top-P value from 0-1 to achieve similar results to changing the temperature. According to the Open AI documentation, it is generally recommended to change either this or the temperature but not both.",
+            min=0.0,
+            max=1.0,
+        ),
+        n: int = typer.Option(
+            3,
+            help="The number of docstrings to be generated for each function or class, with the best one being added to the source code. Please note that a higher number will deplete your token quota faster.",
+        ),
+    ) -> None:
+
+        """Add docstring to classes and methods that don't have one by using the 'docstring-gen' library
+
+        Args:
+            path: The path to the directory containing Jupyter notebooks. If None, then the "nbs_path" from the settings.ini will be used.
+            include_auto_gen_txt: If set to True, a note indicating that the docstring was autogenerated by 'docstring-gen' library will be added to the end.
+            recreate_auto_gen_docs: If set to True, the autogenerated docstrings from the previous runs will be replaced with the new one.
+            model: The name of the Codex model that will be used to generate docstrings.
+            temperature: Setting the temperature close to zero produces better results, whereas higher temperatures produce more complex, and sometimes irrelevant docstrings.
+            max_tokens: The maximum number of tokens to be used when generating a docstring for a function or class. Please note that a higher number will deplete your token quota faster.
+            top_p: You can also specify a top-P value from 0-1 to achieve similar results to changing the temperature. According to the Open AI documentation, it is generally recommended to change either this or the temperature but not both.
+            n: The number of docstrings to be generated for each function or class, with the best one being added to the source code. Please note that a higher number will deplete your token quota faster.
+
+        Returns:
+            None
+
+        !!! note
+
+            The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+        """
+
+        if path is None:
+            path = str(Path(get_config().nbs_path).resolve())
+
+        else:
+            if not Path(path).exists():
+                typer.secho(
+                    f"Path '{Path(path).resolve()}' does not exists!",
+                    err=True,
+                    fg=typer.colors.RED,
+                )
+                raise typer.Exit(code=1)
+        try:
+            add_docstring_to_source(
+                path=path,
+                include_auto_gen_txt=include_auto_gen_txt,
+                recreate_auto_gen_docs=recreate_auto_gen_docs,
+                model=model,
+                temperature=temperature,
+                max_tokens=max_tokens,
+                top_p=top_p,
+                n=n,
+            )
+        except Exception as e:
+            typer.secho(e, err=True, fg=typer.colors.RED)
+            raise typer.Exit(1)
+
+    _app.add_typer(
+        _docstring_gen_app,
+        name="docstring",
+    )
+
+
+_create_docstring_gen_sub_cmd()
diff --git a/nbdev_mkdocs/_helpers/cli_doc.py b/nbdev_mkdocs/_helpers/cli_doc.py
index 411b657f..474e1cfe 100644
--- a/nbdev_mkdocs/_helpers/cli_doc.py
+++ b/nbdev_mkdocs/_helpers/cli_doc.py
@@ -14,6 +14,7 @@
 import click.core
 from click import Command, Group  # , Option
 import typer
+from typer.testing import CliRunner
 
 # %% ../../nbs/CLI_Doc_Helper.ipynb 3
 _default_app_names = ("app", "cli", "main")
@@ -21,7 +22,35 @@
 
 
 class _State:
+    """A class to represent a state.
+
+    Attributes:
+        app : the app
+        func : the func
+        file : the file
+        module : the module
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
+
     def __init__(self) -> None:
+        """Initialize the class
+
+        Args:
+            app: The app name
+            func: The function name
+            file: The file name
+            module: The module name
+
+        Returns:
+            None
+
+        !!! note
+
+            The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+        """
         self.app: Optional[str] = None
         self.func: Optional[str] = None
         self.file: Optional[Path] = None
@@ -33,6 +62,18 @@ def __init__(self) -> None:
 
 def _get_typer_from_module(module: Any) -> Optional[typer.Typer]:
     # Try to get defined app
+    """Get a Typer object from a module.
+
+    Args:
+        module: The module to get the Typer object from.
+
+    Returns:
+        A Typer object.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     if _state.app:
         obj: Optional[typer.Typer] = getattr(module, _state.app, None)
         if not isinstance(obj, typer.Typer):
@@ -80,6 +121,18 @@ def _get_typer_from_module(module: Any) -> Optional[typer.Typer]:
 
 
 def _get_typer_from_state() -> Optional[typer.Typer]:
+    """Get a Typer object from a module.
+
+    Returns:
+        The Typer object.
+
+    Raises:
+        ValueError: If the module does not contain a Typer object.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     spec = None
     if _state.file:
         module_name = _state.file.name
@@ -108,6 +161,22 @@ def _get_docs_for_click(
     name: str = "",
     call_prefix: str = "",
 ) -> str:
+    """Generate documentation for a click command.
+
+    Args:
+        obj: The click command to document.
+        ctx: The click context.
+        indent: The indentation level.
+        name: The name of the command.
+        call_prefix: The prefix to use when calling the command.
+
+    Returns:
+        The generated documentation.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     docs = "#" * (1 + indent)
     command_name = name or obj.name
     if call_prefix:
@@ -176,21 +245,41 @@ def _get_docs_for_click(
     return docs
 
 # %% ../../nbs/CLI_Doc_Helper.ipynb 4
-def generate_cli_doc(
-    ctx: typer.Context,
-    module_name: str,
-    app_name: str,
-) -> None:
-    """
-    Generate Markdown docs for a Typer app.
+def generate_cli_doc(module_name: str, app_name: str) -> str:
+
+    """Generate CLI documentation for a Typer app.
+
+    Args:
+        module_name: The name of the module containing the Typer app.
+        app_name: The name of the Typer app.
+
+    Returns:
+        The CLI documentation for the Typer app.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
-    _state.module = f"{module_name}"
-    typer_obj = _get_typer_from_state()
-
-    if not typer_obj:
-        typer.echo(f"No Typer app found", err=True)
-        raise typer.Abort()
-    click_obj = typer.main.get_command(typer_obj)
-    docs = _get_docs_for_click(obj=click_obj, ctx=ctx, name=app_name)
-    clean_docs = f"{docs.strip()}\n"
-    typer.echo(clean_docs)
+
+    def _generate_cli_doc(
+        ctx: typer.Context,
+        module_name: str,
+        app_name: str,
+    ) -> None:
+        """Generate Markdown docs for a Typer app."""
+        _state.module = f"{module_name}"
+        typer_obj = _get_typer_from_state()
+
+        if not typer_obj:
+            typer.echo(f"No Typer app found", err=True)
+            raise typer.Abort()
+        click_obj = typer.main.get_command(typer_obj)
+        docs = _get_docs_for_click(obj=click_obj, ctx=ctx, name=app_name)
+        clean_docs = f"{docs.strip()}\n"
+        typer.echo(clean_docs)
+
+    app = typer.Typer()
+    app.command()(_generate_cli_doc)
+    runner = CliRunner()
+    result = runner.invoke(app, [module_name, app_name])
+    return result.stdout
diff --git a/nbdev_mkdocs/_helpers/utils.py b/nbdev_mkdocs/_helpers/utils.py
index dff5c0b9..91f5cfe4 100644
--- a/nbdev_mkdocs/_helpers/utils.py
+++ b/nbdev_mkdocs/_helpers/utils.py
@@ -16,7 +16,15 @@
 # %% ../../nbs/Utils.ipynb 3
 @contextmanager
 def set_cwd(cwd_path: Union[Path, str]):
+    """Set the current working directory for the duration of the context manager.
 
+    Args:
+        cwd_path: The path to the new working directory.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     cwd_path = Path(cwd_path)
     original_cwd = os.getcwd()
     os.chdir(cwd_path)
@@ -29,8 +37,19 @@ def set_cwd(cwd_path: Union[Path, str]):
 
 # %% ../../nbs/Utils.ipynb 5
 def get_value_from_config(root_path: str, config_name: str) -> str:
-    """Get the value from settings.ini file"""
+    """Get a value from the configuration file.
 
+    Args:
+        root_path: The root path of the configuration file.
+        config_name: The name of the configuration to get.
+
+    Returns:
+        The value of the configuration.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     settings_path = Path(root_path) / "settings.ini"
     config = ConfigParser()
     config.read(settings_path)
@@ -41,6 +60,18 @@ def get_value_from_config(root_path: str, config_name: str) -> str:
 # %% ../../nbs/Utils.ipynb 7
 def is_local_path(path):
     # Check if the path is an absolute path
+    """Check if a path is a local path.
+
+    Args:
+        path: The path to check.
+
+    Returns:
+        True if the path is a local path, False otherwise.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     if os.path.isabs(path):
         return True
 
@@ -55,10 +86,17 @@ def is_local_path(path):
 
 # %% ../../nbs/Utils.ipynb 9
 def add_counter_suffix_to_filename(src_path: Path):
-    """Add a counter suffix to the given file
+    """Add a counter suffix to a file name.
 
     Args:
-        src_path: The path to the file to rename.
+        src_path: Path to the file to be renamed
+
+    Returns:
+        None
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     parent_dir = src_path.parent
     counter_suffix = (
diff --git a/nbdev_mkdocs/_modidx.py b/nbdev_mkdocs/_modidx.py
index 0628a12a..16475791 100644
--- a/nbdev_mkdocs/_modidx.py
+++ b/nbdev_mkdocs/_modidx.py
@@ -39,8 +39,11 @@
                                                                                                            'nbdev_mkdocs/mkdocs.py'),
                                      'nbdev_mkdocs.mkdocs._add_requirements_to_settings': ( 'mkdocs.html#_add_requirements_to_settings',
                                                                                             'nbdev_mkdocs/mkdocs.py'),
+                                     'nbdev_mkdocs.mkdocs._build_summary': ('mkdocs.html#_build_summary', 'nbdev_mkdocs/mkdocs.py'),
                                      'nbdev_mkdocs.mkdocs._copy_change_log_if_exists': ( 'mkdocs.html#_copy_change_log_if_exists',
                                                                                          'nbdev_mkdocs/mkdocs.py'),
+                                     'nbdev_mkdocs.mkdocs._copy_cname_if_needed': ( 'mkdocs.html#_copy_cname_if_needed',
+                                                                                    'nbdev_mkdocs/mkdocs.py'),
                                      'nbdev_mkdocs.mkdocs._copy_docs_overrides': ( 'mkdocs.html#_copy_docs_overrides',
                                                                                    'nbdev_mkdocs/mkdocs.py'),
                                      'nbdev_mkdocs.mkdocs._copy_images_to_docs_dir': ( 'mkdocs.html#_copy_images_to_docs_dir',
@@ -56,6 +59,14 @@
                                                                                         'nbdev_mkdocs/mkdocs.py'),
                                      'nbdev_mkdocs.mkdocs._flattern_sidebar_items': ( 'mkdocs.html#_flattern_sidebar_items',
                                                                                       'nbdev_mkdocs/mkdocs.py'),
+                                     'nbdev_mkdocs.mkdocs._generate_api_doc_for_submodule': ( 'mkdocs.html#_generate_api_doc_for_submodule',
+                                                                                              'nbdev_mkdocs/mkdocs.py'),
+                                     'nbdev_mkdocs.mkdocs._generate_api_docs_for_module': ( 'mkdocs.html#_generate_api_docs_for_module',
+                                                                                            'nbdev_mkdocs/mkdocs.py'),
+                                     'nbdev_mkdocs.mkdocs._generate_cli_doc_for_submodule': ( 'mkdocs.html#_generate_cli_doc_for_submodule',
+                                                                                              'nbdev_mkdocs/mkdocs.py'),
+                                     'nbdev_mkdocs.mkdocs._generate_cli_docs_for_module': ( 'mkdocs.html#_generate_cli_docs_for_module',
+                                                                                            'nbdev_mkdocs/mkdocs.py'),
                                      'nbdev_mkdocs.mkdocs._generate_default_social_image_link': ( 'mkdocs.html#_generate_default_social_image_link',
                                                                                                   'nbdev_mkdocs/mkdocs.py'),
                                      'nbdev_mkdocs.mkdocs._generate_markdown_from_files': ( 'mkdocs.html#_generate_markdown_from_files',
@@ -70,6 +81,7 @@
                                                                                         'nbdev_mkdocs/mkdocs.py'),
                                      'nbdev_mkdocs.mkdocs._get_sidebar_from_config': ( 'mkdocs.html#_get_sidebar_from_config',
                                                                                        'nbdev_mkdocs/mkdocs.py'),
+                                     'nbdev_mkdocs.mkdocs._get_submodules': ('mkdocs.html#_get_submodules', 'nbdev_mkdocs/mkdocs.py'),
                                      'nbdev_mkdocs.mkdocs._get_title_from_notebook': ( 'mkdocs.html#_get_title_from_notebook',
                                                                                        'nbdev_mkdocs/mkdocs.py'),
                                      'nbdev_mkdocs.mkdocs._read_sidebar_from_yml': ( 'mkdocs.html#_read_sidebar_from_yml',
@@ -90,18 +102,6 @@
                                                                                        'nbdev_mkdocs/mkdocs.py'),
                                      'nbdev_mkdocs.mkdocs._update_quarto_tags_to_markdown_format': ( 'mkdocs.html#_update_quarto_tags_to_markdown_format',
                                                                                                      'nbdev_mkdocs/mkdocs.py'),
-                                     'nbdev_mkdocs.mkdocs.build_summary': ('mkdocs.html#build_summary', 'nbdev_mkdocs/mkdocs.py'),
-                                     'nbdev_mkdocs.mkdocs.copy_cname_if_needed': ( 'mkdocs.html#copy_cname_if_needed',
-                                                                                   'nbdev_mkdocs/mkdocs.py'),
-                                     'nbdev_mkdocs.mkdocs.generate_api_doc_for_submodule': ( 'mkdocs.html#generate_api_doc_for_submodule',
-                                                                                             'nbdev_mkdocs/mkdocs.py'),
-                                     'nbdev_mkdocs.mkdocs.generate_api_docs_for_module': ( 'mkdocs.html#generate_api_docs_for_module',
-                                                                                           'nbdev_mkdocs/mkdocs.py'),
-                                     'nbdev_mkdocs.mkdocs.generate_cli_doc_for_submodule': ( 'mkdocs.html#generate_cli_doc_for_submodule',
-                                                                                             'nbdev_mkdocs/mkdocs.py'),
-                                     'nbdev_mkdocs.mkdocs.generate_cli_docs_for_module': ( 'mkdocs.html#generate_cli_docs_for_module',
-                                                                                           'nbdev_mkdocs/mkdocs.py'),
-                                     'nbdev_mkdocs.mkdocs.get_submodules': ('mkdocs.html#get_submodules', 'nbdev_mkdocs/mkdocs.py'),
                                      'nbdev_mkdocs.mkdocs.nbdev_mkdocs_docs': ('mkdocs.html#nbdev_mkdocs_docs', 'nbdev_mkdocs/mkdocs.py'),
                                      'nbdev_mkdocs.mkdocs.nbdev_mkdocs_docs_cli': ( 'mkdocs.html#nbdev_mkdocs_docs_cli',
                                                                                     'nbdev_mkdocs/mkdocs.py'),
diff --git a/nbdev_mkdocs/_package_data.py b/nbdev_mkdocs/_package_data.py
index 495b2794..d14bc383 100644
--- a/nbdev_mkdocs/_package_data.py
+++ b/nbdev_mkdocs/_package_data.py
@@ -22,5 +22,8 @@ def get_root_data_path() -> Path:
 
         ```
 
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     return Path(__file__).parent / "package_data"
diff --git a/nbdev_mkdocs/docstring.py b/nbdev_mkdocs/docstring.py
index ff67cb16..34eb5999 100644
--- a/nbdev_mkdocs/docstring.py
+++ b/nbdev_mkdocs/docstring.py
@@ -49,6 +49,21 @@
 
 # %% ../nbs/Docstring.ipynb 10
 def _extract_examples_from_docstring(o: Any) -> List[str]:
+    """Extract examples from docstring
+
+    Args:
+        o: Any object with a docstring
+
+    Returns:
+        List of examples
+
+    Raises:
+        ValueError: If the object has no docstring
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     try:
         import griffe
     except:
@@ -63,6 +78,21 @@ def _extract_examples_from_docstring(o: Any) -> List[str]:
     )
 
     def find_python_code(s: str) -> str:
+        """Finds the python code in a string
+
+        Args:
+            s: The string to search
+
+        Returns:
+            The python code
+
+        Raises:
+            ValueError: If no python code is found
+
+        !!! note
+
+            The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+        """
         code = [x[0] for x in re.findall("```\s*python((\n|.|\\n])+)```", s)]
         #         print(f"{code=}")
         if len(code) == 0:
@@ -79,6 +109,18 @@ def find_python_code(s: str) -> str:
 
 # %% ../nbs/Docstring.ipynb 15
 def _get_keywords(examples: List[str]) -> List[str]:
+    """Get keywords from examples.
+
+    Args:
+        examples (List[str]): List of examples.
+
+    Returns:
+        List[str]: List of keywords.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     keywords: List[str] = sum(
         [
             [x[9:-1] for x in re.findall("{fill in \w+}", example)]
@@ -91,6 +133,22 @@ def _get_keywords(examples: List[str]) -> List[str]:
 
 # %% ../nbs/Docstring.ipynb 17
 def _replace_keywords(examples: List[str], **kwargs) -> List[str]:
+    """Replace keywords in a list of strings with the corresponding values in kwargs.
+
+    Args:
+        examples: A list of strings
+        **kwargs: Keyword arguments
+
+    Returns:
+        A list of strings with keywords replaced by values
+
+    Raises:
+        ValueError: If the set of keywords is not a subset of the set of keys in kwargs
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     keywords = _get_keywords(examples)
 
     if set(keywords) > set(kwargs.keys()):
@@ -113,6 +171,22 @@ def _format_output(
     sub_dict: Optional[Dict[str, str]] = None,
     width: Optional[int] = None,
 ):
+    """Format the output of a string.
+
+    Args:
+        s: The string to format.
+        title: The title of the output.
+        supress: Whether to supress the output.
+        sub_dict: A dictionary of patterns to replace in the string.
+        width: The width of the output.
+
+    Returns:
+        The formatted string.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     if sub_dict:
         for pattern, replacement in sub_dict.items():
             s = re.sub(pattern, replacement, s)
@@ -173,6 +247,10 @@ def f():
 
         run_examples_from_docstring(f, name="John", other_name="Jane")
         ```
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     console = Console(width=width)
 
diff --git a/nbdev_mkdocs/mkdocs.py b/nbdev_mkdocs/mkdocs.py
index 7fdacc0e..5fd6f896 100644
--- a/nbdev_mkdocs/mkdocs.py
+++ b/nbdev_mkdocs/mkdocs.py
@@ -1,9 +1,7 @@
 # AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/Mkdocs.ipynb.
 
 # %% auto 0
-__all__ = ['new', 'new_cli', 'get_submodules', 'generate_api_doc_for_submodule', 'generate_api_docs_for_module',
-           'generate_cli_doc_for_submodule', 'generate_cli_docs_for_module', 'build_summary', 'copy_cname_if_needed',
-           'nbdev_mkdocs_docs', 'nbdev_mkdocs_docs_cli', 'prepare', 'prepare_cli', 'preview', 'preview_cli']
+__all__ = ['new', 'new_cli', 'nbdev_mkdocs_docs', 'nbdev_mkdocs_docs_cli', 'prepare', 'prepare_cli', 'preview', 'preview_cli']
 
 # %% ../nbs/Mkdocs.ipynb 1
 from typing import *
@@ -25,7 +23,6 @@
 import yaml
 
 import typer
-from typer.testing import CliRunner
 
 from configupdater import ConfigUpdater, Section
 from configupdater.option import Option
@@ -53,8 +50,11 @@ def _add_requirements_to_settings(root_path: str):
     """Adds requirments needed for mkdocs to settings.ini
 
     Args:
-        root_path: path to where the settings.ini file is located
+        root_path: Path to the root of the project.
 
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     _requirements_path = get_root_data_path() / "requirements.txt"
     with open(_requirements_path, "r") as f:
@@ -99,6 +99,18 @@ def _add_requirements_to_settings(root_path: str):
         old_req: str = updater["DEFAULT"][option_name].value  # type: ignore
 
         def remove_leading_spaces(s: str) -> str:
+            """Remove leading spaces from a string
+
+            Args:
+                s: The string to remove leading spaces from
+
+            Returns:
+                The string with leading spaces removed
+
+            !!! note
+
+                The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+            """
             return "\n".join([x.lstrip() for x in s.split("\n")])
 
         old_req = remove_leading_spaces(old_req)
@@ -128,6 +140,21 @@ def remove_leading_spaces(s: str) -> str:
 
 # %% ../nbs/Mkdocs.ipynb 9
 def _create_mkdocs_dir(root_path: str):
+    """Create a mkdocs directory in the root path.
+
+    Args:
+        root_path: The root path.
+
+    Returns:
+        None
+
+    Raises:
+        typer.Exit: If the mkdocs_template path does not exist.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     mkdocs_template_path = get_root_data_path() / "mkdocs_template"
     if not mkdocs_template_path.exists():
         typer.secho(
@@ -159,6 +186,19 @@ def _create_mkdocs_dir(root_path: str):
 def _get_kwargs_from_settings(
     settings_path: Path, mkdocs_template: Optional[str] = None
 ) -> Dict[str, str]:
+    """Get the values from the settings file
+
+    Args:
+        settings_path: The path to the settings file
+        mkdocs_template: The mkdocs template to use
+
+    Returns:
+        A dictionary of the kwargs
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     config = ConfigParser()
     config.read(settings_path)
     if not mkdocs_template:
@@ -169,6 +209,18 @@ def _get_kwargs_from_settings(
 
 # %% ../nbs/Mkdocs.ipynb 18
 def _create_mkdocs_yaml(root_path: str):
+    """Create mkdocs.yml file
+
+    Args:
+        root_path: The root path of the project
+
+    Raises:
+        ValueError: If root_path is invalid or does not exists
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     try:
         # create mkdocs folder if necessary
         mkdocs_path = Path(root_path) / "mkdocs" / "mkdocs.yml"
@@ -207,6 +259,15 @@ def _create_mkdocs_yaml(root_path: str):
 
 
 def _create_summary_template(root_path: str):
+    """Create a summary template file for mkdocs.
+
+    Args:
+        root_path: The root path of the project.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     try:
         # create mkdocs folder if necessary
         summary_template_path = Path(root_path) / "mkdocs" / "summary_template.txt"
@@ -233,12 +294,15 @@ def _create_summary_template(root_path: str):
 
 # %% ../nbs/Mkdocs.ipynb 23
 def _replace_ghp_deploy_action(root_path: str):
-    """Replace the default gh-pages deploy action file with the custom action template file
+    """Replace the default deploy action file in the .github/workflows directory with a custom one.
 
     Args:
-        root_path: Project's root path
-    """
+        root_path: The root path of the project.
+
+    !!! note
 
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     src_path = get_root_data_path() / "ghp_deploy_action_template.yml"
     if not src_path.exists():
         typer.secho(
@@ -256,12 +320,15 @@ def _replace_ghp_deploy_action(root_path: str):
 
 # %% ../nbs/Mkdocs.ipynb 26
 def _update_gitignore_file(root_path: str):
-    """Update the .gitignore file to include the autogenerated mkdocs directories
+    """Add the autogenerated mkdocs directories to the .gitignore file.
 
     Args:
-        root_path: Project's root path
-    """
+        root_path: The root path of the project
+
+    !!! note
 
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     _mkdocs_gitignore_path = get_root_data_path() / "gitignore.txt"
     with open(_mkdocs_gitignore_path, "r") as f:
         _new_paths_to_ignore = f.read()
@@ -281,12 +348,15 @@ def _update_gitignore_file(root_path: str):
 
 # %% ../nbs/Mkdocs.ipynb 28
 def _generate_default_social_image_link(root_path: str):
-    """Generating default social sharing image link and add it to the mkdocs yaml file
+    """Add default social sharing image link to the mkdocs yaml file
 
     Args:
-        root_path: Project's root path
-    """
+        root_path: The root path of the project.
 
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     with set_cwd(root_path):
         repo = get_value_from_config(root_path, "repo")
         user = get_value_from_config(root_path, "user")
@@ -305,7 +375,11 @@ def new(root_path: str):
     needed.
 
     Args:
-        root_path: path under which mkdocs directory will be created
+        root_path: The path to the root of the project
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     _add_requirements_to_settings(root_path)
     _create_mkdocs_dir(root_path)
@@ -323,20 +397,30 @@ def new_cli(root_path: str = "."):
     Creates **mkdocs** directory in the **root_path** directory and populates
     it with initial values. You should edit mkdocs.yml file to customize it if
     needed.
+
+    Args:
+        root_path: The path to the root of the project.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     new(root_path)
 
 # %% ../nbs/Mkdocs.ipynb 35
 def _get_files_to_convert_to_markdown(cache: Path) -> List[Path]:
-    """Gets a list of notebooks and qmd files that need to be converted to markdown.
+    """Get a list of notebooks and qmd files that require conversion to markdown format.
 
     Args:
-        cache: Path to the nbs cache directory
+        cache: The cache directory path
 
     Returns:
-        A list of files that need to be converted to markdown
-    """
+        A list of files to convert to markdown
 
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     exts = [".ipynb", ".qmd"]
     files = [
         f
@@ -348,15 +432,18 @@ def _get_files_to_convert_to_markdown(cache: Path) -> List[Path]:
 
 # %% ../nbs/Mkdocs.ipynb 37
 def _update_conditional_content_tags(text: str) -> str:
-    """Update the conditional content tags in the notebook.
+    """Update conditional content tags.
 
     Args:
         text: The text to update the conditional content tags in.
 
     Returns:
         The updated text with the conditional content tags modified.
-    """
 
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     pattern = r":::\s*{(?:\s*.*\.content-visible|\s*\.content-hidden)\s*(when|unless)-format\s*=\\\s*(\"|\')\s*(html|markdown)\s*\\(\"|\')\s*.*}"
     text = re.sub(
         pattern,
@@ -369,13 +456,17 @@ def _update_conditional_content_tags(text: str) -> str:
 
 # %% ../nbs/Mkdocs.ipynb 40
 def _update_mermaid_chart_tags(text: str) -> str:
-    """Update the mermaid chart tags from quarto format to markdown format
+    """Convert the mermaid chart tags from quarto format to markdown format.
 
     Args:
         text: The text to update the mermaid chart tags in.
 
     Returns:
         The updated text with the mermaid chart tags modified.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     pattern = r"```\s*{mermaid\s*}"
     text = re.sub(pattern, "``` mermaid", text)
@@ -383,16 +474,17 @@ def _update_mermaid_chart_tags(text: str) -> str:
 
 # %% ../nbs/Mkdocs.ipynb 42
 def _add_markdown_attribute_to_enable_md_in_html(text: str) -> str:
-    """Add support for markdown in HTML
-
-    This function replaces the `::: {` character sequence into `::: {markdown=1` in a string
-    to support markdown in HTML
+    """Add markdown attribute to enable markdown in html.
 
     Args:
-        text: The input string to be processed
+        text: The text to add the markdown attribute to
 
     Returns:
-        The input string with the `::: {` character sequence replaced by `::: {markdown=1`
+        The text with the markdown attribute added
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     pattern = r":::\s*{\s*(markdown=1)?\s*"
     text = re.sub(pattern, r"::: {markdown=1 ", text)
@@ -400,10 +492,14 @@ def _add_markdown_attribute_to_enable_md_in_html(text: str) -> str:
 
 # %% ../nbs/Mkdocs.ipynb 44
 def _update_quarto_tags_to_markdown_format(nb_path: Path):
-    """Update Quarto tags to Markdown format in the given notebook.
+    """Update Quarto tags to Markdown format
 
     Args:
-        nb_path: The path to the notebook.
+        nb_path: Path to the notebook
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     with open(nb_path, "r") as f:
         contents = f.read()
@@ -417,6 +513,18 @@ def _update_quarto_tags_to_markdown_format(nb_path: Path):
 
 # %% ../nbs/Mkdocs.ipynb 47
 def _sprun(cmd):
+    """Run a command via subprocess.check_output
+
+    Args:
+        cmd: The command to run
+
+    Raises:
+        subprocess.CalledProcessError: If the command fails
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     try:
         # nosemgrep: python.lang.security.audit.subprocess-shell-true.subprocess-shell-true
         subprocess.check_output(
@@ -430,7 +538,15 @@ def _sprun(cmd):
 
 # %% ../nbs/Mkdocs.ipynb 48
 def _generate_markdown_from_files(root_path: str):
+    """Generate markdown files from notebook files.
+
+    Args:
+        root_path: The root path of the project.
 
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     doc_path = Path(root_path) / "mkdocs" / "docs"
     doc_path.mkdir(exist_ok=True, parents=True)
 
@@ -454,14 +570,18 @@ def _generate_markdown_from_files(root_path: str):
 
 # %% ../nbs/Mkdocs.ipynb 50
 def _replace_all(text: str, dir_prefix: str) -> str:
-    """Replace the images relative path in the markdown text
+    """Replace the images relative path in the markdown string
 
     Args:
-        text: String to replace
+        text: The markdown string
         dir_prefix: Sub directory prefix to append to the image's relative path
 
     Returns:
         The text with the updated images relative path
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     _replace = {}
 
@@ -498,6 +618,10 @@ def _update_path_in_markdown(cache: Path, doc_path: Path):
     Args:
         cache: Path to the nbs cache directory
         doc_path: Path to the mkdocs/docs directory
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     files = _get_files_to_convert_to_markdown(cache)
 
@@ -513,12 +637,16 @@ def _update_path_in_markdown(cache: Path, doc_path: Path):
 
 
 def _copy_images_to_docs_dir(root_path: str):
-    """Copy guide images to the docs directory
+    # Reference: https://github.com/quarto-dev/quarto-cli/blob/main/src/core/image.ts#L38
+    """Copy images from nbs to docs directory.
 
     Args:
-        root_path: Project's root directory
+        root_path: The root path of the project.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
-    # Reference: https://github.com/quarto-dev/quarto-cli/blob/main/src/core/image.ts#L38
     image_extensions = [
         ".apng",
         ".avif",
@@ -551,6 +679,21 @@ def _copy_images_to_docs_dir(root_path: str):
 
 # %% ../nbs/Mkdocs.ipynb 56
 def _get_title_from_notebook(file_path: Path) -> str:
+    """Get the title of a notebook or markdown file.
+
+    Args:
+        file_path: The path to the file.
+
+    Returns:
+        The title of the file.
+
+    Raises:
+        ValueError: If the file does not exist.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     title: str
     cache = proc_nbs()
     _file_path = Path(cache) / file_path
@@ -591,7 +734,21 @@ def _get_title_from_notebook(file_path: Path) -> str:
 
 # %% ../nbs/Mkdocs.ipynb 58
 def _get_sidebar_from_config(file_path: Path) -> List[Any]:
+    """Get the sidebar contents from the sidebar.yml or _quarto.yml file.
+
+    Args:
+        file_path: Path to the sidebar.yml or _quarto.yml file.
 
+    Returns:
+        The sidebar contents.
+
+    Raises:
+        KeyError: If the sidebar is not defined in the config file.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     if not file_path.exists():
         typer.secho(
             f"Path '{file_path.resolve()}' does not exists!",
@@ -616,6 +773,18 @@ def _get_sidebar_from_config(file_path: Path) -> List[Any]:
 
 
 def _read_sidebar_from_yml(root_path: str) -> List[Union[str, Any]]:
+    """Get the sidebar contents from the sidebar.yml or _quarto.yml file.
+
+    Args:
+        root_path: The root path of the project.
+
+    Returns:
+        A list of strings and objects.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     _proc_dir = Path(root_path) / "_proc"
     sidebar_yml_path = _proc_dir / "sidebar.yml"
     _quarto_yml_path = _proc_dir / "_quarto.yml"
@@ -633,6 +802,18 @@ def _read_sidebar_from_yml(root_path: str) -> List[Union[str, Any]]:
 
 # %% ../nbs/Mkdocs.ipynb 61
 def _flattern_sidebar_items(items: List[Union[str, Any]]) -> List[Union[str, Any]]:
+    """Flatten a list of items.
+
+    Args:
+        items: A list of items.
+
+    Returns:
+        A flattened list of items.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     return [i for item in items if isinstance(item, list) for i in item] + [
         item for item in items if not isinstance(item, list)
     ]
@@ -641,7 +822,19 @@ def _flattern_sidebar_items(items: List[Union[str, Any]]) -> List[Union[str, Any
 def _expand_sidebar_if_needed(
     root_path: str, sidebar: List[Union[str, Any]]
 ) -> List[Union[str, Any]]:
-    """ """
+    """Expand the sidebar if needed.
+
+    Args:
+        root_path: The root path of the project
+        sidebar: The sidebar to expand
+
+    Returns:
+        The expanded sidebar
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     _proc_dir = Path(root_path) / "_proc"
     exts = [".ipynb", ".qmd"]
 
@@ -663,6 +856,19 @@ def _expand_sidebar_if_needed(
 
 # %% ../nbs/Mkdocs.ipynb 63
 def _generate_nav_from_sidebar(sidebar_items, level=0) -> str:
+    """Generate a navigation string for mkdocs from a sidebar list.
+
+    Args:
+        sidebar_items: A list of strings or dictionaries.
+        level: The level of indentation to use.
+
+    Returns:
+        str: The navigation string.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     output = ""
     links = [
         "{}- [{}]({}.md)\n".format(
@@ -682,6 +888,18 @@ def _generate_nav_from_sidebar(sidebar_items, level=0) -> str:
 def _generate_summary_for_sidebar(
     root_path: str,
 ) -> str:
+    """Generate a summary for the sidebar
+
+    Args:
+        root_path: The root path
+
+    Returns:
+        The summary for the sidebar
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     with set_cwd(root_path):
         sidebar = _read_sidebar_from_yml(root_path)
         expanded_sidebar = _expand_sidebar_if_needed(root_path, sidebar)
@@ -690,7 +908,19 @@ def _generate_summary_for_sidebar(
         return sidebar_nav
 
 # %% ../nbs/Mkdocs.ipynb 68
-def get_submodules(package_name: str) -> List[str]:
+def _get_submodules(package_name: str) -> List[str]:
+    """Get all submodules of a package.
+
+    Args:
+        package_name: The name of the package.
+
+    Returns:
+        A list of submodules.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     # nosemgrep: python.lang.security.audit.non-literal-import.non-literal-import
     m = importlib.import_module(package_name)
     submodules = [
@@ -706,6 +936,19 @@ def get_submodules(package_name: str) -> List[str]:
 
 # %% ../nbs/Mkdocs.ipynb 70
 def _copy_not_found_file_and_get_path(root_path: str, file_prefix: str) -> str:
+    """Copy the CLI command found file to the docs directory and return the path to the file.
+
+    Args:
+        root_path: The root path of the project
+        file_prefix: The prefix of the file to be copied
+
+    Returns:
+        The path to the copied file
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     src_path = get_root_data_path() / f"{file_prefix}_not_found.md"
     if not src_path.exists():
         typer.secho(
@@ -727,9 +970,23 @@ def _copy_not_found_file_and_get_path(root_path: str, file_prefix: str) -> str:
     )
 
 # %% ../nbs/Mkdocs.ipynb 72
-def generate_api_doc_for_submodule(
+def _generate_api_doc_for_submodule(
     root_path: str, docs_dir_name: str, submodule: str
 ) -> str:
+    """Generate API documentation for a submodule.
+
+    Args:
+        root_path: The root path of the project
+        docs_dir_name: The name of the docs directory
+        submodule: The submodule for which to generate the API documentation
+
+    Returns:
+        The path to the generated API documentation
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     subpath = f"{docs_dir_name}/" + submodule.replace(".", "/") + ".md"
     path = Path(root_path) / "mkdocs" / "docs" / subpath
     path.parent.mkdir(exist_ok=True, parents=True)
@@ -742,8 +999,21 @@ def generate_api_doc_for_submodule(
         return f"- [{submodule}]({subpath})"
 
 
-def generate_api_docs_for_module(root_path: str, module_name: str) -> str:
-    submodules = get_submodules(module_name)
+def _generate_api_docs_for_module(root_path: str, module_name: str) -> str:
+    """Generate API documentation for a module.
+
+    Args:
+        root_path: The root path of the project.
+        module_name: The name of the module.
+
+    Returns:
+        A string containing the API documentation for the module.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
+    submodules = _get_submodules(module_name)
     docs_dir_name = f"{module_name}_api_docs"
     shutil.rmtree(
         Path(root_path) / "mkdocs" / "docs" / f"{docs_dir_name}", ignore_errors=True
@@ -754,7 +1024,7 @@ def generate_api_docs_for_module(root_path: str, module_name: str) -> str:
 
     submodule_summary = "\n".join(
         [
-            generate_api_doc_for_submodule(
+            _generate_api_doc_for_submodule(
                 root_path=root_path, docs_dir_name=docs_dir_name, submodule=x
             )
             for x in submodules
@@ -765,14 +1035,18 @@ def generate_api_docs_for_module(root_path: str, module_name: str) -> str:
 
 # %% ../nbs/Mkdocs.ipynb 74
 def _restrict_line_length(s: str, width: int = 80) -> str:
-    """Restrict the line length of the given string.
+    """Restrict the line length of a string.
 
     Args:
-        s: Docstring to fix the width
-        width: The maximum allowed line length
+        s: The string to be processed.
+        width: The maximum line length.
 
     Returns:
         A new string in which each line is less than the specified width.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     _s = ""
 
@@ -788,7 +1062,23 @@ def _restrict_line_length(s: str, width: int = 80) -> str:
     return _s
 
 # %% ../nbs/Mkdocs.ipynb 76
-def generate_cli_doc_for_submodule(root_path: str, docs_dir_name: str, cmd: str) -> str:
+def _generate_cli_doc_for_submodule(
+    root_path: str, docs_dir_name: str, cmd: str
+) -> str:
+    """Generate CLI documentation for a submodule.
+
+    Args:
+        root_path: The root path of the project.
+        docs_dir_name: The name of the directory where the documentation will be stored.
+        cmd: The command to generate documentation for.
+
+    Returns:
+        The generated documentation.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     cli_app_name = cmd.split("=")[0]
     module_name = cmd.split("=")[1].split(":")[0]
     method_name = cmd.split("=")[1].split(":")[1]
@@ -801,11 +1091,7 @@ def generate_cli_doc_for_submodule(root_path: str, docs_dir_name: str, cmd: str)
         # nosemgrep: python.lang.security.audit.non-literal-import.non-literal-import
         m = importlib.import_module(module_name)
         if isinstance(getattr(m, method_name), typer.Typer):
-            app = typer.Typer()
-            app.command()(generate_cli_doc)
-            runner = CliRunner()
-            result = runner.invoke(app, [module_name, cli_app_name])
-            cli_doc = str(result.stdout)
+            cli_doc = generate_cli_doc(module_name, cli_app_name)
         else:
             cmd = f"{cli_app_name} --help"
             cli_doc = (
@@ -830,7 +1116,20 @@ def generate_cli_doc_for_submodule(root_path: str, docs_dir_name: str, cmd: str)
     return f"- [{cli_app_name}]({subpath})"
 
 
-def generate_cli_docs_for_module(root_path: str, module_name: str) -> str:
+def _generate_cli_docs_for_module(root_path: str, module_name: str) -> str:
+    """Generate CLI docs for a module.
+
+    Args:
+        root_path: The root path of the module
+        module_name: The name of the module
+
+    Returns:
+        The generated CLI docs
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     docs_dir_name = f"{module_name}_cli_docs"
     shutil.rmtree(
         Path(root_path) / "mkdocs" / "docs" / f"{docs_dir_name}", ignore_errors=True
@@ -845,7 +1144,7 @@ def generate_cli_docs_for_module(root_path: str, module_name: str) -> str:
 
     submodule_summary = "\n".join(
         [
-            generate_cli_doc_for_submodule(
+            _generate_cli_doc_for_submodule(
                 root_path=root_path, docs_dir_name=docs_dir_name, cmd=cmd
             )
             for cmd in console_scripts.split("\n")
@@ -857,6 +1156,19 @@ def generate_cli_docs_for_module(root_path: str, module_name: str) -> str:
 
 # %% ../nbs/Mkdocs.ipynb 80
 def _copy_change_log_if_exists(root_path: str, docs_path: Union[Path, str]) -> str:
+    """Copy the CHANGELOG.md file to the docs folder if it's not already present.
+
+    Args:
+        root_path: The root path of the project.
+        docs_path: The path to the docs folder.
+
+    Returns:
+        The path to the copied CHANGELOG.md file.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     source_change_log_path = Path(root_path) / "CHANGELOG.md"
     dst_change_log_path = Path(docs_path) / "CHANGELOG.md"
 
@@ -871,11 +1183,21 @@ def _copy_change_log_if_exists(root_path: str, docs_path: Union[Path, str]) -> s
     return changelog
 
 # %% ../nbs/Mkdocs.ipynb 83
-def build_summary(
+def _build_summary(
     root_path: str,
     module: str,
 ):
     # create docs_path if needed
+    """Create a summary navigation file for generating navigation that is compatible with mkdocs.
+
+    Args:
+        root_path: The root path of the project.
+        module: The module to generate the API documentation for.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     docs_path = Path(root_path) / "mkdocs" / "docs"
     docs_path.mkdir(exist_ok=True)
 
@@ -892,10 +1214,10 @@ def build_summary(
     sidebar = _generate_summary_for_sidebar(root_path)
 
     # generate API
-    api = generate_api_docs_for_module(root_path, module)
+    api = _generate_api_docs_for_module(root_path, module)
 
     # generate CLI
-    cli = generate_cli_docs_for_module(root_path, module)
+    cli = _generate_cli_docs_for_module(root_path, module)
 
     # copy CHANGELOG.md as CHANGELOG.md is exists
     changelog = _copy_change_log_if_exists(root_path, docs_path)
@@ -915,7 +1237,16 @@ def build_summary(
         f.write(summary)
 
 # %% ../nbs/Mkdocs.ipynb 86
-def copy_cname_if_needed(root_path: str):
+def _copy_cname_if_needed(root_path: str):
+    """Copy the CNAME file to mkdocs/docs/CNAME if it's not already present.
+
+    Args:
+        root_path: The root path of the project
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     cname_path = Path(root_path) / "CNAME"
     dst_path = Path(root_path) / "mkdocs" / "docs" / "CNAME"
     if cname_path.exists():
@@ -931,10 +1262,14 @@ def copy_cname_if_needed(root_path: str):
 
 # %% ../nbs/Mkdocs.ipynb 88
 def _copy_docs_overrides(root_path: str):
-    """Copy lib assets inside mkodcs/docs directory
+    """Copy the docs_overrides directory to the mkdocs/docs/overrides directory.
 
     Args:
-        root_path: Project's root path.
+        root_path: The root path of the project.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     src_path = Path(root_path) / "mkdocs" / "docs_overrides"
     dst_path = Path(root_path) / "mkdocs" / "docs" / "overrides"
@@ -952,27 +1287,30 @@ def _copy_docs_overrides(root_path: str):
 
 # %% ../nbs/Mkdocs.ipynb 90
 def nbdev_mkdocs_docs(root_path: str, refresh_quarto_settings: bool = False):
-    """Prepares mkdocs documentation
+    """Prepare mkdocs documentation
 
     Args:
-        root_path: Project's root path.
+        root_path: The root path of the project
         refresh_quarto_settings: Flag to refresh quarto yml file. This flag should be set to `True`
             if this function is called directly without calling prepare.
-    """
 
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     with set_cwd(root_path):
 
         if refresh_quarto_settings:
             refresh_quarto_yml()
 
-        copy_cname_if_needed(root_path)
+        _copy_cname_if_needed(root_path)
 
         _copy_docs_overrides(root_path)
 
         lib_name = get_value_from_config(root_path, "lib_name")
         lib_path = get_value_from_config(root_path, "lib_path")
 
-        build_summary(root_path, lib_path)
+        _build_summary(root_path, lib_path)
 
         cmd = f"mkdocs build -f \"{(Path(root_path) / 'mkdocs' / 'mkdocs.yml').resolve()}\""
         _sprun(cmd)
@@ -980,15 +1318,28 @@ def nbdev_mkdocs_docs(root_path: str, refresh_quarto_settings: bool = False):
 
 @call_parse
 def nbdev_mkdocs_docs_cli(root_path: str = "."):
-    """Prepares mkdocs documentation"""
+    """Prepare mkdocs documentation
+
+    Args:
+        root_path: The root path of the project
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     nbdev_mkdocs_docs(root_path, refresh_quarto_settings=True)
 
 
 def prepare(root_path: str, no_test: bool = False):
-    """Prepares mkdocs for serving
+    """Prepare mkdocs for serving
 
     Args:
-        root_path: path under which mkdocs directory will be created
+        root_path: The root path of the project
+        no_test: If set to False, the unit tests will be run, else they will be skipped
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     with set_cwd(root_path):
 
@@ -1005,16 +1356,28 @@ def prepare(root_path: str, no_test: bool = False):
 
 @call_parse
 def prepare_cli(root_path: str = "."):
-    """Prepares mkdocs for serving"""
+    """Prepare mkdocs for serving
+
+    Args:
+        root_path: The root path of the project
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     prepare(root_path)
 
 # %% ../nbs/Mkdocs.ipynb 93
 def preview(root_path: str, port: Optional[int] = None):
-    """Previes mkdocs documentation
+    """Preview the mkdocs documentation.
 
     Args:
-        root_path: path under which mkdocs directory will be created
-        port: port to use
+        root_path: The root path of the documentation.
+        port: The port to serve the documentation on.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     with set_cwd(root_path):
         prepare(root_path=root_path, no_test=True)
@@ -1044,5 +1407,14 @@ def preview(root_path: str, port: Optional[int] = None):
 
 @call_parse
 def preview_cli(root_path: str = ".", port: Optional[int] = None):
-    """Previes mkdocs documentation"""
+    """Preview the mkdocs documentation.
+
+    Args:
+        root_path: The root path of the documentation.
+        port: The port to serve the documentation on.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     preview(root_path, port)
diff --git a/nbdev_mkdocs/social_image_generator.py b/nbdev_mkdocs/social_image_generator.py
index 836118c6..5b6a9d11 100644
--- a/nbdev_mkdocs/social_image_generator.py
+++ b/nbdev_mkdocs/social_image_generator.py
@@ -28,13 +28,17 @@
 
 # %% ../nbs/Social_Image_Generator.ipynb 3
 def _generate_ai_image(prompt: str) -> str:
-    """Generate an image for social card using the OpenAI Image API.
+    """Generate an image from a prompt using OpenAI's API.
 
     Args:
-        prompt: The prompt to use for generating the image.
+        prompt: The prompt to generate the image from.
 
     Returns:
         The URL of the generated image.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     response = openai.Image.create(prompt=prompt, n=1, size="512x512")
     image_url: str = response["data"][0]["url"]
@@ -42,13 +46,22 @@ def _generate_ai_image(prompt: str) -> str:
 
 # %% ../nbs/Social_Image_Generator.ipynb 5
 def _generate_html_str(root_path: str, image_url: str) -> str:
-    """Generate html string for the social card
+    """Generate HTML string for the social card.
 
     Args:
-        root_path: The root path of the project.
-        image_url: The image URL to be included in the HTML.
-    """
+        root_path: The root path of the project
+        image_url: The image URL to be included in the HTML string.
 
+    Returns:
+        The generated html string
+
+    Raises:
+        ValueError: If root_path or image_url is None
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     with set_cwd(root_path):
 
         _custom_social_image_template_path = (
@@ -82,8 +95,12 @@ async def _capture_and_save_screenshot(src_path: str, dst_path: str):
     output in destination directory
 
     Args:
-        src_path: The source path of the HTML file that will be used to generate the PNG image.
-        dst_path: The destination path where the generated screenshot image will be saved.
+        src_path: The path to the source file.
+        dst_path: The path to the destination file.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     playwright = await async_playwright().start()
     browser = await playwright.chromium.launch()
@@ -110,11 +127,21 @@ async def _capture_and_save_screenshot(src_path: str, dst_path: str):
 
 # %% ../nbs/Social_Image_Generator.ipynb 10
 async def _create_social_image(root_path: str, image_url: str):
-    """Create social image for the project
+    """Create a social image
 
     Args:
-        root_path: The root path of the project.
-        image_url: The image URL to be included in the social image.
+        root_path: The root path
+        image_url: The image URL to be included in the social image
+
+    Returns:
+        The social image
+
+    Raises:
+        ValueError: If root_path or image_url is None
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     html_str = _generate_html_str(root_path, image_url)
 
@@ -131,13 +158,17 @@ async def _create_social_image(root_path: str, image_url: str):
 
 # %% ../nbs/Social_Image_Generator.ipynb 12
 def _unescape_exclamation_mark(text: str) -> str:
-    """Replaces the URL-encoded `!%21` character sequence with `!!` in a string.
+    """Replace the URL-encoded `!%21` character sequence with `!!` in a string.
 
     Args:
-        text: The string to be processed.
+        text: The string to be processed
 
     Returns:
-        The input string with the `!%21` character sequence replaced with `!!`.
+        The processed string with the `!%21` character sequence replaced with `!!`.
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     pattern = r":\s*!%21"
     text = re.sub(pattern, r": !!", text)
@@ -145,13 +176,16 @@ def _unescape_exclamation_mark(text: str) -> str:
 
 # %% ../nbs/Social_Image_Generator.ipynb 14
 def _update_social_image_in_mkdocs_yml(root_path: str, image_url: str):
-    """Update social image link in mkdocs yml file
+    """Update social image link in mkdocs.yml
 
     Args:
-        root_path: The root path of the project.
-        image_url: The image URL to update in the mkdocs yml file.
-    """
+        root_path: The root path
+        image_url: The image url
+
+    !!! note
 
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     image_url = (
         "overrides/images/social_image.png" if is_local_path(image_url) else image_url
     )
@@ -164,13 +198,16 @@ def _update_social_image_in_mkdocs_yml(root_path: str, image_url: str):
 
 # %% ../nbs/Social_Image_Generator.ipynb 16
 def _update_social_image_in_site_overrides(root_path: str, image_url: str):
-    """Update social image link in site_overrides HTML template
+    """Update the social image in the site_overrides/main.html file.
 
     Args:
-        root_path: The root path of the project.
-        image_url: The image URL to update in the site_overrides HTML template.
-    """
+        root_path: The root path of the project
+        image_url: The social image url
+
+    !!! note
 
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     _replace_str = (
         'page.canonical_url ~ "" ~ config.extra.social_image '
         if is_local_path(image_url)
@@ -200,6 +237,17 @@ def _update_social_image_in_site_overrides(root_path: str, image_url: str):
 
 # %% ../nbs/Social_Image_Generator.ipynb 19
 class _IMG_Generator(str, Enum):
+    """An enumeration class for the different types of image generators.
+
+    Attributes:
+        file : file
+        dall_e : dall_e
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
+
     file = "file"
     dall_e = "dall_e"
 
@@ -207,16 +255,23 @@ class _IMG_Generator(str, Enum):
 def _generate_image_url(
     root_path: str, generator: str, prompt: str, image_path: Optional[str] = None
 ) -> str:
-    """Generate image url based on the generator
+    """Generate an image url.
 
     Args:
-        root_path: The root path of the project.
-        generator: Generator to use to create the social image. Valid options are: 'file' and 'dall_e'.
-        prompt: The prompt to use for generating the image.
-        image_path: Image file path to use in the social share image. If None, then the default image will be used.
+        root_path: The root path of the project
+        generator: Generator to use to create the social image. Valid options are: 'file' and 'dall_e'
+        prompt: The prompt to use for generating the image
+        image_path: Image file path to use in the social share image. If None, then the default image will be used
 
     Returns:
-        The image url
+        The generated image url
+
+    Raises:
+        ValueError: If generator is not in _IMG_Generator._member_names_
+
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
     """
     if generator not in _IMG_Generator._member_names_:
         raise ValueError(
@@ -263,15 +318,18 @@ async def generate_social_image(
     prompt: str = "Cute animal wearing hoodie sitting in high chair in purple room, browsing computer, 3d render",
     image_path: Optional[str] = None,
 ):
-    """Generate a custom image for social card using the OpenAI Image API.
+    """Generate a social image for the project.
 
     Args:
         root_path: The root path of the project.
         generator: Generator to use to create the social image. Valid options are: 'file' and 'dall_e'.
         prompt: The prompt to use for generating the image.
         image_path: Image file path to use in the social share image. Use images with a 1:1 aspect ratio and at least 512x512 pixels for the best results. If None, then the default image will be used.
-    """
 
+    !!! note
+
+        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)
+    """
     image_url = _generate_image_url(root_path, generator, prompt, image_path)
 
     await _create_social_image(root_path, image_url)
diff --git a/nbs/CLI.ipynb b/nbs/CLI.ipynb
index 9e4d05fd..434c82df 100644
--- a/nbs/CLI.ipynb
+++ b/nbs/CLI.ipynb
@@ -24,9 +24,11 @@
     "from asyncio import run as aiorun\n",
     "\n",
     "import typer\n",
+    "from nbdev.config import get_config\n",
     "\n",
     "import nbdev_mkdocs\n",
-    "import nbdev_mkdocs.mkdocs\n"
+    "import nbdev_mkdocs.mkdocs\n",
+    "from docstring_gen.docstring_generator import add_docstring_to_source\n"
    ]
   },
   {
@@ -36,9 +38,22 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "import shutil\n",
+    "\n",
     "from typer.testing import CliRunner\n",
+    "from tempfile import TemporaryDirectory\n",
     "\n",
-    "runner = CliRunner()\n"
+    "from nbdev_mkdocs._helpers.utils import set_cwd"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "bef5a079",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "runner = CliRunner()"
    ]
   },
   {
@@ -129,6 +144,21 @@
     "    \"\"\"CLI command for generating a custom social share image\"\"\"\n",
     "\n",
     "    async def _generate_social_image(root_path, generator, prompt, image_path):\n",
+    "        \"\"\"Generate a social image.\n",
+    "\n",
+    "        Args:\n",
+    "            root_path: The root path of the project.\n",
+    "            generator: The generator to use.\n",
+    "            prompt: The prompt to use.\n",
+    "            image_path: The path to save the image to.\n",
+    "\n",
+    "        Raises:\n",
+    "            typer.Exit: If an unexpected internal error occurs.\n",
+    "\n",
+    "        !!! note\n",
+    "\n",
+    "            The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "        \"\"\"\n",
     "        try:\n",
     "            await nbdev_mkdocs.social_image_generator.generate_social_image(\n",
     "                root_path=root_path,\n",
@@ -142,7 +172,7 @@
     "            )\n",
     "            raise typer.Exit(1)\n",
     "\n",
-    "    aiorun(_generate_social_image(root_path, generator, prompt, image_path))\n"
+    "    aiorun(_generate_social_image(root_path, generator, prompt, image_path))"
    ]
   },
   {
@@ -224,87 +254,191 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "fbeaec45",
+   "id": "ce9608b9",
    "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/html": [
-       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">                                                                                                                   </span>\n",
-       "<span style=\"font-weight: bold\"> </span><span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">Usage: </span><span style=\"font-weight: bold\">root new [OPTIONS]                                                                                         </span>\n",
-       "<span style=\"font-weight: bold\">                                                                                                                   </span>\n",
-       "</pre>\n"
-      ],
-      "text/plain": [
-       "\u001b[1m                                                                                                                   \u001b[0m\n",
-       "\u001b[1m \u001b[0m\u001b[1;33mUsage: \u001b[0m\u001b[1mroot new [OPTIONS]\u001b[0m\u001b[1m                                                                                        \u001b[0m\u001b[1m \u001b[0m\n",
-       "\u001b[1m                                                                                                                   \u001b[0m\n"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    },
-    {
-     "data": {
-      "text/html": [
-       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"> Creates files in **mkdocs** subdirectory needed for other **nbdev_mkdocs** subcommands                            \n",
-       "                                                                                                                   \n",
-       "</pre>\n"
-      ],
-      "text/plain": [
-       " Creates files in **mkdocs** subdirectory needed for other **nbdev_mkdocs** subcommands                            \n",
-       "                                                                                                                   \n"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    },
-    {
-     "data": {
-      "text/html": [
-       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────╮</span>\n",
-       "<span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">│</span> <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">--root-path</span>        <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">TEXT</span>  <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">[default: .]</span>                                                                           <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">│</span>\n",
-       "<span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">│</span> <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">--help</span>             <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">    </span>  Show this message and exit.                                                            <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">│</span>\n",
-       "<span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>\n",
-       "</pre>\n"
-      ],
-      "text/plain": [
-       "\u001b[2m╭─\u001b[0m\u001b[2m Options \u001b[0m\u001b[2m──────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\u001b[2m─╮\u001b[0m\n",
-       "\u001b[2m│\u001b[0m \u001b[1;36m-\u001b[0m\u001b[1;36m-root\u001b[0m\u001b[1;36m-path\u001b[0m        \u001b[1;33mTEXT\u001b[0m  \u001b[2m[default: .]\u001b[0m                                                                           \u001b[2m│\u001b[0m\n",
-       "\u001b[2m│\u001b[0m \u001b[1;36m-\u001b[0m\u001b[1;36m-help\u001b[0m             \u001b[1;33m    \u001b[0m  Show this message and exit.                                                            \u001b[2m│\u001b[0m\n",
-       "\u001b[2m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    }
-   ],
+   "outputs": [],
    "source": [
-    "result = runner.invoke(_app, [\"new\", \"--help\"])\n"
+    "# | export\n",
+    "\n",
+    "\n",
+    "def _create_docstring_gen_sub_cmd(_app: typer.Typer = _app) -> None:\n",
+    "    \"\"\"Create docstring gen sub command\"\"\"\n",
+    "    _docstring_gen_app = typer.Typer(\n",
+    "        help=\"Command for adding docstrings to classes and methods that don't have one using docstring-gen library.\"\n",
+    "    )\n",
+    "\n",
+    "    @_docstring_gen_app.command(\n",
+    "        help=\"Add docstring to classes and methods that don't have one using docstring-gen library.\",\n",
+    "    )\n",
+    "    def generate(\n",
+    "        path: str = typer.Option(\n",
+    "            None,\n",
+    "            \"--path\",\n",
+    "            \"-p\",\n",
+    "            help='The path to the directory containing Jupyter notebooks. If None, then the \"nbs_path\" from the settings.ini will be used.',\n",
+    "        ),\n",
+    "        include_auto_gen_txt: bool = typer.Option(\n",
+    "            True,\n",
+    "            help=\"If set to True, a note indicating that the docstring was autogenerated by docstring-gen library will be added to the end.\",\n",
+    "        ),\n",
+    "        recreate_auto_gen_docs: bool = typer.Option(\n",
+    "            False,\n",
+    "            \"--force-recreate-auto-generated\",\n",
+    "            \"-f\",\n",
+    "            help=\"If set to True, the autogenerated docstrings from the previous runs will be replaced with the new one.\",\n",
+    "        ),\n",
+    "        model: str = typer.Option(\n",
+    "            \"code-davinci-002\",\n",
+    "            help=\"The name of the Codex model that will be used to generate docstrings.\",\n",
+    "        ),\n",
+    "        temperature: float = typer.Option(\n",
+    "            0.2,\n",
+    "            help=\"Setting the temperature close to zero produces better results, whereas higher temperatures produce more complex, and sometimes irrelevant docstrings.\",\n",
+    "            min=0.0,\n",
+    "            max=1.0,\n",
+    "        ),\n",
+    "        max_tokens: int = typer.Option(\n",
+    "            250,\n",
+    "            help=\"The maximum number of tokens to be used when generating a docstring for a function or class. Please note that a higher number will deplete your token quota faster.\",\n",
+    "        ),\n",
+    "        top_p: float = typer.Option(\n",
+    "            1.0,\n",
+    "            help=\"You can also specify a top-P value from 0-1 to achieve similar results to changing the temperature. According to the Open AI documentation, it is generally recommended to change either this or the temperature but not both.\",\n",
+    "            min=0.0,\n",
+    "            max=1.0,\n",
+    "        ),\n",
+    "        n: int = typer.Option(\n",
+    "            3,\n",
+    "            help=\"The number of docstrings to be generated for each function or class, with the best one being added to the source code. Please note that a higher number will deplete your token quota faster.\",\n",
+    "        ),\n",
+    "    ) -> None:\n",
+    "\n",
+    "        \"\"\"Add docstring to classes and methods that don't have one by using the 'docstring-gen' library\n",
+    "\n",
+    "        Args:\n",
+    "            path: The path to the directory containing Jupyter notebooks. If None, then the \"nbs_path\" from the settings.ini will be used.\n",
+    "            include_auto_gen_txt: If set to True, a note indicating that the docstring was autogenerated by 'docstring-gen' library will be added to the end.\n",
+    "            recreate_auto_gen_docs: If set to True, the autogenerated docstrings from the previous runs will be replaced with the new one.\n",
+    "            model: The name of the Codex model that will be used to generate docstrings.\n",
+    "            temperature: Setting the temperature close to zero produces better results, whereas higher temperatures produce more complex, and sometimes irrelevant docstrings.\n",
+    "            max_tokens: The maximum number of tokens to be used when generating a docstring for a function or class. Please note that a higher number will deplete your token quota faster.\n",
+    "            top_p: You can also specify a top-P value from 0-1 to achieve similar results to changing the temperature. According to the Open AI documentation, it is generally recommended to change either this or the temperature but not both.\n",
+    "            n: The number of docstrings to be generated for each function or class, with the best one being added to the source code. Please note that a higher number will deplete your token quota faster.\n",
+    "\n",
+    "        Returns:\n",
+    "            None\n",
+    "\n",
+    "        !!! note\n",
+    "\n",
+    "            The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "        \"\"\"\n",
+    "\n",
+    "        if path is None:\n",
+    "            path = str(Path(get_config().nbs_path).resolve())\n",
+    "\n",
+    "        else:\n",
+    "            if not Path(path).exists():\n",
+    "                typer.secho(\n",
+    "                    f\"Path '{Path(path).resolve()}' does not exists!\",\n",
+    "                    err=True,\n",
+    "                    fg=typer.colors.RED,\n",
+    "                )\n",
+    "                raise typer.Exit(code=1)\n",
+    "        try:\n",
+    "            add_docstring_to_source(\n",
+    "                path=path,\n",
+    "                include_auto_gen_txt=include_auto_gen_txt,\n",
+    "                recreate_auto_gen_docs=recreate_auto_gen_docs,\n",
+    "                model=model,\n",
+    "                temperature=temperature,\n",
+    "                max_tokens=max_tokens,\n",
+    "                top_p=top_p,\n",
+    "                n=n,\n",
+    "            )\n",
+    "        except Exception as e:\n",
+    "            typer.secho(e, err=True, fg=typer.colors.RED)\n",
+    "            raise typer.Exit(1)\n",
+    "\n",
+    "    _app.add_typer(\n",
+    "        _docstring_gen_app,\n",
+    "        name=\"docstring\",\n",
+    "    )\n",
+    "\n",
+    "\n",
+    "_create_docstring_gen_sub_cmd()"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "228d2a6f",
+   "id": "b78013a6",
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "\n",
+      "def sum(num1: int, num2: int) -> int:\n",
+      "    \"\"\"Sum two numbers\n",
+      "\n",
+      "    Args:\n",
+      "        num1: First number\n",
+      "        num2: Second number\n",
+      "\n",
+      "    Returns:\n",
+      "        The sum of the two numbers\n",
+      "\n",
+      "    !!! note\n",
+      "\n",
+      "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+      "    \"\"\"\n",
+      "    return num1 + num2\n",
+      "\n",
+      "Path '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmphp_2m8vi/invalid_directory_name' does not exists!\n",
+      "\n"
+     ]
+    }
+   ],
    "source": [
-    "result = runner.invoke(_app, [\"new\", \"--root-path=../setting.ini\"])\n"
+    "_sample_function = \"\"\"\n",
+    "def sum(num1: int, num2: int) -> int:\n",
+    "    return num1 + num2\n",
+    "\"\"\"\n",
+    "with TemporaryDirectory() as d:    \n",
+    "    shutil.copyfile(Path(\"..\") / \"settings.ini\", Path(d) / \"settings.ini\")\n",
+    "    \n",
+    "    with set_cwd(d):\n",
+    "        nbs_path = Path(d) / \"nbs\"\n",
+    "        Path(nbs_path).mkdir()\n",
+    "\n",
+    "        test_file_path = nbs_path / \"test.py\"\n",
+    "        with open(test_file_path, \"w\") as f:\n",
+    "            f.write(_sample_function)\n",
+    "\n",
+    "        result = runner.invoke(_app, [\"docstring\", \"generate\"])\n",
+    "        print(result.stdout)\n",
+    "        assert result.exit_code == 0, result.exit_code\n",
+    "\n",
+    "        with open(test_file_path) as f:\n",
+    "            actual = f.read()\n",
+    "\n",
+    "        print(actual)\n",
+    "        assert \"docstring-gen\" in actual, actual\n",
+    "        \n",
+    "        result = runner.invoke(_app, [\"docstring\", \"generate\", \"-p\", f\"{d}/invalid_directory_name\"])\n",
+    "        print(result.stdout)\n",
+    "        assert result.exit_code == 1, result.exit_code"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "c079e0bb",
+   "id": "84a69379",
    "metadata": {},
    "outputs": [],
-   "source": [
-    "# result = runner.invoke(_app, [\"prepare\", \"--root-path=../setting.ini\"])\n",
-    "\n",
-    "# assert result.exit_code == 1\n",
-    "# assert result.output == 'Unexpected internal error :/\\n'\n"
-   ]
+   "source": []
   }
  ],
  "metadata": {
diff --git a/nbs/CLI_Doc_Helper.ipynb b/nbs/CLI_Doc_Helper.ipynb
index b3fffdc9..bac6b00c 100644
--- a/nbs/CLI_Doc_Helper.ipynb
+++ b/nbs/CLI_Doc_Helper.ipynb
@@ -28,7 +28,8 @@
     "import click\n",
     "import click.core\n",
     "from click import Command, Group  # , Option\n",
-    "import typer\n"
+    "import typer\n",
+    "from typer.testing import CliRunner\n"
    ]
   },
   {
@@ -40,8 +41,7 @@
    "source": [
     "import subprocess\n",
     "from tempfile import TemporaryDirectory\n",
-    "\n",
-    "from typer.testing import CliRunner\n"
+    "\n"
    ]
   },
   {
@@ -58,7 +58,34 @@
     "\n",
     "\n",
     "class _State:\n",
+    "    \"\"\"A class to represent a state.\n",
+    "\n",
+    "    Attributes:\n",
+    "        app : the app\n",
+    "        func : the func\n",
+    "        file : the file\n",
+    "        module : the module\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    def __init__(self) -> None:\n",
+    "        \"\"\"Initialize the class\n",
+    "\n",
+    "        Args:\n",
+    "            app: The app name\n",
+    "            func: The function name\n",
+    "            file: The file name\n",
+    "            module: The module name\n",
+    "\n",
+    "        Returns:\n",
+    "            None\n",
+    "\n",
+    "        !!! note\n",
+    "\n",
+    "            The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "        \"\"\"\n",
     "        self.app: Optional[str] = None\n",
     "        self.func: Optional[str] = None\n",
     "        self.file: Optional[Path] = None\n",
@@ -70,6 +97,18 @@
     "\n",
     "def _get_typer_from_module(module: Any) -> Optional[typer.Typer]:\n",
     "    # Try to get defined app\n",
+    "    \"\"\"Get a Typer object from a module.\n",
+    "\n",
+    "    Args:\n",
+    "        module: The module to get the Typer object from.\n",
+    "\n",
+    "    Returns:\n",
+    "        A Typer object.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    if _state.app:\n",
     "        obj: Optional[typer.Typer] = getattr(module, _state.app, None)\n",
     "        if not isinstance(obj, typer.Typer):\n",
@@ -117,6 +156,18 @@
     "\n",
     "\n",
     "def _get_typer_from_state() -> Optional[typer.Typer]:\n",
+    "    \"\"\"Get a Typer object from a module.\n",
+    "\n",
+    "    Returns:\n",
+    "        The Typer object.\n",
+    "\n",
+    "    Raises:\n",
+    "        ValueError: If the module does not contain a Typer object.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    spec = None\n",
     "    if _state.file:\n",
     "        module_name = _state.file.name\n",
@@ -145,6 +196,22 @@
     "    name: str = \"\",\n",
     "    call_prefix: str = \"\",\n",
     ") -> str:\n",
+    "    \"\"\"Generate documentation for a click command.\n",
+    "\n",
+    "    Args:\n",
+    "        obj: The click command to document.\n",
+    "        ctx: The click context.\n",
+    "        indent: The indentation level.\n",
+    "        name: The name of the command.\n",
+    "        call_prefix: The prefix to use when calling the command.\n",
+    "\n",
+    "    Returns:\n",
+    "        The generated documentation.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    docs = \"#\" * (1 + indent)\n",
     "    command_name = name or obj.name\n",
     "    if call_prefix:\n",
@@ -224,23 +291,45 @@
     "\n",
     "\n",
     "def generate_cli_doc(\n",
-    "    ctx: typer.Context,\n",
     "    module_name: str,\n",
-    "    app_name: str,\n",
-    ") -> None:\n",
-    "    \"\"\"\n",
-    "    Generate Markdown docs for a Typer app.\n",
+    "    app_name: str\n",
+    ") -> str:\n",
+    "\n",
+    "    \"\"\"Generate CLI documentation for a Typer app.\n",
+    "\n",
+    "    Args:\n",
+    "        module_name: The name of the module containing the Typer app.\n",
+    "        app_name: The name of the Typer app.\n",
+    "\n",
+    "    Returns:\n",
+    "        The CLI documentation for the Typer app.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
-    "    _state.module = f\"{module_name}\"\n",
-    "    typer_obj = _get_typer_from_state()\n",
-    "\n",
-    "    if not typer_obj:\n",
-    "        typer.echo(f\"No Typer app found\", err=True)\n",
-    "        raise typer.Abort()\n",
-    "    click_obj = typer.main.get_command(typer_obj)\n",
-    "    docs = _get_docs_for_click(obj=click_obj, ctx=ctx, name=app_name)\n",
-    "    clean_docs = f\"{docs.strip()}\\n\"\n",
-    "    typer.echo(clean_docs)\n"
+    "    def _generate_cli_doc(\n",
+    "        ctx: typer.Context,\n",
+    "        module_name: str,\n",
+    "        app_name: str,\n",
+    "    ) -> None:\n",
+    "        \"\"\"Generate Markdown docs for a Typer app.\"\"\"\n",
+    "        _state.module = f\"{module_name}\"\n",
+    "        typer_obj = _get_typer_from_state()\n",
+    "\n",
+    "        if not typer_obj:\n",
+    "            typer.echo(f\"No Typer app found\", err=True)\n",
+    "            raise typer.Abort()\n",
+    "        click_obj = typer.main.get_command(typer_obj)\n",
+    "        docs = _get_docs_for_click(obj=click_obj, ctx=ctx, name=app_name)\n",
+    "        clean_docs = f\"{docs.strip()}\\n\"\n",
+    "        typer.echo(clean_docs)\n",
+    "        \n",
+    "    app = typer.Typer()\n",
+    "    app.command()(_generate_cli_doc)\n",
+    "    runner = CliRunner()\n",
+    "    result = runner.invoke(app, [module_name, app_name])\n",
+    "    return result.stdout"
    ]
   },
   {
@@ -270,6 +359,7 @@
       "**Commands**:\n",
       "\n",
       "* `docs`: Prepares files in **mkdocs/docs** and then...\n",
+      "* `docstring`: Command for adding docstrings to classes...\n",
       "* `generate-social-image`: Generate a custom social share image\n",
       "* `new`: Creates files in **mkdocs** subdirectory...\n",
       "* `prepare`: Runs tests and prepares files in...\n",
@@ -290,6 +380,49 @@
       "* `--root-path TEXT`: Project's root path.  [default: .]\n",
       "* `--help`: Show this message and exit.\n",
       "\n",
+      "## `nbdev_mkdocs docstring`\n",
+      "\n",
+      "Command for adding docstrings to classes and methods that don't have one using docstring-gen library.\n",
+      "\n",
+      "**Usage**:\n",
+      "\n",
+      "```console\n",
+      "$ nbdev_mkdocs docstring [OPTIONS] COMMAND [ARGS]...\n",
+      "```\n",
+      "\n",
+      "**Options**:\n",
+      "\n",
+      "* `--help`: Show this message and exit.\n",
+      "\n",
+      "**Commands**:\n",
+      "\n",
+      "* `generate`: Add docstring to classes and methods that...\n",
+      "\n",
+      "### `nbdev_mkdocs docstring generate`\n",
+      "\n",
+      "Add docstring to classes and methods that don't have one using docstring-gen library.\n",
+      "\n",
+      "**Usage**:\n",
+      "\n",
+      "```console\n",
+      "$ nbdev_mkdocs docstring generate [OPTIONS] [PATH]\n",
+      "```\n",
+      "\n",
+      "**Arguments**:\n",
+      "\n",
+      "* `[PATH]`: The path to the Jupyter notebook or Python file, or a directory containing these files  [default: .]\n",
+      "\n",
+      "**Options**:\n",
+      "\n",
+      "* `--include-auto-gen-txt / --no-include-auto-gen-txt`: If set to True, a note indicating that the docstring was autogenerated by docstring-gen library will be added to the end.  [default: include-auto-gen-txt]\n",
+      "* `-f, --force-recreate-auto-generated`: If set to True, the autogenerated docstrings from the previous runs will be replaced with the new one.\n",
+      "* `--model TEXT`: The name of the Codex model that will be used to generate docstrings.  [default: code-davinci-002]\n",
+      "* `--temperature FLOAT RANGE`: Setting the temperature close to zero produces better results, whereas higher temperatures produce more complex, and sometimes irrelevant docstrings.  [default: 0.2; 0.0<=x<=1.0]\n",
+      "* `--max-tokens INTEGER`: The maximum number of tokens to be used when generating a docstring for a function or class. Please note that a higher number will deplete your token quota faster.  [default: 250]\n",
+      "* `--top-p FLOAT RANGE`: You can also specify a top-P value from 0-1 to achieve similar results to changing the temperature. According to the Open AI documentation, it is generally recommended to change either this or the temperature but not both.  [default: 1.0; 0.0<=x<=1.0]\n",
+      "* `--n INTEGER`: The number of docstrings to be generated for each function or class, with the best one being added to the source code. Please note that a higher number will deplete your token quota faster.  [default: 3]\n",
+      "* `--help`: Show this message and exit.\n",
+      "\n",
       "## `nbdev_mkdocs generate-social-image`\n",
       "\n",
       "Generate a custom social share image\n",
@@ -359,25 +492,18 @@
     }
    ],
    "source": [
-    "with TemporaryDirectory() as d:\n",
-    "\n",
-    "    module_name = \"nbdev_mkdocs._cli\"\n",
-    "    app_name = \"nbdev_mkdocs\"\n",
-    "\n",
-    "    app = typer.Typer()\n",
-    "    app.command()(generate_cli_doc)\n",
-    "\n",
-    "    runner = CliRunner()\n",
-    "    result = runner.invoke(app, [module_name, app_name])\n",
-    "    print(result.stdout)\n",
-    "    for cmd in [\"nbdev_mkdocs new\", \"nbdev_mkdocs prepare\", \"nbdev_mkdocs preview\"]:\n",
-    "        assert cmd in result.stdout\n"
+    "module_name = \"nbdev_mkdocs._cli\"\n",
+    "app_name = \"nbdev_mkdocs\"\n",
+    "actual = generate_cli_doc(module_name, app_name)\n",
+    "print(actual)\n",
+    "for cmd in [\"nbdev_mkdocs new\", \"nbdev_mkdocs prepare\", \"nbdev_mkdocs preview\"]:\n",
+    "    assert cmd in actual, f\"cmd={cmd}, actual={actual}\"\n"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "805b8bcf",
+   "id": "3145191c",
    "metadata": {},
    "outputs": [],
    "source": []
@@ -385,7 +511,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3",
+   "display_name": "Python 3 (ipykernel)",
    "language": "python",
    "name": "python3"
   }
diff --git a/nbs/Docstring.ipynb b/nbs/Docstring.ipynb
index 4a3209ea..d0c89601 100644
--- a/nbs/Docstring.ipynb
+++ b/nbs/Docstring.ipynb
@@ -185,6 +185,21 @@
     "\n",
     "\n",
     "def _extract_examples_from_docstring(o: Any) -> List[str]:\n",
+    "    \"\"\"Extract examples from docstring\n",
+    "\n",
+    "    Args:\n",
+    "        o: Any object with a docstring\n",
+    "\n",
+    "    Returns:\n",
+    "        List of examples\n",
+    "\n",
+    "    Raises:\n",
+    "        ValueError: If the object has no docstring\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    try:\n",
     "        import griffe\n",
     "    except:\n",
@@ -199,6 +214,21 @@
     "    )\n",
     "\n",
     "    def find_python_code(s: str) -> str:\n",
+    "        \"\"\"Finds the python code in a string\n",
+    "\n",
+    "        Args:\n",
+    "            s: The string to search\n",
+    "\n",
+    "        Returns:\n",
+    "            The python code\n",
+    "\n",
+    "        Raises:\n",
+    "            ValueError: If no python code is found\n",
+    "\n",
+    "        !!! note\n",
+    "\n",
+    "            The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "        \"\"\"\n",
     "        code = [x[0] for x in re.findall(\"```\\s*python((\\n|.|\\\\n])+)```\", s)]\n",
     "        #         print(f\"{code=}\")\n",
     "        if len(code) == 0:\n",
@@ -394,6 +424,18 @@
     "\n",
     "\n",
     "def _get_keywords(examples: List[str]) -> List[str]:\n",
+    "    \"\"\"Get keywords from examples.\n",
+    "\n",
+    "    Args:\n",
+    "        examples (List[str]): List of examples.\n",
+    "\n",
+    "    Returns:\n",
+    "        List[str]: List of keywords.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    keywords: List[str] = sum(\n",
     "        [\n",
     "            [x[9:-1] for x in re.findall(\"{fill in \\w+}\", example)]\n",
@@ -430,6 +472,22 @@
     "\n",
     "\n",
     "def _replace_keywords(examples: List[str], **kwargs) -> List[str]:\n",
+    "    \"\"\"Replace keywords in a list of strings with the corresponding values in kwargs.\n",
+    "\n",
+    "    Args:\n",
+    "        examples: A list of strings\n",
+    "        **kwargs: Keyword arguments\n",
+    "\n",
+    "    Returns:\n",
+    "        A list of strings with keywords replaced by values\n",
+    "\n",
+    "    Raises:\n",
+    "        ValueError: If the set of keywords is not a subset of the set of keys in kwargs\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    keywords = _get_keywords(examples)\n",
     "\n",
     "    if set(keywords) > set(kwargs.keys()):\n",
@@ -547,6 +605,22 @@
     "    sub_dict: Optional[Dict[str, str]] = None,\n",
     "    width: Optional[int] = None,\n",
     "):\n",
+    "    \"\"\"Format the output of a string.\n",
+    "\n",
+    "    Args:\n",
+    "        s: The string to format.\n",
+    "        title: The title of the output.\n",
+    "        supress: Whether to supress the output.\n",
+    "        sub_dict: A dictionary of patterns to replace in the string.\n",
+    "        width: The width of the output.\n",
+    "\n",
+    "    Returns:\n",
+    "        The formatted string.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    if sub_dict:\n",
     "        for pattern, replacement in sub_dict.items():\n",
     "            s = re.sub(pattern, replacement, s)\n",
@@ -681,6 +755,10 @@
     "\n",
     "        run_examples_from_docstring(f, name=\"John\", other_name=\"Jane\")\n",
     "        ```\n",
+    "        \n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    console = Console(width=width)\n",
     "\n",
@@ -1004,7 +1082,7 @@
     {
      "data": {
       "text/plain": [
-       "ValueError(\"{'password', 'name_2', 'name_1'} > {'name_1'}\")"
+       "ValueError(\"{'name_2', 'name_1', 'password'} > {'name_1'}\")"
       ]
      },
      "execution_count": null,
@@ -1060,7 +1138,9 @@
        "\n",
        "<span style=\"color: #00ff00; text-decoration-color: #00ff00\">──────────────────────────────────── </span>stderr<span style=\"color: #00ff00; text-decoration-color: #00ff00\"> ────────────────────────────────────</span>\n",
        "Traceback <span style=\"font-weight: bold\">(</span>most recent call last<span style=\"font-weight: bold\">)</span>:\n",
-       "  File <span style=\"color: #008000; text-decoration-color: #008000\">\"/tmp/tmpbtgaz_tc/example.py\"</span>, line <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4</span>, in <span style=\"font-weight: bold\">&lt;</span><span style=\"color: #ff00ff; text-decoration-color: #ff00ff; font-weight: bold\">module</span><span style=\"font-weight: bold\">&gt;</span>\n",
+       "  File \n",
+       "<span style=\"color: #008000; text-decoration-color: #008000\">\"/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpu2t43agj/example.py\"</span>, line \n",
+       "<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4</span>, in <span style=\"font-weight: bold\">&lt;</span><span style=\"color: #ff00ff; text-decoration-color: #ff00ff; font-weight: bold\">module</span><span style=\"font-weight: bold\">&gt;</span>\n",
        "    raise <span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">NotImplementedError</span><span style=\"font-weight: bold\">(</span><span style=\"color: #008000; text-decoration-color: #008000\">\"expected to fail\"</span><span style=\"font-weight: bold\">)</span>\n",
        "NotImplementedError: expected to fail\n",
        "\n",
@@ -1078,7 +1158,9 @@
        "\n",
        "\u001b[92m──────────────────────────────────── \u001b[0mstderr\u001b[92m ────────────────────────────────────\u001b[0m\n",
        "Traceback \u001b[1m(\u001b[0mmost recent call last\u001b[1m)\u001b[0m:\n",
-       "  File \u001b[32m\"/tmp/tmpbtgaz_tc/example.py\"\u001b[0m, line \u001b[1;36m4\u001b[0m, in \u001b[1m<\u001b[0m\u001b[1;95mmodule\u001b[0m\u001b[1m>\u001b[0m\n",
+       "  File \n",
+       "\u001b[32m\"/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpu2t43agj/example.py\"\u001b[0m, line \n",
+       "\u001b[1;36m4\u001b[0m, in \u001b[1m<\u001b[0m\u001b[1;95mmodule\u001b[0m\u001b[1m>\u001b[0m\n",
        "    raise \u001b[1;35mNotImplementedError\u001b[0m\u001b[1m(\u001b[0m\u001b[32m\"expected to fail\"\u001b[0m\u001b[1m)\u001b[0m\n",
        "NotImplementedError: expected to fail\n",
        "\n"
@@ -1090,7 +1172,7 @@
     {
      "data": {
       "text/plain": [
-       "RuntimeError('Traceback (most recent call last):\\n  File \"/tmp/tmpbtgaz_tc/example.py\", line 4, in <module>\\n    raise NotImplementedError(\"expected to fail\")\\nNotImplementedError: expected to fail\\n')"
+       "RuntimeError('Traceback (most recent call last):\\n  File \"/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpu2t43agj/example.py\", line 4, in <module>\\n    raise NotImplementedError(\"expected to fail\")\\nNotImplementedError: expected to fail\\n')"
       ]
      },
      "execution_count": null,
@@ -1186,7 +1268,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3",
+   "display_name": "Python 3 (ipykernel)",
    "language": "python",
    "name": "python3"
   }
diff --git a/nbs/Mkdocs.ipynb b/nbs/Mkdocs.ipynb
index 593483c1..1270749d 100644
--- a/nbs/Mkdocs.ipynb
+++ b/nbs/Mkdocs.ipynb
@@ -38,7 +38,6 @@
     "import yaml\n",
     "\n",
     "import typer\n",
-    "from typer.testing import CliRunner\n",
     "\n",
     "from configupdater import ConfigUpdater, Section\n",
     "from configupdater.option import Option\n",
@@ -112,8 +111,11 @@
     "    \"\"\"Adds requirments needed for mkdocs to settings.ini\n",
     "\n",
     "    Args:\n",
-    "        root_path: path to where the settings.ini file is located\n",
+    "        root_path: Path to the root of the project.\n",
     "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    _requirements_path = get_root_data_path() / \"requirements.txt\"\n",
     "    with open(_requirements_path, \"r\") as f:\n",
@@ -158,6 +160,18 @@
     "        old_req: str = updater[\"DEFAULT\"][option_name].value  # type: ignore\n",
     "\n",
     "        def remove_leading_spaces(s: str) -> str:\n",
+    "            \"\"\"Remove leading spaces from a string\n",
+    "\n",
+    "            Args:\n",
+    "                s: The string to remove leading spaces from\n",
+    "\n",
+    "            Returns:\n",
+    "                The string with leading spaces removed\n",
+    "\n",
+    "            !!! note\n",
+    "\n",
+    "                The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "            \"\"\"\n",
     "            return \"\\n\".join([x.lstrip() for x in s.split(\"\\n\")])\n",
     "\n",
     "        old_req = remove_leading_spaces(old_req)\n",
@@ -196,8 +210,8 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpmwzkpwie/settings.ini'.\u001b[0m\n",
-      "Requirements already added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpmwzkpwie/settings.ini'.\u001b[0m\n",
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzltgcbo2/settings.ini'.\u001b[0m\n",
+      "Requirements already added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzltgcbo2/settings.ini'.\u001b[0m\n",
       "[DEFAULT]\n",
       "# All sections below are required unless otherwise specified.\n",
       "# See https://github.com/fastai/nbdev/blob/master/settings.ini for examples.\n",
@@ -311,8 +325,8 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpkl8cnqad/settings.ini'.\u001b[0m\n",
-      "Requirements already added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpkl8cnqad/settings.ini'.\u001b[0m\n",
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp54jtc0wb/settings.ini'.\u001b[0m\n",
+      "Requirements already added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp54jtc0wb/settings.ini'.\u001b[0m\n",
       "[DEFAULT]\n",
       "# All sections below are required unless otherwise specified.\n",
       "# See https://github.com/fastai/nbdev/blob/master/settings.ini for examples.\n",
@@ -440,6 +454,21 @@
     "\n",
     "\n",
     "def _create_mkdocs_dir(root_path: str):\n",
+    "    \"\"\"Create a mkdocs directory in the root path.\n",
+    "\n",
+    "    Args:\n",
+    "        root_path: The root path.\n",
+    "\n",
+    "    Returns:\n",
+    "        None\n",
+    "\n",
+    "    Raises:\n",
+    "        typer.Exit: If the mkdocs_template path does not exist.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    mkdocs_template_path = get_root_data_path() / \"mkdocs_template\"\n",
     "    if not mkdocs_template_path.exists():\n",
     "        typer.secho(\n",
@@ -471,23 +500,23 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpdi21ymei/mkdocs created.\u001b[0m\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpdi21ymei/mkdocs/site_overrides\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpdi21ymei/mkdocs/.ipynb_checkpoints\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpdi21ymei/mkdocs/docs_overrides\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpdi21ymei/mkdocs/site_overrides/main.html\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpdi21ymei/mkdocs/site_overrides/partials\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpdi21ymei/mkdocs/site_overrides/partials/copyright.html\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpdi21ymei/mkdocs/docs_overrides/css\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpdi21ymei/mkdocs/docs_overrides/images\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpdi21ymei/mkdocs/docs_overrides/js\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpdi21ymei/mkdocs/docs_overrides/css/extra.css\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpdi21ymei/mkdocs/docs_overrides/images/default_social_logo.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpdi21ymei/mkdocs/docs_overrides/images/compass-outline.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpdi21ymei/mkdocs/docs_overrides/images/.ipynb_checkpoints\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpdi21ymei/mkdocs/docs_overrides/js/mathjax.js\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpdi21ymei/mkdocs/docs_overrides/js/extra.js\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpdi21ymei/mkdocs/docs_overrides/js/.ipynb_checkpoints\n"
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpsluk4ruf/mkdocs created.\u001b[0m\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpsluk4ruf/mkdocs/site_overrides\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpsluk4ruf/mkdocs/.ipynb_checkpoints\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpsluk4ruf/mkdocs/docs_overrides\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpsluk4ruf/mkdocs/site_overrides/main.html\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpsluk4ruf/mkdocs/site_overrides/partials\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpsluk4ruf/mkdocs/site_overrides/partials/copyright.html\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpsluk4ruf/mkdocs/docs_overrides/css\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpsluk4ruf/mkdocs/docs_overrides/images\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpsluk4ruf/mkdocs/docs_overrides/js\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpsluk4ruf/mkdocs/docs_overrides/css/extra.css\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpsluk4ruf/mkdocs/docs_overrides/images/default_social_logo.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpsluk4ruf/mkdocs/docs_overrides/images/compass-outline.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpsluk4ruf/mkdocs/docs_overrides/images/.ipynb_checkpoints\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpsluk4ruf/mkdocs/docs_overrides/js/mathjax.js\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpsluk4ruf/mkdocs/docs_overrides/js/extra.js\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpsluk4ruf/mkdocs/docs_overrides/js/.ipynb_checkpoints\n"
      ]
     }
    ],
@@ -677,6 +706,19 @@
     "def _get_kwargs_from_settings(\n",
     "    settings_path: Path, mkdocs_template: Optional[str] = None\n",
     ") -> Dict[str, str]:\n",
+    "    \"\"\"Get the values from the settings file\n",
+    "\n",
+    "    Args:\n",
+    "        settings_path: The path to the settings file\n",
+    "        mkdocs_template: The mkdocs template to use\n",
+    "\n",
+    "    Returns:\n",
+    "        A dictionary of the kwargs\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    config = ConfigParser()\n",
     "    config.read(settings_path)\n",
     "    if not mkdocs_template:\n",
@@ -733,6 +775,18 @@
     "\n",
     "\n",
     "def _create_mkdocs_yaml(root_path: str):\n",
+    "    \"\"\"Create mkdocs.yml file\n",
+    "\n",
+    "    Args:\n",
+    "        root_path: The root path of the project\n",
+    "\n",
+    "    Raises:\n",
+    "        ValueError: If root_path is invalid or does not exists\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    try:\n",
     "        # create mkdocs folder if necessary\n",
     "        mkdocs_path = Path(root_path) / \"mkdocs\" / \"mkdocs.yml\"\n",
@@ -771,7 +825,7 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8vyum33r/mkdocs/mkdocs.yml' generated.\u001b[0m\n"
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpltulm0kc/mkdocs/mkdocs.yml' generated.\u001b[0m\n"
      ]
     }
    ],
@@ -812,6 +866,15 @@
     "\n",
     "\n",
     "def _create_summary_template(root_path: str):\n",
+    "    \"\"\"Create a summary template file for mkdocs.\n",
+    "\n",
+    "    Args:\n",
+    "        root_path: The root path of the project.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    try:\n",
     "        # create mkdocs folder if necessary\n",
     "        summary_template_path = Path(root_path) / \"mkdocs\" / \"summary_template.txt\"\n",
@@ -847,8 +910,8 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpqwrmdurn/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpqwrmdurn/mkdocs/summary_template.txt' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp_8ro48qm/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp_8ro48qm/mkdocs/summary_template.txt' generated.\u001b[0m\n",
       "- [Home](index.md)\n",
       "- Guides\n",
       "    - [Guide one](docs/guide_1.md)\n",
@@ -916,12 +979,15 @@
     "\n",
     "\n",
     "def _replace_ghp_deploy_action(root_path: str):\n",
-    "    \"\"\"Replace the default gh-pages deploy action file with the custom action template file\n",
+    "    \"\"\"Replace the default deploy action file in the .github/workflows directory with a custom one.\n",
     "\n",
     "    Args:\n",
-    "        root_path: Project's root path\n",
-    "    \"\"\"\n",
+    "        root_path: The root path of the project.\n",
+    "\n",
+    "    !!! note\n",
     "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    src_path = get_root_data_path() / \"ghp_deploy_action_template.yml\"\n",
     "    if not src_path.exists():\n",
     "        typer.secho(\n",
@@ -960,6 +1026,15 @@
    "source": [
     "@contextmanager\n",
     "def unset_env_var(name: str):\n",
+    "    \"\"\"Unset an environment variable.\n",
+    "\n",
+    "    Args:\n",
+    "        name: The name of the environment variable to unset.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    in_test_defined = name in os.environ\n",
     "    if in_test_defined:\n",
     "        original_value = os.environ.get(name)\n",
@@ -972,7 +1047,15 @@
     "\n",
     "\n",
     "def run_nbdev_new(d):\n",
+    "    \"\"\"Run nbdev_new\n",
     "\n",
+    "    Args:\n",
+    "        d: the directory to run nbdev_new in\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    path = Path(\".\") if Path(\"settings.ini\").exists() else Path(\"..\")\n",
     "    Path(Path(d) / \"nbs\").mkdir(exist_ok=True)\n",
     "\n",
@@ -1028,12 +1111,15 @@
     "\n",
     "\n",
     "def _update_gitignore_file(root_path: str):\n",
-    "    \"\"\"Update the .gitignore file to include the autogenerated mkdocs directories\n",
+    "    \"\"\"Add the autogenerated mkdocs directories to the .gitignore file.\n",
     "\n",
     "    Args:\n",
-    "        root_path: Project's root path\n",
-    "    \"\"\"\n",
+    "        root_path: The root path of the project\n",
+    "\n",
+    "    !!! note\n",
     "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    _mkdocs_gitignore_path = get_root_data_path() / \"gitignore.txt\"\n",
     "    with open(_mkdocs_gitignore_path, \"r\") as f:\n",
     "        _new_paths_to_ignore = f.read()\n",
@@ -1136,12 +1222,15 @@
     "\n",
     "\n",
     "def _generate_default_social_image_link(root_path: str):\n",
-    "    \"\"\"Generating default social sharing image link and add it to the mkdocs yaml file\n",
+    "    \"\"\"Add default social sharing image link to the mkdocs yaml file\n",
     "\n",
     "    Args:\n",
-    "        root_path: Project's root path\n",
-    "    \"\"\"\n",
+    "        root_path: The root path of the project.\n",
     "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    with set_cwd(root_path):\n",
     "        repo = get_value_from_config(root_path, \"repo\")\n",
     "        user = get_value_from_config(root_path, \"user\")\n",
@@ -1185,11 +1274,11 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp_wc9vj9e/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp_wc9vj9e/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp_wc9vj9e/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp_wc9vj9e/mkdocs/summary_template.txt' generated.\u001b[0m\n",
-      "ordereddict([('site_name', 'repo'), ('site_url', 'https://user.github.io/repo'), ('site_author', 'author'), ('site_description', 'description'), ('repo_name', 'repo'), ('repo_url', 'https://github.com/user/repo'), ('edit_uri', ''), ('copyright', '2023 onwards, author'), ('docs_dir', 'docs'), ('site_dir', 'site'), ('plugins', [ordereddict([('literate-nav', ordereddict([('nav_file', 'SUMMARY.md')]))]), 'search', ordereddict([('mkdocstrings', ordereddict([('handlers', ordereddict([('python', ordereddict([('import', ['https://docs.python.org/3/objects.inv']), ('options', ordereddict([('heading_level', 2), ('show_category_heading', True), ('show_root_heading', True), ('show_root_toc_entry', True), ('show_signature_annotations', True), ('show_if_no_docstring', True)]))]))]))]))])]), ('markdown_extensions', ['md_in_html', ordereddict([('pymdownx.arithmatex', ordereddict([('generic', True)]))]), 'pymdownx.inlinehilite', 'pymdownx.details', 'pymdownx.emoji', 'pymdownx.magiclink', ordereddict([('pymdownx.superfences', ordereddict([('custom_fences', [ordereddict([('name', 'mermaid'), ('class', 'mermaid'), ('format', <ruamel.yaml.comments.TaggedScalar object>)])])]))]), 'pymdownx.tasklist', ordereddict([('pymdownx.highlight', ordereddict([('linenums', False)]))]), ordereddict([('pymdownx.snippets', ordereddict([('check_paths', True)]))]), ordereddict([('pymdownx.tabbed', ordereddict([('alternate_style', True)]))]), 'admonition', ordereddict([('toc', ordereddict([('permalink', '¤')]))])]), ('theme', ordereddict([('name', 'material'), ('custom_dir', 'site_overrides'), ('features', ['navigation.instant', 'navigation.indexes', 'navigation.top', 'search.suggest', 'search.highlight', 'search.share']), ('palette', [ordereddict([('scheme', 'slate'), ('primary', 'black'), ('accent', 'yellow'), ('toggle', ordereddict([('icon', 'material/toggle-switch'), ('name', 'Switch to light mode')]))]), ordereddict([('scheme', 'default'), ('primary', 'black'), ('accent', 'red'), ('toggle', ordereddict([('icon', 'material/toggle-switch-off-outline'), ('name', 'Switch to dark mode')]))])]), ('icon', ordereddict([('repo', 'fontawesome/brands/github'), ('logo', 'material/compass-outline')])), ('favicon', 'overrides/images/compass-outline.png')])), ('extra_css', ['overrides/css/extra.css']), ('extra_javascript', ['overrides/js/extra.js', 'overrides/js/mathjax.js', 'https://polyfill.io/v3/polyfill.min.js?features=es6', 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js']), ('extra', ordereddict([('social_image', 'https://opengraph.githubassets.com/1672728931.834766/user/repo')]))])\n"
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpgcykjgfk/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpgcykjgfk/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpgcykjgfk/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpgcykjgfk/mkdocs/summary_template.txt' generated.\u001b[0m\n",
+      "ordereddict([('site_name', 'repo'), ('site_url', 'https://user.github.io/repo'), ('site_author', 'author'), ('site_description', 'description'), ('repo_name', 'repo'), ('repo_url', 'https://github.com/user/repo'), ('edit_uri', ''), ('copyright', '2023 onwards, author'), ('docs_dir', 'docs'), ('site_dir', 'site'), ('plugins', [ordereddict([('literate-nav', ordereddict([('nav_file', 'SUMMARY.md')]))]), 'search', ordereddict([('mkdocstrings', ordereddict([('handlers', ordereddict([('python', ordereddict([('import', ['https://docs.python.org/3/objects.inv']), ('options', ordereddict([('heading_level', 2), ('show_category_heading', True), ('show_root_heading', True), ('show_root_toc_entry', True), ('show_signature_annotations', True), ('show_if_no_docstring', True)]))]))]))]))])]), ('markdown_extensions', ['md_in_html', ordereddict([('pymdownx.arithmatex', ordereddict([('generic', True)]))]), 'pymdownx.inlinehilite', 'pymdownx.details', 'pymdownx.emoji', 'pymdownx.magiclink', ordereddict([('pymdownx.superfences', ordereddict([('custom_fences', [ordereddict([('name', 'mermaid'), ('class', 'mermaid'), ('format', <ruamel.yaml.comments.TaggedScalar object>)])])]))]), 'pymdownx.tasklist', ordereddict([('pymdownx.highlight', ordereddict([('linenums', False)]))]), ordereddict([('pymdownx.snippets', ordereddict([('check_paths', True)]))]), ordereddict([('pymdownx.tabbed', ordereddict([('alternate_style', True)]))]), 'admonition', ordereddict([('toc', ordereddict([('permalink', '¤')]))])]), ('theme', ordereddict([('name', 'material'), ('custom_dir', 'site_overrides'), ('features', ['navigation.instant', 'navigation.indexes', 'navigation.top', 'search.suggest', 'search.highlight', 'search.share']), ('palette', [ordereddict([('scheme', 'slate'), ('primary', 'black'), ('accent', 'yellow'), ('toggle', ordereddict([('icon', 'material/toggle-switch'), ('name', 'Switch to light mode')]))]), ordereddict([('scheme', 'default'), ('primary', 'black'), ('accent', 'red'), ('toggle', ordereddict([('icon', 'material/toggle-switch-off-outline'), ('name', 'Switch to dark mode')]))])]), ('icon', ordereddict([('repo', 'fontawesome/brands/github'), ('logo', 'material/compass-outline')])), ('favicon', 'overrides/images/compass-outline.png')])), ('extra_css', ['overrides/css/extra.css']), ('extra_javascript', ['overrides/js/extra.js', 'overrides/js/mathjax.js', 'https://polyfill.io/v3/polyfill.min.js?features=es6', 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js']), ('extra', ordereddict([('social_image', 'https://opengraph.githubassets.com/1674200183.717978/user/repo')]))])\n"
      ]
     },
     {
@@ -1247,7 +1336,11 @@
     "    needed.\n",
     "\n",
     "    Args:\n",
-    "        root_path: path under which mkdocs directory will be created\n",
+    "        root_path: The path to the root of the project\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    _add_requirements_to_settings(root_path)\n",
     "    _create_mkdocs_dir(root_path)\n",
@@ -1265,6 +1358,13 @@
     "    Creates **mkdocs** directory in the **root_path** directory and populates\n",
     "    it with initial values. You should edit mkdocs.yml file to customize it if\n",
     "    needed.\n",
+    "\n",
+    "    Args:\n",
+    "        root_path: The path to the root of the project.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    new(root_path)"
    ]
@@ -1302,10 +1402,10 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpedh3pfv6/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpedh3pfv6/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpedh3pfv6/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpedh3pfv6/mkdocs/summary_template.txt' generated.\u001b[0m\n",
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvldh21gh/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvldh21gh/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvldh21gh/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvldh21gh/mkdocs/summary_template.txt' generated.\u001b[0m\n",
       "_docs/_proc/\n",
       "*.bak\n",
       "# Byte-compiled / optimized / DLL files\n",
@@ -1314,7 +1414,7 @@
       "# nbdev_mkdocs\n",
       "mkdocs/docs/\n",
       "mkdocs/site/\n",
-      "ordereddict([('site_name', 'repo'), ('site_url', 'https://user.github.io/repo'), ('site_author', 'author'), ('site_description', 'description'), ('repo_name', 'repo'), ('repo_url', 'https://github.com/user/repo'), ('edit_uri', ''), ('copyright', '2023 onwards, author'), ('docs_dir', 'docs'), ('site_dir', 'site'), ('plugins', [ordereddict([('literate-nav', ordereddict([('nav_file', 'SUMMARY.md')]))]), 'search', ordereddict([('mkdocstrings', ordereddict([('handlers', ordereddict([('python', ordereddict([('import', ['https://docs.python.org/3/objects.inv']), ('options', ordereddict([('heading_level', 2), ('show_category_heading', True), ('show_root_heading', True), ('show_root_toc_entry', True), ('show_signature_annotations', True), ('show_if_no_docstring', True)]))]))]))]))])]), ('markdown_extensions', ['md_in_html', ordereddict([('pymdownx.arithmatex', ordereddict([('generic', True)]))]), 'pymdownx.inlinehilite', 'pymdownx.details', 'pymdownx.emoji', 'pymdownx.magiclink', ordereddict([('pymdownx.superfences', ordereddict([('custom_fences', [ordereddict([('name', 'mermaid'), ('class', 'mermaid'), ('format', <ruamel.yaml.comments.TaggedScalar object>)])])]))]), 'pymdownx.tasklist', ordereddict([('pymdownx.highlight', ordereddict([('linenums', False)]))]), ordereddict([('pymdownx.snippets', ordereddict([('check_paths', True)]))]), ordereddict([('pymdownx.tabbed', ordereddict([('alternate_style', True)]))]), 'admonition', ordereddict([('toc', ordereddict([('permalink', '¤')]))])]), ('theme', ordereddict([('name', 'material'), ('custom_dir', 'site_overrides'), ('features', ['navigation.instant', 'navigation.indexes', 'navigation.top', 'search.suggest', 'search.highlight', 'search.share']), ('palette', [ordereddict([('scheme', 'slate'), ('primary', 'black'), ('accent', 'yellow'), ('toggle', ordereddict([('icon', 'material/toggle-switch'), ('name', 'Switch to light mode')]))]), ordereddict([('scheme', 'default'), ('primary', 'black'), ('accent', 'red'), ('toggle', ordereddict([('icon', 'material/toggle-switch-off-outline'), ('name', 'Switch to dark mode')]))])]), ('icon', ordereddict([('repo', 'fontawesome/brands/github'), ('logo', 'material/compass-outline')])), ('favicon', 'overrides/images/compass-outline.png')])), ('extra_css', ['overrides/css/extra.css']), ('extra_javascript', ['overrides/js/extra.js', 'overrides/js/mathjax.js', 'https://polyfill.io/v3/polyfill.min.js?features=es6', 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js']), ('extra', ordereddict([('social_image', 'https://opengraph.githubassets.com/1672728932.704648/user/repo')]))])\n"
+      "ordereddict([('site_name', 'repo'), ('site_url', 'https://user.github.io/repo'), ('site_author', 'author'), ('site_description', 'description'), ('repo_name', 'repo'), ('repo_url', 'https://github.com/user/repo'), ('edit_uri', ''), ('copyright', '2023 onwards, author'), ('docs_dir', 'docs'), ('site_dir', 'site'), ('plugins', [ordereddict([('literate-nav', ordereddict([('nav_file', 'SUMMARY.md')]))]), 'search', ordereddict([('mkdocstrings', ordereddict([('handlers', ordereddict([('python', ordereddict([('import', ['https://docs.python.org/3/objects.inv']), ('options', ordereddict([('heading_level', 2), ('show_category_heading', True), ('show_root_heading', True), ('show_root_toc_entry', True), ('show_signature_annotations', True), ('show_if_no_docstring', True)]))]))]))]))])]), ('markdown_extensions', ['md_in_html', ordereddict([('pymdownx.arithmatex', ordereddict([('generic', True)]))]), 'pymdownx.inlinehilite', 'pymdownx.details', 'pymdownx.emoji', 'pymdownx.magiclink', ordereddict([('pymdownx.superfences', ordereddict([('custom_fences', [ordereddict([('name', 'mermaid'), ('class', 'mermaid'), ('format', <ruamel.yaml.comments.TaggedScalar object>)])])]))]), 'pymdownx.tasklist', ordereddict([('pymdownx.highlight', ordereddict([('linenums', False)]))]), ordereddict([('pymdownx.snippets', ordereddict([('check_paths', True)]))]), ordereddict([('pymdownx.tabbed', ordereddict([('alternate_style', True)]))]), 'admonition', ordereddict([('toc', ordereddict([('permalink', '¤')]))])]), ('theme', ordereddict([('name', 'material'), ('custom_dir', 'site_overrides'), ('features', ['navigation.instant', 'navigation.indexes', 'navigation.top', 'search.suggest', 'search.highlight', 'search.share']), ('palette', [ordereddict([('scheme', 'slate'), ('primary', 'black'), ('accent', 'yellow'), ('toggle', ordereddict([('icon', 'material/toggle-switch'), ('name', 'Switch to light mode')]))]), ordereddict([('scheme', 'default'), ('primary', 'black'), ('accent', 'red'), ('toggle', ordereddict([('icon', 'material/toggle-switch-off-outline'), ('name', 'Switch to dark mode')]))])]), ('icon', ordereddict([('repo', 'fontawesome/brands/github'), ('logo', 'material/compass-outline')])), ('favicon', 'overrides/images/compass-outline.png')])), ('extra_css', ['overrides/css/extra.css']), ('extra_javascript', ['overrides/js/extra.js', 'overrides/js/mathjax.js', 'https://polyfill.io/v3/polyfill.min.js?features=es6', 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js']), ('extra', ordereddict([('social_image', 'https://opengraph.githubassets.com/1674200184.522527/user/repo')]))])\n"
      ]
     },
     {
@@ -1383,15 +1483,18 @@
     "\n",
     "\n",
     "def _get_files_to_convert_to_markdown(cache: Path) -> List[Path]:\n",
-    "    \"\"\"Gets a list of notebooks and qmd files that need to be converted to markdown.\n",
+    "    \"\"\"Get a list of notebooks and qmd files that require conversion to markdown format.\n",
     "\n",
     "    Args:\n",
-    "        cache: Path to the nbs cache directory\n",
+    "        cache: The cache directory path\n",
     "\n",
     "    Returns:\n",
-    "        A list of files that need to be converted to markdown\n",
-    "    \"\"\"\n",
+    "        A list of files to convert to markdown\n",
     "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    exts = [\".ipynb\", \".qmd\"]\n",
     "    files = [\n",
     "        f\n",
@@ -1435,11 +1538,11 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8_xvvpjz/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8_xvvpjz/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8_xvvpjz/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8_xvvpjz/mkdocs/summary_template.txt' generated.\u001b[0m\n",
-      "['/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8_xvvpjz/_proc/Mkdocs.ipynb', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8_xvvpjz/_proc/index.ipynb', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8_xvvpjz/_proc/blogs/_blogs_index.ipynb', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8_xvvpjz/_proc/blogs/blogs_index.ipynb', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8_xvvpjz/_proc/blogs/qmd_blogs.qmd', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8_xvvpjz/_proc/guides/guides_index.ipynb', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8_xvvpjz/_proc/guides/_guides_index.ipynb', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8_xvvpjz/_proc/guides/qmd_guides.qmd', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8_xvvpjz/nbs/sample.qmd', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8_xvvpjz/nbs/index.ipynb']\n"
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmps70u1iv3/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmps70u1iv3/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmps70u1iv3/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmps70u1iv3/mkdocs/summary_template.txt' generated.\u001b[0m\n",
+      "['/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmps70u1iv3/_proc/Mkdocs.ipynb', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmps70u1iv3/_proc/index.ipynb', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmps70u1iv3/_proc/blogs/_blogs_index.ipynb', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmps70u1iv3/_proc/blogs/blogs_index.ipynb', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmps70u1iv3/_proc/blogs/qmd_blogs.qmd', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmps70u1iv3/_proc/guides/guides_index.ipynb', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmps70u1iv3/_proc/guides/_guides_index.ipynb', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmps70u1iv3/_proc/guides/qmd_guides.qmd', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmps70u1iv3/nbs/sample.qmd', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmps70u1iv3/nbs/index.ipynb']\n"
      ]
     },
     {
@@ -1453,6 +1556,15 @@
    ],
    "source": [
     "def create_sample_qmd_file(d):\n",
+    "    \"\"\"Create a sample qmd file\n",
+    "\n",
+    "    Args:\n",
+    "        d: Path to the directory where the file should be created\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    qmd_str = \"\"\"---\n",
     "title: \"Sample\"\n",
     "author: Sample\n",
@@ -1531,15 +1643,18 @@
     "\n",
     "\n",
     "def _update_conditional_content_tags(text: str) -> str:\n",
-    "    \"\"\"Update the conditional content tags in the notebook.\n",
+    "    \"\"\"Update conditional content tags.\n",
     "\n",
     "    Args:\n",
     "        text: The text to update the conditional content tags in.\n",
     "\n",
     "    Returns:\n",
     "        The updated text with the conditional content tags modified.\n",
-    "    \"\"\"\n",
     "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    pattern = r\":::\\s*{(?:\\s*.*\\.content-visible|\\s*\\.content-hidden)\\s*(when|unless)-format\\s*=\\\\\\s*(\\\"|\\')\\s*(html|markdown)\\s*\\\\(\\\"|\\')\\s*.*}\"\n",
     "    text = re.sub(\n",
     "        pattern,\n",
@@ -1674,13 +1789,17 @@
     "\n",
     "\n",
     "def _update_mermaid_chart_tags(text: str) -> str:\n",
-    "    \"\"\"Update the mermaid chart tags from quarto format to markdown format\n",
+    "    \"\"\"Convert the mermaid chart tags from quarto format to markdown format.\n",
     "\n",
     "    Args:\n",
     "        text: The text to update the mermaid chart tags in.\n",
     "\n",
     "    Returns:\n",
     "        The updated text with the mermaid chart tags modified.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    pattern = r\"```\\s*{mermaid\\s*}\"\n",
     "    text = re.sub(pattern, \"``` mermaid\", text)\n",
@@ -1748,16 +1867,17 @@
     "\n",
     "\n",
     "def _add_markdown_attribute_to_enable_md_in_html(text: str) -> str:\n",
-    "    \"\"\"Add support for markdown in HTML\n",
-    "\n",
-    "    This function replaces the `::: {` character sequence into `::: {markdown=1` in a string\n",
-    "    to support markdown in HTML\n",
+    "    \"\"\"Add markdown attribute to enable markdown in html.\n",
     "\n",
     "    Args:\n",
-    "        text: The input string to be processed\n",
+    "        text: The text to add the markdown attribute to\n",
     "\n",
     "    Returns:\n",
-    "        The input string with the `::: {` character sequence replaced by `::: {markdown=1`\n",
+    "        The text with the markdown attribute added\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    pattern = r\":::\\s*{\\s*(markdown=1)?\\s*\"\n",
     "    text = re.sub(pattern, r\"::: {markdown=1 \", text)\n",
@@ -1828,10 +1948,14 @@
     "\n",
     "\n",
     "def _update_quarto_tags_to_markdown_format(nb_path: Path):\n",
-    "    \"\"\"Update Quarto tags to Markdown format in the given notebook.\n",
+    "    \"\"\"Update Quarto tags to Markdown format\n",
     "\n",
     "    Args:\n",
-    "        nb_path: The path to the notebook.\n",
+    "        nb_path: Path to the notebook\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    with open(nb_path, \"r\") as f:\n",
     "        contents = f.read()\n",
@@ -1852,6 +1976,7 @@
    "outputs": [],
    "source": [
     "def _create_test_notebook_contents() -> Dict[str, Any]:\n",
+    "    \"\"\"Create a sample notebook using json\"\"\"\n",
     "    return {\n",
     "        \"cells\": [\n",
     "            {\n",
@@ -1981,6 +2106,18 @@
     "\n",
     "\n",
     "def _sprun(cmd):\n",
+    "    \"\"\"Run a command via subprocess.check_output\n",
+    "\n",
+    "    Args:\n",
+    "        cmd: The command to run\n",
+    "\n",
+    "    Raises:\n",
+    "        subprocess.CalledProcessError: If the command fails\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    try:\n",
     "        # nosemgrep: python.lang.security.audit.subprocess-shell-true.subprocess-shell-true\n",
     "        subprocess.check_output(\n",
@@ -2004,7 +2141,15 @@
     "\n",
     "\n",
     "def _generate_markdown_from_files(root_path: str):\n",
+    "    \"\"\"Generate markdown files from notebook files.\n",
+    "\n",
+    "    Args:\n",
+    "        root_path: The root path of the project.\n",
     "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    doc_path = Path(root_path) / \"mkdocs\" / \"docs\"\n",
     "    doc_path.mkdir(exist_ok=True, parents=True)\n",
     "\n",
@@ -2060,10 +2205,10 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjzh1i0zh/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjzh1i0zh/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjzh1i0zh/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjzh1i0zh/mkdocs/summary_template.txt' generated.\u001b[0m\n"
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpd3x4nb6d/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpd3x4nb6d/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpd3x4nb6d/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpd3x4nb6d/mkdocs/summary_template.txt' generated.\u001b[0m\n"
      ]
     },
     {
@@ -2157,15 +2302,15 @@
      "output_type": "stream",
      "text": [
       "Checks:\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjzh1i0zh/mkdocs/docs/sample.md\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjzh1i0zh/mkdocs/docs/Mkdocs.md\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjzh1i0zh/mkdocs/docs/index.md\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjzh1i0zh/mkdocs/docs/test.md\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjzh1i0zh/mkdocs/docs/blogs/qmd_blogs.md\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjzh1i0zh/mkdocs/docs/blogs/blogs_index.md\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjzh1i0zh/mkdocs/docs/guides/qmd_guides.md\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjzh1i0zh/mkdocs/docs/guides/guides_index.md\n",
-      "{'cells': [{'cell_type': 'markdown', 'metadata': {}, 'source': ['::: {markdown=1 .content-visible unless-format=\"markdown\"}\\n', '\\n', 'Will only appear in markdown.\\n', '\\n', ':::\\n', '\\n', '``` mermaid\\n', 'flowchart LR\\n', '  A[Hard edge] --> B(Round edge)\\n', '  B --> C{Decision}\\n', '  C --> D[Result one]\\n', '  C --> E[Result two]\\n', '```']}, {'cell_type': 'markdown', 'metadata': {}, 'source': ['<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->']}, {'cell_type': 'markdown', 'metadata': {}, 'source': ['::: {markdown=1 .content-visible unless-format=\"html\"}\\n', '\\n', 'Will only appear in html.\\n', '\\n', ':::']}], 'metadata': {'kernelspec': {'display_name': 'Python 3', 'language': 'python', 'name': 'python3'}, 'language_info': {'codemirror_mode': {'name': 'ipython', 'version': 3}, 'file_extension': '.py', 'mimetype': 'text/x-python', 'name': 'python', 'nbconvert_exporter': 'python', 'pygments_lexer': 'ipython3', 'version': '3.8.3'}}, 'nbformat': 4, 'nbformat_minor': 4}\n"
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpd3x4nb6d/mkdocs/docs/sample.md\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpd3x4nb6d/mkdocs/docs/Mkdocs.md\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpd3x4nb6d/mkdocs/docs/index.md\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpd3x4nb6d/mkdocs/docs/test.md\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpd3x4nb6d/mkdocs/docs/blogs/qmd_blogs.md\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpd3x4nb6d/mkdocs/docs/blogs/blogs_index.md\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpd3x4nb6d/mkdocs/docs/guides/qmd_guides.md\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpd3x4nb6d/mkdocs/docs/guides/guides_index.md\n",
+      "{'cells': [{'cell_type': 'markdown', 'metadata': {}, 'source': ['::: {markdown=1 .content-visible unless-format=\"markdown\"}\\n', '\\n', 'Will only appear in markdown.\\n', '\\n', ':::\\n', '\\n', '``` mermaid\\n', 'flowchart LR\\n', '  A[Hard edge] --> B(Round edge)\\n', '  B --> C{Decision}\\n', '  C --> D[Result one]\\n', '  C --> E[Result two]\\n', '```']}, {'cell_type': 'markdown', 'metadata': {}, 'source': ['<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->']}, {'cell_type': 'markdown', 'metadata': {}, 'source': ['::: {markdown=1 .content-visible unless-format=\"html\"}\\n', '\\n', 'Will only appear in html.\\n', '\\n', ':::']}], 'metadata': {'kernelspec': {'display_name': 'Python 3', 'language': 'python', 'name': 'python3'}, 'language_info': {'codemirror_mode': {'name': 'ipython', 'version': 3}, 'file_extension': '.py', 'mimetype': 'text/x-python', 'name': 'python', 'nbconvert_exporter': 'python', 'pygments_lexer': 'ipython3', 'version': '3.8.3'}, 'widgets': {'application/vnd.jupyter.widget-state+json': {'state': {}, 'version_major': 2, 'version_minor': 0}}}, 'nbformat': 4, 'nbformat_minor': 4}\n"
      ]
     },
     {
@@ -2272,14 +2417,18 @@
     "\n",
     "\n",
     "def _replace_all(text: str, dir_prefix: str) -> str:\n",
-    "    \"\"\"Replace the images relative path in the markdown text\n",
+    "    \"\"\"Replace the images relative path in the markdown string\n",
     "\n",
     "    Args:\n",
-    "        text: String to replace\n",
+    "        text: The markdown string\n",
     "        dir_prefix: Sub directory prefix to append to the image's relative path\n",
     "\n",
     "    Returns:\n",
     "        The text with the updated images relative path\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    _replace = {}\n",
     "\n",
@@ -2409,6 +2558,10 @@
     "    Args:\n",
     "        cache: Path to the nbs cache directory\n",
     "        doc_path: Path to the mkdocs/docs directory\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    files = _get_files_to_convert_to_markdown(cache)\n",
     "\n",
@@ -2424,12 +2577,16 @@
     "\n",
     "\n",
     "def _copy_images_to_docs_dir(root_path: str):\n",
-    "    \"\"\"Copy guide images to the docs directory\n",
+    "    # Reference: https://github.com/quarto-dev/quarto-cli/blob/main/src/core/image.ts#L38\n",
+    "    \"\"\"Copy images from nbs to docs directory.\n",
     "\n",
     "    Args:\n",
-    "        root_path: Project's root directory\n",
+    "        root_path: The root path of the project.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
-    "    # Reference: https://github.com/quarto-dev/quarto-cli/blob/main/src/core/image.ts#L38\n",
     "    image_extensions = [\n",
     "        \".apng\",\n",
     "        \".avif\",\n",
@@ -2469,7 +2626,19 @@
    "outputs": [],
    "source": [
     "def copy_guides(src, dst):\n",
+    "    \"\"\"Copy guides from one directory to another.\n",
     "\n",
+    "    Args:\n",
+    "        src: Source directory\n",
+    "        dst: Destination directory\n",
+    "\n",
+    "    Raises:\n",
+    "        AssertionError: If src does not exist\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    src = Path(src)\n",
     "    dst = Path(dst)\n",
     "    assert src.exists()\n",
@@ -2521,32 +2690,32 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "../nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb\n",
-      "../nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb\n",
-      "../nbs/guides/images/say_hello.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/say_hello.png\n",
-      "../nbs/guides/images/git_repo_clone_page.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/git_repo_clone_page.png\n",
-      "../nbs/guides/images/sidebar_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/sidebar_1.png\n",
-      "../nbs/guides/images/CLI_command.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/CLI_command.png\n",
-      "../nbs/guides/images/sidebar_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/sidebar_2.png\n",
-      "../nbs/guides/images/foo_doc_string.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/foo_doc_string.png\n",
-      "../nbs/guides/images/guide_notebook.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/guide_notebook.png\n",
-      "../nbs/guides/images/jupyter_home.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/jupyter_home.png\n",
-      "../nbs/guides/images/hello_class.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/hello_class.png\n",
-      "../nbs/guides/images/guide_3.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/guide_3.png\n",
-      "../nbs/guides/images/releases_default.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/releases_default.png\n",
-      "../nbs/guides/images/guide_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/guide_2.png\n",
-      "../nbs/guides/images/cli_not_found.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/cli_not_found.png\n",
-      "../nbs/guides/images/guide_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/guide_1.png\n",
-      "../nbs/guides/images/releases.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/releases.png\n",
-      "../nbs/guides/images/nbdev_mkdocs_preview_dark_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
-      "../nbs/guides/images/guide_4.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/guide_4.png\n",
-      "../nbs/guides/images/empty_git_repo.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/empty_git_repo.png\n",
-      "../nbs/guides/images/nbdev_mkdocs_preview_light_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
-      "../nbs/guides/images/enable_gh_pages.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/nbs/guides/images/enable_gh_pages.png\n",
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/summary_template.txt' generated.\u001b[0m\n"
+      "../nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb\n",
+      "../nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb\n",
+      "../nbs/guides/images/say_hello.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/say_hello.png\n",
+      "../nbs/guides/images/git_repo_clone_page.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/git_repo_clone_page.png\n",
+      "../nbs/guides/images/sidebar_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/sidebar_1.png\n",
+      "../nbs/guides/images/CLI_command.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/CLI_command.png\n",
+      "../nbs/guides/images/sidebar_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/sidebar_2.png\n",
+      "../nbs/guides/images/foo_doc_string.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/foo_doc_string.png\n",
+      "../nbs/guides/images/guide_notebook.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/guide_notebook.png\n",
+      "../nbs/guides/images/jupyter_home.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/jupyter_home.png\n",
+      "../nbs/guides/images/hello_class.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/hello_class.png\n",
+      "../nbs/guides/images/guide_3.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/guide_3.png\n",
+      "../nbs/guides/images/releases_default.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/releases_default.png\n",
+      "../nbs/guides/images/guide_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/guide_2.png\n",
+      "../nbs/guides/images/cli_not_found.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/cli_not_found.png\n",
+      "../nbs/guides/images/guide_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/guide_1.png\n",
+      "../nbs/guides/images/releases.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/releases.png\n",
+      "../nbs/guides/images/nbdev_mkdocs_preview_dark_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
+      "../nbs/guides/images/guide_4.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/guide_4.png\n",
+      "../nbs/guides/images/empty_git_repo.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/empty_git_repo.png\n",
+      "../nbs/guides/images/nbdev_mkdocs_preview_light_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
+      "../nbs/guides/images/enable_gh_pages.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/nbs/guides/images/enable_gh_pages.png\n",
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/summary_template.txt' generated.\u001b[0m\n"
      ]
     },
     {
@@ -2614,52 +2783,52 @@
      "output_type": "stream",
      "text": [
       "Checks for images:\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/say_hello.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/git_repo_clone_page.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/sidebar_1.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/CLI_command.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/sidebar_2.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/foo_doc_string.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/guide_notebook.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/jupyter_home.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/hello_class.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/guide_3.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/releases_default.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/guide_2.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/cli_not_found.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/guide_1.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/releases.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/nbdev_mkdocs_preview_dark_1.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/guide_4.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/empty_git_repo.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/nbdev_mkdocs_preview_light_1.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/blogs/images/enable_gh_pages.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/say_hello.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/git_repo_clone_page.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/sidebar_1.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/CLI_command.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/sidebar_2.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/foo_doc_string.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/guide_notebook.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/jupyter_home.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/hello_class.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/guide_3.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/releases_default.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/guide_2.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/cli_not_found.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/guide_1.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/releases.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/guide_4.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/empty_git_repo.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/images/nbs/guides/images/enable_gh_pages.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/say_hello.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/git_repo_clone_page.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/sidebar_1.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/CLI_command.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/sidebar_2.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/foo_doc_string.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/guide_notebook.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/jupyter_home.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/hello_class.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/guide_3.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/releases_default.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/guide_2.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/cli_not_found.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/guide_1.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/releases.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/nbdev_mkdocs_preview_dark_1.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/guide_4.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/empty_git_repo.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/nbdev_mkdocs_preview_light_1.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/blogs/images/enable_gh_pages.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/say_hello.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/git_repo_clone_page.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/sidebar_1.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/CLI_command.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/sidebar_2.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/foo_doc_string.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/guide_notebook.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/jupyter_home.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/hello_class.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/guide_3.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/releases_default.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/guide_2.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/cli_not_found.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/guide_1.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/releases.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/guide_4.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/empty_git_repo.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/images/nbs/guides/images/enable_gh_pages.png\n",
       "Checks for markdown:\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/Mkdocs.md\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/Social_Image_Generator.md\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/index.md\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/blogs/Guide_01_End_To_End_Walkthrough.md\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmph87fq09_/mkdocs/docs/guides/Guide_01_End_To_End_Walkthrough.md\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/Mkdocs.md\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/Social_Image_Generator.md\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/index.md\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/blogs/Guide_01_End_To_End_Walkthrough.md\n",
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7qxkbo89/mkdocs/docs/guides/Guide_01_End_To_End_Walkthrough.md\n",
       "OK.\n"
      ]
     }
@@ -2762,6 +2931,21 @@
     "\n",
     "\n",
     "def _get_title_from_notebook(file_path: Path) -> str:\n",
+    "    \"\"\"Get the title of a notebook or markdown file.\n",
+    "\n",
+    "    Args:\n",
+    "        file_path: The path to the file.\n",
+    "\n",
+    "    Returns:\n",
+    "        The title of the file.\n",
+    "\n",
+    "    Raises:\n",
+    "        ValueError: If the file does not exist.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    title: str\n",
     "    cache = proc_nbs()\n",
     "    _file_path = Path(cache) / file_path\n",
@@ -2834,32 +3018,32 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "../nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb\n",
-      "../nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb\n",
-      "../nbs/guides/images/say_hello.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/say_hello.png\n",
-      "../nbs/guides/images/git_repo_clone_page.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/git_repo_clone_page.png\n",
-      "../nbs/guides/images/sidebar_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/sidebar_1.png\n",
-      "../nbs/guides/images/CLI_command.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/CLI_command.png\n",
-      "../nbs/guides/images/sidebar_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/sidebar_2.png\n",
-      "../nbs/guides/images/foo_doc_string.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/foo_doc_string.png\n",
-      "../nbs/guides/images/guide_notebook.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/guide_notebook.png\n",
-      "../nbs/guides/images/jupyter_home.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/jupyter_home.png\n",
-      "../nbs/guides/images/hello_class.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/hello_class.png\n",
-      "../nbs/guides/images/guide_3.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/guide_3.png\n",
-      "../nbs/guides/images/releases_default.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/releases_default.png\n",
-      "../nbs/guides/images/guide_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/guide_2.png\n",
-      "../nbs/guides/images/cli_not_found.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/cli_not_found.png\n",
-      "../nbs/guides/images/guide_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/guide_1.png\n",
-      "../nbs/guides/images/releases.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/releases.png\n",
-      "../nbs/guides/images/nbdev_mkdocs_preview_dark_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
-      "../nbs/guides/images/guide_4.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/guide_4.png\n",
-      "../nbs/guides/images/empty_git_repo.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/empty_git_repo.png\n",
-      "../nbs/guides/images/nbdev_mkdocs_preview_light_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
-      "../nbs/guides/images/enable_gh_pages.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/nbs/guides/images/enable_gh_pages.png\n",
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvbjl1uo8/mkdocs/summary_template.txt' generated.\u001b[0m\n"
+      "../nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb\n",
+      "../nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb\n",
+      "../nbs/guides/images/say_hello.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/say_hello.png\n",
+      "../nbs/guides/images/git_repo_clone_page.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/git_repo_clone_page.png\n",
+      "../nbs/guides/images/sidebar_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/sidebar_1.png\n",
+      "../nbs/guides/images/CLI_command.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/CLI_command.png\n",
+      "../nbs/guides/images/sidebar_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/sidebar_2.png\n",
+      "../nbs/guides/images/foo_doc_string.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/foo_doc_string.png\n",
+      "../nbs/guides/images/guide_notebook.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/guide_notebook.png\n",
+      "../nbs/guides/images/jupyter_home.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/jupyter_home.png\n",
+      "../nbs/guides/images/hello_class.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/hello_class.png\n",
+      "../nbs/guides/images/guide_3.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/guide_3.png\n",
+      "../nbs/guides/images/releases_default.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/releases_default.png\n",
+      "../nbs/guides/images/guide_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/guide_2.png\n",
+      "../nbs/guides/images/cli_not_found.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/cli_not_found.png\n",
+      "../nbs/guides/images/guide_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/guide_1.png\n",
+      "../nbs/guides/images/releases.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/releases.png\n",
+      "../nbs/guides/images/nbdev_mkdocs_preview_dark_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
+      "../nbs/guides/images/guide_4.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/guide_4.png\n",
+      "../nbs/guides/images/empty_git_repo.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/empty_git_repo.png\n",
+      "../nbs/guides/images/nbdev_mkdocs_preview_light_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
+      "../nbs/guides/images/enable_gh_pages.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/nbs/guides/images/enable_gh_pages.png\n",
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp2df8vvjn/mkdocs/summary_template.txt' generated.\u001b[0m\n"
      ]
     },
     {
@@ -2995,7 +3179,21 @@
     "# | export\n",
     "\n",
     "def _get_sidebar_from_config(file_path: Path) -> List[Any]:\n",
-    "    \n",
+    "    \"\"\"Get the sidebar contents from the sidebar.yml or _quarto.yml file.\n",
+    "\n",
+    "    Args:\n",
+    "        file_path: Path to the sidebar.yml or _quarto.yml file.\n",
+    "\n",
+    "    Returns:\n",
+    "        The sidebar contents.\n",
+    "\n",
+    "    Raises:\n",
+    "        KeyError: If the sidebar is not defined in the config file.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    if not file_path.exists():\n",
     "        typer.secho(\n",
     "            f\"Path '{file_path.resolve()}' does not exists!\",\n",
@@ -3020,6 +3218,18 @@
     "\n",
     "\n",
     "def _read_sidebar_from_yml(root_path: str) -> List[Union[str, Any]]:\n",
+    "    \"\"\"Get the sidebar contents from the sidebar.yml or _quarto.yml file.\n",
+    "\n",
+    "    Args:\n",
+    "        root_path: The root path of the project.\n",
+    "\n",
+    "    Returns:\n",
+    "        A list of strings and objects.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    _proc_dir = Path(root_path) / \"_proc\"\n",
     "    sidebar_yml_path = _proc_dir / \"sidebar.yml\"\n",
     "    _quarto_yml_path = _proc_dir / \"_quarto.yml\"\n",
@@ -3069,10 +3279,10 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpg2e4m86f/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpg2e4m86f/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpg2e4m86f/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpg2e4m86f/mkdocs/summary_template.txt' generated.\u001b[0m\n"
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp4svxl_qd/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp4svxl_qd/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp4svxl_qd/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp4svxl_qd/mkdocs/summary_template.txt' generated.\u001b[0m\n"
      ]
     },
     {
@@ -3147,10 +3357,10 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp3d_59lj5/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp3d_59lj5/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp3d_59lj5/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp3d_59lj5/mkdocs/summary_template.txt' generated.\u001b[0m\n"
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpfzd8miq8/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpfzd8miq8/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpfzd8miq8/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpfzd8miq8/mkdocs/summary_template.txt' generated.\u001b[0m\n"
      ]
     },
     {
@@ -3198,6 +3408,18 @@
     "\n",
     "\n",
     "def _flattern_sidebar_items(items: List[Union[str, Any]]) -> List[Union[str, Any]]:\n",
+    "    \"\"\"Flatten a list of items.\n",
+    "\n",
+    "    Args:\n",
+    "        items: A list of items.\n",
+    "\n",
+    "    Returns:\n",
+    "        A flattened list of items.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    return [i for item in items if isinstance(item, list) for i in item] + [\n",
     "        item for item in items if not isinstance(item, list)\n",
     "    ]\n",
@@ -3206,7 +3428,19 @@
     "def _expand_sidebar_if_needed(\n",
     "    root_path: str, sidebar: List[Union[str, Any]]\n",
     ") -> List[Union[str, Any]]:\n",
-    "    \"\"\" \"\"\"\n",
+    "    \"\"\"Expand the sidebar if needed.\n",
+    "\n",
+    "    Args:\n",
+    "        root_path: The root path of the project\n",
+    "        sidebar: The sidebar to expand\n",
+    "\n",
+    "    Returns:\n",
+    "        The expanded sidebar\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    _proc_dir = Path(root_path) / \"_proc\"\n",
     "    exts = [\".ipynb\", \".qmd\"]\n",
     "\n",
@@ -3260,32 +3494,32 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "../nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb\n",
-      "../nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb\n",
-      "../nbs/guides/images/say_hello.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/say_hello.png\n",
-      "../nbs/guides/images/git_repo_clone_page.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/git_repo_clone_page.png\n",
-      "../nbs/guides/images/sidebar_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/sidebar_1.png\n",
-      "../nbs/guides/images/CLI_command.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/CLI_command.png\n",
-      "../nbs/guides/images/sidebar_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/sidebar_2.png\n",
-      "../nbs/guides/images/foo_doc_string.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/foo_doc_string.png\n",
-      "../nbs/guides/images/guide_notebook.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/guide_notebook.png\n",
-      "../nbs/guides/images/jupyter_home.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/jupyter_home.png\n",
-      "../nbs/guides/images/hello_class.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/hello_class.png\n",
-      "../nbs/guides/images/guide_3.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/guide_3.png\n",
-      "../nbs/guides/images/releases_default.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/releases_default.png\n",
-      "../nbs/guides/images/guide_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/guide_2.png\n",
-      "../nbs/guides/images/cli_not_found.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/cli_not_found.png\n",
-      "../nbs/guides/images/guide_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/guide_1.png\n",
-      "../nbs/guides/images/releases.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/releases.png\n",
-      "../nbs/guides/images/nbdev_mkdocs_preview_dark_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
-      "../nbs/guides/images/guide_4.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/guide_4.png\n",
-      "../nbs/guides/images/empty_git_repo.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/empty_git_repo.png\n",
-      "../nbs/guides/images/nbdev_mkdocs_preview_light_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
-      "../nbs/guides/images/enable_gh_pages.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/nbs/guides/images/enable_gh_pages.png\n",
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpebu5vw0o/mkdocs/summary_template.txt' generated.\u001b[0m\n"
+      "../nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb\n",
+      "../nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb\n",
+      "../nbs/guides/images/say_hello.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/say_hello.png\n",
+      "../nbs/guides/images/git_repo_clone_page.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/git_repo_clone_page.png\n",
+      "../nbs/guides/images/sidebar_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/sidebar_1.png\n",
+      "../nbs/guides/images/CLI_command.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/CLI_command.png\n",
+      "../nbs/guides/images/sidebar_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/sidebar_2.png\n",
+      "../nbs/guides/images/foo_doc_string.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/foo_doc_string.png\n",
+      "../nbs/guides/images/guide_notebook.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/guide_notebook.png\n",
+      "../nbs/guides/images/jupyter_home.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/jupyter_home.png\n",
+      "../nbs/guides/images/hello_class.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/hello_class.png\n",
+      "../nbs/guides/images/guide_3.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/guide_3.png\n",
+      "../nbs/guides/images/releases_default.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/releases_default.png\n",
+      "../nbs/guides/images/guide_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/guide_2.png\n",
+      "../nbs/guides/images/cli_not_found.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/cli_not_found.png\n",
+      "../nbs/guides/images/guide_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/guide_1.png\n",
+      "../nbs/guides/images/releases.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/releases.png\n",
+      "../nbs/guides/images/nbdev_mkdocs_preview_dark_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
+      "../nbs/guides/images/guide_4.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/guide_4.png\n",
+      "../nbs/guides/images/empty_git_repo.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/empty_git_repo.png\n",
+      "../nbs/guides/images/nbdev_mkdocs_preview_light_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
+      "../nbs/guides/images/enable_gh_pages.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/nbs/guides/images/enable_gh_pages.png\n",
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7l3w2tqm/mkdocs/summary_template.txt' generated.\u001b[0m\n"
      ]
     },
     {
@@ -3474,6 +3708,19 @@
     "\n",
     "\n",
     "def _generate_nav_from_sidebar(sidebar_items, level=0) -> str:\n",
+    "    \"\"\"Generate a navigation string for mkdocs from a sidebar list.\n",
+    "\n",
+    "    Args:\n",
+    "        sidebar_items: A list of strings or dictionaries.\n",
+    "        level: The level of indentation to use.\n",
+    "\n",
+    "    Returns:\n",
+    "        str: The navigation string.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    output = \"\"\n",
     "    links = [\n",
     "        \"{}- [{}]({}.md)\\n\".format(\n",
@@ -3523,32 +3770,32 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "../nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb\n",
-      "../nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb\n",
-      "../nbs/guides/images/say_hello.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/say_hello.png\n",
-      "../nbs/guides/images/git_repo_clone_page.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/git_repo_clone_page.png\n",
-      "../nbs/guides/images/sidebar_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/sidebar_1.png\n",
-      "../nbs/guides/images/CLI_command.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/CLI_command.png\n",
-      "../nbs/guides/images/sidebar_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/sidebar_2.png\n",
-      "../nbs/guides/images/foo_doc_string.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/foo_doc_string.png\n",
-      "../nbs/guides/images/guide_notebook.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/guide_notebook.png\n",
-      "../nbs/guides/images/jupyter_home.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/jupyter_home.png\n",
-      "../nbs/guides/images/hello_class.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/hello_class.png\n",
-      "../nbs/guides/images/guide_3.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/guide_3.png\n",
-      "../nbs/guides/images/releases_default.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/releases_default.png\n",
-      "../nbs/guides/images/guide_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/guide_2.png\n",
-      "../nbs/guides/images/cli_not_found.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/cli_not_found.png\n",
-      "../nbs/guides/images/guide_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/guide_1.png\n",
-      "../nbs/guides/images/releases.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/releases.png\n",
-      "../nbs/guides/images/nbdev_mkdocs_preview_dark_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
-      "../nbs/guides/images/guide_4.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/guide_4.png\n",
-      "../nbs/guides/images/empty_git_repo.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/empty_git_repo.png\n",
-      "../nbs/guides/images/nbdev_mkdocs_preview_light_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
-      "../nbs/guides/images/enable_gh_pages.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/nbs/guides/images/enable_gh_pages.png\n",
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpjqwxsxrt/mkdocs/summary_template.txt' generated.\u001b[0m\n"
+      "../nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb\n",
+      "../nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb\n",
+      "../nbs/guides/images/say_hello.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/say_hello.png\n",
+      "../nbs/guides/images/git_repo_clone_page.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/git_repo_clone_page.png\n",
+      "../nbs/guides/images/sidebar_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/sidebar_1.png\n",
+      "../nbs/guides/images/CLI_command.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/CLI_command.png\n",
+      "../nbs/guides/images/sidebar_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/sidebar_2.png\n",
+      "../nbs/guides/images/foo_doc_string.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/foo_doc_string.png\n",
+      "../nbs/guides/images/guide_notebook.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/guide_notebook.png\n",
+      "../nbs/guides/images/jupyter_home.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/jupyter_home.png\n",
+      "../nbs/guides/images/hello_class.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/hello_class.png\n",
+      "../nbs/guides/images/guide_3.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/guide_3.png\n",
+      "../nbs/guides/images/releases_default.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/releases_default.png\n",
+      "../nbs/guides/images/guide_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/guide_2.png\n",
+      "../nbs/guides/images/cli_not_found.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/cli_not_found.png\n",
+      "../nbs/guides/images/guide_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/guide_1.png\n",
+      "../nbs/guides/images/releases.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/releases.png\n",
+      "../nbs/guides/images/nbdev_mkdocs_preview_dark_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
+      "../nbs/guides/images/guide_4.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/guide_4.png\n",
+      "../nbs/guides/images/empty_git_repo.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/empty_git_repo.png\n",
+      "../nbs/guides/images/nbdev_mkdocs_preview_light_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
+      "../nbs/guides/images/enable_gh_pages.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/nbs/guides/images/enable_gh_pages.png\n",
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzad18fyy/mkdocs/summary_template.txt' generated.\u001b[0m\n"
      ]
     },
     {
@@ -3661,6 +3908,18 @@
     "def _generate_summary_for_sidebar(\n",
     "    root_path: str,\n",
     ") -> str:\n",
+    "    \"\"\"Generate a summary for the sidebar\n",
+    "\n",
+    "    Args:\n",
+    "        root_path: The root path\n",
+    "\n",
+    "    Returns:\n",
+    "        The summary for the sidebar\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    with set_cwd(root_path):\n",
     "        sidebar = _read_sidebar_from_yml(root_path)\n",
     "        expanded_sidebar = _expand_sidebar_if_needed(root_path, sidebar)\n",
@@ -3704,33 +3963,33 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "../nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb\n",
-      "../nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb\n",
-      "../nbs/guides/images/say_hello.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/say_hello.png\n",
-      "../nbs/guides/images/git_repo_clone_page.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/git_repo_clone_page.png\n",
-      "../nbs/guides/images/sidebar_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/sidebar_1.png\n",
-      "../nbs/guides/images/CLI_command.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/CLI_command.png\n",
-      "../nbs/guides/images/sidebar_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/sidebar_2.png\n",
-      "../nbs/guides/images/foo_doc_string.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/foo_doc_string.png\n",
-      "../nbs/guides/images/guide_notebook.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/guide_notebook.png\n",
-      "../nbs/guides/images/jupyter_home.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/jupyter_home.png\n",
-      "../nbs/guides/images/hello_class.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/hello_class.png\n",
-      "../nbs/guides/images/guide_3.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/guide_3.png\n",
-      "../nbs/guides/images/releases_default.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/releases_default.png\n",
-      "../nbs/guides/images/guide_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/guide_2.png\n",
-      "../nbs/guides/images/cli_not_found.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/cli_not_found.png\n",
-      "../nbs/guides/images/guide_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/guide_1.png\n",
-      "../nbs/guides/images/releases.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/releases.png\n",
-      "../nbs/guides/images/nbdev_mkdocs_preview_dark_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
-      "../nbs/guides/images/guide_4.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/guide_4.png\n",
-      "../nbs/guides/images/empty_git_repo.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/empty_git_repo.png\n",
-      "../nbs/guides/images/nbdev_mkdocs_preview_light_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
-      "../nbs/guides/images/enable_gh_pages.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/nbs/guides/images/enable_gh_pages.png\n",
-      "executing the command: cd \"/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg\" && nbdev_sidebar\n",
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcyib7hmg/mkdocs/summary_template.txt' generated.\u001b[0m\n"
+      "../nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb\n",
+      "../nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb\n",
+      "../nbs/guides/images/say_hello.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/say_hello.png\n",
+      "../nbs/guides/images/git_repo_clone_page.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/git_repo_clone_page.png\n",
+      "../nbs/guides/images/sidebar_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/sidebar_1.png\n",
+      "../nbs/guides/images/CLI_command.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/CLI_command.png\n",
+      "../nbs/guides/images/sidebar_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/sidebar_2.png\n",
+      "../nbs/guides/images/foo_doc_string.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/foo_doc_string.png\n",
+      "../nbs/guides/images/guide_notebook.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/guide_notebook.png\n",
+      "../nbs/guides/images/jupyter_home.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/jupyter_home.png\n",
+      "../nbs/guides/images/hello_class.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/hello_class.png\n",
+      "../nbs/guides/images/guide_3.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/guide_3.png\n",
+      "../nbs/guides/images/releases_default.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/releases_default.png\n",
+      "../nbs/guides/images/guide_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/guide_2.png\n",
+      "../nbs/guides/images/cli_not_found.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/cli_not_found.png\n",
+      "../nbs/guides/images/guide_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/guide_1.png\n",
+      "../nbs/guides/images/releases.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/releases.png\n",
+      "../nbs/guides/images/nbdev_mkdocs_preview_dark_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
+      "../nbs/guides/images/guide_4.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/guide_4.png\n",
+      "../nbs/guides/images/empty_git_repo.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/empty_git_repo.png\n",
+      "../nbs/guides/images/nbdev_mkdocs_preview_light_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
+      "../nbs/guides/images/enable_gh_pages.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/nbs/guides/images/enable_gh_pages.png\n",
+      "executing the command: cd \"/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc\" && nbdev_sidebar\n",
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9br4dwcc/mkdocs/summary_template.txt' generated.\u001b[0m\n"
      ]
     },
     {
@@ -3826,7 +4085,19 @@
     "# | export\n",
     "\n",
     "\n",
-    "def get_submodules(package_name: str) -> List[str]:\n",
+    "def _get_submodules(package_name: str) -> List[str]:\n",
+    "    \"\"\"Get all submodules of a package.\n",
+    "\n",
+    "    Args:\n",
+    "        package_name: The name of the package.\n",
+    "\n",
+    "    Returns:\n",
+    "        A list of submodules.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    # nosemgrep: python.lang.security.audit.non-literal-import.non-literal-import\n",
     "    m = importlib.import_module(package_name)\n",
     "    submodules = [\n",
@@ -3914,7 +4185,7 @@
     }
    ],
    "source": [
-    "submodules = get_submodules(\"mkdocs\")\n",
+    "submodules = _get_submodules(\"mkdocs\")\n",
     "submodules"
    ]
   },
@@ -3929,6 +4200,19 @@
     "\n",
     "\n",
     "def _copy_not_found_file_and_get_path(root_path: str, file_prefix: str) -> str:\n",
+    "    \"\"\"Copy the CLI command found file to the docs directory and return the path to the file.\n",
+    "\n",
+    "    Args:\n",
+    "        root_path: The root path of the project\n",
+    "        file_prefix: The prefix of the file to be copied\n",
+    "\n",
+    "    Returns:\n",
+    "        The path to the copied file\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    src_path = get_root_data_path() / f\"{file_prefix}_not_found.md\"\n",
     "    if not src_path.exists():\n",
     "        typer.secho(\n",
@@ -3983,10 +4267,10 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmphyf9k6e2/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmphyf9k6e2/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmphyf9k6e2/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmphyf9k6e2/mkdocs/summary_template.txt' generated.\u001b[0m\n",
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp_8jjvwoy/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp_8jjvwoy/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp_8jjvwoy/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp_8jjvwoy/mkdocs/summary_template.txt' generated.\u001b[0m\n",
       "    - [Not found](cli_commands_not_found.md)\n"
      ]
     },
@@ -4022,9 +4306,23 @@
     "# | export\n",
     "\n",
     "\n",
-    "def generate_api_doc_for_submodule(\n",
+    "def _generate_api_doc_for_submodule(\n",
     "    root_path: str, docs_dir_name: str, submodule: str\n",
     ") -> str:\n",
+    "    \"\"\"Generate API documentation for a submodule.\n",
+    "\n",
+    "    Args:\n",
+    "        root_path: The root path of the project\n",
+    "        docs_dir_name: The name of the docs directory\n",
+    "        submodule: The submodule for which to generate the API documentation\n",
+    "\n",
+    "    Returns:\n",
+    "        The path to the generated API documentation\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    subpath = f\"{docs_dir_name}/\" + submodule.replace(\".\", \"/\") + \".md\"\n",
     "    path = Path(root_path) / \"mkdocs\" / \"docs\" / subpath\n",
     "    path.parent.mkdir(exist_ok=True, parents=True)\n",
@@ -4037,8 +4335,21 @@
     "        return f\"- [{submodule}]({subpath})\"\n",
     "\n",
     "\n",
-    "def generate_api_docs_for_module(root_path: str, module_name: str) -> str:\n",
-    "    submodules = get_submodules(module_name)\n",
+    "def _generate_api_docs_for_module(root_path: str, module_name: str) -> str:\n",
+    "    \"\"\"Generate API documentation for a module.\n",
+    "\n",
+    "    Args:\n",
+    "        root_path: The root path of the project.\n",
+    "        module_name: The name of the module.\n",
+    "\n",
+    "    Returns:\n",
+    "        A string containing the API documentation for the module.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
+    "    submodules = _get_submodules(module_name)\n",
     "    docs_dir_name = f\"{module_name}_api_docs\"\n",
     "    shutil.rmtree(\n",
     "        Path(root_path) / \"mkdocs\" / \"docs\" / f\"{docs_dir_name}\", ignore_errors=True\n",
@@ -4049,7 +4360,7 @@
     "\n",
     "    submodule_summary = \"\\n\".join(\n",
     "        [\n",
-    "            generate_api_doc_for_submodule(\n",
+    "            _generate_api_doc_for_submodule(\n",
     "                root_path=root_path, docs_dir_name=docs_dir_name, submodule=x\n",
     "            )\n",
     "            for x in submodules\n",
@@ -4092,32 +4403,32 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "../nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb\n",
-      "../nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb\n",
-      "../nbs/guides/images/say_hello.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/say_hello.png\n",
-      "../nbs/guides/images/git_repo_clone_page.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/git_repo_clone_page.png\n",
-      "../nbs/guides/images/sidebar_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/sidebar_1.png\n",
-      "../nbs/guides/images/CLI_command.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/CLI_command.png\n",
-      "../nbs/guides/images/sidebar_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/sidebar_2.png\n",
-      "../nbs/guides/images/foo_doc_string.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/foo_doc_string.png\n",
-      "../nbs/guides/images/guide_notebook.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/guide_notebook.png\n",
-      "../nbs/guides/images/jupyter_home.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/jupyter_home.png\n",
-      "../nbs/guides/images/hello_class.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/hello_class.png\n",
-      "../nbs/guides/images/guide_3.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/guide_3.png\n",
-      "../nbs/guides/images/releases_default.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/releases_default.png\n",
-      "../nbs/guides/images/guide_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/guide_2.png\n",
-      "../nbs/guides/images/cli_not_found.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/cli_not_found.png\n",
-      "../nbs/guides/images/guide_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/guide_1.png\n",
-      "../nbs/guides/images/releases.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/releases.png\n",
-      "../nbs/guides/images/nbdev_mkdocs_preview_dark_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
-      "../nbs/guides/images/guide_4.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/guide_4.png\n",
-      "../nbs/guides/images/empty_git_repo.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/empty_git_repo.png\n",
-      "../nbs/guides/images/nbdev_mkdocs_preview_light_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
-      "../nbs/guides/images/enable_gh_pages.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/nbs/guides/images/enable_gh_pages.png\n",
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpp8sgico5/mkdocs/summary_template.txt' generated.\u001b[0m\n",
+      "../nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb\n",
+      "../nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb\n",
+      "../nbs/guides/images/say_hello.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/say_hello.png\n",
+      "../nbs/guides/images/git_repo_clone_page.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/git_repo_clone_page.png\n",
+      "../nbs/guides/images/sidebar_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/sidebar_1.png\n",
+      "../nbs/guides/images/CLI_command.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/CLI_command.png\n",
+      "../nbs/guides/images/sidebar_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/sidebar_2.png\n",
+      "../nbs/guides/images/foo_doc_string.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/foo_doc_string.png\n",
+      "../nbs/guides/images/guide_notebook.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/guide_notebook.png\n",
+      "../nbs/guides/images/jupyter_home.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/jupyter_home.png\n",
+      "../nbs/guides/images/hello_class.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/hello_class.png\n",
+      "../nbs/guides/images/guide_3.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/guide_3.png\n",
+      "../nbs/guides/images/releases_default.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/releases_default.png\n",
+      "../nbs/guides/images/guide_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/guide_2.png\n",
+      "../nbs/guides/images/cli_not_found.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/cli_not_found.png\n",
+      "../nbs/guides/images/guide_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/guide_1.png\n",
+      "../nbs/guides/images/releases.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/releases.png\n",
+      "../nbs/guides/images/nbdev_mkdocs_preview_dark_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
+      "../nbs/guides/images/guide_4.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/guide_4.png\n",
+      "../nbs/guides/images/empty_git_repo.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/empty_git_repo.png\n",
+      "../nbs/guides/images/nbdev_mkdocs_preview_light_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
+      "../nbs/guides/images/enable_gh_pages.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/nbs/guides/images/enable_gh_pages.png\n",
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp8fqurdqm/mkdocs/summary_template.txt' generated.\u001b[0m\n",
       "    - [repo](repo_api_docs/repo.md)\n"
      ]
     },
@@ -4133,6 +4444,21 @@
    "source": [
     "@contextmanager\n",
     "def add_tmp_path_to_sys_path(dir_):\n",
+    "    \"\"\"Add a temporary path to sys.path\n",
+    "\n",
+    "    Args:\n",
+    "        dir_ : the path to add to sys.path\n",
+    "\n",
+    "    Returns:\n",
+    "        None\n",
+    "\n",
+    "    Raises:\n",
+    "        ValueError: If dir_ is None\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    dir_ = Path(dir_).absolute().resolve(strict=True)\n",
     "    original_path = sys.path[:]\n",
     "    sys.path.insert(0, str(dir_))\n",
@@ -4153,7 +4479,7 @@
     "    _module = \"repo\"\n",
     "    \n",
     "    with add_tmp_path_to_sys_path(d):\n",
-    "        api_summary = generate_api_docs_for_module(d, _module)\n",
+    "        api_summary = _generate_api_docs_for_module(d, _module)\n",
     "\n",
     "    print(api_summary)\n",
     "\n",
@@ -4176,14 +4502,18 @@
     "\n",
     "\n",
     "def _restrict_line_length(s: str, width: int = 80) -> str:\n",
-    "    \"\"\"Restrict the line length of the given string.\n",
+    "    \"\"\"Restrict the line length of a string.\n",
     "\n",
     "    Args:\n",
-    "        s: Docstring to fix the width\n",
-    "        width: The maximum allowed line length\n",
+    "        s: The string to be processed.\n",
+    "        width: The maximum line length.\n",
     "\n",
     "    Returns:\n",
     "        A new string in which each line is less than the specified width.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    _s = \"\"\n",
     "\n",
@@ -4263,7 +4593,21 @@
     "# | export\n",
     "\n",
     "\n",
-    "def generate_cli_doc_for_submodule(root_path: str, docs_dir_name: str, cmd: str) -> str:\n",
+    "def _generate_cli_doc_for_submodule(root_path: str, docs_dir_name: str, cmd: str) -> str:\n",
+    "    \"\"\"Generate CLI documentation for a submodule.\n",
+    "\n",
+    "    Args:\n",
+    "        root_path: The root path of the project.\n",
+    "        docs_dir_name: The name of the directory where the documentation will be stored.\n",
+    "        cmd: The command to generate documentation for.\n",
+    "\n",
+    "    Returns:\n",
+    "        The generated documentation.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    cli_app_name = cmd.split(\"=\")[0]\n",
     "    module_name = cmd.split(\"=\")[1].split(\":\")[0]\n",
     "    method_name = cmd.split(\"=\")[1].split(\":\")[1]\n",
@@ -4276,11 +4620,7 @@
     "        # nosemgrep: python.lang.security.audit.non-literal-import.non-literal-import\n",
     "        m = importlib.import_module(module_name)\n",
     "        if isinstance(getattr(m, method_name), typer.Typer):\n",
-    "            app = typer.Typer()\n",
-    "            app.command()(generate_cli_doc)\n",
-    "            runner = CliRunner()\n",
-    "            result = runner.invoke(app, [module_name, cli_app_name])\n",
-    "            cli_doc = str(result.stdout)\n",
+    "            cli_doc = generate_cli_doc(module_name, cli_app_name)\n",
     "        else:\n",
     "            cmd = f\"{cli_app_name} --help\"\n",
     "            cli_doc = (\n",
@@ -4305,7 +4645,20 @@
     "    return f\"- [{cli_app_name}]({subpath})\"\n",
     "\n",
     "\n",
-    "def generate_cli_docs_for_module(root_path: str, module_name: str) -> str:\n",
+    "def _generate_cli_docs_for_module(root_path: str, module_name: str) -> str:\n",
+    "    \"\"\"Generate CLI docs for a module.\n",
+    "\n",
+    "    Args:\n",
+    "        root_path: The root path of the module\n",
+    "        module_name: The name of the module\n",
+    "\n",
+    "    Returns:\n",
+    "        The generated CLI docs\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    docs_dir_name = f\"{module_name}_cli_docs\"\n",
     "    shutil.rmtree(\n",
     "        Path(root_path) / \"mkdocs\" / \"docs\" / f\"{docs_dir_name}\", ignore_errors=True\n",
@@ -4320,7 +4673,7 @@
     "\n",
     "    submodule_summary = \"\\n\".join(\n",
     "        [\n",
-    "            generate_cli_doc_for_submodule(\n",
+    "            _generate_cli_doc_for_submodule(\n",
     "                root_path=root_path, docs_dir_name=docs_dir_name, cmd=cmd\n",
     "            )\n",
     "            for cmd in console_scripts.split(\"\\n\")\n",
@@ -4364,10 +4717,10 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Requirements already added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp5plt4bjl/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp5plt4bjl/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp5plt4bjl/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp5plt4bjl/mkdocs/summary_template.txt' generated.\u001b[0m\n",
+      "Requirements already added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpr7ke_a9l/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpr7ke_a9l/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpr7ke_a9l/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpr7ke_a9l/mkdocs/summary_template.txt' generated.\u001b[0m\n",
       "    - [nbdev_mkdocs](nbdev_mkdocs_cli_docs/nbdev_mkdocs.md)\n",
       "    - [invalid_cmd](nbdev_mkdocs_cli_docs/invalid_cmd.md)\n",
       "Unable to generate documentation for command. Execution of `invalid_cmd --help` command failed.\n"
@@ -4401,7 +4754,7 @@
     "    new(d)\n",
     "\n",
     "    _module = \"nbdev_mkdocs\"\n",
-    "    cli_summary = generate_cli_docs_for_module(d, _module)\n",
+    "    cli_summary = _generate_cli_docs_for_module(d, _module)\n",
     "    print(cli_summary)\n",
     "    expected = \"\"\"    - [nbdev_mkdocs](nbdev_mkdocs_cli_docs/nbdev_mkdocs.md)\n",
     "    - [invalid_cmd](nbdev_mkdocs_cli_docs/invalid_cmd.md)\"\"\"\n",
@@ -4455,12 +4808,12 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp3xpsea2v/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp3xpsea2v/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp3xpsea2v/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp3xpsea2v/mkdocs/summary_template.txt' generated.\u001b[0m\n",
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpwit9y69j/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpwit9y69j/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpwit9y69j/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpwit9y69j/mkdocs/summary_template.txt' generated.\u001b[0m\n",
       "    - [Not found](cli_commands_not_found.md)\n",
-      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp3xpsea2v/mkdocs/docs/cli_commands_not_found.md\n"
+      "/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpwit9y69j/mkdocs/docs/cli_commands_not_found.md\n"
      ]
     },
     {
@@ -4479,7 +4832,7 @@
     "    new(d)\n",
     "\n",
     "    _module = \"invalid_module\"\n",
-    "    cli_summary = generate_cli_docs_for_module(d, _module)\n",
+    "    cli_summary = _generate_cli_docs_for_module(d, _module)\n",
     "    print(cli_summary)\n",
     "\n",
     "    _dst_path = Path(d) / \"mkdocs\" / \"docs\"\n",
@@ -4525,10 +4878,10 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Requirements already added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpn98kjjbc/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpn98kjjbc/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpn98kjjbc/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpn98kjjbc/mkdocs/summary_template.txt' generated.\u001b[0m\n"
+      "Requirements already added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpwrd6ezj2/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpwrd6ezj2/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpwrd6ezj2/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpwrd6ezj2/mkdocs/summary_template.txt' generated.\u001b[0m\n"
      ]
     },
     {
@@ -4561,7 +4914,7 @@
     "    new(d)\n",
     "\n",
     "    _module = \"nbdev_mkdocs\"\n",
-    "    cli_summary = generate_cli_docs_for_module(d, _module)\n",
+    "    cli_summary = _generate_cli_docs_for_module(d, _module)\n",
     "    print(cli_summary)\n",
     "\n",
     "    # make sure all paths and content exist\n",
@@ -4583,6 +4936,19 @@
     "\n",
     "\n",
     "def _copy_change_log_if_exists(root_path: str, docs_path: Union[Path, str]) -> str:\n",
+    "    \"\"\"Copy the CHANGELOG.md file to the docs folder if it's not already present.\n",
+    "\n",
+    "    Args:\n",
+    "        root_path: The root path of the project.\n",
+    "        docs_path: The path to the docs folder.\n",
+    "\n",
+    "    Returns:\n",
+    "        The path to the copied CHANGELOG.md file.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    source_change_log_path = Path(root_path) / \"CHANGELOG.md\"\n",
     "    dst_change_log_path = Path(docs_path) / \"CHANGELOG.md\"\n",
     "\n",
@@ -4630,10 +4996,10 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Requirements already added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpi7mxowzj/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpi7mxowzj/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpi7mxowzj/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpi7mxowzj/mkdocs/summary_template.txt' generated.\u001b[0m\n",
+      "Requirements already added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp_i1qxrpm/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp_i1qxrpm/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp_i1qxrpm/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp_i1qxrpm/mkdocs/summary_template.txt' generated.\u001b[0m\n",
       "change_log=(changelog_not_found.md)\n",
       "change_log=(CHANGELOG.md)\n"
      ]
@@ -4691,11 +5057,21 @@
     "# | export\n",
     "\n",
     "\n",
-    "def build_summary(\n",
+    "def _build_summary(\n",
     "    root_path: str,\n",
     "    module: str,\n",
     "):\n",
     "    # create docs_path if needed\n",
+    "    \"\"\"Create a summary navigation file for generating navigation that is compatible with mkdocs.\n",
+    "\n",
+    "    Args:\n",
+    "        root_path: The root path of the project.\n",
+    "        module: The module to generate the API documentation for.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    docs_path = Path(root_path) / \"mkdocs\" / \"docs\"\n",
     "    docs_path.mkdir(exist_ok=True)\n",
     "\n",
@@ -4712,10 +5088,10 @@
     "    sidebar = _generate_summary_for_sidebar(root_path)\n",
     "\n",
     "    # generate API\n",
-    "    api = generate_api_docs_for_module(root_path, module)\n",
+    "    api = _generate_api_docs_for_module(root_path, module)\n",
     "\n",
     "    # generate CLI\n",
-    "    cli = generate_cli_docs_for_module(root_path, module)\n",
+    "    cli = _generate_cli_docs_for_module(root_path, module)\n",
     "\n",
     "    # copy CHANGELOG.md as CHANGELOG.md is exists\n",
     "    changelog = _copy_change_log_if_exists(root_path, docs_path)\n",
@@ -4768,32 +5144,32 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "../nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb\n",
-      "../nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb\n",
-      "../nbs/guides/images/say_hello.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/say_hello.png\n",
-      "../nbs/guides/images/git_repo_clone_page.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/git_repo_clone_page.png\n",
-      "../nbs/guides/images/sidebar_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/sidebar_1.png\n",
-      "../nbs/guides/images/CLI_command.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/CLI_command.png\n",
-      "../nbs/guides/images/sidebar_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/sidebar_2.png\n",
-      "../nbs/guides/images/foo_doc_string.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/foo_doc_string.png\n",
-      "../nbs/guides/images/guide_notebook.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/guide_notebook.png\n",
-      "../nbs/guides/images/jupyter_home.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/jupyter_home.png\n",
-      "../nbs/guides/images/hello_class.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/hello_class.png\n",
-      "../nbs/guides/images/guide_3.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/guide_3.png\n",
-      "../nbs/guides/images/releases_default.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/releases_default.png\n",
-      "../nbs/guides/images/guide_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/guide_2.png\n",
-      "../nbs/guides/images/cli_not_found.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/cli_not_found.png\n",
-      "../nbs/guides/images/guide_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/guide_1.png\n",
-      "../nbs/guides/images/releases.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/releases.png\n",
-      "../nbs/guides/images/nbdev_mkdocs_preview_dark_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
-      "../nbs/guides/images/guide_4.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/guide_4.png\n",
-      "../nbs/guides/images/empty_git_repo.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/empty_git_repo.png\n",
-      "../nbs/guides/images/nbdev_mkdocs_preview_light_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
-      "../nbs/guides/images/enable_gh_pages.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/nbs/guides/images/enable_gh_pages.png\n",
-      "Requirements already added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpj33tr3w1/mkdocs/summary_template.txt' generated.\u001b[0m\n"
+      "../nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb\n",
+      "../nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb\n",
+      "../nbs/guides/images/say_hello.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/say_hello.png\n",
+      "../nbs/guides/images/git_repo_clone_page.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/git_repo_clone_page.png\n",
+      "../nbs/guides/images/sidebar_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/sidebar_1.png\n",
+      "../nbs/guides/images/CLI_command.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/CLI_command.png\n",
+      "../nbs/guides/images/sidebar_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/sidebar_2.png\n",
+      "../nbs/guides/images/foo_doc_string.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/foo_doc_string.png\n",
+      "../nbs/guides/images/guide_notebook.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/guide_notebook.png\n",
+      "../nbs/guides/images/jupyter_home.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/jupyter_home.png\n",
+      "../nbs/guides/images/hello_class.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/hello_class.png\n",
+      "../nbs/guides/images/guide_3.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/guide_3.png\n",
+      "../nbs/guides/images/releases_default.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/releases_default.png\n",
+      "../nbs/guides/images/guide_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/guide_2.png\n",
+      "../nbs/guides/images/cli_not_found.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/cli_not_found.png\n",
+      "../nbs/guides/images/guide_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/guide_1.png\n",
+      "../nbs/guides/images/releases.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/releases.png\n",
+      "../nbs/guides/images/nbdev_mkdocs_preview_dark_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
+      "../nbs/guides/images/guide_4.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/guide_4.png\n",
+      "../nbs/guides/images/empty_git_repo.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/empty_git_repo.png\n",
+      "../nbs/guides/images/nbdev_mkdocs_preview_light_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
+      "../nbs/guides/images/enable_gh_pages.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/nbs/guides/images/enable_gh_pages.png\n",
+      "Requirements already added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmprs95raq2/mkdocs/summary_template.txt' generated.\u001b[0m\n"
      ]
     },
     {
@@ -4921,7 +5297,7 @@
     "    with _summary_template_path.open(\"w\", encoding=\"utf-8\") as f:\n",
     "        f.write(_test_summary_template)\n",
     "\n",
-    "    build_summary(d, \"repo\")\n",
+    "    _build_summary(d, \"repo\")\n",
     "\n",
     "    with open(Path(d) / \"mkdocs/docs/SUMMARY.md\") as f:\n",
     "        summary = f.read()\n",
@@ -4951,7 +5327,16 @@
     "# | export\n",
     "\n",
     "\n",
-    "def copy_cname_if_needed(root_path: str):\n",
+    "def _copy_cname_if_needed(root_path: str):\n",
+    "    \"\"\"Copy the CNAME file to mkdocs/docs/CNAME if it's not already present.\n",
+    "\n",
+    "    Args:\n",
+    "        root_path: The root path of the project\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    cname_path = Path(root_path) / \"CNAME\"\n",
     "    dst_path = Path(root_path) / \"mkdocs\" / \"docs\" / \"CNAME\"\n",
     "    if cname_path.exists():\n",
@@ -4976,8 +5361,8 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpxzfdv_0l/CNAME' copied to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpxzfdv_0l/mkdocs/docs/CNAME'.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp4o7v4rjz/CNAME' not found, skipping copying..\u001b[0m\n"
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvhjbv4op/CNAME' copied to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvhjbv4op/mkdocs/docs/CNAME'.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvcbujnjj/CNAME' not found, skipping copying..\u001b[0m\n"
      ]
     }
    ],
@@ -4988,7 +5373,7 @@
     "        for fname in [\"settings.ini\", \"README.md\"] + [\"CNAME\"] if has_cname else []:\n",
     "            shutil.copyfile(Path(\"..\") / fname, Path(d) / fname)\n",
     "\n",
-    "        copy_cname_if_needed(d)\n",
+    "        _copy_cname_if_needed(d)\n",
     "        if has_cname:\n",
     "            assert (Path(d) / \"mkdocs\" / \"docs\" / \"CNAME\").exists()\n",
     "        else:\n",
@@ -5006,10 +5391,14 @@
     "\n",
     "\n",
     "def _copy_docs_overrides(root_path: str):\n",
-    "    \"\"\"Copy lib assets inside mkodcs/docs directory\n",
+    "    \"\"\"Copy the docs_overrides directory to the mkdocs/docs/overrides directory.\n",
     "\n",
     "    Args:\n",
-    "        root_path: Project's root path.\n",
+    "        root_path: The root path of the project.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    src_path = Path(root_path) / \"mkdocs\" / \"docs_overrides\"\n",
     "    dst_path = Path(root_path) / \"mkdocs\" / \"docs\" / \"overrides\"\n",
@@ -5059,10 +5448,10 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzh4ovp2_/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzh4ovp2_/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzh4ovp2_/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpzh4ovp2_/mkdocs/summary_template.txt' generated.\u001b[0m\n"
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpz62lwnoa/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpz62lwnoa/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpz62lwnoa/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpz62lwnoa/mkdocs/summary_template.txt' generated.\u001b[0m\n"
      ]
     },
     {
@@ -5111,27 +5500,30 @@
     "\n",
     "\n",
     "def nbdev_mkdocs_docs(root_path: str, refresh_quarto_settings: bool = False):\n",
-    "    \"\"\"Prepares mkdocs documentation\n",
-    "\n",
+    "    \"\"\"Prepare mkdocs documentation\n",
+    "    \n",
     "    Args:\n",
-    "        root_path: Project's root path.\n",
+    "        root_path: The root path of the project\n",
     "        refresh_quarto_settings: Flag to refresh quarto yml file. This flag should be set to `True`\n",
     "            if this function is called directly without calling prepare.\n",
-    "    \"\"\"\n",
     "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    with set_cwd(root_path):\n",
     "\n",
     "        if refresh_quarto_settings:\n",
     "            refresh_quarto_yml()\n",
     "\n",
-    "        copy_cname_if_needed(root_path)\n",
+    "        _copy_cname_if_needed(root_path)\n",
     "\n",
     "        _copy_docs_overrides(root_path)\n",
     "\n",
     "        lib_name = get_value_from_config(root_path, \"lib_name\")\n",
     "        lib_path = get_value_from_config(root_path, \"lib_path\")\n",
     "\n",
-    "        build_summary(root_path, lib_path)\n",
+    "        _build_summary(root_path, lib_path)\n",
     "\n",
     "        cmd = f\"mkdocs build -f \\\"{(Path(root_path) / 'mkdocs' / 'mkdocs.yml').resolve()}\\\"\"\n",
     "        _sprun(cmd)\n",
@@ -5139,15 +5531,28 @@
     "\n",
     "@call_parse\n",
     "def nbdev_mkdocs_docs_cli(root_path: str = \".\"):\n",
-    "    \"\"\"Prepares mkdocs documentation\"\"\"\n",
+    "    \"\"\"Prepare mkdocs documentation\n",
+    "    \n",
+    "    Args:\n",
+    "        root_path: The root path of the project\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    nbdev_mkdocs_docs(root_path, refresh_quarto_settings=True)\n",
     "\n",
     "\n",
     "def prepare(root_path: str, no_test: bool = False):\n",
-    "    \"\"\"Prepares mkdocs for serving\n",
-    "\n",
+    "    \"\"\"Prepare mkdocs for serving\n",
+    "    \n",
     "    Args:\n",
-    "        root_path: path under which mkdocs directory will be created\n",
+    "        root_path: The root path of the project\n",
+    "        no_test: If set to False, the unit tests will be run, else they will be skipped\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    with set_cwd(root_path):\n",
     "\n",
@@ -5164,7 +5569,15 @@
     "\n",
     "@call_parse\n",
     "def prepare_cli(root_path: str = \".\"):\n",
-    "    \"\"\"Prepares mkdocs for serving\"\"\"\n",
+    "    \"\"\"Prepare mkdocs for serving\n",
+    "    \n",
+    "    Args:\n",
+    "        root_path: The root path of the project\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    prepare(root_path)"
    ]
   },
@@ -5201,32 +5614,32 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "../nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb\n",
-      "../nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb\n",
-      "../nbs/guides/images/say_hello.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/say_hello.png\n",
-      "../nbs/guides/images/git_repo_clone_page.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/git_repo_clone_page.png\n",
-      "../nbs/guides/images/sidebar_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/sidebar_1.png\n",
-      "../nbs/guides/images/CLI_command.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/CLI_command.png\n",
-      "../nbs/guides/images/sidebar_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/sidebar_2.png\n",
-      "../nbs/guides/images/foo_doc_string.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/foo_doc_string.png\n",
-      "../nbs/guides/images/guide_notebook.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/guide_notebook.png\n",
-      "../nbs/guides/images/jupyter_home.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/jupyter_home.png\n",
-      "../nbs/guides/images/hello_class.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/hello_class.png\n",
-      "../nbs/guides/images/guide_3.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/guide_3.png\n",
-      "../nbs/guides/images/releases_default.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/releases_default.png\n",
-      "../nbs/guides/images/guide_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/guide_2.png\n",
-      "../nbs/guides/images/cli_not_found.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/cli_not_found.png\n",
-      "../nbs/guides/images/guide_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/guide_1.png\n",
-      "../nbs/guides/images/releases.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/releases.png\n",
-      "../nbs/guides/images/nbdev_mkdocs_preview_dark_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
-      "../nbs/guides/images/guide_4.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/guide_4.png\n",
-      "../nbs/guides/images/empty_git_repo.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/empty_git_repo.png\n",
-      "../nbs/guides/images/nbdev_mkdocs_preview_light_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
-      "../nbs/guides/images/enable_gh_pages.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/nbs/guides/images/enable_gh_pages.png\n",
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/mkdocs/summary_template.txt' generated.\u001b[0m\n"
+      "../nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb\n",
+      "../nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb\n",
+      "../nbs/guides/images/say_hello.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/say_hello.png\n",
+      "../nbs/guides/images/git_repo_clone_page.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/git_repo_clone_page.png\n",
+      "../nbs/guides/images/sidebar_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/sidebar_1.png\n",
+      "../nbs/guides/images/CLI_command.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/CLI_command.png\n",
+      "../nbs/guides/images/sidebar_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/sidebar_2.png\n",
+      "../nbs/guides/images/foo_doc_string.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/foo_doc_string.png\n",
+      "../nbs/guides/images/guide_notebook.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/guide_notebook.png\n",
+      "../nbs/guides/images/jupyter_home.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/jupyter_home.png\n",
+      "../nbs/guides/images/hello_class.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/hello_class.png\n",
+      "../nbs/guides/images/guide_3.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/guide_3.png\n",
+      "../nbs/guides/images/releases_default.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/releases_default.png\n",
+      "../nbs/guides/images/guide_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/guide_2.png\n",
+      "../nbs/guides/images/cli_not_found.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/cli_not_found.png\n",
+      "../nbs/guides/images/guide_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/guide_1.png\n",
+      "../nbs/guides/images/releases.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/releases.png\n",
+      "../nbs/guides/images/nbdev_mkdocs_preview_dark_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
+      "../nbs/guides/images/guide_4.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/guide_4.png\n",
+      "../nbs/guides/images/empty_git_repo.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/empty_git_repo.png\n",
+      "../nbs/guides/images/nbdev_mkdocs_preview_light_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
+      "../nbs/guides/images/enable_gh_pages.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/nbs/guides/images/enable_gh_pages.png\n",
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/mkdocs/summary_template.txt' generated.\u001b[0m\n"
      ]
     },
     {
@@ -5241,14 +5654,14 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/CNAME' copied to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/mkdocs/docs/CNAME'.\u001b[0m\n"
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/CNAME' copied to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/mkdocs/docs/CNAME'.\u001b[0m\n"
      ]
     },
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "/Users/harishm/miniforge3/envs/nbdev-mkdocs/lib/python3.9/site-packages/nbdev/processors.py:186: UserWarning: Found cells containing imports and other code. See FAQ.\n",
+      "/Users/harishm/.pyenv/versions/3.10.4/lib/python3.10/site-packages/nbdev/processors.py:186: UserWarning: Found cells containing imports and other code. See FAQ.\n",
       "---\n",
       "from nbdev_mkdocs._package_data import get_root_data_path\n",
       "\n",
@@ -5300,14 +5713,14 @@
       "Output created: _docs/index.html\n",
       "\n",
       "INFO     -  UserWarning: The 'python-legacy' extra of mkdocstrings will become mandatory in the next release. We have no way to detect if you already specify it, so if you do, please ignore this warning. You can globally disable it with the PYTHONWARNINGS environment variable: PYTHONWARNINGS=ignore::UserWarning:mkdocstrings.handlers.python\n",
-      "  File \"/Users/harishm/miniforge3/envs/nbdev-mkdocs/lib/python3.9/importlib/__init__.py\", line 127, in import_module\n",
+      "  File \"/Users/harishm/.pyenv/versions/3.10.4/lib/python3.10/importlib/__init__.py\", line 126, in import_module\n",
       "    return _bootstrap._gcd_import(name[level:], package, level)\n",
-      "  File \"/Users/harishm/miniforge3/envs/nbdev-mkdocs/lib/python3.9/site-packages/mkdocstrings/handlers/python/__init__.py\", line 13, in <module>\n",
+      "  File \"/Users/harishm/.pyenv/versions/3.10.4/lib/python3.10/site-packages/mkdocstrings/handlers/python/__init__.py\", line 13, in <module>\n",
       "    warnings.warn(\n",
       "\n",
       "INFO     -  Cleaning site directory\n",
-      "INFO     -  Building documentation to directory: /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpel0g0lmy/mkdocs/site\n",
-      "INFO     -  Documentation built in 0.62 seconds\n"
+      "INFO     -  Building documentation to directory: /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpv0wg3vfo/mkdocs/site\n",
+      "INFO     -  Documentation built in 0.53 seconds\n"
      ]
     }
    ],
@@ -5355,11 +5768,15 @@
     "\n",
     "\n",
     "def preview(root_path: str, port: Optional[int] = None):\n",
-    "    \"\"\"Previes mkdocs documentation\n",
+    "    \"\"\"Preview the mkdocs documentation.\n",
     "\n",
     "    Args:\n",
-    "        root_path: path under which mkdocs directory will be created\n",
-    "        port: port to use\n",
+    "        root_path: The root path of the documentation.\n",
+    "        port: The port to serve the documentation on.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    with set_cwd(root_path):\n",
     "        prepare(root_path=root_path, no_test=True)\n",
@@ -5389,7 +5806,16 @@
     "\n",
     "@call_parse\n",
     "def preview_cli(root_path: str = \".\", port: Optional[int] = None):\n",
-    "    \"\"\"Previes mkdocs documentation\"\"\"\n",
+    "    \"\"\"Preview the mkdocs documentation.\n",
+    "\n",
+    "    Args:\n",
+    "        root_path: The root path of the documentation.\n",
+    "        port: The port to serve the documentation on.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    preview(root_path, port)"
    ]
   },
@@ -5426,33 +5852,33 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "../nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb\n",
-      "../nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb\n",
-      "../nbs/guides/images/say_hello.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/say_hello.png\n",
-      "../nbs/guides/images/git_repo_clone_page.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/git_repo_clone_page.png\n",
-      "../nbs/guides/images/sidebar_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/sidebar_1.png\n",
-      "../nbs/guides/images/CLI_command.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/CLI_command.png\n",
-      "../nbs/guides/images/sidebar_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/sidebar_2.png\n",
-      "../nbs/guides/images/foo_doc_string.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/foo_doc_string.png\n",
-      "../nbs/guides/images/guide_notebook.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/guide_notebook.png\n",
-      "../nbs/guides/images/jupyter_home.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/jupyter_home.png\n",
-      "../nbs/guides/images/hello_class.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/hello_class.png\n",
-      "../nbs/guides/images/guide_3.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/guide_3.png\n",
-      "../nbs/guides/images/releases_default.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/releases_default.png\n",
-      "../nbs/guides/images/guide_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/guide_2.png\n",
-      "../nbs/guides/images/cli_not_found.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/cli_not_found.png\n",
-      "../nbs/guides/images/guide_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/guide_1.png\n",
-      "../nbs/guides/images/releases.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/releases.png\n",
-      "../nbs/guides/images/nbdev_mkdocs_preview_dark_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
-      "../nbs/guides/images/guide_4.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/guide_4.png\n",
-      "../nbs/guides/images/empty_git_repo.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/empty_git_repo.png\n",
-      "../nbs/guides/images/nbdev_mkdocs_preview_light_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
-      "../nbs/guides/images/enable_gh_pages.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/nbs/guides/images/enable_gh_pages.png\n",
-      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/settings.ini'.\u001b[0m\n",
-      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/mkdocs created.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/mkdocs/summary_template.txt' generated.\u001b[0m\n",
-      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/CNAME' not found, skipping copying..\u001b[0m\n"
+      "../nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb\n",
+      "../nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/.ipynb_checkpoints/Guide_01_End_To_End_Walkthrough-checkpoint.ipynb\n",
+      "../nbs/guides/images/say_hello.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/say_hello.png\n",
+      "../nbs/guides/images/git_repo_clone_page.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/git_repo_clone_page.png\n",
+      "../nbs/guides/images/sidebar_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/sidebar_1.png\n",
+      "../nbs/guides/images/CLI_command.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/CLI_command.png\n",
+      "../nbs/guides/images/sidebar_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/sidebar_2.png\n",
+      "../nbs/guides/images/foo_doc_string.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/foo_doc_string.png\n",
+      "../nbs/guides/images/guide_notebook.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/guide_notebook.png\n",
+      "../nbs/guides/images/jupyter_home.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/jupyter_home.png\n",
+      "../nbs/guides/images/hello_class.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/hello_class.png\n",
+      "../nbs/guides/images/guide_3.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/guide_3.png\n",
+      "../nbs/guides/images/releases_default.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/releases_default.png\n",
+      "../nbs/guides/images/guide_2.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/guide_2.png\n",
+      "../nbs/guides/images/cli_not_found.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/cli_not_found.png\n",
+      "../nbs/guides/images/guide_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/guide_1.png\n",
+      "../nbs/guides/images/releases.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/releases.png\n",
+      "../nbs/guides/images/nbdev_mkdocs_preview_dark_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/nbdev_mkdocs_preview_dark_1.png\n",
+      "../nbs/guides/images/guide_4.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/guide_4.png\n",
+      "../nbs/guides/images/empty_git_repo.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/empty_git_repo.png\n",
+      "../nbs/guides/images/nbdev_mkdocs_preview_light_1.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/nbdev_mkdocs_preview_light_1.png\n",
+      "../nbs/guides/images/enable_gh_pages.png, /var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/nbs/guides/images/enable_gh_pages.png\n",
+      "Requirements added to '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/settings.ini'.\u001b[0m\n",
+      "Directory /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/mkdocs created.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/mkdocs/mkdocs.yml' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/mkdocs/summary_template.txt' generated.\u001b[0m\n",
+      "File '/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/CNAME' not found, skipping copying..\u001b[0m\n"
      ]
     },
     {
@@ -5504,27 +5930,27 @@
       "Output created: _docs/index.html\n",
       "\n",
       "INFO     -  UserWarning: The 'python-legacy' extra of mkdocstrings will become mandatory in the next release. We have no way to detect if you already specify it, so if you do, please ignore this warning. You can globally disable it with the PYTHONWARNINGS environment variable: PYTHONWARNINGS=ignore::UserWarning:mkdocstrings.handlers.python\n",
-      "  File \"/Users/harishm/miniforge3/envs/nbdev-mkdocs/lib/python3.9/importlib/__init__.py\", line 127, in import_module\n",
+      "  File \"/Users/harishm/.pyenv/versions/3.10.4/lib/python3.10/importlib/__init__.py\", line 126, in import_module\n",
       "    return _bootstrap._gcd_import(name[level:], package, level)\n",
-      "  File \"/Users/harishm/miniforge3/envs/nbdev-mkdocs/lib/python3.9/site-packages/mkdocstrings/handlers/python/__init__.py\", line 13, in <module>\n",
+      "  File \"/Users/harishm/.pyenv/versions/3.10.4/lib/python3.10/site-packages/mkdocstrings/handlers/python/__init__.py\", line 13, in <module>\n",
       "    warnings.warn(\n",
       "\n",
       "INFO     -  Cleaning site directory\n",
-      "INFO     -  Building documentation to directory: /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/mkdocs/site\n",
-      "INFO     -  Documentation built in 0.72 seconds\n",
+      "INFO     -  Building documentation to directory: /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/mkdocs/site\n",
+      "INFO     -  Documentation built in 0.46 seconds\n",
       "\u001b[33mWARNING  -  \u001b[0mConfig value 'dev_addr': The use of the IP address '0.0.0.0' suggests a production environment or the use of a proxy to connect to the MkDocs server. However, the MkDocs' server is intended for local development purposes only. Please use a third party production-ready server instead.\n",
       "INFO     -  Building documentation...\n",
       "INFO     -  UserWarning: The 'python-legacy' extra of mkdocstrings will become mandatory in the next release. We have no way to detect if you already specify it, so if you do, please ignore this warning. You can globally disable it with the PYTHONWARNINGS environment variable: PYTHONWARNINGS=ignore::UserWarning:mkdocstrings.handlers.python\n",
-      "  File \"/Users/harishm/miniforge3/envs/nbdev-mkdocs/lib/python3.9/importlib/__init__.py\", line 127, in import_module\n",
+      "  File \"/Users/harishm/.pyenv/versions/3.10.4/lib/python3.10/importlib/__init__.py\", line 126, in import_module\n",
       "    return _bootstrap._gcd_import(name[level:], package, level)\n",
-      "  File \"/Users/harishm/miniforge3/envs/nbdev-mkdocs/lib/python3.9/site-packages/mkdocstrings/handlers/python/__init__.py\", line 13, in <module>\n",
+      "  File \"/Users/harishm/.pyenv/versions/3.10.4/lib/python3.10/site-packages/mkdocstrings/handlers/python/__init__.py\", line 13, in <module>\n",
       "    warnings.warn(\n",
       "\n",
       "INFO     -  Cleaning site directory\n",
-      "INFO     -  Documentation built in 0.49 seconds\n",
-      "INFO     -  [12:27:03] Watching paths for changes: '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/mkdocs/docs', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp7njws2q7/mkdocs/mkdocs.yml'\n",
-      "INFO     -  [12:27:03] Serving on http://0.0.0.0:4000/repo/\n",
-      "INFO     -  [12:28:08] Browser connected: http://0.0.0.0:4000/repo/\n",
+      "INFO     -  Documentation built in 0.45 seconds\n",
+      "INFO     -  [13:07:47] Watching paths for changes: '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/mkdocs/docs', '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpavb3c8a0/mkdocs/mkdocs.yml'\n",
+      "INFO     -  [13:07:47] Serving on http://0.0.0.0:4000/repo/\n",
+      "INFO     -  [13:08:30] Browser connected: http://0.0.0.0:4000/repo/\n",
       "INFO     -  Shutting down...\n"
      ]
     },
@@ -5535,8 +5961,8 @@
      "traceback": [
       "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
       "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
-      "Cell \u001b[0;32mIn [82], line 28\u001b[0m\n\u001b[1;32m     25\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m _summary_template_path\u001b[38;5;241m.\u001b[39mopen(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mw\u001b[39m\u001b[38;5;124m\"\u001b[39m, encoding\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mutf-8\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;28;01mas\u001b[39;00m f:\n\u001b[1;32m     26\u001b[0m     f\u001b[38;5;241m.\u001b[39mwrite(_test_summary_template)\n\u001b[0;32m---> 28\u001b[0m \u001b[43mpreview\u001b[49m\u001b[43m(\u001b[49m\u001b[43md\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mport\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m4000\u001b[39;49m\u001b[43m)\u001b[49m\n",
-      "Cell \u001b[0;32mIn [81], line 25\u001b[0m, in \u001b[0;36mpreview\u001b[0;34m(root_path, port)\u001b[0m\n\u001b[1;32m     16\u001b[0m     cmd \u001b[38;5;241m=\u001b[39m cmd \u001b[38;5;241m+\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m:\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mport\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m     18\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m subprocess\u001b[38;5;241m.\u001b[39mPopen(  \u001b[38;5;66;03m# nosec B603:subprocess_without_shell_equals_true\u001b[39;00m\n\u001b[1;32m     19\u001b[0m     shlex\u001b[38;5;241m.\u001b[39msplit(cmd),\n\u001b[1;32m     20\u001b[0m     stdout\u001b[38;5;241m=\u001b[39msubprocess\u001b[38;5;241m.\u001b[39mPIPE,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m     23\u001b[0m     universal_newlines\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m,\n\u001b[1;32m     24\u001b[0m ) \u001b[38;5;28;01mas\u001b[39;00m p:\n\u001b[0;32m---> 25\u001b[0m     \u001b[38;5;28;01mfor\u001b[39;00m line \u001b[38;5;129;01min\u001b[39;00m p\u001b[38;5;241m.\u001b[39mstdout:  \u001b[38;5;66;03m# type: ignore\u001b[39;00m\n\u001b[1;32m     26\u001b[0m         \u001b[38;5;28mprint\u001b[39m(line, end\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m     28\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m p\u001b[38;5;241m.\u001b[39mreturncode \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m0\u001b[39m:\n",
+      "Cell \u001b[0;32mIn[82], line 28\u001b[0m\n\u001b[1;32m     25\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m _summary_template_path\u001b[38;5;241m.\u001b[39mopen(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mw\u001b[39m\u001b[38;5;124m\"\u001b[39m, encoding\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mutf-8\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;28;01mas\u001b[39;00m f:\n\u001b[1;32m     26\u001b[0m     f\u001b[38;5;241m.\u001b[39mwrite(_test_summary_template)\n\u001b[0;32m---> 28\u001b[0m \u001b[43mpreview\u001b[49m\u001b[43m(\u001b[49m\u001b[43md\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mport\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m4000\u001b[39;49m\u001b[43m)\u001b[49m\n",
+      "Cell \u001b[0;32mIn[81], line 29\u001b[0m, in \u001b[0;36mpreview\u001b[0;34m(root_path, port)\u001b[0m\n\u001b[1;32m     20\u001b[0m     cmd \u001b[38;5;241m=\u001b[39m cmd \u001b[38;5;241m+\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m:\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mport\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m     22\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m subprocess\u001b[38;5;241m.\u001b[39mPopen(  \u001b[38;5;66;03m# nosec B603:subprocess_without_shell_equals_true\u001b[39;00m\n\u001b[1;32m     23\u001b[0m     shlex\u001b[38;5;241m.\u001b[39msplit(cmd),\n\u001b[1;32m     24\u001b[0m     stdout\u001b[38;5;241m=\u001b[39msubprocess\u001b[38;5;241m.\u001b[39mPIPE,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m     27\u001b[0m     universal_newlines\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m,\n\u001b[1;32m     28\u001b[0m ) \u001b[38;5;28;01mas\u001b[39;00m p:\n\u001b[0;32m---> 29\u001b[0m     \u001b[38;5;28;01mfor\u001b[39;00m line \u001b[38;5;129;01min\u001b[39;00m p\u001b[38;5;241m.\u001b[39mstdout:  \u001b[38;5;66;03m# type: ignore\u001b[39;00m\n\u001b[1;32m     30\u001b[0m         \u001b[38;5;28mprint\u001b[39m(line, end\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m     32\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m p\u001b[38;5;241m.\u001b[39mreturncode \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m0\u001b[39m:\n",
       "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
      ]
     }
diff --git a/nbs/PackageData.ipynb b/nbs/PackageData.ipynb
index 7cd7f033..257cdd58 100644
--- a/nbs/PackageData.ipynb
+++ b/nbs/PackageData.ipynb
@@ -47,6 +47,9 @@
     "\n",
     "        ```\n",
     "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    return Path(__file__).parent / \"package_data\"\n"
    ]
@@ -60,7 +63,7 @@
     {
      "data": {
       "text/plain": [
-       "'Returns path to package_data in lib\\n\\n    Example:\\n        ``` python\\n        from nbdev_mkdocs._package_data import get_root_data_path\\n\\n        req_path = get_root_data_path() / \"requirements.txt\"\\n        print(f\"Path is: {req_path.resolve()}\")\\n        assert req_path.exists()\\n        \\n        ```\\n        \\n    '"
+       "'Returns path to package_data in lib\\n\\n    Example:\\n        ``` python\\n        from nbdev_mkdocs._package_data import get_root_data_path\\n\\n        req_path = get_root_data_path() / \"requirements.txt\"\\n        print(f\"Path is: {req_path.resolve()}\")\\n        assert req_path.exists()\\n\\n        ```\\n\\n    !!! note\\n\\n        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\\n    '"
       ]
      },
      "execution_count": null,
@@ -103,7 +106,7 @@
        "\n",
        "<span style=\"color: #00ff00; text-decoration-color: #00ff00\">──────────────────────────────────── </span>stdout<span style=\"color: #00ff00; text-decoration-color: #00ff00\"> ────────────────────────────────────</span>\n",
        "Path is: \n",
-       "<span style=\"color: #800080; text-decoration-color: #800080\">/root/.local/lib/python3.8/site-packages/nbdev_mkdocs/package_data/</span><span style=\"color: #ff00ff; text-decoration-color: #ff00ff\">requirements.</span>\n",
+       "<span style=\"color: #800080; text-decoration-color: #800080\">/Users/harishm/Dev/airt-git/nbdev-mkdocs/nbdev_mkdocs/package_data/</span><span style=\"color: #ff00ff; text-decoration-color: #ff00ff\">requirements.</span>\n",
        "<span style=\"color: #ff00ff; text-decoration-color: #ff00ff\">txt</span>\n",
        "\n",
        "<span style=\"color: #00ff00; text-decoration-color: #00ff00\">──────────────────────────────────── </span>stderr<span style=\"color: #00ff00; text-decoration-color: #00ff00\"> ────────────────────────────────────</span>\n",
@@ -123,7 +126,7 @@
        "\n",
        "\u001b[92m──────────────────────────────────── \u001b[0mstdout\u001b[92m ────────────────────────────────────\u001b[0m\n",
        "Path is: \n",
-       "\u001b[35m/root/.local/lib/python3.8/site-packages/nbdev_mkdocs/package_data/\u001b[0m\u001b[95mrequirements.\u001b[0m\n",
+       "\u001b[35m/Users/harishm/Dev/airt-git/nbdev-mkdocs/nbdev_mkdocs/package_data/\u001b[0m\u001b[95mrequirements.\u001b[0m\n",
        "\u001b[95mtxt\u001b[0m\n",
        "\n",
        "\u001b[92m──────────────────────────────────── \u001b[0mstderr\u001b[92m ────────────────────────────────────\u001b[0m\n",
@@ -149,7 +152,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3",
+   "display_name": "Python 3 (ipykernel)",
    "language": "python",
    "name": "python3"
   }
diff --git a/nbs/Social_Image_Generator.ipynb b/nbs/Social_Image_Generator.ipynb
index 25aa58ea..c1b78084 100644
--- a/nbs/Social_Image_Generator.ipynb
+++ b/nbs/Social_Image_Generator.ipynb
@@ -63,13 +63,17 @@
     "\n",
     "\n",
     "def _generate_ai_image(prompt: str) -> str:\n",
-    "    \"\"\"Generate an image for social card using the OpenAI Image API.\n",
+    "    \"\"\"Generate an image from a prompt using OpenAI's API.\n",
     "\n",
     "    Args:\n",
-    "        prompt: The prompt to use for generating the image.\n",
+    "        prompt: The prompt to generate the image from.\n",
     "\n",
     "    Returns:\n",
     "        The URL of the generated image.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    response = openai.Image.create(prompt=prompt, n=1, size=\"512x512\")\n",
     "    image_url: str = response[\"data\"][0][\"url\"]\n",
@@ -113,13 +117,22 @@
     "\n",
     "\n",
     "def _generate_html_str(root_path: str, image_url: str) -> str:\n",
-    "    \"\"\"Generate html string for the social card\n",
+    "    \"\"\"Generate HTML string for the social card.\n",
     "\n",
     "    Args:\n",
-    "        root_path: The root path of the project.\n",
-    "        image_url: The image URL to be included in the HTML.\n",
-    "    \"\"\"\n",
+    "        root_path: The root path of the project\n",
+    "        image_url: The image URL to be included in the HTML string.\n",
     "\n",
+    "    Returns:\n",
+    "        The generated html string\n",
+    "\n",
+    "    Raises:\n",
+    "        ValueError: If root_path or image_url is None\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    with set_cwd(root_path):\n",
     "\n",
     "        _custom_social_image_template_path = (\n",
@@ -344,8 +357,12 @@
     "    output in destination directory\n",
     "\n",
     "    Args:\n",
-    "        src_path: The source path of the HTML file that will be used to generate the PNG image.\n",
-    "        dst_path: The destination path where the generated screenshot image will be saved.\n",
+    "        src_path: The path to the source file.\n",
+    "        dst_path: The path to the destination file.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    playwright = await async_playwright().start()\n",
     "    browser = await playwright.chromium.launch()\n",
@@ -381,16 +398,10 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Social share image generated and saved at: '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp4zk7d9gc/dst_path/mkdocs/docs_overrides/images/social_image.png'\n",
-      "Social share image generated and saved at: '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp4zk7d9gc/dst_path/mkdocs/docs_overrides/images/social_image.png'\n",
-      "Social share image generated and saved at: '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp4zk7d9gc/dst_path/mkdocs/docs_overrides/images/social_image.png'\n",
-      "Social share image generated and saved at: '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp4zk7d9gc/dst_path/mkdocs/docs_overrides/images/social_image.png'\n",
-      "total 24\n",
-      "drwxr-xr-x  5 harishm  staff   160 Jan  3 07:39 \u001b[34m.\u001b[m\u001b[m\n",
-      "drwxr-xr-x  3 harishm  staff    96 Jan  3 07:39 \u001b[34m..\u001b[m\u001b[m\n",
-      "-rw-r--r--  1 harishm  staff  2833 Jan  3 07:39 social_image.2.png\n",
-      "-rw-r--r--  1 harishm  staff  2833 Jan  3 07:39 social_image.3.png\n",
-      "-rw-r--r--  1 harishm  staff  2833 Jan  3 07:39 social_image.png\n"
+      "Social share image generated and saved at: '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9du087e8/dst_path/mkdocs/docs_overrides/images/social_image.png'\n",
+      "Social share image generated and saved at: '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9du087e8/dst_path/mkdocs/docs_overrides/images/social_image.png'\n",
+      "Social share image generated and saved at: '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9du087e8/dst_path/mkdocs/docs_overrides/images/social_image.png'\n",
+      "Social share image generated and saved at: '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp9du087e8/dst_path/mkdocs/docs_overrides/images/social_image.png'\n"
      ]
     }
    ],
@@ -425,9 +436,7 @@
     "    \n",
     "    assert (png_path / \"social_image.png\").exists()\n",
     "    assert (png_path / \"social_image.2.png\").exists()\n",
-    "    assert (png_path / \"social_image.3.png\").exists()\n",
-    "    \n",
-    "    !ls -la {png_path}\n"
+    "    assert (png_path / \"social_image.3.png\").exists()"
    ]
   },
   {
@@ -441,11 +450,21 @@
     "\n",
     "\n",
     "async def _create_social_image(root_path: str, image_url: str):\n",
-    "    \"\"\"Create social image for the project\n",
+    "    \"\"\"Create a social image\n",
     "\n",
     "    Args:\n",
-    "        root_path: The root path of the project.\n",
-    "        image_url: The image URL to be included in the social image.\n",
+    "        root_path: The root path\n",
+    "        image_url: The image URL to be included in the social image\n",
+    "\n",
+    "    Returns:\n",
+    "        The social image\n",
+    "\n",
+    "    Raises:\n",
+    "        ValueError: If root_path or image_url is None\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    html_str = _generate_html_str(root_path, image_url)\n",
     "\n",
@@ -471,7 +490,7 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Social share image generated and saved at: '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpr3ulfxiq/mkdocs/docs_overrides/images/social_image.png'\n"
+      "Social share image generated and saved at: '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp02lxl9ws/mkdocs/docs_overrides/images/social_image.png'\n"
      ]
     }
    ],
@@ -503,13 +522,17 @@
     "# | export\n",
     "\n",
     "def _unescape_exclamation_mark(text: str) -> str:\n",
-    "    \"\"\"Replaces the URL-encoded `!%21` character sequence with `!!` in a string.\n",
+    "    \"\"\"Replace the URL-encoded `!%21` character sequence with `!!` in a string.\n",
     "\n",
     "    Args:\n",
-    "        text: The string to be processed.\n",
+    "        text: The string to be processed\n",
     "\n",
     "    Returns:\n",
-    "        The input string with the `!%21` character sequence replaced with `!!`.\n",
+    "        The processed string with the `!%21` character sequence replaced with `!!`.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    pattern = r\":\\s*!%21\"\n",
     "    text = re.sub(pattern, r\": !!\", text)\n",
@@ -672,13 +695,16 @@
     "\n",
     "\n",
     "def _update_social_image_in_mkdocs_yml(root_path: str, image_url: str):\n",
-    "    \"\"\"Update social image link in mkdocs yml file\n",
+    "    \"\"\"Update social image link in mkdocs.yml\n",
     "\n",
     "    Args:\n",
-    "        root_path: The root path of the project.\n",
-    "        image_url: The image URL to update in the mkdocs yml file.\n",
-    "    \"\"\"\n",
+    "        root_path: The root path\n",
+    "        image_url: The image url\n",
+    "\n",
+    "    !!! note\n",
     "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    image_url = (\n",
     "        \"overrides/images/social_image.png\" if is_local_path(image_url) else image_url\n",
     "    )\n",
@@ -700,7 +726,7 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Social share image generated and saved at: '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp6jtgdieb/mkdocs/docs_overrides/images/social_image.png'\n",
+      "Social share image generated and saved at: '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpqu4rmqvf/mkdocs/docs_overrides/images/social_image.png'\n",
       "https://my-random-domain/sample.png\n",
       "overrides/images/social_image.png\n",
       "site_name: Test site\n",
@@ -804,13 +830,16 @@
     "\n",
     "\n",
     "def _update_social_image_in_site_overrides(root_path: str, image_url: str):\n",
-    "    \"\"\"Update social image link in site_overrides HTML template\n",
+    "    \"\"\"Update the social image in the site_overrides/main.html file.\n",
     "\n",
     "    Args:\n",
-    "        root_path: The root path of the project.\n",
-    "        image_url: The image URL to update in the site_overrides HTML template.\n",
-    "    \"\"\"\n",
+    "        root_path: The root path of the project\n",
+    "        image_url: The social image url\n",
     "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    _replace_str = (\n",
     "        'page.canonical_url ~ \"\" ~ config.extra.social_image '\n",
     "        if is_local_path(image_url)\n",
@@ -973,6 +1002,16 @@
     "\n",
     "\n",
     "class _IMG_Generator(str, Enum):\n",
+    "    \"\"\"An enumeration class for the different types of image generators.\n",
+    "\n",
+    "    Attributes:\n",
+    "        file : file\n",
+    "        dall_e : dall_e\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    file = \"file\"\n",
     "    dall_e = \"dall_e\"\n",
     "\n",
@@ -980,16 +1019,23 @@
     "def _generate_image_url(\n",
     "    root_path: str, generator: str, prompt: str, image_path: Optional[str] = None\n",
     ") -> str:\n",
-    "    \"\"\"Generate image url based on the generator\n",
+    "    \"\"\"Generate an image url.\n",
     "\n",
     "    Args:\n",
-    "        root_path: The root path of the project.\n",
-    "        generator: Generator to use to create the social image. Valid options are: 'file' and 'dall_e'.\n",
-    "        prompt: The prompt to use for generating the image.\n",
-    "        image_path: Image file path to use in the social share image. If None, then the default image will be used.\n",
+    "        root_path: The root path of the project\n",
+    "        generator: Generator to use to create the social image. Valid options are: 'file' and 'dall_e'\n",
+    "        prompt: The prompt to use for generating the image\n",
+    "        image_path: Image file path to use in the social share image. If None, then the default image will be used\n",
     "\n",
     "    Returns:\n",
-    "        The image url\n",
+    "        The generated image url\n",
+    "\n",
+    "    Raises:\n",
+    "        ValueError: If generator is not in _IMG_Generator._member_names_\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    if generator not in _IMG_Generator._member_names_:\n",
     "        raise ValueError(\n",
@@ -1090,7 +1136,7 @@
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "\u001b[31mUnexpected error: path /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmplcchxrck/invalid_image_path.png does not exists!\u001b[0m\n"
+      "\u001b[31mUnexpected error: path /private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpyk5z_zo3/invalid_image_path.png does not exists!\u001b[0m\n"
      ]
     },
     {
@@ -1124,7 +1170,7 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpxevxte_0/valid_image_path.png\n"
+      "/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp59gtsnw3/valid_image_path.png\n"
      ]
     }
    ],
@@ -1161,7 +1207,7 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpgcwqaaah/valid_image_path.png\n"
+      "/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp333om5v8/valid_image_path.png\n"
      ]
     }
    ],
@@ -1202,7 +1248,7 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpcgpx23_d/mkdocs/docs_overrides/images/default_social_logo.png\n"
+      "/private/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpkbeto94a/mkdocs/docs_overrides/images/default_social_logo.png\n"
      ]
     }
    ],
@@ -1235,15 +1281,18 @@
     "    prompt: str = \"Cute animal wearing hoodie sitting in high chair in purple room, browsing computer, 3d render\",\n",
     "    image_path: Optional[str] = None,\n",
     "):\n",
-    "    \"\"\"Generate a custom image for social card using the OpenAI Image API.\n",
+    "    \"\"\"Generate a social image for the project.\n",
     "\n",
     "    Args:\n",
     "        root_path: The root path of the project.\n",
     "        generator: Generator to use to create the social image. Valid options are: 'file' and 'dall_e'.\n",
     "        prompt: The prompt to use for generating the image.\n",
     "        image_path: Image file path to use in the social share image. Use images with a 1:1 aspect ratio and at least 512x512 pixels for the best results. If None, then the default image will be used.\n",
-    "    \"\"\"\n",
     "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    image_url = _generate_image_url(root_path, generator, prompt, image_path)\n",
     "\n",
     "    await _create_social_image(root_path, image_url)\n",
@@ -1263,7 +1312,7 @@
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Social share image generated and saved at: '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmp94edu8t9/mkdocs/docs_overrides/images/social_image.png'\n",
+      "Social share image generated and saved at: '/var/folders/6n/3rjds7v52cd83wqkd565db0h0000gn/T/tmpvpxuwnv9/mkdocs/docs_overrides/images/social_image.png'\n",
       "overrides/images/social_image.png\n",
       "{% extends \"base.html\" %}\n",
       "\n",
@@ -1353,7 +1402,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3",
+   "display_name": "Python 3 (ipykernel)",
    "language": "python",
    "name": "python3"
   }
diff --git a/nbs/Utils.ipynb b/nbs/Utils.ipynb
index 5ef76cb2..05deac40 100644
--- a/nbs/Utils.ipynb
+++ b/nbs/Utils.ipynb
@@ -55,7 +55,15 @@
     "\n",
     "@contextmanager\n",
     "def set_cwd(cwd_path: Union[Path, str]):\n",
+    "    \"\"\"Set the current working directory for the duration of the context manager.\n",
     "\n",
+    "    Args:\n",
+    "        cwd_path: The path to the new working directory.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    cwd_path = Path(cwd_path)\n",
     "    original_cwd = os.getcwd()\n",
     "    os.chdir(cwd_path)\n",
@@ -92,8 +100,19 @@
     "\n",
     "\n",
     "def get_value_from_config(root_path: str, config_name: str) -> str:\n",
-    "    \"\"\"Get the value from settings.ini file\"\"\"\n",
+    "    \"\"\"Get a value from the configuration file.\n",
     "\n",
+    "    Args:\n",
+    "        root_path: The root path of the configuration file.\n",
+    "        config_name: The name of the configuration to get.\n",
+    "\n",
+    "    Returns:\n",
+    "        The value of the configuration.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    settings_path = Path(root_path) / \"settings.ini\"\n",
     "    config = ConfigParser()\n",
     "    config.read(settings_path)\n",
@@ -147,6 +166,18 @@
     "\n",
     "def is_local_path(path):\n",
     "    # Check if the path is an absolute path\n",
+    "    \"\"\"Check if a path is a local path.\n",
+    "\n",
+    "    Args:\n",
+    "        path: The path to check.\n",
+    "\n",
+    "    Returns:\n",
+    "        True if the path is a local path, False otherwise.\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
     "    if os.path.isabs(path):\n",
     "        return True\n",
     "\n",
@@ -182,10 +213,17 @@
     "\n",
     "\n",
     "def add_counter_suffix_to_filename(src_path: Path):\n",
-    "    \"\"\"Add a counter suffix to the given file\n",
+    "    \"\"\"Add a counter suffix to a file name.\n",
     "\n",
     "    Args:\n",
-    "        src_path: The path to the file to rename.\n",
+    "        src_path: Path to the file to be renamed\n",
+    "\n",
+    "    Returns:\n",
+    "        None\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
     "    \"\"\"\n",
     "    parent_dir = src_path.parent\n",
     "    counter_suffix = (\n",
diff --git a/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb b/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb
index ba522aba..453192c0 100644
--- a/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb
+++ b/nbs/guides/Guide_01_End_To_End_Walkthrough.ipynb
@@ -599,14 +599,118 @@
   },
   {
    "cell_type": "markdown",
-   "id": "bc937a98",
+   "id": "1570f663",
    "metadata": {},
    "source": [
     "##  Advanced functionality\n",
     "\n",
-    "In this section, you'll learn how to add guides, release notes, and make some basic Material MKDocs changes, such as changing our project's logo.\n",
+    "In this section, you'll learn how to auto generate docstring for classes and methods, add guides, release notes, and make some basic Material MKDocs changes, such as changing our project's logo.\n",
+    "\n",
+    "\n",
+    "### Auto generate docstrings\n",
+    "\n",
+    "Documenting existing code can be difficult and time-consuming because it requires understanding the code's intent and purpose, which may not always be clear or immediately obvious.\n",
+    "\n",
+    "`nbdev_mkdocs` simplifies the task of documenting existing code by automatically creating <a href=\"https://google.github.io/styleguide/pyguide.html\" target=\"_blank\">Google-style docstrings</a> for classes and methods which don't have one. `nbdev_mkdocs` internally uses the <a href=\"https://docstring-gen.airt.ai/\" target=\"_blank\">docstring-gen library</a> and <a href=\"https://beta.openai.com/docs/models/codex\" target=\"_blank\">OpenAI's Codex AI model</a> for generating clear and informative docstrings.\n",
+    "\n",
+    "By running the following CLI command, you can add docstrings to a single Python file, a Jupyter notebook, or a directory containing these files.\n",
+    "\n",
+    "!!! note\n",
+    "\n",
+    "    The OpenAI API uses API keys for authentication. <a href=\"https://beta.openai.com/account/api-keys\" target=\"_blank\">Please create one</a> and set it in the `OPENAI_API_KEY` environment variable before running the below command.\n",
+    "\n",
+    "\n",
+    "```shell\n",
+    "nbdev_mkdocs docstring generate {source_file_or_directory}\n",
+    "```\n",
+    "\n",
+    "For example, a function like below without the docstring:\n",
+    "\n",
+    "```python\n",
+    "def concatenate_strings(s1: str, s2: str) -> str:\n",
+    "    if not isinstance(s1, str) or not isinstance(s2, str):\n",
+    "        raise TypeError(\"Both arguments should be strings.\")\n",
+    "    return s1 + s2\n",
+    "```\n",
+    "\n",
+    "will become similar to:\n",
+    "\n",
+    "```python\n",
+    "def concatenate_strings(s1: str, s2: str) -> str:\n",
+    "    \"\"\"Concatenate two strings.\n",
+    "\n",
+    "    Args:\n",
+    "        s1: First string\n",
+    "        s2: Second string\n",
+    "\n",
+    "    Returns:\n",
+    "        The concatenated string\n",
+    "\n",
+    "    Raises:\n",
+    "        TypeError: If s1 or s2 is not a string\n",
+    "\n",
+    "    !!! note\n",
+    "\n",
+    "        The above docstring is autogenerated by docstring-gen library (https://github.com/airtai/docstring-gen)\n",
+    "    \"\"\"\n",
+    "    if not isinstance(s1, str) or not isinstance(s2, str):\n",
+    "        raise TypeError(\"Both arguments should be strings.\")\n",
+    "    return s1 + s2\n",
+    "```\n",
     "\n",
+    "If you wish to regenerate the docstrings, you can re-run the command with the -f flag, which will remove the previous auto-generated docstrings and replace them with new ones.\n",
     "\n",
+    "\n",
+    "```shell\n",
+    "nbdev_mkdocs docstring generate {source_file_or_directory} -f\n",
+    "```\n",
+    "\n",
+    "!!! note\n",
+    "\n",
+    "    By default, the command only adds docstrings to missing functions and classes. It won't overwrite previously generated docstrings if the `-f` flag is not provided during re-run.\n",
+    "    \n",
+    "\n",
+    "If you prefer not to include the text **“autogenerated by docstring-gen library”** in the generated docstrings, you can use the `--no-include-auto-gen-txt` flag when running the command.\n",
+    "\n",
+    "```shell\n",
+    "nbdev_mkdocs docstring generate {source_file_or_directory} -f --no-include-auto-gen-txt\n",
+    "```\n",
+    "\n",
+    "Now the docstring for the above function will look similar to:\n",
+    "\n",
+    "```python\n",
+    "def concatenate_strings(s1: str, s2: str) -> str:\n",
+    "    \"\"\"Concatenate two strings.\n",
+    "\n",
+    "    Args:\n",
+    "        s1: First string\n",
+    "        s2: Second string\n",
+    "\n",
+    "    Returns:\n",
+    "        The concatenated string\n",
+    "\n",
+    "    Raises:\n",
+    "        TypeError: If s1 or s2 is not a string\n",
+    "    \"\"\"\n",
+    "    if not isinstance(s1, str) or not isinstance(s2, str):\n",
+    "        raise TypeError(\"Both arguments should be strings.\")\n",
+    "    return s1 + s2\n",
+    "```\n",
+    "\n",
+    "!!! note\n",
+    "\n",
+    "    The text **“autogenerated by docstring-gen library”** is used to identify which docstrings were generated by the library. When the `--no-include-auto-gen-txt` flag is used, this text will not be included in the generated docstrings. As a result, when re-running the command with the `-f` flag, these docstrings will not be replaced.”\n",
+    "    \n",
+    "Alternatively, you can manually delete the **“autogenerated by docstring-gen library”** (starting from the !!! note until the end) text from the classes and functions for which you think the auto-generated docstring is appropriate, and then re-run the command using the `-f` flag to update the remaining auto-generated docstrings.\n",
+    "\n",
+    "In addition to the `-f` and `--no-include-auto-gen-txt` flags, you can also customize the behavior of the CLI command by adjusting other parameters such as `--model`, `--temperature`, etc., For more information on these options and how to use them, please refer to the <a href=\"https://beta.openai.com/docs/api-reference/completions/create\" target=\"_blank\">OpenAI’s documentation</a>."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "bc937a98",
+   "metadata": {},
+   "source": [
     "### Add guides\n",
     "\n",
     "By default, the sidebar navigation will display all the notebooks specified in the `sidebar.yml` or `_quarto.yml`. If you want to customize the sidebar, check out this <a href=\"https://nbdev.fast.ai/explanations/docs.html#customizing-the-sidebar\" target=\"_blank\">link</a> for more information.\n",
diff --git a/nbs/index.ipynb b/nbs/index.ipynb
index 9afb1ac2..db9dde9b 100644
--- a/nbs/index.ipynb
+++ b/nbs/index.ipynb
@@ -214,6 +214,8 @@
       "\u001b[2m╭─\u001b[0m\u001b[2m Commands \u001b[0m\u001b[2m──────────────────────────────────────────────────────────────────\u001b[0m\u001b[2m─╮\u001b[0m\r\n",
       "\u001b[2m│\u001b[0m \u001b[1;36mdocs                 \u001b[0m\u001b[1;36m \u001b[0m Prepares files in **mkdocs/docs** and then runs       \u001b[2m│\u001b[0m\r\n",
       "\u001b[2m│\u001b[0m \u001b[1;36m                      \u001b[0m **mkdocs build** command on them                      \u001b[2m│\u001b[0m\r\n",
+      "\u001b[2m│\u001b[0m \u001b[1;36mdocstring            \u001b[0m\u001b[1;36m \u001b[0m Command for adding docstrings to classes and methods  \u001b[2m│\u001b[0m\r\n",
+      "\u001b[2m│\u001b[0m \u001b[1;36m                      \u001b[0m that don't have one using docstring-gen library.      \u001b[2m│\u001b[0m\r\n",
       "\u001b[2m│\u001b[0m \u001b[1;36mgenerate-social-image\u001b[0m\u001b[1;36m \u001b[0m Generate a custom social share image                  \u001b[2m│\u001b[0m\r\n",
       "\u001b[2m│\u001b[0m \u001b[1;36mnew                  \u001b[0m\u001b[1;36m \u001b[0m Creates files in **mkdocs** subdirectory needed for   \u001b[2m│\u001b[0m\r\n",
       "\u001b[2m│\u001b[0m \u001b[1;36m                      \u001b[0m other **nbdev_mkdocs** subcommands                    \u001b[2m│\u001b[0m\r\n",
diff --git a/settings.ini b/settings.ini
index c0779bf3..2123323a 100644
--- a/settings.ini
+++ b/settings.ini
@@ -50,7 +50,8 @@ requirements =     \
     griffe>=0.24.1 \
     ruamel.yaml>=0.17.21 \
     openai>=0.25.0 \
-    playwright>=1.28.0
+    playwright>=1.28.0 \
+    docstring-gen>=0.1.0
 
 dev_requirements = \
     bandit>=1.7.4 \


Test patch:
diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml
index 2a35f68e..e4fc43a6 100644
--- a/.github/workflows/test.yaml
+++ b/.github/workflows/test.yaml
@@ -1,6 +1,9 @@
 name: CI
 on:  [workflow_dispatch, pull_request, push]
 
+env:
+  OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
+
 jobs:
   static_check:
     runs-on: ubuntu-latest