diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 000000000..f9ffd60d8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,117 @@ +name: Bug report +description: Report broken behavior, regressions, crashes, or reliability issues. +title: "[Bug]: " +labels: + - bug + - needs-triage +body: + - type: markdown + attributes: + value: | + Use this form for broken behavior, regressions, crashes, or reliability problems. + Search existing issues first and keep the report focused on one problem. + + - type: checkboxes + id: checks + attributes: + label: Before submitting + options: + - label: I searched existing issues and did not find a duplicate. + required: true + - label: I included enough detail to reproduce or investigate the problem. + required: true + + - type: dropdown + id: area + attributes: + label: Area + description: Which part of the project is affected? + options: + - apps/web + - apps/server + - apps/desktop + - packages/contracts or packages/shared + - Build, CI, or release tooling + - Docs + - Not sure + validations: + required: true + + - type: textarea + id: summary + attributes: + label: Summary + description: What broke? Include the first visible symptom. + placeholder: Sending a follow-up prompt after reconnecting leaves the thread stuck in "starting". + validations: + required: true + + - type: textarea + id: steps + attributes: + label: Steps to reproduce + description: Provide a minimal, deterministic repro. + placeholder: | + 1. Start the app with ... + 2. Open ... + 3. Disconnect the network + 4. Reconnect and send another prompt + validations: + required: true + + - type: textarea + id: expected + attributes: + label: Expected behavior + placeholder: The thread should resume normally and accept the new message. + validations: + required: true + + - type: textarea + id: actual + attributes: + label: Actual behavior + placeholder: The composer clears, no new turn starts, and the session stays in a pending state. + validations: + required: true + + - type: dropdown + id: impact + attributes: + label: Impact + description: How bad is this in practice? + options: + - Blocks work completely + - Major degradation or frequent failure + - Minor bug or occasional failure + - Cosmetic issue + validations: + required: true + + - type: input + id: version + attributes: + label: Version or commit + description: Release version, commit SHA, or branch name if known. + placeholder: main @ abc1234 + + - type: input + id: environment + attributes: + label: Environment + description: OS, browser or desktop app version, Node/Bun version, provider/model if relevant. + placeholder: macOS 15.3, Chrome 135, Bun 1.3.9, Codex app-server ... + + - type: textarea + id: logs + attributes: + label: Logs, stack traces, or screenshots + description: Paste the most relevant output only. Redact secrets. + render: shell + + - type: textarea + id: workaround + attributes: + label: Workaround + description: If you found a temporary workaround, include it. + placeholder: Restarting the provider session clears the stuck state. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 000000000..53aab5166 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,101 @@ +name: Feature request +description: Propose a scoped improvement or new capability. +title: "[Feature]: " +labels: + - enhancement + - needs-triage +body: + - type: markdown + attributes: + value: | + Use this form for new capabilities or meaningful improvements to existing behavior. + This repo is still early. Small, concrete requests that clearly explain the problem and scope are much easier to evaluate. + + - type: checkboxes + id: checks + attributes: + label: Before submitting + options: + - label: I searched existing issues and did not find a duplicate. + required: true + - label: I am describing a concrete problem or use case, not just a vague idea. + required: true + + - type: dropdown + id: area + attributes: + label: Area + description: Which part of the project would this change affect? + options: + - apps/web + - apps/server + - apps/desktop + - packages/contracts or packages/shared + - Build, CI, or release tooling + - Docs + - Not sure + validations: + required: true + + - type: textarea + id: problem + attributes: + label: Problem or use case + description: What are you trying to do? What is hard, slow, or impossible today? + placeholder: I want to reconnect to an existing provider session after a browser refresh without losing the current thread state. + validations: + required: true + + - type: textarea + id: proposal + attributes: + label: Proposed solution + description: Describe the behavior, API, or UX you want. + placeholder: Persist enough session metadata so the client can discover and reattach to the active provider session on load. + validations: + required: true + + - type: textarea + id: value + attributes: + label: Why this matters + description: Who benefits, and what outcome does this unlock? + placeholder: This would make reconnects predictable during network drops and reduce accidental duplicate sessions. + validations: + required: true + + - type: textarea + id: scope + attributes: + label: Smallest useful scope + description: What is the narrowest version of this request that would still solve your problem? + placeholder: A first pass only needs to support restoring the active session for the current thread. + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + description: Workarounds, prior art, or other approaches you considered. + placeholder: I currently work around this by manually restarting the provider session, but that loses in-flight context. + + - type: textarea + id: tradeoffs + attributes: + label: Risks or tradeoffs + description: What costs, complexity, or edge cases should be considered? + placeholder: This may require careful handling when the underlying provider session has already exited. + + - type: textarea + id: references + attributes: + label: Examples or references + description: Links, screenshots, mockups, or comparable tools. + + - type: checkboxes + id: contribution + attributes: + label: Contribution + options: + - label: I would be open to helping implement this. diff --git a/.github/workflows/issue-labels.yml b/.github/workflows/issue-labels.yml new file mode 100644 index 000000000..d6571d65d --- /dev/null +++ b/.github/workflows/issue-labels.yml @@ -0,0 +1,75 @@ +name: Issue Labels + +on: + push: + branches: + - main + paths: + - .github/ISSUE_TEMPLATE/** + - .github/workflows/issue-labels.yml + workflow_dispatch: + +permissions: + issues: write + +jobs: + sync: + name: Sync issue labels + runs-on: ubuntu-24.04 + steps: + - name: Ensure managed issue labels exist + uses: actions/github-script@v7 + with: + script: | + const managedLabels = [ + { + name: "bug", + color: "d73a4a", + description: "Something is broken or behaving incorrectly.", + }, + { + name: "enhancement", + color: "a2eeef", + description: "Requested improvement or new capability.", + }, + { + name: "needs-triage", + color: "fbca04", + description: "Issue needs maintainer review and initial categorization.", + }, + ]; + + for (const label of managedLabels) { + try { + const { data: existing } = await github.rest.issues.getLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + name: label.name, + }); + + if ( + existing.color !== label.color || + (existing.description ?? "") !== label.description + ) { + await github.rest.issues.updateLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + name: label.name, + color: label.color, + description: label.description, + }); + } + } catch (error) { + if (error.status !== 404) { + throw error; + } + + await github.rest.issues.createLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + name: label.name, + color: label.color, + description: label.description, + }); + } + }