speckeeper 0.13.0 → 0.14.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
@@ -691,7 +691,7 @@ command_sets:
691
691
 
692
692
  usage:
693
693
  - speckeeper audit-requirements
694
- - speckeeper audit-requirements --adapter gemini --dry-run
694
+ - speckeeper audit-requirements --adapter gemini --show-prompt
695
695
  - speckeeper audit-requirements --report-format json --output audit.json
696
696
 
697
697
  options:
@@ -720,19 +720,6 @@ command_sets:
720
720
  schema:
721
721
  type: string
722
722
 
723
- - name: dry-run
724
- aliases: [n]
725
- description: Output the constructed prompt without calling LLM.
726
- schema:
727
- type: boolean
728
- default: false
729
-
730
- - name: show-prompt
731
- description: Display the constructed LLM prompt on stderr.
732
- schema:
733
- type: boolean
734
- default: false
735
-
736
723
  - name: fail-on
737
724
  description: Minimum severity that causes a non-zero exit.
738
725
  value_name: level
@@ -796,7 +783,7 @@ command_sets:
796
783
 
797
784
  x-agent:
798
785
  recommended_before_use:
799
- - "Run with --dry-run first to preview the prompt"
786
+ - "Run with --show-prompt first to preview the prompt"
800
787
  retryableExitCodes: [12]
801
788
 
802
789
  # ── propose-trace-links ─────────────────────────────
@@ -841,19 +828,6 @@ command_sets:
841
828
  schema:
842
829
  type: string
843
830
 
844
- - name: dry-run
845
- aliases: [n]
846
- description: Output the constructed prompt without calling LLM.
847
- schema:
848
- type: boolean
849
- default: false
850
-
851
- - name: show-prompt
852
- description: Display the constructed LLM prompt on stderr.
853
- schema:
854
- type: boolean
855
- default: false
856
-
857
831
  - name: fail-on
858
832
  description: Minimum severity that causes a non-zero exit.
859
833
  value_name: level
@@ -917,7 +891,7 @@ command_sets:
917
891
 
918
892
  x-agent:
919
893
  recommended_before_use:
920
- - "Run with --dry-run first to preview the prompt"
894
+ - "Run with --show-prompt first to preview the prompt"
921
895
  retryableExitCodes: [12]
922
896
 
923
897
  # ── explain-impact ──────────────────────────────────
@@ -959,19 +933,6 @@ command_sets:
959
933
  schema:
960
934
  type: string
961
935
 
962
- - name: dry-run
963
- aliases: [n]
964
- description: Output the constructed prompt without calling LLM.
965
- schema:
966
- type: boolean
967
- default: false
968
-
969
- - name: show-prompt
970
- description: Display the constructed LLM prompt on stderr.
971
- schema:
972
- type: boolean
973
- default: false
974
-
975
936
  - name: fail-on
976
937
  description: Minimum severity that causes a non-zero exit.
977
938
  value_name: level
@@ -1035,7 +996,7 @@ command_sets:
1035
996
 
1036
997
  x-agent:
1037
998
  recommended_before_use:
1038
- - "Run with --dry-run first to preview the prompt"
999
+ - "Run with --show-prompt first to preview the prompt"
1039
1000
  retryableExitCodes: [12]
1040
1001
 
1041
1002
  # ── propose-acceptance-criteria ─────────────────────
@@ -1052,7 +1013,7 @@ command_sets:
1052
1013
  usage:
1053
1014
  - speckeeper propose-acceptance-criteria
1054
1015
  - speckeeper propose-acceptance-criteria FR-001 FR-002
1055
- - speckeeper propose-acceptance-criteria --adapter gemini --dry-run
1016
+ - speckeeper propose-acceptance-criteria --adapter gemini --show-prompt
1056
1017
 
1057
1018
  arguments:
1058
1019
  - name: specIds
@@ -1090,19 +1051,6 @@ command_sets:
1090
1051
  schema:
1091
1052
  type: string
1092
1053
 
1093
- - name: dry-run
1094
- aliases: [n]
1095
- description: Output the constructed prompt without calling LLM.
1096
- schema:
1097
- type: boolean
1098
- default: false
1099
-
1100
- - name: show-prompt
1101
- description: Display the constructed LLM prompt on stderr.
1102
- schema:
1103
- type: boolean
1104
- default: false
1105
-
1106
1054
  - name: fail-on
1107
1055
  description: Minimum severity that causes a non-zero exit.
1108
1056
  value_name: level
@@ -1166,7 +1114,7 @@ command_sets:
1166
1114
 
1167
1115
  x-agent:
1168
1116
  recommended_before_use:
1169
- - "Run with --dry-run first to preview the prompt"
1117
+ - "Run with --show-prompt first to preview the prompt"
1170
1118
  retryableExitCodes: [12]
1171
1119
 
1172
1120
  components:
package/dist/cli.js CHANGED
@@ -1340,20 +1340,6 @@ var commandDefinitions = {
1340
1340
  "type": "string"
1341
1341
  }
1342
1342
  },
1343
- {
1344
- "name": "dry-run",
1345
- "schema": {
1346
- "type": "boolean",
1347
- "default": false
1348
- }
1349
- },
1350
- {
1351
- "name": "show-prompt",
1352
- "schema": {
1353
- "type": "boolean",
1354
- "default": false
1355
- }
1356
- },
1357
1343
  {
1358
1344
  "name": "fail-on",
1359
1345
  "schema": {
@@ -1442,20 +1428,6 @@ var commandDefinitions = {
1442
1428
  "type": "string"
1443
1429
  }
1444
1430
  },
1445
- {
1446
- "name": "dry-run",
1447
- "schema": {
1448
- "type": "boolean",
1449
- "default": false
1450
- }
1451
- },
1452
- {
1453
- "name": "show-prompt",
1454
- "schema": {
1455
- "type": "boolean",
1456
- "default": false
1457
- }
1458
- },
1459
1431
  {
1460
1432
  "name": "fail-on",
1461
1433
  "schema": {
@@ -1533,20 +1505,6 @@ var commandDefinitions = {
1533
1505
  "type": "string"
1534
1506
  }
1535
1507
  },
1536
- {
1537
- "name": "dry-run",
1538
- "schema": {
1539
- "type": "boolean",
1540
- "default": false
1541
- }
1542
- },
1543
- {
1544
- "name": "show-prompt",
1545
- "schema": {
1546
- "type": "boolean",
1547
- "default": false
1548
- }
1549
- },
1550
1508
  {
1551
1509
  "name": "fail-on",
1552
1510
  "schema": {
@@ -1635,20 +1593,6 @@ var commandDefinitions = {
1635
1593
  "type": "string"
1636
1594
  }
1637
1595
  },
1638
- {
1639
- "name": "dry-run",
1640
- "schema": {
1641
- "type": "boolean",
1642
- "default": false
1643
- }
1644
- },
1645
- {
1646
- "name": "show-prompt",
1647
- "schema": {
1648
- "type": "boolean",
1649
- "default": false
1650
- }
1651
- },
1652
1596
  {
1653
1597
  "name": "fail-on",
1654
1598
  "schema": {
@@ -1809,40 +1753,60 @@ function createProgram(handlers2, version) {
1809
1753
  }
1810
1754
  await handlers2.convert(file, opts, globalOpts);
1811
1755
  });
1812
- program.command("audit-requirements").description("Run LLM-based requirement quality audit.").option("-c, --config <path>", "Path to config file.").option("-a, --adapter <name>", "SDK adapter to use for LLM execution.").option("--model <name>", "LLM model override.").option("-n, --dry-run", "Output the constructed prompt without calling LLM.", false).option("--show-prompt", "Display the constructed LLM prompt on stderr.", false).option("--fail-on <level>", "Minimum severity that causes a non-zero exit.", "error").option("-o, --output <file>", "Write result to a file instead of stdout.").option("--report-format <fmt>", "Output format for the audit report.", "json").action(async (opts, cmd) => {
1756
+ program.command("audit-requirements").description("Run LLM-based requirement quality audit.").option("-c, --config <path>", "Path to config file.").option("-a, --adapter <name>", "SDK adapter to use for LLM execution.").option("--model <name>", "LLM model override.").option("--fail-on <level>", "Minimum severity that causes a non-zero exit.", "error").option("-o, --output <file>", "Write result to a file instead of stdout.").option("--report-format <fmt>", "Output format for the audit report.", "json").option("--show-prompt", "Output the constructed prompt without calling the LLM API.", false).action(async (opts, cmd) => {
1813
1757
  const globalOpts = cmd.optsWithGlobals();
1814
1758
  if (globalOpts.introspect) {
1815
1759
  const policy = deriveCommandPolicy("audit-requirements", opts);
1816
1760
  console.log(JSON.stringify(policy, null, 2));
1817
1761
  return;
1818
1762
  }
1763
+ if (opts.showPrompt) {
1764
+ const prompt = await handlers2.auditRequirements(opts, globalOpts);
1765
+ if (typeof prompt === "string") process.stdout.write(prompt + "\n");
1766
+ return;
1767
+ }
1819
1768
  await handlers2.auditRequirements(opts, globalOpts);
1820
1769
  });
1821
- program.command("propose-trace-links").description("LLM-based traceability link proposal.").option("-c, --config <path>", "Path to config file.").option("-a, --adapter <name>", "SDK adapter to use for LLM execution.").option("--model <name>", "LLM model override.").option("-n, --dry-run", "Output the constructed prompt without calling LLM.", false).option("--show-prompt", "Display the constructed LLM prompt on stderr.", false).option("--fail-on <level>", "Minimum severity that causes a non-zero exit.", "error").option("-o, --output <file>", "Write result to a file instead of stdout.").option("--report-format <fmt>", "Output format for the report.", "json").action(async (opts, cmd) => {
1770
+ program.command("propose-trace-links").description("LLM-based traceability link proposal.").option("-c, --config <path>", "Path to config file.").option("-a, --adapter <name>", "SDK adapter to use for LLM execution.").option("--model <name>", "LLM model override.").option("--fail-on <level>", "Minimum severity that causes a non-zero exit.", "error").option("-o, --output <file>", "Write result to a file instead of stdout.").option("--report-format <fmt>", "Output format for the report.", "json").option("--show-prompt", "Output the constructed prompt without calling the LLM API.", false).action(async (opts, cmd) => {
1822
1771
  const globalOpts = cmd.optsWithGlobals();
1823
1772
  if (globalOpts.introspect) {
1824
1773
  const policy = deriveCommandPolicy("propose-trace-links", opts);
1825
1774
  console.log(JSON.stringify(policy, null, 2));
1826
1775
  return;
1827
1776
  }
1777
+ if (opts.showPrompt) {
1778
+ const prompt = await handlers2.proposeTraceLinks(opts, globalOpts);
1779
+ if (typeof prompt === "string") process.stdout.write(prompt + "\n");
1780
+ return;
1781
+ }
1828
1782
  await handlers2.proposeTraceLinks(opts, globalOpts);
1829
1783
  });
1830
- program.command("explain-impact").description("LLM-based explanation of impact analysis output.").option("-a, --adapter <name>", "SDK adapter to use for LLM execution.").option("--model <name>", "LLM model override.").option("-n, --dry-run", "Output the constructed prompt without calling LLM.", false).option("--show-prompt", "Display the constructed LLM prompt on stderr.", false).option("--fail-on <level>", "Minimum severity that causes a non-zero exit.", "error").option("-o, --output <file>", "Write result to a file instead of stdout.").option("--report-format <fmt>", "Output format for the report.", "json").action(async (opts, cmd) => {
1784
+ program.command("explain-impact").description("LLM-based explanation of impact analysis output.").option("-a, --adapter <name>", "SDK adapter to use for LLM execution.").option("--model <name>", "LLM model override.").option("--fail-on <level>", "Minimum severity that causes a non-zero exit.", "error").option("-o, --output <file>", "Write result to a file instead of stdout.").option("--report-format <fmt>", "Output format for the report.", "json").option("--show-prompt", "Output the constructed prompt without calling the LLM API.", false).action(async (opts, cmd) => {
1831
1785
  const globalOpts = cmd.optsWithGlobals();
1832
1786
  if (globalOpts.introspect) {
1833
1787
  const policy = deriveCommandPolicy("explain-impact", opts);
1834
1788
  console.log(JSON.stringify(policy, null, 2));
1835
1789
  return;
1836
1790
  }
1791
+ if (opts.showPrompt) {
1792
+ const prompt = await handlers2.explainImpact(opts, globalOpts);
1793
+ if (typeof prompt === "string") process.stdout.write(prompt + "\n");
1794
+ return;
1795
+ }
1837
1796
  await handlers2.explainImpact(opts, globalOpts);
1838
1797
  });
1839
- program.command("propose-acceptance-criteria").description("LLM-based acceptance criteria proposal.").argument("[specIds...]", "Spec IDs to propose criteria for. Defaults to all specs if omitted.").option("-c, --config <path>", "Path to config file.").option("-a, --adapter <name>", "SDK adapter to use for LLM execution.").option("--model <name>", "LLM model override.").option("-n, --dry-run", "Output the constructed prompt without calling LLM.", false).option("--show-prompt", "Display the constructed LLM prompt on stderr.", false).option("--fail-on <level>", "Minimum severity that causes a non-zero exit.", "error").option("-o, --output <file>", "Write result to a file instead of stdout.").option("--report-format <fmt>", "Output format for the report.", "json").action(async (specIds, opts, cmd) => {
1798
+ program.command("propose-acceptance-criteria").description("LLM-based acceptance criteria proposal.").argument("[specIds...]", "Spec IDs to propose criteria for. Defaults to all specs if omitted.").option("-c, --config <path>", "Path to config file.").option("-a, --adapter <name>", "SDK adapter to use for LLM execution.").option("--model <name>", "LLM model override.").option("--fail-on <level>", "Minimum severity that causes a non-zero exit.", "error").option("-o, --output <file>", "Write result to a file instead of stdout.").option("--report-format <fmt>", "Output format for the report.", "json").option("--show-prompt", "Output the constructed prompt without calling the LLM API.", false).action(async (specIds, opts, cmd) => {
1840
1799
  const globalOpts = cmd.optsWithGlobals();
1841
1800
  if (globalOpts.introspect) {
1842
1801
  const policy = deriveCommandPolicy("propose-acceptance-criteria", opts);
1843
1802
  console.log(JSON.stringify(policy, null, 2));
1844
1803
  return;
1845
1804
  }
1805
+ if (opts.showPrompt) {
1806
+ const prompt = await handlers2.proposeAcceptanceCriteria(specIds, opts, globalOpts);
1807
+ if (typeof prompt === "string") process.stdout.write(prompt + "\n");
1808
+ return;
1809
+ }
1846
1810
  await handlers2.proposeAcceptanceCriteria(specIds, opts, globalOpts);
1847
1811
  });
1848
1812
  return program;
@@ -4448,19 +4412,7 @@ async function createAdapter(runtimePkg, name, config) {
4448
4412
  );
4449
4413
  }
4450
4414
  }
4451
- async function runAgentTask(userRequest, taskId, auditConfig, options) {
4452
- if (options.dryRun) {
4453
- return {
4454
- taskId,
4455
- data: null,
4456
- raw: "",
4457
- prompt: userRequest,
4458
- dryRun: true,
4459
- status: "success",
4460
- followUpsUsed: 0,
4461
- retriesUsed: 0
4462
- };
4463
- }
4415
+ async function runAgentTask(userRequest, taskId, auditConfig, _options) {
4464
4416
  const RUNTIME_PKG = ["agent-contracts", "runtime"].join("-");
4465
4417
  let runTask;
4466
4418
  let agentRegistry2, taskRegistry2, handoffSchemas2;
@@ -4470,7 +4422,7 @@ async function runAgentTask(userRequest, taskId, auditConfig, options) {
4470
4422
  } catch {
4471
4423
  throw Object.assign(
4472
4424
  new Error(
4473
- "agent-contracts-runtime is not installed. Install it to use this command, or use --dry-run to inspect the prompt.\n npm install agent-contracts-runtime"
4425
+ "agent-contracts-runtime is not installed. Install it to use this command, or use --show-prompt to inspect the prompt.\n npm install agent-contracts-runtime"
4474
4426
  ),
4475
4427
  { exitCode: EXIT_RUNTIME_MISSING }
4476
4428
  );
@@ -4507,7 +4459,6 @@ async function runAgentTask(userRequest, taskId, auditConfig, options) {
4507
4459
  data: outcome.status === "success" ? outcome.data : null,
4508
4460
  raw: outcome.raw ?? "",
4509
4461
  prompt: userRequest,
4510
- dryRun: false,
4511
4462
  status: outcome.status,
4512
4463
  errorMessage: outcome.status === "error" ? outcome.message : outcome.status === "escalation" ? outcome.reason : outcome.status === "validation_error" ? outcome.errors?.message : void 0,
4513
4464
  followUpsUsed: result.follow_ups_used,
@@ -4515,7 +4466,6 @@ async function runAgentTask(userRequest, taskId, auditConfig, options) {
4515
4466
  };
4516
4467
  }
4517
4468
  function computeExitCode(result, options) {
4518
- if (result.dryRun) return 0;
4519
4469
  if (result.status !== "success" || !result.data) return 1;
4520
4470
  const failOn = options.failOn ?? "error";
4521
4471
  const severityOrder = ["info", "warning", "error", "critical"];
@@ -4526,9 +4476,6 @@ function computeExitCode(result, options) {
4526
4476
  return hasBlocking ? 10 : 0;
4527
4477
  }
4528
4478
  function formatResultText(result) {
4529
- if (result.dryRun) {
4530
- return result.prompt;
4531
- }
4532
4479
  if (result.status !== "success" || !result.data) {
4533
4480
  return result.errorMessage ?? `Task failed with status: ${result.status}`;
4534
4481
  }
@@ -4564,20 +4511,12 @@ function formatResultText(result) {
4564
4511
  return lines.join("\n");
4565
4512
  }
4566
4513
  function formatResultJson(result) {
4567
- if (result.dryRun) {
4568
- return JSON.stringify({ dryRun: true, prompt: result.prompt }, null, 2);
4569
- }
4570
4514
  if (!result.data) {
4571
4515
  return JSON.stringify({ error: result.errorMessage, status: result.status }, null, 2);
4572
4516
  }
4573
4517
  return JSON.stringify(result.data, null, 2);
4574
4518
  }
4575
4519
  function formatResultYaml(result) {
4576
- if (result.dryRun) {
4577
- return `dryRun: true
4578
- prompt: |
4579
- ${indent(result.prompt)}`;
4580
- }
4581
4520
  if (!result.data) {
4582
4521
  return `error: ${JSON.stringify(result.errorMessage)}
4583
4522
  status: ${result.status}`;
@@ -4658,12 +4597,14 @@ ${val}`;
4658
4597
  // src/cli/audit-requirements.ts
4659
4598
  async function commandAuditRequirements(opts) {
4660
4599
  const context = await buildAuditRequirementsContext(opts.config);
4600
+ if (opts.showPrompt) {
4601
+ return context;
4602
+ }
4661
4603
  const auditConfig = {
4662
4604
  adapter: opts.adapter,
4663
4605
  model: opts.model
4664
4606
  };
4665
4607
  const auditOpts = {
4666
- dryRun: opts.dryRun,
4667
4608
  failOn: opts.failOn
4668
4609
  };
4669
4610
  try {
@@ -4692,12 +4633,14 @@ async function commandAuditRequirements(opts) {
4692
4633
  }
4693
4634
  async function commandProposeTraceLinks(opts) {
4694
4635
  const context = await buildProposeTraceLinksContext(opts.config);
4636
+ if (opts.showPrompt) {
4637
+ return context;
4638
+ }
4695
4639
  const auditConfig = {
4696
4640
  adapter: opts.adapter,
4697
4641
  model: opts.model
4698
4642
  };
4699
4643
  const auditOpts = {
4700
- dryRun: opts.dryRun,
4701
4644
  failOn: opts.failOn
4702
4645
  };
4703
4646
  try {
@@ -4732,12 +4675,14 @@ async function commandExplainImpact(opts) {
4732
4675
  process.exit(2);
4733
4676
  }
4734
4677
  const context = buildExplainImpactContext(stdin);
4678
+ if (opts.showPrompt) {
4679
+ return context;
4680
+ }
4735
4681
  const auditConfig = {
4736
4682
  adapter: opts.adapter,
4737
4683
  model: opts.model
4738
4684
  };
4739
4685
  const auditOpts = {
4740
- dryRun: opts.dryRun,
4741
4686
  failOn: opts.failOn
4742
4687
  };
4743
4688
  try {
@@ -4778,12 +4723,14 @@ function readStdin() {
4778
4723
  async function commandProposeAcceptanceCriteria(specIds, opts) {
4779
4724
  const targetSpecIds = specIds.length > 0 ? specIds : void 0;
4780
4725
  const context = await buildProposeAcceptanceCriteriaContext(opts.config, targetSpecIds);
4726
+ if (opts.showPrompt) {
4727
+ return context;
4728
+ }
4781
4729
  const auditConfig = {
4782
4730
  adapter: opts.adapter,
4783
4731
  model: opts.model
4784
4732
  };
4785
4733
  const auditOpts = {
4786
- dryRun: opts.dryRun,
4787
4734
  failOn: opts.failOn
4788
4735
  };
4789
4736
  try {
@@ -4849,49 +4796,41 @@ var handlers = {
4849
4796
  convert: async (file, opts) => {
4850
4797
  await runConvert(file, opts);
4851
4798
  },
4852
- auditRequirements: async (opts) => {
4853
- await commandAuditRequirements({
4854
- config: opts.config,
4855
- adapter: opts.adapter,
4856
- model: opts.model,
4857
- dryRun: opts.dryRun,
4858
- failOn: opts.failOn,
4859
- output: opts.output,
4860
- reportFormat: opts.reportFormat
4861
- });
4862
- },
4863
- proposeTraceLinks: async (opts) => {
4864
- await commandProposeTraceLinks({
4865
- config: opts.config,
4866
- adapter: opts.adapter,
4867
- model: opts.model,
4868
- dryRun: opts.dryRun,
4869
- failOn: opts.failOn,
4870
- output: opts.output,
4871
- reportFormat: opts.reportFormat
4872
- });
4873
- },
4874
- explainImpact: async (opts) => {
4875
- await commandExplainImpact({
4876
- adapter: opts.adapter,
4877
- model: opts.model,
4878
- dryRun: opts.dryRun,
4879
- failOn: opts.failOn,
4880
- output: opts.output,
4881
- reportFormat: opts.reportFormat
4882
- });
4883
- },
4884
- proposeAcceptanceCriteria: async (specIds, opts) => {
4885
- await commandProposeAcceptanceCriteria(specIds, {
4886
- config: opts.config,
4887
- adapter: opts.adapter,
4888
- model: opts.model,
4889
- dryRun: opts.dryRun,
4890
- failOn: opts.failOn,
4891
- output: opts.output,
4892
- reportFormat: opts.reportFormat
4893
- });
4894
- }
4799
+ auditRequirements: (opts) => commandAuditRequirements({
4800
+ config: opts.config,
4801
+ adapter: opts.adapter,
4802
+ model: opts.model,
4803
+ showPrompt: opts.showPrompt,
4804
+ failOn: opts.failOn,
4805
+ output: opts.output,
4806
+ reportFormat: opts.reportFormat
4807
+ }),
4808
+ proposeTraceLinks: (opts) => commandProposeTraceLinks({
4809
+ config: opts.config,
4810
+ adapter: opts.adapter,
4811
+ model: opts.model,
4812
+ showPrompt: opts.showPrompt,
4813
+ failOn: opts.failOn,
4814
+ output: opts.output,
4815
+ reportFormat: opts.reportFormat
4816
+ }),
4817
+ explainImpact: (opts) => commandExplainImpact({
4818
+ adapter: opts.adapter,
4819
+ model: opts.model,
4820
+ showPrompt: opts.showPrompt,
4821
+ failOn: opts.failOn,
4822
+ output: opts.output,
4823
+ reportFormat: opts.reportFormat
4824
+ }),
4825
+ proposeAcceptanceCriteria: (specIds, opts) => commandProposeAcceptanceCriteria(specIds, {
4826
+ config: opts.config,
4827
+ adapter: opts.adapter,
4828
+ model: opts.model,
4829
+ showPrompt: opts.showPrompt,
4830
+ failOn: opts.failOn,
4831
+ output: opts.output,
4832
+ reportFormat: opts.reportFormat
4833
+ })
4895
4834
  };
4896
4835
  createProgram(handlers, getVersion()).parse();
4897
4836
  //# sourceMappingURL=cli.js.map