mirror of
https://github.com/zebrajr/express.git
synced 2025-12-06 00:19:48 +01:00
* docs: clarify guidelines for becoming a committer * Update Contributing.md Co-authored-by: Chris de Almeida <ctcpip@users.noreply.github.com> --------- Co-authored-by: Chris de Almeida <ctcpip@users.noreply.github.com>
246 lines
15 KiB
Markdown
246 lines
15 KiB
Markdown
# Express.js Community Contributing Guide 1.0
|
|
|
|
The goal of this document is to create a contribution process that:
|
|
|
|
* Encourages new contributions.
|
|
* Encourages contributors to remain involved.
|
|
* Avoids unnecessary processes and bureaucracy whenever possible.
|
|
* Creates a transparent decision making process that makes it clear how
|
|
contributors can be involved in decision making.
|
|
|
|
## Vocabulary
|
|
|
|
* A **Contributor** is any individual creating or commenting on an issue or pull request.
|
|
* A **Committer** is a subset of contributors who have been given write access to the repository.
|
|
* A **Project Captain** is the lead maintainer of a repository.
|
|
* A **TC (Technical Committee)** is a group of committers representing the required technical
|
|
expertise to resolve rare disputes.
|
|
* A **Triager** is a subset of contributors who have been given triage access to the repository.
|
|
|
|
## Logging Issues
|
|
|
|
Log an issue for any question or problem you might have. When in doubt, log an issue, and
|
|
any additional policies about what to include will be provided in the responses. The only
|
|
exception is security disclosures which should be sent privately.
|
|
|
|
Committers may direct you to another repository, ask for additional clarifications, and
|
|
add appropriate metadata before the issue is addressed.
|
|
|
|
Please be courteous and respectful. Every participant is expected to follow the
|
|
project's Code of Conduct.
|
|
|
|
## Contributions
|
|
|
|
Any change to resources in this repository must be through pull requests. This applies to all changes
|
|
to documentation, code, binary files, etc. Even long term committers and TC members must use
|
|
pull requests.
|
|
|
|
No pull request can be merged without being reviewed.
|
|
|
|
For non-trivial contributions, pull requests should sit for at least 36 hours to ensure that
|
|
contributors in other timezones have time to review. Consideration should also be given to
|
|
weekends and other holiday periods to ensure active committers all have reasonable time to
|
|
become involved in the discussion and review process if they wish.
|
|
|
|
The default for each contribution is that it is accepted once no committer has an objection.
|
|
During a review, committers may also request that a specific contributor who is most versed in a
|
|
particular area gives a "LGTM" before the PR can be merged. There is no additional "sign off"
|
|
process for contributions to land. Once all issues brought by committers are addressed it can
|
|
be landed by any committer.
|
|
|
|
In the case of an objection being raised in a pull request by another committer, all involved
|
|
committers should seek to arrive at a consensus by way of addressing concerns being expressed
|
|
by discussion, compromise on the proposed change, or withdrawal of the proposed change.
|
|
|
|
If a contribution is controversial and committers cannot agree about how to get it to land
|
|
or if it should land then it should be escalated to the TC. TC members should regularly
|
|
discuss pending contributions in order to find a resolution. It is expected that only a
|
|
small minority of issues be brought to the TC for resolution and that discussion and
|
|
compromise among committers be the default resolution mechanism.
|
|
|
|
## Becoming a Triager
|
|
|
|
Anyone can become a triager! Read more about the process of being a triager in
|
|
[the triage process document](Triager-Guide.md).
|
|
|
|
Currently, any existing [organization member](https://github.com/orgs/expressjs/people) can nominate
|
|
a new triager. If you are interested in becoming a triager, our best advice is to actively participate
|
|
in the community by helping triaging issues and pull requests. As well we recommend
|
|
to engage in other community activities like attending the TC meetings, and participating in the Slack
|
|
discussions. If you feel ready and have been helping triage some issues, reach out to an active member of the organization to ask if they'd
|
|
be willing to support you. If they agree, they can create a pull request to formalize your nomination. In the case of an objection to the nomination, the triage team is responsible for working with the individuals involved and finding a resolution.
|
|
|
|
You can also reach out to any of the [organization members](https://github.com/orgs/expressjs/people)
|
|
if you have questions or need guidance.
|
|
|
|
## Becoming a Committer
|
|
|
|
All contributors who have landed significant and valuable contributions should be onboarded in a timely manner,
|
|
and added as a committer, and be given write access to the repository.
|
|
|
|
Committers are expected to follow this policy and continue to send pull requests, go through
|
|
proper review, and have other committers merge their pull requests.
|
|
|
|
## TC Process
|
|
|
|
The TC uses a "consensus seeking" process for issues that are escalated to the TC.
|
|
The group tries to find a resolution that has no open objections among TC members.
|
|
If a consensus cannot be reached that has no objections then a majority wins vote
|
|
is called. It is also expected that the majority of decisions made by the TC are via
|
|
a consensus seeking process and that voting is only used as a last-resort.
|
|
|
|
Resolution may involve returning the issue to project captains with suggestions on
|
|
how to move forward towards a consensus. It is not expected that a meeting of the TC
|
|
will resolve all issues on its agenda during that meeting and may prefer to continue
|
|
the discussion happening among the project captains.
|
|
|
|
Members can be added to the TC at any time. Any TC member can nominate another committer
|
|
to the TC and the TC uses its standard consensus seeking process to evaluate whether or
|
|
not to add this new member. The TC will consist of a minimum of 3 active members and a
|
|
maximum of 10. If the TC should drop below 5 members the active TC members should nominate
|
|
someone new. If a TC member is stepping down, they are encouraged (but not required) to
|
|
nominate someone to take their place.
|
|
|
|
TC members will be added as admin's on the Github orgs, npm orgs, and other resources as
|
|
necessary to be effective in the role.
|
|
|
|
To remain "active" a TC member should have participation within the last 12 months and miss
|
|
no more than six consecutive TC meetings. Our goal is to increase participation, not punish
|
|
people for any lack of participation, this guideline should be only be used as such
|
|
(replace an inactive member with a new active one, for example). Members who do not meet this
|
|
are expected to step down. If A TC member does not step down, an issue can be opened in the
|
|
discussions repo to move them to inactive status. TC members who step down or are removed due
|
|
to inactivity will be moved into inactive status.
|
|
|
|
Inactive status members can become active members by self nomination if the TC is not already
|
|
larger than the maximum of 10. They will also be given preference if, while at max size, an
|
|
active member steps down.
|
|
|
|
## Project Captains
|
|
|
|
The Express TC can designate captains for individual projects/repos in the
|
|
organizations. These captains are responsible for being the primary
|
|
day-to-day maintainers of the repo on a technical and community front.
|
|
Repo captains are empowered with repo ownership and package publication rights.
|
|
When there are conflicts, especially on topics that effect the Express project
|
|
at large, captains are responsible to raise it up to the TC and drive
|
|
those conflicts to resolution. Captains are also responsible for making sure
|
|
community members follow the community guidelines, maintaining the repo
|
|
and the published package, as well as in providing user support.
|
|
|
|
Like TC members, Repo captains are a subset of committers.
|
|
|
|
To become a captain for a project the candidate is expected to participate in that
|
|
project for at least 6 months as a committer prior to the request. They should have
|
|
helped with code contributions as well as triaging issues. They are also required to
|
|
have 2FA enabled on both their GitHub and npm accounts.
|
|
|
|
Any TC member or an existing captain on the **same** repo can nominate another committer
|
|
to the captain role. To do so, they should submit a PR to this document, updating the
|
|
**Active Project Captains** section (while maintaining the sort order) with the project
|
|
name, the nominee's GitHub handle, and their npm username (if different).
|
|
- Repos can have as many captains as make sense for the scope of work.
|
|
- A TC member or an existing repo captain **on the same project** can nominate a new captain.
|
|
Repo captains from other projects should not nominate captains for a different project.
|
|
|
|
The PR will require at least 2 approvals from TC members and 2 weeks hold time to allow
|
|
for comment and/or dissent. When the PR is merged, a TC member will add them to the
|
|
proper GitHub/npm groups.
|
|
|
|
### Active Projects and Captains
|
|
|
|
- [`expressjs/badgeboard`](https://github.com/expressjs/badgeboard): @wesleytodd
|
|
- [`expressjs/basic-auth-connect`](https://github.com/expressjs/basic-auth-connect): @ulisesGascon
|
|
- [`expressjs/body-parser`](https://github.com/expressjs/body-parser): @wesleytodd, @jonchurch, @ulisesGascon
|
|
- [`expressjs/compression`](https://github.com/expressjs/compression): @ulisesGascon
|
|
- [`expressjs/connect-multiparty`](https://github.com/expressjs/connect-multiparty): @ulisesGascon
|
|
- [`expressjs/cookie-parser`](https://github.com/expressjs/cookie-parser): @wesleytodd, @UlisesGascon
|
|
- [`expressjs/cookie-session`](https://github.com/expressjs/cookie-session): @ulisesGascon
|
|
- [`expressjs/cors`](https://github.com/expressjs/cors): @jonchurch, @ulisesGascon
|
|
- [`expressjs/discussions`](https://github.com/expressjs/discussions): @wesleytodd
|
|
- [`expressjs/errorhandler`](https://github.com/expressjs/errorhandler): @ulisesGascon
|
|
- [`expressjs/express-paginate`](https://github.com/expressjs/express-paginate): @ulisesGascon
|
|
- [`expressjs/express`](https://github.com/expressjs/express): @wesleytodd, @ulisesGascon
|
|
- [`expressjs/expressjs.com`](https://github.com/expressjs/expressjs.com): @crandmck, @jonchurch, @bjohansebas
|
|
- [`expressjs/flash`](https://github.com/expressjs/flash): @ulisesGascon
|
|
- [`expressjs/generator`](https://github.com/expressjs/generator): @wesleytodd
|
|
- [`expressjs/method-override`](https://github.com/expressjs/method-override): @ulisesGascon
|
|
- [`expressjs/morgan`](https://github.com/expressjs/morgan): @jonchurch, @ulisesGascon
|
|
- [`expressjs/multer`](https://github.com/expressjs/multer): @LinusU, @ulisesGascon
|
|
- [`expressjs/response-time`](https://github.com/expressjs/response-time): @UlisesGascon
|
|
- [`expressjs/serve-favicon`](https://github.com/expressjs/serve-favicon): @ulisesGascon
|
|
- [`expressjs/serve-index`](https://github.com/expressjs/serve-index): @ulisesGascon
|
|
- [`expressjs/serve-static`](https://github.com/expressjs/serve-static): @ulisesGascon
|
|
- [`expressjs/session`](https://github.com/expressjs/session): @ulisesGascon
|
|
- [`expressjs/statusboard`](https://github.com/expressjs/statusboard): @wesleytodd
|
|
- [`expressjs/timeout`](https://github.com/expressjs/timeout): @ulisesGascon
|
|
- [`expressjs/vhost`](https://github.com/expressjs/vhost): @ulisesGascon
|
|
- [`jshttp/accepts`](https://github.com/jshttp/accepts): @blakeembrey
|
|
- [`jshttp/basic-auth`](https://github.com/jshttp/basic-auth): @blakeembrey
|
|
- [`jshttp/compressible`](https://github.com/jshttp/compressible): @blakeembrey
|
|
- [`jshttp/content-disposition`](https://github.com/jshttp/content-disposition): @blakeembrey
|
|
- [`jshttp/content-type`](https://github.com/jshttp/content-type): @blakeembrey
|
|
- [`jshttp/cookie`](https://github.com/jshttp/cookie): @blakeembrey
|
|
- [`jshttp/etag`](https://github.com/jshttp/etag): @blakeembrey
|
|
- [`jshttp/forwarded`](https://github.com/jshttp/forwarded): @blakeembrey
|
|
- [`jshttp/fresh`](https://github.com/jshttp/fresh): @blakeembrey
|
|
- [`jshttp/http-assert`](https://github.com/jshttp/http-assert): @wesleytodd, @jonchurch, @ulisesGascon
|
|
- [`jshttp/http-errors`](https://github.com/jshttp/http-errors): @wesleytodd, @jonchurch, @ulisesGascon
|
|
- [`jshttp/media-typer`](https://github.com/jshttp/media-typer): @blakeembrey
|
|
- [`jshttp/methods`](https://github.com/jshttp/methods): @blakeembrey
|
|
- [`jshttp/mime-db`](https://github.com/jshttp/mime-db): @blakeembrey, @UlisesGascon
|
|
- [`jshttp/mime-types`](https://github.com/jshttp/mime-types): @blakeembrey, @UlisesGascon
|
|
- [`jshttp/negotiator`](https://github.com/jshttp/negotiator): @blakeembrey
|
|
- [`jshttp/on-finished`](https://github.com/jshttp/on-finished): @wesleytodd, @ulisesGascon
|
|
- [`jshttp/on-headers`](https://github.com/jshttp/on-headers): @blakeembrey
|
|
- [`jshttp/proxy-addr`](https://github.com/jshttp/proxy-addr): @wesleytodd, @ulisesGascon
|
|
- [`jshttp/range-parser`](https://github.com/jshttp/range-parser): @blakeembrey
|
|
- [`jshttp/statuses`](https://github.com/jshttp/statuses): @blakeembrey
|
|
- [`jshttp/type-is`](https://github.com/jshttp/type-is): @blakeembrey
|
|
- [`jshttp/vary`](https://github.com/jshttp/vary): @blakeembrey
|
|
- [`pillarjs/cookies`](https://github.com/pillarjs/cookies): @blakeembrey
|
|
- [`pillarjs/csrf`](https://github.com/pillarjs/csrf): @ulisesGascon
|
|
- [`pillarjs/encodeurl`](https://github.com/pillarjs/encodeurl): @blakeembrey
|
|
- [`pillarjs/finalhandler`](https://github.com/pillarjs/finalhandler): @wesleytodd, @ulisesGascon
|
|
- [`pillarjs/hbs`](https://github.com/pillarjs/hbs): @ulisesGascon
|
|
- [`pillarjs/multiparty`](https://github.com/pillarjs/multiparty): @blakeembrey
|
|
- [`pillarjs/parseurl`](https://github.com/pillarjs/parseurl): @blakeembrey
|
|
- [`pillarjs/path-to-regexp`](https://github.com/pillarjs/path-to-regexp): @blakeembrey
|
|
- [`pillarjs/request`](https://github.com/pillarjs/request): @wesleytodd
|
|
- [`pillarjs/resolve-path`](https://github.com/pillarjs/resolve-path): @blakeembrey
|
|
- [`pillarjs/router`](https://github.com/pillarjs/router): @wesleytodd, @ulisesGascon
|
|
- [`pillarjs/send`](https://github.com/pillarjs/send): @blakeembrey
|
|
- [`pillarjs/understanding-csrf`](https://github.com/pillarjs/understanding-csrf): @ulisesGascon
|
|
|
|
### Current Initiative Captains
|
|
|
|
- Triage team [ref](https://github.com/expressjs/discussions/issues/227): @UlisesGascon
|
|
|
|
## Developer's Certificate of Origin 1.1
|
|
|
|
```text
|
|
By making a contribution to this project, I certify that:
|
|
|
|
(a) The contribution was created in whole or in part by me and I
|
|
have the right to submit it under the open source license
|
|
indicated in the file; or
|
|
|
|
(b) The contribution is based upon previous work that, to the best
|
|
of my knowledge, is covered under an appropriate open source
|
|
license and I have the right under that license to submit that
|
|
work with modifications, whether created in whole or in part
|
|
by me, under the same open source license (unless I am
|
|
permitted to submit under a different license), as indicated
|
|
in the file; or
|
|
|
|
(c) The contribution was provided directly to me by some other
|
|
person who certified (a), (b) or (c) and I have not modified
|
|
it.
|
|
|
|
(d) I understand and agree that this project and the contribution
|
|
are public and that a record of the contribution (including all
|
|
personal information I submit with it, including my sign-off) is
|
|
maintained indefinitely and may be redistributed consistent with
|
|
this project or the open source license(s) involved.
|
|
```
|