---
title: "Provider and capabilities"
description: "What every provider has, and how to check what a forge supports."
canonical_url: "https://forges.link/reference/provider"
---
# Provider and capabilities

> What every provider has, and how to check what a forge supports.

See [Capabilities](https://forges.link/concepts/capabilities) for what each level means, and the [capability matrix](https://forges.link/reference/capability-matrix) for every forge.

## Namespaces

<table>
<thead>
  <tr>
    <th>
      Namespace
    </th>
    
    <th>
      Documented under
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <a href="https://forges.link/reference/threads#providerthreads">
        <code>
          provider.threads
        </code>
      </a>
    </td>
    
    <td>
      Issues and pull requests
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://forges.link/reference/repositories#providerrepos">
        <code>
          provider.repos
        </code>
      </a>
    </td>
    
    <td>
      Repositories
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://forges.link/reference/repositories#providercontents">
        <code>
          provider.contents
        </code>
      </a>
    </td>
    
    <td>
      Repositories
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://forges.link/reference/repositories#providerreleases">
        <code>
          provider.releases
        </code>
      </a>
    </td>
    
    <td>
      Repositories
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://forges.link/reference/repositories#providerusers">
        <code>
          provider.users
        </code>
      </a>
    </td>
    
    <td>
      Repositories
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://forges.link/reference/repositories#providerinstallations">
        <code>
          provider.installations
        </code>
      </a>
    </td>
    
    <td>
      Repositories
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://forges.link/reference/repositories#providerorgs">
        <code>
          provider.orgs
        </code>
      </a>
    </td>
    
    <td>
      Repositories
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://forges.link/reference/repositories#providersearch">
        <code>
          provider.search
        </code>
      </a>
    </td>
    
    <td>
      Repositories
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://forges.link/reference/notifications#providernotifications">
        <code>
          provider.notifications
        </code>
      </a>
    </td>
    
    <td>
      Notifications, webhooks and CI
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://forges.link/reference/notifications#providersources">
        <code>
          provider.sources
        </code>
      </a>
    </td>
    
    <td>
      Notifications, webhooks and CI
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://forges.link/reference/notifications#providerwebhooks">
        <code>
          provider.webhooks
        </code>
      </a>
    </td>
    
    <td>
      Notifications, webhooks and CI
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://forges.link/reference/notifications#providerchecks">
        <code>
          provider.checks
        </code>
      </a>
    </td>
    
    <td>
      Notifications, webhooks and CI
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://forges.link/reference/notifications#providerci">
        <code>
          provider.ci
        </code>
      </a>
    </td>
    
    <td>
      Notifications, webhooks and CI
    </td>
  </tr>
  
  <tr>
    <td>
      <a href="https://forges.link/reference/notifications#providersecurityalerts">
        <code>
          provider.securityAlerts
        </code>
      </a>
    </td>
    
    <td>
      Notifications, webhooks and CI
    </td>
  </tr>
</tbody>
</table>

## Properties

### `request`

Requests endpoints relative to `baseUrl` or absolute HTTP(S) URLs.
Other origins omit default headers and provider credentials; explicit headers apply.

**type:** [`ForgeRequest`](https://forges.link/reference/requests#forgerequest)

### `forge`

The forge this provider sends requests to; matches `forge` on every ref it returns.

**type:** [`ForgeKind`](https://forges.link/reference/data-model#forgekind)

### `instance`

**type:** [`ForgeInstance`](https://forges.link/reference/data-model#forgeinstance)

### `baseUrl`

**type:** `string`

### `authKind`

The `auth.type` the provider was created with; `'anonymous'` when it sends no credentials.

**type:** [`AuthKind`](https://forges.link/reference/providers#authkind)

### `capabilities`

Static, no-network capabilities until `refreshCapabilities()` resolves.

**type:** [`ForgeCapabilities`](https://forges.link/reference/provider#forgecapabilities)

### `webOrigin`

The canonical origin of the forge's website for this instance, such as `https://github.com`
(without any deployment path), or `undefined` when the forge has no website. Useful for
resolving root-relative links and for building a content security policy.

**type:** `HasWeb extends true ? string : string | undefined`

## Methods

### `refreshCapabilities()`

Re-derives capabilities from the instance version. The version is read
once per provider (GHES `/meta`, GitLab, Forgejo and Gitea `/version`).
Updates `capabilities` and returns it.

```ts
refreshCapabilities(): Promise<ForgeCapabilities>
```

**Returns:** [`Promise<ForgeCapabilities>`](https://forges.link/reference/provider#forgecapabilities)

### `rateLimits()`

The request budgets of the latest responses, one per `resource`, read without sending a request. GitHub keeps
a budget per resource, such as `core`, `search` and `graphql`; other forges report one budget with no
`resource`. Empty until a response reports a budget. A budget whose `resetAt` has passed is left out.

**Example**

```ts
const core = forge.rateLimits().find(budget => !budget.resource || budget.resource === 'core')
if (core?.remaining !== undefined && core.limit && core.remaining / core.limit < 0.1) {
  await slowDown(core.resetAt)
}
```

```ts
rateLimits(): RateLimit[]
```

**Returns:** [`RateLimit[]`](https://forges.link/reference/requests#ratelimit)

### `normaliseMarkdown()`

Rewrites Markdown into the dialect the forge renders; returns it unchanged where the forge renders CommonMark.

```ts
normaliseMarkdown(body: string): string
```

<table>
<thead>
  <tr>
    <th>
      Parameter
    </th>
    
    <th>
      Type
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        body
      </code>
    </td>
    
    <td>
      <code>
        string
      </code>
    </td>
  </tr>
</tbody>
</table>

**Returns:** `string`

### `can()`

Whether `verb` is supported, for `kind` where support differs by kind,
including version gates. Every verb is always present and rejects with
`UnsupportedOperationError` when this is `false`: the capability is the
question, the method is the action.

**Example**

```ts
if (provider.can('threads.merge')) {
  await provider.threads.merge(ref)
}
```

```ts
can(verb: ForgeVerb, kind?: ThreadKind | SecurityAlertKind): boolean
```

<table>
<thead>
  <tr>
    <th>
      Parameter
    </th>
    
    <th>
      Type
    </th>
    
    <th>
      Description
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        verb
      </code>
    </td>
    
    <td>
      <a href="https://forges.link/reference/provider#forgeverb">
        <code>
          ForgeVerb
        </code>
      </a>
    </td>
    
    <td>
      The operation, named by its path on the provider, such as <code>
        threads.comment
      </code>
      
      .
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        kind?
      </code>
    </td>
    
    <td>
      <code>
        ThreadKind | SecurityAlertKind
      </code>
    </td>
    
    <td>
      The thread kind, for an operation whose support differs by kind.
    </td>
  </tr>
</tbody>
</table>

**Returns:** `boolean`

### `support()`

How well `verb` is supported: `true`, `'experimental'`, `'emulated'`,
`'unverified'` or `false`, for `kind` where support differs by kind. `can()` is `true` for
every level but `false`. Without `kind`, a per-kind verb reports its
strongest level across kinds.

```ts
support(verb: ForgeVerb, kind?: ThreadKind | SecurityAlertKind): Support
```

<table>
<thead>
  <tr>
    <th>
      Parameter
    </th>
    
    <th>
      Type
    </th>
    
    <th>
      Description
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        verb
      </code>
    </td>
    
    <td>
      <a href="https://forges.link/reference/provider#forgeverb">
        <code>
          ForgeVerb
        </code>
      </a>
    </td>
    
    <td>
      The operation, named by its path on the provider, such as <code>
        threads.comment
      </code>
      
      .
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        kind?
      </code>
    </td>
    
    <td>
      <code>
        ThreadKind | SecurityAlertKind
      </code>
    </td>
    
    <td>
      The thread kind, for an operation whose support differs by kind.
    </td>
  </tr>
</tbody>
</table>

**Returns:** [`Support`](https://forges.link/reference/provider#support-1)

### `urlFor()`

The web page for `target`, built without a request; `undefined` when the forge has no such page.

**Overload 1 of 2**

```ts
urlFor(target: { repo: RepoRef, section?: undefined }): HasWeb extends true ? string : string | undefined
```

<table>
<thead>
  <tr>
    <th>
      Parameter
    </th>
    
    <th>
      Type
    </th>
    
    <th>
      Description
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        target
      </code>
    </td>
    
    <td>
      <a href="https://forges.link/reference/data-model#reporef">
        <code>
          { repo: RepoRef, section?: undefined }
        </code>
      </a>
    </td>
    
    <td>
      What to link to: a repository or one of its sections (<code>
        issues
      </code>
      
      , <code>
        pullRequests
      </code>
      
      , <code>
        compare
      </code>
      
      , <code>
        releases
      </code>
      
      , <code>
        stargazers
      </code>
      
      , <code>
        forks
      </code>
      
       or <code>
        watchers
      </code>
      
      ), thread, comment, release, file, raw file, commit or comparison.
    </td>
  </tr>
</tbody>
</table>

**Returns:** `HasWeb extends true ? string : string | undefined`

**Overload 2 of 2**

```ts
urlFor(target: UrlTarget): string | undefined
```

<table>
<thead>
  <tr>
    <th>
      Parameter
    </th>
    
    <th>
      Type
    </th>
    
    <th>
      Description
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        target
      </code>
    </td>
    
    <td>
      <a href="https://forges.link/reference/requests#urltarget">
        <code>
          UrlTarget
        </code>
      </a>
    </td>
    
    <td>
      What to link to: a repository or one of its sections (<code>
        issues
      </code>
      
      , <code>
        pullRequests
      </code>
      
      , <code>
        compare
      </code>
      
      , <code>
        releases
      </code>
      
      , <code>
        stargazers
      </code>
      
      , <code>
        forks
      </code>
      
       or <code>
        watchers
      </code>
      
      ), thread, comment, release, file, raw file, commit or comparison.
    </td>
  </tr>
</tbody>
</table>

**Returns:** `string | undefined`

### `scopesFor()`

Token scopes or app permissions `verb` needs on this forge, as data for a
consent screen or a 403 explanation. Nothing in the library reads it, and
an unmapped verb returns `{}`.

```ts
scopesFor(verb: ForgeVerb): VerbScopes
```

<table>
<thead>
  <tr>
    <th>
      Parameter
    </th>
    
    <th>
      Type
    </th>
    
    <th>
      Description
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        verb
      </code>
    </td>
    
    <td>
      <a href="https://forges.link/reference/provider#forgeverb">
        <code>
          ForgeVerb
        </code>
      </a>
    </td>
    
    <td>
      The operation, named by its path on the provider.
    </td>
  </tr>
</tbody>
</table>

**Returns:** [`VerbScopes`](https://forges.link/reference/provider#verbscopes)

### `parseUrl()`

Reads a web URL, clone URL or npm `repository` value (`git+https://`, `github:owner/name`) on this provider's instance into refs; `undefined` for anything else.

```ts
parseUrl(url: string | URL): ParsedForgeUrl | undefined
```

<table>
<thead>
  <tr>
    <th>
      Parameter
    </th>
    
    <th>
      Type
    </th>
    
    <th>
      Description
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        url
      </code>
    </td>
    
    <td>
      <code>
        string | URL
      </code>
    </td>
    
    <td>
      The URL to read.
    </td>
  </tr>
</tbody>
</table>

**Returns:** [`ParsedForgeUrl | undefined`](https://forges.link/reference/requests#parsedforgeurl)

### `referenceTo()`

How to mention `ref` in Markdown on this forge (`#42`, `!42`,
`acme/widgets#42`), short when written in `from`; the thread URL where the
forge has no reference syntax.

```ts
referenceTo(ref: ThreadRef, options?: ReferenceOptions): string | undefined
```

<table>
<thead>
  <tr>
    <th>
      Parameter
    </th>
    
    <th>
      Type
    </th>
    
    <th>
      Description
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        ref
      </code>
    </td>
    
    <td>
      <a href="https://forges.link/reference/data-model#threadref">
        <code>
          ThreadRef
        </code>
      </a>
    </td>
    
    <td>
      The thread to mention.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        options?
      </code>
    </td>
    
    <td>
      <a href="https://forges.link/reference/requests#referenceoptions">
        <code>
          ReferenceOptions
        </code>
      </a>
    </td>
    
    <td>
      The repository the reference is written in, so that a reference within it is short.
    </td>
  </tr>
</tbody>
</table>

**Returns:** `string | undefined`

## Unsupported operations

A method for an operation that the forge lacks rejects with [`UnsupportedOperationError`](https://forges.link/reference/errors#unsupportedoperationerror), or with [`ReadOnlyError`](https://forges.link/reference/errors#readonlyerror) on a read-only provider. Call `provider.can(verb)` first, or `provider.support(verb)` for the level of support.

## Check support

### `supports()`

Whether `verb` is supported according to `capabilities`, for `kind` where
support differs by thread kind (or by alert kind for `securityAlerts`).
Without `kind`, a per-kind verb counts as supported when any kind is.

**Example**

```ts
if (supports(provider.capabilities, 'threads.merge')) {
  await provider.threads.merge(ref)
}
```

```ts
function supports(capabilities: ForgeCapabilities, verb: ForgeVerb, kind?: ThreadKind | SecurityAlertKind): boolean
```

<table>
<thead>
  <tr>
    <th>
      Parameter
    </th>
    
    <th>
      Type
    </th>
    
    <th>
      Description
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        capabilities
      </code>
    </td>
    
    <td>
      <a href="https://forges.link/reference/provider#forgecapabilities">
        <code>
          ForgeCapabilities
        </code>
      </a>
    </td>
    
    <td>
      The capabilities of a provider, such as <code>
        provider.capabilities
      </code>
      
      .
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        verb
      </code>
    </td>
    
    <td>
      <a href="https://forges.link/reference/provider#forgeverb">
        <code>
          ForgeVerb
        </code>
      </a>
    </td>
    
    <td>
      The operation, named by its path on the provider, such as <code>
        threads.comment
      </code>
      
      .
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        kind?
      </code>
    </td>
    
    <td>
      <code>
        ThreadKind | SecurityAlertKind
      </code>
    </td>
    
    <td>
      The thread or alert kind, for an operation whose support differs by kind.
    </td>
  </tr>
</tbody>
</table>

**Returns:** `boolean`

### `supportOf()`

How well `verb` is supported according to `capabilities`: `true`,
`'experimental'`, `'emulated'`, `'unverified'` or `false`, for `kind` where support differs
by thread kind (or by alert kind for `securityAlerts`). Without `kind`, a
per-kind verb reports its strongest level across kinds.

```ts
function supportOf(capabilities: ForgeCapabilities, verb: ForgeVerb, kind?: ThreadKind | SecurityAlertKind): Support
```

<table>
<thead>
  <tr>
    <th>
      Parameter
    </th>
    
    <th>
      Type
    </th>
    
    <th>
      Description
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        capabilities
      </code>
    </td>
    
    <td>
      <a href="https://forges.link/reference/provider#forgecapabilities">
        <code>
          ForgeCapabilities
        </code>
      </a>
    </td>
    
    <td>
      The capabilities of a provider, such as <code>
        provider.capabilities
      </code>
      
      .
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        verb
      </code>
    </td>
    
    <td>
      <a href="https://forges.link/reference/provider#forgeverb">
        <code>
          ForgeVerb
        </code>
      </a>
    </td>
    
    <td>
      The operation, named by its path on the provider, such as <code>
        threads.comment
      </code>
      
      .
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        kind?
      </code>
    </td>
    
    <td>
      <code>
        ThreadKind | SecurityAlertKind
      </code>
    </td>
    
    <td>
      The thread or alert kind, for an operation whose support differs by kind.
    </td>
  </tr>
</tbody>
</table>

**Returns:** [`Support`](https://forges.link/reference/provider#support-1)

## Capability types

### `ForgeVerb`

A provider verb, named by its path on `ForgeProvider`.

**type:** `VerbsOf<(typeof TABLE)[number]>`

### `ForgeCapabilities`

What a provider supports, operation by operation. It is computed without a request, and
`refreshCapabilities()` refines it with the instance version. Each group holds one entry per
capability, and the [capability matrix](https://forges.link/reference/capability-matrix) lists them for every forge.

<table>
<thead>
  <tr>
    <th>
      Member
    </th>
    
    <th>
      Type
    </th>
    
    <th>
      Description
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        version?
      </code>
    </td>
    
    <td>
      <code>
        string
      </code>
    </td>
    
    <td>
      Instance version the capabilities were computed for, when known.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        experimental?
      </code>
    </td>
    
    <td>
      <code>
        true
      </code>
    </td>
    
    <td>
      The forge's API as a whole is unstable, so the provider can change with it.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        sources
      </code>
    </td>
    
    <td>
      <a href="https://forges.link/reference/provider#support-1">
        <code>
          Record<'poll' | 'webhook' | 'subscribe', Support>
        </code>
      </a>
    </td>
    
    <td>
      <code>
        subscribe
      </code>
      
       is a long-lived push stream; see <a href="https://forges.link/reference/notifications#providersources">
        <code>
          SourcesApi
        </code>
      </a>
      
      .
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        orgs
      </code>
    </td>
    
    <td>
      
    </td>
    
    <td>
      An organisation's teams and their members, where the forge has teams.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        reactions
      </code>
    </td>
    
    <td>
      
    </td>
    
    <td>
      Listing the reactions on a thread or one of its comments, per thread kind.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        writes
      </code>
    </td>
    
    <td>
      
    </td>
    
    <td>
      Write verbs, per thread kind except <code>
        merge
      </code>
      
      , <code>
        approveAndMerge
      </code>
      
      , <code>
        transfer
      </code>
      
       and <code>
        markDuplicate
      </code>
      
      .
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        subscriptions
      </code>
    </td>
    
    <td>
      
    </td>
    
    <td>
      Reading a thread subscription (<code>
        get
      </code>
      
      ) and changing it (<code>
        set
      </code>
      
      ), per kind. Distinct from notification unsubscribe.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        checks
      </code>
    </td>
    
    <td>
      
    </td>
    
    <td>
      <code>
        thread
      </code>
      
       covers <code>
        Thread.checks
      </code>
      
       and <code>
        threads.checks()
      </code>
      
       (pull requests only); the rest are the commit-level surface. <code>
        report
      </code>
      
       is a commit status unless the credential can write check runs.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        ci
      </code>
    </td>
    
    <td>
      
    </td>
    
    <td>
      Read-only CI surface. <code>
        log
      </code>
      
       is <code>
        false
      </code>
      
       where job logs are not reachable over the API.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        reviews
      </code>
    </td>
    
    <td>
      
    </td>
    
    <td>
      Reviews on a pull request. <code>
        list
      </code>
      
       is <code>
        'emulated'
      </code>
      
       where reviews are synthesised from approvals or votes; <code>
        create
      </code>
      
       then covers only the events the forge's approval endpoint can express.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        contents
      </code>
    </td>
    
    <td>
      
    </td>
    
    <td>
      Repository contents. <code>
        tree
      </code>
      
       is <code>
        'emulated'
      </code>
      
       where recursion is walked level by level rather than by the forge.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        webhooks
      </code>
    </td>
    
    <td>
      
    </td>
    
    <td>
      Managing registered webhooks, beside receiving deliveries.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        search
      </code>
    </td>
    
    <td>
      
    </td>
    
    <td>
      Cross-repository search of issues and pull requests, repositories, commits and code.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        securityAlerts
      </code>
    </td>
    
    <td>
      <a href="https://forges.link/reference/provider#alertsupport">
        <code>
          AlertSupport
        </code>
      </a>
    </td>
    
    <td>
      Per alert kind, since each needs its own token scope on GitHub.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        installations
      </code>
    </td>
    
    <td>
      <a href="https://forges.link/reference/provider#support-1">
        <code>
          Support
        </code>
      </a>
    </td>
    
    <td>
      Enumerating app installations and deriving one provider per installation.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        eventKinds
      </code>
    </td>
    
    <td>
      <code>
        'native' | 'heuristic'
      </code>
    </td>
    
    <td>
      <code>
        'heuristic'
      </code>
      
       when event kinds are inferred from free text (GitLab system notes) rather than reported by the forge, so <code>
        kind
      </code>
      
       may be <code>
        'other'
      </code>
      
       or wrong for unrecognised wording; <code>
        kindRaw
      </code>
      
       and <code>
        payload
      </code>
      
       stay exact.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        authKinds
      </code>
    </td>
    
    <td>
      <a href="https://forges.link/reference/providers#authkind">
        <code>
          readonly AuthKind[]
        </code>
      </a>
    </td>
    
    <td>
      Auth types the provider accepts. The type this provider was created with is <code>
        ForgeProvider.authKind
      </code>
      
      .
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        limits?
      </code>
    </td>
    
    <td>
      <a href="https://forges.link/reference/data-model#textlimits">
        <code>
          TextLimits
        </code>
      </a>
    </td>
    
    <td>
      Maximum text lengths the forge accepts.
    </td>
  </tr>
</tbody>
</table>

### `Support`

Capability flag. Every value other than `false` means the operation is
available:

- `true`: native, and verified against the forge's responses.
- `'experimental'`: native and verified, but built on an API the forge marks
unstable, so it can change.
- `'emulated'`: composed from other calls, so the result is approximate.
- `'unverified'`: implemented, but not yet verified against the forge's
responses, so it may not work.

**one of:**

- `boolean`
- `'emulated'`
- `'experimental'`
- `'unverified'`

### `PerKind`

Per-thread-kind support. `'other'` subjects have no verbs, so they have no entry.

**type:** `Record<Exclude<ThreadKind, 'other'>, Support>`

### `AlertSupport`

Support per security alert kind.

**type:** [`Record<'dependency' | 'code_scanning' | 'secret' | 'advisory', Support>`](https://forges.link/reference/provider#support-1)

### `VerbScopes`

What a credential needs for a verb, as data. Nothing in the library reads
it; it is there so a consumer can build a consent screen or explain a 403.

<table>
<thead>
  <tr>
    <th>
      Member
    </th>
    
    <th>
      Type
    </th>
    
    <th>
      Description
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        token?
      </code>
    </td>
    
    <td>
      <code>
        string[]
      </code>
    </td>
    
    <td>
      OAuth or personal access token scopes.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        permissions?
      </code>
    </td>
    
    <td>
      <code>
        Record<string, 'read' | 'write' | 'admin'>
      </code>
    </td>
    
    <td>
      Fine-grained token or app permissions, by permission name.
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        note?
      </code>
    </td>
    
    <td>
      <code>
        string
      </code>
    </td>
    
    <td>
      How the forge expresses access where scopes do not apply.
    </td>
  </tr>
</tbody>
</table>


## Sitemap

See the full [sitemap](https://forges.link/sitemap.md) for all pages.
