create-quiver 0.15.0 → 0.15.2

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.
Files changed (96) hide show
  1. package/.github/workflows/ci.yml +3 -0
  2. package/CHANGELOG.md +6 -0
  3. package/README.md +33 -0
  4. package/README_FOR_AI.md +13 -6
  5. package/ROADMAP.md +5 -0
  6. package/docs/AI_CONTEXT.md.template +4 -0
  7. package/docs/AI_ONBOARDING_PROMPT.md.template +8 -0
  8. package/docs/CLI_UX_GUIDE.md +31 -2
  9. package/docs/COMMANDS.md.template +16 -5
  10. package/docs/TROUBLESHOOTING.md +70 -0
  11. package/docs/TROUBLESHOOTING.md.template +20 -0
  12. package/docs/WORKFLOW.md.template +2 -2
  13. package/docs/getting-started/installation.md +86 -0
  14. package/docs/reference/commands.md +39 -5
  15. package/package.json +1 -1
  16. package/specs/quiver-v31-ai-model-catalog-agent-selection/EVIDENCE_REPORT.md +185 -0
  17. package/specs/quiver-v31-ai-model-catalog-agent-selection/EXECUTION_PLAN.md +85 -0
  18. package/specs/quiver-v31-ai-model-catalog-agent-selection/SPEC.md +337 -0
  19. package/specs/quiver-v31-ai-model-catalog-agent-selection/STATUS.md +30 -0
  20. package/specs/quiver-v31-ai-model-catalog-agent-selection/pr.md +98 -0
  21. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-00-spec-foundation/CLOSURE_BRIEF.md +30 -0
  22. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-00-spec-foundation/EXECUTION_BRIEF.md +51 -0
  23. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-00-spec-foundation/slice.json +62 -0
  24. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-01-model-catalog-alias-normalization/CLOSURE_BRIEF.md +32 -0
  25. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-01-model-catalog-alias-normalization/EXECUTION_BRIEF.md +53 -0
  26. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-01-model-catalog-alias-normalization/slice.json +72 -0
  27. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-02-interactive-agent-set-selectors/CLOSURE_BRIEF.md +36 -0
  28. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-02-interactive-agent-set-selectors/EXECUTION_BRIEF.md +56 -0
  29. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-02-interactive-agent-set-selectors/slice.json +78 -0
  30. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-03-agent-doctor-repair/CLOSURE_BRIEF.md +36 -0
  31. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-03-agent-doctor-repair/EXECUTION_BRIEF.md +57 -0
  32. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-03-agent-doctor-repair/slice.json +77 -0
  33. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-04-shared-preflight-provider-errors/CLOSURE_BRIEF.md +35 -0
  34. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-04-shared-preflight-provider-errors/EXECUTION_BRIEF.md +55 -0
  35. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-04-shared-preflight-provider-errors/slice.json +84 -0
  36. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-05-ai-models-list/CLOSURE_BRIEF.md +32 -0
  37. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-05-ai-models-list/EXECUTION_BRIEF.md +52 -0
  38. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-05-ai-models-list/slice.json +72 -0
  39. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-06-docs-templates-alignment/CLOSURE_BRIEF.md +33 -0
  40. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-06-docs-templates-alignment/EXECUTION_BRIEF.md +58 -0
  41. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-06-docs-templates-alignment/slice.json +84 -0
  42. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-07-tests-smokes-release-readiness/CLOSURE_BRIEF.md +32 -0
  43. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-07-tests-smokes-release-readiness/EXECUTION_BRIEF.md +59 -0
  44. package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-07-tests-smokes-release-readiness/slice.json +94 -0
  45. package/specs/quiver-v32-npx-installation-guidance/EVIDENCE_REPORT.md +26 -0
  46. package/specs/quiver-v32-npx-installation-guidance/SPEC.md +55 -0
  47. package/specs/quiver-v32-npx-installation-guidance/STATUS.md +23 -0
  48. package/specs/quiver-v32-npx-installation-guidance/pr.md +72 -0
  49. package/specs/quiver-v32-npx-installation-guidance/slices/slice-00-installation-docs/CLOSURE_BRIEF.md +31 -0
  50. package/specs/quiver-v32-npx-installation-guidance/slices/slice-00-installation-docs/EXECUTION_BRIEF.md +56 -0
  51. package/specs/quiver-v32-npx-installation-guidance/slices/slice-00-installation-docs/slice.json +75 -0
  52. package/specs/quiver-v33-approval-ux-and-planner-progress/EVIDENCE_REPORT.md +93 -0
  53. package/specs/quiver-v33-approval-ux-and-planner-progress/EXECUTION_PLAN.md +83 -0
  54. package/specs/quiver-v33-approval-ux-and-planner-progress/SPEC.md +158 -0
  55. package/specs/quiver-v33-approval-ux-and-planner-progress/STATUS.md +31 -0
  56. package/specs/quiver-v33-approval-ux-and-planner-progress/pr.md +109 -0
  57. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-00-approval-ux-foundation/CLOSURE_BRIEF.md +30 -0
  58. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-00-approval-ux-foundation/EXECUTION_BRIEF.md +56 -0
  59. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-00-approval-ux-foundation/slice.json +65 -0
  60. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-01-approval-candidates-model/CLOSURE_BRIEF.md +19 -0
  61. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-01-approval-candidates-model/EXECUTION_BRIEF.md +51 -0
  62. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-01-approval-candidates-model/slice.json +74 -0
  63. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-02-approve-interactive-selection/CLOSURE_BRIEF.md +20 -0
  64. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-02-approve-interactive-selection/EXECUTION_BRIEF.md +53 -0
  65. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-02-approve-interactive-selection/slice.json +79 -0
  66. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-03-technical-plan-review-decision-data/CLOSURE_BRIEF.md +19 -0
  67. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-03-technical-plan-review-decision-data/EXECUTION_BRIEF.md +50 -0
  68. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-03-technical-plan-review-decision-data/slice.json +75 -0
  69. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-04-revise-input-guardrails/CLOSURE_BRIEF.md +19 -0
  70. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-04-revise-input-guardrails/EXECUTION_BRIEF.md +51 -0
  71. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-04-revise-input-guardrails/slice.json +73 -0
  72. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-05-provider-progress-alignment/CLOSURE_BRIEF.md +20 -0
  73. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-05-provider-progress-alignment/EXECUTION_BRIEF.md +51 -0
  74. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-05-provider-progress-alignment/slice.json +91 -0
  75. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-06-workflow-surface-integration/CLOSURE_BRIEF.md +20 -0
  76. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-06-workflow-surface-integration/EXECUTION_BRIEF.md +53 -0
  77. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-06-workflow-surface-integration/slice.json +87 -0
  78. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-07-docs-tests-release-readiness/CLOSURE_BRIEF.md +21 -0
  79. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-07-docs-tests-release-readiness/EXECUTION_BRIEF.md +55 -0
  80. package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-07-docs-tests-release-readiness/slice.json +97 -0
  81. package/src/create-quiver/commands/ai.js +561 -46
  82. package/src/create-quiver/commands/flow.js +76 -14
  83. package/src/create-quiver/commands/spec.js +8 -1
  84. package/src/create-quiver/index.js +36 -12
  85. package/src/create-quiver/lib/agent-profiles.js +332 -4
  86. package/src/create-quiver/lib/ai/approval-candidates.js +86 -0
  87. package/src/create-quiver/lib/ai/execution-plan.js +7 -2
  88. package/src/create-quiver/lib/ai/executor.js +9 -2
  89. package/src/create-quiver/lib/ai/model-catalog.js +333 -0
  90. package/src/create-quiver/lib/ai/plan-review.js +77 -1
  91. package/src/create-quiver/lib/ai/providers.js +143 -4
  92. package/src/create-quiver/lib/ai/run-state.js +21 -4
  93. package/src/create-quiver/lib/approvals.js +103 -0
  94. package/src/create-quiver/lib/cli/selectors.js +53 -0
  95. package/src/create-quiver/lib/git.js +13 -4
  96. package/src/create-quiver/lib/paths.js +45 -3
@@ -2,6 +2,7 @@ const fs = require('fs');
2
2
  const path = require('path');
3
3
 
4
4
  const { readPhaseApproval } = require('../lib/approvals');
5
+ const { approvalCandidateCommand, buildApprovalCandidateReport, formatCandidateSummary } = require('../lib/ai/approval-candidates');
5
6
  const { readPlanReview } = require('../lib/ai/plan-review');
6
7
  const { listAgentProfiles } = require('../lib/agent-profiles');
7
8
  const { readProjectScanStatus } = require('../lib/project-scan');
@@ -89,6 +90,25 @@ function safeReadPlanReview(projectRoot) {
89
90
  }
90
91
  }
91
92
 
93
+ function safeBuildApprovalCandidateReport(projectRoot, phase) {
94
+ try {
95
+ return buildApprovalCandidateReport(projectRoot, phase);
96
+ } catch (error) {
97
+ return {
98
+ phase,
99
+ approval_status: 'invalid',
100
+ latest_version: null,
101
+ current: null,
102
+ recommended: null,
103
+ candidates: [],
104
+ history: [],
105
+ approved: null,
106
+ next_command: 'npx create-quiver ai approvals',
107
+ error: error.message,
108
+ };
109
+ }
110
+ }
111
+
92
112
  function summarizeDocs(projectRoot) {
93
113
  const docs = {
94
114
  hasProjectMap: exists(projectRoot, 'docs/PROJECT_MAP.md'),
@@ -250,11 +270,23 @@ function detectFlowState(projectRoot) {
250
270
  acceptance: safeReadApproval(projectRoot, 'acceptance'),
251
271
  technicalPlan: safeReadApproval(projectRoot, 'technical-plan'),
252
272
  };
273
+ const approvalCandidates = {
274
+ acceptance: safeBuildApprovalCandidateReport(projectRoot, 'acceptance'),
275
+ technicalPlan: safeBuildApprovalCandidateReport(projectRoot, 'technical-plan'),
276
+ };
253
277
  const planReview = safeReadPlanReview(projectRoot);
254
278
  const agents = summarizeAgentProfiles(projectRoot);
255
279
  const packageManager = detectPackageManager(projectRoot);
256
280
  const specSlugs = listSpecSlugs(projectRoot);
257
281
  const facts = buildFacts({ initialized, docs, approvals, planReview, agents, packageManager, specSlugs, state });
282
+ const acceptanceApprovalCommand = approvalCandidateCommand(
283
+ approvalCandidates.acceptance,
284
+ 'npx create-quiver ai approve --phase acceptance --version <n>',
285
+ );
286
+ const technicalPlanApprovalCommand = approvalCandidateCommand(
287
+ approvalCandidates.technicalPlan,
288
+ 'npx create-quiver ai approve --phase technical-plan --version <n>',
289
+ );
258
290
 
259
291
  if (!initialized) {
260
292
  return baseReport({
@@ -321,10 +353,10 @@ function detectFlowState(projectRoot) {
321
353
  stage: 'agent-profiles-needed',
322
354
  label: 'agent profiles need setup',
323
355
  blockers: [`Missing ${agents.missingCore.join(' and ')} agent profile${agents.missingCore.length > 1 ? 's' : ''}.`],
324
- nextCommand: `npx create-quiver ai agent set ${role} --provider codex --model "<model-label>"`,
356
+ nextCommand: `npx create-quiver ai agent set ${role} --provider codex --model gpt-5.5`,
325
357
  suggestedCommands: [
326
358
  'npx create-quiver ai agent list',
327
- `npx create-quiver ai agent set ${role} --provider codex --model "<model-label>"`,
359
+ `npx create-quiver ai agent set ${role} --provider codex --model gpt-5.5`,
328
360
  ],
329
361
  facts,
330
362
  });
@@ -334,12 +366,12 @@ function detectFlowState(projectRoot) {
334
366
  return baseReport({
335
367
  stage: 'criteria-draft',
336
368
  label: 'acceptance criteria need approval',
337
- blockers: ['Acceptance criteria draft exists but is not approved.'],
338
- nextCommand: 'npx create-quiver ai approve --phase acceptance --version <n>',
369
+ blockers: ['Acceptance criteria draft exists but is not approved.', formatCandidateSummary(approvalCandidates.acceptance.current)].filter(Boolean),
370
+ nextCommand: acceptanceApprovalCommand,
339
371
  suggestedCommands: [
340
372
  'npx create-quiver ai approvals',
341
373
  'npx create-quiver ai revise --phase acceptance --input feedback.md --dry-run',
342
- 'npx create-quiver ai approve --phase acceptance --version <n>',
374
+ acceptanceApprovalCommand,
343
375
  ],
344
376
  facts,
345
377
  });
@@ -349,12 +381,12 @@ function detectFlowState(projectRoot) {
349
381
  return baseReport({
350
382
  stage: 'criteria-stale',
351
383
  label: 'acceptance criteria approval is stale',
352
- blockers: ['Acceptance criteria changed after approval.'],
353
- nextCommand: 'npx create-quiver ai approve --phase acceptance --version <n>',
384
+ blockers: ['Acceptance criteria changed after approval.', formatCandidateSummary(approvalCandidates.acceptance.current)].filter(Boolean),
385
+ nextCommand: acceptanceApprovalCommand,
354
386
  suggestedCommands: [
355
387
  'npx create-quiver ai approvals',
356
388
  'npx create-quiver ai revise --phase acceptance --input feedback.md --dry-run',
357
- 'npx create-quiver ai approve --phase acceptance --version <n>',
389
+ acceptanceApprovalCommand,
358
390
  ],
359
391
  facts,
360
392
  });
@@ -390,14 +422,29 @@ function detectFlowState(projectRoot) {
390
422
  });
391
423
  }
392
424
 
425
+ if (!approvalCandidates.technicalPlan.current?.approvable) {
426
+ return baseReport({
427
+ stage: 'technical-plan-review-blocked',
428
+ label: 'technical plan review requires revision',
429
+ blockers: ['Technical plan review blocks approval.', formatCandidateSummary(approvalCandidates.technicalPlan.current)].filter(Boolean),
430
+ nextCommand: approvalCandidates.technicalPlan.current?.next_command || 'npx create-quiver ai revise --phase technical-plan --input <feedback.md> --dry-run',
431
+ suggestedCommands: [
432
+ 'npx create-quiver ai approvals',
433
+ approvalCandidates.technicalPlan.current?.next_command || 'npx create-quiver ai revise --phase technical-plan --input <feedback.md> --dry-run',
434
+ 'npx create-quiver ai review-plan --dry-run',
435
+ ],
436
+ facts,
437
+ });
438
+ }
439
+
393
440
  return baseReport({
394
441
  stage: 'technical-plan-draft',
395
442
  label: 'technical plan needs approval',
396
- blockers: ['Technical plan draft was reviewed but is not approved.'],
397
- nextCommand: 'npx create-quiver ai approve --phase technical-plan --version <n>',
443
+ blockers: ['Technical plan draft was reviewed but is not approved.', formatCandidateSummary(approvalCandidates.technicalPlan.current)].filter(Boolean),
444
+ nextCommand: technicalPlanApprovalCommand,
398
445
  suggestedCommands: [
399
446
  'npx create-quiver ai approvals',
400
- 'npx create-quiver ai approve --phase technical-plan --version <n>',
447
+ technicalPlanApprovalCommand,
401
448
  ],
402
449
  facts,
403
450
  });
@@ -419,14 +466,29 @@ function detectFlowState(projectRoot) {
419
466
  });
420
467
  }
421
468
 
469
+ if (!approvalCandidates.technicalPlan.current?.approvable) {
470
+ return baseReport({
471
+ stage: 'technical-plan-review-blocked',
472
+ label: 'technical plan review requires revision',
473
+ blockers: ['Technical plan changed after approval and latest review blocks approval.', formatCandidateSummary(approvalCandidates.technicalPlan.current)].filter(Boolean),
474
+ nextCommand: approvalCandidates.technicalPlan.current?.next_command || 'npx create-quiver ai revise --phase technical-plan --input <feedback.md> --dry-run',
475
+ suggestedCommands: [
476
+ 'npx create-quiver ai approvals',
477
+ approvalCandidates.technicalPlan.current?.next_command || 'npx create-quiver ai revise --phase technical-plan --input <feedback.md> --dry-run',
478
+ 'npx create-quiver ai review-plan --dry-run',
479
+ ],
480
+ facts,
481
+ });
482
+ }
483
+
422
484
  return baseReport({
423
485
  stage: 'technical-plan-stale',
424
486
  label: 'technical plan approval is stale',
425
- blockers: ['Technical plan changed after approval and the latest draft was reviewed.'],
426
- nextCommand: 'npx create-quiver ai approve --phase technical-plan --version <n>',
487
+ blockers: ['Technical plan changed after approval and the latest draft was reviewed.', formatCandidateSummary(approvalCandidates.technicalPlan.current)].filter(Boolean),
488
+ nextCommand: technicalPlanApprovalCommand,
427
489
  suggestedCommands: [
428
490
  'npx create-quiver ai approvals',
429
- 'npx create-quiver ai approve --phase technical-plan --version <n>',
491
+ technicalPlanApprovalCommand,
430
492
  ],
431
493
  facts,
432
494
  });
@@ -7,6 +7,7 @@ const { selectOption } = require('../lib/cli/selectors');
7
7
  const { createUx } = require('../lib/cli/ux');
8
8
  const { parseJsonWithComments } = require('../lib/json');
9
9
  const { assertPathInsideRoot, validateProjectRelativePaths } = require('../lib/paths');
10
+ const { buildApprovalCandidateReport, formatReviewSummary } = require('../lib/ai/approval-candidates');
10
11
  const { resolveReviewedTechnicalPlanInput } = require('../lib/ai/plan-review');
11
12
  const {
12
13
  buildSpecGenerationManifest,
@@ -439,6 +440,11 @@ async function resolveInteractiveSpecCreateOptions(repoRoot, preview, options =
439
440
  stdinIsTTY: options.stdinIsTTY,
440
441
  stdoutIsTTY: options.stdoutIsTTY,
441
442
  };
443
+ const technicalPlanCandidates = buildApprovalCandidateReport(repoRoot, 'technical-plan');
444
+ const approvedVersion = technicalPlanCandidates.approved?.version
445
+ ? `v${technicalPlanCandidates.approved.version}`
446
+ : 'approved';
447
+ const reviewSummary = formatReviewSummary(technicalPlanCandidates.review);
442
448
  const selectedMethodology = await selectOption('¿Qué metodología aplica esta spec?', SPEC_METHODOLOGY_OPTIONS, {
443
449
  ...selectorOptions,
444
450
  defaultValue: 'wdd-sdd',
@@ -450,7 +456,7 @@ async function resolveInteractiveSpecCreateOptions(repoRoot, preview, options =
450
456
  {
451
457
  label: preview.inputPath,
452
458
  value: preview.inputPath,
453
- hint: 'Plan técnico revisado y aprobado',
459
+ hint: ['Plan técnico revisado y aprobado', approvedVersion, reviewSummary].filter(Boolean).join(', '),
454
460
  default: true,
455
461
  },
456
462
  ], {
@@ -484,6 +490,7 @@ async function resolveInteractiveSpecCreateOptions(repoRoot, preview, options =
484
490
  { label: 'Spec', value: preview.manifest.slug },
485
491
  { label: 'Metodologia', value: selectedMethodology.label },
486
492
  { label: 'Input', value: selectedInput.value },
493
+ { label: 'Plan tecnico', value: ['aprobado', approvedVersion, reviewSummary].filter(Boolean).join(', ') },
487
494
  { label: 'Target', value: preview.relativeSpecDir },
488
495
  { label: 'Archivos planificados', value: preview.preview.files.length },
489
496
  { label: 'Revision', value: selectedReview.value === 'review' ? 'abrir preview' : 'confirmacion directa' },
@@ -22,6 +22,7 @@ const {
22
22
  runLifecycleResume: runAiLifecycleResume,
23
23
  runLifecycleRun: runAiLifecycleRun,
24
24
  runLifecycleStatus: runAiLifecycleStatus,
25
+ runModelsList: runAiModelsList,
25
26
  runOnboard,
26
27
  runPlan: runAiPlan,
27
28
  runPrepareContext: runAiPrepareContext,
@@ -172,7 +173,8 @@ const COMMAND_HELP_GROUPS = [
172
173
  ['ai resume', 'Resume guidance from the last valid lifecycle phase without chat memory.'],
173
174
  ['ai onboard', 'Run or print the planner onboarding prompt with a token-aware context pack.'],
174
175
  ['ai prepare-context', 'Preview or write docs-only AI context updates with assumptions and risks.'],
175
- ['ai agent set|list|show', 'Manage planner, executor, reviewer, and doctor provider profiles without secrets; use set --dry-run to preview.'],
176
+ ['ai agent set|list|show|doctor|repair', 'Manage, diagnose, and dry-run repair planner, executor, reviewer, and doctor provider profiles without secrets.'],
177
+ ['ai models list', 'List provider/model ids known by Quiver without claiming account availability.'],
176
178
  ['ai plan', 'Generate versioned planner drafts for acceptance criteria, technical plan, or spec phase.'],
177
179
  ['ai revise', 'Create a new planner draft from human feedback without approving it.'],
178
180
  ['ai repair-plan', 'Repair an approved technical plan into a new structured draft without mutating the approved artifact.'],
@@ -261,7 +263,8 @@ function printUsage() {
261
263
  npx create-quiver ai specs list [--json]
262
264
  npx create-quiver ai slices list [--json]
263
265
  npx create-quiver ai trace report [options]
264
- npx create-quiver ai agent <set|list|show> [role] [options]
266
+ npx create-quiver ai agent <set|list|show|doctor|repair> [role] [options]
267
+ npx create-quiver ai models list [--provider codex|claude|gemini] [--json]
265
268
  npx create-quiver ai prepare-context [options]
266
269
  npx create-quiver ai revise [options]
267
270
  npx create-quiver ai repair-plan [options]
@@ -321,7 +324,7 @@ Options:
321
324
  --allow-dirty For ai execute-slice, allow pre-existing dirty files and ignore them for scope diff
322
325
  --mode <name> Execution mode for ai execute-plan (auto, manual, delegated)
323
326
  --provider <name> Provider CLI to preflight for prepare or AI commands
324
- --model <label> Free-form model label for AI agent profiles
327
+ --model <model-id> Technical model id for AI agent profiles or provider-backed AI commands
325
328
  --version <n> Draft version to approve for AI planner phases
326
329
  --run <id> AI lifecycle run id
327
330
  --ssh-host-alias <name> SSH host alias to validate for prepare or AI commands
@@ -359,7 +362,10 @@ Examples:
359
362
  cd ./my-project && npx create-quiver ai trace report
360
363
  cd ./my-project && npx create-quiver ai agent set planner --provider codex --model gpt-5.5 --dry-run
361
364
  cd ./my-project && npx create-quiver ai agent set planner --provider codex --model gpt-5.5
365
+ cd ./my-project && npx create-quiver ai agent doctor
366
+ cd ./my-project && npx create-quiver ai agent repair --dry-run
362
367
  cd ./my-project && npx create-quiver ai agent list
368
+ cd ./my-project && npx create-quiver ai models list --provider codex
363
369
  cd ./my-project && npx create-quiver ai plan --phase acceptance --input requirements.md --dry-run
364
370
  cd ./my-project && npx create-quiver ai revise --phase acceptance --input feedback.md --dry-run
365
371
  cd ./my-project && npx create-quiver ai approve --phase acceptance --version 1
@@ -519,6 +525,14 @@ function parseArgs(argv) {
519
525
 
520
526
  const positional = [];
521
527
 
528
+ function missingInputValueMessage() {
529
+ const aiCommandHint = result.mode === 'ai' ? positional[0] : '';
530
+ if (aiCommandHint === 'revise') {
531
+ return `missing feedback input file for ai revise --phase ${result.aiPhase}. Use: npx create-quiver ai revise --phase ${result.aiPhase} --input <feedback.md> --dry-run`;
532
+ }
533
+ return 'missing value for --input';
534
+ }
535
+
522
536
  for (let index = 0; index < args.length; index += 1) {
523
537
  const arg = args[index];
524
538
 
@@ -869,8 +883,8 @@ function parseArgs(argv) {
869
883
 
870
884
  if (arg === '--input') {
871
885
  const value = args[++index];
872
- if (!value) {
873
- throw new Error(formatError('missing value for --input'));
886
+ if (!value || String(value).startsWith('--')) {
887
+ throw new Error(formatError(missingInputValueMessage()));
874
888
  }
875
889
  result.aiInput = value;
876
890
  continue;
@@ -1050,10 +1064,10 @@ function parseArgs(argv) {
1050
1064
  if (result.aiCommand === 'run' && !result.aiRunCommand && positional.length > 0) {
1051
1065
  result.aiRunCommand = positional.shift();
1052
1066
  }
1053
- if ((result.aiCommand === 'specs' || result.aiCommand === 'slices' || result.aiCommand === 'trace' || result.aiCommand === 'active-slice') && !result.aiSecondaryCommand && positional.length > 0) {
1067
+ if ((result.aiCommand === 'specs' || result.aiCommand === 'slices' || result.aiCommand === 'models' || result.aiCommand === 'trace' || result.aiCommand === 'active-slice') && !result.aiSecondaryCommand && positional.length > 0) {
1054
1068
  result.aiSecondaryCommand = positional.shift();
1055
1069
  }
1056
- if ((result.aiCommand === 'specs' || result.aiCommand === 'slices') && result.aiSecondaryCommand && result.aiSecondaryCommand !== 'list') {
1070
+ if ((result.aiCommand === 'specs' || result.aiCommand === 'slices' || result.aiCommand === 'models') && result.aiSecondaryCommand && result.aiSecondaryCommand !== 'list') {
1057
1071
  throw new Error(formatError(`unsupported ai ${result.aiCommand} subcommand: ${result.aiSecondaryCommand}. Supported tasks: list`));
1058
1072
  }
1059
1073
  if (result.aiCommand === 'trace' && result.aiSecondaryCommand && result.aiSecondaryCommand !== 'report') {
@@ -2704,8 +2718,8 @@ async function resolveInteractiveInitOptions(args, targetDir, projectName, optio
2704
2718
 
2705
2719
  if (agentGuidance.value === 'show') {
2706
2720
  ux.nextSteps([
2707
- 'npx create-quiver ai agent set planner --provider codex --model "<modelo-planner>" --dry-run',
2708
- 'npx create-quiver ai agent set executor --provider claude --model "<modelo-executor>" --dry-run',
2721
+ 'npx create-quiver ai agent set planner --provider codex --model gpt-5.5 --dry-run',
2722
+ 'npx create-quiver ai agent set executor --provider claude --model claude-sonnet-4-6 --dry-run',
2709
2723
  ], { title: 'Despues de inicializar' });
2710
2724
  }
2711
2725
 
@@ -2836,7 +2850,7 @@ async function run(argv) {
2836
2850
 
2837
2851
  if (args.mode === 'ai') {
2838
2852
  if (!args.aiCommand) {
2839
- throw new Error(formatError('missing ai subcommand. Use: npx create-quiver ai onboard | prepare-context | run | active-slice | status | resume | inspect | export | specs | slices | trace | plan | revise | repair-plan | review-plan | approve | approvals | agent | prompt-slice | execute-slice | execute-plan | doctor | pr'));
2853
+ throw new Error(formatError('missing ai subcommand. Use: npx create-quiver ai onboard | prepare-context | run | active-slice | status | resume | inspect | export | specs | slices | models | trace | plan | revise | repair-plan | review-plan | approve | approvals | agent | prompt-slice | execute-slice | execute-plan | doctor | pr'));
2840
2854
  }
2841
2855
 
2842
2856
  if (args.aiCommand === 'run') {
@@ -2909,13 +2923,23 @@ async function run(argv) {
2909
2923
  return;
2910
2924
  }
2911
2925
 
2926
+ if (args.aiCommand === 'models') {
2927
+ runAiModelsList({
2928
+ json: args.json,
2929
+ provider: args.aiProviderExplicit ? args.aiProvider : undefined,
2930
+ });
2931
+ return;
2932
+ }
2933
+
2912
2934
  if (args.aiCommand === 'agent') {
2913
- runAiAgent(process.cwd(), {
2935
+ await runAiAgent(process.cwd(), {
2914
2936
  command: args.aiAgentCommand,
2915
2937
  context: args.aiContext || undefined,
2916
2938
  defaultProfile: args.aiDefaultProfile,
2917
2939
  displayName: args.aiDisplayName || undefined,
2918
2940
  id: args.aiProfileId || undefined,
2941
+ interactive: args.interactive,
2942
+ json: args.json,
2919
2943
  label: args.aiLabel || undefined,
2920
2944
  model: args.aiModel || undefined,
2921
2945
  provider: args.aiProviderExplicit ? args.aiProvider : undefined,
@@ -3120,7 +3144,7 @@ async function run(argv) {
3120
3144
  return;
3121
3145
  }
3122
3146
 
3123
- throw new Error(formatError(`unsupported ai subcommand: ${args.aiCommand}. Supported tasks: onboard, prepare-context, run, active-slice, status, resume, inspect, export, specs, slices, trace, plan, revise, repair-plan, review-plan, approve, approvals, agent, prompt-slice, execute-slice, execute-plan, doctor, pr`));
3147
+ throw new Error(formatError(`unsupported ai subcommand: ${args.aiCommand}. Supported tasks: onboard, prepare-context, run, active-slice, status, resume, inspect, export, specs, slices, models, trace, plan, revise, repair-plan, review-plan, approve, approvals, agent, prompt-slice, execute-slice, execute-plan, doctor, pr`));
3124
3148
  }
3125
3149
 
3126
3150
  if (args.mode === 'graph') {