diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 3874dc3..b17f46e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,8 +1,19 @@ name: 🐛 Bug report description: Report a new bug or issue. title: '[Bug]: ' -labels: ['bug'] +labels: ['bug', "needs confirmation"] body: + - type: dropdown + id: component + attributes: + label: Component + description: Which part of Beszel is this about? + options: + - Hub + - Agent + - Hub & Agent + validations: + required: true - type: markdown attributes: value: | @@ -43,6 +54,39 @@ body: 3. Pour it into a cup. validations: required: true + - type: dropdown + id: category + attributes: + label: Category + description: Which category does this relate to most? + options: + - Metrics + - Charts & Visualization + - Settings & Configuration + - Notifications & Alerts + - Authentication + - Installation + - Performance + - UI / UX + - Other + validations: + required: true + - type: dropdown + id: metrics + attributes: + label: Affected Metrics + description: If applicable, which specific metric does this relate to most? + options: + - CPU + - Memory + - Storage + - Network + - Containers + - GPU + - Sensors + - Other + validations: + required: true - type: input id: system attributes: @@ -61,7 +105,6 @@ body: id: install-method attributes: label: Installation method - default: 0 options: - Docker - Binary diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 17a1b3e..f8e7bd3 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,8 +1,19 @@ name: 🚀 Feature request description: Request a new feature or change. title: "[Feature]: " -labels: ["enhancement"] +labels: ["enhancement", "needs review"] body: + - type: dropdown + id: component + attributes: + label: Component + description: Which part of Beszel is this about? + options: + - Hub + - Agent + - Hub & Agent + validations: + required: true - type: markdown attributes: value: Before submitting, please search existing [issues](https://github.com/henrygd/beszel/issues) and [discussions](https://github.com/henrygd/beszel/discussions) (including closed). @@ -11,8 +22,55 @@ body: label: Describe the feature you would like to see validations: required: true + - type: textarea + id: motivation + attributes: + label: Motivation / Use Case + description: Why do you want this feature? What problem does it solve? + validations: + required: true - type: textarea attributes: label: Describe how you would like to see this feature implemented validations: required: true + - type: textarea + id: logs + attributes: + label: Screenshots + description: Please attach any relevant screenshots, such as images from your current solution or similar implementations. + validations: + required: false + - type: dropdown + id: category + attributes: + label: Category + description: Which category does this relate to most? + options: + - Metrics + - Charts & Visualization + - Settings & Configuration + - Notifications & Alerts + - Authentication + - Installation + - Performance + - UI / UX + - Other + validations: + required: true + - type: dropdown + id: metrics + attributes: + label: Affected Metrics + description: If applicable, which specific metric does this relate to most? + options: + - CPU + - Memory + - Storage + - Network + - Containers + - GPU + - Sensors + - Other + validations: + required: true \ No newline at end of file diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..16c6222 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,33 @@ +## 📃 Description + +A short description of the pull request changes should go here and the sections below should list in detail all changes. You can remove the sections you don't need. + +## 📖 Documentation + +Add a link to the PR for [documentation](https://github.com/henrygd/beszel-docs) changes. + +## 🪵 Changelog + +### ➕ Added + +- one +- two + +### ✏️ Changed + +- one +- two + +### 🔧 Fixed + +- one +- two + +### 🗑️ Removed + +- one +- two + +## 📷 Screenshots + +If this PR has any UI/UX changes it's strongly suggested you add screenshots here. diff --git a/.github/workflows/inactivity-actions.yml b/.github/workflows/inactivity-actions.yml new file mode 100644 index 0000000..d80b6dc --- /dev/null +++ b/.github/workflows/inactivity-actions.yml @@ -0,0 +1,43 @@ +name: 'Issue and PR Maintenance' + +on: + schedule: + - cron: '0 0 * * *' # runs at midnight UTC + workflow_dispatch: + +permissions: + issues: write + pull-requests: write + +jobs: + close-stale: + name: Close Stale Issues + runs-on: ubuntu-24.04 + steps: + - name: Close Stale Issues + uses: actions/stale@v9 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + + # Messaging + stale-issue-message: > + 👋 This issue has been automatically marked as stale due to inactivity. + If this issue is still relevant, please comment to keep it open. + Without activity, it will be closed in 7 days. + + close-issue-message: > + 🔒 This issue has been automatically closed due to prolonged inactivity. + Feel free to open a new issue if you have further questions or concerns. + + # Timing + days-before-issue-stale: 14 + days-before-issue-close: 7 + + # Labels + stale-issue-label: 'stale' + remove-stale-when-updated: true + only-issue-labels: 'awaiting-requester' + + # Exemptions + exempt-assignees: true + exempt-milestones: true \ No newline at end of file diff --git a/.github/workflows/label-from-dropdown.yml b/.github/workflows/label-from-dropdown.yml new file mode 100644 index 0000000..f0cb9e5 --- /dev/null +++ b/.github/workflows/label-from-dropdown.yml @@ -0,0 +1,84 @@ +name: Label issues from dropdowns + +on: + issues: + types: [opened] + +jobs: + label_from_dropdown: + runs-on: ubuntu-latest + permissions: + issues: write + steps: + - name: Apply labels based on dropdown choices + uses: actions/github-script@v7 + with: + script: | + const areaLabels = ['Metrics', 'Charts & Visualization', 'Settings & Configuration', 'Notifications & Alerts', 'Authentication', 'Installation', 'Performance', 'UI / UX', 'Other']; + const componentLabels = ['CPU', 'Memory', 'Storage', 'Network', 'Containers', 'GPU', 'Sensors', 'Other']; + + const issueNumber = context.issue.number; + const owner = context.repo.owner; + const repo = context.repo.repo; + + // Get the issue body + const body = context.payload.issue.body; + + // Helper to find dropdown value in the body (assuming markdown format) + function extractSectionValue(heading) { + const regex = new RegExp(`### ${heading}\\s+([\\s\\S]*?)(?:\\n###|$)`, 'i'); + const match = body.match(regex); + if (match) { + // Get the first non-empty line after the heading + const lines = match[1].split('\n').map(l => l.trim()).filter(Boolean); + return lines[0] || null; + } + return null; + } + + // Extract dropdown selections + const product = extractSectionValue('Product'); + const area = extractSectionValue('Area'); + const component = extractSectionValue('Component'); + + // Build labels to add + let labelsToAdd = []; + if (product) labelsToAdd.push(product); + if (area) labelsToAdd.push(area); + if (component) labelsToAdd.push(component); + + // Get existing labels in the repo + const { data: existingLabels } = await github.rest.issues.listLabelsForRepo({ + owner, + repo, + per_page: 100 + }); + const existingLabelNames = existingLabels.map(l => l.name); + + // Find labels that need to be created + const labelsToCreate = labelsToAdd.filter(label => !existingLabelNames.includes(label)); + + // Create missing labels (with a default color) + for (const label of labelsToCreate) { + try { + await github.rest.issues.createLabel({ + owner, + repo, + name: label, + color: 'ededed' // light gray, you can pick any hex color + }); + } catch (e) { + // Ignore if label already exists (race condition), otherwise rethrow + if (!e || e.status !== 422) throw e; + } + } + + // Now apply all labels (they all exist now) + if (labelsToAdd.length > 0) { + await github.rest.issues.addLabels({ + owner, + repo, + issue_number: issueNumber, + labels: labelsToAdd + }); + } \ No newline at end of file