speckeeper 0.9.3 → 0.10.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/cli-contract.yaml CHANGED
@@ -3,7 +3,7 @@ cliContracts: 0.1.0
3
3
 
4
4
  info:
5
5
  title: speckeeper CLI
6
- version: 0.9.3
6
+ version: 0.10.0
7
7
  description: >-
8
8
  TypeScript-first specification validation framework — validate design
9
9
  consistency, external SSOT integrity, and traceability with type-safe
@@ -45,7 +45,7 @@ commandSets:
45
45
 
46
46
  options:
47
47
  - name: force
48
- aliases: [f]
48
+ aliases: [F]
49
49
  description: Overwrite existing files.
50
50
  schema:
51
51
  type: boolean
@@ -63,11 +63,14 @@ commandSets:
63
63
  format: text
64
64
 
65
65
  x-agent:
66
- riskLevel: low
67
- requiresConfirmation: false
66
+ riskLevel: medium
67
+ requiresConfirmation: true
68
68
  idempotent: false
69
69
  sideEffects:
70
70
  - file_write
71
+ sideEffectNote: >-
72
+ Creates config file and design/ directory structure.
73
+ With --force, overwrites existing files.
71
74
 
72
75
  # ── build ─────────────────────────────────────────
73
76
  build:
@@ -142,6 +145,10 @@ commandSets:
142
145
  idempotent: true
143
146
  sideEffects:
144
147
  - file_write
148
+ sideEffectNote: >-
149
+ When --watch is used, the process runs indefinitely and is
150
+ unsuitable for non-interactive agent invocation.
151
+ Always writes generated files to docs/ and specs/.
145
152
 
146
153
  # ── lint ──────────────────────────────────────────
147
154
  lint:
@@ -202,18 +209,23 @@ commandSets:
202
209
  '0':
203
210
  description: No lint issues found (or all issues auto-fixed).
204
211
  stdout:
205
- format: text
212
+ format: '{options.format}'
206
213
 
207
214
  '1':
208
215
  description: Lint issues found (errors or warnings with --strict).
209
- stderr:
210
- format: text
216
+ stdout:
217
+ format: '{options.format}'
211
218
 
212
219
  x-agent:
213
220
  riskLevel: low
214
221
  requiresConfirmation: false
215
222
  idempotent: true
216
- sideEffects: []
223
+ sideEffects:
224
+ - file_write
225
+ sideEffectNote: >-
226
+ file_write applies only when --fix is provided.
227
+ Without --fix the command is read-only.
228
+ safeDryRunOption: Omit --fix to run in read-only mode.
217
229
 
218
230
  # ── drift ─────────────────────────────────────────
219
231
  drift:
@@ -266,18 +278,22 @@ commandSets:
266
278
  '0':
267
279
  description: No drift detected (or drift auto-updated with --update).
268
280
  stdout:
269
- format: text
281
+ format: '{options.format}'
270
282
 
271
283
  '1':
272
284
  description: Drift detected (with --fail-on-drift), or update failed.
273
- stderr:
274
- format: text
285
+ stdout:
286
+ format: '{options.format}'
275
287
 
276
288
  x-agent:
277
- riskLevel: low
278
- requiresConfirmation: false
289
+ riskLevel: medium
290
+ requiresConfirmation: true
279
291
  idempotent: true
280
- sideEffects: []
292
+ sideEffects:
293
+ - file_write
294
+ sideEffectNote: >-
295
+ file_write applies only when --update is provided.
296
+ Without --update the command is read-only.
281
297
  safeDryRunOption: Omit --update to run in read-only mode.
282
298
 
283
299
  # ── check ─────────────────────────────────────────
@@ -338,16 +354,25 @@ commandSets:
338
354
  type: boolean
339
355
  default: false
340
356
 
357
+ - name: format
358
+ aliases: [f]
359
+ description: "Output format: text, json, github."
360
+ valueName: format
361
+ schema:
362
+ type: string
363
+ default: text
364
+ enum: [text, json, github]
365
+
341
366
  exits:
342
367
  '0':
343
368
  description: All checks passed (all specs found in sources, deep validation passed).
344
369
  stdout:
345
- format: text
370
+ format: '{options.format}'
346
371
 
347
372
  '1':
348
373
  description: Check failures found (missing specs, structural mismatches, or coverage gaps).
349
- stderr:
350
- format: text
374
+ stdout:
375
+ format: '{options.format}'
351
376
 
352
377
  x-agent:
353
378
  riskLevel: low
@@ -411,9 +436,15 @@ commandSets:
411
436
  exists: true
412
437
  encoding: utf-8
413
438
 
439
+ - name: dry-run
440
+ description: Preview generated file content and ID without writing to disk.
441
+ schema:
442
+ type: boolean
443
+ default: false
444
+
414
445
  exits:
415
446
  '0':
416
- description: Element file created with auto-generated ID.
447
+ description: Element file created (or previewed with --dry-run) with auto-generated ID.
417
448
  stdout:
418
449
  format: text
419
450
 
@@ -428,6 +459,10 @@ commandSets:
428
459
  idempotent: false
429
460
  sideEffects:
430
461
  - file_write
462
+ sideEffectNote: >-
463
+ Creates a new TypeScript spec file with auto-generated ID.
464
+ With --dry-run, only previews the generated content without writing.
465
+ safeDryRunOption: --dry-run
431
466
 
432
467
  # ── impact ────────────────────────────────────────
433
468
  impact:
@@ -465,10 +500,11 @@ commandSets:
465
500
  - name: depth
466
501
  aliases: [d]
467
502
  description: Analysis depth (reference tracking level).
468
- valueName: depth
503
+ valueName: n
469
504
  schema:
470
- type: string
471
- default: "3"
505
+ type: integer
506
+ minimum: 1
507
+ default: 3
472
508
 
473
509
  - name: direction
474
510
  description: "Analysis direction: upstream, downstream, both."
@@ -491,7 +527,7 @@ commandSets:
491
527
  '0':
492
528
  description: Impact analysis completed and displayed.
493
529
  stdout:
494
- format: text
530
+ format: '{options.format}'
495
531
 
496
532
  '1':
497
533
  description: Analysis failed (ID not found or config error).
@@ -539,7 +575,7 @@ commandSets:
539
575
  default: design/
540
576
 
541
577
  - name: force
542
- aliases: [f]
578
+ aliases: [F]
543
579
  description: Overwrite existing files.
544
580
  schema:
545
581
  type: boolean
@@ -566,9 +602,687 @@ commandSets:
566
602
  format: text
567
603
 
568
604
  x-agent:
569
- riskLevel: low
570
- requiresConfirmation: false
605
+ riskLevel: high
606
+ requiresConfirmation: true
571
607
  idempotent: false
572
608
  sideEffects:
573
609
  - file_write
610
+ sideEffectNote: >-
611
+ --force overwrites existing TypeScript model source files.
574
612
  safeDryRunOption: --dry-run
613
+
614
+ # ── audit-requirements ──────────────────────────────
615
+ audit-requirements:
616
+ summary: Run LLM-based requirement quality audit.
617
+ description: >-
618
+ Performs semantic analysis of design specs using LLM to identify
619
+ quality issues that static lint cannot detect. Evaluates verifiability,
620
+ ambiguity, granularity, terminology consistency, and design-mixing.
621
+ Requires agent-contracts-runtime as an optional peer dependency.
622
+ usage:
623
+ - speckeeper audit-requirements
624
+ - speckeeper audit-requirements --adapter gemini --dry-run
625
+ - speckeeper audit-requirements --report-format json --output audit.json
626
+
627
+ options:
628
+ - name: config
629
+ aliases: [c]
630
+ description: Path to config file.
631
+ valueName: path
632
+ schema:
633
+ type: string
634
+ file:
635
+ mode: read
636
+ exists: true
637
+ encoding: utf-8
638
+
639
+ - name: adapter
640
+ aliases: [a]
641
+ description: SDK adapter to use for LLM execution.
642
+ valueName: name
643
+ schema:
644
+ type: string
645
+ enum: [cursor, claude, openai, gemini, mock]
646
+
647
+ - name: model
648
+ description: LLM model override.
649
+ valueName: name
650
+ schema:
651
+ type: string
652
+
653
+ - name: dry-run
654
+ aliases: [n]
655
+ description: Output the constructed prompt without calling LLM.
656
+ schema:
657
+ type: boolean
658
+ default: false
659
+
660
+ - name: show-prompt
661
+ description: Display the constructed LLM prompt on stderr.
662
+ schema:
663
+ type: boolean
664
+ default: false
665
+
666
+ - name: fail-on
667
+ description: Minimum severity that causes a non-zero exit.
668
+ valueName: level
669
+ schema:
670
+ type: string
671
+ enum: [warning, error, critical]
672
+ default: error
673
+
674
+ - name: output
675
+ aliases: [o]
676
+ description: Write result to a file instead of stdout.
677
+ valueName: file
678
+ schema:
679
+ type: string
680
+ file:
681
+ mode: write
682
+ encoding: utf-8
683
+
684
+ - name: report-format
685
+ description: Output format for the audit report.
686
+ valueName: fmt
687
+ schema:
688
+ type: string
689
+ enum: [json, text, yaml]
690
+ default: json
691
+
692
+ exits:
693
+ '0':
694
+ description: Audit completed, no blocking findings.
695
+ stdout:
696
+ format: '{options.report-format}'
697
+ schema:
698
+ $ref: '#/components/schemas/RequirementAuditResult'
699
+
700
+ '1':
701
+ description: Unexpected error.
702
+ stderr:
703
+ format: text
704
+
705
+ '2':
706
+ description: Configuration or input error.
707
+ stderr:
708
+ format: text
709
+
710
+ '10':
711
+ description: Completed with blocking findings.
712
+ stdout:
713
+ format: '{options.report-format}'
714
+ schema:
715
+ $ref: '#/components/schemas/RequirementAuditResult'
716
+
717
+ '11':
718
+ description: Runtime dependency missing (agent-contracts-runtime).
719
+ stderr:
720
+ format: text
721
+
722
+ '12':
723
+ description: LLM provider or adapter error.
724
+ stderr:
725
+ format: text
726
+
727
+ x-agent:
728
+ riskLevel: medium
729
+ requiresConfirmation: false
730
+ idempotent: true
731
+ sideEffects: [network, file_write]
732
+ sideEffectNote: >-
733
+ Network calls to LLM provider when adapter is not mock.
734
+ Filesystem write when --output is specified.
735
+ Exit 10 = valid output with blocking findings (stdout contains result).
736
+ Exit 11 = missing runtime dependency (non-retryable).
737
+ safeDryRunOption: --dry-run
738
+ expectedDurationMs: 120000
739
+ retryableExitCodes: [12]
740
+
741
+ # ── propose-trace-links ─────────────────────────────
742
+ propose-trace-links:
743
+ summary: LLM-based traceability link proposal.
744
+ description: >-
745
+ Analyzes spec definitions and external source scan results to
746
+ propose candidate traceability links between specs and
747
+ implementation artifacts. Each link includes a confidence score
748
+ and rationale.
749
+ usage:
750
+ - speckeeper propose-trace-links
751
+ - speckeeper propose-trace-links --adapter claude --report-format json
752
+ - speckeeper propose-trace-links --dry-run
753
+
754
+ options:
755
+ - name: config
756
+ aliases: [c]
757
+ description: Path to config file.
758
+ valueName: path
759
+ schema:
760
+ type: string
761
+ file:
762
+ mode: read
763
+ exists: true
764
+ encoding: utf-8
765
+
766
+ - name: adapter
767
+ aliases: [a]
768
+ description: SDK adapter to use for LLM execution.
769
+ valueName: name
770
+ schema:
771
+ type: string
772
+ enum: [cursor, claude, openai, gemini, mock]
773
+
774
+ - name: model
775
+ description: LLM model override.
776
+ valueName: name
777
+ schema:
778
+ type: string
779
+
780
+ - name: dry-run
781
+ aliases: [n]
782
+ description: Output the constructed prompt without calling LLM.
783
+ schema:
784
+ type: boolean
785
+ default: false
786
+
787
+ - name: show-prompt
788
+ description: Display the constructed LLM prompt on stderr.
789
+ schema:
790
+ type: boolean
791
+ default: false
792
+
793
+ - name: fail-on
794
+ description: Minimum severity that causes a non-zero exit.
795
+ valueName: level
796
+ schema:
797
+ type: string
798
+ enum: [warning, error, critical]
799
+ default: error
800
+
801
+ - name: output
802
+ aliases: [o]
803
+ description: Write result to a file instead of stdout.
804
+ valueName: file
805
+ schema:
806
+ type: string
807
+ file:
808
+ mode: write
809
+ encoding: utf-8
810
+
811
+ - name: report-format
812
+ description: Output format for the report.
813
+ valueName: fmt
814
+ schema:
815
+ type: string
816
+ enum: [json, text, yaml]
817
+ default: json
818
+
819
+ exits:
820
+ '0':
821
+ description: Proposal completed, no blocking findings.
822
+ stdout:
823
+ format: '{options.report-format}'
824
+ schema:
825
+ $ref: '#/components/schemas/TraceLinkResult'
826
+
827
+ '1':
828
+ description: Unexpected error.
829
+ stderr:
830
+ format: text
831
+
832
+ '2':
833
+ description: Configuration or input error.
834
+ stderr:
835
+ format: text
836
+
837
+ '10':
838
+ description: Completed with blocking findings.
839
+ stdout:
840
+ format: '{options.report-format}'
841
+ schema:
842
+ $ref: '#/components/schemas/TraceLinkResult'
843
+
844
+ '11':
845
+ description: Runtime dependency missing (agent-contracts-runtime).
846
+ stderr:
847
+ format: text
848
+
849
+ '12':
850
+ description: LLM provider or adapter error.
851
+ stderr:
852
+ format: text
853
+
854
+ x-agent:
855
+ riskLevel: medium
856
+ requiresConfirmation: false
857
+ idempotent: true
858
+ sideEffects: [network, file_write]
859
+ sideEffectNote: >-
860
+ Network calls to LLM provider when adapter is not mock.
861
+ Filesystem write when --output is specified.
862
+ Exit 10 = valid output with blocking findings (stdout contains result).
863
+ Exit 11 = missing runtime dependency (non-retryable).
864
+ safeDryRunOption: --dry-run
865
+ expectedDurationMs: 120000
866
+ retryableExitCodes: [12]
867
+
868
+ # ── explain-impact ──────────────────────────────────
869
+ explain-impact:
870
+ summary: LLM-based explanation of impact analysis output.
871
+ description: >-
872
+ Reads JSON output from speckeeper impact on stdin and generates
873
+ a human-readable explanation suitable for PM/executive audiences.
874
+ Includes affected artifact categorization, test considerations,
875
+ and release risk assessment.
876
+ usage:
877
+ - speckeeper impact FR-001 --format json | speckeeper explain-impact
878
+ - speckeeper impact ENT-ORDER --format json | speckeeper explain-impact --adapter claude
879
+
880
+ stdin:
881
+ required: true
882
+ format: json
883
+ description: >-
884
+ JSON output from speckeeper impact --format json.
885
+ Must contain target, targetType, and impactedNodes fields.
886
+ schema:
887
+ $ref: '#/components/schemas/ImpactAnalysisOutput'
888
+
889
+ options:
890
+ - name: config
891
+ aliases: [c]
892
+ description: Path to config file.
893
+ valueName: path
894
+ schema:
895
+ type: string
896
+ file:
897
+ mode: read
898
+ exists: true
899
+ encoding: utf-8
900
+
901
+ - name: adapter
902
+ aliases: [a]
903
+ description: SDK adapter to use for LLM execution.
904
+ valueName: name
905
+ schema:
906
+ type: string
907
+ enum: [cursor, claude, openai, gemini, mock]
908
+
909
+ - name: model
910
+ description: LLM model override.
911
+ valueName: name
912
+ schema:
913
+ type: string
914
+
915
+ - name: dry-run
916
+ aliases: [n]
917
+ description: Output the constructed prompt without calling LLM.
918
+ schema:
919
+ type: boolean
920
+ default: false
921
+
922
+ - name: show-prompt
923
+ description: Display the constructed LLM prompt on stderr.
924
+ schema:
925
+ type: boolean
926
+ default: false
927
+
928
+ - name: fail-on
929
+ description: Minimum severity that causes a non-zero exit.
930
+ valueName: level
931
+ schema:
932
+ type: string
933
+ enum: [warning, error, critical]
934
+ default: error
935
+
936
+ - name: output
937
+ aliases: [o]
938
+ description: Write result to a file instead of stdout.
939
+ valueName: file
940
+ schema:
941
+ type: string
942
+ file:
943
+ mode: write
944
+ encoding: utf-8
945
+
946
+ - name: report-format
947
+ description: Output format for the report.
948
+ valueName: fmt
949
+ schema:
950
+ type: string
951
+ enum: [json, text, yaml]
952
+ default: json
953
+
954
+ exits:
955
+ '0':
956
+ description: Explanation completed successfully.
957
+ stdout:
958
+ format: '{options.report-format}'
959
+ schema:
960
+ $ref: '#/components/schemas/ImpactExplainResult'
961
+
962
+ '1':
963
+ description: Unexpected error.
964
+ stderr:
965
+ format: text
966
+
967
+ '2':
968
+ description: Configuration or input error.
969
+ stderr:
970
+ format: text
971
+
972
+ '3':
973
+ description: No input on stdin.
974
+ stderr:
975
+ format: text
976
+
977
+ '10':
978
+ description: Completed with blocking findings.
979
+ stdout:
980
+ format: '{options.report-format}'
981
+ schema:
982
+ $ref: '#/components/schemas/ImpactExplainResult'
983
+
984
+ '11':
985
+ description: Runtime dependency missing (agent-contracts-runtime).
986
+ stderr:
987
+ format: text
988
+
989
+ '12':
990
+ description: LLM provider or adapter error.
991
+ stderr:
992
+ format: text
993
+
994
+ x-agent:
995
+ riskLevel: medium
996
+ requiresConfirmation: false
997
+ idempotent: true
998
+ sideEffects: [network, file_write]
999
+ sideEffectNote: >-
1000
+ Network calls to LLM provider when adapter is not mock.
1001
+ Filesystem write when --output is specified.
1002
+ Exit 10 = valid output with blocking findings (stdout contains result).
1003
+ Exit 11 = missing runtime dependency (non-retryable).
1004
+ safeDryRunOption: --dry-run
1005
+ expectedDurationMs: 120000
1006
+ retryableExitCodes: [12]
1007
+
1008
+ # ── propose-acceptance-criteria ─────────────────────
1009
+ propose-acceptance-criteria:
1010
+ summary: LLM-based acceptance criteria proposal.
1011
+ description: >-
1012
+ Analyzes design specs and proposes testable acceptance criteria
1013
+ for each target spec. Optionally takes spec IDs as arguments to
1014
+ scope the proposal. Criteria are proposed in Given/When/Then or
1015
+ verification format.
1016
+ usage:
1017
+ - speckeeper propose-acceptance-criteria
1018
+ - speckeeper propose-acceptance-criteria FR-001 FR-002
1019
+ - speckeeper propose-acceptance-criteria --adapter gemini --dry-run
1020
+
1021
+ arguments:
1022
+ - name: specIds
1023
+ index: 0
1024
+ required: false
1025
+ variadic: true
1026
+ description: >-
1027
+ Spec IDs to propose criteria for.
1028
+ Defaults to all specs if omitted.
1029
+ schema:
1030
+ type: string
1031
+
1032
+ options:
1033
+ - name: config
1034
+ aliases: [c]
1035
+ description: Path to config file.
1036
+ valueName: path
1037
+ schema:
1038
+ type: string
1039
+ file:
1040
+ mode: read
1041
+ exists: true
1042
+ encoding: utf-8
1043
+
1044
+ - name: adapter
1045
+ aliases: [a]
1046
+ description: SDK adapter to use for LLM execution.
1047
+ valueName: name
1048
+ schema:
1049
+ type: string
1050
+ enum: [cursor, claude, openai, gemini, mock]
1051
+
1052
+ - name: model
1053
+ description: LLM model override.
1054
+ valueName: name
1055
+ schema:
1056
+ type: string
1057
+
1058
+ - name: dry-run
1059
+ aliases: [n]
1060
+ description: Output the constructed prompt without calling LLM.
1061
+ schema:
1062
+ type: boolean
1063
+ default: false
1064
+
1065
+ - name: show-prompt
1066
+ description: Display the constructed LLM prompt on stderr.
1067
+ schema:
1068
+ type: boolean
1069
+ default: false
1070
+
1071
+ - name: fail-on
1072
+ description: Minimum severity that causes a non-zero exit.
1073
+ valueName: level
1074
+ schema:
1075
+ type: string
1076
+ enum: [warning, error, critical]
1077
+ default: error
1078
+
1079
+ - name: output
1080
+ aliases: [o]
1081
+ description: Write result to a file instead of stdout.
1082
+ valueName: file
1083
+ schema:
1084
+ type: string
1085
+ file:
1086
+ mode: write
1087
+ encoding: utf-8
1088
+
1089
+ - name: report-format
1090
+ description: Output format for the report.
1091
+ valueName: fmt
1092
+ schema:
1093
+ type: string
1094
+ enum: [json, text, yaml]
1095
+ default: json
1096
+
1097
+ exits:
1098
+ '0':
1099
+ description: Proposal completed, no blocking findings.
1100
+ stdout:
1101
+ format: '{options.report-format}'
1102
+ schema:
1103
+ $ref: '#/components/schemas/AcceptanceCriteriaResult'
1104
+
1105
+ '1':
1106
+ description: Unexpected error.
1107
+ stderr:
1108
+ format: text
1109
+
1110
+ '2':
1111
+ description: Configuration or input error.
1112
+ stderr:
1113
+ format: text
1114
+
1115
+ '10':
1116
+ description: Completed with blocking findings.
1117
+ stdout:
1118
+ format: '{options.report-format}'
1119
+ schema:
1120
+ $ref: '#/components/schemas/AcceptanceCriteriaResult'
1121
+
1122
+ '11':
1123
+ description: Runtime dependency missing (agent-contracts-runtime).
1124
+ stderr:
1125
+ format: text
1126
+
1127
+ '12':
1128
+ description: LLM provider or adapter error.
1129
+ stderr:
1130
+ format: text
1131
+
1132
+ x-agent:
1133
+ riskLevel: medium
1134
+ requiresConfirmation: false
1135
+ idempotent: true
1136
+ sideEffects: [network, file_write]
1137
+ sideEffectNote: >-
1138
+ Network calls to LLM provider when adapter is not mock.
1139
+ Filesystem write when --output is specified.
1140
+ Exit 10 = valid output with blocking findings (stdout contains result).
1141
+ Exit 11 = missing runtime dependency (non-retryable).
1142
+ safeDryRunOption: --dry-run
1143
+ expectedDurationMs: 120000
1144
+ retryableExitCodes: [12]
1145
+
1146
+ components:
1147
+ schemas:
1148
+ # ── AI Agent Interoperability Schemas ──────────────────
1149
+ AgentEvidence:
1150
+ $ref: 'components.yaml#/schemas/agent-evidence'
1151
+ AgentFinding:
1152
+ $ref: 'components.yaml#/schemas/agent-finding'
1153
+ AgentRecommendedAction:
1154
+ $ref: 'components.yaml#/schemas/agent-recommended-action'
1155
+ RequirementAuditResult:
1156
+ $ref: 'components.yaml#/schemas/agent-audit-result'
1157
+
1158
+ TraceLinkResult:
1159
+ type: object
1160
+ description: Result of trace link proposal with candidate links.
1161
+ allOf:
1162
+ - $ref: 'components.yaml#/schemas/agent-audit-result'
1163
+ - type: object
1164
+ required: [candidateLinks]
1165
+ properties:
1166
+ candidateLinks:
1167
+ type: array
1168
+ items:
1169
+ type: object
1170
+ required: [from, relation, to, confidence, reason]
1171
+ properties:
1172
+ from:
1173
+ type: string
1174
+ description: Source spec ID.
1175
+ relation:
1176
+ type: string
1177
+ description: Relation type (implements, verifiedBy, satisfies, etc.).
1178
+ to:
1179
+ type: string
1180
+ description: Target ID.
1181
+ confidence:
1182
+ type: number
1183
+ minimum: 0
1184
+ maximum: 1
1185
+ reason:
1186
+ type: string
1187
+
1188
+ ImpactExplainResult:
1189
+ type: object
1190
+ description: Human-readable explanation of impact analysis output.
1191
+ allOf:
1192
+ - $ref: 'components.yaml#/schemas/agent-audit-result'
1193
+ - type: object
1194
+ required: [explanation]
1195
+ properties:
1196
+ explanation:
1197
+ type: string
1198
+ description: Multi-paragraph human-readable explanation in Markdown format.
1199
+ affectedArtifacts:
1200
+ type: array
1201
+ items:
1202
+ type: object
1203
+ required: [type, id, summary]
1204
+ properties:
1205
+ type:
1206
+ type: string
1207
+ enum: [spec, api, ddl, test, annotation]
1208
+ id:
1209
+ type: string
1210
+ summary:
1211
+ type: string
1212
+ testConsiderations:
1213
+ type: array
1214
+ items:
1215
+ type: string
1216
+ releaseRisk:
1217
+ type: string
1218
+ enum: [low, medium, high]
1219
+ sourceCommand:
1220
+ type: string
1221
+
1222
+ AcceptanceCriteriaResult:
1223
+ type: object
1224
+ description: Proposed acceptance criteria for design specs.
1225
+ allOf:
1226
+ - $ref: 'components.yaml#/schemas/agent-audit-result'
1227
+ - type: object
1228
+ required: [criteriaProposals]
1229
+ properties:
1230
+ criteriaProposals:
1231
+ type: array
1232
+ items:
1233
+ type: object
1234
+ required: [specId, criteria, rationale]
1235
+ properties:
1236
+ specId:
1237
+ type: string
1238
+ criteria:
1239
+ type: array
1240
+ items:
1241
+ type: string
1242
+ rationale:
1243
+ type: string
1244
+
1245
+ ImpactAnalysisOutput:
1246
+ type: object
1247
+ description: >-
1248
+ JSON output from speckeeper impact --format json.
1249
+ Used as stdin input for explain-impact command.
1250
+ required: [target, targetType, impactedNodes]
1251
+ properties:
1252
+ target:
1253
+ type: string
1254
+ description: The spec ID that was analyzed.
1255
+ targetType:
1256
+ type: string
1257
+ description: Type of the target spec (requirement, usecase, entity, etc.).
1258
+ direction:
1259
+ type: string
1260
+ enum: [upstream, downstream, both]
1261
+ depth:
1262
+ type: integer
1263
+ impactedNodes:
1264
+ type: array
1265
+ items:
1266
+ type: object
1267
+ required: [id, type, depth, impactType]
1268
+ properties:
1269
+ id:
1270
+ type: string
1271
+ type:
1272
+ type: string
1273
+ depth:
1274
+ type: integer
1275
+ impactType:
1276
+ type: string
1277
+ enum: [direct, indirect]
1278
+ relations:
1279
+ type: array
1280
+ items:
1281
+ type: object
1282
+ properties:
1283
+ type:
1284
+ type: string
1285
+ from:
1286
+ type: string
1287
+ to:
1288
+ type: string