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.
- package/.github/workflows/ci.yml +3 -0
- package/CHANGELOG.md +6 -0
- package/README.md +33 -0
- package/README_FOR_AI.md +13 -6
- package/ROADMAP.md +5 -0
- package/docs/AI_CONTEXT.md.template +4 -0
- package/docs/AI_ONBOARDING_PROMPT.md.template +8 -0
- package/docs/CLI_UX_GUIDE.md +31 -2
- package/docs/COMMANDS.md.template +16 -5
- package/docs/TROUBLESHOOTING.md +70 -0
- package/docs/TROUBLESHOOTING.md.template +20 -0
- package/docs/WORKFLOW.md.template +2 -2
- package/docs/getting-started/installation.md +86 -0
- package/docs/reference/commands.md +39 -5
- package/package.json +1 -1
- package/specs/quiver-v31-ai-model-catalog-agent-selection/EVIDENCE_REPORT.md +185 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/EXECUTION_PLAN.md +85 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/SPEC.md +337 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/STATUS.md +30 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/pr.md +98 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-00-spec-foundation/CLOSURE_BRIEF.md +30 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-00-spec-foundation/EXECUTION_BRIEF.md +51 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-00-spec-foundation/slice.json +62 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-01-model-catalog-alias-normalization/CLOSURE_BRIEF.md +32 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-01-model-catalog-alias-normalization/EXECUTION_BRIEF.md +53 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-01-model-catalog-alias-normalization/slice.json +72 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-02-interactive-agent-set-selectors/CLOSURE_BRIEF.md +36 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-02-interactive-agent-set-selectors/EXECUTION_BRIEF.md +56 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-02-interactive-agent-set-selectors/slice.json +78 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-03-agent-doctor-repair/CLOSURE_BRIEF.md +36 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-03-agent-doctor-repair/EXECUTION_BRIEF.md +57 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-03-agent-doctor-repair/slice.json +77 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-04-shared-preflight-provider-errors/CLOSURE_BRIEF.md +35 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-04-shared-preflight-provider-errors/EXECUTION_BRIEF.md +55 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-04-shared-preflight-provider-errors/slice.json +84 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-05-ai-models-list/CLOSURE_BRIEF.md +32 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-05-ai-models-list/EXECUTION_BRIEF.md +52 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-05-ai-models-list/slice.json +72 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-06-docs-templates-alignment/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-06-docs-templates-alignment/EXECUTION_BRIEF.md +58 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-06-docs-templates-alignment/slice.json +84 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-07-tests-smokes-release-readiness/CLOSURE_BRIEF.md +32 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-07-tests-smokes-release-readiness/EXECUTION_BRIEF.md +59 -0
- package/specs/quiver-v31-ai-model-catalog-agent-selection/slices/slice-07-tests-smokes-release-readiness/slice.json +94 -0
- package/specs/quiver-v32-npx-installation-guidance/EVIDENCE_REPORT.md +26 -0
- package/specs/quiver-v32-npx-installation-guidance/SPEC.md +55 -0
- package/specs/quiver-v32-npx-installation-guidance/STATUS.md +23 -0
- package/specs/quiver-v32-npx-installation-guidance/pr.md +72 -0
- package/specs/quiver-v32-npx-installation-guidance/slices/slice-00-installation-docs/CLOSURE_BRIEF.md +31 -0
- package/specs/quiver-v32-npx-installation-guidance/slices/slice-00-installation-docs/EXECUTION_BRIEF.md +56 -0
- package/specs/quiver-v32-npx-installation-guidance/slices/slice-00-installation-docs/slice.json +75 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/EVIDENCE_REPORT.md +93 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/EXECUTION_PLAN.md +83 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/SPEC.md +158 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/STATUS.md +31 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/pr.md +109 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-00-approval-ux-foundation/CLOSURE_BRIEF.md +30 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-00-approval-ux-foundation/EXECUTION_BRIEF.md +56 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-00-approval-ux-foundation/slice.json +65 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-01-approval-candidates-model/CLOSURE_BRIEF.md +19 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-01-approval-candidates-model/EXECUTION_BRIEF.md +51 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-01-approval-candidates-model/slice.json +74 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-02-approve-interactive-selection/CLOSURE_BRIEF.md +20 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-02-approve-interactive-selection/EXECUTION_BRIEF.md +53 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-02-approve-interactive-selection/slice.json +79 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-03-technical-plan-review-decision-data/CLOSURE_BRIEF.md +19 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-03-technical-plan-review-decision-data/EXECUTION_BRIEF.md +50 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-03-technical-plan-review-decision-data/slice.json +75 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-04-revise-input-guardrails/CLOSURE_BRIEF.md +19 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-04-revise-input-guardrails/EXECUTION_BRIEF.md +51 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-04-revise-input-guardrails/slice.json +73 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-05-provider-progress-alignment/CLOSURE_BRIEF.md +20 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-05-provider-progress-alignment/EXECUTION_BRIEF.md +51 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-05-provider-progress-alignment/slice.json +91 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-06-workflow-surface-integration/CLOSURE_BRIEF.md +20 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-06-workflow-surface-integration/EXECUTION_BRIEF.md +53 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-06-workflow-surface-integration/slice.json +87 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-07-docs-tests-release-readiness/CLOSURE_BRIEF.md +21 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-07-docs-tests-release-readiness/EXECUTION_BRIEF.md +55 -0
- package/specs/quiver-v33-approval-ux-and-planner-progress/slices/slice-07-docs-tests-release-readiness/slice.json +97 -0
- package/src/create-quiver/commands/ai.js +561 -46
- package/src/create-quiver/commands/flow.js +76 -14
- package/src/create-quiver/commands/spec.js +8 -1
- package/src/create-quiver/index.js +36 -12
- package/src/create-quiver/lib/agent-profiles.js +332 -4
- package/src/create-quiver/lib/ai/approval-candidates.js +86 -0
- package/src/create-quiver/lib/ai/execution-plan.js +7 -2
- package/src/create-quiver/lib/ai/executor.js +9 -2
- package/src/create-quiver/lib/ai/model-catalog.js +333 -0
- package/src/create-quiver/lib/ai/plan-review.js +77 -1
- package/src/create-quiver/lib/ai/providers.js +143 -4
- package/src/create-quiver/lib/ai/run-state.js +21 -4
- package/src/create-quiver/lib/approvals.js +103 -0
- package/src/create-quiver/lib/cli/selectors.js +53 -0
- package/src/create-quiver/lib/git.js +13 -4
- 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
|
|
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
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
|
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 <
|
|
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(
|
|
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
|
|
2708
|
-
'npx create-quiver ai agent set executor --provider claude --model
|
|
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') {
|