/etc/systemd/system/"${APPLICATION}".service
-[Unit]
-Description=${APPLICATION} Service
-After=network.target
-
-[Service]
-ExecStart=[START_COMMAND]
-Restart=always
-
-[Install]
-WantedBy=multi-user.target
-EOF
-systemctl enable -q --now "${APPLICATION}"
-msg_ok "Created Service"
-
-motd_ssh
-customize
-
-# Cleanup
-msg_info "Cleaning up"
-rm -f "${RELEASE}".zip
-$STD apt-get -y autoremove
-$STD apt-get -y autoclean
-msg_ok "Cleaned"
diff --git a/.github/autolabeler-config.json b/.github/autolabeler-config.json
index 342a1e38f1..f071411a5e 100644
--- a/.github/autolabeler-config.json
+++ b/.github/autolabeler-config.json
@@ -4,9 +4,7 @@
"fileStatus": "added",
"includeGlobs": [
"ct/**",
- "tools/**",
"install/**",
- "misc/**",
"turnkey/**",
"vm/**"
],
@@ -18,9 +16,7 @@
"fileStatus": "modified",
"includeGlobs": [
"ct/**",
- "tools/**",
"install/**",
- "misc/**",
"turnkey/**",
"vm/**"
],
@@ -32,71 +28,27 @@
"fileStatus": "removed",
"includeGlobs": [
"ct/**",
- "tools/**",
"install/**",
- "misc/**",
"turnkey/**",
"vm/**"
],
"excludeGlobs": []
}
],
- "maintenance": [
+ "vm": [
{
"fileStatus": null,
"includeGlobs": [
- "*.md"
+ "vm/**"
],
"excludeGlobs": []
}
],
- "core": [
+ "tools": [
{
"fileStatus": null,
"includeGlobs": [
- "misc/*.func",
- "misc/create_lxc.sh"
- ],
- "excludeGlobs": [
- "misc/api.func"
- ]
- }
- ],
- "website": [
- {
- "fileStatus": null,
- "includeGlobs": [
- "frontend/**"
- ],
- "excludeGlobs": [
- "frontend/public/json/**"
- ]
- }
- ],
- "api": [
- {
- "fileStatus": null,
- "includeGlobs": [
- "api/**",
- "misc/api.func"
- ],
- "excludeGlobs": []
- }
- ],
- "github": [
- {
- "fileStatus": null,
- "includeGlobs": [
- ".github/**"
- ],
- "excludeGlobs": []
- }
- ],
- "json": [
- {
- "fileStatus": "modified",
- "includeGlobs": [
- "frontend/public/json/**"
+ "tools/**"
],
"excludeGlobs": []
}
@@ -119,11 +71,65 @@
"excludeGlobs": []
}
],
- "vm": [
+ "core": [
{
"fileStatus": null,
"includeGlobs": [
- "vm/**"
+ "misc/*.func"
+ ],
+ "excludeGlobs": [
+ "misc/api.func"
+ ]
+ }
+ ],
+ "documentation": [
+ {
+ "fileStatus": null,
+ "includeGlobs": [
+ "docs/**"
+ ],
+ "excludeGlobs": []
+ }
+ ],
+ "github": [
+ {
+ "fileStatus": null,
+ "includeGlobs": [
+ ".github/**",
+ "README.md",
+ "SECURITY.md",
+ "LICENSE",
+ "CHANGELOG.md"
+ ],
+ "excludeGlobs": []
+ }
+ ],
+ "api": [
+ {
+ "fileStatus": null,
+ "includeGlobs": [
+ "api/**",
+ "misc/api.func"
+ ],
+ "excludeGlobs": []
+ }
+ ],
+ "website": [
+ {
+ "fileStatus": null,
+ "includeGlobs": [
+ "frontend/**"
+ ],
+ "excludeGlobs": [
+ "frontend/public/json/**"
+ ]
+ }
+ ],
+ "json": [
+ {
+ "fileStatus": "modified",
+ "includeGlobs": [
+ "frontend/public/json/**"
],
"excludeGlobs": []
}
diff --git a/.github/changelog-pr-config.json b/.github/changelog-pr-config.json
index e556703d0e..fedda7313c 100644
--- a/.github/changelog-pr-config.json
+++ b/.github/changelog-pr-config.json
@@ -42,9 +42,15 @@
]
},
{
- "title": "π§° Maintenance",
+ "title": "ποΈ Deleted Scripts",
"labels": [
- "maintenance"
+ "delete script"
+ ]
+ },
+ {
+ "title": "πΎ Core",
+ "labels": [
+ "core"
],
"subCategories": [
{
@@ -69,30 +75,86 @@
"notes": []
},
{
- "title": "π‘ API",
+ "title": "π§ Refactor",
"labels": [
- "api"
+ "refactor"
+ ],
+ "notes": []
+ }
+ ]
+ },
+ {
+ "title": "π§° Tools",
+ "labels": [
+ "tools"
+ ],
+ "subCategories": [
+ {
+ "title": "π Bug Fixes",
+ "labels": [
+ "bugfix"
],
"notes": []
},
{
- "title": "πΎ Core",
+ "title": "β¨ New Features",
"labels": [
- "core"
+ "feature"
],
"notes": []
},
{
- "title": "π Github",
+ "title": "π₯ Breaking Changes",
"labels": [
- "github"
+ "breaking change"
],
"notes": []
},
{
- "title": "π Documentation",
+ "title": "π§ Refactor",
"labels": [
- "maintenance"
+ "refactor"
+ ],
+ "notes": []
+ }
+ ]
+ },
+ {
+ "title": "π Documentation",
+ "labels": [
+ "documentation"
+ ]
+ },
+ {
+ "title": "π Github",
+ "labels": [
+ "github"
+ ]
+ },
+ {
+ "title": "π‘ API",
+ "labels": [
+ "api"
+ ],
+ "subCategories": [
+ {
+ "title": "π Bug Fixes",
+ "labels": [
+ "bugfix"
+ ],
+ "notes": []
+ },
+ {
+ "title": "β¨ New Features",
+ "labels": [
+ "feature"
+ ],
+ "notes": []
+ },
+ {
+ "title": "π₯ Breaking Changes",
+ "labels": [
+ "breaking change"
],
"notes": []
},
@@ -142,7 +204,9 @@
]
},
{
- "title": "β Unlabelled",
- "labels": []
+ "title": "β Uncategorized",
+ "labels": [
+ "needs triage"
+ ]
}
]
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 82aabf27f2..eacf89c789 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -1,27 +1,26 @@
-
-## βοΈ Description
+## βοΈ Description
+## π Related Issue
-## π Related PR / Issue
-Link: #
+Fixes #
+## β
Prerequisites (**X** in brackets)
-## β
Prerequisites (**X** in brackets)
-
-- [ ] **Self-review completed** β Code follows project standards.
-- [ ] **Tested thoroughly** β Changes work as expected.
-- [ ] **No security risks** β No hardcoded secrets, unnecessary privilege escalations, or permission issues.
+- [ ] **Self-review completed** β Code follows project standards.
+- [ ] **Tested thoroughly** β Changes work as expected.
+- [ ] **No security risks** β No hardcoded secrets, unnecessary privilege escalations, or permission issues.
---
-## π οΈ Type of Change (**X** in brackets)
+## π οΈ Type of Change (**X** in brackets)
-- [ ] π **Bug fix** β Resolves an issue without breaking functionality.
-- [ ] β¨ **New feature** β Adds new, non-breaking functionality.
-- [ ] π₯ **Breaking change** β Alters existing functionality in a way that may require updates.
-- [ ] π **New script** β A fully functional and tested script or script set.
-- [ ] π **Website update** β Changes to website-related JSON files or metadata.
-- [ ] π§ **Refactoring / Code Cleanup** β Improves readability or maintainability without changing functionality.
-- [ ] π **Documentation update** β Changes to `README`, `AppName.md`, `CONTRIBUTING.md`, or other docs.
+- [ ] π **Bug fix** β Resolves an issue without breaking functionality.
+- [ ] β¨ **New feature** β Adds new, non-breaking functionality.
+- [ ] π₯ **Breaking change** β Alters existing functionality in a way that may require updates.
+- [ ] π **New script** β A fully functional and tested script or script set.
+- [ ] π **Website update** β Changes to website-related JSON files or metadata.
+- [ ] π§ **Refactoring / Code Cleanup** β Improves readability or maintainability without changing functionality.
+- [ ] π **Documentation update** β Changes to `README`, `AppName.md`, `CONTRIBUTING.md`, or other docs.
diff --git a/.github/workflows/autolabeler.yml b/.github/workflows/autolabeler.yml
index 03472a33f8..50ddb5d142 100644
--- a/.github/workflows/autolabeler.yml
+++ b/.github/workflows/autolabeler.yml
@@ -57,10 +57,10 @@ jobs:
if (shouldAddLabel) {
labelsToAdd.add(label);
- if (label === "update script") {
+ // Add specific sub-labels for tools
+ if (label === "tools") {
for (const prFile of prFiles) {
const filename = prFile.filename;
- if (filename.startsWith("vm/")) labelsToAdd.add("vm");
if (filename.startsWith("tools/addon/")) labelsToAdd.add("addon");
if (filename.startsWith("tools/pve/")) labelsToAdd.add("pve-tool");
}
@@ -68,38 +68,42 @@ jobs:
}
}
- if (labelsToAdd.size < 2) {
- const templateLabelMappings = {
- "π **Bug fix**": "bugfix",
- "β¨ **New feature**": "feature",
- "π₯ **Breaking change**": "breaking change",
- "π **New script**": "new script",
- "π **Website update**": "website", // handled special
- "π§ **Refactoring / Code Cleanup**": "refactor",
- "π **Documentation update**": "documentation" // mapped to maintenance
- };
+ // Always parse template checkboxes to add content-type labels (bugfix, feature, etc.)
+ const templateLabelMappings = {
+ "π **Bug fix**": "bugfix",
+ "β¨ **New feature**": "feature",
+ "π₯ **Breaking change**": "breaking change",
+ "π **New script**": "new script",
+ "π§ **Refactoring / Code Cleanup**": "refactor",
+ "π **Documentation update**": "documentation"
+ };
- for (const [checkbox, label] of Object.entries(templateLabelMappings)) {
- const escapedCheckbox = checkbox.replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1");
- const regex = new RegExp(`- \\[(x|X)\\]\\s*${escapedCheckbox}`, "i");
+ for (const [checkbox, label] of Object.entries(templateLabelMappings)) {
+ const escapedCheckbox = checkbox.replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1");
+ const regex = new RegExp(`- \\[(x|X)\\]\\s*${escapedCheckbox}`, "i");
- if (regex.test(prBody)) {
- if (label === "website") {
- const hasJson = prFiles.some((f) => f.filename.startsWith("frontend/public/json/"));
- const hasUpdateScript = labelsToAdd.has("update script");
- const hasContentLabel = ["bugfix", "feature", "refactor"].some((l) => labelsToAdd.has(l));
-
- if (!(hasUpdateScript && hasContentLabel)) {
- labelsToAdd.add(hasJson ? "json" : "website");
- }
- } else if (label === "documentation") {
- labelsToAdd.add("maintenance");
- } else {
- labelsToAdd.add(label);
- }
- }
+ if (regex.test(prBody)) {
+ labelsToAdd.add(label);
}
}
+
+ // Handle website checkbox specially - only add if not already an update script with content label
+ const websiteCheckbox = "π **Website update**";
+ const escapedWebsite = websiteCheckbox.replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1");
+ const websiteRegex = new RegExp(`- \\[(x|X)\\]\\s*${escapedWebsite}`, "i");
+
+ if (websiteRegex.test(prBody)) {
+ const hasJson = prFiles.some((f) => f.filename.startsWith("frontend/public/json/"));
+ const hasUpdateScript = labelsToAdd.has("update script");
+ const hasContentLabel = ["bugfix", "feature", "refactor"].some((l) => labelsToAdd.has(l));
+
+ // If it's an update script PR with json changes and a content label, skip adding website/json
+ // The PR should be categorized as update script with the content label
+ if (!(hasUpdateScript && hasJson && hasContentLabel)) {
+ labelsToAdd.add(hasJson ? "json" : "website");
+ }
+ }
+
if (labelsToAdd.size === 0) {
labelsToAdd.add("needs triage");
}
diff --git a/.github/workflows/changelog-pr.yml b/.github/workflows/changelog-pr.yml
index d21f47c3d5..24bc6128dd 100644
--- a/.github/workflows/changelog-pr.yml
+++ b/.github/workflows/changelog-pr.yml
@@ -157,13 +157,31 @@ jobs:
let categorized = false;
const priorityCategories = categorizedPRs.slice();
+
+ // Priority order for content-type labels (highest priority first)
+ const subCategoryPriority = ["breaking change", "bugfix", "feature", "refactor"];
+
for (const category of priorityCategories) {
if (categorized) break;
if (category.labels.some(label => prLabels.includes(label))) {
if (category.subCategories && category.subCategories.length > 0) {
- const subCategory = category.subCategories.find(sub =>
- sub.labels.some(label => prLabels.includes(label))
- );
+ // Find subcategory by priority order instead of first match
+ let subCategory = null;
+ for (const priorityLabel of subCategoryPriority) {
+ if (prLabels.includes(priorityLabel)) {
+ subCategory = category.subCategories.find(sub =>
+ sub.labels.includes(priorityLabel)
+ );
+ if (subCategory) break;
+ }
+ }
+
+ // Fallback: check for any other subcategory match (api, github, json, etc.)
+ if (!subCategory) {
+ subCategory = category.subCategories.find(sub =>
+ sub.labels.some(label => prLabels.includes(label))
+ );
+ }
if (subCategory) {
subCategory.notes.push(prNote);
@@ -176,6 +194,15 @@ jobs:
categorized = true;
}
}
+
+ // Fallback: Add to Uncategorized if no category matched
+ if (!categorized) {
+ const uncategorized = categorizedPRs.find(category =>
+ category.title.includes("Uncategorized") || category.labels.includes("needs triage"));
+ if (uncategorized) {
+ uncategorized.notes.push(prNote);
+ }
+ }
}
}
diff --git a/.github/workflows/validate-filenames.yml b/.github/workflows/validate-filenames.yml
index d6c4ec63fe..211be06df0 100644
--- a/.github/workflows/validate-filenames.yml
+++ b/.github/workflows/validate-filenames.yml
@@ -51,10 +51,6 @@ jobs:
NON_COMPLIANT_FILES=""
for FILE in $CHANGED_FILES; do
- # Skip File "misc/create_lxc.sh"
- if [[ "$FILE" == "misc/create_lxc.sh" ]]; then
- continue
- fi
BASENAME=$(echo "$(basename "${FILE%.*}")")
if [[ ! "$BASENAME" =~ ^[a-z0-9-]+$ ]]; then
NON_COMPLIANT_FILES="$NON_COMPLIANT_FILES $FILE"
diff --git a/README.md b/README.md
index b33f7d492f..e467bdb7d1 100644
--- a/README.md
+++ b/README.md
@@ -17,10 +17,10 @@
-
+
-
+
@@ -30,8 +30,8 @@
- > **Simplify your Proxmox VE setup with community-driven automation scripts**
- > Originally created by tteck, now maintained and expanded by the community
+> **Simplify your Proxmox VE setup with community-driven automation scripts**
+> Originally created by tteck, now maintained and expanded by the community
@@ -214,7 +214,7 @@ This adds a menu to your Proxmox interface for easy script access without visiti
- π Check our **[Contributing Guidelines](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md)** to get started
+ π Check our **[Contributing Guidelines](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/README.md)** to get started
diff --git a/docs/contribution/CONTRIBUTING.md b/docs/contribution/CONTRIBUTING.md
index f5a46fcd1e..02eb9d24b8 100644
--- a/docs/contribution/CONTRIBUTING.md
+++ b/docs/contribution/CONTRIBUTING.md
@@ -1,7 +1,6 @@
-
# Community Scripts Contribution Guide
-## **Welcome to the communty-scripts Repository!**
+## **Welcome to the communty-scripts Repository!**
π These documents outline the essential coding standards for all our scripts and JSON files. Adhering to these standards ensures that our codebase remains consistent, readable, and maintainable. By following these guidelines, we can improve collaboration, reduce errors, and enhance the overall quality of our project.
@@ -28,7 +27,6 @@ By following the coding standards outlined in this document, we ensure that our
Let's work together to keep our codebase clean, efficient, and maintainable! πͺπ
-
## Getting Started
Before contributing, please ensure that you have the following setup:
@@ -40,67 +38,73 @@ Before contributing, please ensure that you have the following setup:
- [Shell Format](https://marketplace.visualstudio.com/items?itemName=foxundermoon.shell-format)
### Important Notes
-- Use [AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.sh) and [AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh) as templates when creating new scripts.
+
+- Use [AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/templates_ct/AppName.sh) and [AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/templates_install/AppName-install.sh) as templates when creating new scripts.
---
# π The Application Script (ct/AppName.sh)
-- You can find all coding standards, as well as the structure for this file [here](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.md).
+- You can find all coding standards, as well as the structure for this file [here](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/templates_ct/AppName.md).
- These scripts are responsible for container creation, setting the necessary variables and handling the update of the application once installed.
---
# π The Installation Script (install/AppName-install.sh)
-- You can find all coding standards, as well as the structure for this file [here](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.md).
+- You can find all coding standards, as well as the structure for this file [here](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/templates_install/AppName-install.md).
- These scripts are responsible for the installation of the application.
---
## π Building Your Own Scripts
-Start with the [template script](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh)
+Start with the [template script](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/templates_install/AppName-install.sh)
---
## π€ Contribution Process
### 1. Fork the repository
+
Fork to your GitHub account
-### 2. Clone your fork on your local environment
+### 2. Clone your fork on your local environment
+
```bash
git clone https://github.com/yourUserName/ForkName
```
### 3. Create a new branch
+
```bash
git switch -c your-feature-branch
```
### 4. Change paths in build.func install.func and AppName.sh
+
To be able to develop from your own branch you need to change `https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main` to `https://raw.githubusercontent.com/[USER]/[REPOSITORY]/refs/heads/[BRANCH]`. You need to make this change atleast in misc/build.func misc/install.func and in your ct/AppName.sh. This change is only for testing. Before opening a Pull Request you should change this line change all this back to point to `https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main`.
### 4. Commit changes (without build.func and install.func!)
+
```bash
git commit -m "Your commit message"
```
### 5. Push to your fork
+
```bash
git push origin your-feature-branch
```
### 6. Create a Pull Request
+
Open a Pull Request from your feature branch to the main repository branch. You must only include your **$AppName.sh**, **$AppName-install.sh** and **$AppName.json** files in the pull request.
---
## π Pages
-- [CT Template: AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.sh)
-- [Install Template: AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh)
-- [JSON Template: AppName.json](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/json/AppName.json)
-
-
+- [CT Template: AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/templates_ct/AppName.sh)
+- [Install Template: AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/templates_install/AppName-install.sh)
+- [JSON Template: AppName.json](https://github.com/community-scripts/ProxmoxVE/blob/main/docs/contribution/templates_json/AppName.json)
diff --git a/.github/CONTRIBUTOR_AND_GUIDES/json/AppName.json b/docs/contribution/templates_json/AppName.json
similarity index 100%
rename from .github/CONTRIBUTOR_AND_GUIDES/json/AppName.json
rename to docs/contribution/templates_json/AppName.json
diff --git a/.github/CONTRIBUTOR_AND_GUIDES/json/AppName.md b/docs/contribution/templates_json/AppName.md
similarity index 100%
rename from .github/CONTRIBUTOR_AND_GUIDES/json/AppName.md
rename to docs/contribution/templates_json/AppName.md