diff --git a/.github/workflows/check-teams.yml b/.github/workflows/check-teams.yml index de8ffa2..bb0da3f 100644 --- a/.github/workflows/check-teams.yml +++ b/.github/workflows/check-teams.yml @@ -2,12 +2,17 @@ name: Teams on: workflow_dispatch: - pull_request_target: + pull_request: paths: + - teams/**/*.yml - teams/*.yml + - teams/**/*.yaml - teams/*.yaml - teams/*.schema.json + - scripts/check_teams.py - scripts/schemas.py + - scripts/sort_team_yaml.py + - .github/workflows/check-teams.yml jobs: check: diff --git a/.gitignore b/.gitignore index 096b5eb..5bbe9d7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ # pixi environments .pixi *.egg-info +__pycache__/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 334d5bd..7ea6ba6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -57,6 +57,7 @@ repos: rev: v2.4.1 hooks: - id: codespell + exclude: ^teams/.*\.ya?ml$ exclude_types: - csv args: [--write-changes] @@ -67,6 +68,12 @@ repos: - id: check-useless-excludes - repo: local hooks: + - id: sort-team-yaml + name: Check ordering in teams/**/*.yml + language: python + entry: python scripts/sort_team_yaml.py + files: ^teams/.*\.ya?ml$ + additional_dependencies: [ruamel.yaml, email-validator, pydantic] - id: git-diff name: git diff entry: git diff --exit-code diff --git a/README.md b/README.md index e702463..58a1cdc 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ This group encompasses all others who are not on the [Steering Council](#steerin ### Emeritus Steering -[Steering Council](#steering-council) members that are inactive (commits, GitHub comments/issues/reviews, dev meetings, and voting on polls) in the past six months will be asked if they want to become **Emeritus Steering** members. One week after asking, if the inactive Steering Council member has not responded, they will be automatically moved to emeritus status. Any Steering Council member can also request to become Emeritus if they wish to do so (e.g. taking a sabbatical or long vacation). Emeritus Steering members can be brought back to active Steering Council membership at anytime, assuming there is space and no other policies (e.g., [shared funding](#shared-funding-membership-restrictions), [council size](#steering-council-size), etc.) are violated. Emeritus Steering Council members cannot vote. When the status of a member changes, the [`steering.csv`](steering.csv) and [`emeritus.csv`](emeritus.csv) files should be immediately updated to reflect the member's new position. +[Steering Council](#steering-council) members that are inactive (commits, GitHub comments/issues/reviews, dev meetings, and voting on polls) in the past six months will be asked if they want to become **Emeritus Steering** members. One week after asking, if the inactive Steering Council member has not responded, they will be automatically moved to emeritus status. Any Steering Council member can also request to become Emeritus if they wish to do so (e.g. taking a sabbatical or long vacation). Emeritus Steering members can be brought back to active Steering Council membership at anytime, assuming there is space and no other policies (e.g., [shared funding](#shared-funding-membership-restrictions), [council size](#steering-council-size), etc.) are violated. Emeritus Steering Council members cannot vote. When the status of a member changes, the corresponding `teams/` YAML files should be immediately updated to reflect the member's new position. ## Community, Federated & Archive Maintenance @@ -234,7 +234,7 @@ This section presents descriptions and criteria for voting items in the conda Or * Steering Council members must explicitly abstain from a vote via making a comment on the PR/issue or selecting the "abstain" option. Simply not voting at all doesn't count as an abstention. * Abstentions count towards the [quorum](#quorum) but are excluded when computing if a vote passes. -Voting items are labeled as either **standard** or **sensitive**. Standard items are ones where public record and discourse is preferable. Sensitive voting items are ones where the results of the vote should remain private to the voters after the vote has occurred. Sensitive votes should take place on a secure anonymous voting platform in order to retain election integrity and anonymity. (We may use [`Polys`](https://polys.me) and the [`Helios voting system`](https://vote.heliosvoting.org/), but are open to any secure, anonymous system.) The email capability of your chosen voting platform should be used for sending voting invitations and reminders if possible. All votes should be sent to the appropriate people using their email listed in `steering.csv` as applicable. +Voting items are labeled as either **standard** or **sensitive**. Standard items are ones where public record and discourse is preferable. Sensitive voting items are ones where the results of the vote should remain private to the voters after the vote has occurred. Sensitive votes should take place on a secure anonymous voting platform in order to retain election integrity and anonymity. (We may use [`Polys`](https://polys.me) and the [`Helios voting system`](https://vote.heliosvoting.org/), but are open to any secure, anonymous system.) The email capability of your chosen voting platform should be used for sending voting invitations and reminders if possible. All votes should be sent to the appropriate people using their email listed in `steering-council.yml` as applicable. The default voting period is 1 week (7 days). This may be modified at the time when a vote is called, but may never be less than one week modulo exceptions for some time-sensitive votes below. @@ -310,7 +310,7 @@ To post a timeout reminder, here is a template comment: If you have questions concerning the proposal, you may also leave a comment or code review. -To declare a standard vote "timed out," the person making such a declaration must post a pull-request adding a vote record to the [`vote-results`](vote-results/]) folder. The declaration PR should be merged by the first Steering Council member who is available to verify that the requirements for the timeout have been met, based on their own personal records. +To declare a standard vote "timed out," the person making such a declaration must post a pull-request adding a vote record to the [`vote-results`](vote-results/) folder. The declaration PR should be merged by the first Steering Council member who is available to verify that the requirements for the timeout have been met, based on their own personal records. ### Voting Total Examples diff --git a/emeritus.csv b/emeritus.csv index 0842211..685b420 100644 --- a/emeritus.csv +++ b/emeritus.csv @@ -1,20 +1 @@ -github_username,email,name,funder,pronouns -raydouglass,ray@raydouglass.com,Ray Douglass,, -sodre,psodre@gmail.com,Patrick Sodré,, -minrk,benjaminrk@gmail.com,Min Ragan-Kelley,, -scopatz,scopatz@gmail.com,Anthony Scopatz,, -angloyna,angela.gloyna@gmail.com,Angela Gloyna,, -jjhelmus,jjhelmus@gmail.com,Jonathan Helmus,, -prusse-martin,prusse.martin@gmail.com,Martin Prüsse,, -myancy-anaconda,Megan.C.Yancy@gmail.com,Megan Yancy,, -teoliphant,teoliphant@gmail.com,Travis Oliphant,, -dharhas,dharhas@gmail.com,Dharhas Pothina,, -cjmartian,connormartin7@gmail.com,Connor Martin,, -mcg1969,mgrant@anaconda.com,Michael Grant,, -csoja,csoja@anaconda.com,Crystal Soja,, -awwad,sebastien.awwad@gmail.com,Sebastien Awwad,, -ericdill,ericdill@pm.me,Eric Dill,, -goanpeca,goanpeca@gmail.com,Gonzalo Peña-Castellanos,Quansight,he/him -kkraus14,keith.j.kraus@gmail.com,Keith Kraus,no funding, he/him -beckermr,becker.mr@gmail.com,Matthew R. Becker,no funding,he/him -trallard,taniar.allard@gmail.com,Tania Allard,Quansight,she/her +Moved,to,teams/,directory diff --git a/pixi.lock b/pixi.lock index 73ec969..2af787f 100644 --- a/pixi.lock +++ b/pixi.lock @@ -14,6 +14,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda @@ -45,6 +47,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.16-py312h4c3975b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.14-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda @@ -61,6 +64,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-2.0.0-py312he90777b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda @@ -83,6 +88,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ruamel.yaml-0.18.16-py312h80b0991_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ruamel.yaml.clib-0.2.14-py312h80b0991_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda @@ -99,6 +105,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py312h1b4d9a2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda @@ -122,6 +130,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml-0.18.16-py312h4409184_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.14-py312h4409184_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda @@ -138,6 +147,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py312he06e257_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.8.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda @@ -157,6 +168,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml-0.18.16-py312he06e257_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml.clib-0.2.14-py312he06e257_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda @@ -386,6 +398,35 @@ packages: license_family: MIT size: 50965 timestamp: 1760437331772 +- conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.8.0-pyhcf101f3_0.conda + sha256: ef1e7b8405997ed3d6e2b6722bd7088d4a8adf215e7c88335582e65651fb4e05 + md5: d73fdc05f10693b518f52c994d748c19 + depends: + - python >=3.10,<4.0.0 + - sniffio + - python + constrains: + - aioquic >=1.2.0 + - cryptography >=45 + - httpcore >=1.0.0 + - httpx >=0.28.0 + - h2 >=4.2.0 + - idna >=3.10 + - trio >=0.30 + - wmi >=1.5.1 + license: ISC + size: 196500 + timestamp: 1757292856922 +- conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.3.0-pyhd8ed1ab_0.conda + sha256: c37320864c35ef996b0e02e289df6ee89582d6c8e233e18dc9983375803c46bb + md5: 3bc0ac31178387e8ed34094d9481bfe8 + depends: + - dnspython >=2.0.0 + - idna >=2.0.0 + - python >=3.10 + license: Unlicense + size: 46767 + timestamp: 1756221480106 - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 @@ -1191,6 +1232,15 @@ packages: license_family: MIT size: 105494 timestamp: 1760564569285 +- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + sha256: dce518f45e24cd03f401cb0616917773159a210c19d601c5f2d4e0e5879d30ad + md5: 03fe290994c5e4ec17293cfb6bdce520 + depends: + - python >=3.10 + license: Apache-2.0 + license_family: Apache + size: 15698 + timestamp: 1762941572482 - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda sha256: 1544760538a40bcd8ace2b1d8ebe3eb5807ac268641f8acdc18c69c5ebfeaf64 md5: 86bc20552bf46075e3d92b67f089172d diff --git a/pixi.toml b/pixi.toml index 46b273d..e90209d 100644 --- a/pixi.toml +++ b/pixi.toml @@ -1,19 +1,20 @@ [dependencies] +email-validator = ">=2.3.0,<3" pydantic = ">=2,<3" python = ">=3.12.4,<3.13" requests = ">=2.32.3,<2.33" "ruamel.yaml" = ">=0.18,<0.19" -[project] -authors = ["conda steering council "] -channels = ["conda-forge"] -name = "governance" -platforms = ["osx-64", "osx-arm64", "win-64", "linux-64"] -version = "0.1.0" - [tasks] check_teams = "python scripts/check_teams.py" collect_emails = "python scripts/collect_emails.py" count_votes = "python scripts/count_votes.py" schemas = "python scripts/schemas.py" vote_markdown = "python scripts/to_vote.py" + +[workspace] +authors = ["conda steering council "] +channels = ["conda-forge"] +name = "governance" +platforms = ["osx-64", "osx-arm64", "win-64", "linux-64"] +version = "0.1.0" diff --git a/scripts/check_teams.py b/scripts/check_teams.py index 875e90e..660b508 100644 --- a/scripts/check_teams.py +++ b/scripts/check_teams.py @@ -1,8 +1,20 @@ """ Checks whether the members defined in the teams/*.yaml files correspond to their Github definitions. It also makes sure that all teams in conda and conda-incubator are collected here. + +We need one fine-grained token per organization (CONDA_ORG_WIDE_TOKEN, +CONDA_INCUBATOR_ORG_WIDE_TOKEN), with permissions: + +- All repositories, metadata (read-only) +- Organization, metadata (read-only) """ +# /// script +# dependencies = [ +# "requests", +# "ruamel.yaml", +# ] + import os import sys from itertools import chain @@ -14,110 +26,256 @@ HERE = Path(__file__).parent ROOT = HERE.parent -yaml = YAML(typ="safe") +yaml = YAML() +yaml.indent(mapping=2, sequence=4, offset=2) -def token(org): - if org == "conda": - return os.environ.get("CONDA_ORG_WIDE_TOKEN", "") - if org == "conda-incubator": - return os.environ.get("CONDA_INCUBATOR_ORG_WIDE_TOKEN", "") - return os.environ.get("GITHUB_TOKEN") +def eprint(*args, indent=0, **kwargs): + kwargs.setdefault("file", sys.stderr) + if indent: + print(indent * " ", *args, **kwargs) + else: + print(*args, **kwargs) + +def report_diff(field: str, indent: int = 2, **entries: str | list[str]): + if len(entries) != 2: + raise ValueError("Must pass exactly two keyword arguments") + names = list(entries.keys()) + values = list(entries.values()) + eprint( + f"! Contents for {field} in {names[0]} do not match {names[1]}:", indent=indent + ) + values0 = ( + [str(val) for val in values[0]] + if isinstance(values[0], (list, tuple)) + else [values[0] or ""] + ) + values1 = ( + [str(val) for val in values[1]] + if isinstance(values[1], (list, tuple)) + else [values[1] or ""] + ) + eprint(f"{names[0]}:", values0, indent=indent) + eprint(f"{names[1]}:", values1, indent=indent) + for line in unified_diff( + values0, + values1, + fromfile=names[0], + tofile=names[1], + ): + eprint(line, indent=indent) -def team_members(org: str, name: str) -> list[str]: - api_url = f"https://api.github.com/orgs/{org}/teams/{name}/members" + +def gh(org, apipath): + api_url = f"https://api.github.com/{apipath}" + + if org == "conda": + token = os.environ.get("CONDA_ORG_WIDE_TOKEN") + elif org == "conda-incubator": + token = os.environ.get("CONDA_INCUBATOR_ORG_WIDE_TOKEN") + else: + token = None + token = token or os.environ.get("GITHUB_TOKEN") or "" # Headers for authentication and proper API versioning headers = { - "Authorization": f"Bearer {token(org)}", + "Authorization": f"Bearer {token}", "Accept": "application/vnd.github.v3+json", "X-GitHub-Api-Version": "2022-11-28", } r = requests.get(api_url, headers=headers, params={"per_page": 100}) r.raise_for_status() - return [member["login"] for member in r.json()] + return r.json() + + +def team_details(org: str, team: str) -> list[str]: + return gh(org, f"orgs/{org}/teams/{team}") + + +def team_members(org: str, team: str) -> list[str]: + result = gh(org, f"orgs/{org}/teams/{team}/members") + return [member["login"] for member in result] def teams_in_org(org): - api_url = f"https://api.github.com/orgs/{org}/teams" + result = gh(org, f"orgs/{org}/teams") + return [f"{org}/{team['slug']}" for team in result] - # Headers for authentication and proper API versioning - headers = { - "Authorization": f"Bearer {token(org)}", - "Accept": "application/vnd.github.v3+json", - "X-GitHub-Api-Version": "2022-11-28", - } - r = requests.get(api_url, headers=headers, params={"per_page": 100}) - r.raise_for_status() - return [f"{org}/{team['slug']}" for team in r.json()] - - -exit_code = 0 -teams_in_github = [*teams_in_org("conda"), *teams_in_org("conda-incubator")] -seen_teams = [] - -for path in chain(ROOT.glob("teams/*.yml"), ROOT.glob("teams/*.yaml")): - with open(path) as f: - team = yaml.load(path) - name_components = team["name"].split("/") - if len(name_components) == 2: - org, name = name_components - elif len(name_components) == 1: - org = "conda" - name = name_components[0] - else: - print( - f"Name {team['name']} must be '' or '/'", - file=sys.stderr, - ) - try: - members = team_members(org, name) - except Exception as exc: - print(type(exc).__name__, "-", exc, file=sys.stderr) - print("----", file=sys.stderr) +def repos_in_org(org): + result = gh(org, f"orgs/{org}/repos") + return [repo["full_name"] for repo in result] + + +def access_to_repos(org, team): + result = gh(org, f"orgs/{org}/teams/{team}/repos") + return [ + repo["full_name"] + for repo in result + if (repo["permissions"]["admin"] or repo["permissions"]["push"]) + and "-ghsa-" not in repo["name"] + ] + + +def teams_with_access_to_repo(org, repo): + result = gh(org, f"repos/{org}/{repo}/teams") + return [team["slug"] for team in result] + + +def collaborators(org, repo): + result = gh(org, f"repos/{org}/{repo}/collaborators?affiliation=direct") + return {user["login"]: user["role_name"] for user in result} + + +def all_yamls() -> list[Path]: + return sorted(chain(ROOT.glob("teams/**/*.yml"), ROOT.glob("teams/**/*.yaml"))) + + +def check_teams() -> int: + exit_code = 0 + teams_in_github = [*teams_in_org("conda"), *teams_in_org("conda-incubator")] + seen_teams = [] + seen_repos = [] + + for path in all_yamls(): + print("Checking", path.relative_to(ROOT), "...") + with open(path) as f: + team = yaml.load(f) + + for team_name in team.get("resources", {}).get("teams", ()): + print(" Checking Github team", team_name, "...") + # 0. Validate team names + org, name = team_name.split("/") + if org not in ("conda", "conda-incubator"): + eprint( + "Team must belong to the `conda` or `conda-incubator` orgs.", + indent=4, + ) + exit_code = 1 + continue + + details = team_details(org, name) + + # 1. Validate descriptions + if team["description"] != details["description"]: + report_diff( + "descriptions", + file=team["description"], + github=details["description"], + indent=4, + ) + exit_code = 1 + + # 2. Validate team members + try: + members = team_members(org, name) + except Exception as exc: + eprint(type(exc).__name__, "-", exc, indent=4) + exit_code = 1 + continue + seen_teams.append(f"{org}/{name}") + if set(members) != set(team["members"]): + members_in_file = sorted(team["members"], key=str.lower) + members_in_gh = sorted(members, key=str.lower) + report_diff( + "members", file=members_in_file, github=members_in_gh, indent=4 + ) + exit_code = 1 + + # 3. Validate access to repositories + repos_in_file = sorted( + [ + repo + for repo in team["resources"]["repos"] or [] + if repo.startswith(f"{org}/") + ], + key=str.lower, + ) + seen_repos.extend(repos_in_file) + repos_in_gh = sorted(access_to_repos(org, name), key=str.lower) + if set(repos_in_file) != set(repos_in_gh): + report_diff( + "repositories", file=repos_in_file, github=repos_in_gh, indent=4 + ) + exit_code = 1 + print(" ---") + print("---") + + # 4. Check all teams are described + if set(seen_teams) != set(teams_in_github): + teams_in_repo = sorted(seen_teams, key=str.lower) + teams_in_gh = sorted(teams_in_github, key=str.lower) + report_diff("teams", yamls=teams_in_repo, github=teams_in_gh, indent=2) exit_code = 1 - continue - seen_teams.append(f"{org}/{name}") - if set(members) != set(team["members"]): - members_in_file = sorted(team["members"], key=str.lower) - members_in_gh = sorted(members, key=str.lower) - print( - f"Members in '{path.name}' are not in sync with team '@{org}/{name}':", - file=sys.stderr, - ) - print("File:", members_in_file, file=sys.stderr) - print("Github:", members_in_gh, file=sys.stderr) - print( - "Diff:", - *unified_diff( - members_in_file, members_in_gh, fromfile=path.name, tofile="Github" - ), - sep="\n", - ) - print("----", file=sys.stderr) + print("---") + + # 5. Check no individuals are granted access directly (everything must be a team) + repos_with_direct_access = {} + for repo in chain(repos_in_org("conda"), repos_in_org("conda-incubator")): + if "-ghsa-" in repo: + continue + if repo not in seen_repos: + eprint(f"Repository '{repo}' is not annotated in any local team YAMLs.") + eprint( + "These teams have access:", teams_with_access_to_repo(*repo.split("/")) + ) + exit_code = 1 + try: + if users := collaborators(*repo.split("/")): + repos_with_direct_access[repo] = users + except requests.HTTPError as exc: + eprint( + f"Could not check collaborators for {repo} (HTTPError: {exc}), skipping..." + ) + continue + if repos_with_direct_access: + eprint("Some users have direct access to repositories.") + eprint("Repository access must be granted through teams only!") + for repo, users in repos_with_direct_access.items(): + print(f"- {repo}:") + for user, level in sorted(users.items()): + print(f" - {user}: {level}") exit_code = 1 -if set(seen_teams) != set(teams_in_github): - teams_in_repo = sorted(seen_teams, key=str.lower) - teams_in_gh = sorted(teams_in_github, key=str.lower) - print("Teams in repo do not match Github teams:", file=sys.stderr) - print("Repo:", teams_in_repo, file=sys.stderr) - print("Github:", teams_in_gh, file=sys.stderr) - print( - "Diff:", - *unified_diff( - teams_in_repo, - teams_in_gh, - fromfile="Repo", - tofile="Github", - ), - sep="\n", - ) + return exit_code + + +def generate(): + team_to_fn = {} + for path in all_yamls(): + with open(path) as f: + team = yaml.load(f) + team_to_fn[team["name"]] = path + + for team in chain(teams_in_org("conda"), teams_in_org("conda-incubator")): + if team in team_to_fn: + continue + org, team_name = team.split("/") + details = team_details(org, team_name) + data = { + "name": team_name, + "description": details["description"], + "charter": None, + "requirements": None, + "resources": { + "teams": [team], + "repos": access_to_repos(org, team_name), + "other": None, + }, + "links": None, + "members": {member: None for member in team_members(org, team_name)}, + "emeritus": None, + } + Path("teams", org).mkdir(parents=True, exist_ok=True) + output_path = Path("teams", org, f"{team_name.replace('.', '-')}.yml") + output_path.write_text("# yaml-language-server: $schema=./teams.schema.json\n") + with open(output_path, "a") as f: + yaml.dump(data, f) - print("----", file=sys.stderr) - exit_code = 1 -sys.exit(exit_code) +if __name__ == "__main__": + if sys.argv[1:] and sys.argv[1] == "generate": + sys.exit(generate()) + sys.exit(check_teams()) diff --git a/scripts/schemas.py b/scripts/schemas.py index a13946c..01fe6e1 100644 --- a/scripts/schemas.py +++ b/scripts/schemas.py @@ -1,22 +1,67 @@ -from typing import Literal -from pydantic import BaseModel, HttpUrl, ConfigDict, Field - - -class Scopes(BaseModel): +# /// script +# dependencies = [ +# "pydantic>=2,<3", +# ] + +from typing import Annotated, Literal +from pydantic import ( + BaseModel, + ConfigDict, + Field, + EmailStr, + HttpUrl, +) + + +class Resources(BaseModel): """ Defines the responsibilities of a Conda sub-team. This structure is nested within the main CondaSubTeam model. """ model_config = ConfigDict(extra="forbid") - - codeowners: list[str] | None = ... - """The GitHub projects this team owns""" - + teams: ( + list[ + Annotated[ + str, Field(pattern=r"[a-zA-Z0-9\-_\.\+]{1,128}/[a-zA-Z0-9\-_]{1,128}") + ] + ] + | None + ) = ... + "The Github team (or teams, across different organizations) representing this team." + repos: ( + list[ + Annotated[ + str, + Field(pattern=r"[a-zA-Z0-9\-_\.\+]{1,128}/[a-zA-Z0-9\-_\.\+]{1,128}"), + ] + ] + | None + ) = ... + """The GitHub repositories this team owns or has write access to.""" other: list[HttpUrl] | None = ... """Other responsibilities of this team""" +class MemberDetails(BaseModel): + """ + Defines the contact details of a team member. + """ + + model_config = ConfigDict(extra="forbid") + + full_name: str | None = ... + """Full name of the member.""" + email: EmailStr | None = ... + """Email address of the member.""" + funder: str | None = ... + """Employer or sponsor for the time allocated to the project.""" + pronouns: str | None = ... + """Pronouns of the member.""" + decision: HttpUrl | list[HttpUrl] | None = ... + """URL pointing to the record of the membership decision""" + + class CondaSubTeam(BaseModel): """ Model for defining Conda Sub-Teams based on the governance structure. @@ -24,10 +69,10 @@ class CondaSubTeam(BaseModel): model_config = ConfigDict(title="Conda Sub-Teams", extra="forbid") - name: str = ... - """The team name in GitHub""" + name: str = Field(..., pattern=r"[a-zA-Z0-9\-_]{1,128}") + """The team name as per the governance (no organization name!).""" - description: str = ... + description: str = Field(..., min_length=1, max_length=128) """The team description in GitHub""" charter: Literal["dynamic", "static", "project"] = ... @@ -40,17 +85,23 @@ class CondaSubTeam(BaseModel): requirements: str | None = ... """Special requirements for team membership""" - scopes: Scopes = ... - """Team responsibilities""" + resources: Resources = ... + """Team responsibilities and owned resources""" links: list[HttpUrl] = ... """Important links, e.g. the issue/PR proposing the team creation""" - members: dict[str, HttpUrl | None] = Field(..., min_length=1) - """Maps username to a record of the decision adding them to the team""" + members: dict[str, MemberDetails | HttpUrl | None] = ... + """ + Maps username to its details or, in its simplified form, a URL pointing + to the record of the decision adding them to the team. + """ - emeritus: dict[str, HttpUrl | None] | None = Field(..., min_length=1) - """Maps username to a record of the decision removing them from the team""" + emeritus: dict[str, MemberDetails | list[HttpUrl] | HttpUrl | None] | None = ... + """ + Maps username to its details or, in its simplified form, a URL pointing + to the record of the decision removing them from the team. + """ if __name__ == "__main__": @@ -59,5 +110,5 @@ class CondaSubTeam(BaseModel): schema = CondaSubTeam.model_json_schema() (Path(__file__).parents[1] / "teams" / "teams.schema.json").write_text( - json.dumps(schema, indent=2) + json.dumps(schema, indent=2) + "\n" ) diff --git a/scripts/sort_team_yaml.py b/scripts/sort_team_yaml.py new file mode 100644 index 0000000..c02ffbe --- /dev/null +++ b/scripts/sort_team_yaml.py @@ -0,0 +1,46 @@ +# /// script +# dependencies = [ +# "requests", +# "ruamel.yaml", +# "pydantic>=2,<3", +# "email-validator", +# ] +# /// +import sys +from pathlib import Path + +from ruamel.yaml import YAML + +from schemas import CondaSubTeam + +TEAM_KEY_ORDER = list(CondaSubTeam.model_fields.keys()) + +yaml = YAML(typ="rt") +yaml.preserve_quotes = True +yaml.width = 10000 +yaml.indent(mapping=2, sequence=4, offset=2) + +for path in sys.argv[1:]: + path = Path(path) + with open(path) as f: + data = yaml.load(f) + + # NOTE: We use reversed pop + insert to preserve comments + + for key in reversed(TEAM_KEY_ORDER): + # .pop() removes the key/value but RETAINS the comment in 'ca' + val = data.pop(key, None) + data.insert(0, key, val) + + for key in "members", "emeritus": + if members := data.get(key): + for key in sorted(members.keys(), reverse=True, key=str.lower): + val = members.pop(key, None) + members.insert(0, key, val) + + for key in reversed(("teams", "repos", "other")): + val = data["resources"].pop(key, None) + data["resources"].insert(0, key, val) + + with open(path, "a") as f: + yaml.dump(data, f) diff --git a/steering.csv b/steering.csv index 2fe9a16..685b420 100644 --- a/steering.csv +++ b/steering.csv @@ -1,16 +1 @@ -github_username,email,name,funder,pronouns -xhochy,mail@uwekorn.com,Uwe Korn,QuantCo,he/him -cj-wright,cjwright4242@gmail.com,Christopher J. 'CJ' Wright,, -mariusvniekerk,marius.v.niekerk@gmail.com,Marius van Niekerk,, -chenghlee,clee@anaconda.com,Cheng H. Lee,Anaconda,he/him -ocefpaf,ocefpaf@gmail.com,Filipe Fernandes,no funding,he/him -marcelotrevisani,marceloduartetrevisani@gmail.com,Marcelo Duarte Trevisani,no funding,he/him -msarahan,msarahan@gmail.com,Michael Sarahan,NVIDIA,he/him -mbargull,marcel.bargull@udo.edu,Marcel Bargull,, -jakirkham,jakirkham@gmail.com,John Kirkham,NVIDIA,he/him -jezdez,jannis@leidel.info,Jannis Leidel,Anaconda,he/him -wolfv,w.vollprecht@gmail.com,Wolf Vollprecht,prefix.dev,he/him -jaimergp,jaime.rogue@gmail.com,Jaime Rodríguez-Guerra,Quansight,he/him -baszalmstra,zalmstra.bas@gmail.com,Bas Zalmstra,prefix.dev,he/him -Hind-M,hind.montassif@gmail.com,Hind Montassif,QuantStack,she/her -pavelzw,pavelzw@gmail.com,Pavel Zwerschke,QuantCo,he/him +Moved,to,teams/,directory diff --git a/teams/anaconda.yml b/teams/anaconda.yml new file mode 100644 index 0000000..5d25237 --- /dev/null +++ b/teams/anaconda.yml @@ -0,0 +1,29 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: anaconda +description: People working at Anaconda. +charter: dynamic +requirements: Members must be employed by Anaconda. +resources: + teams: + - conda/anaconda + repos: + - conda/conda-planning + other: +links: + - https://github.com/conda/governance/issues/222 +members: + chenghlee: https://github.com/conda/governance/issues/222 + danyeaw: https://github.com/conda/governance/issues/222 + dholth: https://github.com/conda/governance/issues/222 + ForgottenProgramme: https://github.com/conda/governance/issues/222 + george-lorch: https://github.com/conda/governance/issues/222 + jezdez: https://github.com/conda/governance/issues/222 + kenodegard: https://github.com/conda/governance/issues/222 + marcoesters: https://github.com/conda/governance/issues/222 + ryanskeith: https://github.com/conda/governance/issues/222 + schuylermartin45: https://github.com/conda/governance/issues/222 + travishathaway: https://github.com/conda/governance/issues/222 +emeritus: diff --git a/teams/bots.yml b/teams/bots.yml new file mode 100644 index 0000000..0974a01 --- /dev/null +++ b/teams/bots.yml @@ -0,0 +1,18 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: bots +description: Special team to permission bots and automations across repositories. +charter: +requirements: +resources: + teams: + - conda-incubator/bots + repos: + - conda-incubator/conda-lockfiles + other: +links: +members: + conda-bot: +emeritus: diff --git a/teams/builds-tools.yml b/teams/build-tools.yml similarity index 75% rename from teams/builds-tools.yml rename to teams/build-tools.yml index 47c34f9..1145572 100644 --- a/teams/builds-tools.yml +++ b/teams/build-tools.yml @@ -1,20 +1,28 @@ -# yaml-language-server: $schema=teams.schema.json -name: builds-tools +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: build-tools description: Team to work on conda-build and other build tools in the conda ecosystem charter: project requirements: -scopes: - codeowners: - - conda-incubator/conda-recipe-manager +resources: + teams: + - conda/build-tools + - conda-incubator/build-tools + repos: - conda/conda-build + - conda/conda-launchers + - conda/conda-recipe-manager + - conda/conda-recipe-manager-test-data other: - - https://matrix.to/#/#conda-build-tools:matrix.org # public + - https://conda.zulipchat.com/#narrow/channel/471111-build-tools links: - https://github.com/conda/conda-build/issues/4698 - https://github.com/conda/governance/issues/128 members: - beeankha: https://github.com/conda/conda-build/issues/4698 beckermr: + beeankha: https://github.com/conda/conda-build/issues/4698 chenghlee: https://github.com/conda/conda-build/issues/4698 dbast: https://github.com/conda/conda-build/issues/4698 dholth: https://github.com/conda/conda-build/issues/4698 @@ -28,9 +36,9 @@ members: mbargull: https://github.com/conda/conda-build/issues/4698 msarahan: https://github.com/conda/conda-build/issues/4698 ryanskeith: https://github.com/conda/conda-build/issues/4698 + schuylermartin45: https://github.com/conda/governance/issues/128 travishathaway: https://github.com/conda/conda-build/issues/4698 wolfv: https://github.com/conda/conda-build/issues/4698 - schuylermartin45: https://github.com/conda/governance/issues/128 emeritus: Callek: danpetry: https://anaconda.slack.com/archives/C05B9MPGR4Y/p1713452484809289 diff --git a/teams/ceps.yml b/teams/ceps.yml new file mode 100644 index 0000000..a10d2be --- /dev/null +++ b/teams/ceps.yml @@ -0,0 +1,21 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: ceps +description: Editorial team for CEPs +charter: +requirements: +resources: + teams: + - conda/ceps + - conda-incubator/ceps + repos: + - conda/ceps + other: +links: +members: + beeankha: + jezdez: + kenodegard: +emeritus: diff --git a/teams/cla-reviewers.yml b/teams/cla-reviewers.yml index aadc271..eddb438 100644 --- a/teams/cla-reviewers.yml +++ b/teams/cla-reviewers.yml @@ -1,10 +1,15 @@ -# yaml-language-server: $schema=teams.schema.json +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json name: cla-reviewers description: The team reviewing incoming CLA documents charter: static -requirements: All team members must only consists of steering council members for compliance reasons. -scopes: - codeowners: +requirements: All team members must only consist of steering council members for compliance reasons. +resources: + teams: + - conda/cla-reviewers + repos: - conda/cla other: links: diff --git a/teams/coc-committee.yml b/teams/coc-committee.yml index e009e15..9cfe45d 100644 --- a/teams/coc-committee.yml +++ b/teams/coc-committee.yml @@ -1,18 +1,25 @@ -# yaml-language-server: $schema=teams.schema.json +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json name: coc-committee description: The Code of Conduct Committee charter: dynamic requirements: -scopes: - codeowners: +resources: + teams: + - conda/coc-committee + - conda-incubator/code-of-conduct + repos: other: - https://github.com/conda-conduct - - https://matrix.to/#/!jLRCFFbpabFtdYvfeO:matrix.org # private + - https://conda.zulipchat.com/#narrow/channel/469892-code-of-conduct # private links: - https://github.com/conda/governance/issues/46 - https://github.com/conda/governance/pull/49 - https://github.com/conda/governance/pull/121 - https://github.com/conda/governance/pull/158 + - https://github.com/conda/infrastructure/issues/974 members: beeankha: https://github.com/conda/governance/pull/49 csoja: https://github.com/conda/governance/issues/46 diff --git a/teams/communications.yml b/teams/communications.yml index f064629..ce7eaae 100644 --- a/teams/communications.yml +++ b/teams/communications.yml @@ -1,18 +1,23 @@ -# yaml-language-server: $schema=teams.schema.json +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json name: communications description: Handles communications across the organization charter: dynamic requirements: -scopes: - codeowners: +resources: + teams: + - conda/communications + repos: - conda/communications other: - https://conda.discourse.group/ - https://www.linkedin.com/company/condacommunity - https://fosstodon.org/@conda - - https://matrix.to/#/#conda-communications:matrix.org # public + - https://conda.zulipchat.com/#narrow/channel/471276-communications - https://x.com/condaproject - - https://bsky.app/profile/condaproject.bsky.social + - https://bsky.app/profile/conda.org links: - https://github.com/conda/governance/issues/53 members: diff --git a/teams/community-contributors.yml b/teams/community-contributors.yml new file mode 100644 index 0000000..a7b8afc --- /dev/null +++ b/teams/community-contributors.yml @@ -0,0 +1,21 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: community-contributors +description: +charter: +requirements: +resources: + teams: + - conda/community-contributors + repos: + - conda/conda-build + - conda/conda-docs + - conda/conda-pack + other: +links: +members: + marcelotrevisani: + mbargull: +emeritus: diff --git a/teams/conda-checkpoints.yml b/teams/conda-checkpoints.yml new file mode 100644 index 0000000..6fe9b3e --- /dev/null +++ b/teams/conda-checkpoints.yml @@ -0,0 +1,19 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-checkpoints +description: Maintainers of `conda-checkpoints` +charter: dynamic +requirements: +resources: + teams: + - conda-incubator/conda-checkpoints + repos: + - conda-incubator/conda-checkpoints + other: +links: + - https://github.com/conda/governance/issues/144 +members: + jaimergp: +emeritus: diff --git a/teams/conda-colab.yml b/teams/conda-colab.yml new file mode 100644 index 0000000..21773c2 --- /dev/null +++ b/teams/conda-colab.yml @@ -0,0 +1,19 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-colab +description: Maintainers of `condacolab` +charter: +requirements: +resources: + teams: + - conda-incubator/conda-colab + repos: + - conda-incubator/condacolab + other: +links: +members: + jaimergp: + ssurbhi560: +emeritus: diff --git a/teams/conda-completions.yml b/teams/conda-completions.yml new file mode 100644 index 0000000..105f708 --- /dev/null +++ b/teams/conda-completions.yml @@ -0,0 +1,19 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-completions +description: Maintainers of conda shell completions +charter: +requirements: +resources: + teams: + - conda-incubator/conda-completions + repos: + - conda-incubator/conda-zsh-completion + other: +links: +members: + esc: + jezdez: +emeritus: diff --git a/teams/conda-core.yml b/teams/conda-core.yml new file mode 100644 index 0000000..490516e --- /dev/null +++ b/teams/conda-core.yml @@ -0,0 +1,42 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-core +description: +charter: +requirements: +resources: + teams: + - conda/conda-core + repos: + - conda/menuinst + - conda/pycosat + - conda/conda-build + - conda/conda-docs + - conda/constructor + - conda/conda_build_test_recipe + - conda/conda-verify + - conda/cookiecutter-conda-python + - conda/conda-pack + - conda/conda-benchmarks + - conda/conda-prefix-replacement + - conda/conda-content-trust + - conda/schemas + - conda/infrastructure + - conda/actions + - conda/conda-plugin-template + - conda/.github + other: +links: +members: + beeankha: + chenghlee: + dholth: + ForgottenProgramme: + jezdez: + kenodegard: + marcoesters: + pseudoyim: + travishathaway: +emeritus: diff --git a/teams/conda-dot-org.yml b/teams/conda-dot-org.yml new file mode 100644 index 0000000..ba36a81 --- /dev/null +++ b/teams/conda-dot-org.yml @@ -0,0 +1,25 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-dot-org +description: Team responsible for the conda.org website maintenance +charter: dynamic +requirements: +resources: + teams: + - conda/conda-dot-org + - conda-incubator/conda-dot-org + repos: + - conda/conda-dot-org + other: +links: + - https://github.com/conda/governance/issues/76 + - https://github.com/conda/conda-dot-org/issues/110 +members: + beeankha: https://github.com/conda/conda-dot-org/issues/110 + jaimergp: https://github.com/conda/conda-dot-org/issues/110 + jezdez: https://github.com/conda/conda-dot-org/issues/110 + kathatherine: https://github.com/conda/conda-dot-org/issues/110 + travishathaway: https://github.com/conda/conda-dot-org/issues/110 +emeritus: diff --git a/teams/conda-env-builder.yml b/teams/conda-env-builder.yml new file mode 100644 index 0000000..e45748c --- /dev/null +++ b/teams/conda-env-builder.yml @@ -0,0 +1,19 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-env-builder +description: Maintainers of `conda-env-builder` +charter: +requirements: +resources: + teams: + - conda-incubator/conda-env-builder + repos: + - conda-incubator/conda-env-builder + other: +links: +members: + jezdez: + nh13: +emeritus: diff --git a/teams/conda-index.yml b/teams/conda-index.yml new file mode 100644 index 0000000..bbad2ed --- /dev/null +++ b/teams/conda-index.yml @@ -0,0 +1,23 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-index +description: Maintainers of conda-index +charter: project +requirements: +resources: + teams: + - conda/conda-index + repos: + - conda/conda-index + other: +links: + - https://github.com/conda/conda-build/issues/4472 + - https://github.com/conda/conda-index/issues/59 +members: + chenghlee: https://github.com/conda/conda-build/issues/4472 + dholth: https://github.com/conda/conda-build/issues/4472 + jezdez: https://github.com/conda/conda-build/issues/4472 + jjhelmus: +emeritus: diff --git a/teams/conda-libmamba-solver.yml b/teams/conda-libmamba-solver.yml new file mode 100644 index 0000000..453daeb --- /dev/null +++ b/teams/conda-libmamba-solver.yml @@ -0,0 +1,22 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-libmamba-solver +description: Maintainers of `conda-libmamba-solver` +charter: +requirements: +resources: + teams: + - conda-incubator/conda-libmamba-solver + repos: [] + other: +links: + - https://github.com/conda/conda/issues/15166 +members: + conda-bot: + jaimergp: + jezdez: + jjhelmus: + wolfv: +emeritus: diff --git a/teams/conda-lock.yml b/teams/conda-lock.yml new file mode 100644 index 0000000..b8af8fd --- /dev/null +++ b/teams/conda-lock.yml @@ -0,0 +1,24 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-lock +description: Maintainers of conda-lock +charter: project +requirements: +resources: + teams: + - conda/conda-lock + repos: + - conda/conda-lock + other: +links: + - https://github.com/conda/conda-lock/issues/319 +members: + ericdill: + jezdez: + marcelotrevisani: + maresb: + mariusvniekerk: + ocefpaf: +emeritus: diff --git a/teams/conda-lockfiles.yml b/teams/conda-lockfiles.yml new file mode 100644 index 0000000..b3932c1 --- /dev/null +++ b/teams/conda-lockfiles.yml @@ -0,0 +1,23 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-lockfiles +description: Maintainers of `conda-lockfiles` +charter: +requirements: +resources: + teams: + - conda-incubator/conda-lockfiles + repos: + - conda-incubator/conda-lockfiles + other: +links: +members: + jaimergp: + jezdez: + jjhelmus: + kenodegard: + soapy1: + travishathaway: +emeritus: diff --git a/teams/conda-maintainers-project-management.yml b/teams/conda-maintainers-project-management.yml new file mode 100644 index 0000000..7efb2ba --- /dev/null +++ b/teams/conda-maintainers-project-management.yml @@ -0,0 +1,21 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-maintainers-project-management +description: Support team for @conda/conda-maintainers, with triage permissions only +charter: dynamic +requirements: +resources: + teams: + - conda/conda-maintainers-project-management + repos: [] + other: +links: +members: + george-lorch: + jaimergp: + jezdez: + lwinfree: + trallard: +emeritus: diff --git a/teams/conda-maintainers.yml b/teams/conda-maintainers.yml new file mode 100644 index 0000000..1c36876 --- /dev/null +++ b/teams/conda-maintainers.yml @@ -0,0 +1,34 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-maintainers +description: Maintainers of `conda` and related core plugins +charter: project +requirements: +resources: + teams: + - conda/conda-maintainers + repos: + - conda/conda + - conda/conda-libmamba-solver + - conda/conda-classic-solver + other: +links: + - https://github.com/conda/conda/issues/13526 +members: + beeankha: https://github.com/conda/conda/issues/13526 + chenghlee: https://github.com/conda/conda/issues/13526 + danyeaw: https://github.com/conda/governance/issues/265 + dholth: https://github.com/conda/conda/issues/13526 + ForgottenProgramme: https://github.com/conda/conda/issues/13526 + george-lorch: https://github.com/conda/governance/issues/216 + jaimergp: https://github.com/conda/conda/issues/13526 + jezdez: https://github.com/conda/conda/issues/13526 + jjhelmus: https://github.com/conda/governance/issues/219 + kenodegard: https://github.com/conda/conda/issues/13526 + mbargull: https://github.com/conda/conda/issues/13526 + ryanskeith: + soapy1: https://github.com/conda/governance/issues/258 + travishathaway: https://github.com/conda/conda/issues/13526 +emeritus: diff --git a/teams/conda-meta-mcp.yml b/teams/conda-meta-mcp.yml new file mode 100644 index 0000000..91bc1c7 --- /dev/null +++ b/teams/conda-meta-mcp.yml @@ -0,0 +1,20 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-meta-mcp +description: Maintainers of `conda-meta-mcp` +charter: dynamic +requirements: +resources: + teams: + - conda-incubator/conda-meta-mcp + repos: + - conda-incubator/conda-meta-mcp + other: +links: + - https://github.com/conda/governance/issues/277 +members: + dbast: https://github.com/conda/governance/issues/277 + jezdez: https://github.com/conda/governance/issues/277 +emeritus: diff --git a/teams/conda-mirror.yml b/teams/conda-mirror.yml new file mode 100644 index 0000000..afa2ead --- /dev/null +++ b/teams/conda-mirror.yml @@ -0,0 +1,24 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-mirror +description: Maintainers of `conda-mirror` +charter: +requirements: +resources: + teams: + - conda-incubator/conda-mirror + repos: + - conda-incubator/conda-mirror + other: +links: +members: + delsner: + ericdill: + goanpeca: + mariusvniekerk: + pavelzw: + scopatz: + xhochy: +emeritus: diff --git a/teams/conda-oci.yml b/teams/conda-oci.yml new file mode 100644 index 0000000..eabce05 --- /dev/null +++ b/teams/conda-oci.yml @@ -0,0 +1,19 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-oci +description: Maintainers of `conda-oci` +charter: +requirements: +resources: + teams: + - conda-incubator/conda-oci + repos: + - conda-incubator/conda-oci + other: +links: +members: + beckermr: + jezdez: +emeritus: diff --git a/teams/conda-plugins.yml b/teams/conda-plugins.yml new file mode 100644 index 0000000..3633679 --- /dev/null +++ b/teams/conda-plugins.yml @@ -0,0 +1,21 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-plugins +description: Maintainers of `conda-plugins` +charter: +requirements: +resources: + teams: + - conda-incubator/conda-plugins + repos: + - conda-incubator/conda-plugins + other: +links: +members: + beeankha: + jezdez: + kenodegard: + travishathaway: +emeritus: diff --git a/teams/conda-project.yml b/teams/conda-project.yml new file mode 100644 index 0000000..e404b74 --- /dev/null +++ b/teams/conda-project.yml @@ -0,0 +1,23 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-project +description: Maintainers of `conda-project` +charter: +requirements: +resources: + teams: + - conda-incubator/conda-project + repos: + - conda-incubator/conda-project + other: +links: +members: + AlbertDeFusco: + jbednar: + jezdez: + jkong-anaconda: + jlstevens: + mattkram: +emeritus: diff --git a/teams/conda-protect.yml b/teams/conda-protect.yml new file mode 100644 index 0000000..9c74b41 --- /dev/null +++ b/teams/conda-protect.yml @@ -0,0 +1,20 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-protect +description: Maintainers of `conda-protect` +charter: dynamic +requirements: +resources: + teams: + - conda-incubator/conda-protect + repos: + - conda-incubator/conda-protect + other: +links: + - https://github.com/conda/governance/issues/138 +members: + jezdez: https://github.com/conda/governance/issues/138 + travishathaway: https://github.com/conda/governance/issues/138 +emeritus: diff --git a/teams/conda-pypi.yml b/teams/conda-pypi.yml new file mode 100644 index 0000000..66ab472 --- /dev/null +++ b/teams/conda-pypi.yml @@ -0,0 +1,27 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-pypi +description: Maintainers of `conda-pypi` +charter: dynamic +requirements: +resources: + teams: + - conda-incubator/conda-pypi + repos: + - conda-incubator/conda-pypi + other: +links: + - https://github.com/conda/governance/issues/142 +members: + danyeaw: https://github.com/conda-incubator/conda-pypi/issues/52 + ForgottenProgramme: https://github.com/conda-incubator/conda-pypi/issues/161 + jaimergp: https://github.com/conda/governance/issues/142 + jezdez: https://github.com/conda/governance/issues/142 + jjhelmus: https://github.com/conda-incubator/conda-pypi/issues/46 + kenodegard: + ryanskeith: https://github.com/conda-incubator/conda-pypi/issues/75 + soapy1: https://github.com/conda-incubator/conda-pypi/issues/167 + travishathaway: https://github.com/conda-incubator/conda-pypi/issues/51 +emeritus: diff --git a/teams/conda-rattler-solver.yml b/teams/conda-rattler-solver.yml new file mode 100644 index 0000000..c6a8950 --- /dev/null +++ b/teams/conda-rattler-solver.yml @@ -0,0 +1,20 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-rattler-solver +description: Maintainers of `conda-rattler-solver` +charter: dynamic +requirements: +resources: + teams: + - conda-incubator/conda-rattler-solver + repos: + - conda-incubator/conda-rattler-solver + other: +links: + - https://github.com/conda/governance/issues/246 +members: + jaimergp: https://github.com/conda/governance/issues/246 + jezdez: https://github.com/conda-incubator/conda-rattler-solver/issues/18 +emeritus: diff --git a/teams/conda-rich.yml b/teams/conda-rich.yml new file mode 100644 index 0000000..3929da5 --- /dev/null +++ b/teams/conda-rich.yml @@ -0,0 +1,20 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-rich +description: Maintainers of `conda-rich` +charter: dynamic +requirements: +resources: + teams: + - conda-incubator/conda-rich + repos: + - conda-incubator/conda-rich + other: +links: + - https://github.com/conda/governance/issues/191 +members: + jezdez: https://github.com/conda/governance/issues/191 + travishathaway: https://github.com/conda/governance/issues/191 +emeritus: diff --git a/teams/conda-self.yml b/teams/conda-self.yml new file mode 100644 index 0000000..f280492 --- /dev/null +++ b/teams/conda-self.yml @@ -0,0 +1,23 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-self +description: Maintainers of `conda-self` +charter: dynamic +requirements: +resources: + teams: + - conda-incubator/conda-self + repos: + - conda-incubator/conda-self + other: +links: + - https://github.com/conda/governance/issues/264 +members: + danyeaw: https://github.com/conda-incubator/conda-self/issues/39 + ForgottenProgramme: + jaimergp: https://github.com/conda/governance/issues/264 + jezdez: + soapy1: +emeritus: diff --git a/teams/conda-sh.yml b/teams/conda-sh.yml new file mode 100644 index 0000000..dfc2967 --- /dev/null +++ b/teams/conda-sh.yml @@ -0,0 +1,20 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-sh +description: Maintainers of the conda.sh website +charter: +requirements: +resources: + teams: + - conda-incubator/conda-sh + repos: + - conda-incubator/conda.sh + other: +links: +members: + Carreau: + jaimergp: + jezdez: +emeritus: diff --git a/teams/conda-spawn.yml b/teams/conda-spawn.yml new file mode 100644 index 0000000..ea4d688 --- /dev/null +++ b/teams/conda-spawn.yml @@ -0,0 +1,19 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-spawn +description: Maintainers of `conda-spawn` +charter: dynamic +requirements: +resources: + teams: + - conda-incubator/conda-spawn + repos: + - conda-incubator/conda-spawn + other: +links: + - https://github.com/conda/governance/issues/202 +members: + jaimergp: https://github.com/conda/governance/issues/202 +emeritus: diff --git a/teams/conda-store.yml b/teams/conda-store.yml new file mode 100644 index 0000000..0e5147e --- /dev/null +++ b/teams/conda-store.yml @@ -0,0 +1,37 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-store +description: Maintainers of `conda-store` and related projects +charter: dynamic +requirements: +resources: + teams: + - conda-incubator/conda-store + repos: + - conda-incubator/conda-store + - conda-incubator/conda-store-ui + - conda-incubator/jupyterlab-conda-store + other: +links: + - https://github.com/conda/governance/issues/106 +members: + dharhas: https://github.com/conda/governance/issues/106 + gabalafou: https://github.com/conda/governance/issues/106 + jaimergp: https://github.com/conda/governance/issues/106 + kcpevey: https://github.com/conda/governance/issues/106 + pavithraes: https://github.com/conda/governance/issues/106 + peytondmurray: + smeragoel: https://github.com/conda/governance/issues/106 + soapy1: + trallard: https://github.com/conda/governance/issues/106 + viniciusdc: https://github.com/conda-incubator/conda-store/issues/1115 +emeritus: + aktech: + anirrudh: + asmeurer: + costrouc: + iameskild: + pierrotsmnrd: + steff456: diff --git a/teams/conda-subchannel.yml b/teams/conda-subchannel.yml new file mode 100644 index 0000000..b0b5d85 --- /dev/null +++ b/teams/conda-subchannel.yml @@ -0,0 +1,20 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-subchannel +description: Maintainers of `conda-subchannel` +charter: dynamic +requirements: +resources: + teams: + - conda-incubator/conda-subchannel + repos: + - conda-incubator/conda-subchannel + other: +links: + - https://github.com/conda/governance/issues/143 +members: + jaimergp: https://github.com/conda/governance/issues/143 + jezdez: https://github.com/conda/governance/issues/143 +emeritus: diff --git a/teams/conda-tree.yml b/teams/conda-tree.yml new file mode 100644 index 0000000..b8622b7 --- /dev/null +++ b/teams/conda-tree.yml @@ -0,0 +1,19 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-tree +description: Maintainers of `conda-tree` +charter: project +requirements: +resources: + teams: + - conda-incubator/conda-tree + repos: + - conda-incubator/conda-tree + other: +links: + - https://github.com/conda-incubator/conda-tree/issues/20 +members: + rvalieris: https://github.com/conda-incubator/conda-tree/issues/20 +emeritus: diff --git a/teams/conda-tui.yml b/teams/conda-tui.yml new file mode 100644 index 0000000..4f45215 --- /dev/null +++ b/teams/conda-tui.yml @@ -0,0 +1,20 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-tui +description: Maintainers of `conda-tui` +charter: dynamic +requirements: +resources: + teams: + - conda-incubator/conda-tui + repos: + - conda-incubator/conda-tui + other: +links: + - https://github.com/conda/governance/issues/108 +members: + chenghlee: https://github.com/conda/governance/issues/108 + mattkram: https://github.com/conda/governance/issues/108 +emeritus: diff --git a/teams/conda-tutorial.yml b/teams/conda-tutorial.yml new file mode 100644 index 0000000..1add005 --- /dev/null +++ b/teams/conda-tutorial.yml @@ -0,0 +1,21 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: conda-tutorial +description: Maintainers of the `conda-tutorial` repository +charter: +requirements: +resources: + teams: + - conda-incubator/conda-tutorial + repos: + - conda-incubator/conda-tutorial + other: +links: +members: + beeankha: + jezdez: + leriomaggio: + tnabtaf: +emeritus: diff --git a/teams/condastats.yml b/teams/condastats.yml new file mode 100644 index 0000000..d56ba42 --- /dev/null +++ b/teams/condastats.yml @@ -0,0 +1,19 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: condastats +description: Maintainers of `condastats` +charter: +requirements: +resources: + teams: + - conda-incubator/condastats + repos: + - conda-incubator/condastats + other: +links: +members: + jezdez: + sophiamyang: +emeritus: diff --git a/teams/constructor.yml b/teams/constructor.yml index 5e2f11c..04d275b 100644 --- a/teams/constructor.yml +++ b/teams/constructor.yml @@ -1,10 +1,16 @@ -# yaml-language-server: $schema=teams.schema.json +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json name: constructor description: The team maintaining constructor and related projects charter: project requirements: -scopes: - codeowners: +resources: + teams: + - conda/constructor + - conda-incubator/constructor + repos: - conda/conda-pack - conda/constructor - conda/menuinst @@ -23,7 +29,7 @@ members: jaimergp: https://github.com/conda/governance/issues/53 jezdez: https://github.com/conda/governance/issues/53 larsoner: https://github.com/conda/governance/issues/53 - marcoesters: # missing record of decision? + marcoesters: https://github.com/conda/constructor/issues/790 mcg1969: https://github.com/conda/governance/issues/53 # missing from team? pseudoyim: https://github.com/conda/governance/issues/53 travishathaway: # missing record of decision? diff --git a/teams/content.yml b/teams/content.yml new file mode 100644 index 0000000..4414d30 --- /dev/null +++ b/teams/content.yml @@ -0,0 +1,23 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: content +description: +charter: +requirements: +resources: + teams: + - conda-incubator/content + repos: [] + other: +links: +members: + ang852: + beeankha: + goanpeca: + jaimergp: + kathatherine: + tnabtaf: + travishathaway: +emeritus: diff --git a/teams/design.yml b/teams/design.yml new file mode 100644 index 0000000..158c905 --- /dev/null +++ b/teams/design.yml @@ -0,0 +1,24 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: design +description: +charter: +requirements: +resources: + teams: + - conda-incubator/design + repos: [] + other: +links: +members: + ang852: + eakbulut: + jaimergp: + jezdez: + kathatherine: + kenodegard: + tnabtaf: + travishathaway: +emeritus: diff --git a/teams/distribution-contractors.yml b/teams/distribution-contractors.yml new file mode 100644 index 0000000..c0352c5 --- /dev/null +++ b/teams/distribution-contractors.yml @@ -0,0 +1,19 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: distribution-contractors +description: +charter: +requirements: +resources: + teams: + - conda/distribution-contractors + repos: [] + other: +links: +members: + M-Waszkiewicz-Anaconda: + skupr-anaconda: + yshmatov-anaconda: +emeritus: diff --git a/teams/docs.yml b/teams/docs.yml index c400fe0..09b54d9 100644 --- a/teams/docs.yml +++ b/teams/docs.yml @@ -1,16 +1,23 @@ -# yaml-language-server: $schema=teams.schema.json +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json name: docs description: The team working on all-things docs charter: project requirements: -scopes: - codeowners: +resources: + teams: + - conda/docs + - conda-incubator/docs + repos: - conda/conda - conda/conda-build - conda/conda-docs - conda/constructor - conda/infrastructure - conda/menuinst + - conda-incubator/conda-sphinx-theme other: links: - https://github.com/conda/conda-docs/issues/780 diff --git a/teams/fetch.yml b/teams/fetch.yml new file mode 100644 index 0000000..fefb2d4 --- /dev/null +++ b/teams/fetch.yml @@ -0,0 +1,21 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: fetch +description: +charter: +requirements: +resources: + teams: + - conda-incubator/fetch + repos: + - conda-incubator/conda-auth + other: +links: +members: + dholth: + jezdez: + kenodegard: + travishathaway: +emeritus: diff --git a/teams/grayskull.yml b/teams/grayskull.yml new file mode 100644 index 0000000..865f490 --- /dev/null +++ b/teams/grayskull.yml @@ -0,0 +1,22 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: grayskull +description: Maintainers of `grayskull` +charter: project +requirements: +resources: + teams: + - conda/grayskull + repos: + - conda/grayskull + other: +links: + - https://github.com/conda/grayskull/issues/436 +members: + ForgottenProgramme: + jezdez: + marcelotrevisani: + ocefpaf: +emeritus: diff --git a/teams/hatch-conda-build.yml b/teams/hatch-conda-build.yml new file mode 100644 index 0000000..bea6b7f --- /dev/null +++ b/teams/hatch-conda-build.yml @@ -0,0 +1,20 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: hatch-conda-build +description: Maintainers of the `hatch-conda-build` plugin +charter: +requirements: +resources: + teams: + - conda-incubator/hatch-conda-build + repos: + - conda-incubator/hatch-conda-build + other: +links: +members: + AlbertDeFusco: + costrouc: + jezdez: +emeritus: diff --git a/teams/implementation.yml b/teams/implementation.yml new file mode 100644 index 0000000..b0696e1 --- /dev/null +++ b/teams/implementation.yml @@ -0,0 +1,25 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: implementation +description: +charter: +requirements: +resources: + teams: + - conda-incubator/implementation + repos: [] + other: +links: +members: + barabo: + beeankha: + goanpeca: + jaimergp: + JeremiahSifuentes: + jezdez: + kenodegard: + tnabtaf: + travishathaway: +emeritus: diff --git a/teams/infrastructure.yml b/teams/infrastructure.yml index 489c710..f97fd37 100644 --- a/teams/infrastructure.yml +++ b/teams/infrastructure.yml @@ -1,17 +1,24 @@ -# yaml-language-server: $schema=teams.schema.json +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json name: infrastructure description: The team working on conda community infrastructure charter: static requirements: Any steering council member may join without approval -scopes: - codeowners: +resources: + teams: + - conda/infrastructure + - conda-incubator/infrastructure + repos: - conda/.github - conda/actions - conda/infrastructure - conda/issue-tracker other: - https://github.com/conda-bot - - https://matrix.to/#/!tpEQSUGYWHNdgpDFNc:matrix.org # private + - https://conda.zulipchat.com/#narrow/channel/487124-infrastructure + - https://conda.zulipchat.com/#narrow/channel/471360-infrastructure-private # private links: - https://github.com/conda/governance/issues/84 members: diff --git a/teams/installer.yml b/teams/installer.yml new file mode 100644 index 0000000..aadc18f --- /dev/null +++ b/teams/installer.yml @@ -0,0 +1,27 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: installer +description: Maintainers of the `installer` Github Action +charter: +requirements: +resources: + teams: + - conda-incubator/installer + repos: + - conda-incubator/installer + other: +links: +members: + chenghlee: + dbast: + isuruf: + jaimergp: + jezdez: + jlstevens: + marcoesters: + pseudoyim: + psteyer: + xhochy: +emeritus: diff --git a/teams/nvidia-virtual-packages.yml b/teams/nvidia-virtual-packages.yml new file mode 100644 index 0000000..fc7ca4f --- /dev/null +++ b/teams/nvidia-virtual-packages.yml @@ -0,0 +1,20 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: nvidia-virtual-packages +description: Maintainers of virtual packages related to Nvidia +charter: dynamic +requirements: +resources: + teams: + - conda-incubator/nvidia-virtual-packages + repos: + - conda-incubator/nvidia-virtual-packages + other: +links: + - https://github.com/conda/governance/issues/308 +members: + carterbox: https://github.com/conda/governance/issues/308 + chenghlee: https://github.com/conda/governance/issues/308 +emeritus: diff --git a/teams/packaging-tools.yml b/teams/packaging-tools.yml new file mode 100644 index 0000000..c58ea84 --- /dev/null +++ b/teams/packaging-tools.yml @@ -0,0 +1,26 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: packaging-tools +description: Maintainers of conda-package-handling and related projects +charter: project +requirements: +resources: + teams: + - conda/packaging-tools + repos: + - conda/conda-package-handling + - conda/conda-package-streaming + other: +links: + - https://github.com/conda/infrastructure/issues/1007 +members: + chenghlee: https://github.com/conda/infrastructure/issues/1007 + dholth: https://github.com/conda/infrastructure/issues/1007 + jezdez: https://github.com/conda/infrastructure/issues/1007 + kenodegard: https://github.com/conda/infrastructure/issues/1007 + marcelotrevisani: https://github.com/conda/infrastructure/issues/1007 + marcoesters: https://github.com/conda/infrastructure/issues/1007 + travishathaway: https://github.com/conda/infrastructure/issues/1007 +emeritus: diff --git a/teams/pre-commit.yml b/teams/pre-commit.yml new file mode 100644 index 0000000..544af45 --- /dev/null +++ b/teams/pre-commit.yml @@ -0,0 +1,51 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: pre-commit +description: Maintainers of conda-based pre-commit hooks +charter: dynamic +requirements: +resources: + teams: + - conda-incubator/pre-commit + repos: + - conda-incubator/pre-commit-mirrors-black + - conda-incubator/pre-commit-mirrors-flake8 + - conda-incubator/pre-commit-mirrors-mypy + - conda-incubator/pre-commit-mirrors-isort + - conda-incubator/pre-commit-mirrors-pyupgrade + - conda-incubator/pre-commit-mirrors-jupytext + - conda-incubator/pre-commit-mirrors-nbstripout + - conda-incubator/pre-commit-mirrors-shellcheck + - conda-incubator/pre-commit-mirrors-prettier + - conda-incubator/pre-commit-mirrors-eslint + - conda-incubator/pre-commit-mirrors-bandit + - conda-incubator/pre-commit-mirrors-sqlfluff + - conda-incubator/pre-commit-mirrors-docformatter + - conda-incubator/pre-commit-mirrors-pre-commit-hooks + - conda-incubator/pre-commit-mirrors-ruff + - conda-incubator/pre-commit-mirrors-pyright + - conda-incubator/pre-commit-mirrors-typos + - conda-incubator/pre-commit-mirrors-cython-lint + - conda-incubator/pre-commit-mirrors-ansible-lint + - conda-incubator/pre-commit-mirrors-hclfmt + - conda-incubator/pre-commit-mirrors-rust + - conda-incubator/pre-commit-mirrors-tflint + - conda-incubator/pre-commit-mirrors-clang-format + - conda-incubator/pre-commit-mirrors-clang-tidy + - conda-incubator/pre-commit-mirrors-checkov + - conda-incubator/pre-commit-mirrors-insert-license + - conda-incubator/pre-commit-mirrors-polars-upgrade + - conda-incubator/copier-template-pre-commit-mirrors + - conda-incubator/pre-commit-mirrors-yamllint + - conda-incubator/pre-commit-mirrors-typstfmt + - conda-incubator/pre-commit-mirrors-taplo + other: +links: + - https://github.com/conda/governance/issues/255 +members: + pavelzw: + xhochy: + ytausch: +emeritus: diff --git a/teams/prefix-dev.yml b/teams/prefix-dev.yml new file mode 100644 index 0000000..8c0ee9d --- /dev/null +++ b/teams/prefix-dev.yml @@ -0,0 +1,23 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: prefix-dev +description: Contributors working for Prefix.dev +charter: dynamic +requirements: Being employed by Prefix.dev +resources: + teams: + - conda/prefix-dev + repos: [] + other: +links: + - https://github.com/conda/governance/issues/226 +members: + baszalmstra: https://github.com/conda/governance/issues/225 + Hofer-Julian: https://github.com/conda/governance/issues/225 + nichmor: https://github.com/conda/governance/issues/225 + ruben-arts: https://github.com/conda/governance/issues/225 + tdejager: https://github.com/conda/governance/issues/225 + wolfv: https://github.com/conda/governance/issues/225 +emeritus: diff --git a/teams/quansight.yml b/teams/quansight.yml new file mode 100644 index 0000000..7419668 --- /dev/null +++ b/teams/quansight.yml @@ -0,0 +1,24 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: quansight +description: Contributors working for Quansight +charter: dynamic +requirements: +resources: + teams: + - conda/quansight + repos: + - conda/menuinst + - conda/constructor + - conda/conda-planning + other: +links: + - https://github.com/conda/governance/issues/225 +members: + jaimergp: https://github.com/conda/governance/issues/225 + peytondmurray: https://github.com/conda/governance/issues/225 + soapy1: https://github.com/conda/governance/issues/225 + trallard: https://github.com/conda/governance/issues/225 +emeritus: diff --git a/teams/rattler.yml b/teams/rattler.yml new file mode 100644 index 0000000..15f422e --- /dev/null +++ b/teams/rattler.yml @@ -0,0 +1,25 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: rattler +description: Maintainers of `rattler` +charter: dynamic +requirements: +resources: + teams: + - conda/rattler + - conda-incubator/rattler + repos: + - conda/rattler + other: +links: + - https://github.com/conda/governance/issues/145 + - https://github.com/conda/rattler/issues/799 +members: + baszalmstra: https://github.com/conda/governance/issues/145 + Hofer-Julian: + nichmor: https://github.com/conda/governance/issues/145 + ruben-arts: https://github.com/conda/governance/issues/145 + wolfv: https://github.com/conda/governance/issues/145 +emeritus: diff --git a/teams/relock-conda.yml b/teams/relock-conda.yml new file mode 100644 index 0000000..4901085 --- /dev/null +++ b/teams/relock-conda.yml @@ -0,0 +1,18 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: relock-conda +description: Maintainers of `relock-conda` +charter: +requirements: +resources: + teams: + - conda-incubator/relock-conda + repos: + - conda-incubator/relock-conda + other: +links: +members: + beckermr: +emeritus: diff --git a/teams/setup-miniconda.yml b/teams/setup-miniconda.yml new file mode 100644 index 0000000..c7ff9ea --- /dev/null +++ b/teams/setup-miniconda.yml @@ -0,0 +1,24 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: setup-miniconda +description: Maintainers of the setup-miniconda action +charter: +requirements: +resources: + teams: + - conda-incubator/setup-miniconda + repos: + - conda-incubator/setup-miniconda + - conda-incubator/setup-miniforge + other: +links: +members: + bollwyvl: + conda-bot: + dbast: + goanpeca: + jaimergp: + jezdez: +emeritus: diff --git a/teams/shells.yml b/teams/shells.yml new file mode 100644 index 0000000..c9ed66e --- /dev/null +++ b/teams/shells.yml @@ -0,0 +1,20 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: shells +description: Maintainers of conda-shell and other shell-related projects +charter: +requirements: +resources: + teams: + - conda-incubator/shells + repos: + - conda-incubator/conda-shell + other: +links: +members: + jezdez: + kalawac: + kenodegard: +emeritus: diff --git a/teams/steering-council.yml b/teams/steering-council.yml new file mode 100644 index 0000000..5a21b2a --- /dev/null +++ b/teams/steering-council.yml @@ -0,0 +1,137 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: steering-council +description: Steering council of the conda ecosystem +charter: static +requirements: +resources: + teams: + - conda/steering-council + - conda-incubator/steering-council + repos: + - conda/governance + - conda/assets + - conda/ceps + - conda/cla + other: +links: [] +members: + baszalmstra: + full_name: Bas Zalmstra + email: zalmstra.bas@gmail.com + funder: prefix.dev + pronouns: he/him + decision: https://github.com/conda/governance/commit/03f21ae79dc1525eae0091ee3cf1e8f26856c6d6 + chenghlee: + full_name: Cheng H. Lee + email: clee@anaconda.com + funder: Anaconda + pronouns: he/him + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/8 + cj-wright: + full_name: Christopher J. 'CJ' Wright + email: cjwright4242@gmail.com + funder: + pronouns: + decision: https://github.com/conda/governance/issues/1 + Hind-M: + full_name: Hind Montassif + email: hind.montassif@gmail.com + funder: QuantStack + pronouns: she/her + decision: https://github.com/conda/governance/pull/171 + jaimergp: + full_name: Jaime Rodríguez-Guerra + email: jaime.rogue@gmail.com + funder: Quansight + pronouns: he/him + decision: https://github.com/conda/governance/pull/45 + jakirkham: + full_name: John Kirkham + email: jakirkham@gmail.com + funder: NVIDIA + pronouns: he/him + decision: + - https://github.com/conda/governance/pull/21 + jezdez: + full_name: Jannis Leidel + email: jannis@leidel.info + funder: Anaconda + pronouns: he/him + decision: https://github.com/conda/governance/pull/37 + marcelotrevisani: + full_name: Marcelo Duarte Trevisani + email: marceloduartetrevisani@gmail.com + funder: + pronouns: he/him + decision: + - https://github.com/conda/governance/issues/1 + mariusvniekerk: + full_name: Marius van Niekerk + email: marius.v.niekerk@gmail.com + funder: + pronouns: + decision: https://github.com/conda/governance/issues/1 + mbargull: + full_name: Marcel Bargull + email: marcel.bargull@udo.edu + funder: + pronouns: + decision: https://github.com/conda/governance/issues/1 + msarahan: + full_name: Michael Sarahan + email: msarahan@gmail.com + funder: NVIDIA + pronouns: he/him + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/15 + ocefpaf: + full_name: Filipe Fernandes + email: ocefpaf@gmail.com + funder: + pronouns: he/him + decision: + - https://github.com/conda/governance/issues/1 + pavelzw: + full_name: Pavel Zwerschke + email: pavelzw@gmail.com + funder: QuantCo + pronouns: he/him + decision: https://github.com/conda/governance/pull/241 + wolfv: + full_name: Wolf Vollprecht + email: w.vollprecht@gmail.com + funder: prefix.dev + pronouns: he/him + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/44 + xhochy: + full_name: Uwe Korn + email: mail@uwekorn.com + funder: QuantCo + pronouns: he/him + decision: https://github.com/conda/governance/issues/1 +emeritus: + # FIX: These are still "part" of steering because emeritus is a subteam of steering, which + # inherit the permissions. + angloyna: + awwad: + beckermr: + cjmartian: + csoja: + dharhas: + ericdill: + goanpeca: + jjhelmus: + mcg1969: + minrk: + prusse-martin: + raydouglass: + sodre: + trallard: diff --git a/teams/steering-emeritus.yml b/teams/steering-emeritus.yml new file mode 100644 index 0000000..f0bd82a --- /dev/null +++ b/teams/steering-emeritus.yml @@ -0,0 +1,180 @@ +# NOTE: This file is a work in progress. +# The information here reflected is provisional +# and must not be interpreted as the ground truth. +# yaml-language-server: $schema=./teams.schema.json +name: steering-emeritus +description: Former members of the steering council +charter: static +requirements: +resources: + teams: + - conda/steering-emeritus + repos: + - conda/governance + - conda/assets + - conda/ceps + - conda/cla + other: +links: [] +members: + angloyna: + full_name: Angela Gloyna + email: angela.gloyna@gmail.com + funder: + pronouns: + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/36 + awwad: + full_name: Sebastien Awwad + email: sebastien.awwad@gmail.com + funder: + pronouns: + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/17 + - https://github.com/conda/governance/pull/65 + beckermr: + full_name: Matthew R. Becker + email: becker.mr@gmail.com + funder: + pronouns: he/him + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/28 + - https://github.com/conda/governance/pull/169 + - https://github.com/conda/governance/pull/252 + cjmartian: + full_name: Connor Martin + email: connormartin7@gmail.com + funder: + pronouns: + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/3 + - https://github.com/conda/governance/pull/65 + csoja: + full_name: Crystal Soja + email: csoja@anaconda.com + funder: + pronouns: + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/16 + - https://github.com/conda/governance/pull/65 + dharhas: + full_name: Dharhas Pothina + email: dharhas@gmail.com + funder: + pronouns: + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/2 + - https://github.com/conda/governance/pull/64 + ericdill: + full_name: Eric Dill + email: ericdill@pm.me + funder: + pronouns: + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/83 + goanpeca: + full_name: Gonzalo Peña-Castellanos + email: goanpeca@gmail.com + funder: Quansight + pronouns: he/him + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/163 + jjhelmus: + full_name: Jonathan Helmus + email: jjhelmus@gmail.com + funder: + pronouns: + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/36 + kkraus14: + full_name: Keith Kraus + email: keith.j.kraus@gmail.com + funder: + pronouns: he/him + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/59 + - https://github.com/conda/governance/pull/74 + - https://github.com/conda/governance/pull/205 + mcg1969: + full_name: Michael Grant + email: mgrant@anaconda.com + funder: + pronouns: + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/7 + - https://github.com/conda/governance/pull/65 + minrk: + full_name: Min Ragan-Kelley + email: benjaminrk@gmail.com + funder: + pronouns: + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/34 + myancy-anaconda: + full_name: Megan Yancy + email: Megan.C.Yancy@gmail.com + funder: + pronouns: + decision: https://github.com/conda/governance/pull/39 + prusse-martin: + full_name: Martin Prüsse + email: prusse.martin@gmail.com + funder: + pronouns: + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/36 + raydouglass: + full_name: Ray Douglass + email: ray@raydouglass.com + funder: + pronouns: + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/32 + scopatz: + full_name: Anthony Scopatz + email: scopatz@gmail.com + funder: + pronouns: + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/36 + sodre: + full_name: Patrick Sodré + email: psodre@gmail.com + funder: + pronouns: + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/33 + teoliphant: + full_name: Travis Oliphant + email: teoliphant@gmail.com + funder: + pronouns: + decision: + - https://github.com/conda/governance/issues/1 + - https://github.com/conda/governance/pull/6 + - https://github.com/conda/governance/pull/64 + trallard: + full_name: Tania Allard + email: taniar.allard@gmail.com + funder: Quansight + pronouns: she/her + decision: + - https://github.com/conda/governance/pull/172 + - https://github.com/conda/governance/pull/310 +emeritus: diff --git a/teams/teams.schema.json b/teams/teams.schema.json index dc77931..c36a475 100644 --- a/teams/teams.schema.json +++ b/teams/teams.schema.json @@ -1,13 +1,97 @@ { "$defs": { - "Scopes": { + "MemberDetails": { + "additionalProperties": false, + "description": "Defines the contact details of a team member.", + "properties": { + "full_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Full Name" + }, + "email": { + "anyOf": [ + { + "format": "email", + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Email" + }, + "funder": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Funder" + }, + "pronouns": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Pronouns" + }, + "decision": { + "anyOf": [ + { + "format": "uri", + "maxLength": 2083, + "minLength": 1, + "type": "string" + }, + { + "items": { + "format": "uri", + "maxLength": 2083, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Decision" + } + }, + "required": [ + "full_name", + "email", + "funder", + "pronouns", + "decision" + ], + "title": "MemberDetails", + "type": "object" + }, + "Resources": { "additionalProperties": false, "description": "Defines the responsibilities of a Conda sub-team.\nThis structure is nested within the main CondaSubTeam model.", "properties": { - "codeowners": { + "teams": { "anyOf": [ { "items": { + "pattern": "[a-zA-Z0-9\\-_\\.\\+]{1,128}/[a-zA-Z0-9\\-_]{1,128}", "type": "string" }, "type": "array" @@ -16,7 +100,22 @@ "type": "null" } ], - "title": "Codeowners" + "title": "Teams" + }, + "repos": { + "anyOf": [ + { + "items": { + "pattern": "[a-zA-Z0-9\\-_\\.\\+]{1,128}/[a-zA-Z0-9\\-_\\.\\+]{1,128}", + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Repos" }, "other": { "anyOf": [ @@ -37,10 +136,11 @@ } }, "required": [ - "codeowners", + "teams", + "repos", "other" ], - "title": "Scopes", + "title": "Resources", "type": "object" } }, @@ -48,10 +148,13 @@ "description": "Model for defining Conda Sub-Teams based on the governance structure.", "properties": { "name": { + "pattern": "[a-zA-Z0-9\\-_]{1,128}", "title": "Name", "type": "string" }, "description": { + "maxLength": 128, + "minLength": 1, "title": "Description", "type": "string" }, @@ -75,8 +178,8 @@ ], "title": "Requirements" }, - "scopes": { - "$ref": "#/$defs/Scopes" + "resources": { + "$ref": "#/$defs/Resources" }, "links": { "items": { @@ -91,6 +194,9 @@ "members": { "additionalProperties": { "anyOf": [ + { + "$ref": "#/$defs/MemberDetails" + }, { "format": "uri", "maxLength": 2083, @@ -102,7 +208,6 @@ } ] }, - "minProperties": 1, "title": "Members", "type": "object" }, @@ -111,6 +216,18 @@ { "additionalProperties": { "anyOf": [ + { + "$ref": "#/$defs/MemberDetails" + }, + { + "items": { + "format": "uri", + "maxLength": 2083, + "minLength": 1, + "type": "string" + }, + "type": "array" + }, { "format": "uri", "maxLength": 2083, @@ -122,7 +239,6 @@ } ] }, - "minProperties": 1, "type": "object" }, { @@ -137,7 +253,7 @@ "description", "charter", "requirements", - "scopes", + "resources", "links", "members", "emeritus"