authorgravatar for crazywolf132@gmail.com0x1f99d <crazywolf132@gmail.com> 2026-03-14 05:29:22+11:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-03-13 11:29:22-07:00
log790fda1a97476e4d7048a521651180ed0ba811c3
tree62387c0a906896018a2d6518b9cb16d3954cda3f
parent89ffcf42eb781eddf357c07199607e3d7bccf0c5
signature Signed by PGP key B5690EEEBB952194

feat(github): add issue templates for automatic triage (#896)


3 files changed, 284 insertions(+), 0 deletions(-)

.github/ISSUE_TEMPLATE/bug_report.yml created+108
......@@ -0,0 +1,108 @@
1name: Bug report
2description: Report broken behavior, regressions, crashes, or reliability issues.
3title: "[Bug]: "
4labels:
5 - bug
6 - needs-triage
7body:
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.
.github/ISSUE_TEMPLATE/feature_request.yml created+101
......@@ -0,0 +1,101 @@
1name: Feature request
2description: Propose a scoped improvement or new capability.
3title: "[Feature]: "
4labels:
5 - enhancement
6 - needs-triage
7body:
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 created+75
......@@ -0,0 +1,75 @@
1name: Issue Labels
2
3on:
4 push:
5 branches:
6 - main
7 paths:
8 - .github/ISSUE_TEMPLATE/**
9 - .github/workflows/issue-labels.yml
10 workflow_dispatch:
11
12permissions:
13 issues: write
14
15jobs:
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 }