dev.knotless.repo
Schema Diff
+26 -1
Compatibility Analysis
Backward Compatible
Backward compatible. 10 non-breaking changes.
Non-Breaking Changes (10)
- 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" }
- 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 }
Migration Guidance
Added Elements
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" }
Additional Notes
- 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 }
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
158
"rules": {
159
159
"description": "Protected branches. The gateway holds collaborators to them; the owner, who writes these records directly, is held only by their own client.",
160
160
"items": {
161
161
"ref": "#rule",
162
162
"type": "ref"
163
163
},
164
164
"maxLength": 100,
165
165
"type": "array"
166
166
},
167
167
"runners": {
168
168
"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
169
"items": {
170
170
"ref": "#runner",
171
171
"type": "ref"
172
172
},
173
173
"maxLength": 32,
174
174
"type": "array"
175
175
},
176
176
"transfer": {
177
177
"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
178
"ref": "dev.knotless.defs#repoRef",
179
179
"type": "ref"
180
180
},
181
181
"transferredFrom": {
182
182
"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
183
"ref": "dev.knotless.defs#repoRef",
184
184
"type": "ref"
185
185
},
186
186
"triagers": {
187
187
"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
188
"items": {
189
189
"ref": "#triager",
190
190
"type": "ref"
191
191
},
192
192
"maxLength": 32,
193
193
"type": "array"
194
194
}
195
195
},
196
196
"required": [
197
197
"key",
198
198
"name",
199
199
"createdAt"
200
200
],
201
201
"type": "object"
202
202
},
203
203
"type": "record"
204
204
},
205
+
"reviews": {
206
+
"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
+
"properties": {
208
+
"approvals": {
209
+
"description": "How many approvals the pull needs, from accounts other than its author. Absent is 0.",
210
+
"maximum": 10,
211
+
"minimum": 0,
212
+
"type": "integer"
213
+
},
214
+
"codeOwners": {
215
+
"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
+
"type": "boolean"
217
+
},
218
+
"dismissStale": {
219
+
"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
+
"type": "boolean"
221
+
}
222
+
},
223
+
"type": "object"
224
+
},
205
225
"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.",
226
+
"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
227
"properties": {
208
228
"branch": {
209
229
"description": "The branch, without refs/heads/.",
210
230
"maxLength": 255,
211
231
"type": "string"
212
232
},
213
233
"history": {
214
234
"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
235
"knownValues": [
216
236
"linear",
217
237
"merges"
218
238
],
219
239
"maxLength": 64,
220
240
"type": "string"
221
241
},
222
242
"queue": {
223
243
"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
244
"type": "boolean"
245
+
},
246
+
"reviews": {
247
+
"description": "The reviews a pull needs before it merges into this branch. Absent, none.",
248
+
"ref": "#reviews",
249
+
"type": "ref"
225
250
}
226
251
},
227
252
"required": [
228
253
"branch"
229
254
],
230
255
"type": "object"
231
256
},
232
257
"runner": {
233
258
"description": "An account whose dev.knotless.check records about the repository readers trust.",
234
259
"properties": {
235
260
"did": {
236
261
"format": "did",
237
262
"type": "string"
238
263
}
239
264
},
240
265
"required": [
241
266
"did"
242
267
],
243
268
"type": "object"
244
269
},
245
270
"scope": {
246
271
"description": "A scope of labels a triager may put on.",
247
272
"properties": {
248
273
"name": {
249
274
"description": "As kind is kind/bug's: a label's name up to its last `/`.",
250
275
"maxLength": 100,
251
276
"type": "string"
252
277
}
253
278
},
254
279
"required": [
255
280
"name"
256
281
],
257
282
"type": "object"
258
283
},
259
284
"triager": {
260
285
"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
286
"properties": {
262
287
"did": {
263
288
"format": "did",
264
289
"type": "string"
265
290
},
266
291
"scopes": {
267
292
"description": "The scopes of the labels it may put on. None, when absent.",
268
293
"items": {
269
294
"ref": "#scope",
270
295
"type": "ref"
271
296
},
272
297
"maxLength": 50,
273
298
"type": "array"
274
299
}
275
300
},
276
301
"required": [
277
302
"did"
278
303
],
279
304
"type": "object"
280
305
}
281
306
},
282
307
"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
308
"id": "dev.knotless.repo",
284
309
"lexicon": 1
285
310
}