diff --git a/.github/DISCUSSION_TEMPLATE/vouch-request.yml b/.github/DISCUSSION_TEMPLATE/vouch-request.yml deleted file mode 100644 index c243f0f8d8..0000000000 --- a/.github/DISCUSSION_TEMPLATE/vouch-request.yml +++ /dev/null @@ -1,42 +0,0 @@ -body: - - type: markdown - attributes: - value: | - > [!IMPORTANT] - > This form is for **first-time contributors** who need to be vouched before submitting pull requests. Please read the [Contributing Guide](https://github.com/ghostty-org/ghostty/blob/main/CONTRIBUTING.md) and [AI Usage Policy](https://github.com/ghostty-org/ghostty/blob/main/AI_POLICY.md) before submitting. - > - > Keep your request **concise** and write it **in your own voice** — do not have an AI write this for you. A maintainer will comment `!vouch` if your request is approved, after which you can submit PRs. - - type: textarea - attributes: - label: What do you want to change? - description: | - Describe the change you'd like to make to Ghostty. If there is an existing issue or discussion, link to it. - placeholder: | - I'd like to fix the rendering issue described in #1234 where... - validations: - required: true - - type: textarea - attributes: - label: Why do you want to make this change? - description: | - Explain your motivation. Why is this change important or useful? - placeholder: | - This bug affects users who... - validations: - required: true - - type: checkboxes - attributes: - label: "I acknowledge that:" - options: - - label: >- - I have read the [Contributing Guide](https://github.com/ghostty-org/ghostty/blob/main/CONTRIBUTING.md) - and understand the contribution process. - required: true - - label: >- - I have read and agree to follow the - [AI Usage Policy](https://github.com/ghostty-org/ghostty/blob/main/AI_POLICY.md). - required: true - - label: >- - I wrote this vouch request myself, in my - own voice, without AI generating it. - required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 9c4455c4af..0086358db1 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1 @@ -blank_issues_enabled: false -contact_links: - - name: Features, Bug Reports, Questions - url: https://github.com/ghostty-org/ghostty/discussions/new/choose - about: Our preferred starting point if you have any questions or suggestions about configuration, features or behavior. +blank_issues_enabled: true diff --git a/.github/ISSUE_TEMPLATE/preapproved.md b/.github/ISSUE_TEMPLATE/preapproved.md deleted file mode 100644 index 485e727e60..0000000000 --- a/.github/ISSUE_TEMPLATE/preapproved.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -name: Pre-Discussed and Approved Topics -about: |- - Only for topics already discussed and approved in the GitHub Discussions section. ---- - -**DO NOT OPEN A NEW ISSUE. PLEASE USE THE DISCUSSIONS SECTION.** - -**I DIDN'T READ THE ABOVE LINE. PLEASE CLOSE THIS ISSUE.** diff --git a/.github/VOUCHED.td b/.github/VOUCHED.td deleted file mode 100644 index 568453e23e..0000000000 --- a/.github/VOUCHED.td +++ /dev/null @@ -1,133 +0,0 @@ -# The list of vouched (or actively denounced) users for this repository. -# -# The high-level idea is that only vouched users can participate in -# contributing to this project. And a denounced user is explicitly -# blocked from contributing (issues, PRs, etc. auto-closed). -# -# We choose to maintain a denouncement list rather than or in addition to -# using the platform's block features so other projects can slurp in our -# list of denounced users if they trust us and want to adopt our prior -# knowledge about bad actors. -# -# Syntax: -# - One handle per line (without @). Sorted alphabetically. -# - Optionally specify platform: `platform:username` (e.g., `github:mitchellh`). -# - To denounce a user, prefix with minus: `-username` or `-platform:username`. -# - Optionally, add comments after a space following the handle. -# -# Maintainers can vouch for new contributors by commenting "!vouch" on a -# discussion by the author. Maintainers can denounce users by commenting -# "!denounce" or "!denounce [username]" on a discussion. -00-kat -aalhendi -abudvytis -aindriu80 -alanmoyano -alexfeijoo44 -amadeus -andrejdaskalov -atomk -balazs-szucs -bennettp123 -benodiwal -bernsno -beryesa -bitigchi -bkircher -bo2themax -brentschroeter -charliie-dev -chernetskyi -craziestowl -curtismoncoq -d-dudas -daiimus -damyanbogoev -danulqua -doprz -douglance -elias8 -ephemera -eriksremess -filip7 -flou -francescarpi -gagbo -ghokun -gmile -gordonbondon -gpanders -guilhermetk -hakonhagland -halosatrio -hqnna -jacobsandlund -jake-stewart -jcollie -johnslavik -josephmart -jparise -juniqlim -kawarimidoll -kenvandine -khipp -kirwiisp -kjvdven -kloneets -koranir -kristina8888 -kristofersoler -laxystem -liby -lonsagisawa -mahnokropotkinvich -marijagjorgjieva -markhuot -marrocco-simone -matkotiric -miguelelgallo -mihi314 -mikailmm -misairuzame -mitchellh -miupa -mrmage -mtak -natesmyth -neo773 -nicosuave -nmggithub -nwehg -oshdubh -pan93412 -pangoraw -peilingjiang -peterdavehello -phush0 -piedrahitac -pluiedev -pouwerkerk -priyans-hu -qwerasd205 -reo101 -rgehan -rmengelbrecht -rmunn -rockorager -rpfaeffle -secrus -silveirapf -slsrepo -sunshine-syz -tdslot -ticclick -tnagatomi -trag1c -tristan957 -tweedbeetle -uhojin -uzaaft -vlsi -yamshta -zenyr -zeshi09 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9fcc6eb338..e91a48dc39 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,7 +17,7 @@ jobs: skip: runs-on: ubuntu-24.04 outputs: - # 'true' when all changed files are non-code (e.g. only VOUCHED.td), + # 'true' when all changed files are non-code, # signaling that all other jobs can be skipped entirely. skip: ${{ steps.determine.outputs.skip }} # Path-based filters to gate specific linter/formatter jobs. @@ -38,7 +38,6 @@ jobs: filters: | code: - '**' - - '!.github/VOUCHED.td' - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 id: filter_any with: diff --git a/.github/workflows/vouch-check-issue.yml b/.github/workflows/vouch-check-issue.yml deleted file mode 100644 index 3fa3bb542f..0000000000 --- a/.github/workflows/vouch-check-issue.yml +++ /dev/null @@ -1,22 +0,0 @@ -on: - issues: - types: [opened, reopened] - -name: "Vouch - Check Issue" - -jobs: - check: - runs-on: namespace-profile-ghostty-xsm - steps: - - uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1 - id: app-token - with: - app-id: ${{ secrets.VOUCH_APP_ID }} - private-key: ${{ secrets.VOUCH_APP_PRIVATE_KEY }} - - - uses: mitchellh/vouch/action/check-issue@c6d80ead49839655b61b422700b7a3bc9d0804a9 # v1.4.2 - with: - issue-number: ${{ github.event.issue.number }} - auto-close: true - env: - GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} diff --git a/.github/workflows/vouch-check-pr.yml b/.github/workflows/vouch-check-pr.yml deleted file mode 100644 index 0efb6208c4..0000000000 --- a/.github/workflows/vouch-check-pr.yml +++ /dev/null @@ -1,22 +0,0 @@ -on: - pull_request_target: - types: [opened, reopened] - -name: "Vouch - Check PR" - -jobs: - check: - runs-on: namespace-profile-ghostty-xsm - steps: - - uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1 - id: app-token - with: - app-id: ${{ secrets.VOUCH_APP_ID }} - private-key: ${{ secrets.VOUCH_APP_PRIVATE_KEY }} - - - uses: mitchellh/vouch/action/check-pr@c6d80ead49839655b61b422700b7a3bc9d0804a9 # v1.4.2 - with: - pr-number: ${{ github.event.pull_request.number }} - auto-close: true - env: - GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} diff --git a/.github/workflows/vouch-manage-by-discussion.yml b/.github/workflows/vouch-manage-by-discussion.yml deleted file mode 100644 index cf7c092e23..0000000000 --- a/.github/workflows/vouch-manage-by-discussion.yml +++ /dev/null @@ -1,35 +0,0 @@ -on: - discussion_comment: - types: [created] - -name: "Vouch - Manage by Discussion" - -concurrency: - group: vouch-manage - cancel-in-progress: false - -jobs: - manage: - runs-on: namespace-profile-ghostty-xsm - steps: - - uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1 - id: app-token - with: - app-id: ${{ secrets.VOUCH_APP_ID }} - private-key: ${{ secrets.VOUCH_APP_PRIVATE_KEY }} - - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - token: ${{ steps.app-token.outputs.token }} - - - uses: mitchellh/vouch/action/manage-by-discussion@c6d80ead49839655b61b422700b7a3bc9d0804a9 # v1.4.2 - with: - discussion-number: ${{ github.event.discussion.number }} - comment-node-id: ${{ github.event.comment.node_id }} - vouch-keyword: "!vouch" - denounce-keyword: "!denounce" - unvouch-keyword: "!unvouch" - pull-request: "true" - merge-immediately: "true" - env: - GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} diff --git a/.github/workflows/vouch-manage-by-issue.yml b/.github/workflows/vouch-manage-by-issue.yml deleted file mode 100644 index 6f85520bde..0000000000 --- a/.github/workflows/vouch-manage-by-issue.yml +++ /dev/null @@ -1,36 +0,0 @@ -on: - issue_comment: - types: [created] - -name: "Vouch - Manage by Issue" - -concurrency: - group: vouch-manage - cancel-in-progress: false - -jobs: - manage: - runs-on: namespace-profile-ghostty-xsm - steps: - - uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1 - id: app-token - with: - app-id: ${{ secrets.VOUCH_APP_ID }} - private-key: ${{ secrets.VOUCH_APP_PRIVATE_KEY }} - - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - token: ${{ steps.app-token.outputs.token }} - - - uses: mitchellh/vouch/action/manage-by-issue@c6d80ead49839655b61b422700b7a3bc9d0804a9 # v1.4.2 - with: - repo: ${{ github.repository }} - issue-id: ${{ github.event.issue.number }} - comment-id: ${{ github.event.comment.id }} - vouch-keyword: "!vouch" - denounce-keyword: "!denounce" - unvouch-keyword: "!unvouch" - pull-request: "true" - merge-immediately: "true" - env: - GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} diff --git a/.github/workflows/vouch-sync-codeowners.yml b/.github/workflows/vouch-sync-codeowners.yml deleted file mode 100644 index fac06a3725..0000000000 --- a/.github/workflows/vouch-sync-codeowners.yml +++ /dev/null @@ -1,32 +0,0 @@ -on: - schedule: - - cron: "0 0 * * 1" # Every Monday at midnight UTC - workflow_dispatch: - -name: "Vouch - Sync CODEOWNERS" - -concurrency: - group: vouch-manage - cancel-in-progress: false - -jobs: - sync: - runs-on: namespace-profile-ghostty-xsm - steps: - - uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1 - id: app-token - with: - app-id: ${{ secrets.VOUCH_APP_ID }} - private-key: ${{ secrets.VOUCH_APP_PRIVATE_KEY }} - - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - token: ${{ steps.app-token.outputs.token }} - - - uses: mitchellh/vouch/action/sync-codeowners@c6d80ead49839655b61b422700b7a3bc9d0804a9 # v1.4.2 - with: - repo: ${{ github.repository }} - pull-request: "true" - merge-immediately: "true" - env: - GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} diff --git a/AI_POLICY.md b/AI_POLICY.md deleted file mode 100644 index ab878c41e2..0000000000 --- a/AI_POLICY.md +++ /dev/null @@ -1,65 +0,0 @@ -# AI Usage Policy - -The Ghostty project has strict rules for AI usage: - -- **All AI usage in any form must be disclosed.** You must state - the tool you used (e.g. Claude Code, Cursor, Amp) along with - the extent that the work was AI-assisted. - -- **The human-in-the-loop must fully understand all code.** If you - can't explain what your changes do and how they interact with the - greater system without the aid of AI tools, do not contribute - to this project. - -- **Issues and discussions can use AI assistance but must have a full - human-in-the-loop.** This means that any content generated with AI - must have been reviewed _and edited_ by a human before submission. - AI is very good at being overly verbose and including noise that - distracts from the main point. Humans must do their research and - trim this down. - -- **No AI-generated media is allowed (art, images, videos, audio, etc.).** - Text and code are the only acceptable AI-generated content, per the - other rules in this policy. - -- **Bad AI drivers will be denounced** People who produce bad contributions - that are clearly AI (slop) will be added to our public denouncement list. - This list will block all future contributions. Additionally, the list - is public and may be used by other projects to be aware of bad actors. - We love to help junior developers learn and grow, but - if you're interested in that then don't use AI, and we'll help you. - I'm sorry that bad AI drivers have ruined this for you. - -These rules apply only to outside contributions to Ghostty. Maintainers -are exempt from these rules and may use AI tools at their discretion; -they've proven themselves trustworthy to apply good judgment. - -## There are Humans Here - -Please remember that Ghostty is maintained by humans. - -Every discussion, issue, and pull request is read and reviewed by -humans (and sometimes machines, too). It is a boundary point at which -people interact with each other and the work done. It is rude and -disrespectful to approach this boundary with low-effort, unqualified -work, since it puts the burden of validation on the maintainer. - -In a perfect world, AI would produce high-quality, accurate work -every time. But today, that reality depends on the driver of the AI. -And today, most drivers of AI are just not good enough. So, until either -the people get better, the AI gets better, or both, we have to have -strict rules to protect maintainers. - -## AI is Welcome Here - -Ghostty is written with plenty of AI assistance, and many maintainers embrace -AI tools as a productive tool in their workflow. As a project, we welcome -AI as a tool! - -**Our reason for the strict AI policy is not due to an anti-AI stance**, but -instead due to the number of highly unqualified people using AI. It's the -people, not the tools, that are the problem. - -I include this section to be transparent about the project's usage about -AI for people who may disagree with it, and to address the misconception -that this policy is anti-AI in nature. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9633029c5c..c048800bdb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,193 +1,31 @@ -# Contributing to Ghostty +# Contributing to Ghostree -This document describes the process of contributing to Ghostty. It is intended -for anyone considering opening an **issue**, **discussion** or **pull request**. -For people who are interested in developing Ghostty and technical details behind -it, please check out our ["Developing Ghostty"](HACKING.md) document as well. +Thank you for your interest in contributing to Ghostree! We welcome contributions of all kinds: bug reports, feature requests, documentation improvements, and code changes. -> [!NOTE] -> -> I'm sorry for the wall of text. I'm not trying to be difficult and I do -> appreciate your contributions. Ghostty is a personal project for me that -> I maintain in my free time. If you're expecting me to dedicate my personal -> time to fixing bugs, maintaining features, and reviewing code, I do kindly -> ask you spend a few minutes reading this document. Thank you. ❤️ +## How to Contribute -## The Critical Rule +### Reporting Bugs -**The most important rule: you must understand your code.** If you can't -explain what your changes do and how they interact with the greater system -without the aid of AI tools, do not contribute to this project. +- Search [existing issues](https://github.com/sidequery/ghostree/issues) to avoid duplicates. +- Open a new issue with a clear title and detailed description. +- Include steps to reproduce the bug, expected behavior, and actual behavior. +- Include your OS version and the output of `ghostty +version`. -Using AI to write code is fine. You can gain understanding by interrogating an -agent with access to the codebase until you grasp all edge cases and effects -of your changes. What's not fine is submitting agent-generated slop without -that understanding. Be sure to read the [AI Usage Policy](AI_POLICY.md). +### Suggesting Features -## AI Usage +- Open an issue describing the feature and why it would be useful. -The Ghostty project has strict rules for AI usage. Please see -the [AI Usage Policy](AI_POLICY.md). **This is very important.** +### Submitting Changes -## First-Time Contributors +1. Fork the repository and create a branch from `main`. +2. Make your changes. +3. Test your changes locally (see [HACKING.md](HACKING.md) for build instructions). +4. Open a pull request with a clear description of what you changed and why. -We use a vouch system for first-time contributors: +### Translations -1. Open a - [discussion in the "Vouch Request"](https://github.com/ghostty-org/ghostty/discussions/new?category=vouch-request) - category describing what you want to change and why. Follow the template. -2. Keep it concise -3. Write in your own voice, don't have an AI write this -4. A maintainer will comment `!vouch` if approved -5. Once approved, you can submit PRs +See the [Translator's Guide](po/README_TRANSLATORS.md) for contributing translations. -If you aren't vouched, any pull requests you open will be -automatically closed. This system exists because open source works -on a system of trust, and AI has unfortunately made it so we can no -longer trust-by-default because it makes it too trivial to generate -plausible-looking but actually low-quality contributions. +## Code of Conduct -## Denouncement System - -If you repeatedly break the rules of this document or repeatedly -submit low quality work, you will be **denounced.** This adds your -username to a public list of bad actors who have wasted our time. All -future interactions on this project will be automatically closed by -bots. - -The denouncement list is public, so other projects who trust our -maintainer judgement can also block you automatically. - -## Quick Guide - -### I'd like to contribute - -[All issues are actionable](#issues-are-actionable). Pick one and start -working on it. Thank you. If you need help or guidance, comment on the issue. -Issues that are extra friendly to new contributors are tagged with -["contributor friendly"]. - -["contributor friendly"]: https://github.com/ghostty-org/ghostty/issues?q=is%3Aissue%20is%3Aopen%20label%3A%22contributor%20friendly%22 - -### I'd like to translate Ghostty to my language - -We have written a [Translator's Guide](po/README_TRANSLATORS.md) for -everyone interested in contributing translations to Ghostty. -Translations usually do not need to go through the process of issue triage -and you can submit pull requests directly, although please make sure that -our [Style Guide](po/README_TRANSLATORS.md#style-guide) is followed before -submission. - -### I have a bug! / Something isn't working - -First, search the issue tracker and discussions for similar issues. Tip: also -search for [closed issues] and [discussions] — your issue might have already -been fixed! - -> [!NOTE] -> -> If there is an _open_ issue or discussion that matches your problem, -> **please do not comment on it unless you have valuable insight to add**. -> -> GitHub has a very _noisy_ set of default notification settings which -> sends an email to _every participant_ in an issue/discussion every time -> someone adds a comment. Instead, use the handy upvote button for discussions, -> and/or emoji reactions on both discussions and issues, which are a visible -> yet non-disruptive way to show your support. - -If your issue hasn't been reported already, open an ["Issue Triage"] discussion -and make sure to fill in the template **completely**. They are vital for -maintainers to figure out important details about your setup. - -> [!WARNING] -> -> A _very_ common mistake is to file a bug report either as a Q&A or a Feature -> Request. **Please don't do this.** Otherwise, maintainers would have to ask -> for your system information again manually, and sometimes they will even ask -> you to create a new discussion because of how few detailed information is -> required for other discussion types compared to Issue Triage. -> -> Because of this, please make sure that you _only_ use the "Issue Triage" -> category for reporting bugs — thank you! - -[closed issues]: https://github.com/ghostty-org/ghostty/issues?q=is%3Aissue%20state%3Aclosed -[discussions]: https://github.com/ghostty-org/ghostty/discussions?discussions_q=is%3Aclosed -["Issue Triage"]: https://github.com/ghostty-org/ghostty/discussions/new?category=issue-triage - -### I have an idea for a feature - -Like bug reports, first search through both issues and discussions and try to -find if your feature has already been requested. Otherwise, open a discussion -in the ["Feature Requests, Ideas"] category. - -["Feature Requests, Ideas"]: https://github.com/ghostty-org/ghostty/discussions/new?category=feature-requests-ideas - -### I've implemented a feature - -1. If there is an issue for the feature, open a pull request straight away. -2. If there is no issue, open a discussion and link to your branch. -3. If you want to live dangerously, open a pull request and - [hope for the best](#pull-requests-implement-an-issue). - -### I have a question which is neither a bug report nor a feature request - -Open an [Q&A discussion], or join our [Discord Server] and ask away in the -`#help` forum channel. - -Do not use the `#terminals` or `#development` channels to ask for help — -those are for general discussion about terminals and Ghostty development -respectively. If you do ask a question there, you will be redirected to -`#help` instead. - -> [!NOTE] -> If your question is about a missing feature, please open a discussion under -> the ["Feature Requests, Ideas"] category. If Ghostty is behaving -> unexpectedly, use the ["Issue Triage"] category. -> -> The "Q&A" category is strictly for other kinds of discussions and do not -> require detailed information unlike the two other categories, meaning that -> maintainers would have to spend the extra effort to ask for basic information -> if you submit a bug report under this category. -> -> Therefore, please **pay attention to the category** before opening -> discussions to save us all some time and energy. Thank you! - -[Q&A discussion]: https://github.com/ghostty-org/ghostty/discussions/new?category=q-a -[Discord Server]: https://discord.gg/ghostty - -## General Patterns - -### Issues are Actionable - -The Ghostty [issue tracker](https://github.com/ghostty-org/ghostty/issues) -is for _actionable items_. - -Unlike some other projects, Ghostty **does not use the issue tracker for -discussion or feature requests**. Instead, we use GitHub -[discussions](https://github.com/ghostty-org/ghostty/discussions) for that. -Once a discussion reaches a point where a well-understood, actionable -item is identified, it is moved to the issue tracker. **This pattern -makes it easier for maintainers or contributors to find issues to work on -since _every issue_ is ready to be worked on.** - -If you are experiencing a bug and have clear steps to reproduce it, please -open an issue. If you are experiencing a bug but you are not sure how to -reproduce it or aren't sure if it's a bug, please open a discussion. -If you have an idea for a feature, please open a discussion. - -### Pull Requests Implement an Issue - -Pull requests should be associated with a previously accepted issue. -**If you open a pull request for something that wasn't previously discussed,** -it may be closed or remain stale for an indefinite period of time. I'm not -saying it will never be accepted, but the odds are stacked against you. - -Issues tagged with "feature" represent accepted, well-scoped feature requests. -If you implement an issue tagged with feature as described in the issue, your -pull request will be accepted with a high degree of certainty. - -> [!NOTE] -> -> **Pull requests are NOT a place to discuss feature design.** Please do -> not open a WIP pull request to discuss a feature. Instead, use a discussion -> and link to your branch. +Be respectful and constructive. We're all here to make Ghostree better.