Repository: repobee/repobee

Issue:
Proof read and patch up documentation
A lot of things have changed, so the docs need thorough screening!

Discussion:
codecov-io: # [Codecov](https://codecov.io/gh/repobee/repobee/pull/305?src=pr&el=h1) Report
> Merging [#305](https://codecov.io/gh/repobee/repobee/pull/305?src=pr&el=desc) into [master](https://codecov.io/gh/repobee/repobee/commit/42fc92a6eab3f2e7deb62ce5f1424d2743f507c0?src=pr&el=desc) will **decrease** coverage by `0.09%`.
> The diff coverage is `100%`.

[![Impacted file tree graph](https://codecov.io/gh/repobee/repobee/pull/305/graphs/tree.svg?width=650&token=5vOKgkphZe&height=150&src=pr)](https://codecov.io/gh/repobee/repobee/pull/305?src=pr&el=tree)

```diff
@@            Coverage Diff            @@
##           master     #305     +/-   ##
=========================================
- Coverage   90.33%   90.24%   -0.1%     
=========================================
  Files          21       21             
  Lines        1542     1548      +6     
  Branches      276      276             
=========================================
+ Hits         1393     1397      +4     
- Misses        124      127      +3     
+ Partials       25       24      -1
```


| [Impacted Files](https://codecov.io/gh/repobee/repobee/pull/305?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [src/\_repobee/cli.py](https://codecov.io/gh/repobee/repobee/pull/305/diff?src=pr&el=tree#diff-c3JjL19yZXBvYmVlL2NsaS5weQ==) | `98.13% <100%> (-0.6%)` | :arrow_down: |
| [src/\_repobee/ext/gitlab.py](https://codecov.io/gh/repobee/repobee/pull/305/diff?src=pr&el=tree#diff-c3JjL19yZXBvYmVlL2V4dC9naXRsYWIucHk=) | `64.63% <0%> (ø)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/repobee/repobee/pull/305?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/repobee/repobee/pull/305?src=pr&el=footer). Last update [42fc92a...437f0df](https://codecov.io/gh/repobee/repobee/pull/305?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).


Patch:
diff --git a/docs/cli.rst b/docs/cli.rst
index 9b015ea..0866d56 100644
--- a/docs/cli.rst
+++ b/docs/cli.rst
@@ -2,6 +2,6 @@ CLI documentation
 *****************
 
 .. argparse::
-    :module: repobee.cli
-    :func: _create_parser
+    :module: _repobee.cli
+    :func: create_parser_for_docs
     :prog: repobee
diff --git a/docs/clone.rst b/docs/clone.rst
index fea16c4..7367e67 100644
--- a/docs/clone.rst
+++ b/docs/clone.rst
@@ -6,18 +6,18 @@ a deadline, as timestamps in a ``git`` commit can easily be altered (and are
 therefore not particularly trustworthy). Whatever your reason may be, it's
 very simple using the ``clone`` command. Again, assume that we have the
 ``students.txt`` file from :ref:`setup`, and that we want to clone all student
-repos based on ``master-repo-1`` and ``master-repo-2``.
+repos based on ``task-1`` and ``task-2``.
 
 .. code-block:: bash
 
-    $ repobee clone -mn master-repo-1 master-repo-2 -sf students.txt
+    $ repobee clone -mn task-1 task-2 -sf students.txt
     [INFO] cloning into student repos ...
-    [INFO] Cloned into https://some-enterprise-host/repobee-demo/spam-master-repo-1
-    [INFO] Cloned into https://some-enterprise-host/repobee-demo/ham-master-repo-1
-    [INFO] Cloned into https://some-enterprise-host/repobee-demo/ham-master-repo-2
-    [INFO] Cloned into https://some-enterprise-host/repobee-demo/eggs-master-repo-1
-    [INFO] Cloned into https://some-enterprise-host/repobee-demo/spam-master-repo-2
-    [INFO] Cloned into https://some-enterprise-host/repobee-demo/eggs-master-repo-2
+    [INFO] Cloned into https://some-enterprise-host/repobee-demo/slarse-task-1
+    [INFO] Cloned into https://some-enterprise-host/repobee-demo/glassey-task-1
+    [INFO] Cloned into https://some-enterprise-host/repobee-demo/glassey-task-2
+    [INFO] Cloned into https://some-enterprise-host/repobee-demo/glennol-task-1
+    [INFO] Cloned into https://some-enterprise-host/repobee-demo/slarse-task-2
+    [INFO] Cloned into https://some-enterprise-host/repobee-demo/glennol-task-2
 
 Splendid! That's really all there is to the basic functionality, the repos
 should now be in your current working directory. There is also a possibility to
@@ -32,5 +32,7 @@ about it in the :ref:`plugins` section.
    RepoBee doesn't actually use ``git clone`` to clone repositories. Instead,
    RepoBee clones by initializing the repository and running ``git pull``. The
    practical implication is that you can't simply enter a repository that's
-   been cloned with RepoBee and run ``git pull`` to fetch updates, as there
-   will be no remote set. Run ``repobee clone`` again instead.
+   been cloned with RepoBee and run ``git pull`` to fetch updates. You will
+   have to run ``repobee clone`` again in a different directory to fetch any
+   updates students have made, alternatively simply delete to particular
+   repositories you want to clone again and then run ``repobee clone``.
diff --git a/docs/conf.py b/docs/conf.py
index d0df04e..042b224 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -70,9 +70,9 @@ author = "Simon Larsén"
 # built documents.
 #
 # The short X.Y version.
-version = "1.6"
+version = "2.0"
 # The full version, including alpha/beta/rc tags.
-release = "1.6.0"
+release = "2.0a1"
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff --git a/docs/fundamentals.rst b/docs/fundamentals.rst
index 478fc95..887616b 100644
--- a/docs/fundamentals.rst
+++ b/docs/fundamentals.rst
@@ -3,51 +3,66 @@
 Introduction
 ************
 RepoBee is an opinionated tool for managing anything from a handful to
-thousands of GitHub repositories for higher education courses. It was created as
-the old teachers_pet_ tool was getting long in the tooth, and the new `GitHub
-Classroom`_ wasn't quite what we wanted (we like our command line apps).
-RepoBee is heavily inspired by teachers_pet, but tries to both make for a more
-complete and streamlined experience.
+thousands of Git repositories on the GitHub and GitLab platforms. There were two
+primary reasons for RepoBee's inception. First, the old teachers_pet_ tool that
+we used previously lacked some functionality that we needed and had been
+archived in favor of the new `GitHub Classroom`_. Second, `GitHub Classroom`_
+did not support GitHub Enterprise at the time (and as of this writing, still
+does not, although `efforts have been made to that end
+<https://github.com/education/classroom/pull/1163>`_). RepoBee is heavily
+inspired by teachers_pet_, as we enjoyed the overall workflow, but improves on
+the user experience.
 
 Philosophy and goals
 ====================
-The primary goal of RepoBee is to lower the bar for incorporating
-Git and GitHub into higher education coursework, hopefully opening up
-the wonderful world of version control to teachers who may not be subject
-experts (and to their students). For new users, RepoBee provides both a
-tool and an opinionated workflow to adopt. For the more experienced user,
-there is also opportunity to customize RepoBee using its plugin system,
-which is planned to be expanded even more. RepoBee is primarily geared toward
-teachers looking to generate repos for their students. Many features are
-however highly useful to teaching assistants, such as the ability to clone
-repos in bulk and perform arbitrary tasks on them (tasks can be implemented as
-plugins, see :ref:`plugins`).
+When RepoBee was first created, it's goals were simple: facilitate creation and
+management of student repositories for courses at KTH, using GitHub Enterprise.
+Since then, the scope of the project has grown to incorporate many new features,
+including support for the GitLab platform. For new users of Git/GitHub/GitLab in
+education, RepoBee provides both a tool to make it happen, and an opinionated
+workflow to ease the transition. For the more experienced user, the plugin system
+can be used to extend or modify the behavior of RepoBee. While creating a plugin
+requires some rudimentary skills with Python programming, installing a plugin
+created by someone else is no harder than installing RepoBee itself. The plugin
+system enables RepoBee to both be easy to get up and running *without* any
+required customization, while still *allowing* for a degree of customization to
+those that want it. See :ref:`plugins` for details.
 
 Another key goal is to keep RepoBee simple to use and simple to maintain.
 RepoBee requires a minimal amount of static data to operate (such as a list of
-students, a URL to the GitHub instance and an access token to GitHub), which
-can all be provided in configuration files or on the command line, but it does
-not require any kind of backing database to keep track of repositories. That is
-because RepoBee itself does not keep track of anything, except possibly for the
-aforementioned static data if one chooses to keep it in configuration files.
-All of the complex state state is more or less implicitly stored on GitHub, and
-RepoBee locates student repositories based on strict naming conventions that
-are adhered to by all of its commands. This allows RepoBee to be simple to set
-up and use on multiple machines, which is crucial in a course where multiple
-teachers and TAs are managing the student repositories. There is also the fact
-that nothing need be installed server-side, as RepoBee only uses core GitHub
-features to do its work. For an experienced user, installing RepoBee and
-setting everything up for a new course can literally take minutes. For the
-novice, the :ref:`userguide` will hopefully prove sufficient to get started in
-not too much time.
+students, a URL to the platform instance and an access token to said platform),
+which can all be provided in configuration files or on the command line, but it
+does not require any kind of backing database to keep track of repositories.
+That is because RepoBee itself does not keep track of anything, except possibly
+for the aforementioned static data if one chooses to keep it in configuration
+files. All of the complex state state is more or less implicitly stored on
+the hosting platform, and RepoBee locates student repositories based on strict
+naming conventions that are adhered to by all of its commands. This allows
+RepoBee to be simple to set up and use on multiple machines, which is crucial in
+a course where multiple teachers and TAs are managing the student repositories.
+RepoBee is very intentionally designed *not* to be a service, but an on-demand
+tool that is only in use when explicitly being used. This means that nothing
+needs to be installed server-side for RepoBee to function, which also happens to
+be key to supporting multiple hosting platforms. For an experienced user,
+installing RepoBee and setting everything up for a new course can literally take
+minutes. For the novice, the :ref:`userguide` will hopefully prove sufficient to
+get started within the hour.
 
 Key concepts
 ============
 Some terms occur frequently in RepoBee and are best defined up front.
 Some of the descriptions may not click entirely before reading the
 :ref:`userguide` section, so quickly browsing through these definitions and
-re-visiting them when needed is probably the best course of action.
-
+re-visiting them when needed is probably the best course of action. As GitHub is
+the default platform, these concepts are based on and often refer to
+GitHub-specific terms. For a mapping to GitLab terms and concepts, please see
+the :ref:`gitlab` section.
+
+* *Platform*: Or *hosting platform*, refers to services such as GitHub and
+  GitLab.
+* *Platform instance:* A specific instance of a hosting platform. For example,
+  https://github.com is one instance, and an arbitrary GitLab Enterprise
+  installation is another.
 * *Target organization*: The GitHub Organization_ related to the current course
   round.
 * *Master repository*: Or *master repo*, is a template repository upon which
@@ -59,8 +74,6 @@ re-visiting them when needed is probably the best course of action.
   master repos are being worked on across course rounds.
 * *Student repository*: Or *student repo*, refers to a *copy* of a master repo
   for some specific student or group of students.
-* *GitHub instance*: A hosted GitHub service. This can be for example
-  *https://github.com* or any Enterprise host.
 
 .. _conventions:
 
@@ -68,7 +81,7 @@ Conventions
 ===========
 The following conventions are fundamental to working with RepoBee.
 
-* For each course and course round, use one target Organization_.
+* For each course and course round, use one target organization.
 * Any user of RepoBee has unrestricted access to the target organization
   (i.e. is an owner). If the user has limited access, some features may work,
   while others may not.
@@ -94,14 +107,13 @@ The following conventions are fundamental to working with RepoBee.
 
 .. note::
 
-    Few of these conventions are actually enforced, and there are ways around
-    almost every single one. However, with the exception of the *one
-    organization per course round* convention, which must be ensured manually,
-    RepoBee will automatically adhere to the other conventions. Although
-    RepoBee does adhere to the conventions, there is no way to stop users
-    from breaking them using e.g. the GitHub web interface, manually performing
-    master repo migrations etc. Straying form the conventions may cause
-    RepoBee to behave unexpectedly.
+   RepoBee has no way of enforcing these conventions, other than itself strictly
+   adhering to them. For example, there are no countermeasures against someone
+   manually changing the names of student repositories or their URLs, and as
+   there are endless variations of things that can be manually changed, there
+   are no safety checks against such things either. If you have a need to
+   manually change something, do keep in mind that straying from RepoBee's
+   conventions may cause it to act unexpectedly.
 
 Usage with different platforms (GitHub, GitHub Enterprise and GitLab)
 =====================================================================
@@ -110,10 +122,11 @@ well with the public cloud service at https://github.com. Usage of RepoBee
 should be identical, but there are two differences between the two that one
 should be aware of.
 
-.. note:: 
+.. note::
 
-   As of v1.5.0, GitLab is partially supported. Please see :ref:`gitlab` for
-   more information on which commands work, and how to use RepoBee with GitLab.
+   As of v1.6.0, GitLab is supported by most features. Please see :ref:`gitlab`
+   for more information on which commands work, and how to use RepoBee with
+   GitLab.
 
 The Organization must have support for private repositories
 -----------------------------------------------------------
diff --git a/docs/getting_started.rst b/docs/getting_started.rst
index 318514f..853acf9 100644
--- a/docs/getting_started.rst
+++ b/docs/getting_started.rst
@@ -8,25 +8,32 @@ Getting started (the ``show-config``, ``verify-settings`` and ``setup`` commands
     tech-savvy enough to translate the instructions into some other shell
     environment.
 
+.. important::
+
+   Whenever you see specific mentions of GitHub, refer to the :ref:`gitlab`
+   section for how this translates to use with GitLab.
+
 The basic workflow of RepoBee is best described by example. In this section,
-I will walk you through how to set up an Organization_ with master and student
-repositories by showing every single step I would perform myself. The basic
-workflow can be summarized in the following steps:
+I will walk you through how to set up a target organization with master and
+student repositories by showing every single step I would perform myself. The
+basic workflow can be summarized in the following steps:
 
 1. Create an organization (the target organization).
 2. Configure RepoBee for the target organization.
 3. Verify settings.
-4. Setting up the master repos.
-5. Setting up the student repos.
+4. Set up the master repos.
+5. Set up the student repos.
 
-There is more to RepoBee, such as opening/closing issues, updating student
-repos and cloning repos in batches, but here we will just look at the bare
-minimum to get started. Now, let's delve into these steps in greater detail.
+This should leave you with enough knowledge to use the rudimentary features of
+RepoBee. There is much more to RepoBee, such as opening/closing issues,
+updating student repos and cloning repos in batches. This is covered in later
+sections, but you don't necessarily need to go through the entire guide in one
+go. Now, let's delve into the above steps in greater detail.
 
 Create an organization
 ======================
 This is an absolutely necessary pre-requisite for using RepoBee.
-Create an organization with an appropriate name on the GitHub instance you
+Create an organization with an appropriate name on the platform instance you
 intend to use. You can find the ``New organization`` button by going to
 ``Settings -> Organization``. I will call my *target organization*
 ``repobee-demo``, so whenever you see that, substitute in the name of your
@@ -37,74 +44,67 @@ target organization.
     At KTH, we most often do not want our students to be able to see each
     others' repos. By default, however, members have read access to *all*
     repos. To change this, go to the organization dashboard and find your way
-    to ``Settings -> Member privileges``. At the very bottom, there should be a
-    section called ``Default repository permission``.  Set this to ``None`` to
-    disallow students from viewing each others' repos unless explicitly given
-    permission by an organization owner (e.g. you).
+    to ``Settings -> Member privileges``. There should be a drop-down called
+    something along the lines of "Base permissions" or "Default repository
+    settings", which you will want to set to ``None``. The placement and name
+    of this drop-down has changed places twice since the first iteration of
+    this documentation, so it may not be an exact match, but you should find it
+    somewhere around there.
 
 .. _configure_repobee:
 
 Configure RepoBee for the target organization (``show-config`` and ``verify-settings``)
-========================================================================================
+=======================================================================================
 For the tool to work at all, it needs to be provided with an OAUTH2 token to
-whichever GitHub instance you intend to use. See the `GitHub OAUTH docs`_ for
+whichever platform instance you intend to use. See the `GitHub OAUTH docs`_ for
 how to create a token. The token should have the ``repo`` and ``admin:org``
-scopes. While we can set this token in an environment variable (see
+scopes. While you can set this token in an environment variable (see
 :ref:`configuration`), it's more convenient to just put it in the configuration
-file, as we will put other default values in there.  We can use the
-``show-config`` command to figure out where to put the config file.
+file, as you will put other default values in there. The ``config-wizard`` command
+starts a configuration wizard that prompts you for default values for the
+available settings. The defaults that are set in the configuration file
+are *just defaults*, and can always be overridden on the command line. For the
+rest of this guide, I will assume that the config file has defaults for at
+least the following:
 
 .. code-block:: bash
+   :caption: config.cnf
 
-    $ repobee show-config
-    [ERROR] FileError: no config file found, expected location: /home/USERNAME/.config/repobee/config.cnf
-
-``show-config`` will check that the configuration file exists and is
-syntactically correct. Well, technically it will try to load the config and fail to do so if it
-doesn't exist or is incorrectly formatted and then display it to the user. Here,
-the error message is telling use that it expected a config file at
-``/home/USERNAME/.config/repobee/config.cnf``, so let's add one there. It
-should look something like this:
+   [DEFAULTS]
+   base_url = https://some-enterprise-host/api/v3
+   user = slarse
+   org_name = repobee-demo
+   master_org_name = master-repos
+   token = SUPER_SECRET_TOKEN
 
-.. code-block:: bash
+Now, run ``repobee config-wizard`` and enter your own values for the options
+shown above. To skip an option, simply press ENTER without first typing in a
+value. Here are some pointers regarding the different values:
 
-    [DEFAULTS]
-    base_url = https://some-enterprise-host/api/v3
-    user = slarse
-    org_name = repobee-demo
-    master_org_name = master-repos
-    token = SUPER_SECRET_TOKEN
-
-Now, you need to substitute in some of your own values in place of mine.
-
-* Enter the correct url for your GitHub instance. There are two options:
-    - If you are working with an enterprise instance, simply replace
+* Enter the correct url for your platform instance. There are two options:
+    - If you are working with GitHub Enterprise, simply replace
       ``some-enterprise-host`` with the appropriate hostname.
     - If you are working with ``github.com``, replace the whole url
       with ``https://api.github.com``.
 * Replace ``slarse`` with your GitHub username.
 * Replace ``repobee-demo`` with whatever you named your target organization.
 * Replace ``SUPER_SECRET_TOKEN`` with your OAUTH token.
-* Replace ``master_org_name`` with the name of the organization with your master
-  repos.
-  - It you keep the master repos in the target organization or locally, **remove
-  this option**.
-
-.. important::
-
-    The rest of this guide assumes the simplest possible setup of _not_ having
-    a separate master organization, but it is good practice to have the master
-    repos separate for the sake of maintainability. If the master organization
-    is configured in the config file, it won't matter for any but the
-    ``migrate`` command (which you don't need then, anyway).
-
-That's it for configuration, and we can check that the file is correctly found
-and parsed by running ``show-config`` again:
+* Replace ``master_org_name`` with the name of the organization with your master repos.
+    - It you keep the master repos in the target organization or locally, **skip
+      this option**.
+* **If you are using GitLab**:
+    - The ``base_url`` should be to the host, not to the API endpoint. I.e. if
+      you are using https://gitlab.com, then the ``base_url`` option should
+      simply read ``https://gitlab.com``.
+    - Enter ``gitlab`` for the ``plugins`` option.
+
+That's it for configuration. The ``show-config`` command can be used to check
+that you got everything correctly.
 
 .. code-block:: bash
 
     $ repobee show-config
-    [INFO] found valid config file at /home/slarse/.config/repobee/config.cnf
+    [INFO] Found valid config file at /home/slarse/.config/repobee/config.cnf
     [INFO]
     ----------------BEGIN CONFIG FILE-----------------
     [DEFAULTS]
@@ -115,8 +115,16 @@ and parsed by running ``show-config`` again:
     token = SUPER_SECRET_TOKEN
     -----------------END CONFIG FILE------------------
 
+If you ever want to re-configure some of the options, simply run the
+``config-wizard`` command again.
+
 Verify settings
 ===============
+
+.. important:: 
+
+   ``verify-settings`` is not yet supported by the ``gitlab`` plugin.
+
 Now that everything is set up, it's time to verify all of the settings. Given
 that you have a configuration file that looks something like the one above,
 you can simply run the ``verify-settings`` command without any options.
@@ -124,26 +132,26 @@ you can simply run the ``verify-settings`` command without any options.
 .. code-block:: bash
 
     $ repobee verify-settings
-    [INFO] verifying settings ...
-    [INFO] trying to fetch user information ...
+    [INFO] Verifying settings ...
+    [INFO] Trying to fetch user information ...
     [INFO] SUCCESS: found user slarse, user exists and base url looks okay
-    [INFO] verifying oauth scopes ...
+    [INFO] Verifying oauth scopes ...
     [INFO] SUCCESS: oauth scopes look okay
-    [INFO] trying to fetch organization ...
+    [INFO] Trying to fetch organization ...
     [INFO] SUCCESS: found organization test-tools
-    [INFO] verifying that user slarse is an owner of organization repobee-demo
+    [INFO] Verifying that user slarse is an owner of organization repobee-demo
     [INFO] SUCCESS: user slarse is an owner of organization repobee-demo
-    [INFO] trying to fetch organization master-repos ...
+    [INFO] Trying to fetch organization master-repos ...
     [INFO] SUCCESS: found organization master-repos
-    [INFO] verifying that user slarse is an owner of organization master-repos
+    [INFO] Verifying that user slarse is an owner of organization master-repos
     [INFO] SUCCESS: user slarse is an owner of organization master-repos
     [INFO] GREAT SUCCESS: All settings check out!
 
 If any of the checks fail, you should be provided with a semi-helpful error
-message. When all checks pass and you get ``GREAT SUCCESS``, move on to the
-next section!
+message. When all checks pass and you get ``GREAT SUCCESS``, move on to the next
+section!
 
-Setting up master repos
+Set up master repos
 =======================
 How you do this will depend on where you want to have your master repos. I
 recommend having a separate, persistent organization so that you can work on
@@ -154,86 +162,105 @@ organization (e.g. if you keep master repos in the target organization), see
 the :ref:`migrate` section. For all commands but the ``migrate`` command, the
 way you set this up does not matter as far as RepoBee commands go.
 
+.. note::
+
+   Recall that there is nothing special about master repos, they are just your
+   templates for student repos. If you have an organization set up with template
+   repositories, then that is a viable master organization.
+
 .. _setup:
 
-Setup student sepositories
-==========================
+Set up student sepositories
+===========================
 Now that the master repos are set up, it's time to create the student repos.
 While student usernames *can* be specified on the command line, it's often
 convenient to have them written down in a file instead. Let's pretend I have
-three students with usernames ``spam``, ``ham`` and ``eggs``. I'll simply create
-a file called ``students.txt`` and type each username on a separate line.
+three students with usernames ``slarse``, ``glassey`` and ``glennol``. I'll
+simply create a file called ``students.txt`` and type each username on a
+separate line.
 
 .. code-block:: bash
+   :caption: students.txt
 
-    spam
-    ham
-    eggs
+    slarse
+    glassey
+    glennol
 
 .. note::
 
    **Since v1.3.0:** It is now possible to specify groups of students to get
    access to the same repos by putting multiple usernames on the same line,
-   separated by spaces. For example, the following file will put `spam` and
-   `ham` in the same group.
+   separated by spaces. For example, the following file will put `slarse` and
+   `glassey` in the same group.
 
    .. code-block:: bash
 
-      spam ham
-      eggs
+      slarse glassey
+      glennol
 
    See :ref:`groups` for details.
 
 An absolute file path to this file can be added to the config file with the
-``students_file`` option (see :ref:`config`). Now, I want to create one student
-repo for each student per master repo. The repo names will be on the form
+``students_file`` option (see :ref:`config`). Since I often manage different
+sets of students, that's seldom convenient for me, but if you always manage the
+same set of students I recommend setting that option so you can omit it from the
+command line arguments. Now, I want to create one student repo for each master
+repo and student. The repo names will be on the form
 ``<username>-<master-repo-name>``, guaranteeing their uniqueness. Each student
 will also be added to a team (which bears the same name as the student's user),
-and it is the team that is allowed access to the student's repos, and not the
+and it is the team that is allowed access to the student's repos, not the
 student's actual user. That all sounded fairly complex, but again, it's as
 simple as issuing a single command with RepoBee.
 
 .. code-block:: bash
 
-    $ repobee setup -mn master-repo-1 master-repo-2 -sf students.txt
-    [INFO] cloning into master repos ...
-    [INFO] cloning into file:///home/slarse/tmp/master-repo-1
-    [INFO] cloning into file:///home/slarse/tmp/master-repo-2
-    [INFO] created team eggs
-    [INFO] created team ham
-    [INFO] created team spam
-    [INFO] adding members eggs to team eggs
-    [WARNING] user eggs does not exist
-    [INFO] adding members ham to team ham
-    [INFO] adding members spam to team spam
-    [INFO] creating student repos ...
-    [INFO] created repobee-demo/eggs-master-repo-1
-    [INFO] created repobee-demo/ham-master-repo-1
-    [INFO] created repobee-demo/spam-master-repo-1
-    [INFO] created repobee-demo/eggs-master-repo-2
-    [INFO] created repobee-demo/ham-master-repo-2
-    [INFO] created repobee-demo/spam-master-repo-2
-    [INFO] pushing files to student repos ...
-    [INFO] pushing, attempt 1/3
-    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/ham-master-repo-2 master
-    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/ham-master-repo-1 master
-    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/spam-master-repo-1 master
-    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/eggs-master-repo-2 master
-    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/eggs-master-repo-1 master
-    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/spam-master-repo-2 master
-
-Note that there was a ``[WARNING]`` message for the username ``eggs``: the user
-does not exist. At KTH, this is common, as many (sometimes most) first-time
+    $ repobee setup -mn task-1 task-2 -sf students.txt
+    [INFO] Cloning into master repos ...
+    [INFO] Cloning into file:///home/slarse/tmp/task-1
+    [INFO] Cloning into file:///home/slarse/tmp/task-2
+    [INFO] Created team glennol
+    [INFO] Created team glassey
+    [INFO] Created team slarse
+    [INFO] Adding members glennol to team glennol
+    [WARNING] user glennol does not exist
+    [INFO] Adding members glassey to team glassey
+    [INFO] Adding members slarse to team slarse
+    [INFO] Creating student repos ...
+    [INFO] Created repobee-demo/glennol-task-1
+    [INFO] Created repobee-demo/glassey-task-1
+    [INFO] Created repobee-demo/slarse-task-1
+    [INFO] Created repobee-demo/glennol-task-2
+    [INFO] Created repobee-demo/glassey-task-2
+    [INFO] Created repobee-demo/slarse-task-2
+    [INFO] Pushing files to student repos ...
+    [INFO] Pushing, attempt 1/3
+    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/glassey-task-2 master
+    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/glassey-task-1 master
+    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/slarse-task-1 master
+    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/glennol-task-2 master
+    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/glennol-task-1 master
+    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/slarse-task-2 master
+
+.. note::
+
+   If you have specified the ``students_file`` option in the config file, then
+   you don't need to specify ``-sf students.txt`` on the command line. Remember
+   also that options specified on the command line always take precedence over
+   those in the configuration file, so you can override the default students
+   file if you wish by specifying ``-sf``..
+
+Note that there was a ``[WARNING]`` message for the username ``glennol``: the
+user does not exist. At KTH, this is common, as many (sometimes most) first-time
 students will not have created their GitHub accounts until sometime after the
-course starts.  These students will still have their repos created, but the
-users need to be added to their teams at a later time (to do this, simply run
-the ``setup`` command again for these students, once they have created
-accounts). This is one reason why we use teams for access privileges: it's
-easy to set everything up even when the students have yet to create their
-accounts (given that their usernames are pre-determined).
-
-And that's it, the organization is primed and the students should have access
-to their repositories!
+course starts. These students will still have their repos created, but the users
+need to be added to their teams at a later time (to do this, simply run the
+``setup`` command again for these students, once they have created accounts).
+This is one reason why we use teams for access privileges: it's easy to set
+everything up even when the students have yet to create their accounts (given
+that their usernames are pre-determined).
+
+And that's it for setting up the course, the organization is primed and the
+students should have access to their repositories!
 
 .. _Organization: https://help.github.com/articles/about-organizations/
 .. _`GitHub OAUTH docs`: https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/
diff --git a/docs/gitlab.rst b/docs/gitlab.rst
index ee2d558..8a0c325 100644
--- a/docs/gitlab.rst
+++ b/docs/gitlab.rst
@@ -2,7 +2,7 @@
 
 RepoBee and GitLab
 ******************
-As of v1.5.0, RepoBee has alpha support for GitLab. Both gitlab.com and
+As of v1.5.0, RepoBee has alpha support for GitLab. Both https://gitlab.com and
 self-hosted GitLab are supported, but currently, some commands (including all
 peer review commands) do not work. GitLab is planned to be fully supported by
 in late 2019. See :ref:`gitlab_roadmap` for details.
@@ -10,7 +10,8 @@ in late 2019. See :ref:`gitlab_roadmap` for details.
 .. note::
 
    GitLab support is currently in alpha, and may not yet be sufficiently stable
-   for production use.
+   for production use. Please report any issues on the `issue tracker
+   <https://github.com/repobee/repobee/issues/new>`_
 
 .. important::
 
diff --git a/docs/group_assignments.rst b/docs/group_assignments.rst
index 6527e2d..1ad4774 100644
--- a/docs/group_assignments.rst
+++ b/docs/group_assignments.rst
@@ -3,11 +3,6 @@
 Group assignments
 *****************
 
-.. note::
-   
-   **New in v1.3.0!** This feature is in beta phase, please report any bugs you
-   encounter on the GitHub issue tracker!
-
 .. important::
 
    The peer review commands (see :ref:`peer review`) do not currently support
@@ -16,14 +11,14 @@ Group assignments
 RepoBee supports group assignments such that multiple students are assigned to
 the same student repositories. To put students in a group, they need to be
 entered on the same line in the students file, separated by spaces. This is the
-only way to group students, the ``--s`` option on the command line does not
-support groups. As an example, if ``ham`` and ``spam`` should be in one group,
-and ``eggs`` solo, the following students file would work:
+only way to group students, the ``-s`` option on the command line does not
+support groups. As an example, if ``glassey`` and ``slarse`` should be in one group,
+and ``glennol`` solo, the following students file would work:
 
 .. code-block:: bash
 
-   ham spam
-   eggs
+   glassey slarse
+   glennol
 
 There is no difference in using RepoBee with student groups in the student
 file. For example, running the setup command from :ref:`setup` would then have
@@ -31,26 +26,26 @@ the following result:
 
 .. code-block:: bash
 
-    $ repobee setup -mn master-repo-1 master-repo-2 -sf students.txt
+    $ repobee setup -mn task-1 task-2 -sf students.txt
     [INFO] cloning into master repos ...
-    [INFO] cloning into file:///home/slarse/tmp/master-repo-1
-    [INFO] cloning into file:///home/slarse/tmp/master-repo-2
-    [INFO] created team eggs
-    [INFO] created team ham-spam
-    [INFO] adding members eggs to team eggs
-    [WARNING] user eggs does not exist
-    [INFO] adding members ham, spam to team ham-spam
+    [INFO] cloning into file:///home/slarse/tmp/task-1
+    [INFO] cloning into file:///home/slarse/tmp/task-2
+    [INFO] created team glennol
+    [INFO] created team glassey-slarse
+    [INFO] adding members glennol to team glennol
+    [WARNING] user glennol does not exist
+    [INFO] adding members glassey, slarse to team glassey-slarse
     [INFO] creating student repos ...
-    [INFO] created repobee-demo/eggs-master-repo-1
-    [INFO] created repobee-demo/ham-spam-master-repo-1
-    [INFO] created repobee-demo/eggs-master-repo-2
-    [INFO] created repobee-demo/ham-spam-master-repo-2
+    [INFO] created repobee-demo/glennol-task-1
+    [INFO] created repobee-demo/glassey-slarse-task-1
+    [INFO] created repobee-demo/glennol-task-2
+    [INFO] created repobee-demo/glassey-slarse-task-2
     [INFO] pushing files to student repos ...
     [INFO] pushing, attempt 1/3
-    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/ham-spam-master-repo-2 master
-    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/ham-spam-master-repo-1 master
-    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/eggs-master-repo-2 master
-    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/eggs-master-repo-1 master
+    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/glassey-slarse-task-2 master
+    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/glassey-slarse-task-1 master
+    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/glennol-task-2 master
+    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/glennol-task-1 master
 
 Note the naming convention for group repos:
 ``<student-1>-<student-2>-[...]-<master-repo-name>``. The associated teams
diff --git a/docs/index.rst b/docs/index.rst
index 207ef90..599ec7f 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -6,19 +6,23 @@
 Welcome to RepoBee's documentation!
 ==================================================
 
-If you are new to RepoBee, the :ref:`fundamentals` and
-:ref:`userguide` sections are must-reads. Developers looking to modify
-or utilize the core functionality in ways the CLI does not allow will be best
-served by looking at the :ref:`modindex`.
+If you are new to RepoBee, the :ref:`fundamentals` and :ref:`userguide`
+sections are must-reads. Developers looking to work on RepoBee, or fork it, are
+probably most interested in the :ref:`modindex`. Developers looking to create
+plugins should head over to the documentation for `repobee-plug
+<https://repobee-plug.readthedocs.io/en/stable>`_.
 
-.. important::
+If you use the :ref:`userguide` in any way and feel like skipping
+:ref:`getting_started`, make sure to read :ref:`configure_repobee` anyway!  The
+rest of the guide assumes a configuration as described there.
 
-    If you use the :ref:`userguide` in any way and feel like skipping
-    :ref:`getting_started`, make sure to read :ref:`configure_repobee` anyway!
-    The rest of the guide assumes a configuration as described there.
+.. important::
 
-Please open an issue and tag it with the ``docs`` tag for any bugs or missing
-information.
+   Please open an issue over on the `issue tracker
+   <https://github.com/repobee/repobee/issues/new>`_ if you find documentation
+   bugs, have trouble understanding something or think something is missing.
+   Especially when it comes to the userguide, which is intended to be as
+   intuitive as possible, please do provide feedback if you get stuck.
 
 .. toctree::
    :maxdepth: 2
diff --git a/docs/install.rst b/docs/install.rst
index 10da65e..1b68067 100644
--- a/docs/install.rst
+++ b/docs/install.rst
@@ -6,7 +6,7 @@ Install
 Requirements
 ------------
 RepoBee requires Python 3.5+ and a somewhat up-to-date version of git.
-Officially supported platforms are Ubuntu 17.04+ and macOS, but
+Officially supported operating systems are Ubuntu 17.04+ and macOS, but
 RepoBee should run fine on any Linux distribution and also on WSL_ on
 Windows 10. Please report any issues with operating systems and/or git
 versions on the `issue tracker`_.
@@ -29,45 +29,52 @@ check the version yourself with:
 
 Option 1: Install from PyPi with `pip`
 --------------------------------------
-
 The latest release of RepoBee is on PyPi, and can thus be installed as usual with pip.
 I strongly discourage system-wide pip installs (e.g. ``sudo pip install <package>``), as this
 may land you with incompatible packages in a very short amount of time. A per-user install
 can be done like this:
 
-1. Execute ``python3 -m pip install --user repobee`` to install the package.
+1. Execute ``python3 -m pip install --user --upgrade repobee`` to install the package.
 2. Run ``repobee -h`` to verify that you can find the script.
-   - If that doesn't work, the ``repobee`` script can't be found. try
-   ``python3 -m repobee.main -h`` to run the main module of RepoBee
-   (which is all the ``repobee`` script does anyway).
+    - If that doesn't work, the ``repobee`` script can't be found on your PATH
+      variable. Try ``python3 -m repobee -h`` to run the main module of RepoBee
+      (which is all the ``repobee`` script does anyway).
+
+This same install command should also be good for upgrading RepoBee to a new
+version.
+
+.. important::
+
+   Of course, if ``python`` corresponds to Python 3 on your system, use that
+   instead of ``python3`` in the command shown above.
 
 .. important::
 
     A ``--user`` install will perform a local install for the current user. Any
     scripts will be installed in a user-local bin directory. If this directory
     is not on your path (which it often is not by default), you will not be
-    able to run the ``repobee`` script (however, ``python -m repobee.main``
+    able to run the ``repobee`` script (however, ``python -m repobee``
     should still work). pip should issue a warning about this, including the
     path to the local bin directory. To resolve the problem, add the local bin
-    directory to your $PATH variable.
+    directory to your $PATH variable. When installing, pip will usually complain
+    that the bin directory is not on the $PATH variable and point out where the
+    directory is located.
 
 .. _clone repo:
 
 Option 2: Clone the repo and the install with `pip`
 ---------------------------------------------------
-
 If you want the dev version, you will need to clone the repo, as only release versions are uploaded
 to PyPi. Unless you are planning to work on this yourself, I suggest going with the release version.
 
 1. Clone the repo with git:
     - ``git clone https://github.com/repobee/repobee``
 2. ``cd`` into the project root directory with ``cd repobee``.
-3. Install the requirements with ``python3 -m pip install -r requirements.txt``
-    - To be able to run the tests, you must install the ``requirements.test.txt`` file.
-4. Install locally with ``pip``.
-    - ``python3 -m pip install --user .``, this will create a local install for the current user.
+3. Install locally with ``pip``.
+    - ``python3 -m pip install --user --upgrade .``, this will create a local
+      install for the current user.
     - Or just ``pip install .`` if you use ``virtualenv``.
-    - For development, use ``pip install -e .`` in a ``virtualenv``.
+    - For development, use ``pip install -e .[TEST]`` in a ``virtualenv``.
 
 .. _WSL: https://docs.microsoft.com/en-us/windows/wsl/install-win10
 .. _issue tracker: https://github.com/repobee/repobee/issues
diff --git a/docs/issues.rst b/docs/issues.rst
index e200267..dd6c1c2 100644
--- a/docs/issues.rst
+++ b/docs/issues.rst
@@ -3,10 +3,13 @@ Opening and Closing issues (the ``open-issues`` and ``close-issues`` commands)
 Sometimes, the best way to handle an error in a repo is to simply notify
 affected students about it. This is especially true if the due date for the
 assignment is rapidly approaching, and most students have already started
-modifying their repositories. Therefore, RepoBee provides the
-``open-issues`` command, which can open issues in bulk. When the time is right
-(perhaps after the deadline has passed), issues can be closed with the
-``close-issues`` command.
+modifying their repositories. There can also be cases where you want to make
+general announcements, or communicate some other action item that's best highly
+related to the code that the students are writing. Therefore, RepoBee provides
+the ``open-issues`` command, which can open issues in bulk. When the time is
+right, issues can be closed with the ``close-issues`` command. Finally,
+``list-issues`` provides a way of quickly seeing what issues are open and closed
+in student repositories.
 
 .. _open:
 
@@ -17,25 +20,26 @@ to write a Markdown-formatted issue. Just like with the ``update`` command, the
 **first line of the file is the title**. Here is ``issue.md``:
 
 .. code-block:: none
+   :caption: issue.md
 
-    An important announcement
+   An important announcement
 
-    ### Dear students
-    I have this important announcement to make.
+   ### Dear students
+   I have this important announcement to make.
 
-    Regards,
-    _The Announcer_
+   Regards,
+   _The Announcer_
 
-Awesome, that's an excellent issue. Let's open it in the ``master-repo-2`` repo
-for our dear students ``spam``, ``eggs`` and ``ham``, who are listed in the
+Awesome, that's an excellent issue. Let's open it in the ``task-2`` repo
+for our dear students ``slarse``, ``glennol`` and ``glassey``, who are listed in the
 ``students.txt`` file (see :ref:`setup`).
 
 .. code-block:: bash
 
-    $ repobee open-issues -mn master-repo-2 -sf students.txt -i issue.md
-    [INFO] Opened issue spam-master-repo-2/#1-'An important announcement'
-    [INFO] Opened issue eggs-master-repo-2/#1-'An important announcement'
-    [INFO] Opened issue ham-master-repo-2/#1-'An important announcement'
+    $ repobee open-issues -mn task-2 -sf students.txt -i issue.md
+    [INFO] Opened issue slarse-task-2/#1-'An important announcement'
+    [INFO] Opened issue glennol-task-2/#1-'An important announcement'
+    [INFO] Opened issue glassey-task-2/#1-'An important announcement'
 
 From the output, we can read that in each of the repos, an issue with the title
 ``An important announcement`` was opened as issue nr 1 (``#1``). The number
@@ -46,7 +50,7 @@ correctly. And that's it! Neat, right?
 
 Closing Issues
 --------------
-Now that the deadline has passed for ``master-repo-2``, we want to close the
+Now that the deadline has passed for ``task-2``, we want to close the
 issues opened in open_. The ``close-issues`` command takes a *regex* that runs
 against titles. All issues with matching titles are closed. While you *can*
 make this really difficult, closing all issues with the title ``An important
@@ -54,10 +58,10 @@ announcement`` is simple: we provide the regex ``\AAn important announcement\Z``
 
 .. code-block:: bash
 
-    $ repobee close-issues -mn master-repo-2 -sf students.txt -r '\AAn important announcement\Z'
-    [INFO] closed issue spam-master-repo-2/#1-'An important announcement'
-    [INFO] closed issue eggs-master-repo-2/#1-'An important announcement'
-    [INFO] closed issue ham-master-repo-2/#1-'An important announcement'
+    $ repobee close-issues -mn task-2 -sf students.txt -r '\AAn important announcement\Z'
+    [INFO] Closed issue slarse-task-2/#1-'An important announcement'
+    [INFO] Closed issue glennol-task-2/#1-'An important announcement'
+    [INFO] Closed issue glassey-task-2/#1-'An important announcement'
 
 And there we go, easy as pie!
 
@@ -81,10 +85,10 @@ issues like so:
 
 .. code-block:: bash
 
-    $ repobee list-issues -mn master-repo-2 -sf students.txt
-    [INFO] spam-master-repo-2/#1:  Grading Criteria created 2018-09-12 18:20:56 by glassey
-    [INFO] eggs-master-repo-2/#1:  Grading Criteria created 2018-09-12 18:20:56 by glassey
-    [INFO] ham-master-repo-2/#1:   Grading Criteria created 2018-09-12 18:20:56 by glassey
+    $ repobee list-issues -mn task-2 -sf students.txt
+    [INFO] slarse-task-2/#1:  Grading Criteria created 2018-09-12 18:20:56 by glassey
+    [INFO] glennol-task-2/#1:  Grading Criteria created 2018-09-12 18:20:56 by glassey
+    [INFO] glassey-task-2/#1:   Grading Criteria created 2018-09-12 18:20:56 by glassey
 
 So, just grading critera issues posted by the user ``glassey``. What happened to
 the important announcements? Well, they are closed. If we want to se closed
@@ -92,10 +96,10 @@ issues, we must specifically say so with the ``--closed`` argument.
 
 .. code-block:: bash
 
-    $ repobee list-issues -mn master-repo-2 -sf students.txt --closed
-    [INFO] spam-master-repo-2/#2:  An important announcement created 2018-09-17 17:46:43 by slarse
-    [INFO] eggs-master-repo-2/#2:  An important announcement created 2018-09-17 17:46:43 by slarse
-    [INFO] ham-master-repo-2/#2:   An important announcement created 2018-09-17 17:46:43 by slarse
+    $ repobee list-issues -mn task-2 -sf students.txt --closed
+    [INFO] slarse-task-2/#2:  An important announcement created 2018-09-17 17:46:43 by slarse
+    [INFO] glennol-task-2/#2:  An important announcement created 2018-09-17 17:46:43 by slarse
+    [INFO] glassey-task-2/#2:   An important announcement created 2018-09-17 17:46:43 by slarse
 
 Other interesting arguments include ``--all`` for both open and closed issues,
 ``--show-body`` for showing the body of each issue, and ``--author <username>``
diff --git a/docs/migrate.rst b/docs/migrate.rst
index be4152c..a03b319 100644
--- a/docs/migrate.rst
+++ b/docs/migrate.rst
@@ -7,7 +7,7 @@ may have repos that should be accessible to students and need to be moved
 across course rounds, or you might be storing your master repos in the target
 organization and need to migrate them for each new course round. To migrate
 repos into the target organization, they must be local on disc. Assuming we
-have the repos ``master-repo-1`` and ``master-repo-2`` in the current working
+have the repos ``task-1`` and ``task-2`` in the current working
 directory (i.e. local repos), all we have to do is this:
 
 .. note::
@@ -19,14 +19,14 @@ directory (i.e. local repos), all we have to do is this:
 
 .. code-block:: bash
 
-    $ repobee migrate -mn master-repo-1 master-repo-2
-    [INFO] cloning into file:///some/directory/path/master-repo-1
-    [INFO] cloning into file:///some/directory/path/master-repo-2
-    [INFO] created repobee-demo/master-repo-1
-    [INFO] created repobee-demo/master-repo-2
+    $ repobee migrate -mn task-1 task-2
+    [INFO] cloning into file:///some/directory/path/task-1
+    [INFO] cloning into file:///some/directory/path/task-2
+    [INFO] created repobee-demo/task-1
+    [INFO] created repobee-demo/task-2
     [INFO] pushing, attempt 1/3
-    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/master-repo-1 master
-    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/master-repo-2 master
+    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/task-1 master
+    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/task-2 master
     [INFO] done!
 
 .. important::
@@ -38,23 +38,24 @@ directory (i.e. local repos), all we have to do is this:
 What happens here is pretty straightforward, except for the local repos being
 cloned, which is an implementation detail that does not need to be thought
 further of. Note that only the defualt branch is actually migrated, and pushed
-to ``master`` in the new repo. local repos are pushed to the ``master`` branch
+to ``master`` in the new repo. Local repos are pushed to the ``master`` branch
 of the remote repo. Migrating several branches is something that we've never
-had a need to do, but if you do, please open an issue on GitHub with a feature
-request. ``migrate`` is perfectly safe to run several times, in case you think
-you missed something, or need to update repos. Running the same thing again
-without changing the local repos yields the following output:
+had a need to do, but if you do, please `open an issue on GitHub
+<https://github.com/repobee/repobee/issues/new>`_ with a feature request.
+``migrate`` is perfectly safe to run several times, in case you think you
+missed something, or need to update repos. Running the same thing again without
+changing the local repos yields the following output:
 
 .. code-block:: bash
 
-    $ repobee migrate -mn master-repo-1 master-repo-2
-    [INFO] cloning into file:///some/directory/path/master-repo-1
-    [INFO] cloning into file:///some/directory/path/master-repo-2
-    [INFO] repobee-demo/master-repo-1 already exists
-    [INFO] repobee-demo/master-repo-2 already exists
+    $ repobee migrate -mn task-1 task-2
+    [INFO] cloning into file:///some/directory/path/task-1
+    [INFO] cloning into file:///some/directory/path/task-2
+    [INFO] repobee-demo/task-1 already exists
+    [INFO] repobee-demo/task-2 already exists
     [INFO] pushing, attempt 1/3
-    [INFO] https://some-enterprise-host/repobee-demo/master-repo-1 master is up-to-date
-    [INFO] https://some-enterprise-host/repobee-demo/master-repo-2 master is up-to-date
+    [INFO] https://some-enterprise-host/repobee-demo/task-1 master is up-to-date
+    [INFO] https://some-enterprise-host/repobee-demo/task-2 master is up-to-date
     [INFO] done!
 
 In fact, all RepoBee commands that deal with pushing to or cloning from
diff --git a/docs/peer.rst b/docs/peer.rst
index ae44c16..953c1a3 100644
--- a/docs/peer.rst
+++ b/docs/peer.rst
@@ -15,100 +15,52 @@ algorithm` for other available review allocation schemes.
 
 .. important::
 
-   The commands ``assign-peer-reviews``,
-   ``purge-peer-review-teams`` and ``check-peer-review-progress`` have been
-   renamed ``assign-reviews``, ``purge-review-teams`` and ``check-reviews``,
-   respectively. The functionality is unchanged, and the old commands will
-   continue to work until ``v2.0.0`` is released. At that point, the old
-   commands will be removed.
+   Peer review functionality has yet to be implemented for:
+
+   1. The ``gitlab`` plugin.
+   2. Student groups.
+
+   Both of these are planned features, but have no current ETA.
 
 .. _assign reviews:
 
 Getting started with peer reviews using ``assign-reviews``
 =================================================================
-The bulk of the work is performed by ``assign-reviews``. Let's have a
-look at the help message (i.e. run ``repobee assign-reviews -h``):
-
-.. code-block:: bash
-
-    $ repobee assign-reviews -h
-    usage: repobee assign-reviews [-h]
-                                   (-sf STUDENTS_FILE | -s STUDENTS [STUDENTS ...])
-                                   [-o ORG_NAME] [-bu BASE_URL] [-t TOKEN]
-                                   [-tb] -mn MASTER_REPO_NAMES
-                                   [MASTER_REPO_NAMES ...] [-n N] [-i ISSUE]
-
-    For each student repo, create a review team with pull access named
-    <student>-<master_repo_name>-review and randomly assign other students to it.
-    All students are assigned to the same amount of review teams, as specified by
-    `--num-reviews`. Note that `--num-reviews` must be strictly less than the
-    amount of students.
-
-    optional arguments:
-      -h, --help            show this help message and exit
-      -sf STUDENTS_FILE, --students-file STUDENTS_FILE
-                            Path to a list of student usernames.
-      -s STUDENTS [STUDENTS ...], --students STUDENTS [STUDENTS ...]
-                            One or more whitespace separated student usernames.
-      -o ORG_NAME, --org-name ORG_NAME
-                            Name of the target organization
-      -bu BASE_URL, --base-url BASE_URL
-                            Base url to a GitHub v3 API. For enterprise, this is
-                            usually `https://<HOST>/api/v3`
-      -t TOKEN, --token TOKEN
-                            OAUTH token for the GitHub instance. Can also be
-                            specified in the `REPOBEE_OAUTH` environment
-                            variable.
-      -tb, --traceback      Show the full traceback of critical exceptions.
-      -mn MASTER_REPO_NAMES [MASTER_REPO_NAMES ...], --master-repo-names MASTER_REPO_NAMES [MASTER_REPO_NAMES ...]
-                            One or more names of master repositories. Names must
-                            either refer to local directories, or to master
-                            repositories in the target organization.
-      -n N, --num-reviews N
-                            Assign each student to review n repos (consequently,
-                            each repo is reviewed by n students). n must be
-                            strictly smaller than the amount of students.
-      -i ISSUE, --issue ISSUE
-                            Path to an issue to open in student repos. If
-                            specified, this issue will be opened in each student
-                            repo, and the body will be prepended with user
-                            mentions of all students assigned to review the repo.
-                            NOTE: The first line is assumed to be the title.
-
-Most of this, we've seen before. The only non-standard arguments are
-``--issue`` and ``--num-reviews``, the former of which we've actually already
-seen in the ``open-issues`` command (see :ref:`open`). I will assume that both
-``--base-url`` and ``--org-name`` are already configured in the
-configuration file (if you don't know what this mean, have a look at
+The bulk of the work is performed by ``assign-reviews``. Most of its arguments
+it has in common with the other commands of RepoBee. The only non-standard
+arguments are ``--issue`` and ``--num-reviews``, the former of which we've
+actually already seen in the ``open-issues`` command (see :ref:`open`). I will
+assume that both ``--base-url`` and ``--org-name`` are already configured in
+the configuration file (if you don't know what this mean, have a look at
 :ref:`config`). Thus, the only things we must specify are
 ``--students/--students-file`` and ``--num-reviews`` (``--issue`` is optional,
-more on that later). Let's make a minimal call with the
-``assign-reviews`` command, and then inspect the log output to figure
-out what happened. Recall that ``students.txt`` lists our three favorite
-students spam, ham and eggs (see :ref:`setup`).
+more on that later). Let's make a minimal call with the ``assign-reviews``
+command, and then inspect the log output to figure out what happened. Recall
+that ``students.txt`` lists our three favorite students slarse, glassey and glennol (see
+:ref:`setup`).
 
 .. code-block:: bash
 
-    $ repobee assign-reviews -mn master-repo-1 -sf students.txt --num-reviews 2
+    $ repobee assign-reviews -mn task-1 -sf students.txt --num-reviews 2
     # step 1
-    [INFO] created team spam-master-repo-1-review
-    [INFO] created team eggs-master-repo-1-review
-    [INFO] created team ham-master-repo-1-review
+    [INFO] created team slarse-task-1-review
+    [INFO] created team glennol-task-1-review
+    [INFO] created team glassey-task-1-review
     # step 2
-    [INFO] adding members eggs, ham to team spam-master-repo-1-review
-    [INFO] adding members ham, spam to team eggs-master-repo-1-review
-    [INFO] adding members spam, eggs to team ham-master-repo-1-review
+    [INFO] adding members glennol, glassey to team slarse-task-1-review
+    [INFO] adding members glassey, slarse to team glennol-task-1-review
+    [INFO] adding members slarse, glennol to team glassey-task-1-review
     # steps 3 and 4, interleaved
-    [INFO] opened issue eggs-master-repo-1/#1-'Peer review'
-    [INFO] adding team eggs-master-repo-1-review to repo eggs-master-repo-1 with 'pull' permission
-    [INFO] opened issue ham-master-repo-1/#2-'Peer review'
-    [INFO] adding team ham-master-repo-1-review to repo ham-master-repo-1 with 'pull' permission
-    [INFO] opened issue spam-master-repo-1/#2-'Peer review'
-    [INFO] adding team spam-master-repo-1-review to repo spam-master-repo-1 with 'pull' permission
+    [INFO] opened issue glennol-task-1/#1-'Peer review'
+    [INFO] adding team glennol-task-1-review to repo glennol-task-1 with 'pull' permission
+    [INFO] opened issue glassey-task-1/#2-'Peer review'
+    [INFO] adding team glassey-task-1-review to repo glassey-task-1 with 'pull' permission
+    [INFO] opened issue slarse-task-1/#2-'Peer review'
+    [INFO] adding team slarse-task-1-review to repo slarse-task-1 with 'pull' permission
 
 The following steps were performed:
 
-1. One review team per repo was created (``<student>-master-repo-1-review``).
+1. One review team per repo was created (``<student>-task-1-review``).
 2. Two students were added to each review team. Note that these allocations are
    _random_. For obvious resons, there can be at most ``num_students-1`` peer
    reviews per repo. So, in this case, we are at the maximum.
@@ -140,7 +92,7 @@ Specifying a custom issue
 -------------------------
 The default issue is really meant to be replaced with something more specific to
 the course and assignment. For example, say that there were five tasks in the
-``master-repo-2`` repo, and the students should review tasks 2 and 3 based on
+``task-2`` repo, and the students should review tasks 2 and 3 based on
 some criteria. It would then be beneficial to specify this in the peer review
 issue, so we'll write up our own little issue to replace the default one.
 Remember that the first line is taken to be the title, in exactly the same way
@@ -148,7 +100,7 @@ as issue files are treated in :ref:`open`.
 
 .. code-block:: none
 
-    Review of master-repo-2
+    Review of task-2
 
     Hello! The students assigned to this issue have been tasked to review this
     repo. Each of you should open _one_ issue with the title `Peer review` and
@@ -171,19 +123,19 @@ specifying the issue like this:
 
 .. code-block:: bash
 
-    $ repobee assign-reviews -mn master-repo-2 -sf students.txt --num-reviews 2 --issue issue.md
-    [INFO] created team spam-master-repo-2-review
-    [INFO] created team eggs-master-repo-2-review
-    [INFO] created team ham-master-repo-2-review
-    [INFO] adding members ham, eggs to team spam-master-repo-2-review
-    [INFO] adding members spam, ham to team eggs-master-repo-2-review
-    [INFO] adding members eggs, spam to team ham-master-repo-2-review
-    [INFO] opened issue eggs-master-repo-2/#2-'Review of master-repo-2'
-    [INFO] adding team eggs-master-repo-2-review to repo eggs-master-repo-2 with 'pull' permission
-    [INFO] opened issue ham-master-repo-2/#2-'Review of master-repo-2'
-    [INFO] adding team ham-master-repo-2-review to repo ham-master-repo-2 with 'pull' permission
-    [INFO] opened issue spam-master-repo-2/#2-'Review of master-repo-2'
-    [INFO] adding team spam-master-repo-2-review to repo spam-master-repo-2 with 'pull' permission
+    $ repobee assign-reviews -mn task-2 -sf students.txt --num-reviews 2 --issue issue.md
+    [INFO] created team slarse-task-2-review
+    [INFO] created team glennol-task-2-review
+    [INFO] created team glassey-task-2-review
+    [INFO] adding members glassey, glennol to team slarse-task-2-review
+    [INFO] adding members slarse, glassey to team glennol-task-2-review
+    [INFO] adding members glennol, slarse to team glassey-task-2-review
+    [INFO] opened issue glennol-task-2/#2-'Review of task-2'
+    [INFO] adding team glennol-task-2-review to repo glennol-task-2 with 'pull' permission
+    [INFO] opened issue glassey-task-2/#2-'Review of task-2'
+    [INFO] adding team glassey-task-2-review to repo glassey-task-2 with 'pull' permission
+    [INFO] opened issue slarse-task-2/#2-'Review of task-2'
+    [INFO] adding team slarse-task-2-review to repo slarse-task-2 with 'pull' permission
 
 As you can tell from the last few lines, the title is the one specified in the
 issue, and not the default title as it was before. And that's pretty much it for
@@ -199,15 +151,15 @@ organization with a ton of teams. Once the deadline has passed and all peer
 reviews are done, there is little reason to keep them (in my mind). Therefore,
 the ``purge-review-teams`` command can be used to remove all peer review
 teams for a given set of student repos. Let's say that we're completely done
-with the peer reviews of ``master-repo-1``, and want to remove the review teams.
+with the peer reviews of ``task-1``, and want to remove the review teams.
 It's as simple as:
 
 .. code-block:: bash
 
-    $ repobee purge-review-teams -mn master-repo-1 -sf students.txt
-    [INFO] deleted team eggs-master-repo-1-review
-    [INFO] deleted team ham-master-repo-1-review
-    [INFO] deleted team spam-master-repo-1-review
+    $ repobee purge-review-teams -mn task-1 -sf students.txt
+    [INFO] deleted team glennol-task-1-review
+    [INFO] deleted team glassey-task-1-review
+    [INFO] deleted team slarse-task-1-review
 
 And that's it, the review teams are gone. If you also want to close the related
 issues, you can simply use the ``close-issues`` command for that (see
@@ -220,30 +172,30 @@ Messing up and getting back on track
 Let's say you messed something up with allocating the peer reviews. For example,
 if you left out a student, there is no easy way to rectify the allocations such
 that that student is included. Let's say we did just that, and forgot to include
-the student ``cabbage`` in the reviews for ``master-repo-2`` back at
+the student ``cabbage`` in the reviews for ``task-2`` back at
 :ref:`assign reviews`. We then do the following:
 
 1. Check if any reviews have already been posted. This can easily be performed
-   with ``repobee list-issues -mn master-repo-2 -sf students.txt -r '^Peer
+   with ``repobee list-issues -mn task-2 -sf students.txt -r '^Peer
    review$'`` (assuming the naming conventions were followed!). Take appropriate
    action if you find any reviews already posted (appropriate being anything you
    see fit to alleviate the situation of affected students possibly being
    assigned new repos to review).
-2. Purge the review teams with ``repobee purge-review-teams -mn master-repo-2
+2. Purge the review teams with ``repobee purge-review-teams -mn task-2
    -sf students.txt``
-3. Close all review issues with ``repobee close-issues -mn master-repo-2 -sf
-   students.txt -r '^Review of master-repo-2$'``
+3. Close all review issues with ``repobee close-issues -mn task-2 -sf
+   students.txt -r '^Review of task-2$'``
 4. Create a new ``issue.md`` file apologetically explaining that you messed up:
 
 .. code-block:: none
 
-    Review of master-repo-2 (for real this time!)
+    Review of task-2 (for real this time!)
 
     Sorry, I messed up with the allocations previously. Disregard the previous
     allocations (repo access has been revoked anyway).
 
 5. Assign peer reviews again, with the new issue, with ``repobee
-   assign-reviews -mn master-repo-2 -sf students.txt --num-reviews 2
+   assign-reviews -mn task-2 -sf students.txt --num-reviews 2
    --issue issue.md``
 
 And that's it! Disaster averted.
@@ -266,8 +218,8 @@ scheme, you add ``-p pairwise`` in front of the command.
 
 .. code-block:: bash
 
-    $ repobee -p pairwise assign-reviews -mn master-repo-1 -sf students.txt
+    $ repobee -p pairwise assign-reviews -mn task-1 -sf students.txt
 
 Note that the pairwise algorithm ignores the ``--num-reviews`` argument, and
 will issue a warning if this is set (to anything but 1, but you should just not
-specify it). For more details on plugins in ``repobee``, :ref:`plugins`.
+specify it). For more details on plugins in RepoBee, :ref:`plugins`.
diff --git a/docs/plugins.rst b/docs/plugins.rst
index 9925e52..ac5298a 100644
--- a/docs/plugins.rst
+++ b/docs/plugins.rst
@@ -5,10 +5,7 @@ Plugins for ``repobee``
 RepoBee defines a fairly simple but powerful plugin system that allows
 programmers to hook into certain execution points. To read more about the
 details of these hooks (and how to write your own plugins), see the
-`repobee-plug docs`_. Currently, plugins can hook into the ``clone`` command
-to perform arbitrary tasks on the cloned repos (such as running test classes),
-and the ``assign-reviews`` command, to change the way reviews are
-assigned.
+`repobee-plug docs`_.
 
 .. _configure_plugs:
 
@@ -17,19 +14,19 @@ Using Existing Plugins
 You can specify which plugins you want to use either by adding them to the
 configuration file, or by specifying them on the command line. Personally,
 I find it most convenient to specify plugins on the command line. To do this,
-we can use the ``-p|--plug`` option *before* any other options. The reson the
-plugins must go before any other options is that some plugins add command line
-arguments, and must therefore be parsed separately. As an example, we can
-activate the builtins_ ``javac`` and ``pylint`` like this:
+use ``-p|--plug`` option *before* any other options. The reson the plugins must
+go before any other options is that some plugins alter the command line
+interface of RepoBee, and must therefore be parsed separately. As an example,
+you can activate the builtins_ ``javac`` and ``pylint`` like this:
 
 .. code-block:: bash
 
-    $ repobee -p pylint -p javac clone -mn master-repo-1 -sf students.txt
+    $ repobee -p pylint -p javac clone -mn task-1 -sf students.txt
 
-This will clone the repos, and the run the plugins on the repos. We can also
-specify the default plugins we'd like to use in the configuration file by adding
-the ``plugins`` option under the ``[DEFAULT]`` section. Here is an example of
-using the builtins_ ``javac`` and ``pylint``.
+This will clone the repos, and the run the plugins on the repos. You can also
+specify the default plugins you would like to use in the configuration file by
+adding the ``plugins`` option under the ``[DEFAULT]`` section. Here is an
+example of using the builtins_ ``javac`` and ``pylint``.
 
 .. code-block:: bash
 
@@ -38,17 +35,17 @@ using the builtins_ ``javac`` and ``pylint``.
 
 Like with all other configuration values, they are only used if no command line
 options are specified. If you have defaults specified, but want to run without
-any plugins, you can use the ``--no-plugins``, which disables plugins.
+any plugins, you can use the ``--no-plugins`` argument, which disables plugins.
 
 .. important::
 
-    The order plugins are specified in is significant and implies the execution
+    The order plugins are specified in is significant and defines the execution
     order of the plugins. This is useful for plugins that rely on the results
     of other plugins. This system for deciding execution order may be
     overhauled in the future, if anyone comes up with a better idea.
 
-Some plugins can be further configured in the configuration file by adding
-new headers. See the documentation of the specific plugins/
+Some plugins can be further configured in the configuration file by adding new
+headers. See the documentation of the specific plugins for details on that.
 
 .. _builtins:
 
@@ -60,12 +57,18 @@ RepoBee ships with two API plugins, one for GitHub
 use GitLab, you must specify the ``gitlab`` plugin either on the command line
 or in the configuration file.
 
+Built-in subcommand plugins
+===========================
+The ``config-wizard`` command is actually a plugin, which loads by default.
+It's mostly implemented as a plugin for demonstrational purposes, showing how
+to add a command to RepoBee. See :py:mod:`repobee.ext.configwizard` for the
+source code.
+
 Built-in plugins for ``repobee assign-reviews``
 =====================================================
 RepoBee ships with two plugins for the ``assign-reviews`` command.  The
-first of these is the :py:mod:`~repobee.ext.defaults` plugin, which provides
-the default allocation algorithm. As the name suggests, this plugin is loaded
-by default, without the user specifying anything. The second plugin is the
+first of these is located in the :py:mod:`~repobee.ext.defaults` plugin, and
+just randomly allocates student to review each other. The second plugin is the
 :py:mod:`~repobee.ext.pairwise` plugin. This plugin will divide ``N`` students
 into ``N/2`` groups of 2 students (and possibly one with 3 students, if ``N``
 is odd), and have them peer review the other person in the group. The intention
@@ -161,7 +164,7 @@ define some defaults:
 
 .. important::
 
-    If the configuration file exeists, it *must* contain the ``[DEFAULTS]``
+    If the configuration file exists, it *must* contain the ``[DEFAULTS]``
     header, even if you don't put anything in that section. This is to minimize
     the risk of subtle misconfiguration errors by novice users. If you only
     want to configure plugins, just add the ``[DEFAULTS]`` header by itself,
diff --git a/docs/update.rst b/docs/update.rst
index 3fab044..cf7239d 100644
--- a/docs/update.rst
+++ b/docs/update.rst
@@ -12,28 +12,28 @@ repos.
 
 Scenario 1: Repos are unchanged
 -------------------------------
-Let's say that we've updated ``master-repo-1``, and that users ``spam``,
-``ham`` and ``eggs`` should get the updates. Then, we simply run
+Let's say that we've updated ``task-1``, and that users ``slarse``,
+``glassey`` and ``glennol`` should get the updates. Then, we simply run
 ``update`` like this:
 
 .. code-block:: bash
 
-    $ repobee update -mn master-repo-1 -s spam eggs ham
-    [INFO] cloning into master repos ...
-    [INFO] cloning into https://some-enterprise-host/repobee-demo/master-repo-1
-    [INFO] pushing files to student repos ...
-    [INFO] pushing, attempt 1/3
-    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/spam-master-repo-1 master
-    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/eggs-master-repo-1 master
-    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/ham-master-repo-1 master
-    [INFO] done!
+    $ repobee update -mn task-1 -s slarse glennol glassey
+    [INFO] Cloning into master repos ...
+    [INFO] Cloning into https://some-enterprise-host/repobee-demo/task-1
+    [INFO] Pushing files to student repos ...
+    [INFO] Pushing, attempt 1/3
+    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/slarse-task-1 master
+    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/glennol-task-1 master
+    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/glassey-task-1 master
+    [INFO] Done!
 
-That's all there is to it for this super simple case. But what if ``ham`` had
-started working on ``ham-master-repo-1``?
+That's all there is to it for this super simple case. But what if ``glassey`` had
+started working on ``glassey-task-1``?
 
 .. note::
 
-    Here, ``-s spam eggs ham`` was used to directly specify student usernames on
+    Here, ``-s slarse glennol glassey`` was used to directly specify student usernames on
     the command line, instead of pointing to a students file with ``-sf
     students.txt``. All commands that require you to specify student usernames
     can be used with either the ``-s|--students`` or the ``-sf|--students-file``
@@ -41,17 +41,16 @@ started working on ``ham-master-repo-1``?
 
 Scenario 2: At least 1 repo altered
 -----------------------------------
-Let's assume now that ``ham`` has started working on the repo. Since we do not
-``force`` pushes (that would be irresponsible!) to the student repos, the
-push to ``ham-master-repo-1`` will be rejected. This is good, we don't want to
-overwrite a student's progress because we messed up with the original
-repository. There are a number of things one *could* do in this situation, but
-in RepoBee, we opted for a very simple solution: open an issue in the
-student's repo that explains the situation.
+Let's assume now that ``glassey`` has started working on the repo. Since we do not
+force pushes to the student repos, the push to ``glassey-task-1`` will be
+rejected. This is good, we don't want to overwrite a student's progress because
+we messed up with the original repository. There are a number of things one
+*could* do in this situation, but in RepoBee, we opted for a very simple
+solution: open an issue in the student's repo that explains the situation.
 
 .. important::
 
-    If we don't specify an issue to ``repobee update``, rejected pushes will
+    If you don't specify an issue to ``repobee update``, rejected pushes will
     simply be ignored.
 
 So, let's first create that issue. It should be a Markdown-formatted file, and
@@ -59,14 +58,15 @@ the **first line in the file will be used as the title**. Here's an example
 file called ``issue.md``.
 
 .. code-block:: none
+   :caption: issue.md
 
-    This is a nice title
+   This is a nice title
 
-    ### Sorry, we messed up!
-    There are some grave issues with your repo, and since you've pushed to the
-    repo, you need to apply these patches yourself.
+   ### Sorry, we messed up!
+   There are some grave issues with your repo, and since you've pushed to the
+   repo, you need to apply these patches yourself.
 
-    <EXPLAIN CHANGES>
+   <EXPLAIN CHANGES>
 
 Something like that. If the students have used ``git`` for a while, it may be
 enough to include the ouptut from ``git diff``, but for less experienced
@@ -75,39 +75,39 @@ students, plain text is more helpful. Now it's just a matter of using
 
 .. code-block:: bash
 
-    $ repobee update -mn master-repo-1 -s spam eggs ham -i issue.md
-    [INFO] cloning into master repos ...
-    [INFO] cloning into https://some-enterprise-host/repobee-demo/master-repo-1
-    [INFO] pushing files to student repos ...
-    [INFO] pushing, attempt 1/3
-    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/spam-master-repo-1 master
-    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/eggs-master-repo-1 master
-    [ERROR] Failed to push to https://some-enterprise-host/repobee-demo/ham-master-repo-1
+    $ repobee update -mn task-1 -s slarse glennol glassey -i issue.md
+    [INFO] Cloning into master repos ...
+    [INFO] Cloning into https://some-enterprise-host/repobee-demo/task-1
+    [INFO] Pushing files to student repos ...
+    [INFO] Pushing, attempt 1/3
+    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/slarse-task-1 master
+    [INFO] Pushed files to https://some-enterprise-host/repobee-demo/glennol-task-1 master
+    [ERROR] Failed to push to https://some-enterprise-host/repobee-demo/glassey-task-1
     return code: 128
-    fatal: repository 'https://some-enterprise-host/repobee-demo/ham-master-repo-1/' not found
+    fatal: repository 'https://some-enterprise-host/repobee-demo/glassey-task-1/' not found
     [WARNING] 1 pushes failed ...
-    [INFO] pushing, attempt 2/3
-    [ERROR] Failed to push to https://some-enterprise-host/repobee-demo/ham-master-repo-1
+    [INFO] Pushing, attempt 2/3
+    [ERROR] Failed to push to https://some-enterprise-host/repobee-demo/glassey-task-1
     return code: 128
-    fatal: repository 'https://some-enterprise-host/repobee-demo/ham-master-repo-1/' not found
+    fatal: repository 'https://some-enterprise-host/repobee-demo/glassey-task-1/' not found
     [WARNING] 1 pushes failed ...
-    [INFO] pushing, attempt 3/3
-    [ERROR] Failed to push to https://some-enterprise-host/repobee-demo/ham-master-repo-1
+    [INFO] Pushing, attempt 3/3
+    [ERROR] Failed to push to https://some-enterprise-host/repobee-demo/glassey-task-1
     return code: 128
-    fatal: repository 'https://some-enterprise-host/repobee-demo/ham-master-repo-1/' not found
+    fatal: repository 'https://some-enterprise-host/repobee-demo/glassey-task-1/' not found
     [WARNING] 1 pushes failed ...
     [INFO] Opening issue in repos to which push failed
-    [INFO] Opened issue ham-master-repo-1/#1-'Nice title'
-    [INFO] done!
+    [INFO] Opened issue glassey-task-1/#1-'Nice title'
+    [INFO] Done!
 
-Note that RepoBee tries to push 3 times before finally giving up and
-opening an issue. This is because pushes can fail for other reasons than
-rejections, such as timeouts and other network errors.
+Note that RepoBee tries to push 3 times before finally giving up and opening an
+issue, as a failed push could be due to any number of reasons, such as
+connection issues and misaligned planets.
 
 .. note::
 
     If you forget to specify the ``-i|--issue`` argument and get a rejection,
     you may simply rerun ``update`` and add it. All updated repos will
-    simply be listed as ``up-to-date``, and the rejecting repos will still
-    reject the push! However, be careful not to run ``update`` with ``-i``
-    multiple times, as it will then open the same issue multiple times.
+    simply be listed as ``up-to-date`` (which is a successful update!), and the
+    rejecting repos will still reject the push. However, be careful not to run
+    ``update`` with ``-i`` multiple times, as it will then open multiple issues.
diff --git a/src/_repobee/cli.py b/src/_repobee/cli.py
index 56c3240..bdb7779 100644
--- a/src/_repobee/cli.py
+++ b/src/_repobee/cli.py
@@ -22,6 +22,7 @@ import daiquiri
 import repobee_plug as plug
 
 import _repobee
+from _repobee import plugin
 from _repobee import command
 from _repobee import util
 from _repobee import tuples
@@ -591,15 +592,26 @@ class _OrderedFormatter(argparse.HelpFormatter):
         super().add_arguments(actions)
 
 
+def create_parser_for_docs():
+    """Create a parser showing all options for the default CLI
+    documentation.
+    """
+    daiquiri.setup(level=logging.FATAL)
+    # load default plugins
+    plugin.initialize_plugins()
+    ext_commands = plug.manager.hook.create_extension_command()
+    return _create_parser(show_all_opts=True, ext_commands=ext_commands)
+
+
 def _create_parser(show_all_opts, ext_commands):
     """Create the parser."""
 
     parser = argparse.ArgumentParser(
         prog="repobee",
         description=(
-            "A CLI tool for administering large amounts of git repositories "
+            "A CLI tool for administrating large amounts of git repositories "
             "on GitHub and GitLab instances. See the full documentation at "
-            "https://_repobee.readthedocs.io"
+            "https://repobee.readthedocs.io"
         ),
         formatter_class=_OrderedFormatter,
     )


Test patch:
diff --git a/tests/unit_tests/test_cli.py b/tests/unit_tests/test_cli.py
index cf7a91e..932031c 100644
--- a/tests/unit_tests/test_cli.py
+++ b/tests/unit_tests/test_cli.py
@@ -1,20 +1,22 @@
 import os
 import argparse
 import pathlib
+import argparse
 from unittest.mock import MagicMock
 from unittest import mock
 
 import pytest
+import repobee_plug as plug
 
 import repobee_plug as plug
 
 import _repobee
 import _repobee.ext
 import _repobee.ext.github
+import _repobee.plugin
 from _repobee import cli
 from _repobee import exception
 from _repobee import apimeta
-from _repobee import plugin
 
 import constants
 import functions
@@ -80,8 +82,15 @@ def api_class_mock(mocker, api_instance_mock):
 @pytest.fixture(autouse=True)
 def load_default_plugins(api_instance_mock):
     """Load the default plugins after mocking the GitHubAPI."""
-    loaded = plugin.load_plugin_modules()
-    plugin.register_plugins(loaded)
+    loaded = _repobee.plugin.load_plugin_modules()
+    _repobee.plugin.register_plugins(loaded)
+
+
+@pytest.fixture
+def no_plugins(load_default_plugins):
+    """Unregister any registered plugins."""
+    for plugin in plug.manager.get_plugins():
+        plug.manager.unregister(plugin=plugin)
 
 
 @pytest.fixture
@@ -329,6 +338,13 @@ def test_help_calls_add_arguments(monkeypatch, parser):
     assert called
 
 
+def test_create_parser_for_docs(no_plugins):
+    """Test that the docs parser initializes correctly."""
+    parser = cli.create_parser_for_docs()
+
+    assert isinstance(parser, argparse.ArgumentParser)
+
+
 class TestBaseParsing:
     """Test the basic functionality of parsing."""