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.
@@ -0,0 +1,997 @@
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
+ "additionalProperties": false,
995
+ "title": "Peer AI shared base config",
996
+ "description": "A base config that projects inherit with extends. Every key is optional."
997
+ }