Skip to content

Commit 790fda1

Browse files
authored
feat(github): add issue templates for automatic triage (#896)
1 parent 89ffcf4 commit 790fda1

3 files changed

Lines changed: 284 additions & 0 deletions

File tree

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
name: Bug report
2+
description: Report broken behavior, regressions, crashes, or reliability issues.
3+
title: "[Bug]: "
4+
labels:
5+
- bug
6+
- needs-triage
7+
body:
8+
- type: markdown
9+
attributes:
10+
value: |
11+
Use this form for broken behavior, regressions, crashes, or reliability problems.
12+
Search existing issues first and keep the report focused on one problem.
13+
14+
- type: checkboxes
15+
id: checks
16+
attributes:
17+
label: Before submitting
18+
options:
19+
- label: I searched existing issues and did not find a duplicate.
20+
required: true
21+
- label: I included enough detail to reproduce or investigate the problem.
22+
required: true
23+
24+
- type: dropdown
25+
id: area
26+
attributes:
27+
label: Area
28+
description: Which part of the project is affected?
29+
options:
30+
- apps/web
31+
- apps/server
32+
- apps/desktop
33+
- packages/contracts or packages/shared
34+
- Build, CI, or release tooling
35+
- Docs
36+
- Not sure
37+
validations:
38+
required: true
39+
40+
- type: textarea
41+
id: steps
42+
attributes:
43+
label: Steps to reproduce
44+
description: Provide a minimal, deterministic repro.
45+
placeholder: |
46+
1. Start the app with ...
47+
2. Open ...
48+
3. Disconnect the network
49+
4. Reconnect and send another prompt
50+
validations:
51+
required: true
52+
53+
- type: textarea
54+
id: expected
55+
attributes:
56+
label: Expected behavior
57+
placeholder: The thread should resume normally and accept the new message.
58+
validations:
59+
required: true
60+
61+
- type: textarea
62+
id: actual
63+
attributes:
64+
label: Actual behavior
65+
placeholder: The composer clears, no new turn starts, and the session stays in a pending state.
66+
validations:
67+
required: true
68+
69+
- type: dropdown
70+
id: impact
71+
attributes:
72+
label: Impact
73+
description: How bad is this in practice?
74+
options:
75+
- Blocks work completely
76+
- Major degradation or frequent failure
77+
- Minor bug or occasional failure
78+
- Cosmetic issue
79+
validations:
80+
required: true
81+
82+
- type: input
83+
id: version
84+
attributes:
85+
label: Version or commit
86+
description: Release version, commit SHA, or branch name if known.
87+
placeholder: main @ abc1234
88+
89+
- type: input
90+
id: environment
91+
attributes:
92+
label: Environment
93+
description: OS, browser or desktop app version, Node/Bun version, provider/model if relevant.
94+
placeholder: macOS 15.3, Chrome 135, Bun 1.3.9, Codex app-server ...
95+
96+
- type: textarea
97+
id: logs
98+
attributes:
99+
label: Logs, stack traces, or screenshots
100+
description: Paste the most relevant output only. Redact secrets.
101+
render: shell
102+
103+
- type: textarea
104+
id: workaround
105+
attributes:
106+
label: Workaround
107+
description: If you found a temporary workaround, include it.
108+
placeholder: Restarting the provider session clears the stuck state.
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
name: Feature request
2+
description: Propose a scoped improvement or new capability.
3+
title: "[Feature]: "
4+
labels:
5+
- enhancement
6+
- needs-triage
7+
body:
8+
- type: markdown
9+
attributes:
10+
value: |
11+
Use this form for new capabilities or meaningful improvements to existing behavior.
12+
This repo is still early. Small, concrete requests that clearly explain the problem and scope are much easier to evaluate.
13+
14+
- type: checkboxes
15+
id: checks
16+
attributes:
17+
label: Before submitting
18+
options:
19+
- label: I searched existing issues and did not find a duplicate.
20+
required: true
21+
- label: I am describing a concrete problem or use case, not just a vague idea.
22+
required: true
23+
24+
- type: dropdown
25+
id: area
26+
attributes:
27+
label: Area
28+
description: Which part of the project would this change affect?
29+
options:
30+
- apps/web
31+
- apps/server
32+
- apps/desktop
33+
- packages/contracts or packages/shared
34+
- Build, CI, or release tooling
35+
- Docs
36+
- Not sure
37+
validations:
38+
required: true
39+
40+
- type: textarea
41+
id: problem
42+
attributes:
43+
label: Problem or use case
44+
description: What are you trying to do? What is hard, slow, or impossible today?
45+
placeholder: I want to reconnect to an existing provider session after a browser refresh without losing the current thread state.
46+
validations:
47+
required: true
48+
49+
- type: textarea
50+
id: proposal
51+
attributes:
52+
label: Proposed solution
53+
description: Describe the behavior, API, or UX you want.
54+
placeholder: Persist enough session metadata so the client can discover and reattach to the active provider session on load.
55+
validations:
56+
required: true
57+
58+
- type: textarea
59+
id: value
60+
attributes:
61+
label: Why this matters
62+
description: Who benefits, and what outcome does this unlock?
63+
placeholder: This would make reconnects predictable during network drops and reduce accidental duplicate sessions.
64+
validations:
65+
required: true
66+
67+
- type: textarea
68+
id: scope
69+
attributes:
70+
label: Smallest useful scope
71+
description: What is the narrowest version of this request that would still solve your problem?
72+
placeholder: A first pass only needs to support restoring the active session for the current thread.
73+
validations:
74+
required: true
75+
76+
- type: textarea
77+
id: alternatives
78+
attributes:
79+
label: Alternatives considered
80+
description: Workarounds, prior art, or other approaches you considered.
81+
placeholder: I currently work around this by manually restarting the provider session, but that loses in-flight context.
82+
83+
- type: textarea
84+
id: tradeoffs
85+
attributes:
86+
label: Risks or tradeoffs
87+
description: What costs, complexity, or edge cases should be considered?
88+
placeholder: This may require careful handling when the underlying provider session has already exited.
89+
90+
- type: textarea
91+
id: references
92+
attributes:
93+
label: Examples or references
94+
description: Links, screenshots, mockups, or comparable tools.
95+
96+
- type: checkboxes
97+
id: contribution
98+
attributes:
99+
label: Contribution
100+
options:
101+
- label: I would be open to helping implement this.

.github/workflows/issue-labels.yml

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
name: Issue Labels
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
paths:
8+
- .github/ISSUE_TEMPLATE/**
9+
- .github/workflows/issue-labels.yml
10+
workflow_dispatch:
11+
12+
permissions:
13+
issues: write
14+
15+
jobs:
16+
sync:
17+
name: Sync issue labels
18+
runs-on: ubuntu-24.04
19+
steps:
20+
- name: Ensure managed issue labels exist
21+
uses: actions/github-script@v7
22+
with:
23+
script: |
24+
const managedLabels = [
25+
{
26+
name: "bug",
27+
color: "d73a4a",
28+
description: "Something is broken or behaving incorrectly.",
29+
},
30+
{
31+
name: "enhancement",
32+
color: "a2eeef",
33+
description: "Requested improvement or new capability.",
34+
},
35+
{
36+
name: "needs-triage",
37+
color: "fbca04",
38+
description: "Issue needs maintainer review and initial categorization.",
39+
},
40+
];
41+
42+
for (const label of managedLabels) {
43+
try {
44+
const { data: existing } = await github.rest.issues.getLabel({
45+
owner: context.repo.owner,
46+
repo: context.repo.repo,
47+
name: label.name,
48+
});
49+
50+
if (
51+
existing.color !== label.color ||
52+
(existing.description ?? "") !== label.description
53+
) {
54+
await github.rest.issues.updateLabel({
55+
owner: context.repo.owner,
56+
repo: context.repo.repo,
57+
name: label.name,
58+
color: label.color,
59+
description: label.description,
60+
});
61+
}
62+
} catch (error) {
63+
if (error.status !== 404) {
64+
throw error;
65+
}
66+
67+
await github.rest.issues.createLabel({
68+
owner: context.repo.owner,
69+
repo: context.repo.repo,
70+
name: label.name,
71+
color: label.color,
72+
description: label.description,
73+
});
74+
}
75+
}

0 commit comments

Comments
 (0)