dev.knotless.repo
Schema Diff
+22 -0
Compatibility Analysis
Breaking Changes Detected
1 breaking change, 7 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 (7)
- AddedVertex AddedVertex { vertex_id: "dev.knotless.repo#reader" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.repo#reader.did" }
- 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: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: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: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
+
},
205
227
"reviews": {
206
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.",
207
229
"properties": {
208
230
"approvals": {
209
231
"description": "How many approvals the pull needs, from accounts other than its author. Absent is 0.",
210
232
"maximum": 10,
211
233
"minimum": 0,
212
234
"type": "integer"
213
235
},
214
236
"codeOwners": {
215
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.",
216
238
"type": "boolean"
217
239
},
218
240
"dismissStale": {
219
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.",
220
242
"type": "boolean"
221
243
}
222
244
},
223
245
"type": "object"
224
246
},
225
247
"rule": {
226
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.",
227
249
"properties": {
228
250
"branch": {
229
251
"description": "The branch, without refs/heads/.",
230
252
"maxLength": 255,
231
253
"type": "string"
232
254
},
233
255
"history": {
234
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.",
235
257
"knownValues": [
236
258
"linear",
237
259
"merges"
238
260
],
239
261
"maxLength": 64,
240
262
"type": "string"
241
263
},
242
264
"queue": {
243
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.",
244
266
"type": "boolean"
245
267
},
246
268
"reviews": {
247
269
"description": "The reviews a pull needs before it merges into this branch. Absent, none.",
248
270
"ref": "#reviews",
249
271
"type": "ref"
250
272
}
251
273
},
252
274
"required": [
253
275
"branch"
254
276
],
255
277
"type": "object"
256
278
},
257
279
"runner": {
258
280
"description": "An account whose dev.knotless.check records about the repository readers trust.",
259
281
"properties": {
260
282
"did": {
261
283
"format": "did",
262
284
"type": "string"
263
285
}
264
286
},
265
287
"required": [
266
288
"did"
267
289
],
268
290
"type": "object"
269
291
},
270
292
"scope": {
271
293
"description": "A scope of labels a triager may put on.",
272
294
"properties": {
273
295
"name": {
274
296
"description": "As kind is kind/bug's: a label's name up to its last `/`.",
275
297
"maxLength": 100,
276
298
"type": "string"
277
299
}
278
300
},
279
301
"required": [
280
302
"name"
281
303
],
282
304
"type": "object"
283
305
},
284
306
"triager": {
285
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.",
286
308
"properties": {
287
309
"did": {
288
310
"format": "did",
289
311
"type": "string"
290
312
},
291
313
"scopes": {
292
314
"description": "The scopes of the labels it may put on. None, when absent.",
293
315
"items": {
294
316
"ref": "#scope",
295
317
"type": "ref"
296
318
},
297
319
"maxLength": 50,
298
320
"type": "array"
299
321
}
300
322
},
301
323
"required": [
302
324
"did"
303
325
],
304
326
"type": "object"
305
327
}
306
328
},
307
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.",
308
330
"id": "dev.knotless.repo",
309
331
"lexicon": 1
310
332
}