dev.knotless.repo
Schema Diff
+48 -1
Compatibility Analysis
Breaking Changes Detected
1 breaking change, 17 non-breaking changes.
Breaking Changes (1)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "dev.knotless.repo#reader", src: "dev.knotless.repo#reader", tgt: "dev.knotless.repo#reader.did", kind: "prop", name: Some("did") }
Non-Breaking Changes (17)
- AddedVertex AddedVertex { vertex_id: "dev.knotless.repo#reader" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.repo#reader.did" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.repo#reviews" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.repo#reviews.approvals" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.repo#reviews.codeOwners" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.repo#reviews.dismissStale" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.repo#rule.reviews" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.repo:body.readers" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.repo:body.readers:items" }
- AddedEdge AddedEdge { src: "dev.knotless.repo#reviews", tgt: "dev.knotless.repo#reviews.approvals", kind: "prop", name: Some("approvals") }
- AddedEdge AddedEdge { src: "dev.knotless.repo#reviews", tgt: "dev.knotless.repo#reviews.codeOwners", kind: "prop", name: Some("codeOwners") }
- AddedEdge AddedEdge { src: "dev.knotless.repo#reviews", tgt: "dev.knotless.repo#reviews.dismissStale", kind: "prop", name: Some("dismissStale") }
- AddedEdge AddedEdge { src: "dev.knotless.repo#rule", tgt: "dev.knotless.repo#rule.reviews", kind: "prop", name: Some("reviews") }
- AddedEdge AddedEdge { src: "dev.knotless.repo#rule.reviews", tgt: "dev.knotless.repo#reviews", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "dev.knotless.repo:body", tgt: "dev.knotless.repo:body.readers", kind: "prop", name: Some("readers") }
- AddedEdge AddedEdge { src: "dev.knotless.repo:body.readers", tgt: "dev.knotless.repo:body.readers:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "dev.knotless.repo:body.readers:items", tgt: "dev.knotless.repo#reader", kind: "ref", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "dev.knotless.repo#reader" }AddedVertex { vertex_id: "dev.knotless.repo#reader.did" }AddedVertex { vertex_id: "dev.knotless.repo#reviews" }AddedVertex { vertex_id: "dev.knotless.repo#reviews.approvals" }AddedVertex { vertex_id: "dev.knotless.repo#reviews.codeOwners" }AddedVertex { vertex_id: "dev.knotless.repo#reviews.dismissStale" }AddedVertex { vertex_id: "dev.knotless.repo#rule.reviews" }AddedVertex { vertex_id: "dev.knotless.repo:body.readers" }AddedVertex { vertex_id: "dev.knotless.repo:body.readers:items" }
Additional Notes
- Breaking: RequiredEdgeAdded { vertex_id: "dev.knotless.repo#reader", src: "dev.knotless.repo#reader", tgt: "dev.knotless.repo#reader.did", kind: "prop", name: Some("did") }
- Non-breaking: AddedEdge { src: "dev.knotless.repo#reviews", tgt: "dev.knotless.repo#reviews.approvals", kind: "prop", name: Some("approvals") }
- Non-breaking: AddedEdge { src: "dev.knotless.repo#reviews", tgt: "dev.knotless.repo#reviews.codeOwners", kind: "prop", name: Some("codeOwners") }
- Non-breaking: AddedEdge { src: "dev.knotless.repo#reviews", tgt: "dev.knotless.repo#reviews.dismissStale", kind: "prop", name: Some("dismissStale") }
- Non-breaking: AddedEdge { src: "dev.knotless.repo#rule", tgt: "dev.knotless.repo#rule.reviews", kind: "prop", name: Some("reviews") }
- Non-breaking: AddedEdge { src: "dev.knotless.repo#rule.reviews", tgt: "dev.knotless.repo#reviews", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "dev.knotless.repo:body", tgt: "dev.knotless.repo:body.readers", kind: "prop", name: Some("readers") }
- Non-breaking: AddedEdge { src: "dev.knotless.repo:body.readers", tgt: "dev.knotless.repo:body.readers:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "dev.knotless.repo:body.readers:items", tgt: "dev.knotless.repo#reader", kind: "ref", name: None }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
4
"agent": {
5
5
"description": "An account whose pulls are checked as they move, as code no one vouches for.",
6
6
"properties": {
7
7
"did": {
8
8
"format": "did",
9
9
"type": "string"
10
10
}
11
11
},
12
12
"required": [
13
13
"did"
14
14
],
15
15
"type": "object"
16
16
},
17
17
"appview": {
18
18
"description": "An appview the owner lets keep an index of a private repository.",
19
19
"properties": {
20
20
"did": {
21
21
"description": "The appview's service DID, as did:web:knotless.dev.",
22
22
"format": "did",
23
23
"type": "string"
24
24
}
25
25
},
26
26
"required": [
27
27
"did"
28
28
],
29
29
"type": "object"
30
30
},
31
31
"collaborator": {
32
32
"description": "An account that may push to the repository.",
33
33
"properties": {
34
34
"did": {
35
35
"format": "did",
36
36
"type": "string"
37
37
}
38
38
},
39
39
"required": [
40
40
"did"
41
41
],
42
42
"type": "object"
43
43
},
44
44
"label": {
45
45
"description": "A label pulls and issues may carry.",
46
46
"properties": {
47
47
"color": {
48
48
"description": "A hex color, as #d73a4a.",
49
49
"maxLength": 7,
50
50
"type": "string"
51
51
},
52
52
"description": {
53
53
"description": "What the label means, for those who put it on.",
54
54
"maxGraphemes": 200,
55
55
"maxLength": 1000,
56
56
"type": "string"
57
57
},
58
58
"exclusive": {
59
59
"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.",
60
60
"type": "boolean"
61
61
},
62
62
"name": {
63
63
"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.",
64
64
"maxGraphemes": 50,
65
65
"maxLength": 100,
66
66
"type": "string"
67
67
}
68
68
},
69
69
"required": [
70
70
"name"
71
71
],
72
72
"type": "object"
73
73
},
74
74
"main": {
75
75
"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.",
76
76
"key": "any",
77
77
"record": {
78
78
"properties": {
79
79
"agents": {
80
80
"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.",
81
81
"items": {
82
82
"ref": "#agent",
83
83
"type": "ref"
84
84
},
85
85
"maxLength": 32,
86
86
"type": "array"
87
87
},
88
88
"appviews": {
89
89
"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.",
90
90
"items": {
91
91
"ref": "#appview",
92
92
"type": "ref"
93
93
},
94
94
"maxLength": 32,
95
95
"type": "array"
96
96
},
97
97
"collaborators": {
98
98
"description": "Accounts that may push. They push through a gateway the owner has delegated writes to, which checks this list.",
99
99
"items": {
100
100
"ref": "#collaborator",
101
101
"type": "ref"
102
102
},
103
103
"maxLength": 1000,
104
104
"type": "array"
105
105
},
106
106
"createdAt": {
107
107
"format": "datetime",
108
108
"type": "string"
109
109
},
110
110
"defaultBranch": {
111
111
"description": "The branch HEAD points at, without refs/heads/.",
112
112
"maxLength": 255,
113
113
"type": "string"
114
114
},
115
115
"description": {
116
116
"maxGraphemes": 300,
117
117
"maxLength": 3000,
118
118
"type": "string"
119
119
},
120
120
"forkOf": {
121
121
"description": "The repository this one was forked from.",
122
122
"ref": "dev.knotless.defs#repoRef",
123
123
"type": "ref"
124
124
},
125
125
"gateway": {
126
126
"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.",
127
127
"format": "did",
128
128
"type": "string"
129
129
},
130
130
"key": {
131
131
"description": "Minted when the repository is created; never reused. The `repo` of its dev.knotless.ref, dev.knotless.claim and dev.knotless.pack records.",
132
132
"format": "tid",
133
133
"type": "string"
134
134
},
135
135
"labels": {
136
136
"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.",
137
137
"items": {
138
138
"ref": "#label",
139
139
"type": "ref"
140
140
},
141
141
"maxLength": 200,
142
142
"type": "array"
143
143
},
144
144
"links": {
145
145
"description": "Links shown on the repository's pages, in display order: its website first.",
146
146
"items": {
147
147
"ref": "dev.knotless.defs#link",
148
148
"type": "ref"
149
149
},
150
150
"maxLength": 5,
151
151
"type": "array"
152
152
},
153
153
"name": {
154
154
"description": "Equal to the record key.",
155
155
"maxLength": 100,
156
156
"type": "string"
157
157
},
158
+
"readers": {
159
+
"description": "For a private repository, the accounts it is shared with to read but not to push: members of its space. An appview takes this as the owner's word that they may hear of what is said there.",
160
+
"items": {
161
+
"ref": "#reader",
162
+
"type": "ref"
163
+
},
164
+
"maxLength": 1000,
165
+
"type": "array"
166
+
},
158
167
"rules": {
159
168
"description": "Protected branches. The gateway holds collaborators to them; the owner, who writes these records directly, is held only by their own client.",
160
169
"items": {
161
170
"ref": "#rule",
162
171
"type": "ref"
163
172
},
164
173
"maxLength": 100,
165
174
"type": "array"
166
175
},
167
176
"runners": {
168
177
"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.",
169
178
"items": {
170
179
"ref": "#runner",
171
180
"type": "ref"
172
181
},
173
182
"maxLength": 32,
174
183
"type": "array"
175
184
},
176
185
"transfer": {
177
186
"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.",
178
187
"ref": "dev.knotless.defs#repoRef",
179
188
"type": "ref"
180
189
},
181
190
"transferredFrom": {
182
191
"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.",
183
192
"ref": "dev.knotless.defs#repoRef",
184
193
"type": "ref"
185
194
},
186
195
"triagers": {
187
196
"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.",
188
197
"items": {
189
198
"ref": "#triager",
190
199
"type": "ref"
191
200
},
192
201
"maxLength": 32,
193
202
"type": "array"
194
203
}
195
204
},
196
205
"required": [
197
206
"key",
198
207
"name",
199
208
"createdAt"
200
209
],
201
210
"type": "object"
202
211
},
203
212
"type": "record"
204
213
},
214
+
"reader": {
215
+
"description": "An account a private repository is shared with to read.",
216
+
"properties": {
217
+
"did": {
218
+
"format": "did",
219
+
"type": "string"
220
+
}
221
+
},
222
+
"required": [
223
+
"did"
224
+
],
225
+
"type": "object"
226
+
},
227
+
"reviews": {
228
+
"description": "The reviews a protected branch asks of a pull before it merges, counted from those who may write to the repository: its owner and collaborators. A review is a dev.knotless.comment with a verdict, and each reviewer's newest one stands. A standing request for changes from one of them blocks the merge. A reader that finds a field here it does not know merges into the branch only once it knows it, so a rule is never held more loosely than it was written.",
229
+
"properties": {
230
+
"approvals": {
231
+
"description": "How many approvals the pull needs, from accounts other than its author. Absent is 0.",
232
+
"maximum": 10,
233
+
"minimum": 0,
234
+
"type": "integer"
235
+
},
236
+
"codeOwners": {
237
+
"description": "Each path the pull changes that the CODEOWNERS file on the target branch gives owners needs an approval from one of them. Absent is false.",
238
+
"type": "boolean"
239
+
},
240
+
"dismissStale": {
241
+
"description": "Only an approval of the pull's head as it is now counts: one of an earlier head no longer does. Absent is false, and any standing approval counts.",
242
+
"type": "boolean"
243
+
}
244
+
},
245
+
"type": "object"
246
+
},
205
247
"rule": {
206
-
"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.",
248
+
"description": "A protected branch: through a gateway it only moves forward and is never deleted, and, as its rule says, takes no merge commits, takes pulls only through the merge queue, or takes a pull only once it is reviewed.",
207
249
"properties": {
208
250
"branch": {
209
251
"description": "The branch, without refs/heads/.",
210
252
"maxLength": 255,
211
253
"type": "string"
212
254
},
213
255
"history": {
214
256
"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.",
215
257
"knownValues": [
216
258
"linear",
217
259
"merges"
218
260
],
219
261
"maxLength": 64,
220
262
"type": "string"
221
263
},
222
264
"queue": {
223
265
"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.",
224
266
"type": "boolean"
267
+
},
268
+
"reviews": {
269
+
"description": "The reviews a pull needs before it merges into this branch. Absent, none.",
270
+
"ref": "#reviews",
271
+
"type": "ref"
225
272
}
226
273
},
227
274
"required": [
228
275
"branch"
229
276
],
230
277
"type": "object"
231
278
},
232
279
"runner": {
233
280
"description": "An account whose dev.knotless.check records about the repository readers trust.",
234
281
"properties": {
235
282
"did": {
236
283
"format": "did",
237
284
"type": "string"
238
285
}
239
286
},
240
287
"required": [
241
288
"did"
242
289
],
243
290
"type": "object"
244
291
},
245
292
"scope": {
246
293
"description": "A scope of labels a triager may put on.",
247
294
"properties": {
248
295
"name": {
249
296
"description": "As kind is kind/bug's: a label's name up to its last `/`.",
250
297
"maxLength": 100,
251
298
"type": "string"
252
299
}
253
300
},
254
301
"required": [
255
302
"name"
256
303
],
257
304
"type": "object"
258
305
},
259
306
"triager": {
260
307
"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.",
261
308
"properties": {
262
309
"did": {
263
310
"format": "did",
264
311
"type": "string"
265
312
},
266
313
"scopes": {
267
314
"description": "The scopes of the labels it may put on. None, when absent.",
268
315
"items": {
269
316
"ref": "#scope",
270
317
"type": "ref"
271
318
},
272
319
"maxLength": 50,
273
320
"type": "array"
274
321
}
275
322
},
276
323
"required": [
277
324
"did"
278
325
],
279
326
"type": "object"
280
327
}
281
328
},
282
329
"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.",
283
330
"id": "dev.knotless.repo",
284
331
"lexicon": 1
285
332
}