Repository: Accenture/sfmc-devtools
Pull request #514 (2022-11-06 21:22:29)

4.1.8
release


Patch:
diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml
index 63f4a9c9..48dea028 100644
--- a/.github/ISSUE_TEMPLATE/bug.yml
+++ b/.github/ISSUE_TEMPLATE/bug.yml
@@ -39,6 +39,7 @@ body:
           label: Version
           description: What version of our software are you running? (mcdev --version)
           options:
+              - 4.1.8
               - 4.1.7
               - 4.1.6
               - 4.1.5
diff --git a/README.md b/README.md
index f3c139f6..78009865 100644
--- a/README.md
+++ b/README.md
@@ -25,7 +25,7 @@ Accenture Salesforce Marketing Cloud DevTools (mcdev) is a rapid deployment/roll
   - [2.6 Using mcdev in other node packages](#26-using-mcdev-in-other-node-packages)
 - [3. Updating Accenture SFMC DevTools](#3-updating-accenture-sfmc-devtools)
 - [4. Troubleshoot Install/Update](#4-troubleshoot-installupdate)
-  - [4.1. Installing specific version](#41-installing-specific-version)
+  - [4.1. Installing a specific version](#41-installing-a-specific-version)
   - [4.2. Using custom CLIs](#42-using-custom-clis)
   - [4.3. Missing write access to...on MacOS](#43-missing-write-access-toon-macos)
   - [4.4. ...running scripts is disabled on this system](#44-running-scripts-is-disabled-on-this-system)
@@ -123,7 +123,7 @@ If you experience issues installing Accenture SFMC DevTools, please check out th
 1. Install Accenture SFMC DevTools by running `npm install -g mcdev` (prefix with `sudo` on MacOS)
    - If you get an error, please see the below troubleshooting section.
 
-When completed run `mcdev --version` and it will show you which version you installed (e.g. `4.1.7`).
+When completed run `mcdev --version` and it will show you which version you installed (e.g. `4.1.8`).
 
 > **_Side note for proud nerds_:**
 >
@@ -135,12 +135,12 @@ When completed run `mcdev --version` and it will show you which version you inst
 
 <a id="markdown-initial-project-setup" name="initial-project-setup"></a>
 
-After the successful installation, you will now need to setup the connection to your Marketing Cloud instance.
+After the successful installation, you will now need to set up the connection to your Marketing Cloud instance.
 
 1. In your Marketing Cloud instance
    1. Ensure that you **selected** your **Parent/Global Business Unit**.
    2. Go to `Setup -> Apps -> Installed Packages`.
-   3. Create a new installed package and name it "Accenture SFMC DevTools Deployment Tool"
+   3. Create a new "installed package" and name it "Accenture SFMC DevTools Deployment Tool"
       > Note: On some older SFMC instances it will ask you if you want the enhanced version. Please enable this option.
    4. Click on the _Add Component_ button and select `API Integration` with `Server-To-Server` mode.
    5. Make sure you grant all available rights.
@@ -155,15 +155,15 @@ After the successful installation, you will now need to setup the connection to
          > Being specific here reduces the chance of deploying to the wrong server (instance) in stressful situations. We suggest you use something like `ClientName`, or `ClientName-ProjectName` if you have multiple projects with the same client. In case your project uses multiples instances you might like to use something like `Client-ProjectName-Sandbox` and `Client-ProjectName-PROD`.
       3. It will then continue to ask for the EID (Parent MID), client ID, client secret and Authentication Base URI.
       4. The credentials will be automatically tested & your list of BUs downloaded until finally the central configuration file `.mcdevrc.json` gets created in your project folder.
-      5. Last step is to download an initial backup and commit it into git. No worries - the wizard does that for you!
+      5. The last step is to download an initial backup and commit it into git. No worries - the wizard does that for you!
    3. If this is the first time you set up Accenture SFMC DevTools or you recently upgraded Accenture SFMC DevTools, please restart VS Code now! A pop-up will likely appear in the lower right corner prompting you to install recommended extensions.
    4. Done.
 3. Sharing the project with your team
    1. Make sure you have a Git repo (Bitbucket, GitHub, GitLab) set up somewhere. If you are an SI partner, usually, your client will have to do this for you.
       > While running `mcdev init`, the tool already made sure to set up a local Git repo for you. Now, you need to upload ("push") it to the online repo:
    2. Open the URL of your online repo and find the "CLONE" button. This will likely show you a normal URL, ending on ".git"
-   3. Add this as your repository remote named "origin". If you use a GUI based tool, that should be fairly simple, otherwise execute `git remote add origin YOUR-URL` in your project folder.
-   4. Now run `git push -u origin master` to actually start the upload.
+   3. Add this as your repository remote named "origin". If you use a GUI-based tool, that should be fairly simple, otherwise, execute `git remote add origin YOUR-URL` in your project folder.
+   4. Now run `git push -u origin master` to start the upload.
 
 ### 2.4. Joining a project that was set up before
 
@@ -178,14 +178,14 @@ If Accenture SFMC DevTools was already used to set up the project by somebody in
 4. now execute `git clone YOUR-REPO-URL`. This will create a sub-folder with the name of the repo and download everything for you into it (e.g. `C:\repos\YOUR-REPO\`)
 5. Still in the command prompt, execute `cd YOUR-REPO`. This will switch your current folder (visible before the command prompt) to the new repo folder (`C:\repos\YOUR-REPO\`).
 6. Assuming you installed Accenture SFMC DevTools globally (recommended!), now execute `mcdev init`.
-7. At this point the system will recognize the previously set up project and ask you for `EID (Parent MID)`, `Client ID`, `Client Secret` and the `Authentication Base URI`.
+7. At this point, the system will recognize the previously set up project and ask you for `EID (Parent MID)`, `Client ID`, `Client Secret` and the `Authentication Base URI`.
 8. Done.
 
 ### 2.5. Recommended additional installs
 
 <a id="markdown-recommended-additional-installs" name="recommended-additional-installs"></a>
 
-The following seeks to enhance your daily process. Our guide assumes that you are using [Visual Studio Code](https://code.visualstudio.com/download) to develop, backup and deploy your project. For smooth operations we highly recommend the following Marketing Cloud specific plugins for it.
+The following seeks to enhance your daily process. Our guide assumes that you are using [Visual Studio Code](https://code.visualstudio.com/download) to develop, backup and deploy your project. For smooth operations, we highly recommend the following Marketing Cloud specific plugins for it.
 
 Nevertheless, Accenture SFMC DevTools will run without them and is not associated with the development of these publicly available apps & plugins.
 
@@ -208,15 +208,15 @@ The "Workspace Recommendations" were defined by Accenture SFMC DevTools. Clickin
 **Node modules:**
 
 - [eslint](https://npmjs.com/package/eslint): code linting
-- [eslint-config-prettier](http://npmjs.com/package/eslint-config-prettier): ensures that prettier and eslint dont have conflicting rules
+- [eslint-config-prettier](http://npmjs.com/package/eslint-config-prettier): ensures that prettier and eslint do not have conflicting rules
 - [eslint-config-ssjs](http://npmjs.com/package/eslint-config-ssjs): allows you to have accurate code linting in \*.SSJS files
 - [eslint-plugin-jsdoc](http://npmjs.com/package/eslint-plugin-jsdoc): will help you write proper jsdoc comments in your SSJS code
-- [eslint-plugin-prettier](http://npmjs.com/package/eslint-plugin-prettier): runs prettier and eslint together
+- [eslint-plugin-prettier](http://npmjs.com/package/eslint-plugin-prettier): runs prettier and ESlint together
 - [prettier](https://prettier.io): opinionated code formatter
 - [npm-check](http://npmjs.com/package/npm-check): makes it easier to keep your node modules up-to-date
 - [sfmc-boilerplate](http://npmjs.com/package/sfmc-boilerplate): build tool for your more complex email, cloudpage and automation code.
 
-Please note that Visual Studio Code might warn you about using the local installation of ESLint with a pop up like the following. Please confirm this with `Allow` or, if you are certain about what you are doing, with `Allow Everywhere`. Inside of Accenture SFMC DevTools project folders this warning is normal, because we ask to install the VSCode extension and the node module for ESLint.
+Please note that Visual Studio Code might warn you about using the local installation of ESLint with a pop-up like the following. Please confirm this with `Allow` or, if you are certain about what you are doing, with `Allow Everywhere`. Inside of Accenture SFMC DevTools project folders this warning is normal because we ask to install the VSCode extension and the node module for ESLint.
 
 ![VSCode Eslint install warning](img/README.md/vscode-eslint-allow_everywhere.jpg)
 
@@ -260,7 +260,7 @@ npm update -g mcdev
 
 <a id="markdown-troubleshoot-install%2Fupdate" name="troubleshoot-install%2Fupdate"></a>
 
-### 4.1. Installing specific version
+### 4.1. Installing a specific version
 
 <a id="installing-specific-version" name="installing-specific-version"></a>
 
@@ -277,10 +277,10 @@ _Note: Regardless of which tag or branch you install_
 **Install specific version (using a version tag on npm):**
 
 ```bash
-npm install -g mcdev@4.1.7
+npm install -g mcdev@4.1.8
 ```
 
-**Warning**: When you used the above method to install Accenture SFMC DevTools for a specific version or tag, trying to [update Accenture SFMC DevTools](#updating-mcdev) might not download the most recently published official version but instead stay on the version or branch you previously selected (in the above examples: develop, 4.1.7)!
+**Warning**: When you used the above method to install Accenture SFMC DevTools for a specific version or tag, trying to [update Accenture SFMC DevTools](#updating-mcdev) might not download the most recently published official version but instead stay on the version or branch you previously selected (in the above examples: develop, 4.1.8)!
 
 > **Note**: The version is currently _not_ updated on the developer branch until a new release is published. Hence, you will not see a change if you run `mcdev --version`.
 
@@ -290,7 +290,7 @@ npm install -g mcdev@4.1.7
 
 Some users of Accenture SFMC DevTools prefer to use git bash or other CLIs instead of the operating system's default. Please note that some of the functionality of Accenture SFMC DevTools but also of other tools like the Node package manager (npm) do not necessarily function properly in these.
 
-If you encounter problems, we strongly recommend to first try it in the default CLI.
+If you encounter problems, we strongly recommend first trying it in the default CLI.
 
 <a name="missing-write-access-toon-macos"></a>
 
@@ -298,7 +298,7 @@ If you encounter problems, we strongly recommend to first try it in the default
 
 <a id="markdown-missing-write-access-to...on-macos" name="missing-write-access-to...on-macos"></a>
 
-Depending on your setup, the default global installs & updates might error out with "Missing write access to /usr/local/lib/node_modules". In this case prefix your command with `sudo`:
+Depending on your setup, the default global installs & updates might error out with "Missing write access to /usr/local/lib/node_modules". In this case, prefix your command with `sudo`:
 
 ```bash
 sudo npm install -g mcdev
@@ -322,7 +322,7 @@ Steps to solve this:
 
 1. Start Windows PowerShell with the "Run as Administrator" option.
 2. Input the following and then hit ENTER: `set-executionpolicy remotesigned`
-3. This will likely show a lenghty message with a question to confirm the change (screenshot below). Please type `y` (="yes") and confirm with `Enter`.
+3. This will likely show a lengthy message with a question to confirm the change (screenshot below). Please type `y` (="yes") and confirm with `Enter`.
 
 ![Execution Policy](img/README.md/troubleshoot-execution_policy-2.png)
 
@@ -435,7 +435,7 @@ The following description will assume a global installation for simplicity reaso
 
 _Note:_ Parameters listed below in between square brackets = `[...]` are optional parameters. Required parameters are listed in between less-than / greater-than signs = `<...>`.
 
-_Note:_ Credentials and Business Unit names can always be selected interactively. Try inputing a questionmark = `?` in their place if more parameters follow, or omit them completely if no other parameters are required for a command.
+_Note:_ Credentials and Business Unit names can always be selected interactively. Try inputting a question mark = `?` in their place if more parameters follow, or omit them completely if no other parameters are required for a command.
 
 ### 6.1. Maintenance and setup commands
 
@@ -449,11 +449,11 @@ _Command:_ `mcdev init`
 
 _Alias:_ -
 
-Creates the basic configuration file `.mcdevrc.json` and `.mcdev-auth.json` in your project directory. You may add more credentials by re-running the same command again, e.g. to add produciton and sandbox credentials next to each other.
+Creates the basic configuration file `.mcdevrc.json` and `.mcdev-auth.json` in your project directory. You may add more credentials by re-running the same command again, e.g. to add production and sandbox credentials next to each other.
 
-In addition, it initializes an npm package for your, installs recommended npm dependencies and places our default IDE configuration files for ESLint, Prettier, Git and VSCode into your project directory.
+In addition, it initializes an npm package for you, installs recommended npm dependencies and places our default IDE configuration files for ESLint, Prettier, Git and VSCode into your project directory.
 
-The initialization ends with the creation of your Git repository and a first backup of your SFMC instance.
+The initialization ends with the creation of your Git repository and the first backup of your SFMC instance.
 
 _Example - initialize project / add additional credentials:_
 
@@ -469,7 +469,7 @@ mcdev init yourCredentialName
 
 The interactive setup will ask you for an `EID (Parent MID)`, `Client ID` and `Client Secret` of an installed package. It also asks for the `Authentication Base Uri`. Each installed package on a given SFMC instance shares the same tenant sub-domain and always shows you 3 domains (Auth, REST and SOAP).
 
-Example url: `https://mcg123abcysykllg-0321cbs8bbt64.auth.marketingcloudapis.com`
+Example URL: `https://mcg123abcysykllg-0321cbs8bbt64.auth.marketingcloudapis.com`
 
 > **Note to CLI experts:**
 >
@@ -487,7 +487,7 @@ _Command:_ `mcdev upgrade`
 
 _Alias:_ `mcdev up`
 
-This upgrades older Accenture SFMC DevTools projects to the newest standard: Outdated Accenture SFMC DevTools configuration files are upgraded and the right npm dependencies are installed. It also copies in the right IDE configuration files. See [init](#init) for more details.
+This upgrades older Accenture SFMC DevTools projects to the newest standard: Outdated Accenture SFMC DevTools configuration files are upgraded and the right npm dependencies are installed. It also copies the right IDE configuration files into your project folder. See [init](#init) for more details.
 
 _Example:_
 
@@ -519,7 +519,7 @@ _Command:_ `mcdev badKeys [business unit]`
 
 _Alias:_ -
 
-Lists all metadata for which the External key is not in synch with the name to enable you to update them quickly.
+Lists all metadata for which the External key is not in sync with the name to enable you to update them quickly.
 
 _Example:_
 
@@ -535,7 +535,7 @@ _Command:_ `mcdev document <business unit> <TYPE>`
 
 _Alias:_ `mcdev doc`
 
-Creates human readable documentation for your metadata. This command is executed by default for supported types unless you changed your config manually (`metaDataTypes.documentOnRetrieve`). Therefore, running it manually is typically not required. You can choose to generate **HTML** (`html`) or **Markdown** (`md`) docs via `options.documentType`.
+Creates human-readable documentation for your metadata. This command is executed by default for supported types unless you changed your config manually (`metaDataTypes.documentOnRetrieve`). Therefore, running it manually is typically not required. You can choose to generate **HTML** (`html`) or **Markdown** (`md`) docs via `options.documentType`.
 
 The default format is set to `md` as Markdown renders nicely in Git as well as in VSCode's Markdown preview and can be copied from there into Confluence and other applications without losing the formatting.
 
@@ -564,7 +564,7 @@ _Command:_ `mcdev selectTypes`
 
 _Alias:_ `mcdev st`
 
-Allows you to interactive select which metadata is retrieved when you run the `retrieve` command. Try out `explainTypes` first to understand what each type means.
+Allows you to interactively select which metadata is retrieved when you run the `retrieve` command. Try out `explainTypes` first to understand what each type means.
 
 _Example:_
 
@@ -582,7 +582,7 @@ _Command:_ `mcdev explainTypes`
 
 _Alias:_ `mcdev et`
 
-A helper command for `selectTypes` that prints out a table that defines what the various types actually are.
+A helper command for `selectTypes`. It prints out a table that defines what the various types are.
 
 Types marked as not-default should be ignored. These are either under development or merely meant to support contributing to Accenture SFMC DevTools.
 
@@ -612,7 +612,7 @@ _Example:_
 mcdev retrieve MyProject/DEV
 ```
 
-You can ommit the Business Unit which will trigger and interactive mode based on your config:
+You can omit the Business Unit which will trigger an interactive mode based on your config:
 
 _Example:_
 
@@ -629,7 +629,9 @@ mcdev retrieve MyProject
 
 **retrieve specific type:**
 
-If you want to retrieve only a certain metadata type, let's say `script`, then pass this type in as a second parameter. The other types will remain untouched and in place, if you've previously retrieved them.<br>Similarly, you can pass in multiple comma-separated types but make sure to put them in double-quotes in order to work on all systems.
+If you want to retrieve only a certain metadata type, let's say `script`, then pass this type in as a second parameter. The other types will remain untouched and in place, if you've previously retrieved them.
+
+Similarly, you can pass in multiple comma-separated types but make sure to put them in double quotes to work on all systems.
 
 _Example:_
 
@@ -638,9 +640,9 @@ mcdev retrieve MyProject/DEV script
 mcdev retrieve MyProject/DEV "script,query,automation"
 ```
 
-**retrieve sepcific type and key:**
+**retrieve specific type and key:**
 
-If you wish you may also specify exact keys that need to be retrieved, filtering down on whats in your retrieve folder even further. Specified keys apply as a filter for all types you specify. If your naming convention does not allow for such an aggregation then please run seperate commands for each type.
+If you wish you may also specify the exact keys that need to be retrieved, filtering down on what's in your retrieve folder even further. Specified keys apply as a filter for all types you specify. If your naming convention does not allow for such an aggregation then please run separate commands for each type.
 
 _Example:_
 
@@ -684,13 +686,15 @@ _Example:_
 mcdev deploy MyProject/DEV
 ```
 
-Only metadata that you copied into the **deploy** directory will be deployed. Please keek in mind that the folder structure needs to be similar to what the retrieve command creates in the retrieve folder, including the credentials and Business Unit name.
+Only metadata that you copied into the **deploy** directory will be deployed. Please keep in mind that the folder structure needs to be similar to what the retrieve command creates in the retrieve folder, including the credentials and Business Unit name.
 
 Similarly to `mcdev retrieve` you can also use the interactive mode to select credential and/or Business Unit.
 
 **deploy sepcific type:**
 
-If you want to deploy only a certain metadata type, let's say `dataExtension`, then pass this type in as a second parameter. If there are other types in the current BU's deploy folder, these will be ignored and hence _not_ uploaded.<br>Similarly, you can pass in multiple comma-separated types but make sure to put them in double-quotes in order to work on all systems.
+If you want to deploy only a certain metadata type, let's say `dataExtension`, then pass this type in as a second parameter. If there are other types in the current BU's deploy folder, these will be ignored and hence _not_ uploaded.
+
+Similarly, you can pass in multiple comma-separated types but make sure to put them in double quotes to work on all systems.
 
 _Example:_
 
@@ -699,9 +703,9 @@ mcdev deploy MyProject/DEV dataExtension
 mcdev deploy MyProject/DEV "script,dataExtension,importFile"
 ```
 
-**deploy sepcific type and key:**
+**deploy specific type and key:**
 
-If you wish you may also specify exact keys that need to be deployed, filtering down on whats in your deploy folder even further. Specified keys apply as a filter for all types you specify. If your naming convention does not allow for such an aggregation then please run seperate commands for each type.
+If you wish you may also specify the exact keys that need to be deployed, filtering down on what's in your deploy folder even further. Specified keys apply as a filter for all types you specify. If your naming convention does not allow for such an aggregation then please run separate commands for each type.
 
 _Example:_
 
@@ -713,7 +717,7 @@ mcdev deploy MyProject/DEV "script,dataExtension,importFile" "key1,key2"
 
 **deploy from retrieve folder:**
 
-Sometimes it's convenient to deploy right from the retrieve folder when you are using mcdev as a developer tool rather than only for deployments to other BUs. For this scenario we added the 4th parameter. In that case it does not look into `deploy/` but into `retrieve/` to find what it needs to deploy.
+Sometimes it's convenient to deploy right from the retrieve folder when you are using mcdev as a developer tool rather than only for deployments to other BUs. For this scenario we added the 4th parameter. In that case, it does not look into `deploy/` but into `retrieve/` finding what it needs to deploy.
 
 _Example:_
 
@@ -725,7 +729,7 @@ mcdev deploy MyProject/DEV "script,dataExtension,importFile" "key1,key2" true
 
 **deploy all BUs:**
 
-A special variant of this command allows you to dpeloy all Business Units of a given credential at once.
+A special variant of this command allows you to deploy all Business Units of a given credential at once.
 _Example:_
 
 ```bash
@@ -778,7 +782,7 @@ _Alias:_ `mcdev rt`
 
 The `rt` command retrieves metadata from the server and uses your `market` configuration in `.mcdevrc.json` to replace strings with variables. The result is then stored in your `template/` folder. Please note that files stored here will keep their original name, despite this possibly containing market-specific suffixes or similar. Also note, that contrary to the deploy & retrieve folders, you will not see credential- or Business Unit-sub-folders here.
 
-This command is a prerequisite for the `buildDefintion` command. Alternatively though, you can copy-paste retrieved metadata from your `retrieve/` folder to your `template/` folder and update it manually - or even create it from scratch.
+This command is a prerequisite for the `buildDefintion` command. Alternatively, you can copy-paste retrieved metadata from your `retrieve/` folder to your `template/` folder and update it manually - or even create it from scratch.
 
 > **Note**: Before using this command, you need to configure your markets first! Check out our guide on [Market Configuration](#market-configuration) to understand how to use templating and prepare your market config.
 
@@ -814,9 +818,9 @@ _Command:_ `mcdev buildTemplate <business unit> <type> <name> <market>`
 
 _Alias:_ `mcdev bt`
 
-The `bt` command uses previously retrieved metadata on the your local computer and uses your `market` configuration in `.mcdevrc.json` to replace strings with variables. The result is then stored in your `template/` folder. Please note that files stored here will keep their original name, despite this possibly containing market-specific suffixes or similar. Also note, that contrary to the deploy & retrieve folders, you will not see credential- or Business Unit-sub-folders here.
+The `bt` command uses previously retrieved metadata on your local computer and uses your `market` configuration in `.mcdevrc.json` to replace strings with variables. The result is then stored in your `template/` folder. Please note that files stored here will keep their original name, despite this possibly containing market-specific suffixes or similar. Also note, that contrary to the deploy & retrieve folders, you will not see credential- or Business Unit-sub-folders here.
 
-This command is a prerequisite for the `buildDefintion` command. Alternatively though, you can copy-paste retrieved metadata from your `retrieve/` folder to your `template/` folder and update it manually - or even create it from scratch.
+This command is a prerequisite for the `buildDefintion` command. Alternatively, you can copy-paste retrieved metadata from your `retrieve/` folder to your `template/` folder and update it manually - or even create it from scratch.
 
 > **Note**: Before using this command, you need to configure your markets first! Check out our guide on [Market Configuration](#market-configuration) to understand how to use templating and prepare your market config.
 
@@ -852,10 +856,10 @@ _Command:_ `mcdev buildDefinition <business unit> <type> <name> <market>`
 
 _Alias:_ `mcdev bd`
 
-The `buildDefinition` command allows to prepare deployments to one or multiple targets based on templates and [Market Configuration](#market-configuration).
+The `buildDefinition` command allows to prepare the deployments to one or multiple targets based on templates and [Market Configuration](#market-configuration).
 After you have created your templates via `retrieveAsTemplate` (or manually) in your `template/dataExtension/` folder run this command to create the final deployable files in your respective `retrieve/<business unit>/` folder.
 
-This allows you to double-check if you actually changed something by comparing the before and after using your favorite Git client. You then have to manually copy files you want to deploy into the respective `deploy/` folder.
+This allows you to double-check if you actually changed something by comparing the before and after using your favorite Git client. You then have to manually copy the files you want to deploy into the respective `deploy/` folder.
 
 > **Note**: Before using this command, you need to configure your markets first! Check out our guide on [Market Configuration](#market-configuration) to understand how to use templating and prepare your market config.
 
@@ -873,7 +877,7 @@ This will result in the following files being created in your `retrieve/MyProjec
 
 **buildDefinition for multiple sources:**
 
-You can also create defintions based on multiple templates at once. Simply specify them in a comma-separated list and put that list in quotes:
+You can also create definitions based on multiple templates at once. Simply specify them in a comma-separated list and put that list in quotes:
 
 ```bash
 mcdev bd MyProject/QA dataExtension "table1,table2,table3" pilotMarketDEV1
@@ -913,7 +917,7 @@ _Command:_ `mcdev createDeltaPkg [range] [filter]`
 
 _Alias:_ `mcdev cdp`
 
-This command is rather versitile and hence can be used in multiple ways. The most powerful option presents itself when you configure `options.deployment.sourceTargetMapping` to point to a source `marketList` (usually for DEV-BU with a DEV market) and a target `marketList` (e.g. to a QA BU-market combo and a Production BU-market combo). Given this is configured, it can create all deployable files using Accenture SFMC DevTools's templating engine on the fly for you.
+This command is rather versatile and hence can be used in multiple ways. The most powerful option presents itself when you configure `options.deployment.sourceTargetMapping` to point to a source `marketList` (usually for DEV-BU with a DEV market) and a target `marketList` (e.g. to a QA BU-market combo and a Production BU-market combo). Given this is configured, it can create all deployable files using Accenture SFMC DevTools's templating engine on the fly for you.
 
 The **minimum configuration** you need to have in your config could look something like the following:
 
@@ -972,7 +976,7 @@ The **minimum configuration** you need to have in your config could look somethi
 
 **Interactive commit selection:**
 
-This allows you to compare your latest commit (**not** what's still only unstaged/staged) with previous commits. This approach is especially useful if you are a in charge of the deployment and simply want to compare the latest commits to your master / release branch with the commit that was last deployed.
+This allows you to compare your latest commit (**not** what's still only unstaged/staged) with previous commits. This approach is especially useful if you are in charge of the deployment and simply want to compare the latest commits to your master / release branch with the commit that was last deployed.
 
 > **Important**: Make sure you are on the branch corresponding to the environment you want to deploy to, e.g. the master branch.
 
@@ -1040,13 +1044,13 @@ mcdev createDeltaPkg d21b4221..HEAD 'MyProject/BU1,MyProject/BU3'
 
 <a id="markdown-advanced-configuration" name="advanced-configuration"></a>
 
-The tools confiuration can be changed in the file `.mcdevrc.json` located in the root of your project folder.
+The tool's configuration can be changed in the file `.mcdevrc.json` located in the root of your project folder.
 
 It contains [Market Configuration](#market-configuration) (`markets: { ... }`), [Market List Configuration](#market-list-configuration) (`marketList: { ... }`) the list of usable Business Units per credentials, `directories`, as well as other `options`.
 
 You will also find the configuration for what metadata shall be retrieved here in `metaDataTypes.retrieve: [ ... ]`.
 
-You will also find a secondary file named `.mcdev-auth.json` containing your credentials. **Do not commit this to your repository!** You should only commit `.mcdevrc.json` as this file contains project wide settings that do not compromise security.
+You will also find a secondary file named `.mcdev-auth.json` containing your credentials. **Do not commit this to your repository!** You should only commit `.mcdevrc.json` as this file contains project-wide settings that do not compromise security.
 
 ### 7.1. Config Options
 
@@ -1121,9 +1125,7 @@ The central config in `.mcdevrc.json` holds multiple adjustable settings:
 
 #### 7.2.1. Retention Policy fields in Data Extensions
 
-<a id="markdown-retention-policy-fields-in-data-extensions" name="retention-policy-fields-in-data-extensions"></a>
-
-The way retention policy is saved is a bit misleading and hence we wanted to provide a bit of guidance if you ever need to do a deep dive here.
+The way the retention policy is saved is a bit misleading and hence we wanted to provide a bit of guidance if you ever need to do a deep dive here.
 
 | Field                                | Description                                                                                                                                                                                                                                                                                                                        | Values                                                                 |
 | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | ------------ |
@@ -1229,13 +1231,13 @@ All you have to do is deploy the data extension again with Name_new specified fo
 
 <a id="markdown-market-configuration" name="market-configuration"></a>
 
-You will want to setup configs for variable parts that change inbetween Business Units. We advise starting this _after_ you've first run the `retrieveAsTemplate` command. This might sound counterintuitive but when you review what was copied into your template folder you will likely spot these variable parts the fastest and can then start setting up your market config. Please consider this an iterative process as you will likely run `rt` followed by another update of your config multiple times until you got it right.
+You will want to set up configs for variable parts that change in between Business Units. We advise starting this _after_ you've first run the `retrieveAsTemplate` command. This might sound counterintuitive but when you review what was copied into your template folder you will likely spot these variable parts the fastest and can then start setting up your market config. Please consider this an iterative process as you will likely run `rt` followed by another update of your config multiple times until you got it right.
 
-We advise clustering your logical approach into variable things on the **instance parent** (=`_ParentBU_` in Accenture SFMC DevTools), the **environment parent** (under which you cluster your child Business Units for DEV, QA and PROD respectively), and **child Business Units**. Ideally, the instance parent is only used to deploy _Shared Data Extensions_, the environent parent is used for integrations with external services and to separate incoming data via Automations into the respective _Shared Data Extensions_. The child Business Units are then reserved for everything that is run on a market-by-market basis.
+We advise clustering your logical approach into variable things on the **instance parent** (=`_ParentBU_` in Accenture SFMC DevTools), the **environment parent** (under which you cluster your child Business Units for DEV, QA and PROD respectively), and **child Business Units**. Ideally, the instance parent is only used to deploy _Shared Data Extensions_, the environment parent is used for integrations with external services and to separate incoming data via Automations into the respective _Shared Data Extensions_. The child Business Units are then reserved for everything that is run on a market-by-market basis.
 
-_Note:_ We do see it often that instance parent and environment parent are one and the same. This is depending on your client's setup, since Business Units are not for free and clients sometimes decide to save the extra money. Sometimes, you even end up with only one BU for DEV activities, no QA environment - and share the instance parent between DEV and production... This is not the recommnded approach for multiple reasons, including security, but it is the reality in some of our projects.
+_Note:_ We do see it often that instance parent and environment parent are the same. This is depending on your client's setup since Business Units are not for free and clients sometimes decide to save the extra money. Sometimes, you even end up with only one BU for DEV activities, no QA environment - and share the instance parent between DEV and production... This is not the recommended approach for multiple reasons, including security, but it is the reality in some of our projects.
 
-Here a simple example with one DEV BU, 1 QA BU and 2 PROD BUs:
+Here is a simple example with one DEV BU, 1 QA BU and 2 PROD BUs:
 
 ```json
 // example market config in your .mcdevrc.json
@@ -1271,7 +1273,7 @@ Here a simple example with one DEV BU, 1 QA BU and 2 PROD BUs:
 }
 ```
 
-Way more complex example with dedicated "Parent" BUs per enviroment (DEV, QA, PROD) and multiple country-specific BUs for QA and for PROD:
+Way more complex example with dedicated "Parent" BUs per environment (DEV, QA, PROD) and multiple country-specific BUs for QA and for PROD:
 
 ```json
 // example market config in your .mcdevrc.json
@@ -1353,7 +1355,7 @@ Way more complex example with dedicated "Parent" BUs per enviroment (DEV, QA, PR
 
 <a id="markdown-market-list-configuration" name="market-list-configuration"></a>
 
-Market Lists are very powerful and you will quickly notice how much time they can safe you during your deployment preparation.
+Market Lists are very powerful and you will quickly notice how much time they can save you during your deployment preparation.
 Let's first look at an example list config:
 
 ```json
@@ -1424,13 +1426,12 @@ Way more complex example:
 ```
 
 First off, we don't see DEV in here. If you have more than one market in DEV then this might deviate but in general, you don't want to bulk-deploy to DEV as this is your single source of truth.
-
-Apart from that we can see 4 types of lists here:
+Apart from that, we can see 4 types of lists here:
 
 1. `Parent-shared` (_instance parent_): This would be used to deploy the Shared Data Extensions to the instance parent. The child-configs are listed in an array to ensure we end up with one file per child in our parent BU folder.
 2. `Parent-medium`/`Parent-large` (medium:_instance parent_; large:_environment parent_): A 1:1 config that handles automations and the part of your solution that only runs on the parent.
 3. `Parent-medium-multi`/`Parent-large-multi` (medium:_instance parent_; large:_environment parent_): Any scripts, queries, automations that are executed on the parent but require one per child (e.g. query to fill country-specific Shared Data Extensions)
-4. `Children` (_child BUs_): everything that is needed on the market specific Business Units.
+4. `Children` (_child BUs_): everything that is needed on the market-specific Business Units.
 
 ## 8. Examples
 
@@ -1458,13 +1459,13 @@ where `<BU>` needs to be replaced with `credentialName/businessUnit-Name` that i
 
 Run this command for each of your defined Business Units and this will result in a **retrieve** directory with a sub-directory for each Business Unit. Each sub-directory contains the metadata from this Business Unit that is currently supported to **retrieve**.
 
-This folder structure can be commited into a git repository and used as backup.
+This folder structure can be committed into a git repository and used as a backup.
 
 ### 8.3. Automation Deployment
 
 <a id="markdown-automation-deployment" name="automation-deployment"></a>
 
-Now we want to deploy an Automation with it's related metadata. Select a retrieved Automation and copy it into the deploy folder. (`deploy/<credential>/<BU-Name>/automation/myAutomation.meta-automation.json`)
+Now we want to deploy an Automation with its related metadata. Select a retrieved Automation and copy it into the deploy folder. (`deploy/<credential>/<BU-Name>/automation/myAutomation.meta-automation.json`)
 
 Copy all related activity metadata of this automation into the deploy folder. (_Example:_ `deploy/<credential>/<BU-Name>/query/myquery.meta-query.json` and `deploy/<credential>/<BU-Name>/query/myquery.meta-query.sql`)
 
@@ -1482,7 +1483,7 @@ If you want to enhance Accenture SFMC DevTools you are welcome to fork the repo
 
 <a id="markdown-install-guide-for-developers" name="install-guide-for-developers"></a>
 
-Instead of installing Accenture SFMC DevTools as a npm dependency from our git repo, we recommend cloning our repo and then linking it locally:
+Instead of installing Accenture SFMC DevTools as an npm dependency from our git repo, we recommend cloning our repo and then linking it locally:
 
 Assuming you cloned Accenture SFMC DevTools into `C:\repos\sfmc-devtools\` (or `~/repos/sfmc-devtools/` on Mac):
 
@@ -1491,9 +1492,9 @@ Assuming you cloned Accenture SFMC DevTools into `C:\repos\sfmc-devtools\` (or `
 3. Execute `npx husky install` to enable our git hooks.
 4. Execute `npm install -g "C:\repos\sfmc-devtools"` (this installs mcdev globally on your computer based on your cloned repo folder. Any changes you make in there will take immediate effect without the need for publishing or re-installing it).
 
-This should tell npm to create a symlink to your cloned local directoty, allowing you to see updates you make in your mcdev repo instantly.
+This should tell npm to create a symlink to your cloned local directory, allowing you to see updates you make in your mcdev repo instantly.
 
-To test your new **global** developer setup, run `mcdev --version` in CLI which should return the current version (e.g. `4.1.7`). Then, go into your mcdev repo and update the version with the suffix `-dev`, e.g. to `4.1.7-dev` and then run `mcdev --version` again to verify that your change propagates instantly.
+To test your new **global** developer setup, run `mcdev --version` in CLI which should return the current version (e.g. `4.1.8`). Then, go into your mcdev repo and update the version with the suffix `-dev`, e.g. to `4.1.8-dev` and then run `mcdev --version` again to verify that your change propagates instantly.
 
 > **Not recommended:** Alternatively, you can install it locally only by opening a terminal in your project directory and executing `npm install --save-dev "C:\repos\sfmc-devtools"`
 > To run the local version you need to prepend "npx" before your commands, e.g. `npx mcdev --version`
@@ -1502,9 +1503,9 @@ To test your new **global** developer setup, run `mcdev --version` in CLI which
 
 **Local vs. Global developer installation:**
 
-If you use Accenture SFMC DevTools in your team it is recommended to install your developer version **globally**, while the project's package.json should point to our Git repo in its devDependency section. Otherwise other team members would have trouble due to potentially different paths.
+If you use Accenture SFMC DevTools in your team it is recommended to install your developer version **globally**, while the project's package.json should point to our Git repo in its devDependency section. Otherwise, other team members would have trouble due to potentially different paths.
 
-If you do need to install it locally, make sure you don't commit your project's package.json with this change or you might break mcdev for other developers in your team that either didn't clone the Accenture SFMC DevTools repo or stored in a different directory.
+If you do need to install it locally, make sure you don't commit your project's package.json with this change or you might break mcdev for other developers in your team who either didn't clone the Accenture SFMC DevTools repo or stored it in a different directory.
 
 <a name="local-install"></a>
 
@@ -1520,7 +1521,7 @@ The following explains how you _could_ install it locally for certain edge cases
 1. Create a new folder for your upcoming SFMC project. Let's assume you named it `MyProject/`
    > _Note:_ It is best practice to create a separate project folder for each of your client projects to avoid accidentally overwriting the wrong BU.
 2. Now, open a command line interface (CLI) for that folder.
-   - In Windows, you can easily do that by pressing SHIFT + Right click into that folder and then selecting the option "Open PowerShell window here".
+   - In Windows, you can easily do that by pressing SHIFT + Right-click into that folder and then selecting the option "Open PowerShell window here".
    - Alternatively, you could use any other CLI. We recommend opting for [Visual Studio Code](https://code.visualstudio.com/download)'s "Terminal" as you can benefit from this later.
    - Your CLI prompt should look something like `PS C:\repos\MyProject>` on Windows or `~/repos/MyProject/` on Mac.
 3. Initialize your new SFMC project by running `npm init`.
@@ -1531,7 +1532,7 @@ The following explains how you _could_ install it locally for certain edge cases
 4. Afterwards, install Accenture SFMC DevTools by running `npm install --save-dev mcdev`
    - If you get an error, please see the below troubleshooting section.
 
-When completed run `mcdev --version` and it will show you which version you installed (e.g. `4.1.7`).
+When completed run `mcdev --version` and it will show you which version you installed (e.g. `4.1.8`).
 
 ### 9.3. NPM Scripts
 
diff --git a/docs/dist/documentation.md b/docs/dist/documentation.md
index e1c98e31..985b16ed 100644
--- a/docs/dist/documentation.md
+++ b/docs/dist/documentation.md
@@ -400,7 +400,7 @@ Deploys all metadata located in the 'deploy' directory to the specified business
 <a name="Deployer._deployBU"></a>
 
 ### Deployer.\_deployBU(cred, bu, properties, [typeArr], [keyArr], [fromRetrieve]) ⇒ <code>Promise.&lt;TYPE.MultiMetadataTypeMap&gt;</code>
-helper for deploy()
+helper for [deploy](deploy)
 
 **Kind**: static method of [<code>Deployer</code>](#Deployer)  
 **Returns**: <code>Promise.&lt;TYPE.MultiMetadataTypeMap&gt;</code> - ensure that BUs are worked on sequentially  
@@ -958,7 +958,7 @@ This method retrieves these and saves them alongside the metadata json
 <a name="Asset._readExtendedFileFromFS"></a>
 
 ### Asset.\_readExtendedFileFromFS(metadata, subType, deployDir, [pathOnly]) ⇒ <code>Promise.&lt;string&gt;</code>
-helper for this.preDeployTasks()
+helper for [preDeployTasks](preDeployTasks)
 Some metadata types store their actual content as a separate file, e.g. images
 This method reads these from the local FS stores them in the metadata object allowing to deploy it
 
@@ -1013,7 +1013,7 @@ find the subType matching the extendedSubType
 <a name="Asset.buildDefinitionForNested"></a>
 
 ### Asset.buildDefinitionForNested(templateDir, targetDir, metadata, templateVariables, templateName) ⇒ <code>Promise.&lt;void&gt;</code>
-helper for buildDefinition
+helper for [buildDefinition](#MetadataType.buildDefinition)
 handles extracted code if any are found for complex types
 
 **Kind**: static method of [<code>Asset</code>](#Asset)  
@@ -1030,7 +1030,7 @@ handles extracted code if any are found for complex types
 <a name="Asset.buildTemplateForNested"></a>
 
 ### Asset.buildTemplateForNested(templateDir, targetDir, metadata, templateVariables, templateName) ⇒ <code>Promise.&lt;void&gt;</code>
-helper for buildTemplate
+helper for [buildTemplate](#MetadataType.buildTemplate)
 handles extracted code if any are found for complex types
 
 **Kind**: static method of [<code>Asset</code>](#Asset)  
@@ -1051,7 +1051,7 @@ assets of type codesnippetblock will result in 1 json and 1 amp/html file. both
 <a name="Asset._buildForNested"></a>
 
 ### Asset.\_buildForNested(templateDir, targetDir, metadata, templateVariables, templateName, mode) ⇒ <code>Promise.&lt;void&gt;</code>
-helper for buildDefinition
+helper for [buildDefinition](#MetadataType.buildDefinition)
 handles extracted code if any are found for complex types
 
 **Kind**: static method of [<code>Asset</code>](#Asset)  
@@ -1092,7 +1092,7 @@ parses retrieved Metadata before saving
 <a name="Asset._mergeCode"></a>
 
 ### Asset.\_mergeCode(metadata, deployDir, subType, [templateName], [fileListOnly]) ⇒ <code>Promise.&lt;Array.&lt;TYPE.CodeExtract&gt;&gt;</code>
-helper for this.preDeployTasks() that loads extracted code content back into JSON
+helper for [preDeployTasks](preDeployTasks) that loads extracted code content back into JSON
 
 **Kind**: static method of [<code>Asset</code>](#Asset)  
 **Returns**: <code>Promise.&lt;Array.&lt;TYPE.CodeExtract&gt;&gt;</code> - fileList for templating (disregarded during deployment)  
@@ -1108,7 +1108,7 @@ helper for this.preDeployTasks() that loads extracted code content back into JSO
 <a name="Asset._mergeCode_slots"></a>
 
 ### Asset.\_mergeCode\_slots(prefix, metadataSlots, readDirArr, subtypeExtension, subDirArr, fileList, customerKey, [templateName], [fileListOnly]) ⇒ <code>Promise.&lt;void&gt;</code>
-helper for this.preDeployTasks() that loads extracted code content back into JSON
+helper for [preDeployTasks](preDeployTasks) that loads extracted code content back into JSON
 
 **Kind**: static method of [<code>Asset</code>](#Asset)  
 **Returns**: <code>Promise.&lt;void&gt;</code> - -  
@@ -1128,7 +1128,7 @@ helper for this.preDeployTasks() that loads extracted code content back into JSO
 <a name="Asset._extractCode"></a>
 
 ### Asset.\_extractCode(metadata) ⇒ <code>TYPE.CodeExtractItem</code>
-helper for this.parseMetadata() that finds code content in JSON and extracts it
+helper for [parseMetadata](parseMetadata) that finds code content in JSON and extracts it
 to allow saving that separately and formatted
 
 **Kind**: static method of [<code>Asset</code>](#Asset)  
@@ -1626,7 +1626,7 @@ if create or update operation is needed.
 <a name="DataExtension._filterUpsertResults"></a>
 
 ### DataExtension.\_filterUpsertResults(res) ⇒ <code>boolean</code>
-helper for upsert()
+helper for [upsert](upsert)
 
 **Kind**: static method of [<code>DataExtension</code>](#DataExtension)  
 **Returns**: <code>boolean</code> - true: keep, false: discard  
@@ -1862,7 +1862,7 @@ Retrieves all records for caching
 <a name="DataExtensionField.convertToSortedArray"></a>
 
 ### DataExtensionField.convertToSortedArray(fieldsObj) ⇒ <code>Array.&lt;TYPE.DataExtensionFieldItem&gt;</code>
-helper for DataExtension.js that sorts the fields into an array
+helper for [DataExtension._retrieveFieldsForSingleDe](DataExtension._retrieveFieldsForSingleDe) that sorts the fields into an array
 
 **Kind**: static method of [<code>DataExtensionField</code>](#DataExtensionField)  
 **Returns**: <code>Array.&lt;TYPE.DataExtensionFieldItem&gt;</code> - sorted array of field objects  
@@ -3482,7 +3482,7 @@ Helper for writing Metadata to disk, used for Retrieve and deploy
 <a name="MetadataType.applyTemplateValues"></a>
 
 ### MetadataType.applyTemplateValues(code, templateVariables) ⇒ <code>string</code>
-helper for buildDefinitionForNested
+helper for [buildDefinitionForNested](buildDefinitionForNested)
 searches extracted file for template variable names and applies the market values
 
 **Kind**: static method of [<code>MetadataType</code>](#MetadataType)  
@@ -3496,7 +3496,7 @@ searches extracted file for template variable names and applies the market value
 <a name="MetadataType.applyTemplateNames"></a>
 
 ### MetadataType.applyTemplateNames(code, templateVariables) ⇒ <code>string</code>
-helper for buildTemplateForNested
+helper for [buildTemplateForNested](buildTemplateForNested)
 searches extracted file for template variable values and applies the market variable names
 
 **Kind**: static method of [<code>MetadataType</code>](#MetadataType)  
@@ -3510,7 +3510,7 @@ searches extracted file for template variable values and applies the market vari
 <a name="MetadataType.buildDefinitionForNested"></a>
 
 ### MetadataType.buildDefinitionForNested(templateDir, targetDir, metadata, variables, templateName) ⇒ <code>Promise.&lt;Array.&lt;Array.&lt;string&gt;&gt;&gt;</code>
-helper for buildDefinition
+helper for [buildDefinition](buildDefinition)
 handles extracted code if any are found for complex types (e.g script, asset, query)
 
 **Kind**: static method of [<code>MetadataType</code>](#MetadataType)  
@@ -3527,7 +3527,7 @@ handles extracted code if any are found for complex types (e.g script, asset, qu
 <a name="MetadataType.buildTemplateForNested"></a>
 
 ### MetadataType.buildTemplateForNested(templateDir, targetDir, metadata, templateVariables, templateName) ⇒ <code>Promise.&lt;Array.&lt;Array.&lt;string&gt;&gt;&gt;</code>
-helper for buildTemplate
+helper for [buildTemplate](buildTemplate)
 handles extracted code if any are found for complex types
 
 **Kind**: static method of [<code>MetadataType</code>](#MetadataType)  
@@ -3903,7 +3903,7 @@ prepares a Query for deployment
 <a name="Query.applyTemplateValues"></a>
 
 ### Query.applyTemplateValues(code, templateVariables) ⇒ <code>string</code>
-helper for buildDefinitionForNested
+helper for [buildDefinitionForNested](buildDefinitionForNested)
 searches extracted SQL file for template variables and applies the market values
 
 **Kind**: static method of [<code>Query</code>](#Query)  
@@ -3917,7 +3917,7 @@ searches extracted SQL file for template variables and applies the market values
 <a name="Query.buildDefinitionForNested"></a>
 
 ### Query.buildDefinitionForNested(templateDir, targetDir, metadata, templateVariables, templateName) ⇒ <code>Promise.&lt;Array.&lt;Array.&lt;string&gt;&gt;&gt;</code>
-helper for buildDefinition
+helper for [buildDefinition](#MetadataType.buildDefinition)
 handles extracted code if any are found for complex types
 
 **Kind**: static method of [<code>Query</code>](#Query)  
@@ -3934,7 +3934,7 @@ handles extracted code if any are found for complex types
 <a name="Query.buildTemplateForNested"></a>
 
 ### Query.buildTemplateForNested(templateDir, targetDir, metadata, templateVariables, templateName) ⇒ <code>Promise.&lt;Array.&lt;Array.&lt;string&gt;&gt;&gt;</code>
-helper for buildTemplate
+helper for [buildTemplate](#MetadataType.buildTemplate)
 handles extracted code if any are found for complex types
 
 **Kind**: static method of [<code>Query</code>](#Query)  
@@ -4184,7 +4184,7 @@ Creates a single Script
 <a name="Script._mergeCode"></a>
 
 ### Script.\_mergeCode(metadata, deployDir, [templateName]) ⇒ <code>Promise.&lt;string&gt;</code>
-helper for this.preDeployTasks() that loads extracted code content back into JSON
+helper for [preDeployTasks](preDeployTasks) that loads extracted code content back into JSON
 
 **Kind**: static method of [<code>Script</code>](#Script)  
 **Returns**: <code>Promise.&lt;string&gt;</code> - content for metadata.script  
@@ -4211,7 +4211,7 @@ prepares a Script for deployment
 <a name="Script.buildDefinitionForNested"></a>
 
 ### Script.buildDefinitionForNested(templateDir, targetDir, metadata, templateVariables, templateName) ⇒ <code>Promise.&lt;Array.&lt;Array.&lt;string&gt;&gt;&gt;</code>
-helper for buildDefinition
+helper for [buildDefinition](#MetadataType.buildDefinition)
 handles extracted code if any are found for complex types
 
 **Kind**: static method of [<code>Script</code>](#Script)  
@@ -4228,7 +4228,7 @@ handles extracted code if any are found for complex types
 <a name="Script.buildTemplateForNested"></a>
 
 ### Script.buildTemplateForNested(templateDir, targetDir, metadata, templateVariables, templateName) ⇒ <code>Promise.&lt;Array.&lt;Array.&lt;string&gt;&gt;&gt;</code>
-helper for buildTemplate
+helper for [buildTemplate](#MetadataType.buildTemplate)
 handles extracted code if any are found for complex types
 
 **Kind**: static method of [<code>Script</code>](#Script)  
@@ -4249,7 +4249,7 @@ scripts are saved as 1 json and 1 ssjs file. both files need to be run through t
 <a name="Script._buildForNested"></a>
 
 ### Script.\_buildForNested(templateDir, targetDir, metadata, templateVariables, templateName, mode) ⇒ <code>Promise.&lt;Array.&lt;Array.&lt;string&gt;&gt;&gt;</code>
-helper for buildTemplateForNested / buildDefinitionForNested
+helper for [buildTemplateForNested](buildTemplateForNested) / [buildDefinitionForNested](buildDefinitionForNested)
 handles extracted code if any are found for complex types
 
 **Kind**: static method of [<code>Script</code>](#Script)  
@@ -4604,7 +4604,7 @@ SFMC accepts multiple false values for Boolean attributes for which we are check
 <a name="Util._isValidType"></a>
 
 ### Util.\_isValidType(selectedType) ⇒ <code>boolean</code>
-helper for retrieve, retrieveAsTemplate and deploy
+helper for [retrieve](#Mcdev.retrieve), [retrieveAsTemplate](#Mcdev.retrieveAsTemplate) and [deploy](#Mcdev.deploy)
 
 **Kind**: static method of [<code>Util</code>](#Util)  
 **Returns**: <code>boolean</code> - type ok or not  
@@ -4892,7 +4892,7 @@ helper around _askCredentials
 <a name="Cli._askCredentials"></a>
 
 ### Cli.\_askCredentials(properties, [credName]) ⇒ <code>Promise.&lt;object&gt;</code>
-helper for addExtraCredential()
+helper for [addExtraCredential](#Cli.addExtraCredential)
 
 **Kind**: static method of [<code>Cli</code>](#Cli)  
 **Returns**: <code>Promise.&lt;object&gt;</code> - credential info  
@@ -4918,7 +4918,7 @@ allows updating the metadata types that shall be retrieved
 <a name="Cli._summarizeSubtypes"></a>
 
 ### Cli.\_summarizeSubtypes(responses, type) ⇒ <code>void</code>
-helper for this.selectTypes() that converts subtypes back to main type if all and only defaults were selected
+helper for [selectTypes](#Cli.selectTypes) that converts subtypes back to main type if all and only defaults were selected
 this keeps the config automatically upgradable when we add new subtypes or change what is selected by default
 
 **Kind**: static method of [<code>Cli</code>](#Cli)  
@@ -5190,7 +5190,7 @@ Saves beautified files in the local file system. Will create the parent director
 <a name="File._beautify_prettier"></a>
 
 ### File.\_beautify\_prettier(directory, filename, filetype, content) ⇒ <code>string</code>
-helper for writePrettyToFile, applying prettier onto given stringified content
+helper for [writePrettyToFile](#File.writePrettyToFile), applying prettier onto given stringified content
 ! Important: run 'await File.initPrettier()' in your MetadataType.retrieve() once before hitting this
 
 **Kind**: static method of [<code>File</code>](#File)  
@@ -5367,7 +5367,7 @@ handles creation/update of all config file from the boilerplate
 <a name="Init._updateLeaf"></a>
 
 ### Init.\_updateLeaf(propertiersCur, defaultPropsCur, fieldName) ⇒ <code>void</code>
-recursive helper for _fixMcdevConfig that adds missing settings
+recursive helper for [fixMcdevConfig](#Init.fixMcdevConfig) that adds missing settings
 
 **Kind**: static method of [<code>Init</code>](#Init)  
 
@@ -5459,7 +5459,7 @@ Creates template file for properties.json
 <a name="Init._downloadAllBUs"></a>
 
 ### Init.\_downloadAllBUs(bu, gitStatus) ⇒ <code>Promise.&lt;void&gt;</code>
-helper for this.initProject()
+helper for [initProject](#Init.initProject)
 
 **Kind**: static method of [<code>Init</code>](#Init)  
 **Returns**: <code>Promise.&lt;void&gt;</code> - -  
@@ -5574,7 +5574,7 @@ handles creation/update of all config file from the boilerplate
 <a name="Init._updateLeaf"></a>
 
 ### Init.\_updateLeaf(propertiersCur, defaultPropsCur, fieldName) ⇒ <code>void</code>
-recursive helper for _fixMcdevConfig that adds missing settings
+recursive helper for [fixMcdevConfig](#Init.fixMcdevConfig) that adds missing settings
 
 **Kind**: static method of [<code>Init</code>](#Init)  
 
@@ -5666,7 +5666,7 @@ Creates template file for properties.json
 <a name="Init._downloadAllBUs"></a>
 
 ### Init.\_downloadAllBUs(bu, gitStatus) ⇒ <code>Promise.&lt;void&gt;</code>
-helper for this.initProject()
+helper for [initProject](#Init.initProject)
 
 **Kind**: static method of [<code>Init</code>](#Init)  
 **Returns**: <code>Promise.&lt;void&gt;</code> - -  
@@ -5781,7 +5781,7 @@ handles creation/update of all config file from the boilerplate
 <a name="Init._updateLeaf"></a>
 
 ### Init.\_updateLeaf(propertiersCur, defaultPropsCur, fieldName) ⇒ <code>void</code>
-recursive helper for _fixMcdevConfig that adds missing settings
+recursive helper for [fixMcdevConfig](#Init.fixMcdevConfig) that adds missing settings
 
 **Kind**: static method of [<code>Init</code>](#Init)  
 
@@ -5873,7 +5873,7 @@ Creates template file for properties.json
 <a name="Init._downloadAllBUs"></a>
 
 ### Init.\_downloadAllBUs(bu, gitStatus) ⇒ <code>Promise.&lt;void&gt;</code>
-helper for this.initProject()
+helper for [initProject](#Init.initProject)
 
 **Kind**: static method of [<code>Init</code>](#Init)  
 **Returns**: <code>Promise.&lt;void&gt;</code> - -  
@@ -5988,7 +5988,7 @@ handles creation/update of all config file from the boilerplate
 <a name="Init._updateLeaf"></a>
 
 ### Init.\_updateLeaf(propertiersCur, defaultPropsCur, fieldName) ⇒ <code>void</code>
-recursive helper for _fixMcdevConfig that adds missing settings
+recursive helper for [fixMcdevConfig](#Init.fixMcdevConfig) that adds missing settings
 
 **Kind**: static method of [<code>Init</code>](#Init)  
 
@@ -6080,7 +6080,7 @@ Creates template file for properties.json
 <a name="Init._downloadAllBUs"></a>
 
 ### Init.\_downloadAllBUs(bu, gitStatus) ⇒ <code>Promise.&lt;void&gt;</code>
-helper for this.initProject()
+helper for [initProject](#Init.initProject)
 
 **Kind**: static method of [<code>Init</code>](#Init)  
 **Returns**: <code>Promise.&lt;void&gt;</code> - -  
@@ -6279,7 +6279,7 @@ SFMC accepts multiple false values for Boolean attributes for which we are check
 <a name="Util._isValidType"></a>
 
 ### Util.\_isValidType(selectedType) ⇒ <code>boolean</code>
-helper for retrieve, retrieveAsTemplate and deploy
+helper for [retrieve](#Mcdev.retrieve), [retrieveAsTemplate](#Mcdev.retrieveAsTemplate) and [deploy](#Mcdev.deploy)
 
 **Kind**: static method of [<code>Util</code>](#Util)  
 **Returns**: <code>boolean</code> - type ok or not  
diff --git a/lib/Deployer.js b/lib/Deployer.js
index d2a42b08..3ffe2026 100644
--- a/lib/Deployer.js
+++ b/lib/Deployer.js
@@ -173,7 +173,7 @@ class Deployer {
         return buMultiMetadataTypeMap;
     }
     /**
-     * helper for deploy()
+     * helper for {@link deploy}
      *
      * @param {string} cred name of Credential
      * @param {string} bu name of BU
@@ -325,6 +325,7 @@ class Deployer {
     static async createFolderDefinitions(deployDir, metadata, metadataTypeArr) {
         let i = 0;
         const folderMetadata = {};
+        const allowedDeFolderContentTypes = ['dataextension', 'shared_dataextension'];
         for (const metadataType of metadataTypeArr) {
             if (!MetadataTypeInfo[metadataType].definition.dependencies.includes('folder')) {
                 Util.logger.debug(` ☇ skipping ${metadataType}: folder not a dependency`);
@@ -346,23 +347,20 @@ class Deployer {
             }
             Util.logger.debug(`Creating relevant folders for ${metadataType} in deploy dir`);
 
-            let allFolders = Object.keys(metadata[metadataType]).filter(
-                // filter out root folders (which would not have a slash in their path)
-                (key) => metadata[metadataType][key].r__folder_Path.includes('/')
-            );
-            /* eslint-disable unicorn/prefer-ternary */
-            if (metadataType === 'dataExtension') {
-                allFolders = allFolders
-                    .filter(
-                        // filter out any shared / synchronized / salesforce folders
-                        (key) =>
-                            metadata[metadataType][key].r__folder_ContentType === 'dataextension'
-                    )
-                    .map((key) => metadata[metadataType][key].r__folder_Path);
-            } else {
-                allFolders = allFolders.map((key) => metadata[metadataType][key].r__folder_Path);
-            }
-            /* eslint-enable unicorn/prefer-ternary */
+            const allFolders = Object.keys(metadata[metadataType])
+                .filter(
+                    // filter out root folders (which would not have a slash in their path)
+                    (key) => metadata[metadataType][key].r__folder_Path.includes('/')
+                )
+                .filter(
+                    // filter out dataExtension folders other than standard & shared (--> synchronized / salesforce are not allowed)
+                    (key) =>
+                        metadataType !== 'dataExtension' ||
+                        allowedDeFolderContentTypes.includes(
+                            metadata[metadataType][key].r__folder_ContentType
+                        )
+                )
+                .map((key) => metadata[metadataType][key].r__folder_Path);
 
             // deduplicate
             const folderPathSet = new Set(allFolders);
@@ -384,21 +382,31 @@ class Deployer {
 
             for (const folder of folderPathArrExtended) {
                 i++;
+                let contentType = MetadataTypeInfo[metadataType].definition.folderType;
+                if (
+                    metadataType === 'dataExtension' &&
+                    folder.startsWith('Shared Items/Shared Data Extensions')
+                ) {
+                    contentType = 'shared_dataextension';
+                }
                 folderMetadata[`on-the-fly-${i}`] = {
                     Path: folder,
                     Name: folder.split('/').pop(),
                     Description: '',
-                    ContentType: MetadataTypeInfo[metadataType].definition.folderType,
+                    ContentType: contentType,
                     IsActive: true,
                     IsEditable: true,
                     AllowChildren: true,
+                    _generated: true,
                 };
             }
         }
 
         if (i > 0) {
+            MetadataTypeInfo.folder.definition.fields._generated.retrieving = true; // ensure we keep that flag in deploy folder
             // await results to allow us to re-read it right after
             await MetadataTypeInfo.folder.saveResults(folderMetadata, deployDir, null);
+            MetadataTypeInfo.folder.definition.fields._generated.retrieving = false; // reset flag
             Util.logger.info(`Created folders in deploy dir: ${i}`);
 
             // reload from file system to ensure we use the same logic for building the temporary JSON
diff --git a/lib/index.js b/lib/index.js
index b3c4fb99..2736816d 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -189,7 +189,7 @@ class Mcdev {
         }
     }
     /**
-     * helper for retrieve()
+     * helper for {@link retrieve}
      *
      * @private
      * @param {string} cred name of Credential
diff --git a/lib/metadataTypes/Asset.js b/lib/metadataTypes/Asset.js
index 82d4d211..a19a2716 100644
--- a/lib/metadataTypes/Asset.js
+++ b/lib/metadataTypes/Asset.js
@@ -99,7 +99,7 @@ class Asset extends MetadataType {
         return { metadata: Object.values(metadata)[0], type: this.definition.type };
     }
     /**
-     * helper for retrieve + retrieveAsTemplate
+     * helper for {@link retrieve} + {@link retrieveAsTemplate}
      *
      * @private
      * @returns {TYPE.AssetSubType[]} subtype array
@@ -443,7 +443,7 @@ class Asset extends MetadataType {
         );
     }
     /**
-     * helper for this.preDeployTasks()
+     * helper for {@link preDeployTasks}
      * Some metadata types store their actual content as a separate file, e.g. images
      * This method reads these from the local FS stores them in the metadata object allowing to deploy it
      *
@@ -607,7 +607,7 @@ class Asset extends MetadataType {
         }
     }
     /**
-     * helper for buildDefinition
+     * helper for {@link MetadataType.buildDefinition}
      * handles extracted code if any are found for complex types
      *
      * @param {string} templateDir Directory where metadata templates are stored
@@ -634,7 +634,7 @@ class Asset extends MetadataType {
         );
     }
     /**
-     * helper for buildTemplate
+     * helper for {@link MetadataType.buildTemplate}
      * handles extracted code if any are found for complex types
      *
      * @example assets of type codesnippetblock will result in 1 json and 1 amp/html file. both files need to be run through templating
@@ -663,7 +663,7 @@ class Asset extends MetadataType {
     }
 
     /**
-     * helper for buildDefinition
+     * helper for {@link MetadataType.buildDefinition}
      * handles extracted code if any are found for complex types
      *
      * @param {string} templateDir Directory where metadata templates are stored
@@ -792,7 +792,7 @@ class Asset extends MetadataType {
         return metadata;
     }
     /**
-     * helper for this.preDeployTasks() that loads extracted code content back into JSON
+     * helper for {@link preDeployTasks} that loads extracted code content back into JSON
      *
      * @param {TYPE.AssetItem} metadata a single asset definition
      * @param {string} deployDir directory of deploy files
@@ -1024,7 +1024,7 @@ class Asset extends MetadataType {
         return fileList;
     }
     /**
-     * helper for this.preDeployTasks() that loads extracted code content back into JSON
+     * helper for {@link preDeployTasks} that loads extracted code content back into JSON
      *
      * @param {string} prefix usually the customerkey
      * @param {object} metadataSlots metadata.views.html.slots or deeper slots.<>.blocks.<>.slots
@@ -1104,7 +1104,7 @@ class Asset extends MetadataType {
         }
     }
     /**
-     * helper for this.parseMetadata() that finds code content in JSON and extracts it
+     * helper for {@link parseMetadata} that finds code content in JSON and extracts it
      * to allow saving that separately and formatted
      *
      * @param {TYPE.AssetItem} metadata a single asset definition
diff --git a/lib/metadataTypes/DataExtension.js b/lib/metadataTypes/DataExtension.js
index 7d98fa5e..567962a0 100644
--- a/lib/metadataTypes/DataExtension.js
+++ b/lib/metadataTypes/DataExtension.js
@@ -123,7 +123,7 @@ class DataExtension extends MetadataType {
     }
 
     /**
-     * helper for upsert()
+     * helper for {@link upsert}
      *
      * @param {object} res -
      * @returns {boolean} true: keep, false: discard
diff --git a/lib/metadataTypes/DataExtensionField.js b/lib/metadataTypes/DataExtensionField.js
index 6ad597ba..8a902be0 100644
--- a/lib/metadataTypes/DataExtensionField.js
+++ b/lib/metadataTypes/DataExtensionField.js
@@ -32,7 +32,7 @@ class DataExtensionField extends MetadataType {
         return super.retrieveSOAP(null, null, requestParams, additionalFields);
     }
     /**
-     * helper for DataExtension.js that sorts the fields into an array
+     * helper for {@link DataExtension._retrieveFieldsForSingleDe} that sorts the fields into an array
      *
      * @param {TYPE.DataExtensionFieldMap} fieldsObj customerKey-based list of fields for one dataExtension
      * @returns {TYPE.DataExtensionFieldItem[]} sorted array of field objects
diff --git a/lib/metadataTypes/Folder.js b/lib/metadataTypes/Folder.js
index 5085b35a..9d84f087 100644
--- a/lib/metadataTypes/Folder.js
+++ b/lib/metadataTypes/Folder.js
@@ -166,7 +166,9 @@ class Folder extends MetadataType {
      */
     static async upsert(metadata) {
         let updateCount = 0;
+        let updateFailedCount = 0;
         let createCount = 0;
+        let createFailedCount = 0;
         let filteredByPreDeploy = 0;
         const upsertResults = {};
         const sortPairs = toposort(
@@ -206,12 +208,13 @@ class Folder extends MetadataType {
                                 );
                                 if (
                                     existingId &&
-                                    !this.hasChangedGeneric(
-                                        cachedVersion,
-                                        metadata[metadataKey],
-                                        null,
-                                        true
-                                    )
+                                    (metadata[metadataKey]._generated || // of generated, never "update"
+                                        !this.hasChangedGeneric(
+                                            cachedVersion,
+                                            metadata[metadataKey],
+                                            'Path',
+                                            true
+                                        ))
                                 ) {
                                     Util.logger.verbose(
                                         ` - skipping ${this.definition.type} ${
@@ -228,12 +231,13 @@ class Folder extends MetadataType {
                                 existingId = cachedVersion?.ID;
                                 if (
                                     existingId &&
-                                    !this.hasChangedGeneric(
-                                        cachedVersion,
-                                        metadata[metadataKey],
-                                        null,
-                                        true
-                                    )
+                                    (metadata[metadataKey]._generated || // of generated, never "update"
+                                        !this.hasChangedGeneric(
+                                            cachedVersion,
+                                            metadata[metadataKey],
+                                            'Path',
+                                            true
+                                        ))
                                 ) {
                                     Util.logger.verbose(
                                         ` - skipping ${this.definition.type} ${
@@ -253,10 +257,18 @@ class Folder extends MetadataType {
                                 // if an existing folder exists with the same name/path then use that
                                 deployableMetadata.ID = existingId;
                                 result = await this.update(deployableMetadata);
-                                updateCount++;
+                                if (result) {
+                                    updateCount++;
+                                } else {
+                                    updateFailedCount++;
+                                }
                             } else {
                                 result = await this.create(deployableMetadata);
-                                createCount++;
+                                if (result) {
+                                    createCount++;
+                                } else {
+                                    createFailedCount++;
+                                }
                             }
                             if (result?.Results) {
                                 const parsed = this.parseResponseBody({
@@ -293,7 +305,9 @@ class Folder extends MetadataType {
         }
         // Logging
         Util.logger.info(
-            `${this.definition.type} upsert: ${createCount} created / ${updateCount} updated` +
+            `${this.definition.type} upsert: ${createCount} of ${
+                createCount + createFailedCount
+            } created / ${updateCount} of ${updateCount + updateFailedCount} updated` +
                 (filteredByPreDeploy > 0 ? ` / ${filteredByPreDeploy} filtered` : '')
         );
 
diff --git a/lib/metadataTypes/MetadataType.js b/lib/metadataTypes/MetadataType.js
index 5d0fabdd..33231683 100644
--- a/lib/metadataTypes/MetadataType.js
+++ b/lib/metadataTypes/MetadataType.js
@@ -1281,7 +1281,7 @@ class MetadataType {
         return savedResults;
     }
     /**
-     * helper for buildDefinitionForNested
+     * helper for {@link buildDefinitionForNested}
      * searches extracted file for template variable names and applies the market values
      *
      * @param {string} code code from extracted code
@@ -1293,7 +1293,7 @@ class MetadataType {
         return Mustache.render(code, templateVariables);
     }
     /**
-     * helper for buildTemplateForNested
+     * helper for {@link buildTemplateForNested}
      * searches extracted file for template variable values and applies the market variable names
      *
      * @param {string} code code from extracted code
@@ -1305,7 +1305,7 @@ class MetadataType {
         return Util.replaceByObject(code, templateVariables);
     }
     /**
-     * helper for buildDefinition
+     * helper for {@link buildDefinition}
      * handles extracted code if any are found for complex types (e.g script, asset, query)
      *
      * @param {string} templateDir Directory where metadata templates are stored
@@ -1326,7 +1326,7 @@ class MetadataType {
         return null;
     }
     /**
-     * helper for buildTemplate
+     * helper for {@link buildTemplate}
      * handles extracted code if any are found for complex types
      *
      * @param {string} templateDir Directory where metadata templates are stored
diff --git a/lib/metadataTypes/Query.js b/lib/metadataTypes/Query.js
index 48f917f0..fa61e067 100644
--- a/lib/metadataTypes/Query.js
+++ b/lib/metadataTypes/Query.js
@@ -136,7 +136,7 @@ class Query extends MetadataType {
         return metadata;
     }
     /**
-     * helper for buildDefinitionForNested
+     * helper for {@link buildDefinitionForNested}
      * searches extracted SQL file for template variables and applies the market values
      *
      * @param {string} code code from extracted code
@@ -159,7 +159,7 @@ class Query extends MetadataType {
         return Mustache.render(code, templateVariables);
     }
     /**
-     * helper for buildDefinition
+     * helper for {@link MetadataType.buildDefinition}
      * handles extracted code if any are found for complex types
      *
      * @param {string} templateDir Directory where metadata templates are stored
@@ -186,7 +186,7 @@ class Query extends MetadataType {
         );
     }
     /**
-     * helper for buildTemplate
+     * helper for {@link MetadataType.buildTemplate}
      * handles extracted code if any are found for complex types
      *
      * @example queries are saved as 1 json and 1 sql file. both files need to be run through templating
@@ -214,7 +214,7 @@ class Query extends MetadataType {
         );
     }
     /**
-     * helper for buildTemplateForNested / buildDefinitionForNested
+     * helper for {@link buildTemplateForNested} / {@link buildDefinitionForNested}
      * handles extracted code if any are found for complex types
      *
      * @private
diff --git a/lib/metadataTypes/Script.js b/lib/metadataTypes/Script.js
index 34959d91..867bfd39 100644
--- a/lib/metadataTypes/Script.js
+++ b/lib/metadataTypes/Script.js
@@ -85,7 +85,7 @@ class Script extends MetadataType {
     }
 
     /**
-     * helper for this.preDeployTasks() that loads extracted code content back into JSON
+     * helper for {@link preDeployTasks} that loads extracted code content back into JSON
      *
      * @param {TYPE.ScriptItem} metadata a single asset definition
      * @param {string} deployDir directory of deploy files
@@ -137,7 +137,7 @@ class Script extends MetadataType {
         return metadata;
     }
     /**
-     * helper for buildDefinition
+     * helper for {@link MetadataType.buildDefinition}
      * handles extracted code if any are found for complex types
      *
      * @param {string} templateDir Directory where metadata templates are stored
@@ -164,7 +164,7 @@ class Script extends MetadataType {
         );
     }
     /**
-     * helper for buildTemplate
+     * helper for {@link MetadataType.buildTemplate}
      * handles extracted code if any are found for complex types
      *
      * @example scripts are saved as 1 json and 1 ssjs file. both files need to be run through templating
@@ -193,7 +193,7 @@ class Script extends MetadataType {
     }
 
     /**
-     * helper for buildTemplateForNested / buildDefinitionForNested
+     * helper for {@link buildTemplateForNested} / {@link buildDefinitionForNested}
      * handles extracted code if any are found for complex types
      *
      * @param {string} templateDir Directory where metadata templates are stored
diff --git a/lib/metadataTypes/definitions/Folder.definition.js b/lib/metadataTypes/definitions/Folder.definition.js
index 9e803f99..f0e6b0d2 100644
--- a/lib/metadataTypes/definitions/Folder.definition.js
+++ b/lib/metadataTypes/definitions/Folder.definition.js
@@ -175,5 +175,11 @@ module.exports = {
             retrieving: false,
             template: false,
         },
+        _generated: {
+            isCreateable: false,
+            isUpdateable: false,
+            retrieving: false,
+            template: false,
+        },
     },
 };
diff --git a/lib/util/cli.js b/lib/util/cli.js
index 78be773d..ff620f72 100644
--- a/lib/util/cli.js
+++ b/lib/util/cli.js
@@ -294,7 +294,7 @@ const Cli = {
     },
 
     /**
-     * helper for addExtraCredential()
+     * helper for {@link Cli.addExtraCredential}
      *
      * @param {TYPE.Mcdevrc} properties from config file
      * @param {string} [credName] name of credential that needs updating
@@ -489,7 +489,7 @@ const Cli = {
         }
     },
     /**
-     * helper for this.selectTypes() that converts subtypes back to main type if all and only defaults were selected
+     * helper for {@link Cli.selectTypes} that converts subtypes back to main type if all and only defaults were selected
      * this keeps the config automatically upgradable when we add new subtypes or change what is selected by default
      *
      * @param {object} responses wrapper object for respones
diff --git a/lib/util/file.js b/lib/util/file.js
index 860b13af..58d29df8 100644
--- a/lib/util/file.js
+++ b/lib/util/file.js
@@ -169,7 +169,7 @@ const File = {
         return this.writeToFile(directory, filename, filetype, formatted);
     },
     /**
-     * helper for writePrettyToFile, applying prettier onto given stringified content
+     * helper for {@link File.writePrettyToFile}, applying prettier onto given stringified content
      * ! Important: run 'await File.initPrettier()' in your MetadataType.retrieve() once before hitting this
      *
      * @param {string|string[]} directory directory the file will be written to
diff --git a/lib/util/init.config.js b/lib/util/init.config.js
index 5608fb63..86251ea1 100644
--- a/lib/util/init.config.js
+++ b/lib/util/init.config.js
@@ -267,7 +267,7 @@ const Init = {
         }
     },
     /**
-     * recursive helper for _fixMcdevConfig that adds missing settings
+     * recursive helper for {@link Init.fixMcdevConfig} that adds missing settings
      *
      * @param {object} propertiersCur current sub-object of project settings
      * @param {object} defaultPropsCur current sub-object of default settings
diff --git a/lib/util/init.js b/lib/util/init.js
index 29ce500f..09e6a81c 100644
--- a/lib/util/init.js
+++ b/lib/util/init.js
@@ -183,7 +183,7 @@ const Init = {
         }
     },
     /**
-     * helper for this.initProject()
+     * helper for {@link Init.initProject}
      *
      * @param {string} bu cred/bu or cred/* or *
      * @param {string} gitStatus signals what state the git repo is in
diff --git a/lib/util/util.js b/lib/util/util.js
index 99b40b24..5a4227be 100644
--- a/lib/util/util.js
+++ b/lib/util/util.js
@@ -151,7 +151,7 @@ const Util = {
         return ['false', 'FALSE', 'False', '0', 0, 'N', false].includes(attrValue);
     },
     /**
-     * helper for retrieve, retrieveAsTemplate and deploy
+     * helper for {@link Mcdev.retrieve}, {@link Mcdev.retrieveAsTemplate} and {@link Mcdev.deploy}
      *
      * @param {TYPE.SupportedMetadataTypes} selectedType type or type-subtype
      * @returns {boolean} type ok or not
diff --git a/package-lock.json b/package-lock.json
index f8a56a4a..254c4381 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "mcdev",
-    "version": "4.1.7",
+    "version": "4.1.8",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "mcdev",
-            "version": "4.1.7",
+            "version": "4.1.8",
             "license": "MIT",
             "dependencies": {
                 "cli-progress": "3.11.2",
diff --git a/package.json b/package.json
index f5db1582..54ceb6f8 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "mcdev",
-    "version": "4.1.7",
+    "version": "4.1.8",
     "description": "Accenture Salesforce Marketing Cloud DevTools",
     "author": "Accenture: joern.berkefeld, douglas.midgley, robert.zimmermann, maciej.barnas",
     "license": "MIT",


Test patch:
diff --git a/test/mockRoot/.mcdevrc.json b/test/mockRoot/.mcdevrc.json
index 12458555..89eba549 100644
--- a/test/mockRoot/.mcdevrc.json
+++ b/test/mockRoot/.mcdevrc.json
@@ -63,5 +63,5 @@
             "triggeredSendDefinition"
         ]
     },
-    "version": "4.1.7"
+    "version": "4.1.8"
 }