peer-ai-workflow 1.0.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +129 -0
- package/dist/config.d.ts +750 -0
- package/dist/config.js +392 -0
- package/dist/ids.d.ts +67 -0
- package/dist/ids.js +199 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +51 -0
- package/dist/report.d.ts +108 -0
- package/dist/report.js +169 -0
- package/dist/state.d.ts +261 -0
- package/dist/state.js +132 -0
- package/package.json +40 -0
- package/schemas/config-layer.schema.json +997 -0
- package/schemas/config.schema.json +1002 -0
- package/schemas/map.schema.json +102 -0
- package/schemas/review-report.schema.json +312 -0
- package/schemas/work-item.schema.json +415 -0
|
@@ -0,0 +1,1002 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"properties": {
|
|
5
|
+
"$schema": {
|
|
6
|
+
"type": "string"
|
|
7
|
+
},
|
|
8
|
+
"extends": {
|
|
9
|
+
"description": "A shared base config to inherit, as a path or package name. The project's values win; objects merge key by key and lists are replaced.",
|
|
10
|
+
"type": "string",
|
|
11
|
+
"minLength": 1
|
|
12
|
+
},
|
|
13
|
+
"version": {
|
|
14
|
+
"type": "number",
|
|
15
|
+
"const": 1
|
|
16
|
+
},
|
|
17
|
+
"project": {
|
|
18
|
+
"type": "object",
|
|
19
|
+
"properties": {
|
|
20
|
+
"name": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"minLength": 1
|
|
23
|
+
},
|
|
24
|
+
"description": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"minLength": 1
|
|
27
|
+
},
|
|
28
|
+
"stage": {
|
|
29
|
+
"description": "How strict the gates are: prototype asks for the essentials only, production for everything. Defaults to mvp.",
|
|
30
|
+
"type": "string",
|
|
31
|
+
"enum": [
|
|
32
|
+
"prototype",
|
|
33
|
+
"mvp",
|
|
34
|
+
"production"
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
"origin": {
|
|
38
|
+
"description": "new: nothing is built yet. existing: code or docs already exist; Peer AI reads them first and never overwrites them. Detected when omitted.",
|
|
39
|
+
"type": "string",
|
|
40
|
+
"enum": [
|
|
41
|
+
"new",
|
|
42
|
+
"existing"
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
"team": {
|
|
46
|
+
"description": "solo: nobody else reviews, so no second reviewer is asked for. Defaults to solo.",
|
|
47
|
+
"type": "string",
|
|
48
|
+
"enum": [
|
|
49
|
+
"solo",
|
|
50
|
+
"team"
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
"traits": {
|
|
54
|
+
"description": "What the product is or does that switches on extra rules: money, safety-critical data, several apps or tenants on one backend, offline use, live connections, uploads, AI features.",
|
|
55
|
+
"type": "array",
|
|
56
|
+
"items": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"enum": [
|
|
59
|
+
"money",
|
|
60
|
+
"safety-critical",
|
|
61
|
+
"several-audiences",
|
|
62
|
+
"offline",
|
|
63
|
+
"real-time",
|
|
64
|
+
"uploads",
|
|
65
|
+
"ai-features"
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"required": [
|
|
71
|
+
"name"
|
|
72
|
+
],
|
|
73
|
+
"additionalProperties": false
|
|
74
|
+
},
|
|
75
|
+
"tools": {
|
|
76
|
+
"minItems": 1,
|
|
77
|
+
"type": "array",
|
|
78
|
+
"items": {
|
|
79
|
+
"type": "string",
|
|
80
|
+
"enum": [
|
|
81
|
+
"claude-code",
|
|
82
|
+
"codex",
|
|
83
|
+
"cursor",
|
|
84
|
+
"copilot",
|
|
85
|
+
"gemini-cli",
|
|
86
|
+
"other"
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
"skills": {
|
|
91
|
+
"type": "object",
|
|
92
|
+
"properties": {
|
|
93
|
+
"commit": {
|
|
94
|
+
"description": "Commit the skills peer-ai render writes, for AI tools that can't run a setup step first. Defaults to false: they're rebuilt from the installed version and left out of git, and each tool's setup step writes them.",
|
|
95
|
+
"type": "boolean"
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"additionalProperties": false
|
|
99
|
+
},
|
|
100
|
+
"design": {
|
|
101
|
+
"type": "object",
|
|
102
|
+
"properties": {
|
|
103
|
+
"status": {
|
|
104
|
+
"type": "string",
|
|
105
|
+
"enum": [
|
|
106
|
+
"exists",
|
|
107
|
+
"to-be-produced",
|
|
108
|
+
"none"
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
"reference": {
|
|
112
|
+
"type": "string",
|
|
113
|
+
"minLength": 1,
|
|
114
|
+
"description": "A path relative to the project root, or a URL."
|
|
115
|
+
},
|
|
116
|
+
"tokens": {
|
|
117
|
+
"type": "string",
|
|
118
|
+
"minLength": 1,
|
|
119
|
+
"description": "A path relative to the project root, or a URL."
|
|
120
|
+
},
|
|
121
|
+
"authoritative": {
|
|
122
|
+
"description": "When true, layouts, spacing, type and colour are implemented exactly; nothing is invented.",
|
|
123
|
+
"type": "boolean"
|
|
124
|
+
},
|
|
125
|
+
"stopAfterSpecify": {
|
|
126
|
+
"description": "Designs are made outside the session from the specs; work waits after Specify until they land.",
|
|
127
|
+
"type": "boolean"
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
"required": [
|
|
131
|
+
"status"
|
|
132
|
+
],
|
|
133
|
+
"additionalProperties": false
|
|
134
|
+
},
|
|
135
|
+
"tracks": {
|
|
136
|
+
"minItems": 1,
|
|
137
|
+
"type": "array",
|
|
138
|
+
"items": {
|
|
139
|
+
"type": "object",
|
|
140
|
+
"properties": {
|
|
141
|
+
"id": {
|
|
142
|
+
"type": "string",
|
|
143
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$"
|
|
144
|
+
},
|
|
145
|
+
"kind": {
|
|
146
|
+
"type": "string",
|
|
147
|
+
"enum": [
|
|
148
|
+
"web",
|
|
149
|
+
"mobile",
|
|
150
|
+
"desktop",
|
|
151
|
+
"backend",
|
|
152
|
+
"infrastructure",
|
|
153
|
+
"library",
|
|
154
|
+
"cli",
|
|
155
|
+
"data",
|
|
156
|
+
"extension",
|
|
157
|
+
"embedded",
|
|
158
|
+
"other"
|
|
159
|
+
]
|
|
160
|
+
},
|
|
161
|
+
"path": {
|
|
162
|
+
"type": "string",
|
|
163
|
+
"minLength": 1,
|
|
164
|
+
"description": "A path relative to the project root, or a URL."
|
|
165
|
+
},
|
|
166
|
+
"repo": {
|
|
167
|
+
"description": "For an external track: the repository it lives in, such as acme/platform-api.",
|
|
168
|
+
"type": "string",
|
|
169
|
+
"minLength": 1
|
|
170
|
+
},
|
|
171
|
+
"stack": {
|
|
172
|
+
"type": "array",
|
|
173
|
+
"items": {
|
|
174
|
+
"type": "string",
|
|
175
|
+
"minLength": 1
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
"architecture": {
|
|
179
|
+
"description": "The architecture style, such as layered, modular-monolith, microservice, hexagonal, feature-first or mvvm. The project's architecture decisions are the source of truth; this label tells reviews and stack profiles what shape to expect.",
|
|
180
|
+
"type": "string",
|
|
181
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$"
|
|
182
|
+
},
|
|
183
|
+
"targets": {
|
|
184
|
+
"description": "Platforms this track ships to, such as ios, android, web, macos or chrome.",
|
|
185
|
+
"type": "array",
|
|
186
|
+
"items": {
|
|
187
|
+
"type": "string",
|
|
188
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$"
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
"uses": {
|
|
192
|
+
"description": "Tracks whose code this track shares, such as a core library. A change to one verifies both.",
|
|
193
|
+
"type": "array",
|
|
194
|
+
"items": {
|
|
195
|
+
"type": "string",
|
|
196
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$"
|
|
197
|
+
}
|
|
198
|
+
},
|
|
199
|
+
"consumes": {
|
|
200
|
+
"description": "Ids of the APIs this track calls.",
|
|
201
|
+
"type": "array",
|
|
202
|
+
"items": {
|
|
203
|
+
"type": "string",
|
|
204
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$"
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
"branch": {
|
|
208
|
+
"description": "The track's long-lived integration branch, when it has one. Work item branches start from it.",
|
|
209
|
+
"type": "string",
|
|
210
|
+
"minLength": 1
|
|
211
|
+
},
|
|
212
|
+
"deploy": {
|
|
213
|
+
"type": "object",
|
|
214
|
+
"properties": {
|
|
215
|
+
"target": {
|
|
216
|
+
"type": "string",
|
|
217
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$",
|
|
218
|
+
"description": "Where it runs, such as vercel, fly, aws-ecs, app-store or play-store."
|
|
219
|
+
},
|
|
220
|
+
"environments": {
|
|
221
|
+
"type": "array",
|
|
222
|
+
"items": {
|
|
223
|
+
"type": "string",
|
|
224
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$"
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
"required": [
|
|
229
|
+
"target"
|
|
230
|
+
],
|
|
231
|
+
"additionalProperties": false
|
|
232
|
+
},
|
|
233
|
+
"status": {
|
|
234
|
+
"type": "string",
|
|
235
|
+
"enum": [
|
|
236
|
+
"active",
|
|
237
|
+
"dormant",
|
|
238
|
+
"frozen",
|
|
239
|
+
"retiring",
|
|
240
|
+
"external"
|
|
241
|
+
],
|
|
242
|
+
"description": "active: being built or changed. dormant: not started; its activities do not run. frozen: it exists and is documented, not redesigned. retiring: being replaced; its behaviour is the reference until then. external: it lives in another repository and is read here, never changed."
|
|
243
|
+
},
|
|
244
|
+
"replacedBy": {
|
|
245
|
+
"description": "For a retiring track: the tracks replacing it.",
|
|
246
|
+
"minItems": 1,
|
|
247
|
+
"type": "array",
|
|
248
|
+
"items": {
|
|
249
|
+
"type": "string",
|
|
250
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$"
|
|
251
|
+
}
|
|
252
|
+
},
|
|
253
|
+
"note": {
|
|
254
|
+
"type": "string",
|
|
255
|
+
"minLength": 1
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
"required": [
|
|
259
|
+
"id",
|
|
260
|
+
"kind",
|
|
261
|
+
"status"
|
|
262
|
+
],
|
|
263
|
+
"additionalProperties": false
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
"apis": {
|
|
267
|
+
"type": "array",
|
|
268
|
+
"items": {
|
|
269
|
+
"type": "object",
|
|
270
|
+
"properties": {
|
|
271
|
+
"id": {
|
|
272
|
+
"type": "string",
|
|
273
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$"
|
|
274
|
+
},
|
|
275
|
+
"kind": {
|
|
276
|
+
"type": "string",
|
|
277
|
+
"enum": [
|
|
278
|
+
"http",
|
|
279
|
+
"graphql",
|
|
280
|
+
"rpc",
|
|
281
|
+
"websocket",
|
|
282
|
+
"events",
|
|
283
|
+
"in-process",
|
|
284
|
+
"package",
|
|
285
|
+
"cli"
|
|
286
|
+
],
|
|
287
|
+
"description": "in-process: an interface inside the app, such as a repository over local storage. package and cli: the public surface of a library or a command-line tool."
|
|
288
|
+
},
|
|
289
|
+
"providedBy": {
|
|
290
|
+
"description": "The track that provides this API. Omit it for a third-party or hosted service.",
|
|
291
|
+
"type": "string",
|
|
292
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$"
|
|
293
|
+
},
|
|
294
|
+
"contract": {
|
|
295
|
+
"type": "object",
|
|
296
|
+
"properties": {
|
|
297
|
+
"source": {
|
|
298
|
+
"type": "string",
|
|
299
|
+
"enum": [
|
|
300
|
+
"handwritten",
|
|
301
|
+
"openapi",
|
|
302
|
+
"asyncapi",
|
|
303
|
+
"graphql-schema",
|
|
304
|
+
"protobuf",
|
|
305
|
+
"types",
|
|
306
|
+
"docs"
|
|
307
|
+
],
|
|
308
|
+
"description": "Where the contract comes from. A generated source is the truth; any contract document is derived from it."
|
|
309
|
+
},
|
|
310
|
+
"location": {
|
|
311
|
+
"type": "string",
|
|
312
|
+
"minLength": 1,
|
|
313
|
+
"description": "A path relative to the project root, or a URL."
|
|
314
|
+
},
|
|
315
|
+
"checkDrift": {
|
|
316
|
+
"description": "Fail CI when the derived contract document no longer matches its source.",
|
|
317
|
+
"type": "boolean"
|
|
318
|
+
}
|
|
319
|
+
},
|
|
320
|
+
"required": [
|
|
321
|
+
"source"
|
|
322
|
+
],
|
|
323
|
+
"additionalProperties": false
|
|
324
|
+
},
|
|
325
|
+
"note": {
|
|
326
|
+
"type": "string",
|
|
327
|
+
"minLength": 1
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
"required": [
|
|
331
|
+
"id",
|
|
332
|
+
"kind"
|
|
333
|
+
],
|
|
334
|
+
"additionalProperties": false
|
|
335
|
+
}
|
|
336
|
+
},
|
|
337
|
+
"environments": {
|
|
338
|
+
"type": "array",
|
|
339
|
+
"items": {
|
|
340
|
+
"type": "object",
|
|
341
|
+
"properties": {
|
|
342
|
+
"id": {
|
|
343
|
+
"type": "string",
|
|
344
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$"
|
|
345
|
+
},
|
|
346
|
+
"production": {
|
|
347
|
+
"type": "boolean"
|
|
348
|
+
},
|
|
349
|
+
"url": {
|
|
350
|
+
"type": "string",
|
|
351
|
+
"minLength": 1
|
|
352
|
+
}
|
|
353
|
+
},
|
|
354
|
+
"required": [
|
|
355
|
+
"id"
|
|
356
|
+
],
|
|
357
|
+
"additionalProperties": false
|
|
358
|
+
}
|
|
359
|
+
},
|
|
360
|
+
"repo": {
|
|
361
|
+
"type": "object",
|
|
362
|
+
"properties": {
|
|
363
|
+
"host": {
|
|
364
|
+
"type": "string",
|
|
365
|
+
"enum": [
|
|
366
|
+
"github",
|
|
367
|
+
"gitlab",
|
|
368
|
+
"bitbucket",
|
|
369
|
+
"azure-devops",
|
|
370
|
+
"other"
|
|
371
|
+
]
|
|
372
|
+
},
|
|
373
|
+
"remote": {
|
|
374
|
+
"description": "The git remote, such as origin, or null for a local-only repo.",
|
|
375
|
+
"anyOf": [
|
|
376
|
+
{
|
|
377
|
+
"type": "string",
|
|
378
|
+
"minLength": 1
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
"type": "null"
|
|
382
|
+
}
|
|
383
|
+
]
|
|
384
|
+
},
|
|
385
|
+
"defaultBranch": {
|
|
386
|
+
"type": "string",
|
|
387
|
+
"minLength": 1
|
|
388
|
+
},
|
|
389
|
+
"branchNaming": {
|
|
390
|
+
"description": "A pattern such as feature/{ticket}-{slug}.",
|
|
391
|
+
"type": "string",
|
|
392
|
+
"minLength": 1
|
|
393
|
+
},
|
|
394
|
+
"commits": {
|
|
395
|
+
"type": "string",
|
|
396
|
+
"enum": [
|
|
397
|
+
"conventional",
|
|
398
|
+
"ticket-prefix",
|
|
399
|
+
"free"
|
|
400
|
+
]
|
|
401
|
+
},
|
|
402
|
+
"mergePolicy": {
|
|
403
|
+
"description": "pull-request is required once branch protection is on. local-merge suits only a solo, unprotected repo.",
|
|
404
|
+
"type": "string",
|
|
405
|
+
"enum": [
|
|
406
|
+
"pull-request",
|
|
407
|
+
"local-merge"
|
|
408
|
+
]
|
|
409
|
+
},
|
|
410
|
+
"pushEachCommit": {
|
|
411
|
+
"description": "Push every commit as it lands, for repos whose remote is the backup.",
|
|
412
|
+
"type": "boolean"
|
|
413
|
+
}
|
|
414
|
+
},
|
|
415
|
+
"additionalProperties": false
|
|
416
|
+
},
|
|
417
|
+
"tracker": {
|
|
418
|
+
"type": "object",
|
|
419
|
+
"properties": {
|
|
420
|
+
"kind": {
|
|
421
|
+
"type": "string",
|
|
422
|
+
"enum": [
|
|
423
|
+
"none",
|
|
424
|
+
"github",
|
|
425
|
+
"gitlab",
|
|
426
|
+
"linear",
|
|
427
|
+
"jira",
|
|
428
|
+
"other"
|
|
429
|
+
]
|
|
430
|
+
},
|
|
431
|
+
"ticketPrefix": {
|
|
432
|
+
"type": "string",
|
|
433
|
+
"minLength": 1
|
|
434
|
+
},
|
|
435
|
+
"project": {
|
|
436
|
+
"description": "The repo slug, project key or URL.",
|
|
437
|
+
"type": "string",
|
|
438
|
+
"minLength": 1
|
|
439
|
+
}
|
|
440
|
+
},
|
|
441
|
+
"required": [
|
|
442
|
+
"kind"
|
|
443
|
+
],
|
|
444
|
+
"additionalProperties": false
|
|
445
|
+
},
|
|
446
|
+
"commands": {
|
|
447
|
+
"type": "object",
|
|
448
|
+
"properties": {
|
|
449
|
+
"verify": {
|
|
450
|
+
"description": "Run before any work item is called done. null or omitted means none yet; creating one is the first build item.",
|
|
451
|
+
"anyOf": [
|
|
452
|
+
{
|
|
453
|
+
"type": "string",
|
|
454
|
+
"minLength": 1
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
"type": "null"
|
|
458
|
+
}
|
|
459
|
+
]
|
|
460
|
+
},
|
|
461
|
+
"test": {
|
|
462
|
+
"type": "string",
|
|
463
|
+
"minLength": 1
|
|
464
|
+
},
|
|
465
|
+
"lint": {
|
|
466
|
+
"type": "string",
|
|
467
|
+
"minLength": 1
|
|
468
|
+
},
|
|
469
|
+
"build": {
|
|
470
|
+
"type": "string",
|
|
471
|
+
"minLength": 1
|
|
472
|
+
}
|
|
473
|
+
},
|
|
474
|
+
"additionalProperties": false
|
|
475
|
+
},
|
|
476
|
+
"delivery": {
|
|
477
|
+
"type": "object",
|
|
478
|
+
"properties": {
|
|
479
|
+
"ci": {
|
|
480
|
+
"type": "string",
|
|
481
|
+
"enum": [
|
|
482
|
+
"none",
|
|
483
|
+
"existing"
|
|
484
|
+
],
|
|
485
|
+
"description": "existing: extend the project's pipeline. A second, parallel pipeline is never added."
|
|
486
|
+
},
|
|
487
|
+
"pipeline": {
|
|
488
|
+
"type": "string",
|
|
489
|
+
"minLength": 1,
|
|
490
|
+
"description": "A path relative to the project root, or a URL."
|
|
491
|
+
}
|
|
492
|
+
},
|
|
493
|
+
"required": [
|
|
494
|
+
"ci"
|
|
495
|
+
],
|
|
496
|
+
"additionalProperties": false
|
|
497
|
+
},
|
|
498
|
+
"standards": {
|
|
499
|
+
"type": "object",
|
|
500
|
+
"properties": {
|
|
501
|
+
"core": {
|
|
502
|
+
"description": "Apply Peer AI's core principles. Defaults to true.",
|
|
503
|
+
"type": "boolean"
|
|
504
|
+
},
|
|
505
|
+
"profiles": {
|
|
506
|
+
"description": "Stack profiles, such as react, express or python-fastapi.",
|
|
507
|
+
"type": "array",
|
|
508
|
+
"items": {
|
|
509
|
+
"type": "string",
|
|
510
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$"
|
|
511
|
+
}
|
|
512
|
+
},
|
|
513
|
+
"documents": {
|
|
514
|
+
"type": "array",
|
|
515
|
+
"items": {
|
|
516
|
+
"type": "object",
|
|
517
|
+
"properties": {
|
|
518
|
+
"path": {
|
|
519
|
+
"type": "string",
|
|
520
|
+
"minLength": 1,
|
|
521
|
+
"description": "A path relative to the project root, or a URL."
|
|
522
|
+
},
|
|
523
|
+
"role": {
|
|
524
|
+
"type": "string",
|
|
525
|
+
"enum": [
|
|
526
|
+
"standard",
|
|
527
|
+
"addendum",
|
|
528
|
+
"checklist"
|
|
529
|
+
]
|
|
530
|
+
},
|
|
531
|
+
"scope": {
|
|
532
|
+
"description": "Track ids this document governs. Omit for the whole project.",
|
|
533
|
+
"type": "array",
|
|
534
|
+
"items": {
|
|
535
|
+
"type": "string",
|
|
536
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$"
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
},
|
|
540
|
+
"required": [
|
|
541
|
+
"path",
|
|
542
|
+
"role"
|
|
543
|
+
],
|
|
544
|
+
"additionalProperties": false
|
|
545
|
+
}
|
|
546
|
+
},
|
|
547
|
+
"precedence": {
|
|
548
|
+
"description": "Which side wins a conflict. Defaults to project: the project's own documents win.",
|
|
549
|
+
"type": "string",
|
|
550
|
+
"enum": [
|
|
551
|
+
"project",
|
|
552
|
+
"core"
|
|
553
|
+
]
|
|
554
|
+
},
|
|
555
|
+
"onExisting": {
|
|
556
|
+
"description": "What the Standards activity does with existing documents: map each rule to its enforcer, or revise the documents.",
|
|
557
|
+
"type": "string",
|
|
558
|
+
"enum": [
|
|
559
|
+
"map",
|
|
560
|
+
"revise"
|
|
561
|
+
]
|
|
562
|
+
},
|
|
563
|
+
"overrides": {
|
|
564
|
+
"description": "A rule's default changed for this project, such as a larger component size limit, with the reason.",
|
|
565
|
+
"type": "object",
|
|
566
|
+
"propertyNames": {
|
|
567
|
+
"type": "string",
|
|
568
|
+
"pattern": "^[A-Z][A-Z0-9]*-\\d{2,}$",
|
|
569
|
+
"description": "A standards rule id, such as SEC-07."
|
|
570
|
+
},
|
|
571
|
+
"additionalProperties": {
|
|
572
|
+
"type": "object",
|
|
573
|
+
"properties": {
|
|
574
|
+
"value": {
|
|
575
|
+
"anyOf": [
|
|
576
|
+
{
|
|
577
|
+
"type": "number"
|
|
578
|
+
},
|
|
579
|
+
{
|
|
580
|
+
"type": "string",
|
|
581
|
+
"minLength": 1
|
|
582
|
+
}
|
|
583
|
+
],
|
|
584
|
+
"description": "The project's value in place of the profile's default."
|
|
585
|
+
},
|
|
586
|
+
"reason": {
|
|
587
|
+
"type": "string",
|
|
588
|
+
"minLength": 1
|
|
589
|
+
}
|
|
590
|
+
},
|
|
591
|
+
"required": [
|
|
592
|
+
"value",
|
|
593
|
+
"reason"
|
|
594
|
+
],
|
|
595
|
+
"additionalProperties": false
|
|
596
|
+
}
|
|
597
|
+
},
|
|
598
|
+
"exceptions": {
|
|
599
|
+
"description": "Rules this project sets aside, each with a reason and who decided. peer-ai doctor lists them all.",
|
|
600
|
+
"type": "array",
|
|
601
|
+
"items": {
|
|
602
|
+
"type": "object",
|
|
603
|
+
"properties": {
|
|
604
|
+
"rule": {
|
|
605
|
+
"type": "string",
|
|
606
|
+
"pattern": "^[A-Z][A-Z0-9]*-\\d{2,}$",
|
|
607
|
+
"description": "A standards rule id, such as SEC-07."
|
|
608
|
+
},
|
|
609
|
+
"reason": {
|
|
610
|
+
"type": "string",
|
|
611
|
+
"minLength": 1
|
|
612
|
+
},
|
|
613
|
+
"decidedBy": {
|
|
614
|
+
"type": "string",
|
|
615
|
+
"minLength": 1,
|
|
616
|
+
"description": "The person who decided to set the rule aside."
|
|
617
|
+
},
|
|
618
|
+
"until": {
|
|
619
|
+
"description": "When the exception ends, if it's temporary.",
|
|
620
|
+
"type": "string",
|
|
621
|
+
"format": "date",
|
|
622
|
+
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
|
|
623
|
+
}
|
|
624
|
+
},
|
|
625
|
+
"required": [
|
|
626
|
+
"rule",
|
|
627
|
+
"reason",
|
|
628
|
+
"decidedBy"
|
|
629
|
+
],
|
|
630
|
+
"additionalProperties": false
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
},
|
|
634
|
+
"additionalProperties": false
|
|
635
|
+
},
|
|
636
|
+
"compliance": {
|
|
637
|
+
"type": "object",
|
|
638
|
+
"properties": {
|
|
639
|
+
"jurisdictions": {
|
|
640
|
+
"description": "Where the product operates or has users.",
|
|
641
|
+
"type": "array",
|
|
642
|
+
"items": {
|
|
643
|
+
"type": "string",
|
|
644
|
+
"pattern": "^([A-Z]{2}(-[A-Z0-9]{1,3})?|[a-z][a-z0-9]*(-[a-z0-9]+)*)$"
|
|
645
|
+
}
|
|
646
|
+
},
|
|
647
|
+
"industries": {
|
|
648
|
+
"description": "Such as payments, health, food or maritime.",
|
|
649
|
+
"type": "array",
|
|
650
|
+
"items": {
|
|
651
|
+
"type": "string",
|
|
652
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$"
|
|
653
|
+
}
|
|
654
|
+
},
|
|
655
|
+
"packs": {
|
|
656
|
+
"description": "Rule packs to apply: laws, industry standards, religious or cultural standards, labelling rules, platform policies. peer-ai assess suggests them from the jurisdictions, industries and data it finds.",
|
|
657
|
+
"type": "array",
|
|
658
|
+
"items": {
|
|
659
|
+
"type": "string",
|
|
660
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$"
|
|
661
|
+
}
|
|
662
|
+
},
|
|
663
|
+
"dataInventory": {
|
|
664
|
+
"description": "Where the inventory of personal and sensitive data fields lives.",
|
|
665
|
+
"type": "string",
|
|
666
|
+
"minLength": 1
|
|
667
|
+
}
|
|
668
|
+
},
|
|
669
|
+
"additionalProperties": false
|
|
670
|
+
},
|
|
671
|
+
"rules": {
|
|
672
|
+
"description": "Project rules every activity respects, wherever they are written, such as a contributing guide.",
|
|
673
|
+
"type": "array",
|
|
674
|
+
"items": {
|
|
675
|
+
"type": "object",
|
|
676
|
+
"properties": {
|
|
677
|
+
"path": {
|
|
678
|
+
"type": "string",
|
|
679
|
+
"minLength": 1,
|
|
680
|
+
"description": "A path relative to the project root, or a URL."
|
|
681
|
+
},
|
|
682
|
+
"description": {
|
|
683
|
+
"type": "string",
|
|
684
|
+
"minLength": 1
|
|
685
|
+
}
|
|
686
|
+
},
|
|
687
|
+
"required": [
|
|
688
|
+
"path"
|
|
689
|
+
],
|
|
690
|
+
"additionalProperties": false
|
|
691
|
+
}
|
|
692
|
+
},
|
|
693
|
+
"models": {
|
|
694
|
+
"type": "object",
|
|
695
|
+
"properties": {
|
|
696
|
+
"policy": {
|
|
697
|
+
"type": "string",
|
|
698
|
+
"enum": [
|
|
699
|
+
"none",
|
|
700
|
+
"tiers",
|
|
701
|
+
"pinned"
|
|
702
|
+
],
|
|
703
|
+
"description": "none: no model guidance. tiers: Peer AI's tier per activity. pinned: the models named here."
|
|
704
|
+
},
|
|
705
|
+
"default": {
|
|
706
|
+
"type": "string",
|
|
707
|
+
"minLength": 1
|
|
708
|
+
},
|
|
709
|
+
"byActivity": {
|
|
710
|
+
"type": "object",
|
|
711
|
+
"propertyNames": {
|
|
712
|
+
"type": "string",
|
|
713
|
+
"enum": [
|
|
714
|
+
"understand",
|
|
715
|
+
"architect",
|
|
716
|
+
"specify",
|
|
717
|
+
"contract",
|
|
718
|
+
"standards",
|
|
719
|
+
"delivery-setup",
|
|
720
|
+
"plan",
|
|
721
|
+
"build",
|
|
722
|
+
"verify",
|
|
723
|
+
"test",
|
|
724
|
+
"ship",
|
|
725
|
+
"operate",
|
|
726
|
+
"document",
|
|
727
|
+
"retro"
|
|
728
|
+
]
|
|
729
|
+
},
|
|
730
|
+
"additionalProperties": {
|
|
731
|
+
"type": "string",
|
|
732
|
+
"minLength": 1
|
|
733
|
+
}
|
|
734
|
+
},
|
|
735
|
+
"ifUnavailable": {
|
|
736
|
+
"description": "What to do when a pinned model is not offered. Never a weaker model for a gate.",
|
|
737
|
+
"type": "string",
|
|
738
|
+
"enum": [
|
|
739
|
+
"most-capable",
|
|
740
|
+
"ask"
|
|
741
|
+
]
|
|
742
|
+
}
|
|
743
|
+
},
|
|
744
|
+
"required": [
|
|
745
|
+
"policy"
|
|
746
|
+
],
|
|
747
|
+
"additionalProperties": false
|
|
748
|
+
},
|
|
749
|
+
"gates": {
|
|
750
|
+
"type": "object",
|
|
751
|
+
"properties": {
|
|
752
|
+
"blockOn": {
|
|
753
|
+
"description": "The lowest open finding severity that blocks a merge. Defaults to critical.",
|
|
754
|
+
"type": "string",
|
|
755
|
+
"enum": [
|
|
756
|
+
"critical",
|
|
757
|
+
"high",
|
|
758
|
+
"medium"
|
|
759
|
+
]
|
|
760
|
+
}
|
|
761
|
+
},
|
|
762
|
+
"additionalProperties": false
|
|
763
|
+
},
|
|
764
|
+
"capabilities": {
|
|
765
|
+
"type": "object",
|
|
766
|
+
"propertyNames": {
|
|
767
|
+
"type": "string",
|
|
768
|
+
"enum": [
|
|
769
|
+
"requirements-analysis",
|
|
770
|
+
"product-spec",
|
|
771
|
+
"architecture",
|
|
772
|
+
"system-design",
|
|
773
|
+
"api-design",
|
|
774
|
+
"data-modelling",
|
|
775
|
+
"threat-model",
|
|
776
|
+
"design-system",
|
|
777
|
+
"issue-planning",
|
|
778
|
+
"implement-ticket",
|
|
779
|
+
"code-review",
|
|
780
|
+
"security-review",
|
|
781
|
+
"contract-check",
|
|
782
|
+
"accessibility-review",
|
|
783
|
+
"design-review",
|
|
784
|
+
"performance-review",
|
|
785
|
+
"reliability-review",
|
|
786
|
+
"data-migration-review",
|
|
787
|
+
"dependency-review",
|
|
788
|
+
"compliance-review",
|
|
789
|
+
"test-strategy",
|
|
790
|
+
"qa-acceptance",
|
|
791
|
+
"ai-feature-review",
|
|
792
|
+
"release-readiness",
|
|
793
|
+
"infrastructure-review",
|
|
794
|
+
"observability-review",
|
|
795
|
+
"incident-response",
|
|
796
|
+
"documentation",
|
|
797
|
+
"tech-debt-triage"
|
|
798
|
+
]
|
|
799
|
+
},
|
|
800
|
+
"additionalProperties": {
|
|
801
|
+
"type": "object",
|
|
802
|
+
"properties": {
|
|
803
|
+
"also": {
|
|
804
|
+
"type": "array",
|
|
805
|
+
"items": {
|
|
806
|
+
"type": "string",
|
|
807
|
+
"pattern": "^(\\/[a-z0-9-]+|[a-z0-9-]+:[a-z0-9-]+)$",
|
|
808
|
+
"description": "An extra skill that feeds Peer AI's own: plugin:skill, or /command for a tool's built-in command."
|
|
809
|
+
}
|
|
810
|
+
},
|
|
811
|
+
"checklists": {
|
|
812
|
+
"description": "Project checklists the skill works through as well as its own rules.",
|
|
813
|
+
"type": "array",
|
|
814
|
+
"items": {
|
|
815
|
+
"type": "string",
|
|
816
|
+
"minLength": 1,
|
|
817
|
+
"description": "A path relative to the project root, or a URL."
|
|
818
|
+
}
|
|
819
|
+
},
|
|
820
|
+
"notes": {
|
|
821
|
+
"type": "array",
|
|
822
|
+
"items": {
|
|
823
|
+
"type": "string",
|
|
824
|
+
"minLength": 1
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
},
|
|
828
|
+
"additionalProperties": false
|
|
829
|
+
}
|
|
830
|
+
},
|
|
831
|
+
"activities": {
|
|
832
|
+
"type": "object",
|
|
833
|
+
"propertyNames": {
|
|
834
|
+
"type": "string",
|
|
835
|
+
"enum": [
|
|
836
|
+
"understand",
|
|
837
|
+
"architect",
|
|
838
|
+
"specify",
|
|
839
|
+
"contract",
|
|
840
|
+
"standards",
|
|
841
|
+
"delivery-setup",
|
|
842
|
+
"plan",
|
|
843
|
+
"build",
|
|
844
|
+
"verify",
|
|
845
|
+
"test",
|
|
846
|
+
"ship",
|
|
847
|
+
"operate",
|
|
848
|
+
"document",
|
|
849
|
+
"retro"
|
|
850
|
+
]
|
|
851
|
+
},
|
|
852
|
+
"additionalProperties": {
|
|
853
|
+
"type": "object",
|
|
854
|
+
"properties": {
|
|
855
|
+
"inputs": {
|
|
856
|
+
"description": "Read these before anything else, and before asking the user anything.",
|
|
857
|
+
"type": "array",
|
|
858
|
+
"items": {
|
|
859
|
+
"type": "string",
|
|
860
|
+
"minLength": 1,
|
|
861
|
+
"description": "A path relative to the project root, or a URL."
|
|
862
|
+
}
|
|
863
|
+
},
|
|
864
|
+
"notes": {
|
|
865
|
+
"description": "Project-specific instructions for this activity.",
|
|
866
|
+
"type": "array",
|
|
867
|
+
"items": {
|
|
868
|
+
"type": "string",
|
|
869
|
+
"minLength": 1
|
|
870
|
+
}
|
|
871
|
+
},
|
|
872
|
+
"reviews": {
|
|
873
|
+
"type": "object",
|
|
874
|
+
"properties": {
|
|
875
|
+
"require": {
|
|
876
|
+
"description": "Reviews every change needs, beyond the ones Peer AI works out from what it touched.",
|
|
877
|
+
"type": "array",
|
|
878
|
+
"items": {
|
|
879
|
+
"type": "string",
|
|
880
|
+
"enum": [
|
|
881
|
+
"requirements-analysis",
|
|
882
|
+
"product-spec",
|
|
883
|
+
"architecture",
|
|
884
|
+
"system-design",
|
|
885
|
+
"api-design",
|
|
886
|
+
"data-modelling",
|
|
887
|
+
"threat-model",
|
|
888
|
+
"design-system",
|
|
889
|
+
"issue-planning",
|
|
890
|
+
"implement-ticket",
|
|
891
|
+
"code-review",
|
|
892
|
+
"security-review",
|
|
893
|
+
"contract-check",
|
|
894
|
+
"accessibility-review",
|
|
895
|
+
"design-review",
|
|
896
|
+
"performance-review",
|
|
897
|
+
"reliability-review",
|
|
898
|
+
"data-migration-review",
|
|
899
|
+
"dependency-review",
|
|
900
|
+
"compliance-review",
|
|
901
|
+
"test-strategy",
|
|
902
|
+
"qa-acceptance",
|
|
903
|
+
"ai-feature-review",
|
|
904
|
+
"release-readiness",
|
|
905
|
+
"infrastructure-review",
|
|
906
|
+
"observability-review",
|
|
907
|
+
"incident-response",
|
|
908
|
+
"documentation",
|
|
909
|
+
"tech-debt-triage"
|
|
910
|
+
]
|
|
911
|
+
}
|
|
912
|
+
},
|
|
913
|
+
"skip": {
|
|
914
|
+
"description": "Reviews this project doesn't need, each with the reason.",
|
|
915
|
+
"type": "array",
|
|
916
|
+
"items": {
|
|
917
|
+
"type": "object",
|
|
918
|
+
"properties": {
|
|
919
|
+
"skill": {
|
|
920
|
+
"type": "string",
|
|
921
|
+
"enum": [
|
|
922
|
+
"requirements-analysis",
|
|
923
|
+
"product-spec",
|
|
924
|
+
"architecture",
|
|
925
|
+
"system-design",
|
|
926
|
+
"api-design",
|
|
927
|
+
"data-modelling",
|
|
928
|
+
"threat-model",
|
|
929
|
+
"design-system",
|
|
930
|
+
"issue-planning",
|
|
931
|
+
"implement-ticket",
|
|
932
|
+
"code-review",
|
|
933
|
+
"security-review",
|
|
934
|
+
"contract-check",
|
|
935
|
+
"accessibility-review",
|
|
936
|
+
"design-review",
|
|
937
|
+
"performance-review",
|
|
938
|
+
"reliability-review",
|
|
939
|
+
"data-migration-review",
|
|
940
|
+
"dependency-review",
|
|
941
|
+
"compliance-review",
|
|
942
|
+
"test-strategy",
|
|
943
|
+
"qa-acceptance",
|
|
944
|
+
"ai-feature-review",
|
|
945
|
+
"release-readiness",
|
|
946
|
+
"infrastructure-review",
|
|
947
|
+
"observability-review",
|
|
948
|
+
"incident-response",
|
|
949
|
+
"documentation",
|
|
950
|
+
"tech-debt-triage"
|
|
951
|
+
]
|
|
952
|
+
},
|
|
953
|
+
"reason": {
|
|
954
|
+
"type": "string",
|
|
955
|
+
"minLength": 1
|
|
956
|
+
}
|
|
957
|
+
},
|
|
958
|
+
"required": [
|
|
959
|
+
"skill",
|
|
960
|
+
"reason"
|
|
961
|
+
],
|
|
962
|
+
"additionalProperties": false
|
|
963
|
+
}
|
|
964
|
+
}
|
|
965
|
+
},
|
|
966
|
+
"additionalProperties": false,
|
|
967
|
+
"description": "For verify: add to or remove from the reviews each change needs (RFC 0004)."
|
|
968
|
+
}
|
|
969
|
+
},
|
|
970
|
+
"additionalProperties": false
|
|
971
|
+
}
|
|
972
|
+
},
|
|
973
|
+
"docs": {
|
|
974
|
+
"type": "object",
|
|
975
|
+
"properties": {
|
|
976
|
+
"dir": {
|
|
977
|
+
"type": "string",
|
|
978
|
+
"minLength": 1,
|
|
979
|
+
"description": "A path relative to the project root, or a URL."
|
|
980
|
+
},
|
|
981
|
+
"preserveStructure": {
|
|
982
|
+
"description": "Add to the existing docs; never reorganise them.",
|
|
983
|
+
"type": "boolean"
|
|
984
|
+
},
|
|
985
|
+
"backlog": {
|
|
986
|
+
"description": "Where ideas outside the agreed scope go, instead of becoming work items.",
|
|
987
|
+
"type": "string",
|
|
988
|
+
"minLength": 1
|
|
989
|
+
}
|
|
990
|
+
},
|
|
991
|
+
"additionalProperties": false
|
|
992
|
+
}
|
|
993
|
+
},
|
|
994
|
+
"required": [
|
|
995
|
+
"version",
|
|
996
|
+
"project",
|
|
997
|
+
"tracks"
|
|
998
|
+
],
|
|
999
|
+
"additionalProperties": false,
|
|
1000
|
+
"title": "Peer AI project config",
|
|
1001
|
+
"description": "peer-ai.config.json: a project's settings, shape, standards, rule packs and customisations."
|
|
1002
|
+
}
|