-
-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Initial governance suggestion #1
base: main
Are you sure you want to change the base?
Changes from all commits
46bf9c0
690ecc7
4c30103
8902808
5c35c96
1cd6f65
51dc45a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,201 @@ | ||||||||||||||
# ESLint-Community Governance | ||||||||||||||
|
||||||||||||||
## Core Team | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The RFC & announcement blogpost are talking about
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since this is a document for the |
||||||||||||||
|
||||||||||||||
The Core Team are the curators and stewards of the ESLint-Community project . Their key | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||
responsibility is to evaluate new projects that are proposed to join `@eslint-community` | ||||||||||||||
and to help out in offering a base level maintenance for all primary projects within | ||||||||||||||
the organization. | ||||||||||||||
|
||||||||||||||
The Core Team should have occasional meetings to discuss the project, with meeting minutes | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||
being added to [eslint-community/governance][]. | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. A link is missing here I think? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Its in the very bottom for eg. readability reasons: [eslint-community/governance]:
https://github.com/eslint-community/governance |
||||||||||||||
|
||||||||||||||
The Core Team are together with the ESLint TSC the organization owners and the only ones | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||
with `admin` access to repositories within the organization. | ||||||||||||||
|
||||||||||||||
The Core Team are the only members of the `@eslint-community/core-team` team. | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||
|
||||||||||||||
The Core Team and ESLint TSC have a shared `#community-team` chat room, in the ESLint | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||
Discord, to communicate with one another. | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What about linking to the Discord server as well? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If there's a good link, then sure 👍 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We used https://eslint.org/chat/eslint-community in the org announcement post |
||||||||||||||
|
||||||||||||||
## ESLint TSC | ||||||||||||||
|
||||||||||||||
The ESLint TSC are the ultimate caretakers of the ESLint-Community, appoints the Core | ||||||||||||||
Team and holds the ownership of the `eslint-community-bot` npm account that owns all | ||||||||||||||
the ESLint-Community npm modules. | ||||||||||||||
Comment on lines
+23
to
+25
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||
|
||||||||||||||
The Core Team are together with the ESLint TSC the organization owners and only ones | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||
with `admin` access to repositories within the organization. | ||||||||||||||
|
||||||||||||||
The ESLint TSC are the only members of the `@eslint-community/eslint-tsc` team. | ||||||||||||||
|
||||||||||||||
The Core Team and ESLint TSC have a shared `#community-team` chat room, in the ESLint | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||
Discord, to communicate with one another. | ||||||||||||||
|
||||||||||||||
## Collaborators | ||||||||||||||
|
||||||||||||||
Collaborators maintain the projects of the ESLint-Community organization. | ||||||||||||||
|
||||||||||||||
Collaborators are added on a project by project basis by adding them to a team of | ||||||||||||||
the same name as its main project repository, eg. `@eslint-community/eslint-plugin`. | ||||||||||||||
|
||||||||||||||
A project team is given `write` level access to its repositories. | ||||||||||||||
|
||||||||||||||
If multiple repositores are needed by the same project they should all be added to | ||||||||||||||
the project team. | ||||||||||||||
|
||||||||||||||
Both Collaborators and non-Collaborators may propose changes to the source code | ||||||||||||||
of the projects of the organization. The mechanism to propose such a change is a | ||||||||||||||
GitHub pull request. Collaborators review and merge (_land_) pull requests | ||||||||||||||
following the [CONTRIBUTING](CONTRIBUTING.md) guidelines. | ||||||||||||||
|
||||||||||||||
Collaborators can communicate in private with the Core Team in | ||||||||||||||
[private team discussion on GitHub][]. | ||||||||||||||
|
||||||||||||||
### Collaborator activities | ||||||||||||||
|
||||||||||||||
* Helping users and novice contributors | ||||||||||||||
* Contributing code and documentation changes that improve the project | ||||||||||||||
* Reviewing and commenting on issues and pull requests | ||||||||||||||
* Merging pull requests | ||||||||||||||
* Release plugins | ||||||||||||||
|
||||||||||||||
The Core Team can remove inactive Collaborators or provide them with | ||||||||||||||
_Past Collaborators_ status. Past Collaborators may request that the Core | ||||||||||||||
Team restore them to active status. | ||||||||||||||
|
||||||||||||||
## Projects | ||||||||||||||
|
||||||||||||||
There are two kinds of projects in ESLint Community: Primary and auxiliary projects. | ||||||||||||||
|
||||||||||||||
Primary projects are maintained by Core Team in collaboration with project Collaborators | ||||||||||||||
and will be ensured to be kept up to date at a best effort pace by the Core Team. | ||||||||||||||
|
||||||||||||||
Auxiliary projects are maintained by its project Collaborators and is kept up to date at | ||||||||||||||
whatever pace those Collaborators chose. The Core Team merely fascilitates nominations | ||||||||||||||
of new Collaborators to such projects, ensuring there's a path to keep it maintained, | ||||||||||||||
without making any promises. | ||||||||||||||
Comment on lines
+71
to
+77
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would maybe want a third level here:
And a project can move up and down – from primary, to auxiliary to archived and the other way around – and its clear to everyone what the status of the project is and that makes the threshold for accepting new projects lower. |
||||||||||||||
|
||||||||||||||
All project npm modules should be owned (and solely owned) by the `eslint-community-bot` | ||||||||||||||
user on npm. If the npm modules are owned by an existing organisation and using its prefix, | ||||||||||||||
then the `eslint-community-bot` should become the sole owner of that organisation. | ||||||||||||||
|
||||||||||||||
Additional assets such as domain names, web sites etc should also be in control of the | ||||||||||||||
Core Team and/or the ESLint TSC. | ||||||||||||||
|
||||||||||||||
If possible, a project should always be transfered and keep using its original npm module | ||||||||||||||
name and repository. If a new module name needs to be created, it should preferably be | ||||||||||||||
`@eslint-community/<the-old-name>`. | ||||||||||||||
|
||||||||||||||
Automatic releases of the modules should be set up by the Core Team using the organization | ||||||||||||||
secret in the GitHub organization. | ||||||||||||||
|
||||||||||||||
Auxiliary projects can can be nominated to become a primary project by its Collaborators, | ||||||||||||||
by opening a [private team discussion on GitHub][]. | ||||||||||||||
|
||||||||||||||
If a primary project is no longer widely depended upon, or have technical reasons to no | ||||||||||||||
longer stay a primary project, the Core Team can decide to convert it into an auxiliary | ||||||||||||||
project in discussion with its Collaborators. | ||||||||||||||
|
||||||||||||||
## Project nominations | ||||||||||||||
|
||||||||||||||
Projects that are widely depended upon within the ESLint ecosystem may be nominated to | ||||||||||||||
become ESLint-Community projects by anyone by opening a public issue on GitHub in the | ||||||||||||||
[eslint-community/governance][] repository. | ||||||||||||||
|
||||||||||||||
The project should fulfill a few criterias: | ||||||||||||||
|
||||||||||||||
The project should: | ||||||||||||||
|
||||||||||||||
* Preferably be: An ESLint plugin or formatter | ||||||||||||||
* Maybe be: A dependency used by an ESLint-Community project or the main ESLint repo | ||||||||||||||
* Not be: Primarily an ESLint config | ||||||||||||||
|
||||||||||||||
The project should also: | ||||||||||||||
|
||||||||||||||
* be widely depended upon throughout the community (eg. 3M downloads/week or similar) | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I see this 3M/wk example figure comes from the RFC where the majority of the mentioned projects have this level. I'm not aware of how much consideration it's had already, at RFC time, or now in being carried forward to this criterion - hence this comment. It sounds like quite a high bar at first look, although for context ESLint itself gets 38M (so the 3M is 8%) and the React plugin gets 18M (47%). Other stats that would be more difficult to acquire would be count or % of all plugins on npm (or https://github.com/dustinspecker/awesome-eslint) that would meet this criteria. Any further thoughts on the figure? As far as I know, NPM download counts and GitHub stars are the only metrics available. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. A better number / criteria would indeed be good Eg. @aladdin-add proposed adding Other possible numbers are accessible through eg. ecosyste.ms, such as number of "dependent packages" and "dependant repositories", which for eg. At times also interesting to know which version it is that the downloads are from, eg that plugin has most of its downloads happen on the 3.x version and not yet on the latest 4.x version, which if it would be an abandoned aged project would indicate that its the 3.x version that should be adopted maybe. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Some ordered searches for some visibility of the curves: https://www.npmjs.com/search?q=eslint-plugin-&ranking=popularity I think both downloads and metrics are pretty flawed though. For popular projects I expect the share caused by public mirrors is small. Some companies run NPM mirrors and have hundreds of developers and projects hidden behind a single download count. Others are running hundreds of CI jobs daily without any caching or mirror. And how many people star the projects they use. These aren't problems for us to solve here, but to be mindful of their effect. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What if we use number of projects that depend on the package? This might give a better idea of "importance" to the community (especially when coupled with downloads). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I actually have been working on a tool that enables one to list dependents of a module + filter those dependencies on how old the latest release it, minimum downloads and such: https://github.com/voxpelli/list-dependents-cli (Will be using it for some canary tests, but is similarly useful here) On the governance text: Maybe we just remove any hard numbers and defer it to a case by case basis? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think dependents count is an useful input, but perhaps when applied to all users, a secondary one. My intuition is that there are many, many more private than public projects depending on plugins, but of course we don't have information about those. Taking https://www.npmjs.com/package/eslint-plugin-react for example, and generously assuming that every one of the 17k dependents make 10 downloads every day of the week, that would account for 1M of the 18M weekly downloads. Limited information here so I'm clutching at straws and that might be a flawed validation of my intuition. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Just seen the comment about removing hard numbers. I think it would be fine. For the use case I had today at least, it would have resulted (by the word "widely") in the what I believe to be the correct outcome which is that I wouldn't have submitted my not-very-popular (3-4K/wk) small project. There is a data gap we've come across here however that I expect is bound to have affected people making decisions (in the NPM ecosystem generally) before us and will continue to in the future. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. eslint-plugin-react has 2 million dependent repositories: https://packages.ecosyste.ms/registries/npmjs.org/packages/eslint-plugin-react There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah I see, dependent repositories rather than packages as I used from npmjs.org, and they have a more comprehensive view of other distribution channels for the packages number too. Presumably still not covering private projects however. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we included the number because "widely used" is another vague term that could be interpreted differently by different people and just wanted to give an indication 🤷♂️ So I would be in favor of just removing the number completely 👍 |
||||||||||||||
* have an OSI-approved license (preferably Apache 2.0, else MIT-style) | ||||||||||||||
* have proposed Collaborators or have possibility to be deemed a Primary project | ||||||||||||||
by the Core Team | ||||||||||||||
|
||||||||||||||
If project currently has an active maintainer it should be transfered and then: | ||||||||||||||
|
||||||||||||||
* the current maintainer should be willing to transfer the project to ESLint-Community | ||||||||||||||
|
||||||||||||||
If it's an abandoned project that needs to be forked: | ||||||||||||||
|
||||||||||||||
* It shouldn't have received an update in a substantial amount of time (eg. last 6 months) | ||||||||||||||
or it should present a major obstacle to the adoption of eg. a new major version of ESLint | ||||||||||||||
* A clear notice about the nomination should have been made to the project and its | ||||||||||||||
maintainer at least 30 days before it can be accepted | ||||||||||||||
|
||||||||||||||
Projects should typically start out with a status of "auxiliary". | ||||||||||||||
|
||||||||||||||
## Collaborator nominations | ||||||||||||||
|
||||||||||||||
Individuals making significant and valuable contributions to a project may be | ||||||||||||||
a candidate to join the ESLint-Community organization and that team. | ||||||||||||||
|
||||||||||||||
An existing Collaborator needs to open a [private team discussion on GitHub][] and | ||||||||||||||
list the candidates they want to sponsor with a link to the user's contributions. For | ||||||||||||||
example: | ||||||||||||||
|
||||||||||||||
* Activities in the ESLint-Community organization | ||||||||||||||
`[USERNAME](https://github.com/search?q=author:USERNAME+org:eslint-community)` | ||||||||||||||
|
||||||||||||||
Otherwise, a Contributor may self-apply if they believe they meet the above | ||||||||||||||
criteria by reaching out to a Core Team member privately with the links to their | ||||||||||||||
valuable contributions. That Lead Maintainer will then open a private team discussion on | ||||||||||||||
GitHub regarding that and reply back when a decision has been made. | ||||||||||||||
|
||||||||||||||
The consensus to grant a new candidate Collaborator status is reached when: | ||||||||||||||
|
||||||||||||||
- at least two of the Core Team members approve | ||||||||||||||
- at least half of the current collaborators in that team approve, rounded up | ||||||||||||||
(and not counting Core Team members) | ||||||||||||||
|
||||||||||||||
## Core Team nominations | ||||||||||||||
|
||||||||||||||
A Team Member may be promoted to the Core Team only through nomination by a | ||||||||||||||
Core Team member and with agreement from the rest of Core Team as well as the | ||||||||||||||
ESLint TSC. | ||||||||||||||
|
||||||||||||||
The ESLint TSC can appoint and revoke Core Team members at their own discretion. | ||||||||||||||
|
||||||||||||||
## Consensus seeking process | ||||||||||||||
|
||||||||||||||
The ESLint Community follows a Lazy [Consensus Seeking][] decision-making model, | ||||||||||||||
inspired by the [ASF][]. | ||||||||||||||
|
||||||||||||||
_Lazy_ means that silence is consent if an appropriate amount of time has passed | ||||||||||||||
(most of the time: at least a week) since the suggestion was made and no objections | ||||||||||||||
has been raised. | ||||||||||||||
|
||||||||||||||
This only holds true if all relevant parties has been notified of the suggestion | ||||||||||||||
and given the opportunity to take part. Eg. extra care needs to be taken during | ||||||||||||||
holiday and vacation times. | ||||||||||||||
|
||||||||||||||
Decision makers should strive to give active consent and not actively wait out | ||||||||||||||
silent consent. | ||||||||||||||
|
||||||||||||||
### Votes | ||||||||||||||
|
||||||||||||||
In case of a Collaborator objection to a specific change, the Core Team can | ||||||||||||||
vote to override the objection if consensus can not be reached. | ||||||||||||||
|
||||||||||||||
For all votes, a simple majority of all Core Team members for, or against, the | ||||||||||||||
issue wins. A Core Team member may choose to participate in any vote through | ||||||||||||||
abstention. | ||||||||||||||
|
||||||||||||||
The ESLint TSC can decide to override / veto any decision / objection made by | ||||||||||||||
Collaborators or Core Team. The ESLint Project decides how to arrive at | ||||||||||||||
such decisions. | ||||||||||||||
|
||||||||||||||
[Consensus Seeking]: | ||||||||||||||
https://en.wikipedia.org/wiki/Consensus-seeking_decision-making | ||||||||||||||
[ASF]: | ||||||||||||||
https://community.apache.org/committers/decisionMaking.html | ||||||||||||||
[eslint-community/governance]: | ||||||||||||||
https://github.com/eslint-community/governance | ||||||||||||||
[private team discussion on GitHub]: | ||||||||||||||
https://github.com/eslint-community/collaborators/discussions |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,18 +1,38 @@ | ||
# Governance | ||
# ESLint-Community Governance | ||
|
||
Outlines the governance of [@eslint-community](https://github.com/eslint-community) and fascilitates proposals and nominations | ||
## Purpose | ||
|
||
## Goal | ||
To have a place where community members can help ensure that widely depended upon ESLint-related packages live and never fall out of maintenance. | ||
|
||
As you can read in the | ||
["`eslint-community` GitHub organization" RFC](https://github.com/eslint/rfcs/tree/main/designs/2022-community-eslint-org), | ||
the goal of this organization is to have a place where community members can | ||
help ensure widely depended upon ESLint-related packages live and never fall out | ||
of maintenance. | ||
## Governance | ||
|
||
See [GOVERNANCE.md](./GOVERNANCE.md) | ||
|
||
## The Community Core team | ||
|
||
* [`@aladdin-add`](https://github.com/aladdin-add) | ||
* [`@MichaelDeBoey`](https://github.com/MichaelDeBoey) | ||
* [`@ota-meshi`](https://github.com/ota-meshi) | ||
* [`@voxpelli`](https://github.com/voxpelli) | ||
|
||
|
||
## Projects | ||
|
||
### Primary projects | ||
|
||
* [eslint-plugin-es-x](https://github.com/eslint-community/eslint-plugin-es-x) (Collaborators: [@brettz9](https://github.com/brettz9)) | ||
* [eslint-plugin-eslint-comments](https://github.com/eslint-community/eslint-plugin-eslint-comments) (Collaborators: ) | ||
* [eslint-plugin-eslint-plugin](https://github.com/eslint-community/eslint-plugin-eslint-plugin) (Collaborators: [@bmish](https://github.com/bmish), [@bradzacher](https://github.com/bradzacher)) | ||
* [eslint-plugin-n](https://github.com/eslint-community/eslint-plugin-n) (Collaborators: [@scagood](https://github.com/scagood)) | ||
* [eslint-plugin-promise](https://github.com/eslint-community/eslint-plugin-promise) (Collaborators: [@xjamundx](https://github.com/xjamundx), [@bmish](https://github.com/bmish)) | ||
* [eslint-plugin-security](https://github.com/eslint-community/eslint-plugin-security) (Collaborators: [@nzakas](https://github.com/nzakas), [@nlf](https://github.com/nlf)) | ||
* [eslint-utils](https://github.com/eslint-community/eslint-utils) (Collaborators: ) | ||
* [eslint-formatter-codeframe](https://github.com/eslint-community/eslint-formatter-codeframe) (Collaborators: ) | ||
* [eslint-formatter-table](https://github.com/eslint-community/eslint-formatter-table) (Collaborators: ) | ||
* [eslint-plugin-mysticatea](https://github.com/eslint-community/eslint-plugin-mysticatea) (Collaborators: ) | ||
* [regexpp](https://github.com/eslint-community/regexpp) (Collaborators: ) | ||
|
||
### Auxiliary projects | ||
|
||
* [eslint-stylistic](https://github.com/eslint-community/eslint-stylistic) (Collaborators: [@Shinigami92](https://github.com/Shinigami92), [@antfu](https://github.com/antfu), [@kecrily](https://github.com/kecrily)) | ||
* [eslint-stylistic-repro-template](https://github.com/eslint-community/eslint-stylistic-repro-template) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We always named it without the hypen, so maybe we should keep doing that here as well?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I used
ESLint-Community
to refer to theeslint-community
organization, asESLint Community
can just as well be interpreted as referring to the ESLint community in generalThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The latter would be with a lowercase
c
I guess?I'm just trying to have consistent naming across the RFC, the announcement post and this document we're creating in this PR