dev.knotless.repo

lexicons.knotless.dev

{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "agent": {
      "description": "An account whose pulls are checked as they move, as code no one vouches for.",
      "properties": {
        "did": {
          "format": "did",
          "type": "string"
        }
      },
      "required": [
        "did"
      ],
      "type": "object"
    },
    "appview": {
      "description": "An appview the owner lets keep an index of a private repository.",
      "properties": {
        "did": {
          "description": "The appview's service DID, as did:web:knotless.dev.",
          "format": "did",
          "type": "string"
        }
      },
      "required": [
        "did"
      ],
      "type": "object"
    },
    "collaborator": {
      "description": "An account that may push to the repository.",
      "properties": {
        "did": {
          "format": "did",
          "type": "string"
        }
      },
      "required": [
        "did"
      ],
      "type": "object"
    },
    "label": {
      "description": "A label pulls and issues may carry.",
      "properties": {
        "color": {
          "description": "A hex color, as #d73a4a.",
          "maxLength": 7,
          "type": "string"
        },
        "description": {
          "description": "What the label means, for those who put it on.",
          "maxGraphemes": 200,
          "maxLength": 1000,
          "type": "string"
        },
        "exclusive": {
          "description": "At most one of its scope's exclusive labels stands at a time, as priority/high and priority/low: setting one takes the others off.",
          "type": "boolean"
        },
        "name": {
          "description": "Unique among the repository's labels. Up to its last `/`, if it has one, it names the label's scope, as kind/bug's is kind.",
          "maxGraphemes": 50,
          "maxLength": 100,
          "type": "string"
        }
      },
      "required": [
        "name"
      ],
      "type": "object"
    },
    "main": {
      "description": "Keyed by the repository's name, so a clone URL resolves with one getRecord. `key` prefixes the record keys of everything the repository holds; a rename writes a record under the new name with the same key, deletes the old one and leaves a dev.knotless.redirect under the old name.",
      "key": "any",
      "record": {
        "properties": {
          "agents": {
            "description": "Accounts, such as a coding agent, whose pulls the repository's runners check as they move, as they do a collaborator's, but as code no one vouches for: given no secrets, reading caches apart, and keeping nothing they write. An account named here counts as an agent even if it is a collaborator too.",
            "items": {
              "ref": "#agent",
              "type": "ref"
            },
            "maxLength": 32,
            "type": "array"
          },
          "appviews": {
            "description": "Deprecated, and no longer read: knotless.dev indexes every private repository its members read there, named here or not. Was, for a private repository, the appviews its owner let keep an index of it.",
            "items": {
              "ref": "#appview",
              "type": "ref"
            },
            "maxLength": 32,
            "type": "array"
          },
          "collaborators": {
            "description": "Accounts that may push. They push through a gateway the owner has delegated writes to, which checks this list.",
            "items": {
              "ref": "#collaborator",
              "type": "ref"
            },
            "maxLength": 1000,
            "type": "array"
          },
          "createdAt": {
            "format": "datetime",
            "type": "string"
          },
          "defaultBranch": {
            "description": "The branch HEAD points at, without refs/heads/.",
            "maxLength": 255,
            "type": "string"
          },
          "description": {
            "maxGraphemes": 300,
            "maxLength": 3000,
            "type": "string"
          },
          "forkOf": {
            "description": "The repository this one was forked from.",
            "ref": "dev.knotless.defs#repoRef",
            "type": "ref"
          },
          "gateway": {
            "description": "A gateway the owner has delegated writes to. Collaborators push and commit through it; it batches concurrent commits to a branch into one write.",
            "format": "did",
            "type": "string"
          },
          "key": {
            "description": "Minted when the repository is created; never reused. The `repo` of its dev.knotless.ref, dev.knotless.claim and dev.knotless.pack records.",
            "format": "tid",
            "type": "string"
          },
          "labels": {
            "description": "The labels its pulls and issues may carry. The owner and collaborators put them on with dev.knotless.label records; readers show none but these.",
            "items": {
              "ref": "#label",
              "type": "ref"
            },
            "maxLength": 200,
            "type": "array"
          },
          "links": {
            "description": "Links shown on the repository's pages, in display order: its website first.",
            "items": {
              "ref": "dev.knotless.defs#link",
              "type": "ref"
            },
            "maxLength": 5,
            "type": "array"
          },
          "name": {
            "description": "Equal to the record key.",
            "maxLength": 100,
            "type": "string"
          },
          "rules": {
            "description": "Protected branches. The gateway holds collaborators to them; the owner, who writes these records directly, is held only by their own client.",
            "items": {
              "ref": "#rule",
              "type": "ref"
            },
            "maxLength": 100,
            "type": "array"
          },
          "runners": {
            "description": "Accounts that run the repository's workflows. Readers show the dev.knotless.check records these accounts write about the repository, and no one else's.",
            "items": {
              "ref": "#runner",
              "type": "ref"
            },
            "maxLength": 32,
            "type": "array"
          },
          "transfer": {
            "description": "Where the owner has offered to move the repository: a record in another account, named before it exists. Once that account holds a dev.knotless.repo there whose `transferredFrom` names this one, the repository has moved, and readers follow.",
            "ref": "dev.knotless.defs#repoRef",
            "type": "ref"
          },
          "transferredFrom": {
            "description": "The repository this one was moved from. Readers count records naming that one as naming this one, if its owner agreed: its `transfer`, or the redirect left in its place, leads here.",
            "ref": "dev.knotless.defs#repoRef",
            "type": "ref"
          },
          "triagers": {
            "description": "Accounts, such as a triage bot, whose dev.knotless.label records readers honor for the scopes named, and below anyone's who labels as the owner or a collaborator.",
            "items": {
              "ref": "#triager",
              "type": "ref"
            },
            "maxLength": 32,
            "type": "array"
          }
        },
        "required": [
          "key",
          "name",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    },
    "rule": {
      "description": "A protected branch: through a gateway it only moves forward and is never deleted, and, as its rule says, takes no merge commits or takes pulls only through the merge queue.",
      "properties": {
        "branch": {
          "description": "The branch, without refs/heads/.",
          "maxLength": 255,
          "type": "string"
        },
        "history": {
          "description": "`linear`: the branch takes no merge commits, so pulls merge into it by squashing. `merges`: it takes them. Absent, or a value a reader does not know, is read as `linear`, so a rule is never held more loosely than it was written.",
          "knownValues": [
            "linear",
            "merges"
          ],
          "maxLength": 64,
          "type": "string"
        },
        "queue": {
          "description": "Pulls into this branch land only through the merge queue: a merge queues them instead, unless the owner forces it, and through a gateway the branch moves for no one but the owner and the runner that lands the queue. Absent is false.",
          "type": "boolean"
        }
      },
      "required": [
        "branch"
      ],
      "type": "object"
    },
    "runner": {
      "description": "An account whose dev.knotless.check records about the repository readers trust.",
      "properties": {
        "did": {
          "format": "did",
          "type": "string"
        }
      },
      "required": [
        "did"
      ],
      "type": "object"
    },
    "scope": {
      "description": "A scope of labels a triager may put on.",
      "properties": {
        "name": {
          "description": "As kind is kind/bug's: a label's name up to its last `/`.",
          "maxLength": 100,
          "type": "string"
        }
      },
      "required": [
        "name"
      ],
      "type": "object"
    },
    "triager": {
      "description": "An account that puts labels of some scopes on pulls and issues. Its labels give way to the owner's and collaborators', whenever they were set; an account named here counts as a triager even if it is a collaborator too.",
      "properties": {
        "did": {
          "format": "did",
          "type": "string"
        },
        "scopes": {
          "description": "The scopes of the labels it may put on. None, when absent.",
          "items": {
            "ref": "#scope",
            "type": "ref"
          },
          "maxLength": 50,
          "type": "array"
        }
      },
      "required": [
        "did"
      ],
      "type": "object"
    }
  },
  "description": "A git repository hosted in this account: in its public repo, or, for a private repository, in a dev.knotless.space space keyed by the name.",
  "id": "dev.knotless.repo",
  "lexicon": 1
}

Validate Record

Validate a record against dev.knotless.repo

Validation Options
Automatically resolve and include external schemas for full validation
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:yqsg7znbbhfmj3a2nrpnaerk
CID
bafyreih2dzdpcxft7pcnj5xuy6kxksu662x7bw3n66vrwahnnc5x5p7id4
Indexed At
2026-10-28 21:21 UTC
AT-URI
at://did:plc:yqsg7znbbhfmj3a2nrpnaerk/com.atproto.lexicon.schema/dev.knotless.repo

Version History (3 versions)

Referenced Schemas (2)

Similar Lexicons

Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.

  • What a repository's owner sets: its description, links and default branch, protected branches, labels, collaborators and triagers, an offer to move it, and what it takes up.

  • One git ref of a repository.

  • The labels one account puts on a pull or issue, from those its repository defines.

  • A request to merge a branch into a repository, kept in the requester's account.

  • Git repository manifest record. This record is used for git repository discovery like how `org.tangled.actor.profile` is used to find users.

Lexicon Garden

@