Skip to content

Commit c45edd3

Browse files
Merge pull request #25 from amd/dholanda/bug_template
Add issue template for bugs and improvements
2 parents 8dfca01 + 00dca8b commit c45edd3

2 files changed

Lines changed: 228 additions & 0 deletions

File tree

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
name: Skill bug or improvement
2+
description: Report a bug, suggest an improvement, or propose a scope change for an existing skill.
3+
title: "[Skill issue] <skill name> — <short summary>"
4+
labels:
5+
- skill-issue
6+
body:
7+
- type: markdown
8+
attributes:
9+
value: |
10+
Thanks for helping us improve an existing skill! Use this form for **existing** skills only.
11+
If you want to propose a brand-new skill, use the *Skill proposal* template instead.
12+
13+
Fill out the short fields below, then describe the issue in detail at the end.
14+
15+
- type: dropdown
16+
id: skill_name
17+
attributes:
18+
label: Which skill?
19+
description: Pick the existing skill this issue is about. One issue per skill, please. If your skill isn't listed (e.g. it was just added), pick **Other** and name it in the details below.
20+
options:
21+
- local-ai-app-integration
22+
- local-ai-use
23+
- Other (name it in the details below)
24+
validations:
25+
required: true
26+
27+
- type: dropdown
28+
id: issue_kind
29+
attributes:
30+
label: What kind of issue is this?
31+
description: |
32+
Pick the option that best matches what you're reporting. The fields below are tailored to each kind. A matching label (`bug`, `improvement`, `scope`) will be applied automatically when the issue is created.
33+
- **Improvement** — the skill works, but its strategy/instructions should change.
34+
- **Bug** — the skill is broken, gives wrong output, or fails to fire when it should.
35+
- **Scope** — the skill's scope should grow, shrink, or shift.
36+
- **Something else** — none of the above.
37+
options:
38+
- "Improvement — existing skill should behave differently"
39+
- "Bug — existing skill is broken"
40+
- "Scope — scope of existing skill should change"
41+
- "Something else"
42+
validations:
43+
required: true
44+
45+
- type: textarea
46+
id: improvement_details
47+
attributes:
48+
label: "Improvement: how should the skill's strategy change?"
49+
description: Only fill in if you picked **Improvement**. Suggest concretely how the skill's strategy, instructions, or behavior should change, and why.
50+
placeholder: |
51+
e.g. The skill currently always uses SD-Turbo at 512x512. It should pick a larger size when
52+
the user asks for a "wallpaper" or "poster" because the current default looks pixelated.
53+
54+
- type: textarea
55+
id: bug_details
56+
attributes:
57+
label: "Bug: what is broken, and how do we reproduce it?"
58+
description: |
59+
Only fill in if you picked **Bug**. Cover:
60+
- What you asked the agent to do.
61+
- What you expected the skill to do.
62+
- What actually happened (full agent output / error message helps).
63+
- Minimal reproduction steps.
64+
placeholder: |
65+
Steps to reproduce:
66+
1. ...
67+
2. ...
68+
Expected: ...
69+
Actual: ...
70+
71+
- type: textarea
72+
id: scope_details
73+
attributes:
74+
label: "Scope: how should the scope change?"
75+
description: |
76+
Only fill in if you picked **Scope**. Describe how the scope of this skill should change to be more useful — should it be **decreased**, **increased**, or **shifted**? Be specific about which triggers/use cases to add or remove.
77+
placeholder: |
78+
e.g. Decrease scope: stop firing on plain chat questions about local models — only fire
79+
when the user actually asks to generate an image, transcribe audio, or speak text.
80+
81+
- type: textarea
82+
id: other_details
83+
attributes:
84+
label: "Something else: describe the issue"
85+
description: Only fill in if you picked **Something else**. Describe what's going on and what you'd like to see happen.
86+
87+
- type: markdown
88+
attributes:
89+
value: |
90+
---
91+
### Environment
92+
93+
The fields below are **required for Improvement, Bug, and Something else** so we can reproduce what you saw.
94+
For **Scope** issues you can leave them blank.
95+
96+
- type: input
97+
id: system
98+
attributes:
99+
label: System / hardware
100+
description: The machine you ran the agent on. Include the AMD product name and key accelerator(s) if relevant.
101+
placeholder: e.g. AMD Ryzen™ AI Max+ 395, or MI300X server, or Ryzen 9 7950X + Radeon RX 7900 XTX
102+
103+
- type: input
104+
id: os
105+
attributes:
106+
label: Operating system and version
107+
placeholder: e.g. Windows 11 23H2, Ubuntu 24.04, macOS 14.5
108+
109+
- type: dropdown
110+
id: agent
111+
attributes:
112+
label: Which agent did you use?
113+
description: The coding agent / assistant that loaded the skill.
114+
options:
115+
- "Cursor"
116+
- "Claude Code"
117+
- "Claude Desktop"
118+
- "Codex CLI"
119+
- "GitHub Copilot"
120+
- "Other (describe in details below)"
121+
122+
- type: input
123+
id: model
124+
attributes:
125+
label: Which model?
126+
description: The underlying LLM the agent was using when the skill ran.
127+
placeholder: e.g. Claude Opus 4.7, GPT-5.5, Sonnet 4.6
128+
129+
- type: textarea
130+
id: anything_else
131+
attributes:
132+
label: Anything else?
133+
description: Logs, screenshots, links to related issues/PRs, or extra context that didn't fit above.
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
name: Label skill issues
2+
3+
on:
4+
issues:
5+
types: [opened, edited]
6+
7+
permissions:
8+
issues: write
9+
10+
jobs:
11+
label:
12+
if: >-
13+
contains(github.event.issue.labels.*.name, 'skill_proposal') ||
14+
contains(github.event.issue.labels.*.name, 'skill-issue')
15+
runs-on: ubuntu-latest
16+
steps:
17+
- name: Apply kind/path labels based on issue form answers
18+
uses: actions/github-script@v7
19+
with:
20+
script: |
21+
const body = context.payload.issue.body || "";
22+
const { owner, repo } = context.repo;
23+
const issue_number = context.payload.issue.number;
24+
const currentLabels = context.payload.issue.labels.map(l => l.name);
25+
const templateLabels = currentLabels;
26+
27+
// Map a single form question to a mutually-exclusive label group.
28+
// - section: heading text from the issue form (matched case-insensitively)
29+
// - groupLabels: every label managed by this rule (used to clear stale ones)
30+
// - pick(answer): returns the label to apply, or null to apply none
31+
async function applyGroup({ section, groupLabels, pick }) {
32+
const re = new RegExp(`###\\s*${section}\\s*\\n+([^\\n]+)`, "i");
33+
const match = body.match(re);
34+
if (!match) {
35+
core.info(`No "${section}" section found; skipping.`);
36+
return;
37+
}
38+
const answer = match[1].trim();
39+
core.info(`[${section}] detected answer: ${answer}`);
40+
41+
const labelToAdd = pick(answer);
42+
if (!labelToAdd) {
43+
core.info(`[${section}] answer did not map to a label; none applied.`);
44+
}
45+
46+
const stale = groupLabels.filter(
47+
l => l !== labelToAdd && currentLabels.includes(l)
48+
);
49+
for (const name of stale) {
50+
core.info(`[${section}] removing stale label: ${name}`);
51+
try {
52+
await github.rest.issues.removeLabel({
53+
owner, repo, issue_number, name,
54+
});
55+
} catch (err) {
56+
core.warning(`Could not remove label ${name}: ${err.message}`);
57+
}
58+
}
59+
60+
if (labelToAdd && !currentLabels.includes(labelToAdd)) {
61+
core.info(`[${section}] adding label: ${labelToAdd}`);
62+
try {
63+
await github.rest.issues.addLabels({
64+
owner, repo, issue_number, labels: [labelToAdd],
65+
});
66+
} catch (err) {
67+
core.warning(`Could not add label ${labelToAdd}: ${err.message}. Make sure the label exists in the repo.`);
68+
}
69+
}
70+
}
71+
72+
if (templateLabels.includes("skill_proposal")) {
73+
await applyGroup({
74+
section: "Where should this skill live\\?",
75+
groupLabels: ["incubated", "imported"],
76+
pick: (answer) => {
77+
if (/^Path A\b/i.test(answer)) return "incubated";
78+
if (/^Path B\b/i.test(answer)) return "imported";
79+
return null;
80+
},
81+
});
82+
}
83+
84+
if (templateLabels.includes("skill-issue")) {
85+
await applyGroup({
86+
section: "What kind of issue is this\\?",
87+
groupLabels: ["bug", "improvement", "scope"],
88+
pick: (answer) => {
89+
if (/^Improvement\b/i.test(answer)) return "improvement";
90+
if (/^Bug\b/i.test(answer)) return "bug";
91+
if (/^Scope\b/i.test(answer)) return "scope";
92+
return null;
93+
},
94+
});
95+
}

0 commit comments

Comments
 (0)