From af764903e77e8e39dd51a208628a11f00e1cfb29 Mon Sep 17 00:00:00 2001 From: Rootiest Date: Mon, 31 Aug 2026 23:07:44 -0400 Subject: [PATCH] docs(contributing): add issue templates for bugs, features, and docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Issues had no template at all, so a report arrived in whatever shape the reporter chose — most often without a fish version, a reproduction, or the full error text, which is what actually stalls a bug. Add three templates under .github/ISSUE_TEMPLATE/, beside the PR template so the GitHub mirror offers the same set: - **bug.yaml** — a Gitea issue form rather than markdown. Version, OS, area, reproduction, expected and actual behavior are required fields, so an unactionable report can't be submitted in the first place. The Area dropdown exists because contributors without push access can't set an Area/ label themselves. - **feature.md** and **docs.md** — comment-guided markdown in the same house style as PULL_REQUEST_TEMPLATE.md, since what they ask for is open-ended prose. feature.md carries `## Acceptance criteria`, the issue-side counterpart to a PR's `## Verification`. docs.md insists on the docs/manual/** source rather than the generated page, which the next CI run would overwrite. - **config.yaml** — keeps blank issues enabled for what the three don't cover, and links the contributing guide and the customization docs. Each template pre-applies its Kind/ label. Document the set, the plain- description title convention (an issue states a problem; the conventional subject belongs on the PR that closes it), and the triage split in a new CONTRIBUTING.md § Issues. --- .github/ISSUE_TEMPLATE/bug.yaml | 143 +++++++++++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yaml | 13 +++ .github/ISSUE_TEMPLATE/docs.md | 80 ++++++++++++++++ .github/ISSUE_TEMPLATE/feature.md | 111 ++++++++++++++++++++++ CONTRIBUTING.md | 67 ++++++++++++++ 5 files changed, 414 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug.yaml create mode 100644 .github/ISSUE_TEMPLATE/config.yaml create mode 100644 .github/ISSUE_TEMPLATE/docs.md create mode 100644 .github/ISSUE_TEMPLATE/feature.md diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml new file mode 100644 index 0000000..fe1fdde --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -0,0 +1,143 @@ +name: Bug report +about: Something in the config is broken or behaves unexpectedly +labels: + - Kind/Bug +body: + - type: markdown + attributes: + value: | + Thanks for filing a bug. + + **Title it as a plain description of the problem**, not as a + conventional-commit subject — `mv clobbers a symlink when the target + exists`, not `fix(mv): ...`. The commit format belongs on the PR that + fixes this; the `Kind/` and `Area/` labels carry type and scope here. + + Before filing, please confirm the problem survives a fresh shell + (`exec fish`) — a stale function definition in a long-lived session is + the single most common false alarm. + + - type: input + id: fish-version + attributes: + label: fish version + description: Output of `fish --version`. This config targets fish 4.x. + placeholder: fish, version 4.0.2 + validations: + required: true + + - type: input + id: os + attributes: + label: Operating system + description: Distribution and version, or macOS release. + placeholder: Arch Linux (CachyOS), kernel 6.12.4 + validations: + required: true + + - type: input + id: terminal + attributes: + label: Terminal emulator + description: >- + Only matters for rendering, key bindings, and color problems. Leave it + blank if the bug has nothing to do with those. + placeholder: kitty 0.42.1 + validations: + required: false + + - type: dropdown + id: area + attributes: + label: Area + description: >- + Which part of the config is affected? Pick the closest match — a + maintainer translates this into the matching `Area/` label at triage, + since contributors without push access can't set labels themselves. + Choose "Not sure" rather than guessing. + options: + - Not sure + - Functions (functions/) + - Completions (completions/) + - Config and startup (config.fish, conf.d/) + - Docs (docs/manual/, man page, docs site) + - Tests (tests/) + - CI (.github/workflows/) + - Integrations (integrations/) + - Prompt and theme (themes/) + - Opinionated components (C1-C6 toggles) + - Scripts (scripts/) + validations: + required: true + + - type: textarea + id: summary + attributes: + label: What's broken + description: One or two sentences. Name the function or file if you know it. + placeholder: >- + `mv` replaces an existing symlink instead of prompting, so the link + target is lost with no confirmation. + validations: + required: true + + - type: textarea + id: reproduce + attributes: + label: Steps to reproduce + description: >- + Exact commands, starting from a fresh shell, that someone else can + paste and run. Include any setup needed to reach the broken state. + render: fish + placeholder: | + exec fish + mkdir -p /tmp/repro; cd /tmp/repro + touch real; ln -s real link + mv real link + validations: + required: true + + - type: textarea + id: expected + attributes: + label: Expected behavior + description: What you thought those commands would do. + validations: + required: true + + - type: textarea + id: actual + attributes: + label: Actual behavior + description: >- + What happened instead. Paste the complete output, including any error + text and stack traces — truncated errors are the usual reason a bug + report stalls in Status/Need More Info. + render: text + validations: + required: true + + - type: checkboxes + id: preflight + attributes: + label: Pre-flight + options: + - label: I searched the existing issues and this isn't already reported. + required: true + - label: I reproduced this in a fresh shell (`exec fish`), not a long-lived session. + required: true + - label: I ran `fish tests/run-tests.fish` and noted the result below (or in the output above). + required: false + + - type: textarea + id: context + attributes: + label: Additional context + description: >- + Anything else worth knowing: a private overlay in + `~/.config/.user-dots/fish/` that may be involved, opinionated + components you've disabled, the last commit where it worked. Never + paste credentials, tokens, or machine-specific paths you'd rather not + publish. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yaml b/.github/ISSUE_TEMPLATE/config.yaml new file mode 100644 index 0000000..de6c3ee --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yaml @@ -0,0 +1,13 @@ +# Gitea reads this alongside the templates in this directory. +# Blank issues stay enabled deliberately: the three templates cover bugs, +# features, and docs, and anything else (a chore, a refactor, a question) +# is better served by an empty box than by a template that doesn't fit. +blank_issues_enabled: true + +contact_links: + - name: Contributing guide + url: https://git.rootiest.dev/rootiest/fish-config/src/branch/main/CONTRIBUTING.md + about: Branch naming, commit conventions, coding standards, and the label taxonomy. + - name: Customization and personal overrides + url: https://git.rootiest.dev/rootiest/fish-config/src/branch/main/docs/manual/07-customization.md + about: Want to change behavior on just your machine? Use your private overlay — no issue needed. diff --git a/.github/ISSUE_TEMPLATE/docs.md b/.github/ISSUE_TEMPLATE/docs.md new file mode 100644 index 0000000..e121953 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/docs.md @@ -0,0 +1,80 @@ +--- +name: Documentation issue +about: Something in the manual, man page, config-help, or docs site is wrong, missing, or unclear +labels: + - Kind/Documentation +--- + + + +## Location + + + +## Problem + + + +## Suggested fix + + + +## Notes + + diff --git a/.github/ISSUE_TEMPLATE/feature.md b/.github/ISSUE_TEMPLATE/feature.md new file mode 100644 index 0000000..7fe99ae --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.md @@ -0,0 +1,111 @@ +--- +name: Feature or enhancement request +about: Propose new functionality, or an improvement to something that already exists +labels: + - Kind/Feature +--- + + + +## Summary + + + +## Problem + + + +## Proposed behavior + + + +## Alternatives considered + + + +## Scope + + + +## Acceptance criteria + + + +- [ ] +- [ ] + +## Notes + + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e36ddea..90a93e5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,6 +9,7 @@ treat it as a living document, not a final word. ## Table of Contents - [Getting Started](#getting-started) +- [Issues](#issues) - [Branching & Pull Requests](#branching--pull-requests) - [Commit Conventions](#commit-conventions) - [Fish Coding Standards](#fish-coding-standards) @@ -34,6 +35,72 @@ If you're touching anything under `docs/manual/`, you'll also want `pandoc`, (see [Documentation Pipeline](#documentation-pipeline)) — otherwise CI will catch problems on push. +## Issues + +Issues live on the Gitea repo. Three templates cover the common cases, each +pre-applying its `Kind/` label; blank issues stay enabled for everything else +— a chore, a refactor, a question, a tracking issue. + +| Template | Format | Use it for | Applies | +|---|---|---|---| +| **Bug report** | web form | Something is broken or behaves unexpectedly | `Kind/Bug` | +| **Feature or enhancement request** | markdown | New functionality, or an improvement to what exists | `Kind/Feature` | +| **Documentation issue** | markdown | The manual, man page, `config-help`, or docs site is wrong, missing, or unclear | `Kind/Documentation` | + +They live in `.github/ISSUE_TEMPLATE/`, next to the PR template, so the +GitHub mirror offers the same set. The bug report is a Gitea *issue form* — +a real web form with required fields — because a bug report missing its +version, reproduction, or full error text can't be acted on, and a form +refuses to submit without them. The other two are markdown templates in the +same comment-guided style as `.github/PULL_REQUEST_TEMPLATE.md`, since what +they ask for is open-ended prose that structure would only get in the way of. + +### Issue titles + +**Issue titles are plain descriptions of the problem, not Conventional +Commits subjects.** + +```text +mv clobbers a symlink when the target exists ← yes +fix(mv): prompt before replacing an existing symlink ← no +``` + +An issue states a problem; a commit states a change. The type and scope that +`fix(mv):` would carry are already on the issue as its `Kind/` and `Area/` +labels, and the conventional subject belongs on the PR that closes it, where +it becomes the commit message. Writing the fix into the title also presumes +one, which is the wrong end to start from for anything still being diagnosed. + +### What an issue owes + +- **A bug** needs a reproduction someone else can paste and run, starting + from a fresh shell, plus the complete error output. A stale function + definition in a long-lived session is the most common false alarm, so + confirm it survives `exec fish` first. `Status/Need More Info` is where + reports without a reproduction end up. +- **A feature** needs `## Acceptance criteria` — the checkbox list of what + must be true for the issue to close. It is the issue-side counterpart to a + PR's `## Verification`: a definition of done agreed before the work starts + rather than argued about after, and the PR's checks usually grow out of it. +- **A docs issue** needs to name the `docs/manual/**` source, not just the + page where the problem showed up. `docs/fish-config.md` and + `docs/fish-config.1` are generated, and a fix applied there is overwritten + by the next CI run — see [Documentation + Pipeline](#documentation-pipeline). + +### Triage + +Reporters aren't expected to label anything. Contributors without push access +can't, and the templates apply the `Kind/` label by themselves; the rest is +the maintainer's job when the issue is triaged — add the `Area/` label (the +bug form's **Area** dropdown is how a reporter tells you, since no forge can +map a form field to a label), set a `Priority/` if it isn't ordinary, and +apply `Reviewed/Confirmed` once a bug actually reproduces. See +[Labels](#labels). + +When a PR resolves an issue it closes it with a trailing `Closes #N` line — +see [Pull request descriptions](#pull-request-descriptions). + ## Branching & Pull Requests **If you don't have push access to this repo**, fork it and open your PR