speckeeper 0.9.4 → 0.10.1
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/README.md +122 -2
- package/cli-contract.yaml +739 -25
- package/dist/cli.js +1177 -1
- package/dist/cli.js.map +1 -1
- package/docs/cli-reference.md +345 -20
- package/docs/design/cli-commands.md +181 -0
- package/docs/model-guide.md +102 -98
- package/package.json +13 -2
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.
|
|
6
|
+
version: 0.10.1
|
|
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: [
|
|
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:
|
|
67
|
-
requiresConfirmation:
|
|
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:
|
|
212
|
+
format: '{options.format}'
|
|
206
213
|
|
|
207
214
|
'1':
|
|
208
215
|
description: Lint issues found (errors or warnings with --strict).
|
|
209
|
-
|
|
210
|
-
format:
|
|
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:
|
|
281
|
+
format: '{options.format}'
|
|
270
282
|
|
|
271
283
|
'1':
|
|
272
284
|
description: Drift detected (with --fail-on-drift), or update failed.
|
|
273
|
-
|
|
274
|
-
format:
|
|
285
|
+
stdout:
|
|
286
|
+
format: '{options.format}'
|
|
275
287
|
|
|
276
288
|
x-agent:
|
|
277
|
-
riskLevel:
|
|
278
|
-
requiresConfirmation:
|
|
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:
|
|
370
|
+
format: '{options.format}'
|
|
346
371
|
|
|
347
372
|
'1':
|
|
348
373
|
description: Check failures found (missing specs, structural mismatches, or coverage gaps).
|
|
349
|
-
|
|
350
|
-
format:
|
|
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:
|
|
503
|
+
valueName: n
|
|
469
504
|
schema:
|
|
470
|
-
type:
|
|
471
|
-
|
|
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:
|
|
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: [
|
|
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:
|
|
570
|
-
requiresConfirmation:
|
|
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
|