ForgeFed

ForgeFed Vocabulary - draft - 2023-03-08 main a3a6d7d

1 Abstract

This document describes the ForgeFed vocabulary. It’s intended to be an extension of the ActivityPub Vocabulary and provides additional vocabulary for federation of project management and version control system hosting and collaboration platforms.

2 Introduction

The ForgeFed Vocabulary describes a set of types and properties to be used by platforms that support the ForgeFed protocol. This specification describes only the new vocabulary called ForgeFed. The ForgeFed behavior specification describes how to use this vocabulary, along with standard ActivityPub vocabulary, to support the ForgeFed protocol.

3 Types

The base URI of all ForgeFed terms is https://forgefed.org/ns#. The ForgeFed vocabulary has a JSON-LD context whose URI is https://forgefed.org/ns. Implementers MUST either include the ActivityPub and ForgeFed contexts in their object definitions, or other contexts that would result with the ActivityPub and ForgeFed terms being assigned they correct full URIs. Implementers MAY include additional contexts and terms as appropriate.

A typical @context of a ForgeFed object may look like this:

"@context": [
          "https://www.w3.org/ns/activitystreams",
          "https://forgefed.org/ns"
      ]

3.1 Activity Types

3.1.1 Grant

URI: https://forgefed.org/ns#Grant

Notes: Indicates that target is being given (by the actor) access to a resource specified by context under the role/permission specified by object. The resource may either be a resource managed by the actor, in which case it is directly offering access-to-the-resource to the target, or it may be a resource managed by some other actor, in which case the Grant’s actor is passing on (delegating) access.

Extends: Activity

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://example.dev/myproject/outbox/reBGo",
          "type": "Grant",
          "actor": "https://example.dev/myproject",
          "to": [
              "https://example.dev/myproject/followers",
              "https://example.dev/users/aviva"
          ],
          "object": "https://example.dev/roles/developer",
          "context": "https://example.dev/myproject",
          "target": "https://example.dev/users/aviva"
      }

3.1.2 Revoke

URI: https://forgefed.org/ns#Revoke

Notes: Indicates that the actor is canceling target‘s access to a resource specified by context under the role specified by instrument, making the Grant activities specified by object unusable anymore in other activities’ capability field.

Extends: Activity

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://example.dev/myproject/outbox/nlTxb",
          "type": "Revoke",
          "actor": "https://example.dev/myproject",
          "to": [
              "https://example.dev/myproject/followers",
              "https://example.dev/users/aviva"
          ],
          "object": "https://example.dev/myproject/outbox/reBGo",
          "instrument": "https://example.dev/roles/developer",
          "context": "https://example.dev/myproject",
          "target": "https://example.dev/users/aviva"
      }

3.1.3 Push

URI: https://forgefed.org/ns#Push

Notes: Indicates that new content has been pushed to the Repository.

Extends: Activity

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://example.dev/aviva/outbox/reBGo",
          "type": "Push",
          "actor": "https://example.dev/aviva",
          "to": [
              "https://example.dev/aviva/followers",
              "https://example.dev/aviva/myproject",
              "https://example.dev/aviva/myproject/team",
              "https://example.dev/aviva/myproject/followers"
          ],
          "summary": "<p>Aviva pushed a commit to myproject</p>",
          "object": {
              "type": "OrderedCollection",
              "totalItems": 1,
              "items": [
                  {
                      "id": "https://example.dev/aviva/myproject/commits/d96596230322716bd6f87a232a648ca9822a1c20",
                      "type": "Commit",
                      "attributedTo": "https://example.dev/aviva",
                      "context": "https://example.dev/aviva/myproject",
                      "hash": "d96596230322716bd6f87a232a648ca9822a1c20",
                      "created": "2019-11-03T13:43:59Z",
                      "summary": "Provide hints in sign-up form fields",
                  }
              ]
          },
          "target": "https://example.dev/aviva/myproject/branches/master",
          "context": "https://example.dev/aviva/myproject"
      }

3.2 Actor Types

3.2.1 Repository

URI: https://forgefed.org/ns#Repository

Notes: Represents a version control system repository.

Extends: Object

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://w3id.org/security/v1",
              "https://forgefed.org/ns"
          ],
          "id": "https://dev.example/aviva/treesim",
          "type": "Repository",
          "publicKey": {
              "id": "https://dev.example/aviva/treesim#main-key",
              "owner": "https://dev.example/aviva/treesim",
              "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhki....."
          },
          "inbox": "https://dev.example/aviva/treesim/inbox",
          "outbox": "https://dev.example/aviva/treesim/outbox",
          "followers": "https://dev.example/aviva/treesim/followers",
          "team": "https://dev.example/aviva/treesim/team",
          "name": "Tree Growth 3D Simulation",
          "summary": "<p>Tree growth 3D simulator for my nature exploration game</p>"
      }

3.2.2 TicketTracker

URI: https://forgefed.org/ns#TicketTracker

Notes: Represents a ticket tracker, i.e. a project managing a list of work items.

Extends: Object

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://w3id.org/security/v2",
              "https://forgefed.org/ns"
          ],
          "id": "https://dev.example/aviva/treesim",
          "type": ["Repository", "TicketTracker"],
          "publicKey": {
              "id": "https://dev.example/aviva/treesim#main-key",
              "owner": "https://dev.example/aviva/treesim",
              "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhki....."
          },
          "inbox": "https://dev.example/aviva/treesim/inbox",
          "outbox": "https://dev.example/aviva/treesim/outbox",
          "followers": "https://dev.example/aviva/treesim/followers",
          "name": "Tree Growth 3D Simulation",
          "summary": "<p>Tree growth 3D simulator for my nature exploration game</p>"
      }

3.2.3 PatchTracker

URI: https://forgefed.org/ns#PatchTracker

Notes: Represents a tracker of merge requests i.e. a project managing a list of patches or branches submitted as proposed changes to a given Repository.

Extends: Object

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://w3id.org/security/v2",
              "https://forgefed.org/ns"
          ],
          "id": "https://dev.example/aviva/treesim",
          "type": ["Repository", "TicketTracker", "PatchTracker"],
          "publicKey": {
              "id": "https://dev.example/aviva/treesim#main-key",
              "owner": "https://dev.example/aviva/treesim",
              "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhki....."
          },
          "inbox": "https://dev.example/aviva/treesim/inbox",
          "outbox": "https://dev.example/aviva/treesim/outbox",
          "followers": "https://dev.example/aviva/treesim/followers",
          "name": "Tree Growth 3D Simulation",
          "summary": "<p>Tree growth 3D simulator for my nature exploration game</p>"
      }

3.2.4 Project

URI: https://forgefed.org/ns#Project

Notes: Represents a project, a planned endeavor that involves usage of tools related to the software development lifecycle. It may be a software project, but may also be totally unrelated to software development. For example, it may be a book that is being written using Markdown files kept in a Git repository. A Project object is a way to collect forge related components together under one title.

Extends: Object

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://w3id.org/security/v2",
              "https://forgefed.org/ns"
          ],
          "id": "https://dev.example/projects/wanderer",
          "type": "Project",
      
          "name": "Wanderer",
          "summary": "3D nature exploration game",
          "components": {
              "type": "Collection",
              "totalItems": 7,
              "items": [
                  "https://dev.example/repos/opengl-vegetation",
                  "https://dev.example/repos/opengl-vegetation/patch-tracker",
                  "https://dev.example/repos/treesim",
                  "https://dev.example/repos/treesim/patch-tracker",
                  "https://dev.example/repos/wanderer",
                  "https://dev.example/repos/wanderer/patch-tracker",
                  "https://dev.example/issue-trackers/wanderer"
              ]
          },
      
          "publicKey": {
              "id": "https://dev.example/projects/wanderer#main-key",
              "owner": "https://dev.example/projects/wanderer",
              "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhki....."
          },
          "inbox": "https://dev.example/projects/wanderer/inbox",
          "outbox": "https://dev.example/projects/wanderer/outbox",
          "followers": "https://dev.example/projects/wanderer/followers"
      }

3.2.5 Team

URI: https://forgefed.org/ns#Team

Notes: Represents a group of people working together, collaborating on shared resources. Each member Person in the team has a defined role, affecting the level of access they have to the team’s shared resources and to managing the team itself.

Extends: Object

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://w3id.org/security/v2",
              "https://forgefed.org/ns"
          ],
          "id": "https://dev.example/teams/mobilizon-dev-team",
          "type": "Team",
          "name": "Mobilizon Development Team",
          "summary": "We're creating a federated tool for organizing events!",
          "members": {
              "type": "Collection",
              "totalItems": 3,
              "items": [
                  { "type": "Relationship",
                    "subject": "https://dev.example/teams/mobilizon-dev-team",
                    "relationship": "hasMember",
                    "object": "https://dev.example/people/alice",
                    "tag": "https://roles.example/admin"
                  },
                  { "type": "Relationship",
                    "subject": "https://dev.example/teams/mobilizon-dev-team",
                    "relationship": "hasMember",
                    "object": "https://dev.example/people/bob",
                    "tag": "https://roles.example/maintainer"
                  },
                  { "type": "Relationship",
                    "subject": "https://dev.example/teams/mobilizon-dev-team",
                    "relationship": "hasMember",
                    "object": "https://dev.example/people/celine",
                    "tag": "https://roles.example/developer"
                  }
              ]
          },
          "subteams": {
              "type": "Collection",
              "totalItems": 2,
              "items": [
                  "https://dev.example/teams/mobilizon-backend-team",
                  "https://dev.example/teams/mobilizon-frontend-team"
              ]
          },
          "context": "https://dev.example/teams/framasoft-developers",
      
          "publicKey": {
              "id": "https://dev.example/teams/mobilizon-dev-team#main-key",
              "owner": "https://dev.example/teams/mobilizon-dev-team",
              "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhki....."
          },
          "inbox": "https://dev.example/teams/mobilizon-dev-team/inbox",
          "outbox": "https://dev.example/teams/mobilizon-dev-team/outbox",
          "followers": "https://dev.example/teams/mobilizon-dev-team/followers"
      }

3.3 Object Types

3.3.1 CapabilityUsage

URI: https://forgefed.org/ns#CapabilityUsage

Notes: Represents a mode of using a Grant as an Object Capability (OCAP). There are two conceptual operations for Grants: Invocation (acting on the resource under the specified role) and Delegation (passing on the access to more actors, possibly with reduced privileges). A value of this type refers to one or both of these operations, and possibly to more specific conditions and restrictions on applying them.

Extends: Object

Values: The following 3 values are provided by this specification:

Example:

3.3.2 Role

URI: https://forgefed.org/ns#Role

Notes: Represents a role that an actor has within a Team, or a role defining the level of access an actor has to a resource.

Extends: Object

Values: This specification currently provides 1 value of the Role type:

Example:

3.3.3 Branch

URI: https://forgefed.org/ns#Branch

Notes: Represents a named variable reference to a version of the Repository, typically used for committing changes in parallel to other development, and usually eventually merging the changes into the main history line.

Extends: Object

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://example.dev/luke/myrepo/branches/master",
          "type": "Branch",
          "name": "master",
          "context": "https://example.dev/luke/myrepo",
          "ref": "refs/heads/master"
      }

3.3.4 Commit

URI: https://forgefed.org/ns#Commit

Notes: Represents a named set of changes in the history of a Repository. This is called “commit” in Git, Mercurial and Monotone; “patch” in Darcs; sometimes called “change set”. Note that Commit is a set of changes that already exists in a repo’s history, while a Patch is a separate proposed change set, that could be applied and pushed to a repo, resulting with a Commit.

Extends: Object

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://example.dev/alice/myrepo/commits/109ec9a09c7df7fec775d2ba0b9d466e5643ec8c",
          "type": "Commit",
          "context": "https://example.dev/alice/myrepo",
          "attributedTo": "https://example.dev/bob",
          "committedBy": "https://example.dev/alice",
          "hash": "109ec9a09c7df7fec775d2ba0b9d466e5643ec8c",
          "summary": "Add an installation script, fixes issue #89",
          "description": {
              "mediaType": "text/plain",
              "content": "It's about time people can install on their computers!"
          },
          "created": "2019-07-11T12:34:56Z",
          "committed": "2019-07-26T23:45:01Z"
      }

3.3.5 Patch

URI: https://forgefed.org/ns#Patch

Notes: Represents a named set of changes that are being proposed for applying to a specific Repository.

Extends: Object

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://dev.example/aviva/game-of-life/pulls/825/versions/1/patches/1",
          "type": "Patch",
          "attributedTo": "https://forge.example/luke",
          "context": "https://dev.example/aviva/game-of-life/pulls/825/versions/1",
          "mediaType": "application/x-git-patch",
          "content": "From c9ae5f4ff4a330b6e1196ceb7db1665bd4c1..."
      }

3.3.6 TicketDependency

URI: https://forgefed.org/ns#TicketDependency

Notes: Represents a relationship between 2 Tickets, in which the resolution of one ticket requires the other ticket to be resolved too. It MUST specify the subject, object and relationship properties, and the relationship property MUST be dependsOn.

Extends: Relationship

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "type": ["Relationship", "TicketDependency"],
          "id": "https://example.dev/ticket-deps/2342593",
          "attributedTo": "https://example.dev/alice",
          "summary": "Alice's ticket depends on Bob's ticket",
          "published": "2019-07-11T12:34:56Z",
          "subject": "https://example.dev/alice/myproj/issues/42",
          "relationship": "dependsOn",
          "object": "https://dev.community/bob/coolproj/issues/85"
      }

3.3.7 Ticket

URI: https://forgefed.org/ns#Ticket

Notes: Represents an item that requires work or attention. Tickets exist in the context of a project (which may or may not be a version-control repository), and are used to track ideas, proposals, tasks, bugs and more.

Extends: Object

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "type": "Ticket",
          "id": "https://example.dev/alice/myrepo/issues/42",
          "context": "https://example.dev/alice/myrepo",
          "attributedTo": "https://dev.community/bob",
          "summary": "Nothing works!",
          "content": "<p>Please fix. <i>Everything</i> is broken!</p>",
          "mediaType": "text/html",
          "source": {
              "content": "Please fix. *Everything* is broken!",
              "mediaType": "text/markdown; variant=CommonMark"
          },
          "assignedTo": "https://example.dev/alice",
          "isResolved": false
      }

4 Properties

4.1 earlyItems

URI: https://forgefed.org/ns#earlyItems

Notes: In an ordered collection (or an ordered collection page) in which items (or orderedItems) contains a continuous subset of the collection’s items from one end, earlyItems identifiers a continuous subset from the other end. For example, if items lists the chronologically latest items, earlyItems would list the chrologically earliest items. The ordering rule for items in earlyItems MUST be the same as in items. For examle, if items lists items in reverse chronogical order, then so does earlyItems.

Domain: OrderedCollection

Range: Ordered list of [Object | Link]

Functional: No

Inverse of: (None)

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://dev.example/aviva/outbox",
          "type": "OrderedCollection",
          "totalItems": 712,
          "orderedItems": [
             "https://dev.example/aviva/outbox/712",
             "https://dev.example/aviva/outbox/711",
             "https://dev.example/aviva/outbox/710"
          ],
          "earlyItems": [
             "https://dev.example/aviva/outbox/3",
             "https://dev.example/aviva/outbox/2",
             "https://dev.example/aviva/outbox/1"
          ]
      }

4.2 previousVersions

URI: https://forgefed.org/ns#previousVersions

Notes Specifies the previous versions of the subject, as an ordered list in reverse chronological order.

Domain: Object

Range: rdf:List of objects of the same @type as the subject

Functional: Yes

Inverse of: (None, but see currentVersion)

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://dev.example/aviva/notes/107",
          "type": "Note",
          "attributedTo": "https://dev.example/aviva",
          "content": "I agree!!!!! (edit: fixed a typo)",
          "previousVersions": [
             "https://dev.example/aviva/notes/107_old_version",
             "https://dev.example/aviva/notes/107_very_old_version",
             "https://dev.example/aviva/notes/107_ancient_version"
          ]
      }

4.3 currentVersion

URI: https://forgefed.org/ns#currentVersion

Notes Specifies the latest. current, up-to-date version of the subject. Once the subject specifies the currentVersion property, it SHOULD NOT get any changes to any other properties. The exception is currentVersion itself, which MUST be updated whenever needed, to always point to the latest version.

Domain: Object

Range: Object, of the same @type as the subject

Functional: Yes

Inverse of: (None, but see previousVersions)

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://dev.example/aviva/notes/107_old_version",
          "type": "Note",
          "attributedTo": "https://dev.example/aviva",
          "content": "I agree!!111",
          "currentVersion": "https://dev.example/aviva/notes/107"
      }

4.4 components

URI: https://forgefed.org/ns#components

Notes: Identifies a Collection listing actors whose services and resources are considered to be components of this project.

Domain: Project

Range: Collection

Functional: Yes

Inverse of: None, but see the usage of context in the Modeling specification, e.g. in Repository

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://dev.example/projects/wanderer",
          "type": "Project",
      
          "name": "Wanderer",
          "summary": "3D nature exploration game",
          "components": {
              "type": "Collection",
              "totalItems": 7,
              "items": [
                  "https://dev.example/repos/opengl-vegetation",
                  "https://dev.example/repos/opengl-vegetation/patch-tracker",
                  "https://dev.example/repos/treesim",
                  "https://dev.example/repos/treesim/patch-tracker",
                  "https://dev.example/repos/wanderer",
                  "https://dev.example/repos/wanderer/patch-tracker",
                  "https://dev.example/issue-trackers/wanderer"
              ]
          },
      
          "inbox": "https://dev.example/projects/wanderer/inbox",
          "outbox": "https://dev.example/projects/wanderer/outbox",
          "followers": "https://dev.example/projects/wanderer/followers"
      }

4.5 subprojects

URI: https://forgefed.org/ns#subprojects

Notes: Identifies a Collection listing subprojects of this Project.

Domain: Project

Range: Collection of Projects

Functional: Yes

Inverse of: None, but see the usage of context in the Modeling specification

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://dev.example/projects/wanderer",
          "type": "Project",
      
          "name": "Wanderer",
          "summary": "3D nature exploration game",
          "subprojects": {
              "type": "Collection",
              "totalItems": 2,
              "items": [
                  "https://dev.example/projects/nature-3d-models",
                  "https://dev.example/projects/wanderer-fundraising"
              ]
          },
      
          "inbox": "https://dev.example/projects/wanderer/inbox",
          "outbox": "https://dev.example/projects/wanderer/outbox",
          "followers": "https://dev.example/projects/wanderer/followers"
      }

4.6 hasMember

URI: https://forgefed.org/ns#hasMember

Notes: Identifier a Person who is a member of this Team.

Domain: Team

Range: Person

Functional: No

Inverse of: (None)

Example:

4.7 members

URI: https://forgefed.org/ns#members

Notes: Identifies a collection of the members of this Team, represented as hasMember Relationships.

Domain: Team

Range: Collection of Relationships whose relationship is hasMember and whose subject is this Team.

Functional: Yes

Inverse of: (None)

Example:

4.8 subteams

URI: https://forgefed.org/ns#subteams

Notes: Identifies a collection of the subteams of this Team, i.e. teams whose members inherit the access that this team’s members have to projects and to project components (such as Repositorys).

Domain: Team

Range: Collection of Teams.

Functional: Yes

Inverse of: (None)

Example:

4.9 assignedTo

URI: https://forgefed.org/ns#assignedTo

Notes: Identifies the Person assigned to work on this Ticket.

Domain: Ticket

Range: Person

Functional: Yes

Inverse of: (None)

Example:

4.10 isResolved

URI: https://forgefed.org/ns#isResolved

Notes: Specifies whether the Ticket is closed, i.e. the work on it is done and it doesn’t need to attract attention anymore.

Domain: Ticket

Range: xsd:boolean

Functional: Yes

Inverse of: (None)

Example:

4.11 resolvedBy

URI: https://forgefed.org/ns#resolvedBy

Notes: Identifies the Actor who has resolved the Ticket, or the activity that has resolved the Ticket.

Domain: Ticket

Range: Object than is an actor, or Activity

Functional: Yes

Inverse of: (None)

Example:

4.12 resolved

URI: https://forgefed.org/ns#resolved

Notes: For a resolved Ticket, specifies the time the Ticket has been resolved.

Domain: Ticket

Range: xsd:dateTime

Functional: Yes

Inverse of: (None)

Example:

4.13 dependsOn

URI: https://forgefed.org/ns#dependsOn

Notes: Identifies one or more tickets on which this Ticket depends, i.e. it can’t be resolved without those tickets being resolved too.

Domain: Ticket

Range: Ticket

Functional: No

Inverse of: dependedBy

Example:

4.14 dependedBy

URI: https://forgefed.org/ns#dependedBy

Notes: Identifies one or more tickets which depend on this Ticket, i.e. they can’t be resolved without this tickets being resolved too.

Domain: Ticket

Range: Ticket

Functional: No

Inverse of: dependsOn

Example:

4.15 dependencies

URI: https://forgefed.org/ns#dependencies

Notes: Identifies a Collection of TicketDependency which specify tickets that this Ticket depends on, i.e. this ticket is the subject of the dependsOn relationship.

Domain: Ticket

Range: Collection of items of type TicketDependency

Functional: Yes

Inverse of: (None)

Example:

4.16 dependants

URI: https://forgefed.org/ns#dependants

Notes: Identifies a Collection of TicketDependency which specify tickets that depends on this Ticket, i.e. this ticket is the object of the dependsOn relationship. Often called “reverse dependencies”.

Domain: Ticket

Range: Collection of items of type TicketDependency

Functional: Yes

Inverse of: (None)

Example:

4.17 repository (DEPRECATED)

URI: https://forgefed.org/ns#repository

Notes: Identifies the repository to which a commit belongs. DEPRECATED: Use the standard ActivityPub context property instead.

Domain: Commit

Range: Repository

Functional: Yes

Inverse of: (None)

Example:

4.18 description

URI: https://forgefed.org/ns#description

Notes: Specifies the description text of a Commit, which is an optional possibly multi-line text provided in addition to the one-line commit title. The range of the description property works the same way the range of the ActivityPub source property works.

Domain: Commit

Range: Object, specifying content and mediaType. The mediaType SHOULD be "text/plain".

Functional: Yes

Inverse of: (None)

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://example.dev/alice/myrepo/commits/109ec9a09c7df7fec775d2ba0b9d466e5643ec8c",
          "type": "Commit",
          "context": "https://example.dev/alice/myrepo",
          "attributedTo": "https://example.dev/bob",
          "hash": "109ec9a09c7df7fec775d2ba0b9d466e5643ec8c",
          "created": "2019-07-11T12:34:56Z",
          "summary": "Add an installation script, fixes issue #89",
      
          "description": {
              "mediaType": "text/plain",
              "content": "It's about time people can install on their computers!"
          },
      }

4.19 cloneUri

URI: https://forgefed.org/ns#cloneUri

Notes: An endpoint that can be used with a VCS protocol such as Git or Mercurial to access a given repository.

Domain: Repository

Range: Object

Functional: No

Inverse of: (None)

Example:

4.20 committedBy

URI: https://forgefed.org/ns#committedBy

Notes: Identifies the actor (usually a person, but could be something else, e.g. a bot) that added a set of changes to the version-control Repository. Sometimes the author of the changes and the committer of those changes aren’t the same actor, in which case the committedBy property can be used to specify who added the changes to the repository. For example, when applying a patch to a repository, e.g. a Git repository, the author would be the person who made the patch, and the committer would be the person who applied the patch to their copy of the repository.

Domain: Commit

Range: Object

Functional: Yes

Inverse of: (None)

Example:

4.21 hash

URI: https://forgefed.org/ns#hash

Notes: Specifies the hash associated with a Commit, which is a unique identifier of the commit within the Repository, usually generated as a cryptographic hash function of some (or all) of the commit’s data or metadata. For example, in Git it would be the SHA1 hash of the commit; in Darcs it would be the SHA1 hash of the patch info.

Domain: Commit

Range: xsd:string of hexadecimal digit ASCII characters

Functional: Yes

Inverse of: (None)

Example:

4.22 committed

URI: https://forgefed.org/ns#committed

Notes: Specifies the time that a set of changes was committed into the Repository and became a Commit in it. This can be different from the time the set of changes was produced, e.g. if one person creates a patch and sends to another, and the other person then applies the patch to their copy of the repository. We call the former event “created” and the latter event “committed”, and this latter event is specified by the committed property.

Domain: Commit

Range: xsd:dateTime

Functional: Yes

Inverse of: (None)

Example:

4.23 filesAdded

URI: https://forgefed.org/ns#filesAdded

Notes: Specifies a filename, as a relative path, relative to the top of the tree of files in the Repository, of a file that got added in this Commit, and didn’t exist in the previous version of the tree.

Domain: Commit

Range: xsd:string

Functional: No

Inverse of: (None)

Example:

4.24 filesModified

URI: https://forgefed.org/ns#filesModified

Notes: Specifies a filename, as a relative path, relative to the top of the tree of files in the Repository, of a file that existed in the previous version of the tree, and its contents got modified in this Commit.

Domain: Commit

Range: xsd:string

Functional: No

Inverse of: (None)

Example:

4.25 filesRemoved

URI: https://forgefed.org/ns#filesRemoved

Notes: Specifies a filename, as a relative path, relative to the top of the tree of files in the Repository, of a file that existed in the previous version of the tree, and got removed from the tree in this Commit.

Domain: Commit

Range: xsd:string

Functional: No

Inverse of: (None)

Example:

4.26 ref

URI: https://forgefed.org/ns#ref

Notes: Specifies an identifier for a Branch, that is used in the Repository to uniquely refer to it. For example, in Git, “refs/heads/master” would be the ref of the master branch.

Domain: Branch

Range: xsd:string

Functional: Yes

Inverse of: (None)

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://example.dev/luke/myrepo/branches/master",
          "type": "Branch",
          "name": "master",
          "context": "https://example.dev/luke/myrepo",
      
          "ref": "refs/heads/master"
      }

4.27 team

URI: https://forgefed.org/ns#team

Notes:: Specifies a Collection of actors who are working on the object, or responsible for it, or managing or administrating it, or having edit access to it. For example, for a Repository, it could be the people who have push/edit access, the “collaborators” of the repository.

Domain: Object

Range: Collection of actors

Functional: Yes

Inverse of: (None)

Example:

A repository https://dev.example/aviva/treesim:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://w3id.org/security/v1",
              "https://forgefed.org/ns"
          ],
          "id": "https://dev.example/aviva/treesim",
          "type": "Repository",
          "publicKey": {
              "id": "https://dev.example/aviva/treesim#main-key",
              "owner": "https://dev.example/aviva/treesim",
              "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhki....."
          },
          "inbox": "https://dev.example/aviva/treesim/inbox",
          "outbox": "https://dev.example/aviva/treesim/outbox",
          "followers": "https://dev.example/aviva/treesim/followers",
          "name": "Tree Growth 3D Simulation",
          "summary": "<p>Tree growth 3D simulator for my nature exploration game</p>",
      
          "team": "https://dev.example/aviva/treesim/team"
      }

The repository’s team https://dev.example/aviva/treesim/team:

{
          "@context": "https://www.w3.org/ns/activitystreams",
          "id": "https://dev.example/aviva/treesim/team",
          "type": "Collection",
          "totalItems": 3,
          "items": [
              "https://dev.example/aviva",
              "https://dev.example/luke",
              "https://code.community/users/lorax"
          ]
      }

4.28 ticketsTrackedBy

URI: https://forgefed.org/ns#ticketsTrackedBy

Notes: Identifies the actor which tracks tickets related to the given object. This is the actor to whom you send tickets you’d like to open against the object.

Domain: Object

Range: Object that is an actor

Functional: Yes

Inverse of: tracksTicketsFor

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://dev.example/aviva/treesim",
          "type": "Repository",
          "name": "Tree Growth 3D Simulation",
          "summary": "<p>Tree growth 3D simulator for my nature exploration game</p>",
          "ticketsTrackedBy": "https://bugs.example/projects/treesim"
      }

4.29 tracksTicketsFor

URI: https://forgefed.org/ns#tracksTicketsFor

Notes: Identifies objects for which which this ticket tracker tracks tickets. When you’d like to open a ticket against those objects, you can send them to this tracker.

Domain: Object that is an actor

Range: Object

Functional: No

Inverse of: ticketsTrackedBy

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://bugs.example/treesim",
          "type": "Project",
          "tracksTicketsFor": [
              "https://dev.example/aviva/liblsystem",
              "https://dev.example/aviva/3d-tree-models",
              "https://dev.example/aviva/treesim"
          ]
      }

4.30 sendPatchesTo

URI: https://forgefed.org/ns#sendPatchesTo

Notes: Identifies the PatchTracker which tracks patches and merge requests related to the given repository. This is the actor to whom you send patches and merge requests you’d like to open against the repository.

Domain: Repository

Range: PatchTracker

Functional: Yes

Inverse of: tracksPatchesFor

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://dev.example/repos/treesim",
          "type": "Repository",
          "name": "Tree Growth 3D Simulation",
          "summary": "<p>Tree growth 3D simulator for my nature exploration game</p>",
          "sendPatchesTo": "https://bugs.example/pr-trackers/treesim"
      }

4.31 tracksPatchesFor

URI: https://forgefed.org/ns#tracksPatchesFor

Notes: Identifies a repository for which which this patch and merge request tracker tracks patches and merge requests. When you’d like to open patches or merge requests against that repository, you can send them to this tracker.

Domain: PatchTracker

Range: Repository

Functional: No

Inverse of: sendPatchesTo

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://project.example/treesim",
          "type": "PatchTracker",
          "tracksPatchesFor": [
              "https://dev.example/aviva/liblsystem",
              "https://dev.example/aviva/3d-tree-models",
              "https://dev.example/aviva/treesim"
          ]
      }

4.32 forkedFrom

URI: https://forgefed.org/ns#forkedFrom

Notes: Identifies the Repository which this Repository was created as a fork of, i.e. by cloning it.

Domain: Repository

Range: Repository

Functional: Yes

Inverse of: forks

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://example.dev/alice/myfork/",
          "type": "Repository",
          "forkedFrom": {
              "type": "Repository",
              "id": "https://example.dev/luke/myrepo/"
          }
      }

4.33 forks

URI: https://forgefed.org/ns#forks

Notes: Identifies an OrderedCollection of Repositorys which were created as forks of this Repository, i.e. by cloning it. The order of the collection items is by reverse chronological order of the forking events.

Domain: Repository

Range: OrderedCollection of items of type Repository

Functional: Yes

Inverse of: forkedFrom

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://example.dev/luke/myrepo/",
          "type": "Repository",
          "forks": {
              "type": "OrderedCollection",
              "totalItems": 1,
              "orderedItems": [
                  {
                      "id": "https://example.dev/alice/myfork/",
                      "type": "Repository",
                  }
              ]
          },
      }

4.34 fulfills

URI: https://forgefed.org/ns#fulfills

Notes: For an activity A that fulfills some other activity B, specifies that A has been published as part of fulfilling the action requested by B. For example, if Alice creates a new repository using Create, she may want to instantly automatically start following this new repository using Follow (to be notified when her friends push commits there). This Follow fulfills the Create; it’s an activity automatically sent as part of creating a new repository.

Domain: Activity

Range: Activity

Functional: No

Inverse of: None

Example:

4.35 allows

URI: https://forgefed.org/ns#allows

Notes: Specifies which modes of using this Grant are being allowd by it. The two conceptual operations that Grants support are invocation (acting on the resource under the specified role) and delegation (passing on the access to more actors, possibly with reduced privileges). This property specifies which of these operations are supported, and under which conditions. See CapabilityUsage for specific values to use.

Domain: Grant

Range: CapabilityUsage

Functional: No

Inverse of: None

Example:

4.36 capability

URI: https://forgefed.org/ns#capability

Notes: Specifies a previously published Grant activity providing relevant access permissions. For example, if Alice wants to resolve a Ticket under some project, she will send an activity with capability referring to the Grant activity that gave her collaborator access to that project, which happens to include permission to resolve tickets.

Domain: Activity

Range: Grant

Functional: Yes

Inverse of: None

Example:

4.37 managedBy

URI: https://forgefed.org/ns#managedBy

Notes: Identifies the actor that controls the given resource, and to whom activities asking to modify the resource may be submitted.

Domain: Object

Range: Object than is an actor

Functional: Yes

Inverse of: (None)

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "type": "Ticket",
          "id": "https://example.dev/alice/myrepo/issues/42",
          "context": "https://example.dev/alice/myrepo",
          "managedBy": "https://example.dev/alice/myrepo",
          "attributedTo": "https://dev.community/bob",
          "summary": "Nothing works!",
          "content": "<p>Please fix. <i>Everything</i> is broken!</p>",
          "mediaType": "text/html",
          "source": {
              "content": "Please fix. *Everything* is broken!",
              "mediaType": "text/markdown; variant=CommonMark"
          },
          "isResolved": false
      }

4.38 mirrors

URI: https://forgefed.org/ns#mirrors

Notes: Identifies the Repository which this Repository copies content from (ie. what this repository is a “pull mirror” of).

Domain: Repository

Range: Repository

Functional: Yes

Inverse of: mirroredBy

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://example.dev/alice/mymirror/",
          "type": "Repository",
          "mirrors": {
              "type": "Repository",
              "id": "https://example.dev/luke/myrepo/"
          }
      }

4.39 mirroredBy

URI: https://forgefed.org/ns#mirroredby

Notes: Identifies a Repository which copies content from this repository (ie. “pull mirror” of this repository).

Domain: Repository

Range: Repository

Functional: No

Inverse of: mirrors

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://example.dev/luke/myrepo/",
          "type": "Repository",
          "mirroredBy": {
              "type": "Repository",
              "id": "https://example.dev/alice/mymirror/"
          }
      }

4.40 mirrorsTo

URI: https://forgefed.org/ns#mirrorsto

Notes: Identifies a Repository which this repository copies content to (ie. “push mirror” of this repository)

Domain: Repository

Range: Repository

Functional: No

Inverse of: mirroredFrom

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://example.dev/alice/myrepo/",
          "type": "Repository",
          "mirrorsTo": {
              "type": "Repository",
              "id": "https://example.dev/alice-backup/myrepo/"
          }
      }

4.41 mirroredFrom

URI: https://forgefed.org/ns#mirroredfrom

Notes: Identifies the Repository which copies its content to this Repository (ie. what this repository is a “push mirror” of).

Domain: Repository

Range: Repository

Functional: Yes

Inverse of: mirrorsto

Example:

{
          "@context": [
              "https://www.w3.org/ns/activitystreams",
              "https://forgefed.org/ns"
          ],
          "id": "https://example.dev/alice-backup/myrepo/",
          "type": "Repository",
          "mirroredFrom": {
              "type": "Repository",
              "id": "https://example.dev/alice/myrepo/"
          }
      }

4.42 delegates

URI: https://forgefed.org/ns#delegates

Notes: Actors can use Grant activities to allow other actors to access their resources. They can also allow those other actors to pass on (delegate) this access to even more actors. For a Grant that delegates access provided by an earlier Grant, the former uses delegates to specify the latter. That earlier Grant is also called the “parent capability” of this Grant.

Domain: Grant

Range: Grant

Functional: Yes

Inverse of: None

Example: