Skip to content

Commit c188059

Browse files
committed
chore: unify issue labeling automation and reduce false positives
chore(deps): bump webfactory/ssh-agent from 0.9.0 to 0.10.0 (#4910) Bumps [webfactory/ssh-agent](https://github.com/webfactory/ssh-agent) from 0.9.0 to 0.10.0. - [Release notes](https://github.com/webfactory/ssh-agent/releases) - [Changelog](https://github.com/webfactory/ssh-agent/blob/master/CHANGELOG.md) - [Commits](webfactory/ssh-agent@v0.9.0...v0.10.0) --- updated-dependencies: - dependency-name: webfactory/ssh-agent dependency-version: 0.10.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> chore(deps): bump dessant/lock-threads from 5 to 6 (#4909) Bumps [dessant/lock-threads](https://github.com/dessant/lock-threads) from 5 to 6. - [Release notes](https://github.com/dessant/lock-threads/releases) - [Changelog](https://github.com/dessant/lock-threads/blob/main/CHANGELOG.md) - [Commits](dessant/lock-threads@v5...v6) --- updated-dependencies: - dependency-name: dessant/lock-threads dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> feat: sync GitHub issue types with `type:` labels feat: enable manual backfill for issue labels This change introduces a `workflow_dispatch` triggered job that allows for manually re-evaluating and applying labels to existing issues. The new job iterates through a specified set of issues (filtered by state and an optional limit), adds a temporary `maintenance: relabel-backfill` label, and immediately removes it. The primary `labeling-issues` workflow is updated to specifically *not* ignore these bot-generated label events when the temporary label is involved, thus forcing a re-evaluation of the issue by the current labeling logic. This provides a mechanism to correct mislabeled issues or apply updated labeling rules to the entire issue backlog. feat: enhance relabel backfill with detailed summary and update github-script This change significantly improves the observability of the manual issue relabel backfill workflow by introducing: - Detailed console logging for each issue being processed. - A comprehensive `core.summary` output in the workflow run, providing tables for overall statistics, processed issues, and any encountered failures. Additionally, the `actions/github-script` action is updated to v8. chore: make issue type inference more robust by respecting existing labels Previously, the automated issue type inference relied solely on the issue title. This could result in valid `type:` labels being removed if the title was ambiguous or didn't explicitly match a predefined pattern. This change introduces a fallback mechanism where existing `type:` labels are considered if a type cannot be clearly inferred from the title. This reduces unnecessary label churn and improves the accuracy of automated labeling. fix: backfill runs triage inline instead of label-toggle GitHub does not fire new workflow runs when GITHUB_TOKEN creates label events (built-in loop prevention). Replace the label-toggle backfill approach with an inline version that mirrors the deterministic reconciliation logic from issue-ai-maintenance directly: type labels, command/distro labels, game/engine labels, Issue Type GraphQL sync, and tmux false-positive cleanup. No AI call is made during backfill. Also removes the now-unnecessary BACKFILL_TRIGGER_LABEL exemption from the bot-loop guard in issue-ai-maintenance. fix: track issue type + locked state in backfill summary - Add 'Issue Type set' column to processed issues summary table - Track issueTypeSet per issue (null when already correct/unchanged) - Skip REST label mutations for locked issues (they return 403) with a console note; Issue Type GraphQL sync still runs for locked issues - Show lock emoji in issue number column when issue is locked - Track actual applied add/remove counts (not desired counts) fix: allow backfill label updates on locked issues Remove locked-issue skip branch in backfill so label add/remove operations run for locked issues as well. Keep lock marker in summary for visibility. fix: keep legacy server request issues classified correctly Recognize 'server request' anywhere in issue titles (e.g. '[callofduty1] Server Request') and prefer type: game server request over generic feature when both labels exist. Apply this in both issue-ai-maintenance and backfill logic. fix: classify legacy server-request titles in backfill and maintenance Detect legacy server-request phrasing in issue titles: - bracketed game/server titles ending with 'Creation' - titles containing 'Server Creation' - titles containing 'Server Support' or 'Support for ... server' Apply the same heuristics in both issue-ai-maintenance and backfill inferTypeFromTitle paths so old issues are not downgraded to feature. feat: infer game labels from legacy issue text in relabel When no structured Game form section is present, infer game labels/scripts deterministically from title/body using serverlist alias mappings. Apply this to both issue-ai-maintenance and backfill to improve historical game labeling without relying on AI. feat: add optional AI fallback for backfill game detection Add workflow_dispatch input ai_game_fallback (default false). In backfill mode, only call AI when deterministic game mapping finds no match; accept only high-confidence results and map through known game aliases/labels. Include AI usage stats in the run summary table. fix: avoid pruning legacy game labels without structured game input Only remove existing game:* labels when an issue has explicit structured Game form selections. For legacy title/body inference (and AI fallback), add matched game labels but do not remove other existing game labels. This prevents edge cases like issue #1 from losing valid multi-game tags. fix: require alias evidence for AI game fallback labels Backfill AI game fallback now accepts a detected game only when the issue text contains a literal alias token for the mapped game label. Add explicit logs for AI accept/reject/unmapped outcomes to make attribution auditable in job logs and prevent false positives like issue #17. feat: annotate game label adds with detection source in backfill logs Each game label add now shows its source in the per-issue log line: #240: added "game: Opposing Force" (text-match) #248: added "game: Counter-Strike: Global Offensive" (form-field) #N: added "game: X" (ai-fallback) Non-game labels (engine, type, needs, etc.) are unchanged. fix: add missing hasAliasHitForLabel to backfill script context Each github-script step runs in its own isolated JS context. The backfill step was calling hasAliasHitForLabel (used by the AI alias-evidence gate) but the function was only defined in the triage step, causing a ReferenceError on any issue that triggered AI fallback. fix: retry AI fallback once on HTTP 429 with Retry-After backoff When the GitHub Models API rate-limits the backfill (429), read the Retry-After header (capped at 60s), wait, then retry the request once. If the retry also fails the issue is skipped as before. fix: accept joined-token alias evidence in AI game fallback gate Alias evidence now allows multi-token aliases to match when words are joined in issue text (e.g. counterstrike vs counter strike), while keeping exact token checks for single-word aliases. fix: treat generic AI detections as non-game in backfill When AI fallback returns generic platform/engine terms (e.g. srcds, source dedicated server, steamcmd), treat them as non-game detections instead of logging them as unmapped games. Also prompt the model to return null for generic terms. chore: log AI rate-limit headers and 429 count in backfill Capture Retry-After, X-RateLimit-* and request id on 429 responses, log them on retry and final skip, and include total AI 429 hits in the workflow summary table. fix: disable AI fallback for run on long Retry-After cooldown When GitHub Models returns 429 with a large Retry-After (over 300s), stop AI fallback for the remainder of the backfill run instead of sleeping and retrying per issue. Include disable reason in summary. fix: prevent overlapping game alias double-matches in text detection Prefer longest non-overlapping alias matches so titles like "Killing Floor 2" do not also infer "Killing Floor" unless both are explicitly present as separate mentions. fix: prune stale broad game labels when specific game is inferred For legacy issues without structured game selection, remove existing game labels only when they are broader overlaps of a newly inferred specific game label (e.g. remove Killing Floor when Killing Floor 2 is inferred). fix: stop relabel backfill early when API rate limit is hit Detect GitHub API rate limit errors during processing, stop the run gracefully, and report header-derived rate limit details in logs and summary instead of emitting repeated per-issue failures. feat(labeler): implement Linux support verification for server requests * Added checks for Linux support based on issue content and Steam API data. * Integrated AI analysis for documentation to assess Linux compatibility. * Automatically create or remove labels based on support verification results. * Enhanced feedback for users regarding Linux server support status. Co-authored-by: Copilot <copilot@github.com> fix(labeler): broaden Linux support check triggers for server requests fix(labeler): improve game detection logic for structured fields * Refine fallback logic to avoid guessing from free text when a structured Game field exists. * Ensure AI-detected game fallback only occurs when no structured Game field is present. Co-authored-by: Copilot <copilot@github.com> fix(labeler): update game section extraction logic * Adjusted the extraction of the game field to accommodate both 'Game server' and 'Game' sections. * This change improves compatibility with different input formats in server requests and bug reports. Co-authored-by: Copilot <copilot@github.com> feat(labeler): enhance Linux support detection logic * Added handling for dedicated server tool AppIDs in Steam API checks. * Introduced a checkbox confirmation mechanism for Linux support, improving evidence assessment. * Updated verdict messaging to clarify Linux support status based on new checks. Co-authored-by: Copilot <copilot@github.com> feat(labeler): implement SteamCMD Linux support check * Added a new function `runSteamCmdLinuxCheck` to assess Linux platform support using SteamCMD. * Enhanced existing logic to incorporate SteamCMD results alongside Steam API checks. * Updated comments to clarify the distinction between server tool AppIDs and client platform support. * Improved error handling and logging for SteamCMD assessments. Co-authored-by: Copilot <copilot@github.com> feat(labeler): add confirmed Linux support label logic * Introduced logic to determine and apply a `status: linux support confirmed` label based on AI assessment and Steam confirmation. * Implemented error handling for label creation if it does not exist. * Enhanced existing label management to ensure accurate representation of Linux support status. Co-authored-by: Copilot <copilot@github.com> fix(labeler): refine Steam support checks for dedicated servers * Updated comments to clarify the purpose of Steam Store API checks. * Removed unnecessary checks for Steam API results in determining Linux support. * Enhanced logging and reasoning for server tool AppIDs. * Improved clarity in the output messages regarding Linux support status. Co-authored-by: Copilot <copilot@github.com> feat(labeler): enhance Linux support check comment formatting * Added conditional header for Linux support check comments. * Included a block to indicate if the confirmed Linux label was applied. Co-authored-by: Copilot <copilot@github.com> fix: apply linux status labels directly instead of via deferred labelsToAdd set chore: synced file(s) with dgibbs64/repo-sync (#4911) * chore: synced local '.github/' with remote 'general/.github/' * chore: synced local './' with remote 'bash/' refactor: rename labeler.yml to issue-triage-automation.yml and consolidate sync-game-labels - Rename 'labeler.yml' to 'issue-triage-automation.yml' to better reflect the workflow's expanded responsibilities (issue triage, game detection, AI analysis, Linux support verification, and label syncing) - Consolidate 'sync-game-labels.yml' into the main workflow - Add push trigger for serverlist.csv changes - Add sync-game-labels job that runs on push events when serverlist.csv is modified - Remove the separate sync-game-labels.yml workflow This simplifies workflow organization by having all issue/PR maintenance logic in a single, well-named workflow. refactor: standardize workflow filenames with action prefix chore(sync): synced local '.github/' with remote 'general/.github/' (#4918) Synced from dgibbs64/repo-sync@732370f — chore(workflow): add permissions section to action-sync.yml * Added an empty `permissions` section to the workflow file. * This change ensures that permissions are explicitly defined for the jobs.
1 parent d05992d commit c188059

30 files changed

Lines changed: 2879 additions & 394 deletions

.devcontainer/devcontainer.json

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
11
{
2-
"name": "BASH Dev Container",
3-
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
4-
"features": {
5-
"ghcr.io/devcontainers-community/npm-features/prettier:1": {
6-
"plugins": "prettier-plugin-sh"
7-
},
8-
"ghcr.io/devcontainers-extra/features/actionlint:1": {},
9-
"ghcr.io/devcontainers-extra/features/checkov:1": {},
10-
"ghcr.io/devcontainers-extra/features/markdownlint-cli:1": {},
11-
"ghcr.io/devcontainers-extra/features/shellcheck:1": {},
12-
"ghcr.io/devcontainers-extra/features/yamllint:2": {},
13-
"ghcr.io/devcontainers/features/github-cli:1": {}
14-
},
15-
"customizations": {
16-
"vscode": {
17-
"extensions": [
18-
"DavidAnson.vscode-markdownlint",
19-
"editorconfig.editorconfig",
20-
"esbenp.prettier-vscode",
21-
"github.vscode-github-actions",
22-
"GitHub.vscode-pull-request-github",
23-
"redhat.vscode-yaml",
24-
"timonwong.shellcheck",
25-
"yzhang.markdown-all-in-one"
26-
]
27-
}
28-
},
29-
"postCreateCommand": "npm init -y >/dev/null 2>&1 || true && npm install --no-save prettier prettier-plugin-sh prettier-plugin-jinja-template"
2+
"name": "BASH Dev Container",
3+
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
4+
"features": {
5+
"ghcr.io/devcontainers-community/npm-features/prettier:1": {
6+
"plugins": "prettier-plugin-sh"
7+
},
8+
"ghcr.io/devcontainers-extra/features/actionlint:1": {},
9+
"ghcr.io/devcontainers-extra/features/checkov:1": {},
10+
"ghcr.io/devcontainers-extra/features/markdownlint-cli:1": {},
11+
"ghcr.io/devcontainers-extra/features/shellcheck:1": {},
12+
"ghcr.io/devcontainers-extra/features/yamllint:2": {},
13+
"ghcr.io/devcontainers/features/github-cli:1": {}
14+
},
15+
"customizations": {
16+
"vscode": {
17+
"extensions": [
18+
"DavidAnson.vscode-markdownlint",
19+
"editorconfig.editorconfig",
20+
"esbenp.prettier-vscode",
21+
"github.vscode-github-actions",
22+
"GitHub.vscode-pull-request-github",
23+
"redhat.vscode-yaml",
24+
"timonwong.shellcheck",
25+
"yzhang.markdown-all-in-one"
26+
]
27+
}
28+
},
29+
"postCreateCommand": "npm init -y >/dev/null 2>&1 || true && npm install --no-save prettier prettier-plugin-sh prettier-plugin-jinja-template && sudo apt-get update && sudo apt-get install -y ripgrep"
3030
}

.github/ISSUE_TEMPLATE/bug_report.yml

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,51 @@ body:
88
attributes:
99
value: |
1010
Thanks for taking the time to fill out this bug report!
11+
- type: dropdown
12+
id: severity
13+
attributes:
14+
label: Severity
15+
description: Triage metadata used for prioritization.
16+
options:
17+
- "severity: low"
18+
- "severity: medium"
19+
- "severity: high"
20+
- "severity: critical"
21+
validations:
22+
required: true
23+
- type: dropdown
24+
id: reproducibility
25+
attributes:
26+
label: Reproducibility
27+
description: Triage metadata used for prioritization.
28+
options:
29+
- "reproducible: always"
30+
- "reproducible: sometimes"
31+
- "reproducible: unable"
32+
validations:
33+
required: true
34+
- type: dropdown
35+
id: regression
36+
attributes:
37+
label: Regression
38+
description: Triage metadata used for prioritization.
39+
options:
40+
- "regression: yes"
41+
- "regression: no"
42+
- "regression: unknown"
43+
validations:
44+
required: true
45+
- type: dropdown
46+
id: affects-latest
47+
attributes:
48+
label: Affects latest release
49+
description: Triage metadata used for prioritization.
50+
options:
51+
- "latest-release: yes"
52+
- "latest-release: no"
53+
- "latest-release: unknown"
54+
validations:
55+
required: true
1156
- type: input
1257
id: user-story
1358
attributes:
@@ -16,6 +61,14 @@ body:
1661
placeholder: As a [user description], I want [desired action] so that [desired outcome].
1762
validations:
1863
required: true
64+
- type: input
65+
id: script-name
66+
attributes:
67+
label: Script name
68+
description: LinuxGSM script name in use.
69+
placeholder: vhserver
70+
validations:
71+
required: true
1972
- type: input
2073
id: game
2174
attributes:
@@ -66,6 +119,22 @@ body:
66119
- "command: send"
67120
validations:
68121
required: true
122+
- type: textarea
123+
id: expected-behavior
124+
attributes:
125+
label: Expected behavior
126+
description: What should happen?
127+
placeholder: Describe the expected result.
128+
validations:
129+
required: true
130+
- type: textarea
131+
id: actual-behavior
132+
attributes:
133+
label: Actual behavior
134+
description: What actually happens?
135+
placeholder: Describe the observed result.
136+
validations:
137+
required: true
69138
- type: textarea
70139
id: further-info
71140
attributes:
@@ -74,11 +143,19 @@ body:
74143
placeholder: Tell us what you see!
75144
validations:
76145
required: true
146+
- type: checkboxes
147+
id: prechecks
148+
attributes:
149+
label: Pre-checks
150+
description: Confirm standard troubleshooting has been completed.
151+
options:
152+
- label: I ran update and validate before reporting this issue.
153+
required: true
77154
- type: textarea
78155
id: logs
79156
attributes:
80157
label: Relevant log output
81-
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
158+
description: Include the exact command used and the full related output (debug/details if available). This will be automatically formatted into code.
82159
render: shell
83160
- type: textarea
84161
id: steps
@@ -90,3 +167,5 @@ body:
90167
2. Click on '....'
91168
3. Scroll down to '....'
92169
4. See error
170+
validations:
171+
required: true

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,6 @@ contact_links:
66
- name: Discord Server
77
about: Join the LinuxGSM Discord community server. Discuss your LinuxGSM setup, get help and advice
88
url: https://linuxgsm.com/discord
9+
- name: Report a security vulnerability
10+
about: Please report security vulnerabilities privately, not in public issues.
11+
url: https://github.com/GameServerManagers/LinuxGSM/security/advisories/new

.github/ISSUE_TEMPLATE/feature_request.yml

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,17 @@ body:
88
attributes:
99
value: |
1010
Thanks for taking the time to fill out this feature request!
11+
- type: dropdown
12+
id: priority
13+
attributes:
14+
label: Priority
15+
description: How important is this feature to you?
16+
options:
17+
- "priority: low"
18+
- "priority: medium"
19+
- "priority: high"
20+
validations:
21+
required: true
1122
- type: input
1223
id: user-story
1324
attributes:
@@ -64,12 +75,41 @@ body:
6475
- "command: update-lgsm"
6576
- "command: wipe"
6677
- "command: send"
78+
validations:
79+
required: false
80+
- type: textarea
81+
id: problem-statement
82+
attributes:
83+
label: Problem statement
84+
description: What is painful today, and why is this needed?
85+
placeholder: Describe the current limitation or pain point.
86+
validations:
87+
required: true
88+
- type: dropdown
89+
id: scope-impact
90+
attributes:
91+
label: Scope and impact
92+
description: Which area would this change impact?
93+
options:
94+
- "scope: single game"
95+
- "scope: multiple games"
96+
- "scope: all servers"
97+
- "scope: documentation only"
98+
- "scope: ci/cd or automation"
99+
- "scope: other"
67100
validations:
68101
required: true
69102
- type: textarea
70103
id: further-info
71104
attributes:
72105
label: Further information
73-
description: A clear description of what the feature is and any ideas on how to achieve this.
106+
description: A clear description of the proposed solution and any implementation ideas.
74107
validations:
75108
required: true
109+
- type: textarea
110+
id: alternatives
111+
attributes:
112+
label: Alternatives considered
113+
description: Describe alternatives or workarounds you considered.
114+
validations:
115+
required: false

.github/ISSUE_TEMPLATE/server_request.yml

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,27 @@ body:
77
- type: markdown
88
attributes:
99
value: |
10-
Thanks for taking the time to fill out this game server!
10+
Thanks for taking the time to fill out this game server request!
1111
- type: input
1212
id: game-server
1313
attributes:
1414
label: Game server
1515
description: What game server would you like to add?
1616
validations:
1717
required: true
18+
- type: checkboxes
19+
id: dedicated-server
20+
attributes:
21+
label: Dedicated server
22+
description: Confirm this is a dedicated server request and not client hosting.
23+
options:
24+
- label: "Yes, this is a dedicated server (not client hosting)."
25+
required: true
1826
- type: checkboxes
1927
id: on-linux
2028
attributes:
2129
label: Linux support
22-
description: Does this game server have Linux support? (not wine)
30+
description: Does this game server have native Linux server support? (not wine)
2331
options:
2432
- label: "Yes"
2533
validations:
@@ -38,20 +46,40 @@ body:
3846
id: steam-id
3947
attributes:
4048
label: Steam appid
41-
description: What is the Steam appid of the game server? Use SteamDB to get the appid. (https://steamdb.info).
49+
description: What is the Steam appid of the dedicated server? Required when Steam is Yes. Use SteamDB to get the appid (https://steamdb.info).
4250
placeholder: "892970"
4351
validations:
4452
required: false
53+
- type: textarea
54+
id: official-docs
55+
attributes:
56+
label: Official dedicated server documentation
57+
description: Provide official documentation links for installing/running the dedicated server.
58+
placeholder: |
59+
https://example.com/docs/server-setup
60+
https://example.com/docs/dedicated-server
61+
validations:
62+
required: true
63+
- type: textarea
64+
id: linux-binary-proof
65+
attributes:
66+
label: Linux binary proof
67+
description: Provide evidence that Linux server binaries are available (official docs/download links/version notes).
68+
placeholder: |
69+
https://example.com/downloads/linux-dedicated-server
70+
https://example.com/release-notes/linux-server
71+
validations:
72+
required: true
4573
- type: textarea
4674
id: guides
4775
attributes:
4876
label: Guides
49-
description: Links to guides on how to install the game server
77+
description: Links to community or third-party guides on how to install the game server.
5078
- type: checkboxes
5179
id: terms
5280
attributes:
5381
label: Code of Conduct
54-
description: By submitting this issue, you agree to follow our [Code of Conduct](https://example.com)
82+
description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/GameServerManagers/LinuxGSM/blob/master/CODE_OF_CONDUCT.md)
5583
options:
5684
- label: I agree to follow this project's Code of Conduct
5785
required: true
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
---
2+
title: "LinuxGSM PR Review Guidance"
3+
applyTo: "**"
4+
description: "Use when reviewing pull requests in LinuxGSM; prioritize regressions, behavior changes, shell safety, and missing tests over style-only feedback."
5+
---
6+
7+
Focus review effort on correctness and operational safety first.
8+
9+
Primary priorities:
10+
11+
- Identify behavior regressions and compatibility risks.
12+
- Flag unsafe shell patterns (`rm -rf`, unquoted vars, unchecked command failures).
13+
- Verify workflow changes do not weaken permissions or secret handling.
14+
- Check for missing tests/validation when logic changes.
15+
- Confirm labels, templates, and automation rules stay internally consistent.
16+
17+
Feedback expectations:
18+
19+
- Give concrete, actionable findings with file and reason.
20+
- Prefer high-signal issues over style nits.
21+
- If no defects are found, state that clearly and mention residual risk areas.
22+
- Suggest minimal, low-risk fixes before proposing broad refactors.
23+
24+
LinuxGSM-specific checks:
25+
26+
- Shell scripts should preserve robust defaults (`set -euo pipefail` where appropriate).
27+
- Label/workflow updates should avoid duplicate or stale taxonomy.
28+
- Automation should fail safe (log and continue for advisory AI; block on true CI errors).
29+
- Keep issue/PR automation rules aligned with templates and existing labels.

0 commit comments

Comments
 (0)