create-quiver 0.15.4 → 0.16.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/.github/pull_request_template.md +17 -0
- package/.github/workflows/ci.yml +76 -0
- package/.markdown-link-check.json +15 -0
- package/.markdownlint.json +11 -0
- package/.quiver/runs/run-2026-06-09t19-14-39z/approvals.json +5 -0
- package/.quiver/runs/run-2026-06-09t19-14-39z/decisions.md +2 -0
- package/.quiver/runs/run-2026-06-09t19-14-39z/requirement.md +0 -0
- package/.quiver/runs/run-2026-06-09t19-14-39z/snapshots/20260609T191439Z/docs/INDEX.md +97 -0
- package/.quiver/runs/run-2026-06-09t19-14-39z/snapshots/20260609T191439Z/manifest.json +61 -0
- package/.quiver/runs/run-2026-06-09t19-14-39z/state.json +28 -0
- package/ACTIVE_SLICES.md +43 -0
- package/ARCHITECTURE.md +133 -0
- package/CHANGELOG.md +12 -0
- package/CONTRIBUTING.md +174 -9
- package/README.md +10 -1
- package/ROADMAP.md +4 -0
- package/SECURITY.md +9 -2
- package/auditoria-ux-ui-performance-documentacion.md +705 -0
- package/copys-landing-page.md +244 -0
- package/docs/AI_CONTEXT.md.es.template +3 -1
- package/docs/AI_CONTEXT.md.template +3 -1
- package/docs/CLI_UX_GUIDE.md +9 -1
- package/docs/COMMANDS.md.template +20 -6
- package/docs/GITFLOW_PR_GUIDE.md +73 -11
- package/docs/GITFLOW_PR_GUIDE.md.es.template +61 -2
- package/docs/GITFLOW_PR_GUIDE.md.template +72 -10
- package/docs/INDEX.md +1 -0
- package/docs/QUICK.md.template +2 -1
- package/docs/STANDARD.md.template +2 -1
- package/docs/WORKFLOW.md.es.template +3 -1
- package/docs/WORKFLOW.md.template +6 -4
- package/docs/ai/ACTIVE_SLICE.md +61 -0
- package/docs/getting-started/installation.md +7 -0
- package/docs/reference/commands.md +104 -6
- package/docs/reference/slice-schema.md +37 -0
- package/docs/schema/slice.schema.json +221 -0
- package/docs/specs/01-spec/01-slice/01-slice.json +36 -0
- package/docs/specs/01-spec/01-slice/01-slice.md +106 -0
- package/docs/specs/01-spec/01-slice/CLOSURE_BRIEF.md +80 -0
- package/docs/specs/01-spec/01-slice/EXECUTION_BRIEF.md +39 -0
- package/docs/specs/01-spec/02-slice/02-slice.json +36 -0
- package/docs/specs/01-spec/02-slice/02-slice.md +108 -0
- package/docs/specs/01-spec/02-slice/CLOSURE_BRIEF.md +88 -0
- package/docs/specs/01-spec/02-slice/EXECUTION_BRIEF.md +40 -0
- package/docs/specs/01-spec/03-slice/03-slice.json +36 -0
- package/docs/specs/01-spec/03-slice/03-slice.md +103 -0
- package/docs/specs/01-spec/03-slice/CLOSURE_BRIEF.md +54 -0
- package/docs/specs/01-spec/03-slice/EXECUTION_BRIEF.md +39 -0
- package/docs/specs/01-spec/04-slice/04-slice.json +36 -0
- package/docs/specs/01-spec/04-slice/04-slice.md +107 -0
- package/docs/specs/01-spec/04-slice/CLOSURE_BRIEF.md +46 -0
- package/docs/specs/01-spec/04-slice/EXECUTION_BRIEF.md +39 -0
- package/docs/specs/01-spec/05-slice/05-slice.json +36 -0
- package/docs/specs/01-spec/05-slice/05-slice.md +106 -0
- package/docs/specs/01-spec/05-slice/CLOSURE_BRIEF.md +84 -0
- package/docs/specs/01-spec/05-slice/EXECUTION_BRIEF.md +109 -0
- package/docs/specs/01-spec/06-slice/06-slice.json +36 -0
- package/docs/specs/01-spec/06-slice/06-slice.md +107 -0
- package/docs/specs/01-spec/06-slice/CLOSURE_BRIEF.md +67 -0
- package/docs/specs/01-spec/06-slice/EXECUTION_BRIEF.md +39 -0
- package/docs/specs/01-spec/07-slice/07-slice.json +36 -0
- package/docs/specs/01-spec/07-slice/07-slice.md +105 -0
- package/docs/specs/01-spec/07-slice/CLOSURE_BRIEF.md +71 -0
- package/docs/specs/01-spec/07-slice/EXECUTION_BRIEF.md +39 -0
- package/docs/specs/01-spec/08-slice/08-slice.json +36 -0
- package/docs/specs/01-spec/08-slice/08-slice.md +105 -0
- package/docs/specs/01-spec/08-slice/CLOSURE_BRIEF.md +114 -0
- package/docs/specs/01-spec/08-slice/EXECUTION_BRIEF.md +39 -0
- package/docs/specs/01-spec/CLOSURE_BRIEF.md +87 -0
- package/docs/specs/01-spec/spec.md +197 -0
- package/docs/workflows/full-ai-spec-to-pr.md +46 -3
- package/i18n/es/docs/GITFLOW_PR_GUIDE.md.template +38 -1
- package/package.json +27 -1
- package/pr.md +154 -0
- package/scripts/package-quiver.sh +82 -2
- package/scripts/release-quiver.sh +14 -3
- package/specs/[project-name]/slices/pr.md.template +19 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/command-language-mode-matrix.json +91 -0
- package/specs/quiver-v50-audit-trust-foundation/EVIDENCE_REPORT.md +151 -0
- package/specs/quiver-v50-audit-trust-foundation/EXECUTION_PLAN.md +34 -0
- package/specs/quiver-v50-audit-trust-foundation/SPEC.md +113 -0
- package/specs/quiver-v50-audit-trust-foundation/STATUS.md +26 -0
- package/specs/quiver-v50-audit-trust-foundation/pr.md +120 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/CLOSURE_BRIEF.md +20 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/EXECUTION_BRIEF.md +58 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/slice.json +57 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/CLOSURE_BRIEF.md +24 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/EXECUTION_BRIEF.md +67 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/slice.json +71 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/CLOSURE_BRIEF.md +24 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/EXECUTION_BRIEF.md +71 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/slice.json +81 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/CLOSURE_BRIEF.md +22 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/EXECUTION_BRIEF.md +57 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/slice.json +56 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/CLOSURE_BRIEF.md +23 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/EXECUTION_BRIEF.md +68 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/slice.json +84 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/CLOSURE_BRIEF.md +25 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/EXECUTION_BRIEF.md +73 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/slice.json +72 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/CLOSURE_BRIEF.md +22 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/EXECUTION_BRIEF.md +66 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/slice.json +74 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/CLOSURE_BRIEF.md +29 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/EXECUTION_BRIEF.md +74 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/slice.json +81 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/EVIDENCE_REPORT.md +145 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/EXECUTION_PLAN.md +32 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/SPEC.md +109 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/STATUS.md +25 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/pr.md +69 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/CLOSURE_BRIEF.md +20 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/EXECUTION_BRIEF.md +58 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/slice.json +56 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/CLOSURE_BRIEF.md +21 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/EXECUTION_BRIEF.md +61 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/slice.json +68 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/CLOSURE_BRIEF.md +25 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/EXECUTION_BRIEF.md +65 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/pr.md +134 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/slice.json +80 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/CLOSURE_BRIEF.md +31 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/EXECUTION_BRIEF.md +80 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/pr.md +159 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/slice.json +102 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/CLOSURE_BRIEF.md +25 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/EXECUTION_BRIEF.md +74 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/pr.md +147 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/slice.json +91 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/CLOSURE_BRIEF.md +28 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/EXECUTION_BRIEF.md +73 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/pr.md +146 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/slice.json +100 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/CLOSURE_BRIEF.md +36 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/EXECUTION_BRIEF.md +76 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/pr.md +155 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/slice.json +111 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/EVIDENCE_REPORT.md +95 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/EXECUTION_PLAN.md +31 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/SPEC.md +107 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/STATUS.md +22 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/pr.md +69 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/CLOSURE_BRIEF.md +21 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/EXECUTION_BRIEF.md +60 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/slice.json +62 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/CLOSURE_BRIEF.md +34 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/EXECUTION_BRIEF.md +71 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/pr.md +146 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/slice.json +106 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/EXECUTION_BRIEF.md +67 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/pr.md +144 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/slice.json +86 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/CLOSURE_BRIEF.md +38 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/EXECUTION_BRIEF.md +75 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/pr.md +159 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/slice.json +105 -0
- package/src/create-quiver/commands/changelog.js +93 -0
- package/src/create-quiver/commands/config.js +16 -5
- package/src/create-quiver/commands/evidence.js +33 -2
- package/src/create-quiver/commands/flow.js +1 -0
- package/src/create-quiver/commands/graph.js +8 -2
- package/src/create-quiver/commands/plan.js +6 -0
- package/src/create-quiver/commands/spec.js +28 -13
- package/src/create-quiver/index.js +294 -94
- package/src/create-quiver/lib/ai/github.js +5 -2
- package/src/create-quiver/lib/ai/spec-templates.js +19 -0
- package/src/create-quiver/lib/cli/command-registry.js +71 -0
- package/src/create-quiver/lib/cli/parser.js +14 -0
- package/src/create-quiver/lib/evidence.js +161 -6
- package/src/create-quiver/lib/git.js +99 -0
- package/src/create-quiver/lib/i18n/messages/en.js +52 -7
- package/src/create-quiver/lib/i18n/messages/es.js +54 -9
- package/src/create-quiver/lib/init-docs.js +1 -1
- package/src/create-quiver/lib/init-layout.js +9 -8
- package/src/create-quiver/lib/lifecycle.js +24 -26
- package/src/create-quiver/lib/readiness.js +67 -56
- package/src/create-quiver/lib/spec-worktrees.js +16 -34
|
@@ -35,6 +35,7 @@ const {
|
|
|
35
35
|
runSpecsList: runAiSpecsList,
|
|
36
36
|
runTraceReport: runAiTraceReport,
|
|
37
37
|
} = require('./commands/ai');
|
|
38
|
+
const { runChangelog } = require('./commands/changelog');
|
|
38
39
|
const { runConfig } = require('./commands/config');
|
|
39
40
|
const { runDashboard } = require('./commands/dashboard');
|
|
40
41
|
const { runDemo } = require('./commands/demo');
|
|
@@ -58,6 +59,15 @@ const { cleanupSlice, refreshActiveSlicesBoard, startSlice } = require('./lib/li
|
|
|
58
59
|
const { buildSpecStatus, closeSpecWorktree, formatSpecCloseResult, formatSpecStartResult, formatSpecStatus, startSpecWorktree } = require('./lib/spec-worktrees');
|
|
59
60
|
const { getContextPathExclusionReason } = require('./lib/ai/safety');
|
|
60
61
|
const { selectOption } = require('./lib/cli/selectors');
|
|
62
|
+
const {
|
|
63
|
+
SUPPORTED_AI_COMMANDS,
|
|
64
|
+
SUPPORTED_COMMAND_MODES,
|
|
65
|
+
SUPPORTED_CONFIG_LANGUAGE_COMMANDS,
|
|
66
|
+
SUPPORTED_CONFIG_SECTIONS,
|
|
67
|
+
SUPPORTED_DEMO_COMMANDS,
|
|
68
|
+
SUPPORTED_SPEC_COMMANDS,
|
|
69
|
+
} = require('./lib/cli/command-registry');
|
|
70
|
+
const { parseCliArgs } = require('./lib/cli/parser');
|
|
61
71
|
const { createUx } = require('./lib/cli/ux');
|
|
62
72
|
const { validateUxFlags } = require('./lib/cli/ux-flags');
|
|
63
73
|
const {
|
|
@@ -145,65 +155,38 @@ function formatLanguageWarningForCli(warning, language = DEFAULT_LANGUAGE) {
|
|
|
145
155
|
}));
|
|
146
156
|
}
|
|
147
157
|
|
|
148
|
-
const
|
|
149
|
-
'
|
|
150
|
-
'
|
|
151
|
-
'
|
|
152
|
-
'
|
|
153
|
-
'
|
|
154
|
-
'
|
|
155
|
-
|
|
156
|
-
'doctor',
|
|
157
|
-
'prepare',
|
|
158
|
-
'analyze',
|
|
159
|
-
'migrate',
|
|
160
|
-
'start-slice',
|
|
161
|
-
'check-slice',
|
|
162
|
-
'check-pr',
|
|
163
|
-
'check-handoff',
|
|
164
|
-
'new-handoff',
|
|
165
|
-
'cleanup-slice',
|
|
166
|
-
'check-scope',
|
|
167
|
-
'config',
|
|
168
|
-
'refresh-active-slices',
|
|
169
|
-
'spec',
|
|
170
|
-
'evidence',
|
|
171
|
-
'demo',
|
|
172
|
-
'ai',
|
|
173
|
-
]);
|
|
158
|
+
const SLICE_NAMESPACE_COMMANDS = Object.freeze({
|
|
159
|
+
start: 'start-slice',
|
|
160
|
+
check: 'check-slice',
|
|
161
|
+
pr: 'check-pr',
|
|
162
|
+
scope: 'check-scope',
|
|
163
|
+
cleanup: 'cleanup-slice',
|
|
164
|
+
'refresh-active': 'refresh-active-slices',
|
|
165
|
+
});
|
|
174
166
|
|
|
175
|
-
const
|
|
176
|
-
'
|
|
177
|
-
'
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
'
|
|
182
|
-
'
|
|
183
|
-
'
|
|
184
|
-
'
|
|
185
|
-
'
|
|
186
|
-
'
|
|
187
|
-
'
|
|
188
|
-
'
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
'
|
|
193
|
-
|
|
194
|
-
'revise',
|
|
195
|
-
'resume',
|
|
196
|
-
'run',
|
|
197
|
-
'slices',
|
|
198
|
-
'specs',
|
|
199
|
-
'status',
|
|
200
|
-
'trace',
|
|
201
|
-
]);
|
|
167
|
+
const HANDOFF_NAMESPACE_COMMANDS = Object.freeze({
|
|
168
|
+
check: 'check-handoff',
|
|
169
|
+
new: 'new-handoff',
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
const LEGACY_NAMESPACE_ALIASES = Object.freeze({
|
|
173
|
+
'start-slice': 'slice start',
|
|
174
|
+
'check-slice': 'slice check',
|
|
175
|
+
'check-pr': 'slice pr',
|
|
176
|
+
'check-scope': 'slice scope',
|
|
177
|
+
'cleanup-slice': 'slice cleanup',
|
|
178
|
+
'refresh-active-slices': 'slice refresh-active',
|
|
179
|
+
'check-handoff': 'handoff check',
|
|
180
|
+
'new-handoff': 'handoff new',
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
function legacyNamespaceAliasFor(mode) {
|
|
184
|
+
return LEGACY_NAMESPACE_ALIASES[mode] || '';
|
|
185
|
+
}
|
|
202
186
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
const SUPPORTED_CONFIG_LANGUAGE_COMMANDS = new Set(['show', 'set']);
|
|
187
|
+
function formatLegacyNamespaceWarning(mode, canonicalCommand) {
|
|
188
|
+
return `create-quiver: ${mode} is a legacy alias; use npx create-quiver ${canonicalCommand}.`;
|
|
189
|
+
}
|
|
207
190
|
|
|
208
191
|
function unsupportedCommandMessage(commandName) {
|
|
209
192
|
const translator = createTranslator(currentErrorLanguage);
|
|
@@ -225,6 +208,7 @@ const COMMAND_HELP_GROUPS = [
|
|
|
225
208
|
['flow', 'Show the read-only guided workflow stage, blockers, and next safe command.'],
|
|
226
209
|
['dashboard', 'Show compact read-only project, spec, slice, run, approval, and agent status.'],
|
|
227
210
|
['version', 'Show a Quiver-branded version report; use --json for metadata.'],
|
|
211
|
+
['changelog', 'Show recent local CHANGELOG.md release entries; use --json for metadata.'],
|
|
228
212
|
['config language show|set', 'Inspect or update the effective Quiver language without editing JSON by hand.'],
|
|
229
213
|
['prepare', 'Run setup diagnostics for providers, GitHub, SSH, and project readiness.'],
|
|
230
214
|
['migrate', 'Upgrade an already initialized Quiver project to the current contract.'],
|
|
@@ -280,6 +264,8 @@ const COMMAND_HELP_GROUPS = [
|
|
|
280
264
|
['spec status', 'Show spec worktree, branch, slice-00 state, and pending slices.'],
|
|
281
265
|
['spec validate', 'Validate spec docs, slices, briefs, evidence, status, dependencies, and safe paths.'],
|
|
282
266
|
['spec close', 'Close a merged clean spec worktree and guide local sync.'],
|
|
267
|
+
['slice start|check|pr|scope|cleanup|refresh-active', 'Canonical namespace for slice lifecycle, validation, scope, and board commands.'],
|
|
268
|
+
['handoff check|new', 'Canonical namespace for validating or scaffolding handoff artifacts.'],
|
|
283
269
|
['start-slice', 'Start work on one slice and mark it active.'],
|
|
284
270
|
['check-slice', 'Validate slice structure, dependencies, scope, and readiness.'],
|
|
285
271
|
['check-pr', 'Validate PR readiness for a slice/spec workflow.'],
|
|
@@ -294,6 +280,8 @@ const COMMAND_HELP_GROUPS = [
|
|
|
294
280
|
title: 'Evidence and demos',
|
|
295
281
|
commands: [
|
|
296
282
|
['evidence run', 'Run a command and record exit code, duration, redacted output, and Markdown evidence.'],
|
|
283
|
+
['evidence list', 'List local evidence records; use --json for automation.'],
|
|
284
|
+
['evidence show', 'Show one local evidence record; use --json for automation.'],
|
|
297
285
|
['demo create spec-viewer', 'Create or preview the optional static Quiver Spec Viewer demo scaffold.'],
|
|
298
286
|
],
|
|
299
287
|
},
|
|
@@ -329,6 +317,7 @@ function printUsage(language = DEFAULT_LANGUAGE) {
|
|
|
329
317
|
npx create-quiver flow [options]
|
|
330
318
|
npx create-quiver dashboard [options]
|
|
331
319
|
npx create-quiver version [--json]
|
|
320
|
+
npx create-quiver changelog [--json]
|
|
332
321
|
npx create-quiver config language show [--json]
|
|
333
322
|
npx create-quiver config language set <en|es> [--global]
|
|
334
323
|
npx create-quiver plan [options]
|
|
@@ -366,7 +355,9 @@ function printUsage(language = DEFAULT_LANGUAGE) {
|
|
|
366
355
|
npx create-quiver spec status <spec-dir>
|
|
367
356
|
npx create-quiver spec validate <spec-dir>
|
|
368
357
|
npx create-quiver spec close <spec-dir>
|
|
369
|
-
npx create-quiver
|
|
358
|
+
npx create-quiver slice <start|check|pr|scope|cleanup|refresh-active> [options]
|
|
359
|
+
npx create-quiver handoff <check|new> [options]
|
|
360
|
+
npx create-quiver evidence <run|list|show> [options]
|
|
370
361
|
npx create-quiver demo create spec-viewer [options]
|
|
371
362
|
|
|
372
363
|
${formatCommandHelpGroups(language)}
|
|
@@ -415,11 +406,11 @@ ${helpText(help, 'headings', 'options', 'Options:')}
|
|
|
415
406
|
--ssh-host-alias <name> ${optionDescription(help, 'SSH host alias to validate for prepare or AI commands')}
|
|
416
407
|
--identity-file <path> ${optionDescription(help, 'SSH identity file to validate for prepare or AI commands')}
|
|
417
408
|
--remote <name> ${optionDescription(help, 'Git remote name for check-slice or AI PR checks')}
|
|
418
|
-
--base <branch> ${optionDescription(help, 'Base branch for check-slice, check-scope, ai pr, or spec close
|
|
409
|
+
--base <branch> ${optionDescription(help, 'Base branch override for check-slice, check-scope, check-pr, ai pr, spec start, or spec close')}
|
|
419
410
|
--output <file> ${optionDescription(help, 'Output file for evidence run')}
|
|
420
411
|
--max-output <n> ${optionDescription(help, 'Maximum stdout/stderr chars per evidence section')}
|
|
421
412
|
--title <text> ${optionDescription(help, 'Override PR title for ai pr create')}
|
|
422
|
-
-y, --yes ${optionDescription(help, 'Skip prompts and
|
|
413
|
+
-y, --yes ${optionDescription(help, 'Skip prompts and confirm write prompts such as migrate')}
|
|
423
414
|
-V, --version ${optionDescription(help, 'Show the installed create-quiver version')}
|
|
424
415
|
-h, --help ${optionDescription(help, 'Show this help message')}
|
|
425
416
|
|
|
@@ -435,6 +426,8 @@ ${helpText(help, 'headings', 'examples', 'Examples:')}
|
|
|
435
426
|
cd ./my-project && npx create-quiver dashboard --json
|
|
436
427
|
cd ./my-project && npx create-quiver version
|
|
437
428
|
cd ./my-project && npx create-quiver version --json
|
|
429
|
+
cd ./my-project && npx create-quiver changelog
|
|
430
|
+
cd ./my-project && npx create-quiver changelog --json
|
|
438
431
|
cd ./my-project && npx create-quiver config language show
|
|
439
432
|
cd ./my-project && npx create-quiver config language set es
|
|
440
433
|
npx create-quiver config language set en --global
|
|
@@ -499,6 +492,8 @@ ${helpText(help, 'headings', 'examples', 'Examples:')}
|
|
|
499
492
|
cd ./my-project && npx create-quiver spec status specs/my-project
|
|
500
493
|
cd ./my-project && npx create-quiver spec validate specs/my-project
|
|
501
494
|
cd ./my-project && npx create-quiver spec close specs/my-project --dry-run
|
|
495
|
+
cd ./my-project && npx create-quiver slice check --local specs/my-project/slices/slice-01/slice.json
|
|
496
|
+
cd ./my-project && npx create-quiver handoff check specs/my-project/slices/slice-01/EXECUTION_BRIEF.md
|
|
502
497
|
cd ./my-project && npx create-quiver evidence run -- npm test
|
|
503
498
|
cd ./my-project && npx create-quiver demo create spec-viewer --dry-run
|
|
504
499
|
node bin/create-quiver.js doctor --dir ./my-project
|
|
@@ -584,22 +579,33 @@ function parseArgs(argv, options = {}) {
|
|
|
584
579
|
initLegacyScripts: false,
|
|
585
580
|
initMinimal: false,
|
|
586
581
|
specCommand: '',
|
|
582
|
+
sliceCommand: '',
|
|
583
|
+
handoffCommand: '',
|
|
584
|
+
legacyAliasCommand: '',
|
|
587
585
|
demoCommand: '',
|
|
588
586
|
demoName: '',
|
|
589
587
|
evidenceCommand: '',
|
|
590
588
|
evidenceArgs: [],
|
|
591
589
|
evidenceOutput: '',
|
|
592
590
|
evidenceMaxOutput: null,
|
|
591
|
+
evidenceTarget: '',
|
|
593
592
|
};
|
|
594
593
|
|
|
595
594
|
const args = [...argv];
|
|
596
595
|
if (SUPPORTED_COMMAND_MODES.has(args[0])) {
|
|
597
596
|
result.mode = args[0];
|
|
597
|
+
result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
|
|
598
598
|
result.explicitInit = args[0] === 'init';
|
|
599
599
|
args.shift();
|
|
600
600
|
if (result.mode === 'spec') {
|
|
601
601
|
result.specCommand = args.shift() || '';
|
|
602
602
|
}
|
|
603
|
+
if (result.mode === 'slice') {
|
|
604
|
+
result.sliceCommand = args.shift() || '';
|
|
605
|
+
}
|
|
606
|
+
if (result.mode === 'handoff') {
|
|
607
|
+
result.handoffCommand = args.shift() || '';
|
|
608
|
+
}
|
|
603
609
|
if (result.mode === 'evidence') {
|
|
604
610
|
result.evidenceCommand = args.shift() || '';
|
|
605
611
|
}
|
|
@@ -618,9 +624,11 @@ function parseArgs(argv, options = {}) {
|
|
|
618
624
|
args.shift();
|
|
619
625
|
} else if (args[0] === '--check-handoff') {
|
|
620
626
|
result.mode = 'check-handoff';
|
|
627
|
+
result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
|
|
621
628
|
args.shift();
|
|
622
629
|
} else if (args[0] === '--new-handoff') {
|
|
623
630
|
result.mode = 'new-handoff';
|
|
631
|
+
result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
|
|
624
632
|
args.shift();
|
|
625
633
|
} else if (args[0] && !args[0].startsWith('-')) {
|
|
626
634
|
throw new Error(formatError(unsupportedCommandMessage(args[0])));
|
|
@@ -671,11 +679,13 @@ function parseArgs(argv, options = {}) {
|
|
|
671
679
|
|
|
672
680
|
if (arg === '--check-handoff') {
|
|
673
681
|
result.mode = 'check-handoff';
|
|
682
|
+
result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
|
|
674
683
|
continue;
|
|
675
684
|
}
|
|
676
685
|
|
|
677
686
|
if (arg === '--new-handoff') {
|
|
678
687
|
result.mode = 'new-handoff';
|
|
688
|
+
result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
|
|
679
689
|
continue;
|
|
680
690
|
}
|
|
681
691
|
|
|
@@ -1197,13 +1207,17 @@ function parseArgs(argv, options = {}) {
|
|
|
1197
1207
|
result.configSection = positional.shift();
|
|
1198
1208
|
}
|
|
1199
1209
|
if (!SUPPORTED_CONFIG_SECTIONS.has(result.configSection)) {
|
|
1200
|
-
throw new Error(formatError(
|
|
1210
|
+
throw new Error(formatError(translate(currentErrorLanguage, 'config.error.unsupported_section', {
|
|
1211
|
+
section: result.configSection || '(missing)',
|
|
1212
|
+
})));
|
|
1201
1213
|
}
|
|
1202
1214
|
if (!result.configCommand && positional.length > 0) {
|
|
1203
1215
|
result.configCommand = positional.shift();
|
|
1204
1216
|
}
|
|
1205
1217
|
if (!SUPPORTED_CONFIG_LANGUAGE_COMMANDS.has(result.configCommand)) {
|
|
1206
|
-
throw new Error(formatError(
|
|
1218
|
+
throw new Error(formatError(translate(currentErrorLanguage, 'config.error.unsupported_language_command', {
|
|
1219
|
+
command: result.configCommand || '(missing)',
|
|
1220
|
+
})));
|
|
1207
1221
|
}
|
|
1208
1222
|
if (result.configCommand === 'set') {
|
|
1209
1223
|
if (positional.length === 0) {
|
|
@@ -1252,6 +1266,38 @@ function parseArgs(argv, options = {}) {
|
|
|
1252
1266
|
if (positional.length > 0) {
|
|
1253
1267
|
throw new Error(formatError('refresh-active-slices does not accept positional arguments'));
|
|
1254
1268
|
}
|
|
1269
|
+
} else if (result.mode === 'slice') {
|
|
1270
|
+
if (!result.sliceCommand && positional.length > 0) {
|
|
1271
|
+
result.sliceCommand = positional.shift();
|
|
1272
|
+
}
|
|
1273
|
+
const mappedMode = SLICE_NAMESPACE_COMMANDS[result.sliceCommand];
|
|
1274
|
+
if (!mappedMode) {
|
|
1275
|
+
throw new Error(formatError(`unsupported slice subcommand: ${result.sliceCommand || '(missing)'}. Supported tasks: start, check, pr, scope, cleanup, refresh-active`));
|
|
1276
|
+
}
|
|
1277
|
+
result.mode = mappedMode;
|
|
1278
|
+
if (mappedMode === 'refresh-active-slices') {
|
|
1279
|
+
if (positional.length > 0) {
|
|
1280
|
+
throw new Error(formatError('slice refresh-active does not accept positional arguments'));
|
|
1281
|
+
}
|
|
1282
|
+
} else {
|
|
1283
|
+
result.targetDir = positional.shift() || '';
|
|
1284
|
+
if (!result.targetDir) {
|
|
1285
|
+
throw new Error(formatError(`slice ${result.sliceCommand} requires a slice.json path`));
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
} else if (result.mode === 'handoff') {
|
|
1289
|
+
if (!result.handoffCommand && positional.length > 0) {
|
|
1290
|
+
result.handoffCommand = positional.shift();
|
|
1291
|
+
}
|
|
1292
|
+
const mappedMode = HANDOFF_NAMESPACE_COMMANDS[result.handoffCommand];
|
|
1293
|
+
if (!mappedMode) {
|
|
1294
|
+
throw new Error(formatError(`unsupported handoff subcommand: ${result.handoffCommand || '(missing)'}. Supported tasks: check, new`));
|
|
1295
|
+
}
|
|
1296
|
+
result.mode = mappedMode;
|
|
1297
|
+
result.targetDir = positional.shift() || '';
|
|
1298
|
+
if (!result.targetDir) {
|
|
1299
|
+
throw new Error(formatError(`handoff ${result.handoffCommand} requires ${result.handoffCommand === 'new' ? 'a spec slug' : 'a handoff or brief path'}`));
|
|
1300
|
+
}
|
|
1255
1301
|
} else if (result.mode === 'spec') {
|
|
1256
1302
|
if (!result.specCommand && positional.length > 0) {
|
|
1257
1303
|
result.specCommand = positional.shift();
|
|
@@ -1270,14 +1316,26 @@ function parseArgs(argv, options = {}) {
|
|
|
1270
1316
|
result.evidenceCommand = positional.shift();
|
|
1271
1317
|
}
|
|
1272
1318
|
if (!result.evidenceCommand) {
|
|
1273
|
-
throw new Error(formatError('missing evidence subcommand. Use: npx create-quiver evidence run
|
|
1319
|
+
throw new Error(formatError('missing evidence subcommand. Use: npx create-quiver evidence <run|list|show>'));
|
|
1274
1320
|
}
|
|
1275
|
-
if (
|
|
1276
|
-
throw new Error(formatError(`unsupported evidence subcommand: ${result.evidenceCommand}. Supported tasks: run`));
|
|
1321
|
+
if (!['run', 'list', 'show'].includes(result.evidenceCommand)) {
|
|
1322
|
+
throw new Error(formatError(`unsupported evidence subcommand: ${result.evidenceCommand}. Supported tasks: run, list, show`));
|
|
1277
1323
|
}
|
|
1278
|
-
if (positional.length > 0) {
|
|
1324
|
+
if (result.evidenceCommand === 'run' && positional.length > 0) {
|
|
1279
1325
|
throw new Error(formatError('evidence run does not accept positional arguments before --'));
|
|
1280
1326
|
}
|
|
1327
|
+
if (result.evidenceCommand === 'list' && positional.length > 0) {
|
|
1328
|
+
throw new Error(formatError('evidence list does not accept positional arguments'));
|
|
1329
|
+
}
|
|
1330
|
+
if (result.evidenceCommand === 'show') {
|
|
1331
|
+
result.evidenceTarget = positional.shift() || '';
|
|
1332
|
+
if (!result.evidenceTarget) {
|
|
1333
|
+
throw new Error(formatError('evidence show requires an evidence file path'));
|
|
1334
|
+
}
|
|
1335
|
+
if (positional.length > 0) {
|
|
1336
|
+
throw new Error(formatError('evidence show accepts exactly one evidence file path'));
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1281
1339
|
} else if (result.mode === 'demo') {
|
|
1282
1340
|
if (!result.demoCommand && positional.length > 0) {
|
|
1283
1341
|
result.demoCommand = positional.shift();
|
|
@@ -2321,15 +2379,46 @@ function writeProjectScanArtifacts(projectRoot, scan) {
|
|
|
2321
2379
|
return { jsonPath, mdPath: scanPaths.projectMapPath };
|
|
2322
2380
|
}
|
|
2323
2381
|
|
|
2324
|
-
function
|
|
2382
|
+
function createCommandProgressUx(options = {}) {
|
|
2383
|
+
return createUx({
|
|
2384
|
+
env: options.env || process.env,
|
|
2385
|
+
error: options.error,
|
|
2386
|
+
input: options.input,
|
|
2387
|
+
interactive: false,
|
|
2388
|
+
json: options.json,
|
|
2389
|
+
noColor: options.noColor,
|
|
2390
|
+
output: options.output,
|
|
2391
|
+
prompts: options.prompts,
|
|
2392
|
+
spinner: options.noColor === true ? false : options.spinner,
|
|
2393
|
+
stderrIsTTY: options.stderrIsTTY,
|
|
2394
|
+
stdinIsTTY: options.stdinIsTTY,
|
|
2395
|
+
stdoutIsTTY: options.stdoutIsTTY,
|
|
2396
|
+
write: options.write,
|
|
2397
|
+
});
|
|
2398
|
+
}
|
|
2399
|
+
|
|
2400
|
+
async function runProgress(ux, message, task, successMessage = message) {
|
|
2401
|
+
return ux.withSpinner(message, task, {
|
|
2402
|
+
echo: false,
|
|
2403
|
+
successMessage,
|
|
2404
|
+
});
|
|
2405
|
+
}
|
|
2406
|
+
|
|
2407
|
+
async function runAnalyze(targetDir, options = {}) {
|
|
2325
2408
|
const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
|
|
2326
2409
|
const translator = createTranslator(options.language);
|
|
2410
|
+
const progress = createCommandProgressUx(options);
|
|
2327
2411
|
|
|
2328
2412
|
if (!fs.existsSync(projectRoot)) {
|
|
2329
2413
|
throw new Error(formatError(`target directory does not exist: ${projectRoot}`));
|
|
2330
2414
|
}
|
|
2331
2415
|
|
|
2332
|
-
const scan =
|
|
2416
|
+
const scan = await runProgress(
|
|
2417
|
+
progress,
|
|
2418
|
+
translator.t('analyze.progress.scanning'),
|
|
2419
|
+
() => buildProjectScan(projectRoot),
|
|
2420
|
+
translator.t('analyze.progress.scanned'),
|
|
2421
|
+
);
|
|
2333
2422
|
|
|
2334
2423
|
if (options.dryRun) {
|
|
2335
2424
|
console.log(translator.t('analyze.dry_run_for', { path: projectRoot }));
|
|
@@ -2350,9 +2439,24 @@ function runAnalyze(targetDir, options = {}) {
|
|
|
2350
2439
|
};
|
|
2351
2440
|
}
|
|
2352
2441
|
|
|
2353
|
-
const artifacts =
|
|
2354
|
-
|
|
2355
|
-
|
|
2442
|
+
const artifacts = await runProgress(
|
|
2443
|
+
progress,
|
|
2444
|
+
translator.t('analyze.progress.writing_artifacts'),
|
|
2445
|
+
() => writeProjectScanArtifacts(projectRoot, scan),
|
|
2446
|
+
translator.t('analyze.progress.artifacts_written'),
|
|
2447
|
+
);
|
|
2448
|
+
const aiContextPath = await runProgress(
|
|
2449
|
+
progress,
|
|
2450
|
+
translator.t('analyze.progress.refreshing_context'),
|
|
2451
|
+
() => refreshAiContextDoc(projectRoot, scan),
|
|
2452
|
+
translator.t('analyze.progress.context_refreshed'),
|
|
2453
|
+
);
|
|
2454
|
+
await runProgress(
|
|
2455
|
+
progress,
|
|
2456
|
+
translator.t('analyze.progress.updating_state'),
|
|
2457
|
+
() => updateStateForAnalyze(projectRoot, CLI_VERSION),
|
|
2458
|
+
translator.t('analyze.progress.state_updated'),
|
|
2459
|
+
);
|
|
2356
2460
|
|
|
2357
2461
|
console.log(translator.t('analyze.completed_for', { path: projectRoot }));
|
|
2358
2462
|
console.log(translator.t('analyze.wrote', { path: relativePosixPath(projectRoot, artifacts.jsonPath) }));
|
|
@@ -2369,7 +2473,39 @@ function runAnalyze(targetDir, options = {}) {
|
|
|
2369
2473
|
};
|
|
2370
2474
|
}
|
|
2371
2475
|
|
|
2372
|
-
function
|
|
2476
|
+
async function confirmMigrateWrite(projectRoot, options, translator) {
|
|
2477
|
+
if (options.force === true) {
|
|
2478
|
+
return;
|
|
2479
|
+
}
|
|
2480
|
+
|
|
2481
|
+
const ux = createUx({
|
|
2482
|
+
env: options.env,
|
|
2483
|
+
error: options.error,
|
|
2484
|
+
input: options.input,
|
|
2485
|
+
interactive: true,
|
|
2486
|
+
json: options.json,
|
|
2487
|
+
noColor: options.noColor,
|
|
2488
|
+
output: options.output,
|
|
2489
|
+
promptConfirm: options.promptConfirm,
|
|
2490
|
+
stderrIsTTY: options.stderrIsTTY,
|
|
2491
|
+
stdinIsTTY: options.stdinIsTTY,
|
|
2492
|
+
stdoutIsTTY: options.stdoutIsTTY,
|
|
2493
|
+
write: options.write,
|
|
2494
|
+
});
|
|
2495
|
+
|
|
2496
|
+
if (!ux.mode.usePrompts) {
|
|
2497
|
+
throw new Error(formatError(translator.t('migrate.confirm.required')));
|
|
2498
|
+
}
|
|
2499
|
+
|
|
2500
|
+
const confirmed = await ux.promptConfirm(translator.t('migrate.confirm.prompt', { path: projectRoot }), {
|
|
2501
|
+
initialValue: false,
|
|
2502
|
+
});
|
|
2503
|
+
if (!confirmed) {
|
|
2504
|
+
throw new Error(formatError(translator.t('migrate.confirm.declined')));
|
|
2505
|
+
}
|
|
2506
|
+
}
|
|
2507
|
+
|
|
2508
|
+
async function runMigrate(targetDir, options = {}) {
|
|
2373
2509
|
const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
|
|
2374
2510
|
const translator = createTranslator(options.language);
|
|
2375
2511
|
|
|
@@ -2410,6 +2546,8 @@ function runMigrate(targetDir, options = {}) {
|
|
|
2410
2546
|
return;
|
|
2411
2547
|
}
|
|
2412
2548
|
|
|
2549
|
+
await confirmMigrateWrite(projectRoot, options, translator);
|
|
2550
|
+
|
|
2413
2551
|
const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'quiver-migrate-'));
|
|
2414
2552
|
|
|
2415
2553
|
try {
|
|
@@ -3158,8 +3296,9 @@ async function run(argv) {
|
|
|
3158
3296
|
return;
|
|
3159
3297
|
}
|
|
3160
3298
|
|
|
3161
|
-
const args =
|
|
3299
|
+
const args = parseCliArgs(normalizedArgv, {
|
|
3162
3300
|
language: languageArgs.language,
|
|
3301
|
+
legacyParseArgs: parseArgs,
|
|
3163
3302
|
});
|
|
3164
3303
|
args.languageResolution = languageResolution;
|
|
3165
3304
|
args.language = args.languageResolution.language;
|
|
@@ -3180,12 +3319,20 @@ async function run(argv) {
|
|
|
3180
3319
|
for (const warning of args.languageResolution.warnings || []) {
|
|
3181
3320
|
process.stderr.write(`${formatLanguageWarningForCli(warning, args.language)}\n`);
|
|
3182
3321
|
}
|
|
3322
|
+
if (args.legacyAliasCommand) {
|
|
3323
|
+
process.stderr.write(`${formatLegacyNamespaceWarning(args.mode, args.legacyAliasCommand)}\n`);
|
|
3324
|
+
}
|
|
3183
3325
|
}
|
|
3184
3326
|
|
|
3185
3327
|
if (args.mode === 'analyze') {
|
|
3186
|
-
runAnalyze(args.targetDir, {
|
|
3328
|
+
await runAnalyze(args.targetDir, {
|
|
3187
3329
|
dryRun: args.dryRun,
|
|
3330
|
+
json: args.json,
|
|
3188
3331
|
language: args.language,
|
|
3332
|
+
noColor: args.noColor,
|
|
3333
|
+
stderrIsTTY: Boolean(process.stderr.isTTY),
|
|
3334
|
+
stdinIsTTY: Boolean(process.stdin.isTTY),
|
|
3335
|
+
stdoutIsTTY: Boolean(process.stdout.isTTY),
|
|
3189
3336
|
});
|
|
3190
3337
|
return;
|
|
3191
3338
|
}
|
|
@@ -3231,11 +3378,17 @@ async function run(argv) {
|
|
|
3231
3378
|
return;
|
|
3232
3379
|
}
|
|
3233
3380
|
|
|
3381
|
+
if (args.mode === 'changelog') {
|
|
3382
|
+
runChangelog({ json: args.json });
|
|
3383
|
+
return;
|
|
3384
|
+
}
|
|
3385
|
+
|
|
3234
3386
|
if (args.mode === 'config') {
|
|
3235
3387
|
runConfig(process.cwd(), {
|
|
3236
3388
|
command: args.configCommand,
|
|
3237
3389
|
global: args.configGlobal,
|
|
3238
3390
|
json: args.json,
|
|
3391
|
+
language: args.language,
|
|
3239
3392
|
languageResolution: args.languageResolution,
|
|
3240
3393
|
section: args.configSection,
|
|
3241
3394
|
value: args.configValue,
|
|
@@ -3570,7 +3723,7 @@ async function run(argv) {
|
|
|
3570
3723
|
|
|
3571
3724
|
if (args.aiCommand === 'pr') {
|
|
3572
3725
|
await runAiPr(process.cwd(), {
|
|
3573
|
-
baseBranch: args.aiBaseBranch,
|
|
3726
|
+
baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
|
|
3574
3727
|
create: args.aiCreate,
|
|
3575
3728
|
dryRun: args.dryRun,
|
|
3576
3729
|
input: args.aiInput || undefined,
|
|
@@ -3620,7 +3773,9 @@ async function run(argv) {
|
|
|
3620
3773
|
language: args.language,
|
|
3621
3774
|
maxOutput: args.evidenceMaxOutput || undefined,
|
|
3622
3775
|
output: args.evidenceOutput || undefined,
|
|
3776
|
+
json: args.json,
|
|
3623
3777
|
subcommand: args.evidenceCommand,
|
|
3778
|
+
target: args.evidenceTarget,
|
|
3624
3779
|
});
|
|
3625
3780
|
process.exitCode = result.exitCode;
|
|
3626
3781
|
return;
|
|
@@ -3639,10 +3794,16 @@ async function run(argv) {
|
|
|
3639
3794
|
}
|
|
3640
3795
|
|
|
3641
3796
|
if (args.mode === 'migrate') {
|
|
3642
|
-
runMigrate(args.targetDir, {
|
|
3797
|
+
await runMigrate(args.targetDir, {
|
|
3643
3798
|
dryRun: args.dryRun,
|
|
3799
|
+
force: args.force,
|
|
3800
|
+
json: args.json,
|
|
3644
3801
|
language: args.language,
|
|
3802
|
+
noColor: args.noColor,
|
|
3645
3803
|
skipInstall: args.skipInstall,
|
|
3804
|
+
stderrIsTTY: Boolean(process.stderr.isTTY),
|
|
3805
|
+
stdinIsTTY: Boolean(process.stdin.isTTY),
|
|
3806
|
+
stdoutIsTTY: Boolean(process.stdout.isTTY),
|
|
3646
3807
|
});
|
|
3647
3808
|
return;
|
|
3648
3809
|
}
|
|
@@ -3680,7 +3841,11 @@ async function run(argv) {
|
|
|
3680
3841
|
}
|
|
3681
3842
|
|
|
3682
3843
|
if (args.mode === 'check-pr') {
|
|
3683
|
-
checkPrReadiness(args.targetDir, {
|
|
3844
|
+
checkPrReadiness(args.targetDir, {
|
|
3845
|
+
baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
|
|
3846
|
+
language: args.language,
|
|
3847
|
+
remote: args.aiRemote,
|
|
3848
|
+
});
|
|
3684
3849
|
return;
|
|
3685
3850
|
}
|
|
3686
3851
|
|
|
@@ -3751,11 +3916,12 @@ async function run(argv) {
|
|
|
3751
3916
|
}
|
|
3752
3917
|
|
|
3753
3918
|
if (!args.targetDir || args.targetDir === '.') {
|
|
3754
|
-
throw new Error(formatError('
|
|
3919
|
+
throw new Error(formatError(createTranslator(args.language).t('spec.error.missing_directory_command')));
|
|
3755
3920
|
}
|
|
3756
3921
|
|
|
3757
3922
|
if (args.specCommand === 'start') {
|
|
3758
3923
|
const report = startSpecWorktree(process.cwd(), args.targetDir, {
|
|
3924
|
+
baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
|
|
3759
3925
|
dryRun: args.dryRun,
|
|
3760
3926
|
});
|
|
3761
3927
|
process.stdout.write(formatSpecStartResult(report, { language: args.language }));
|
|
@@ -3778,7 +3944,7 @@ async function run(argv) {
|
|
|
3778
3944
|
|
|
3779
3945
|
if (args.specCommand === 'close') {
|
|
3780
3946
|
const report = closeSpecWorktree(process.cwd(), args.targetDir, {
|
|
3781
|
-
baseBranch: args.aiBaseBranch,
|
|
3947
|
+
baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
|
|
3782
3948
|
discard: args.discard,
|
|
3783
3949
|
dryRun: args.dryRun,
|
|
3784
3950
|
force: args.force,
|
|
@@ -3824,25 +3990,60 @@ async function run(argv) {
|
|
|
3824
3990
|
}
|
|
3825
3991
|
|
|
3826
3992
|
const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'quiver-create-'));
|
|
3993
|
+
const translator = createTranslator(args.language);
|
|
3994
|
+
const progress = createCommandProgressUx({
|
|
3995
|
+
json: args.json,
|
|
3996
|
+
noColor: args.noColor,
|
|
3997
|
+
stderrIsTTY: Boolean(process.stderr.isTTY),
|
|
3998
|
+
stdinIsTTY: Boolean(process.stdin.isTTY),
|
|
3999
|
+
stdoutIsTTY: Boolean(process.stdout.isTTY),
|
|
4000
|
+
});
|
|
3827
4001
|
|
|
3828
4002
|
try {
|
|
3829
|
-
|
|
3830
|
-
|
|
3831
|
-
|
|
4003
|
+
let templateRoot = '';
|
|
4004
|
+
await runProgress(
|
|
4005
|
+
progress,
|
|
4006
|
+
translator.t('init.progress.preparing_templates'),
|
|
4007
|
+
() => {
|
|
4008
|
+
ensureDir(targetDir);
|
|
4009
|
+
templateRoot = packTemplate(packageRoot, tempRoot);
|
|
4010
|
+
return templateRoot;
|
|
4011
|
+
},
|
|
4012
|
+
translator.t('init.progress.templates_ready'),
|
|
4013
|
+
);
|
|
3832
4014
|
if (initLayout.profile === 'full') {
|
|
3833
|
-
|
|
3834
|
-
|
|
3835
|
-
|
|
3836
|
-
|
|
3837
|
-
|
|
3838
|
-
|
|
3839
|
-
|
|
3840
|
-
|
|
3841
|
-
|
|
3842
|
-
|
|
4015
|
+
await runProgress(
|
|
4016
|
+
progress,
|
|
4017
|
+
translator.t('init.progress.exporting_templates'),
|
|
4018
|
+
() => exportTemplatesToLegacyRoot(templateRoot, targetDir),
|
|
4019
|
+
translator.t('init.progress.templates_exported'),
|
|
4020
|
+
);
|
|
4021
|
+
}
|
|
4022
|
+
let languageWrite = null;
|
|
4023
|
+
await runProgress(
|
|
4024
|
+
progress,
|
|
4025
|
+
translator.t('init.progress.writing_docs'),
|
|
4026
|
+
() => {
|
|
4027
|
+
runInitDocs(targetDir, initOptions.projectName, {
|
|
4028
|
+
includeTemplates: initOptions.includeTemplates,
|
|
4029
|
+
language: initLanguage.docsLanguage,
|
|
4030
|
+
legacyScripts: initOptions.legacyScripts,
|
|
4031
|
+
profile: initLayout.profile,
|
|
4032
|
+
templateRoot,
|
|
4033
|
+
});
|
|
4034
|
+
languageWrite = persistInitLanguage(targetDir, { language: initLanguage.configLanguage });
|
|
4035
|
+
return languageWrite;
|
|
4036
|
+
},
|
|
4037
|
+
translator.t('init.progress.docs_written'),
|
|
4038
|
+
);
|
|
3843
4039
|
|
|
3844
4040
|
if (!args.skipInstall) {
|
|
3845
|
-
const installResult =
|
|
4041
|
+
const installResult = await runProgress(
|
|
4042
|
+
progress,
|
|
4043
|
+
translator.t('init.progress.installing_package'),
|
|
4044
|
+
() => installSelfAsDevDep(targetDir, CLI_VERSION),
|
|
4045
|
+
translator.t('init.progress.install_checked'),
|
|
4046
|
+
);
|
|
3846
4047
|
if (installResult === 'installed') {
|
|
3847
4048
|
console.log(`Added create-quiver@${CLI_VERSION} as dev dependency`);
|
|
3848
4049
|
} else if (installResult === 'failed') {
|
|
@@ -3850,7 +4051,6 @@ async function run(argv) {
|
|
|
3850
4051
|
}
|
|
3851
4052
|
}
|
|
3852
4053
|
|
|
3853
|
-
const translator = createTranslator(args.language);
|
|
3854
4054
|
console.log(translator.t('init.installed', { path: targetDir }));
|
|
3855
4055
|
if (languageWrite) {
|
|
3856
4056
|
console.log(translator.t('init.language.saved', { language: languageWrite.language }));
|