diff --git a/.github/ISSUE_TEMPLATE/new-script.yaml b/.github/ISSUE_TEMPLATE/new-script.yaml index 419fd49b..e4ffbc8a 100644 --- a/.github/ISSUE_TEMPLATE/new-script.yaml +++ b/.github/ISSUE_TEMPLATE/new-script.yaml @@ -27,6 +27,17 @@ body: - PVE Tool (tools/pve) validations: required: true + - type: dropdown + id: arm64_support + attributes: + label: Does this script support arm64? + description: amd64 support is assumed. + options: + - arm64 supported + - arm64 not tested + - arm64 not supported + validations: + required: true - type: textarea id: task_details attributes: diff --git a/.github/agents/pve-script-creator.agent.md b/.github/agents/pve-script-creator.agent.md index 0fe427bf..ca88cc71 100644 --- a/.github/agents/pve-script-creator.agent.md +++ b/.github/agents/pve-script-creator.agent.md @@ -36,9 +36,10 @@ You are a specialist for creating and maintaining ProxmoxVED application scripts - All `apt` / `npm` / build commands must be prefixed with `$STD`. ### JSON Metadata -- Must include: `name`, `slug`, `categories`, `date_created`, `type`, `updateable`, `privileged`, `interface_port`, `documentation`, `website`, `logo`, `config_path`, `description`, `install_methods`, `default_credentials`, `notes`. +- Must include: `name`, `slug`, `categories`, `date_created`, `type`, `updateable`, `privileged`, `has_arm`, `interface_port`, `documentation`, `website`, `logo`, `config_path`, `description`, `install_methods`, `default_credentials`, `notes`. - `date_created` uses today's date (YYYY-MM-DD). - Resources in `install_methods` must match `var_*` values in the CT script. +- CT scripts must include `var_arm64="${var_arm64:-no}"` unless arm64 support has been verified. - Logo URL pattern: `https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/.webp` ## Checklist (verify before finishing) @@ -57,6 +58,8 @@ You are a specialist for creating and maintaining ProxmoxVED application scripts - [ ] `update_script()` present with backup/restore - [ ] Footer: `motd_ssh`, `customize`, `cleanup_lxc` - [ ] JSON metadata file matches CT script resources +- [ ] JSON `has_arm` accurately reflects arm64 support +- [ ] CT `var_arm64` accurately reflects arm64 support - [ ] Backups go to `/opt`, not `/tmp` ## Output Format diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 0f59af6b..7e48f11e 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -16,6 +16,14 @@ Link: # --- +## arm64 Support (**X** in brackets) + +- [ ] **arm64 supported** - Tested and supported on arm64. +- [ ] **arm64 not tested** - Assumed to work on arm64, but testing has not been done. +- [ ] **arm64 not supported** - Confirmed upstream dependencies or binaries do not support arm64. + +--- + ## 🛠️ Type of Change (**X** in brackets) - [ ] 🐞 **Bug fix** – Resolves an issue without breaking functionality. diff --git a/.github/workflows/push_json_to_pocketbase.yml b/.github/workflows/push_json_to_pocketbase.yml index b2fca5a1..67134418 100644 --- a/.github/workflows/push_json_to_pocketbase.yml +++ b/.github/workflows/push_json_to_pocketbase.yml @@ -230,6 +230,7 @@ jobs: if (resolvedType) payload.type = resolvedType; var resolvedCats = (data.categories || []).map(function(n) { return categoryNameToPbId[categoryIdToName[n]]; }).filter(Boolean); if (resolvedCats.length) payload.categories = resolvedCats; + if (data.has_arm !== undefined) payload.has_arm = data.has_arm === true || data.has_arm === 'true'; if (data.version !== undefined) payload.version = data.version; if (data.changelog !== undefined) payload.changelog = data.changelog; if (data.screenshots !== undefined) payload.screenshots = data.screenshots; diff --git a/.github/workflows/unmet-pr-close.yml b/.github/workflows/unmet-pr-close.yml index e107ecc6..a5c70e51 100644 --- a/.github/workflows/unmet-pr-close.yml +++ b/.github/workflows/unmet-pr-close.yml @@ -91,6 +91,19 @@ jobs: } } + const architectureOptions = [ + "**arm64 supported**", + "**arm64 not tested**", + "**arm64 not supported**" + ]; + const hasArchitectureSelection = architectureOptions.some(req => { + const line = findLine(req); + return line && checkboxChecked(line); + }); + if (!hasArchitectureSelection) { + missing.push("One arm64 support option (`arm64 supported`, `arm64 not tested`, or `arm64 not supported`) must be checked"); + } + if (missing.length > 0) { let list = ""; for (const m of missing) { diff --git a/docs/contribution/GUIDE.md b/docs/contribution/GUIDE.md index 52c4d950..52907b40 100644 --- a/docs/contribution/GUIDE.md +++ b/docs/contribution/GUIDE.md @@ -274,6 +274,7 @@ var_ram="2048" # Min RAM needed (MB) var_disk="10" # Min disk (GB) var_os="debian" # OS type var_version="12" # OS version +var_arm64="${var_arm64:-no}" # arm64 support (no unless verified) var_unprivileged="1" # Security (1=unprivileged) header_info "$APP" diff --git a/docs/contribution/templates_ct/AppName.md b/docs/contribution/templates_ct/AppName.md index 8507c7c2..504ac9ab 100644 --- a/docs/contribution/templates_ct/AppName.md +++ b/docs/contribution/templates_ct/AppName.md @@ -101,6 +101,7 @@ Example: >| `var_disk` | Disk capacity | In GB | >| `var_os` | Operating system | alpine, debian, ubuntu | >| `var_version` | OS version | e.g., 3.20, 11, 12, 20.04 | +>| `var_arm64` | arm64 support | `no` unless arm64 support is verified | >| `var_unprivileged` | Container type | 1 = Unprivileged, 0 = Privileged | Example: @@ -113,6 +114,7 @@ var_ram="2048" var_disk="4" var_os="debian" var_version="12" +var_arm64="${var_arm64:-no}" var_unprivileged="1" ``` diff --git a/docs/contribution/templates_ct/AppName.sh b/docs/contribution/templates_ct/AppName.sh index cf9333c4..8155ab30 100644 --- a/docs/contribution/templates_ct/AppName.sh +++ b/docs/contribution/templates_ct/AppName.sh @@ -20,6 +20,8 @@ var_os="[OS]" # Default OS (e.g. debian, ubuntu, alpine) var_version="[VERSION]" # Default OS version (e.g. 12 for debian, 24.04 for ubuntu, 3.20 for alpine) +var_arm64="${var_arm64:-no}" +# arm64 support status; default to no unless verified var_unprivileged="[UNPRIVILEGED]" # 1 = unprivileged container, 0 = privileged container