diff --git a/.gitignore b/.gitignore
index 058ed90..7a90302 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,7 +26,7 @@ x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
-[Bb]in/
+# [Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 4b0c88d..cfa2d06 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,15 +1,21 @@
{
"cSpell.words": [
"Carbonate",
+ "CICD",
"Kinson",
+ "NONDIRPUSHREACTABLE",
+ "ONEWAYPULLREACTABLE",
+ "ONEWAYPUSHREACTABLE",
"parameterless",
"Pullable",
"Pushable",
"pwsh",
"Reactable",
"reactables",
+ "REPONAME",
"runsettings",
"struct",
+ "TWOWAYPUSHPULLREACTABLE",
"unsubscriber",
"unsubscription",
"unsubscriptions",
diff --git a/create-pr.ps1 b/create-pr.ps1
index 19e2269..6df9304 100644
--- a/create-pr.ps1
+++ b/create-pr.ps1
@@ -1,50 +1 @@
-Clear-Host;
-
-Write-Host -NoNewline "Please enter an issue number: " -ForegroundColor Cyan;
-$issueNumber = Read-Host;
-
-if ($issueNumber -notmatch '^\d+$') {
- Write-Error "User input is not a number";
- exit 1;
-}
-
-Write-Host -NoNewline "Please enter a branch name: " -ForegroundColor Cyan;
-$branchDescrip = Read-Host;
-
-$branchDescrip = $branchDescrip.ToLower();
-$branchDescrip = $branchDescrip.Replace(" ", "-").Replace("_", "-");
-$branchDescrip = $branchDescrip.TrimStart("-");
-$branchDescrip = $branchDescrip.TrimEnd("-");
-
-$headBranch = "feature/$issueNumber-$branchDescrip";
-$commitMsg = "Start owrk for issue #$issueNumber";
-
-$destBranch = "not-set";
-
-$baseBranches = @("main", "preview");
-Write-Host -NoNewline "Please choose a base branch from the list [$($baseBranches -join ', ')]: " -ForegroundColor Cyan;
-$chosenBaseBranch = Read-Host;
-
-if ($baseBranches -contains $chosenBaseBranch) {
- $destBranch = $chosenBaseBranch;
-} else {
- Write-Error "Invalid base branch.";
- exit 1;
-}
-
-Write-Host "`n--------------------------------`n";
-
-Write-Host "Creating branch. . ." -ForegroundColor Yellow;
-git checkout -B "$headBranch";
-Write-Host "";
-
-Write-Host "Creating empty commit. . ." -ForegroundColor Yellow;
-git commit --allow-empty -m $commitMsg;
-Write-Host "";
-
-Write-Host "Pushing branch to remote. . ." -ForegroundColor Yellow;
-git push --set-upstream origin "$headBranch";
-Write-Host "";
-
-Write-Host "Creating PR. . ." -ForegroundColor Yellow;
-gh pr create -B $destBranch -b "" -t "new pr" -d;
+& "dev-tools/bin/kd-admin" create-pr;
diff --git a/dev-tools/bin/kd-admin b/dev-tools/bin/kd-admin
new file mode 100644
index 0000000..b873db2
--- /dev/null
+++ b/dev-tools/bin/kd-admin
@@ -0,0 +1,3 @@
+#!/bin/sh
+# generated by deno install
+deno "run" "--allow-read" "--allow-write" "--allow-net" "--allow-env" "--allow-run" "--no-config" "https://raw.githubusercontent.com/KinsonDigital/kd-admin/v1.0.0-preview.3/src/main.ts" "$@"
diff --git a/dev-tools/bin/kd-admin.cmd b/dev-tools/bin/kd-admin.cmd
new file mode 100644
index 0000000..8e3eaf4
--- /dev/null
+++ b/dev-tools/bin/kd-admin.cmd
@@ -0,0 +1,2 @@
+% generated by deno install %
+@deno "run" "--allow-read" "--allow-write" "--allow-net" "--allow-env" "--allow-run" "--no-config" "https://raw.githubusercontent.com/KinsonDigital/kd-admin/v1.0.0-preview.3/src/main.ts" %*
diff --git a/dev-tools/create-pr-settings.json b/dev-tools/create-pr-settings.json
new file mode 100644
index 0000000..68b1394
--- /dev/null
+++ b/dev-tools/create-pr-settings.json
@@ -0,0 +1,10 @@
+{
+ "$schema": "https://raw.githubusercontent.com/KinsonDigital/kd-admin/preview/schemas/create-pr-schema.json",
+ "ownerName": "KinsonDigital",
+ "repoName": "Carbonate",
+ "githubTokenEnvVarName": "CICD_TOKEN",
+ "baseBranches": [
+ "main",
+ "preview"
+ ]
+}
diff --git a/dev-tools/prepare-release-settings.json b/dev-tools/prepare-release-settings.json
new file mode 100644
index 0000000..b0d0b6a
--- /dev/null
+++ b/dev-tools/prepare-release-settings.json
@@ -0,0 +1,38 @@
+{
+ "$schema": "https://raw.githubusercontent.com/KinsonDigital/kd-admin/preview/schemas/prepare-release-schema.json",
+ "ownerName": "KinsonDigital",
+ "repoName": "Carbonate",
+ "orgProjectName": "KD-Team",
+ "releaseTypes": [
+ {
+ "name": "Preview",
+ "reviewer": "KinsonDigitalAdmin",
+ "assignee": "CalvinWilkinson",
+ "headBranch": "prev-release",
+ "baseBranch": "preview",
+ "genReleaseSettingsFilePath": "./dev-tools/prev-gen-release-notes-settings.json",
+ "releaseNotesDirPath": "./ReleaseNotes/PreviewReleases",
+ "releasePrTemplateFilePath": "./templates/prev-prepare-release-template.md",
+ "releaseLabels": [
+ "🚀preview-release"
+ ],
+ "prTitle": "🚀Preview Release (${VERSION})"
+ },
+ {
+ "name": "Production",
+ "reviewer": "KinsonDigitalAdmin",
+ "assignee": "CalvinWilkinson",
+ "headBranch": "prod-release",
+ "baseBranch": "main",
+ "genReleaseSettingsFilePath": "./dev-tools/prod-gen-release-notes-settings.json",
+ "releaseNotesDirPath": "./ReleaseNotes/ProductionReleases",
+ "releasePrTemplateFilePath": "./templates/prod-prepare-release-template.md",
+ "releaseLabels": [
+ "🚀production-release"
+ ],
+ "prTitle": "🚀Production Release (${VERSION})"
+ }
+ ],
+ "githubTokenEnvVarName": "CICD_TOKEN",
+ "versionFilePath": "./Carbonate/Carbonate.csproj"
+}
diff --git a/dev-tools/prev-gen-release-notes-settings.json b/dev-tools/prev-gen-release-notes-settings.json
new file mode 100644
index 0000000..ba0c519
--- /dev/null
+++ b/dev-tools/prev-gen-release-notes-settings.json
@@ -0,0 +1,60 @@
+{
+ "$schema": "https://raw.githubusercontent.com/KinsonDigital/kd-admin/preview/schemas/gen-release-notes-schema.json",
+ "ownerName": "KinsonDigital",
+ "repoName": "Carbonate",
+ "githubTokenEnvVarName": "CICD_TOKEN",
+ "milestoneName": "${VERSION}",
+ "headerText": "${REPONAME} Preview Release Notes - ${VERSION}",
+ "releaseType": "Preview",
+ "extraInfo": {
+ "title": "Quick Reminder",
+ "text": "As with all software, there is always a chance for issues and bugs, especially for preview releases, so your input is greatly appreciated. 🙏🏼"
+ },
+ "emojisToRemoveFromTitle": [
+ "🚧",
+ "🐛",
+ "✨",
+ "🚀",
+ "🧪",
+ "🔬"
+ ],
+ "issueCategoryLabelMappings": {
+ "New Features ✨": "✨new-feature",
+ "Enhancements 💎": "💎enhancement",
+ "Bug Fixes 🐛": "🐛bug",
+ "Breaking Changes 🧨": "🧨breaking-changes",
+ "Dependency Updates 📦": "📦dependency-update"
+ },
+ "prCategoryLabelMappings": {
+ "Dependency Updates 📦": "📦dependency-update"
+ },
+ "ignoreLabels": [
+ "🚀preview-release"
+ ],
+ "wordReplacements": {
+ "chore(deps): ": ""
+ },
+ "firstWordReplacements": {
+ "Add": "Added",
+ "Improve": "Improved",
+ "Fix": "Fixed",
+ "Update": "Updated",
+ "Upgrade": "Upgraded",
+ "Create": "Created",
+ "Refactor": "Refactored",
+ "Removed": "Removed",
+ "Implement": "Implemented",
+ "Move": "Moved",
+ "Change": "Changed",
+ "Increase": "Increased",
+ "Prevent": "Prevented",
+ "Introduce": "Introduced",
+ "Adjust": "Adjusted",
+ "Replace": "Replaced",
+ "Deprecate": "Deprecated",
+ "Integrate": "Integrated"
+ },
+ "boldedVersions": true,
+ "italicVersions": true,
+ "otherCategoryName": "Other 🪧"
+}
diff --git a/dev-tools/prod-gen-release-notes-settings.json b/dev-tools/prod-gen-release-notes-settings.json
new file mode 100644
index 0000000..91fb479
--- /dev/null
+++ b/dev-tools/prod-gen-release-notes-settings.json
@@ -0,0 +1,56 @@
+{
+ "$schema": "https://raw.githubusercontent.com/KinsonDigital/kd-admin/preview/schemas/gen-release-notes-schema.json",
+ "ownerName": "KinsonDigital",
+ "repoName": "Carbonate",
+ "githubTokenEnvVarName": "CICD_TOKEN",
+ "milestoneName": "${VERSION}",
+ "headerText": "${REPONAME} Production Release Notes - ${VERSION}",
+ "releaseType": "Production",
+ "emojisToRemoveFromTitle": [
+ "🚧",
+ "🐛",
+ "✨",
+ "🚀",
+ "🧪",
+ "🔬"
+ ],
+ "issueCategoryLabelMappings": {
+ "New Features ✨": "✨new-feature",
+ "Enhancements 💎": "💎enhancement",
+ "Bug Fixes 🐛": "🐛bug",
+ "Breaking Changes 🧨": "🧨breaking-changes",
+ "Dependency Updates 📦": "📦dependency-update"
+ },
+ "prCategoryLabelMappings": {
+ "Dependency Updates 📦": "📦dependency-update"
+ },
+ "ignoreLabels": [
+ "🚀production-release"
+ ],
+ "wordReplacements": {
+ "chore(deps): ": ""
+ },
+ "firstWordReplacements": {
+ "Add": "Added",
+ "Improve": "Improved",
+ "Fix": "Fixed",
+ "Update": "Updated",
+ "Upgrade": "Upgraded",
+ "Create": "Created",
+ "Refactor": "Refactored",
+ "Removed": "Removed",
+ "Implement": "Implemented",
+ "Move": "Moved",
+ "Change": "Changed",
+ "Increase": "Increased",
+ "Prevent": "Prevented",
+ "Introduce": "Introduced",
+ "Adjust": "Adjusted",
+ "Replace": "Replaced",
+ "Deprecate": "Deprecated",
+ "Integrate": "Integrated"
+ },
+ "boldedVersions": true,
+ "italicVersions": true,
+ "otherCategoryName": "Other 🪧"
+}
diff --git a/prepare-for-release.ps1 b/prepare-for-release.ps1
new file mode 100644
index 0000000..dce1917
--- /dev/null
+++ b/prepare-for-release.ps1
@@ -0,0 +1 @@
+& "dev-tools/bin/kd-admin" prepare-for-release;
diff --git a/templates/prev-prepare-release-template.md b/templates/prev-prepare-release-template.md
new file mode 100644
index 0000000..9a88d50
--- /dev/null
+++ b/templates/prev-prepare-release-template.md
@@ -0,0 +1,25 @@
+### Pre-Release ToDo List
+```[tasklist]
+- [ ] All issues in the assigned milestone are closed, and all issue tasks are complete.
+- [ ] Add _**`🚀preview-release`**_ label to this pull request.
+- [ ] The pull request is assigned to a project.
+- [ ] The pull request is assigned to a milestone.
+- [ ] All unit tests have been executed locally and have passed. _(Check out the appropriate release branch before running tests)_.
+- [ ] Auto-generated release notes have been reviewed and updated if necessary.
+- [ ] Manual QA Testing completed _(if applicable)_.
+- [ ] Release to **_preview_** completed. _(The release is performed by running the `🚀Release` workflow)_.
+```
+
+### Post-Release ToDo List
+```[tasklist]
+- [ ] The GitHub release has been created and is correct.
+```
+
+### Additional Information:
+
+**_Unit Tests
_**
+
+Reasons for local unit test execution:
+- Unit tests might pass locally but not in the CI environment during the status check process or vice-versa.
+- Tests might pass on the developer's machine but not necessarily on the code reviewer's machine.
+
diff --git a/templates/prod-prepare-release-template.md b/templates/prod-prepare-release-template.md
new file mode 100644
index 0000000..047b593
--- /dev/null
+++ b/templates/prod-prepare-release-template.md
@@ -0,0 +1,25 @@
+### Pre-Release ToDo List
+```[tasklist]
+- [ ] All issues in the assigned milestone are closed, and all issue tasks are complete.
+- [ ] Add _**`🚀production-release`**_ label to this pull request.
+- [ ] The pull request is assigned to a project.
+- [ ] The pull request is assigned to a milestone.
+- [ ] All unit tests have been executed locally and have passed. _(Check out the appropriate release branch before running tests)_.
+- [ ] Auto-generated release notes have been reviewed and updated if necessary.
+- [ ] Manual QA Testing completed _(if applicable)_.
+- [ ] Release to **_production_** completed. _(The release is performed by running the `🚀Release` workflow)_.
+```
+
+### Post-Release ToDo List
+```[tasklist]
+- [ ] The GitHub release has been created and is correct.
+```
+
+### Additional Information:
+
+**_Unit Tests
_**
+
+Reasons for local unit test execution:
+- Unit tests might pass locally but not in the CI environment during the status check process or vice-versa.
+- Tests might pass on the developer's machine but not necessarily on the code reviewer's machine.
+