Skip to content
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

feat: create eslint-community GitHub organization #91

Merged
merged 10 commits into from
Aug 24, 2022
383 changes: 383 additions & 0 deletions designs/2022-community-eslint-org/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,383 @@
- Repo: No ESLint repos, only the ones mentioned below (owned by private
persons)
- Start Date: 2022-05-31
- RFC PR: <https://github.com/eslint/rfcs/pull/91>
- Authors: [@aladdin-add](https://github.com/aladdin-add),
[@MichaelDeBoey](https://github.com/MichaelDeBoey) &
[@ota-meshi](https://github.com/ota-meshi)

# `@eslint-community` GitHub organization

## Summary

<!-- One-paragraph explanation of the feature. -->

Facilitate a GitHub organization (eg.
[@eslint-community](https://github.com/eslint-community)) where community
members can help ensure widely depended upon ESLint related packages stay up to
date with newer ESLint releases and doesn't hold the wider community back.

## Motivation

<!-- Why are we doing this? What use cases does it support? What is the expected
outcome? -->

There are some widely depended upon ESLint related packages that aren't kept up
to date with eg. new ESLint releases. The community would like a place to
collectively step in and ensure that these doesn't hold the wider community
back.

## Detailed Design

<!--
This is the bulk of the RFC.

Explain the design with enough detail that someone familiar with ESLint
can implement it by reading this document. Please get into specifics
of your approach, corner cases, and examples of how the change will be
used. Be sure to define any new terms in this section.
-->

### How do you envision `@eslint-community`?

Just like the [@jest-community](https://github.com/jest-community) org, the
MichaelDeBoey marked this conversation as resolved.
Show resolved Hide resolved
`@eslint-community` org would be a centralized home for ESLint related packages
that don't belong in the main org or that are widely depended upon, aren't
maintained anymore and are given back to the community.

> Community repos for ESLint related projects

The benefit of having the org in place would be that the community isn't
MichaelDeBoey marked this conversation as resolved.
Show resolved Hide resolved
dependent on one person's GitHub/`npm` account.
The added benefit is that the people maintaining the packages in the new org
_could_ create a structure to streamline the packages more. They _could_ for
instance decide things like using the same tools, supporting the same
Node/ESLint versions, if we want to release all "rescued" packages under the
`@eslint-community` `npm` scope or not, ...
Comment on lines +55 to +56
Copy link
Sponsor Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems like there's ambiguity around when we should move an NPM package to the @eslint-community NPM scope.

On the one hand, it would be nice to keep the existing NPM package name whenever possible to avoid churn so the thousands or millions of users of the package don't have to manually switch from the old name to the new name (the majority of users might never even get around to doing this, resulting in substantial fragmentation). This is my preference.

On the other, there might be organizational benefits to moving packages to scopes?

Copy link
Sponsor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think there's much benefit to moving an npm package name. I agree whenever possible we'd want to avoid churn, so the only use case there would be when the original name was somehow unrecoverable.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was about to write the same as @ljharb 👍 Only move when it needs to move

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should aim to get the original repo/npm package, if that's not possible, we should go with a fork and/or publish it under the org namespace

If a package is meeting these criteria, but we can't get into contact with the
owner of the repo to transfer ownership over to the new org, we could
temporarily fork the repo into the new org. However, the ultimate goal would
always be to transfer the original repo to the new org.
If we had a temporary fork and are able to transfer the original repo to the new
org, we should first create PRs to the original repo to bring it up to date with
the fork before continuing with other tasks.


As a reference, `@jest-community` has the following goal & intention:

> The goal of `@jest-community` is to have a loose but centralized home for
> stuff `jest` core thinks is neat and worth having but doesn't belong in the
> core itself. The org is a way to help ensure that these projects are not
> dependent on one person's GitHub account in case they move on.

The beauty of having a shared org is that the release process is centralised, so
no need to talk to `npm` about an ownership transfer and no need to fork and
republish under a new name. Just appoint new maintainers on GitHub and they can
work to restore continuity of service - a process which would be invisible to
users (i.e. users might see a pause in updates but not have to make changes -
the updates would just resume).

Although packages that are living under the new community org would be allowed
to (keep) accept(ing) sponsorship for the maintainer(s) of that package, they
should also include the
[ESLint Open Collective](https://opencollective.com/eslint) & the
[ESLint org](https://github.com/eslint) in their `FUNDING.yml`.

### Which projects should be involved?
MichaelDeBoey marked this conversation as resolved.
Show resolved Hide resolved

All of [@aladdin-add](https://github.com/aladdin-add),
[@ota-meshi](https://github.com/ota-meshi),
[@voxpelli](https://github.com/voxpelli) & myself would be in for helping to
maintain at least the following packages:
[`@mysticatea/eslint-plugin`](https://github.com/mysticatea/eslint-plugin),
MichaelDeBoey marked this conversation as resolved.
Show resolved Hide resolved
[`eslint-plugin-eslint-comments`](https://github.com/mysticatea/eslint-plugin-eslint-comments),
[`eslint-plugin-es`](https://github.com/mysticatea/eslint-plugin-es),
[`eslint-plugin-node`](https://github.com/mysticatea/eslint-plugin-node),
[`eslint-utils`](https://github.com/mysticatea/eslint-utils) &
[`regexpp`](https://github.com/mysticatea/regexpp) (all from
[@mysticatea](https://github.com/mysticatea)),
[`eslint-plugin-eslint-plugin`](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin)
(which is a recommended plugin for linting custom plugins & was already
mentioned by [@not-an-aardvark](https://github.com/not-an-aardvark) —the current
maintainer— to `@aladdin-add` that he wanted to transfer the repo to a better
home) &
[`eslint-plugin-promise`](https://github.com/xjamundx/eslint-plugin-promise)
(which is used a lot as well and was mentioned by the current maintainer
—[@xjamundx](https://github.com/xjamundx)— that he would like to transfer it to
the community org if one was going to exist).

The goal of the new community org isn't to take over all widely depended upon
ESLint related packages that are currently maintained by community members.
Packages like
[`eslint-plugin-unicorn`](https://github.com/sindresorhus/eslint-plugin-unicorn)
(which is currently maintained by
[@sindresorhus](https://github.com/sindresorhus)) or packages from initiatives
like [@typescript-eslint](https://github.com/typescript-eslint) or
[@standard](https://github.com/standard) could perfectly stay at their current
home.
If the maintainer(s) of such packages would want to transfer these packages to
the new community org, they could of course be accepted if they meet the
acceptance criteria.

### What would be the acceptance criteria?

The acceptance criteria for a package to go under the `@eslint-community` org
would be:

- Is it a package that is ESLint-related?
Mostly this will be ESLint plugins, but (unmaintained) dependencies of such
packages, closely related packages or packages split from the main ESLint repo
(like
[`eslint-formatter-codeframe`](https://github.com/fregante/eslint-formatter-codeframe)
or
[`eslint-formatter-table`](https://github.com/fregante/eslint-formatter-table),
which are currently maintained by [@fregante](https://github.com/fregante)) or
used by the main repo (like
[`eslint-utils`](https://github.com/mysticatea/eslint-utils) &
[`regexpp`](https://github.com/mysticatea/regexpp)) could go in the
`@eslint-community` org as well.

It also shouldn't matter if the package is purely TypeScript-related or not,
as refusing these packages and having a separate
`@typescript-eslint-community` org would only fragmentize the ESLint community
more without any real benefit.

Because plugins can expose their own (recommended) configs, the new org
already accepts config packages in some way.
However, the community core team won't be eager to accept shared ESLint config
packages, as they can be very opinionated.
Taking over these configs doesn't necessarily mean these are officially
endorsed by the ESLint TSC or the community core team, it just means that
maintenance is taken over and the community core team will ensure that the
wider community isn't held back by outdated packages.

- Is it widely depended upon throughout the community?
All mentioned packages have at least 3M downloads/week.
Only exceptions are `eslint-plugin-eslint-comments` (1M downloads/week) &
`@mysticatea/eslint-plugin` (1.3K downloads/week), which is listed in
`devDependencies` of all other mentioned packages by `@mysticatea`.

- It didn't receive an update in the last 6 months
We can make an exception for packages that did get a PR merged which was
created by a member of the community core team (mostly for updating
compatibility with newer versions of ESLint).

We can also make an exception for packages that meet the other criteria, but
where the owner wants to transfer ownership to the new org.
For instance people like [@gajus](https://github.com/gajus) could at some
point want to transfer ownership of plugins like
[`eslint-plugin-flowtype`](https://github.com/gajus/eslint-plugin-flowtype)
and/or [`eslint-plugin-jsdoc`](https://github.com/gajus/eslint-plugin-jsdoc)
if they would feel it would be better maintained by the community instead of
putting all workload on their shoulders. The same could be happening for
[`eslint-plugin-security`](https://github.com/nodesecurity/eslint-plugin-security),
which is currently maintained by the
[@nodesecurity](https://github.com/nodesecurity) team.

- It should agree to the code of conduct of the org
- It should have an OSI-approved license
- `eslintbot` should be added as an owner to the original npm package

If a package is meeting these criteria, but we can't get into contact with the
owner of the repo to transfer ownership over to the new org, we could
temporarily fork the repo into the new org. However, the ultimate goal would
always be to transfer the original repo to the new org.
If we had a temporary fork and are able to transfer the original repo to the new
org, we should first create PRs to the original repo to bring it up to date with
the fork before continuing with other tasks.

### What permissions should maintainers have?

The ESLint TSC would assign a community core team (of at least 3 people) —that
takes care of the effort the new org makes and let them run the day to day
business—, which would (in addition to the ESLint TSC) all be admins of the new
org.

Each package (and its directly related packages) will have its own team. If a
certain team is responsible for several related packages, we could choose to add
sub-teams if that makes sense.
All teams will be given maintainer rights on the repo for their specific
package(s), but admin rights will be kept to the ESLint TSC & the community core
team.
This way we prevent that a repo can be destroyed from the org.

We'll create a setup where we publish new versions of the package with
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you really and to do this, then we need more details on how it would work.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be nice if you could help me understand what @eslintbot is doing on the main repo & how it's set up there in order to write down how we could use it in the community org.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don’t think we’d want the same setup. @eslintbot is a GitHub account, and this would only need npm.

My suggestion: packages can tag and create GitHub releases, and that would trigger an action/workflow (unsure of specifics) that would use the npm eslintbot account to publish the release.

`eslintbot`. That way we can keep publishing new versions if someone would
dissapear.

The community core team would help maintain all repos, whereas people in
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you better define this separation? What tasks would the CCT handle? When would maintainers have to interact with the CCT?

Copy link
Contributor Author

@MichaelDeBoey MichaelDeBoey Jun 16, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think maintainers could work on their own without interference of the community core team if they don't want to.

The community core team would in general not interfere with handing day to day business of a specific package if that package has dedicated maintainers.

The community core team would create PRs & a review from the dedicated maintainers would be necessary (just like with all PRs from external people).

specific teams would only help maintain these repositories.

The community core team would be responsible for administering the Code of
Conduct of the organization.

The community core team would also be responsible for contacting package
maintainers (outside of GitHub) if they appear inactive.
Package maintainers will be seen as inactive if they didn't create a (necessary)
release in the last 6 month _or_ if they haven't responded (properly) to any
issue/PR/discussion in the last 3 months.
If the package maintainers don't respond in a reasonable time frame of 30 days,
they will be considered non-responsive & the community core team will step in to
appoint a new maintainer for the repository.

**Bonus:** Having our own place in the ESLint Discord server where we can
discuss some things would be a good idea as well.
This way the community core team has an open place to discuss some common things
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let’s be specific: is this a bonus or a must-have? Are we talking one channel? Is it private? What about a space for maintainers to collaborate? Does each package need a channel? Or can they request one?

Should this be a separate Discord server?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For me personally, this is not a must-have, as we could operate the new org without it, but it's more like a "really nice to have".

I think it would be nice to keep this in the same Discord server, but under a separate group of channels, as that would keep all ESLint related discussions in 1 server and we can easily link people to the right channel that way.

Having the community core group responsible for creating these channels would be a good idea imo, as this way it won't create extra work for the ESLint TSC.

I think that having a separate channel for each package would be easiest for people to talk about things regarding that specific package. This also makes sure that these discussions don't pollute other packages' discussions.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you update the TFC with this?

I think we should probably just start with one channel for the community core team and worry about whether packages need their own channels later. I’m guessing most won’t have an active need for it.

like extracting common functionality into a separate package, minimum Node &
ESLint target, how to handle disputes between maintainers, ...
Having a channel for each separate package would maybe be a good idea as well,
so the community has a chance to ask questions to the maintainers as well.

### What should be the role of the ESLint TSC?

The idea is that the ESLint TSC is the ultimate caretakers, they assign a
community core team to take care of the effort the new org makes and let them
ran the day to day business so that the ESLint TSC rarely has to involve
themselves.

Next to that, most important role would be to facilitate at least the contact
with `@mysticatea`, so we can transfer his packages over to the
`@eslint-community` org & gain `npm` publish rights for the packages.

The ESLint TSC could also talk to the community core team of the new org
regarding creating new community maintained packages that are split out from the
main ESLint repo or take over non-core plugins.
Examples of these kind of repos are:

- `eslint-plugin-node`
This plugin was recommended because of the deprecation of some rules in v7
<https://eslint.org/docs/user-guide/migrating-to-7.0.0#deprecate-node-rules>
- `eslint-formatter-codeframe` & `eslint-formatter-table`
These were both in the main ESLint repo but were removed in v8 and are
currently maintained by [@fregante](https://github.com/fregante)
<https://eslint.org/docs/8.0.0/user-guide/migrating-to-8.0.0#-removed-codeframe-and-table-formatters>
- `eslint-plugin-eslint-plugin`
This plugin is (together with `eslint-plugin-node`) a recommended plugin for
linting custom plugins.
<https://eslint.org/docs/developer-guide/working-with-plugins#linting>
- `eslint-utils` & `regexpp`
These packages are both used by the main ESLint repo & currently maintained by
`@mysticatea`
<https://github.com/eslint/eslint/blob/ce035e5fac632ba8d4f1860f92465f22d6b44d42/package.json#L66>
<https://github.com/eslint/eslint/blob/ce035e5fac632ba8d4f1860f92465f22d6b44d42/package.json#L87>
- `eslint-plugin-markdown`
This package is currently maintained by the ESLint TSC, but could perfectly
live in the new org
<https://github.com/eslint/eslint-plugin-markdown>

As discussed in
[the ESLint TSC Meeting of July 14th, 2022](https://github.com/eslint/tsc-meetings/blob/main/notes/2022/2022-07-14.md#feat-create-eslint-community-github-organization-rfc),
the community core team will also be compensated out of the main ESLint budget.

## Documentation

<!--
How will this RFC be documented? Does it need a formal announcement
on the ESLint blog to explain the motivation?
-->

A formal announcement on the ESLint blog would be preferred to let the community
know about this new org and about which forks we're maintaining.

## Drawbacks

<!--
Why should we *not* do this? Consider why adding this into ESLint
might not benefit the project or the community. Attempt to think
about any opposing viewpoints that reviewers might bring up.

Any change has potential downsides, including increased maintenance
burden, incompatibility with other tools, breaking existing user
experience, etc. Try to identify as many potential problems with
implementing this RFC as possible.
-->

One of the drawbacks could be that this new `@eslint-community` org could give
the impression that the packages owned by this new org are recommended by the
ESLint TSC.

Secondly, It could also put pressure on packages from other ESLint related
organizations/maintainers to transfer their project to this new org, as it could
be seen as the "correct" place for popular packages.

## Backwards Compatibility Analysis

<!--
How does this change affect existing ESLint users? Will any behavior
change for them? If so, how are you going to minimize the disruption
to existing users?
-->

It won't affect existing ESLint users, as package could be released under the
same name on `npm`.
Even when we would release a package under the `@eslint-community` `npm` scope
(for instance because we can't get the rights to publish to the existing `npm`
package), people could still use the old package without any extra problems
(except for the ones they already had) if they wanted to.

## Alternatives

<!--
What other designs did you consider? Why did you decide against those?

This section should also include prior art, such as whether similar
projects have already implemented a similar feature.
-->

- Private persons could create a fork of the above mentioned packages.
This could however create several well maintained forks, which would cause
fragmentation in the community.

More importantly, this could cause the "problem" of the fork being reliant on
that specific individual, which could put us in the same position
(abandoned/unmaintained package) all over again at some point in time.
Possibly having a new fork each X amount of time, would also have the burden
of needing to update all existing dependants each time.

- The community could independently create multiple more focused organizations
to maintain a subset of ESLint related packages.
Some examples of already existing organizations like that are
[@import-js](https://github.com/import-js) (which maintains
[`eslint-plugin-import`](https://github.com/import-js/eslint-plugin-import)),
[@jsx-eslint](https://github.com/jsx-eslint) (which maintains
[`eslint-plugin-jsx-a11y`](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y),
[`eslint-plugin-react`](https://github.com/jsx-eslint/eslint-plugin-react) &
[`jsx-ast-utils`](https://github.com/jsx-eslint/jsx-ast-utils)) & `@standard`
(which maintains a couple of
[`standard`](https://github.com/standard/standard) related ESLint configs)

## Open Questions

<!--
This section is optional, but is suggested for a first draft.

What parts of this proposal are you unclear about? What do you
need to know before you can finalize this RFC?

List the questions that you'd like reviewers to focus on. When
you've received the answers and updated the design to reflect them,
you can remove this section.
-->

- What exact acceptance criteria do we want to use?
MichaelDeBoey marked this conversation as resolved.
Show resolved Hide resolved
- What's the main place of communication for the community core team?

## Help Needed

<!--
This section is optional.

Are you able to implement this RFC on your own? If not, what kind
of help would you need from the team?
-->

We would need to get access to the `@eslint-community` org & be brought in
contact with `@mysticatea` to transfer his repos to the new org & get `npm`
publish rights on these repos.

## Related Discussions

<!--
This section is optional but suggested.

If there is an issue, pull request, or other URL that provides useful
context for this proposal, please include those links here.
-->
MichaelDeBoey marked this conversation as resolved.
Show resolved Hide resolved

- https://github.com/eslint/eslint/issues/15383
- https://github.com/eslint/eslint/discussions/15929
- https://github.com/mysticatea/eslint-plugin/pull/29#issuecomment-1139495904
- https://github.com/standard/eslint-config-standard/issues/192#issuecomment-1000279972
- https://github.com/weiran-zsd/eslint-plugin-node/issues/8