Skip to content

noahm/codeowners

 
 

Repository files navigation

@nmann/codeowners

npm

A library and CLI for interacting with GitHub's CODEOWNERS files.

It extends GitHubs's file format to to use the CODEOWNERS file as a source of truth for metadata about teams. This is useful for quick reference to things like preferred contact channels, JIRA project names, etc.

This metadata can be made even easier to access with a companion VS Code extension.

Library usage

const Codeowners = require('@nmann/codeowners');

// defaults to process.cwd(), but can pass a different directory path to constructor
const owners = new Codeowners();
owners.getOwner('path/to/file.js'); // returns array of one or more owners, e.g. ['@noahm']

Team metadata

This library will attempt to parse out contact info for teams if listed in a simple space-separated-values format. Only lines beginning with a double-pound "##" will be parsed.

The first line is a space-separated list of column names, and the following lines provide values for those columns, one line per team.

Example team metadata block:

## team slack-channel engineering-manager jira-project-key
## @org/admins #project-admins @alice ADMIN
## @org/design #design @bob DESIGN
## @org/monetization #monetization-eng @charlie MONEY

# ... regular codeowners file contents ...

This info is parsed and made available in an array of structured objects on the contactInfo field of a codeowners class instance:

[
  {
    team: '@org/admins',
    'slack-channel': '#project-admins',
    'engineering-manager': '@alice',
    'jira-project-key': 'ADMIN',
  },
  {
    team: '@org/design',
    'slack-channel': '#design',
    'engineering-manager': '@bob',
    'jira-project-key': 'DESIGN',
  },
  {
    team: '@org/monetization',
    'slack-channel': '#monetization-eng',
    'engineering-manager': '@charlie',
    'jira-project-key': 'MONEY',
  },
];

CLI usage

Find the owner(s) of a given file or files:

$ codeowners of some/file.ts [...otherfiles]

Print a list of each files in the current repo, followed by its owner:

$ codeowners audit

To find a list of files not covered by the CODEOWNERS in the project:

$ codeowners audit --unowned

Specify a non-standard CODEOWNERS filename

$ codeowners audit -c CODEKEEPERS

Verify users/teams own a specific path

$ codeowners verify src/ @foob_ar @contoso/engineers