diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.yml b/.github/ISSUE_TEMPLATE/1-bug-report.yml index d7ea3a564..d89482a0a 100644 --- a/.github/ISSUE_TEMPLATE/1-bug-report.yml +++ b/.github/ISSUE_TEMPLATE/1-bug-report.yml @@ -1,68 +1,124 @@ name: 🐞 Bug Report -description: Create a bug report to help improve Reactive Resume +description: Report a reproducible problem with Reactive Resume -title: "[Bug] " -labels: [bug, v5, needs triage] -assignees: "AmruthPillai" +labels: ["bug", "status: needs triage"] +assignees: [] body: - type: checkboxes attributes: - label: Is there an existing issue for this? - description: Please search to see if an issue already exists for the bug you encountered. + label: Existing issue + description: Search open and closed issues before submitting a new report. options: - - label: Yes, I have searched the existing issues and none of them match my problem. + - label: I searched the existing issues and could not find a matching report. required: true - type: dropdown id: variant attributes: - label: Product Variant - description: What variant of Reactive Resume are you using? + label: Product variant + description: Where does the problem occur? options: - - Cloud (https://rxresu.me) - - Self-Hosted + - Cloud + - Self-hosted + validations: + required: true + + - type: input + id: version + attributes: + label: Reactive Resume version + description: Find this in Settings or provide the container image tag or commit SHA. + placeholder: 5.2.6 + validations: + required: true + + - type: dropdown + id: area + attributes: + label: Area + description: Choose the part of Reactive Resume most closely related to the problem. + options: + - Resume builder & data + - Templates, preview & export + - Accounts & sharing + - AI & Agent + - Language & localization + - Self-hosting + - API & integrations + - Applications & cover letters + - Other / unsure + validations: + required: true + + - type: input + id: environment + attributes: + label: Environment + description: Include your operating system and browser. For self-hosted installations, also include the deployment method. + placeholder: Firefox 143 on Ubuntu 26.04, deployed with Docker Compose validations: required: true - type: textarea + id: summary attributes: - label: Describe the bug you're experiencing - description: A detailed description of what you're experiencing. Please provide as much detail as possible as it will help me diagnose and fix the issue faster. + label: Summary + description: Briefly describe the problem and its impact. + validations: + required: true + + - type: textarea + id: reproduction + attributes: + label: Steps to reproduce + description: Provide the smallest reliable sequence that demonstrates the problem. + placeholder: | + 1. Open ... + 2. Select ... + 3. Observe ... + validations: + required: true + + - type: textarea + id: expected + attributes: + label: Expected behavior + validations: + required: true + + - type: textarea + id: actual + attributes: + label: Actual behavior validations: required: true - type: dropdown id: template attributes: - label: What template are you using? - description: Leave blank if the issue applies to all templates, or is not template-specific. - multiple: false + label: Template + description: Leave blank when the problem is not template-specific. options: - Azurill - Bronzor - Chikorita - - Ditto - Ditgar + - Ditto - Gengar - Glalie - Kakuna - Lapras - Leafish + - Meowth - Onyx - Pikachu - Rhyhorn - Scizor - validations: - required: false - type: textarea + id: logs attributes: - label: Anything else? - description: | - Links? References? Anything that will give us more context about the issue you are encountering! - - Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. - validations: - required: false + label: Logs and screenshots + description: Add relevant logs, screenshots, or a minimal reproduction. Remove secrets and personal resume data first. diff --git a/.github/ISSUE_TEMPLATE/2-feature-request.yml b/.github/ISSUE_TEMPLATE/2-feature-request.yml index e4a0665c4..30fcebc74 100644 --- a/.github/ISSUE_TEMPLATE/2-feature-request.yml +++ b/.github/ISSUE_TEMPLATE/2-feature-request.yml @@ -1,23 +1,82 @@ name: ✨ Feature Request -description: Suggest an feature or idea that you would like to see in Reactive Resume +description: Propose an actionable improvement to Reactive Resume -title: "[Feature] <title>" -labels: [enhancement, v5, needs triage] -assignees: "AmruthPillai" +labels: ["enhancement", "status: needs triage"] +assignees: [] body: - type: checkboxes attributes: - label: Is there an existing issue for this feature? - description: Please search to see if an issue already exists for the feature you requested. + label: Existing issue + description: Search open and closed issues before submitting a new proposal. options: - - label: Yes, I have searched the existing issues and it doesn't exist. + - label: I searched the existing issues and could not find a matching proposal. required: true - - type: textarea + - type: dropdown + id: variant attributes: - label: Feature Description - description: A detailed description of the feature you would like to see in Reactive Resume. Please provide as much detail as possible as it will help me implement the feature faster. + label: Product variant + description: Choose the primary environment for this proposal. + options: + - Cloud + - Self-hosted validations: required: true + + - type: dropdown + id: area + attributes: + label: Area + description: Choose the part of Reactive Resume most closely related to the proposal. + options: + - Resume builder & data + - Templates, preview & export + - Accounts & sharing + - AI & Agent + - Language & localization + - Self-hosting + - API & integrations + - Applications & cover letters + - Other / unsure + validations: + required: true + + - type: textarea + id: problem + attributes: + label: Problem + description: What user problem or limitation should Reactive Resume solve? + validations: + required: true + + - type: textarea + id: outcome + attributes: + label: Desired outcome + description: Describe the behavior you want without prescribing an implementation. + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + description: Describe current workarounds or alternatives. Write "None" if there are none. + validations: + required: true + + - type: textarea + id: scope + attributes: + label: Proposed scope + description: Explain what should be included and what can remain out of scope. + validations: + required: true + + - type: textarea + id: context + attributes: + label: Additional context + description: Add examples, mockups, or related issues when useful. Remove personal resume data first. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 3ba13e0ce..14150b500 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1 +1,8 @@ blank_issues_enabled: false +contact_links: + - name: Questions and support + url: https://github.com/amruthpillai/reactive-resume/discussions/categories/q-a + about: Get help with setup, configuration, and using Reactive Resume. + - name: Security vulnerability + url: https://github.com/amruthpillai/reactive-resume/security/advisories/new + about: Report security vulnerabilities privately. diff --git a/.github/workflows/label-issues.yml b/.github/workflows/label-issues.yml new file mode 100644 index 000000000..3908f4695 --- /dev/null +++ b/.github/workflows/label-issues.yml @@ -0,0 +1,30 @@ +name: Label New Issues + +on: + issues: + types: [opened] + +permissions: + contents: read + issues: write + +jobs: + label: + runs-on: ubuntu-latest + + steps: + - name: Checkout Repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + persist-credentials: false + + - name: Apply Form Labels + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + with: + script: | + const { getIssueLabels } = await import(`${process.env.GITHUB_WORKSPACE}/tooling/issue-labels.mjs`); + const labels = getIssueLabels(context.payload.issue.body ?? ""); + + if (labels.length > 0) { + await github.rest.issues.addLabels({ ...context.issue, labels }); + } diff --git a/.github/workflows/stale-issues.yml b/.github/workflows/stale-issues.yml new file mode 100644 index 000000000..45bdc37e2 --- /dev/null +++ b/.github/workflows/stale-issues.yml @@ -0,0 +1,30 @@ +name: Close Issues Awaiting Information + +on: + schedule: + - cron: "23 4 * * *" + workflow_dispatch: + +permissions: + issues: write + +jobs: + stale: + runs-on: ubuntu-latest + + steps: + - name: Close Inactive Issues Awaiting Information + uses: actions/stale@4391f3da665fdf50b6810c1a66712fb9ba21aa93 # v11 + with: + only-issue-labels: "status: needs info" + days-before-issue-stale: 14 + days-before-issue-close: 7 + days-before-pr-stale: -1 + days-before-pr-close: -1 + stale-issue-label: stale + stale-issue-message: >- + This issue is waiting for information requested by a maintainer. It will close in 7 days if no new information is provided. + close-issue-message: >- + Closing because the requested information was not provided. Add the missing details in a comment and a maintainer can reopen the issue. + close-issue-reason: not_planned + remove-issue-stale-when-updated: true diff --git a/README.md b/README.md index 7602fad26..613c34ffe 100644 --- a/README.md +++ b/README.md @@ -234,7 +234,8 @@ Reactive Resume is and always will be free and open-source. If it has helped you Other ways to support: - Star this repository -- Report bugs and suggest features +- Report reproducible bugs and suggest actionable features +- Help other users in [GitHub Discussions](https://github.com/amruthpillai/reactive-resume/discussions/categories/q-a) - Improve documentation - Help with translations @@ -260,6 +261,10 @@ Contributions make open-source thrive. Whether fixing a typo or adding a feature See the [development setup guide](https://docs.rxresu.me/contributing/development) for detailed instructions on how to set up the project locally. +Maintainers review the [`status: needs triage` queue](https://github.com/amruthpillai/reactive-resume/issues?q=is%3Aissue+is%3Aopen+label%3A%22status%3A+needs+triage%22) +weekly. Triaged bugs become `status: confirmed`; feature proposals become `status: accepted`; reports that need details become +`status: needs info`. + ## License [MIT](./LICENSE) — do whatever you want with it. diff --git a/docs/getting-started.mdx b/docs/getting-started.mdx index 8fac96a18..f8e62e301 100644 --- a/docs/getting-started.mdx +++ b/docs/getting-started.mdx @@ -96,7 +96,10 @@ Reactive Resume is built with modern web technologies: <CardGroup cols={2}> <Card title="GitHub" icon="github" href="https://github.com/amruthpillai/reactive-resume"> - Star the repo, report issues, and contribute to the project. + Star the repo, report reproducible bugs, propose features, and contribute to the project. + </Card> + <Card title="GitHub Discussions" icon="comments" href="https://github.com/amruthpillai/reactive-resume/discussions/categories/q-a"> + Ask questions about setup, configuration, and using Reactive Resume. </Card> <Card title="Reddit" icon="reddit" href="https://reddit.com/r/reactiveresume"> Join our Reddit community to get help and connect with other users. @@ -110,5 +113,6 @@ Reactive Resume is built with modern web technologies: </CardGroup> <Note> - **Need help?** Feel free to reach out via [email](mailto:hello@amruthpillai.com) or open an issue on GitHub. + **Need help?** Start a [GitHub Discussion](https://github.com/amruthpillai/reactive-resume/discussions/categories/q-a). + GitHub Issues are reserved for reproducible bugs and actionable feature proposals. </Note> diff --git a/knip.json b/knip.json index 98832afe4..b6b17d863 100644 --- a/knip.json +++ b/knip.json @@ -62,6 +62,9 @@ "uuid" ] }, + "tooling": { + "entry": ["issue-labels.mjs"] + }, "packages/api": { "ignoreDependencies": ["ioredis"] } diff --git a/tooling/issue-labels.mjs b/tooling/issue-labels.mjs new file mode 100644 index 000000000..cd49a4ba6 --- /dev/null +++ b/tooling/issue-labels.mjs @@ -0,0 +1,46 @@ +import assert from "node:assert/strict"; + +const fields = [ + [ + "Product variant", + { + Cloud: "deployment: cloud", + "Self-hosted": "deployment: self-hosted", + }, + ], + [ + "Area", + { + "Resume builder & data": "area: builder", + "Templates, preview & export": "area: rendering", + "Accounts & sharing": "area: account", + "AI & Agent": "area: ai", + "Language & localization": "area: localization", + "Self-hosting": "area: self-hosting", + "API & integrations": "area: integrations", + "Applications & cover letters": "area: applications", + }, + ], +]; + +export function getIssueLabels(body) { + return fields.flatMap(([heading, labels]) => { + const answer = body.match(new RegExp(`^### ${heading}\\r?\\n\\r?\\n([^\\r\\n]+)$`, "m"))?.[1].trim(); + return answer && labels[answer] ? [labels[answer]] : []; + }); +} + +if (import.meta.main) { + const issueBody = `### Product variant + +Self-hosted + +### Area + +Templates, preview & export`; + + assert.deepEqual(getIssueLabels(issueBody), ["deployment: self-hosted", "area: rendering"]); + assert.deepEqual(getIssueLabels("### Area\n\nOther / unsure"), []); + assert.deepEqual(getIssueLabels("#### Area\n\nAI & Agent"), []); + assert.deepEqual(getIssueLabels("prefix ### Area\n\nAI & Agent"), []); +}