create-quiver 0.15.4 → 0.17.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/ARCHITECTURE.md +133 -0
- package/CHANGELOG.md +16 -0
- package/CONTRIBUTING.md +174 -9
- package/README.md +17 -2
- package/README_FOR_AI.md +4 -1
- package/ROADMAP.md +4 -0
- package/SECURITY.md +9 -2
- package/docs/AI_CONTEXT.md.es.template +3 -1
- package/docs/AI_CONTEXT.md.template +3 -1
- package/docs/CLI_UX_GUIDE.md +20 -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 +6 -1
- 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/getting-started/installation.md +7 -0
- package/docs/reference/commands.md +138 -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/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 +122 -1
- package/specs/quiver-v46-deep-project-analysis/EVIDENCE_REPORT.md +94 -0
- package/specs/quiver-v46-deep-project-analysis/EXECUTION_PLAN.md +26 -0
- package/specs/quiver-v46-deep-project-analysis/SPEC.md +157 -0
- package/specs/quiver-v46-deep-project-analysis/STATUS.md +26 -0
- package/specs/quiver-v46-deep-project-analysis/pr.md +131 -0
- package/specs/quiver-v46-deep-project-analysis/slices/slice-00-analysis-contract-foundation/CLOSURE_BRIEF.md +14 -0
- package/specs/quiver-v46-deep-project-analysis/slices/slice-00-analysis-contract-foundation/EXECUTION_BRIEF.md +41 -0
- package/specs/quiver-v46-deep-project-analysis/slices/slice-00-analysis-contract-foundation/slice.json +61 -0
- package/specs/quiver-v46-deep-project-analysis/slices/slice-01-stack-agnostic-discovery-sampling/CLOSURE_BRIEF.md +22 -0
- package/specs/quiver-v46-deep-project-analysis/slices/slice-01-stack-agnostic-discovery-sampling/EXECUTION_BRIEF.md +33 -0
- package/specs/quiver-v46-deep-project-analysis/slices/slice-01-stack-agnostic-discovery-sampling/slice.json +80 -0
- package/specs/quiver-v46-deep-project-analysis/slices/slice-02-provider-analysis-json-contract/CLOSURE_BRIEF.md +21 -0
- package/specs/quiver-v46-deep-project-analysis/slices/slice-02-provider-analysis-json-contract/EXECUTION_BRIEF.md +34 -0
- package/specs/quiver-v46-deep-project-analysis/slices/slice-02-provider-analysis-json-contract/slice.json +79 -0
- package/specs/quiver-v46-deep-project-analysis/slices/slice-03-doc-proposal-review-safe-writes/CLOSURE_BRIEF.md +19 -0
- package/specs/quiver-v46-deep-project-analysis/slices/slice-03-doc-proposal-review-safe-writes/EXECUTION_BRIEF.md +33 -0
- package/specs/quiver-v46-deep-project-analysis/slices/slice-03-doc-proposal-review-safe-writes/slice.json +79 -0
- package/specs/quiver-v46-deep-project-analysis/slices/slice-04-validation-docs-release-readiness/CLOSURE_BRIEF.md +20 -0
- package/specs/quiver-v46-deep-project-analysis/slices/slice-04-validation-docs-release-readiness/EXECUTION_BRIEF.md +32 -0
- package/specs/quiver-v46-deep-project-analysis/slices/slice-04-validation-docs-release-readiness/slice.json +85 -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/ai.js +521 -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 +408 -98
- package/src/create-quiver/lib/ai/analyze-project-discovery.js +387 -0
- package/src/create-quiver/lib/ai/analyze-project-docs.js +364 -0
- package/src/create-quiver/lib/ai/analyze-project-parser.js +277 -0
- package/src/create-quiver/lib/ai/analyze-project-prompts.js +214 -0
- package/src/create-quiver/lib/ai/analyze-project-review.js +99 -0
- package/src/create-quiver/lib/ai/analyze-project-sampling.js +402 -0
- package/src/create-quiver/lib/ai/analyze-project-schema.js +92 -0
- package/src/create-quiver/lib/ai/analyze-project-validation.js +309 -0
- package/src/create-quiver/lib/ai/artifacts.js +4 -1
- 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 +72 -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
|
@@ -12,6 +12,7 @@ const {
|
|
|
12
12
|
const {
|
|
13
13
|
runActiveSlice: runAiActiveSlice,
|
|
14
14
|
runAgent: runAiAgent,
|
|
15
|
+
runAnalyzeProject: runAiAnalyzeProject,
|
|
15
16
|
runApprovalStatus: runAiApprovalStatus,
|
|
16
17
|
runApprove: runAiApprove,
|
|
17
18
|
runDoctor: runAiDoctor,
|
|
@@ -35,6 +36,7 @@ const {
|
|
|
35
36
|
runSpecsList: runAiSpecsList,
|
|
36
37
|
runTraceReport: runAiTraceReport,
|
|
37
38
|
} = require('./commands/ai');
|
|
39
|
+
const { runChangelog } = require('./commands/changelog');
|
|
38
40
|
const { runConfig } = require('./commands/config');
|
|
39
41
|
const { runDashboard } = require('./commands/dashboard');
|
|
40
42
|
const { runDemo } = require('./commands/demo');
|
|
@@ -58,6 +60,15 @@ const { cleanupSlice, refreshActiveSlicesBoard, startSlice } = require('./lib/li
|
|
|
58
60
|
const { buildSpecStatus, closeSpecWorktree, formatSpecCloseResult, formatSpecStartResult, formatSpecStatus, startSpecWorktree } = require('./lib/spec-worktrees');
|
|
59
61
|
const { getContextPathExclusionReason } = require('./lib/ai/safety');
|
|
60
62
|
const { selectOption } = require('./lib/cli/selectors');
|
|
63
|
+
const {
|
|
64
|
+
SUPPORTED_AI_COMMANDS,
|
|
65
|
+
SUPPORTED_COMMAND_MODES,
|
|
66
|
+
SUPPORTED_CONFIG_LANGUAGE_COMMANDS,
|
|
67
|
+
SUPPORTED_CONFIG_SECTIONS,
|
|
68
|
+
SUPPORTED_DEMO_COMMANDS,
|
|
69
|
+
SUPPORTED_SPEC_COMMANDS,
|
|
70
|
+
} = require('./lib/cli/command-registry');
|
|
71
|
+
const { parseCliArgs } = require('./lib/cli/parser');
|
|
61
72
|
const { createUx } = require('./lib/cli/ux');
|
|
62
73
|
const { validateUxFlags } = require('./lib/cli/ux-flags');
|
|
63
74
|
const {
|
|
@@ -145,65 +156,38 @@ function formatLanguageWarningForCli(warning, language = DEFAULT_LANGUAGE) {
|
|
|
145
156
|
}));
|
|
146
157
|
}
|
|
147
158
|
|
|
148
|
-
const
|
|
149
|
-
'
|
|
150
|
-
'
|
|
151
|
-
'
|
|
152
|
-
'
|
|
153
|
-
'
|
|
154
|
-
'
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
'
|
|
159
|
-
'
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
'
|
|
164
|
-
'
|
|
165
|
-
'
|
|
166
|
-
'check-scope',
|
|
167
|
-
'
|
|
168
|
-
'refresh-active-slices',
|
|
169
|
-
'
|
|
170
|
-
'
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
'active-slice',
|
|
177
|
-
'agent',
|
|
178
|
-
'approve',
|
|
179
|
-
'approval-status',
|
|
180
|
-
'approvals',
|
|
181
|
-
'doctor',
|
|
182
|
-
'execute-plan',
|
|
183
|
-
'execute-slice',
|
|
184
|
-
'executor-prompt',
|
|
185
|
-
'export',
|
|
186
|
-
'inspect',
|
|
187
|
-
'onboard',
|
|
188
|
-
'plan',
|
|
189
|
-
'prepare-context',
|
|
190
|
-
'pr',
|
|
191
|
-
'prompt-slice',
|
|
192
|
-
'repair-plan',
|
|
193
|
-
'review-plan',
|
|
194
|
-
'revise',
|
|
195
|
-
'resume',
|
|
196
|
-
'run',
|
|
197
|
-
'slices',
|
|
198
|
-
'specs',
|
|
199
|
-
'status',
|
|
200
|
-
'trace',
|
|
201
|
-
]);
|
|
159
|
+
const SLICE_NAMESPACE_COMMANDS = Object.freeze({
|
|
160
|
+
start: 'start-slice',
|
|
161
|
+
check: 'check-slice',
|
|
162
|
+
pr: 'check-pr',
|
|
163
|
+
scope: 'check-scope',
|
|
164
|
+
cleanup: 'cleanup-slice',
|
|
165
|
+
'refresh-active': 'refresh-active-slices',
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
const HANDOFF_NAMESPACE_COMMANDS = Object.freeze({
|
|
169
|
+
check: 'check-handoff',
|
|
170
|
+
new: 'new-handoff',
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
const LEGACY_NAMESPACE_ALIASES = Object.freeze({
|
|
174
|
+
'start-slice': 'slice start',
|
|
175
|
+
'check-slice': 'slice check',
|
|
176
|
+
'check-pr': 'slice pr',
|
|
177
|
+
'check-scope': 'slice scope',
|
|
178
|
+
'cleanup-slice': 'slice cleanup',
|
|
179
|
+
'refresh-active-slices': 'slice refresh-active',
|
|
180
|
+
'check-handoff': 'handoff check',
|
|
181
|
+
'new-handoff': 'handoff new',
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
function legacyNamespaceAliasFor(mode) {
|
|
185
|
+
return LEGACY_NAMESPACE_ALIASES[mode] || '';
|
|
186
|
+
}
|
|
202
187
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
const SUPPORTED_CONFIG_LANGUAGE_COMMANDS = new Set(['show', 'set']);
|
|
188
|
+
function formatLegacyNamespaceWarning(mode, canonicalCommand) {
|
|
189
|
+
return `create-quiver: ${mode} is a legacy alias; use npx create-quiver ${canonicalCommand}.`;
|
|
190
|
+
}
|
|
207
191
|
|
|
208
192
|
function unsupportedCommandMessage(commandName) {
|
|
209
193
|
const translator = createTranslator(currentErrorLanguage);
|
|
@@ -225,6 +209,7 @@ const COMMAND_HELP_GROUPS = [
|
|
|
225
209
|
['flow', 'Show the read-only guided workflow stage, blockers, and next safe command.'],
|
|
226
210
|
['dashboard', 'Show compact read-only project, spec, slice, run, approval, and agent status.'],
|
|
227
211
|
['version', 'Show a Quiver-branded version report; use --json for metadata.'],
|
|
212
|
+
['changelog', 'Show recent local CHANGELOG.md release entries; use --json for metadata.'],
|
|
228
213
|
['config language show|set', 'Inspect or update the effective Quiver language without editing JSON by hand.'],
|
|
229
214
|
['prepare', 'Run setup diagnostics for providers, GitHub, SSH, and project readiness.'],
|
|
230
215
|
['migrate', 'Upgrade an already initialized Quiver project to the current contract.'],
|
|
@@ -245,6 +230,7 @@ const COMMAND_HELP_GROUPS = [
|
|
|
245
230
|
['ai active-slice status|reconcile', 'Inspect or dry-run reconcile local active-slice state from every supported source.'],
|
|
246
231
|
['ai status', 'Show current AI lifecycle phase, approved versions, blockers, and next command.'],
|
|
247
232
|
['ai resume', 'Resume guidance from the last valid lifecycle phase without chat memory.'],
|
|
233
|
+
['ai analyze-project', 'Read and explain a bounded project sample without provider execution or writes.'],
|
|
248
234
|
['ai onboard', 'Run or print the planner onboarding prompt with a token-aware context pack.'],
|
|
249
235
|
['ai prepare-context', 'Preview or write docs-only AI context updates with assumptions and risks.'],
|
|
250
236
|
['ai agent set|list|show|doctor|repair', 'Manage, diagnose, and dry-run repair planner, executor, reviewer, and doctor provider profiles without secrets.'],
|
|
@@ -280,6 +266,8 @@ const COMMAND_HELP_GROUPS = [
|
|
|
280
266
|
['spec status', 'Show spec worktree, branch, slice-00 state, and pending slices.'],
|
|
281
267
|
['spec validate', 'Validate spec docs, slices, briefs, evidence, status, dependencies, and safe paths.'],
|
|
282
268
|
['spec close', 'Close a merged clean spec worktree and guide local sync.'],
|
|
269
|
+
['slice start|check|pr|scope|cleanup|refresh-active', 'Canonical namespace for slice lifecycle, validation, scope, and board commands.'],
|
|
270
|
+
['handoff check|new', 'Canonical namespace for validating or scaffolding handoff artifacts.'],
|
|
283
271
|
['start-slice', 'Start work on one slice and mark it active.'],
|
|
284
272
|
['check-slice', 'Validate slice structure, dependencies, scope, and readiness.'],
|
|
285
273
|
['check-pr', 'Validate PR readiness for a slice/spec workflow.'],
|
|
@@ -294,6 +282,8 @@ const COMMAND_HELP_GROUPS = [
|
|
|
294
282
|
title: 'Evidence and demos',
|
|
295
283
|
commands: [
|
|
296
284
|
['evidence run', 'Run a command and record exit code, duration, redacted output, and Markdown evidence.'],
|
|
285
|
+
['evidence list', 'List local evidence records; use --json for automation.'],
|
|
286
|
+
['evidence show', 'Show one local evidence record; use --json for automation.'],
|
|
297
287
|
['demo create spec-viewer', 'Create or preview the optional static Quiver Spec Viewer demo scaffold.'],
|
|
298
288
|
],
|
|
299
289
|
},
|
|
@@ -329,6 +319,7 @@ function printUsage(language = DEFAULT_LANGUAGE) {
|
|
|
329
319
|
npx create-quiver flow [options]
|
|
330
320
|
npx create-quiver dashboard [options]
|
|
331
321
|
npx create-quiver version [--json]
|
|
322
|
+
npx create-quiver changelog [--json]
|
|
332
323
|
npx create-quiver config language show [--json]
|
|
333
324
|
npx create-quiver config language set <en|es> [--global]
|
|
334
325
|
npx create-quiver plan [options]
|
|
@@ -338,6 +329,7 @@ function printUsage(language = DEFAULT_LANGUAGE) {
|
|
|
338
329
|
npx create-quiver ai active-slice reconcile --dry-run
|
|
339
330
|
npx create-quiver ai status [options]
|
|
340
331
|
npx create-quiver ai resume [options]
|
|
332
|
+
npx create-quiver ai analyze-project [--deep] [--dry-run] [--json]
|
|
341
333
|
npx create-quiver ai inspect [options]
|
|
342
334
|
npx create-quiver ai export [--format json|markdown]
|
|
343
335
|
npx create-quiver ai specs list [--json]
|
|
@@ -366,7 +358,9 @@ function printUsage(language = DEFAULT_LANGUAGE) {
|
|
|
366
358
|
npx create-quiver spec status <spec-dir>
|
|
367
359
|
npx create-quiver spec validate <spec-dir>
|
|
368
360
|
npx create-quiver spec close <spec-dir>
|
|
369
|
-
npx create-quiver
|
|
361
|
+
npx create-quiver slice <start|check|pr|scope|cleanup|refresh-active> [options]
|
|
362
|
+
npx create-quiver handoff <check|new> [options]
|
|
363
|
+
npx create-quiver evidence <run|list|show> [options]
|
|
370
364
|
npx create-quiver demo create spec-viewer [options]
|
|
371
365
|
|
|
372
366
|
${formatCommandHelpGroups(language)}
|
|
@@ -395,7 +389,14 @@ ${helpText(help, 'headings', 'options', 'Options:')}
|
|
|
395
389
|
--full ${optionDescription(help, 'Plan or run the full compatibility init profile')}
|
|
396
390
|
--legacy-scripts ${optionDescription(help, 'Include legacy Bash wrappers in init profile')}
|
|
397
391
|
--include-templates ${optionDescription(help, 'Export packaged templates in init profile')}
|
|
398
|
-
--dry-run ${optionDescription(help, 'Preview init, analyze, migrate, prepare, spec create/start/close, demo, ai agent set, or AI work without executing writes/providers')}
|
|
392
|
+
--dry-run ${optionDescription(help, 'Preview init, analyze, migrate, prepare, spec create/start/close, demo, ai agent set, ai analyze-project, or AI work without executing writes/providers')}
|
|
393
|
+
--deep ${optionDescription(help, 'For ai analyze-project, include source and DB files in the read-only sample')}
|
|
394
|
+
--max-files <n> ${optionDescription(help, 'For ai analyze-project, maximum files in the semantic sample')}
|
|
395
|
+
--max-bytes <n> ${optionDescription(help, 'For ai analyze-project, maximum selected bytes in the semantic sample')}
|
|
396
|
+
--include-source ${optionDescription(help, 'For ai analyze-project, include source files without requiring --deep')}
|
|
397
|
+
--include-tests ${optionDescription(help, 'For ai analyze-project, include test files in the sample')}
|
|
398
|
+
--include-db ${optionDescription(help, 'For ai analyze-project, include schema, migration, and DB files in the sample')}
|
|
399
|
+
--scope <path|name> ${optionDescription(help, 'For ai analyze-project, restrict discovery to a repo path or workspace name')}
|
|
399
400
|
--print-prompt ${optionDescription(help, 'Print the exact AI prompt and exit without executing provider CLIs')}
|
|
400
401
|
--with-planner ${optionDescription(help, 'Enable planner-assisted behavior on commands that explicitly support it')}
|
|
401
402
|
--interactive ${optionDescription(help, 'Enable prompts on commands that explicitly support interactive choices')}
|
|
@@ -415,11 +416,11 @@ ${helpText(help, 'headings', 'options', 'Options:')}
|
|
|
415
416
|
--ssh-host-alias <name> ${optionDescription(help, 'SSH host alias to validate for prepare or AI commands')}
|
|
416
417
|
--identity-file <path> ${optionDescription(help, 'SSH identity file to validate for prepare or AI commands')}
|
|
417
418
|
--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
|
|
419
|
+
--base <branch> ${optionDescription(help, 'Base branch override for check-slice, check-scope, check-pr, ai pr, spec start, or spec close')}
|
|
419
420
|
--output <file> ${optionDescription(help, 'Output file for evidence run')}
|
|
420
421
|
--max-output <n> ${optionDescription(help, 'Maximum stdout/stderr chars per evidence section')}
|
|
421
422
|
--title <text> ${optionDescription(help, 'Override PR title for ai pr create')}
|
|
422
|
-
-y, --yes ${optionDescription(help, 'Skip prompts and
|
|
423
|
+
-y, --yes ${optionDescription(help, 'Skip prompts and confirm write prompts such as migrate')}
|
|
423
424
|
-V, --version ${optionDescription(help, 'Show the installed create-quiver version')}
|
|
424
425
|
-h, --help ${optionDescription(help, 'Show this help message')}
|
|
425
426
|
|
|
@@ -435,6 +436,8 @@ ${helpText(help, 'headings', 'examples', 'Examples:')}
|
|
|
435
436
|
cd ./my-project && npx create-quiver dashboard --json
|
|
436
437
|
cd ./my-project && npx create-quiver version
|
|
437
438
|
cd ./my-project && npx create-quiver version --json
|
|
439
|
+
cd ./my-project && npx create-quiver changelog
|
|
440
|
+
cd ./my-project && npx create-quiver changelog --json
|
|
438
441
|
cd ./my-project && npx create-quiver config language show
|
|
439
442
|
cd ./my-project && npx create-quiver config language set es
|
|
440
443
|
npx create-quiver config language set en --global
|
|
@@ -442,6 +445,8 @@ ${helpText(help, 'headings', 'examples', 'Examples:')}
|
|
|
442
445
|
cd ./my-project && npx create-quiver plan --json
|
|
443
446
|
cd ./my-project && npx create-quiver ai onboard --dry-run
|
|
444
447
|
cd ./my-project && npx create-quiver ai onboard --print-prompt
|
|
448
|
+
cd ./my-project && npx create-quiver ai analyze-project --deep --dry-run
|
|
449
|
+
cd ./my-project && npx create-quiver ai analyze-project --deep --json
|
|
445
450
|
cd ./my-project && npx create-quiver ai prepare-context --dry-run
|
|
446
451
|
cd ./my-project && npx create-quiver ai run create --input requirements.md
|
|
447
452
|
cd ./my-project && npx create-quiver ai active-slice reconcile --dry-run
|
|
@@ -499,6 +504,8 @@ ${helpText(help, 'headings', 'examples', 'Examples:')}
|
|
|
499
504
|
cd ./my-project && npx create-quiver spec status specs/my-project
|
|
500
505
|
cd ./my-project && npx create-quiver spec validate specs/my-project
|
|
501
506
|
cd ./my-project && npx create-quiver spec close specs/my-project --dry-run
|
|
507
|
+
cd ./my-project && npx create-quiver slice check --local specs/my-project/slices/slice-01/slice.json
|
|
508
|
+
cd ./my-project && npx create-quiver handoff check specs/my-project/slices/slice-01/EXECUTION_BRIEF.md
|
|
502
509
|
cd ./my-project && npx create-quiver evidence run -- npm test
|
|
503
510
|
cd ./my-project && npx create-quiver demo create spec-viewer --dry-run
|
|
504
511
|
node bin/create-quiver.js doctor --dir ./my-project
|
|
@@ -568,6 +575,14 @@ function parseArgs(argv, options = {}) {
|
|
|
568
575
|
aiInput: '',
|
|
569
576
|
aiSlice: '',
|
|
570
577
|
aiTimeout: null,
|
|
578
|
+
aiAnalyzeDeep: false,
|
|
579
|
+
aiAnalyzeIncludeDb: false,
|
|
580
|
+
aiAnalyzeIncludeSource: false,
|
|
581
|
+
aiAnalyzeIncludeTests: false,
|
|
582
|
+
aiAnalyzeMaxBytes: null,
|
|
583
|
+
aiAnalyzeMaxFiles: null,
|
|
584
|
+
aiAnalyzeScope: '',
|
|
585
|
+
aiAnalyzeOptionUsed: false,
|
|
571
586
|
aiCommit: false,
|
|
572
587
|
aiAllowDirty: false,
|
|
573
588
|
aiExecute: false,
|
|
@@ -584,22 +599,33 @@ function parseArgs(argv, options = {}) {
|
|
|
584
599
|
initLegacyScripts: false,
|
|
585
600
|
initMinimal: false,
|
|
586
601
|
specCommand: '',
|
|
602
|
+
sliceCommand: '',
|
|
603
|
+
handoffCommand: '',
|
|
604
|
+
legacyAliasCommand: '',
|
|
587
605
|
demoCommand: '',
|
|
588
606
|
demoName: '',
|
|
589
607
|
evidenceCommand: '',
|
|
590
608
|
evidenceArgs: [],
|
|
591
609
|
evidenceOutput: '',
|
|
592
610
|
evidenceMaxOutput: null,
|
|
611
|
+
evidenceTarget: '',
|
|
593
612
|
};
|
|
594
613
|
|
|
595
614
|
const args = [...argv];
|
|
596
615
|
if (SUPPORTED_COMMAND_MODES.has(args[0])) {
|
|
597
616
|
result.mode = args[0];
|
|
617
|
+
result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
|
|
598
618
|
result.explicitInit = args[0] === 'init';
|
|
599
619
|
args.shift();
|
|
600
620
|
if (result.mode === 'spec') {
|
|
601
621
|
result.specCommand = args.shift() || '';
|
|
602
622
|
}
|
|
623
|
+
if (result.mode === 'slice') {
|
|
624
|
+
result.sliceCommand = args.shift() || '';
|
|
625
|
+
}
|
|
626
|
+
if (result.mode === 'handoff') {
|
|
627
|
+
result.handoffCommand = args.shift() || '';
|
|
628
|
+
}
|
|
603
629
|
if (result.mode === 'evidence') {
|
|
604
630
|
result.evidenceCommand = args.shift() || '';
|
|
605
631
|
}
|
|
@@ -618,9 +644,11 @@ function parseArgs(argv, options = {}) {
|
|
|
618
644
|
args.shift();
|
|
619
645
|
} else if (args[0] === '--check-handoff') {
|
|
620
646
|
result.mode = 'check-handoff';
|
|
647
|
+
result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
|
|
621
648
|
args.shift();
|
|
622
649
|
} else if (args[0] === '--new-handoff') {
|
|
623
650
|
result.mode = 'new-handoff';
|
|
651
|
+
result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
|
|
624
652
|
args.shift();
|
|
625
653
|
} else if (args[0] && !args[0].startsWith('-')) {
|
|
626
654
|
throw new Error(formatError(unsupportedCommandMessage(args[0])));
|
|
@@ -671,11 +699,13 @@ function parseArgs(argv, options = {}) {
|
|
|
671
699
|
|
|
672
700
|
if (arg === '--check-handoff') {
|
|
673
701
|
result.mode = 'check-handoff';
|
|
702
|
+
result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
|
|
674
703
|
continue;
|
|
675
704
|
}
|
|
676
705
|
|
|
677
706
|
if (arg === '--new-handoff') {
|
|
678
707
|
result.mode = 'new-handoff';
|
|
708
|
+
result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
|
|
679
709
|
continue;
|
|
680
710
|
}
|
|
681
711
|
|
|
@@ -709,6 +739,68 @@ function parseArgs(argv, options = {}) {
|
|
|
709
739
|
continue;
|
|
710
740
|
}
|
|
711
741
|
|
|
742
|
+
if (arg === '--deep') {
|
|
743
|
+
result.aiAnalyzeDeep = true;
|
|
744
|
+
result.aiAnalyzeOptionUsed = true;
|
|
745
|
+
continue;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
if (arg === '--include-source') {
|
|
749
|
+
result.aiAnalyzeIncludeSource = true;
|
|
750
|
+
result.aiAnalyzeOptionUsed = true;
|
|
751
|
+
continue;
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
if (arg === '--include-tests') {
|
|
755
|
+
result.aiAnalyzeIncludeTests = true;
|
|
756
|
+
result.aiAnalyzeOptionUsed = true;
|
|
757
|
+
continue;
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
if (arg === '--include-db') {
|
|
761
|
+
result.aiAnalyzeIncludeDb = true;
|
|
762
|
+
result.aiAnalyzeOptionUsed = true;
|
|
763
|
+
continue;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
if (arg === '--max-files') {
|
|
767
|
+
const value = args[++index];
|
|
768
|
+
if (typeof value === 'undefined') {
|
|
769
|
+
throw new Error(formatError('missing value for --max-files'));
|
|
770
|
+
}
|
|
771
|
+
const parsed = Number.parseInt(value, 10);
|
|
772
|
+
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
773
|
+
throw new Error(formatError('invalid value for --max-files'));
|
|
774
|
+
}
|
|
775
|
+
result.aiAnalyzeMaxFiles = parsed;
|
|
776
|
+
result.aiAnalyzeOptionUsed = true;
|
|
777
|
+
continue;
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
if (arg === '--max-bytes') {
|
|
781
|
+
const value = args[++index];
|
|
782
|
+
if (typeof value === 'undefined') {
|
|
783
|
+
throw new Error(formatError('missing value for --max-bytes'));
|
|
784
|
+
}
|
|
785
|
+
const parsed = Number.parseInt(value, 10);
|
|
786
|
+
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
787
|
+
throw new Error(formatError('invalid value for --max-bytes'));
|
|
788
|
+
}
|
|
789
|
+
result.aiAnalyzeMaxBytes = parsed;
|
|
790
|
+
result.aiAnalyzeOptionUsed = true;
|
|
791
|
+
continue;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
if (arg === '--scope') {
|
|
795
|
+
const value = args[++index];
|
|
796
|
+
if (!value || String(value).startsWith('--')) {
|
|
797
|
+
throw new Error(formatError('missing value for --scope'));
|
|
798
|
+
}
|
|
799
|
+
result.aiAnalyzeScope = value;
|
|
800
|
+
result.aiAnalyzeOptionUsed = true;
|
|
801
|
+
continue;
|
|
802
|
+
}
|
|
803
|
+
|
|
712
804
|
if (arg === '--print-prompt') {
|
|
713
805
|
result.aiPrintPrompt = true;
|
|
714
806
|
continue;
|
|
@@ -1168,6 +1260,10 @@ function parseArgs(argv, options = {}) {
|
|
|
1168
1260
|
positional.push(arg);
|
|
1169
1261
|
}
|
|
1170
1262
|
|
|
1263
|
+
if (result.aiAnalyzeOptionUsed && result.mode !== 'ai') {
|
|
1264
|
+
throw new Error(formatError('analysis flags are only supported by ai analyze-project'));
|
|
1265
|
+
}
|
|
1266
|
+
|
|
1171
1267
|
if (result.mode === 'init') {
|
|
1172
1268
|
if (!result.projectName && positional.length > 0) {
|
|
1173
1269
|
result.projectName = positional.shift();
|
|
@@ -1197,13 +1293,17 @@ function parseArgs(argv, options = {}) {
|
|
|
1197
1293
|
result.configSection = positional.shift();
|
|
1198
1294
|
}
|
|
1199
1295
|
if (!SUPPORTED_CONFIG_SECTIONS.has(result.configSection)) {
|
|
1200
|
-
throw new Error(formatError(
|
|
1296
|
+
throw new Error(formatError(translate(currentErrorLanguage, 'config.error.unsupported_section', {
|
|
1297
|
+
section: result.configSection || '(missing)',
|
|
1298
|
+
})));
|
|
1201
1299
|
}
|
|
1202
1300
|
if (!result.configCommand && positional.length > 0) {
|
|
1203
1301
|
result.configCommand = positional.shift();
|
|
1204
1302
|
}
|
|
1205
1303
|
if (!SUPPORTED_CONFIG_LANGUAGE_COMMANDS.has(result.configCommand)) {
|
|
1206
|
-
throw new Error(formatError(
|
|
1304
|
+
throw new Error(formatError(translate(currentErrorLanguage, 'config.error.unsupported_language_command', {
|
|
1305
|
+
command: result.configCommand || '(missing)',
|
|
1306
|
+
})));
|
|
1207
1307
|
}
|
|
1208
1308
|
if (result.configCommand === 'set') {
|
|
1209
1309
|
if (positional.length === 0) {
|
|
@@ -1218,6 +1318,9 @@ function parseArgs(argv, options = {}) {
|
|
|
1218
1318
|
if (!result.aiCommand && positional.length > 0) {
|
|
1219
1319
|
result.aiCommand = positional.shift();
|
|
1220
1320
|
}
|
|
1321
|
+
if (result.aiAnalyzeOptionUsed && result.aiCommand !== 'analyze-project') {
|
|
1322
|
+
throw new Error(formatError('analysis flags are only supported by ai analyze-project'));
|
|
1323
|
+
}
|
|
1221
1324
|
if (result.aiCommand === 'agent') {
|
|
1222
1325
|
if (!result.aiAgentCommand && positional.length > 0) {
|
|
1223
1326
|
result.aiAgentCommand = positional.shift();
|
|
@@ -1252,6 +1355,38 @@ function parseArgs(argv, options = {}) {
|
|
|
1252
1355
|
if (positional.length > 0) {
|
|
1253
1356
|
throw new Error(formatError('refresh-active-slices does not accept positional arguments'));
|
|
1254
1357
|
}
|
|
1358
|
+
} else if (result.mode === 'slice') {
|
|
1359
|
+
if (!result.sliceCommand && positional.length > 0) {
|
|
1360
|
+
result.sliceCommand = positional.shift();
|
|
1361
|
+
}
|
|
1362
|
+
const mappedMode = SLICE_NAMESPACE_COMMANDS[result.sliceCommand];
|
|
1363
|
+
if (!mappedMode) {
|
|
1364
|
+
throw new Error(formatError(`unsupported slice subcommand: ${result.sliceCommand || '(missing)'}. Supported tasks: start, check, pr, scope, cleanup, refresh-active`));
|
|
1365
|
+
}
|
|
1366
|
+
result.mode = mappedMode;
|
|
1367
|
+
if (mappedMode === 'refresh-active-slices') {
|
|
1368
|
+
if (positional.length > 0) {
|
|
1369
|
+
throw new Error(formatError('slice refresh-active does not accept positional arguments'));
|
|
1370
|
+
}
|
|
1371
|
+
} else {
|
|
1372
|
+
result.targetDir = positional.shift() || '';
|
|
1373
|
+
if (!result.targetDir) {
|
|
1374
|
+
throw new Error(formatError(`slice ${result.sliceCommand} requires a slice.json path`));
|
|
1375
|
+
}
|
|
1376
|
+
}
|
|
1377
|
+
} else if (result.mode === 'handoff') {
|
|
1378
|
+
if (!result.handoffCommand && positional.length > 0) {
|
|
1379
|
+
result.handoffCommand = positional.shift();
|
|
1380
|
+
}
|
|
1381
|
+
const mappedMode = HANDOFF_NAMESPACE_COMMANDS[result.handoffCommand];
|
|
1382
|
+
if (!mappedMode) {
|
|
1383
|
+
throw new Error(formatError(`unsupported handoff subcommand: ${result.handoffCommand || '(missing)'}. Supported tasks: check, new`));
|
|
1384
|
+
}
|
|
1385
|
+
result.mode = mappedMode;
|
|
1386
|
+
result.targetDir = positional.shift() || '';
|
|
1387
|
+
if (!result.targetDir) {
|
|
1388
|
+
throw new Error(formatError(`handoff ${result.handoffCommand} requires ${result.handoffCommand === 'new' ? 'a spec slug' : 'a handoff or brief path'}`));
|
|
1389
|
+
}
|
|
1255
1390
|
} else if (result.mode === 'spec') {
|
|
1256
1391
|
if (!result.specCommand && positional.length > 0) {
|
|
1257
1392
|
result.specCommand = positional.shift();
|
|
@@ -1270,14 +1405,26 @@ function parseArgs(argv, options = {}) {
|
|
|
1270
1405
|
result.evidenceCommand = positional.shift();
|
|
1271
1406
|
}
|
|
1272
1407
|
if (!result.evidenceCommand) {
|
|
1273
|
-
throw new Error(formatError('missing evidence subcommand. Use: npx create-quiver evidence run
|
|
1408
|
+
throw new Error(formatError('missing evidence subcommand. Use: npx create-quiver evidence <run|list|show>'));
|
|
1274
1409
|
}
|
|
1275
|
-
if (
|
|
1276
|
-
throw new Error(formatError(`unsupported evidence subcommand: ${result.evidenceCommand}. Supported tasks: run`));
|
|
1410
|
+
if (!['run', 'list', 'show'].includes(result.evidenceCommand)) {
|
|
1411
|
+
throw new Error(formatError(`unsupported evidence subcommand: ${result.evidenceCommand}. Supported tasks: run, list, show`));
|
|
1277
1412
|
}
|
|
1278
|
-
if (positional.length > 0) {
|
|
1413
|
+
if (result.evidenceCommand === 'run' && positional.length > 0) {
|
|
1279
1414
|
throw new Error(formatError('evidence run does not accept positional arguments before --'));
|
|
1280
1415
|
}
|
|
1416
|
+
if (result.evidenceCommand === 'list' && positional.length > 0) {
|
|
1417
|
+
throw new Error(formatError('evidence list does not accept positional arguments'));
|
|
1418
|
+
}
|
|
1419
|
+
if (result.evidenceCommand === 'show') {
|
|
1420
|
+
result.evidenceTarget = positional.shift() || '';
|
|
1421
|
+
if (!result.evidenceTarget) {
|
|
1422
|
+
throw new Error(formatError('evidence show requires an evidence file path'));
|
|
1423
|
+
}
|
|
1424
|
+
if (positional.length > 0) {
|
|
1425
|
+
throw new Error(formatError('evidence show accepts exactly one evidence file path'));
|
|
1426
|
+
}
|
|
1427
|
+
}
|
|
1281
1428
|
} else if (result.mode === 'demo') {
|
|
1282
1429
|
if (!result.demoCommand && positional.length > 0) {
|
|
1283
1430
|
result.demoCommand = positional.shift();
|
|
@@ -2321,15 +2468,46 @@ function writeProjectScanArtifacts(projectRoot, scan) {
|
|
|
2321
2468
|
return { jsonPath, mdPath: scanPaths.projectMapPath };
|
|
2322
2469
|
}
|
|
2323
2470
|
|
|
2324
|
-
function
|
|
2471
|
+
function createCommandProgressUx(options = {}) {
|
|
2472
|
+
return createUx({
|
|
2473
|
+
env: options.env || process.env,
|
|
2474
|
+
error: options.error,
|
|
2475
|
+
input: options.input,
|
|
2476
|
+
interactive: false,
|
|
2477
|
+
json: options.json,
|
|
2478
|
+
noColor: options.noColor,
|
|
2479
|
+
output: options.output,
|
|
2480
|
+
prompts: options.prompts,
|
|
2481
|
+
spinner: options.noColor === true ? false : options.spinner,
|
|
2482
|
+
stderrIsTTY: options.stderrIsTTY,
|
|
2483
|
+
stdinIsTTY: options.stdinIsTTY,
|
|
2484
|
+
stdoutIsTTY: options.stdoutIsTTY,
|
|
2485
|
+
write: options.write,
|
|
2486
|
+
});
|
|
2487
|
+
}
|
|
2488
|
+
|
|
2489
|
+
async function runProgress(ux, message, task, successMessage = message) {
|
|
2490
|
+
return ux.withSpinner(message, task, {
|
|
2491
|
+
echo: false,
|
|
2492
|
+
successMessage,
|
|
2493
|
+
});
|
|
2494
|
+
}
|
|
2495
|
+
|
|
2496
|
+
async function runAnalyze(targetDir, options = {}) {
|
|
2325
2497
|
const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
|
|
2326
2498
|
const translator = createTranslator(options.language);
|
|
2499
|
+
const progress = createCommandProgressUx(options);
|
|
2327
2500
|
|
|
2328
2501
|
if (!fs.existsSync(projectRoot)) {
|
|
2329
2502
|
throw new Error(formatError(`target directory does not exist: ${projectRoot}`));
|
|
2330
2503
|
}
|
|
2331
2504
|
|
|
2332
|
-
const scan =
|
|
2505
|
+
const scan = await runProgress(
|
|
2506
|
+
progress,
|
|
2507
|
+
translator.t('analyze.progress.scanning'),
|
|
2508
|
+
() => buildProjectScan(projectRoot),
|
|
2509
|
+
translator.t('analyze.progress.scanned'),
|
|
2510
|
+
);
|
|
2333
2511
|
|
|
2334
2512
|
if (options.dryRun) {
|
|
2335
2513
|
console.log(translator.t('analyze.dry_run_for', { path: projectRoot }));
|
|
@@ -2350,9 +2528,24 @@ function runAnalyze(targetDir, options = {}) {
|
|
|
2350
2528
|
};
|
|
2351
2529
|
}
|
|
2352
2530
|
|
|
2353
|
-
const artifacts =
|
|
2354
|
-
|
|
2355
|
-
|
|
2531
|
+
const artifacts = await runProgress(
|
|
2532
|
+
progress,
|
|
2533
|
+
translator.t('analyze.progress.writing_artifacts'),
|
|
2534
|
+
() => writeProjectScanArtifacts(projectRoot, scan),
|
|
2535
|
+
translator.t('analyze.progress.artifacts_written'),
|
|
2536
|
+
);
|
|
2537
|
+
const aiContextPath = await runProgress(
|
|
2538
|
+
progress,
|
|
2539
|
+
translator.t('analyze.progress.refreshing_context'),
|
|
2540
|
+
() => refreshAiContextDoc(projectRoot, scan),
|
|
2541
|
+
translator.t('analyze.progress.context_refreshed'),
|
|
2542
|
+
);
|
|
2543
|
+
await runProgress(
|
|
2544
|
+
progress,
|
|
2545
|
+
translator.t('analyze.progress.updating_state'),
|
|
2546
|
+
() => updateStateForAnalyze(projectRoot, CLI_VERSION),
|
|
2547
|
+
translator.t('analyze.progress.state_updated'),
|
|
2548
|
+
);
|
|
2356
2549
|
|
|
2357
2550
|
console.log(translator.t('analyze.completed_for', { path: projectRoot }));
|
|
2358
2551
|
console.log(translator.t('analyze.wrote', { path: relativePosixPath(projectRoot, artifacts.jsonPath) }));
|
|
@@ -2369,7 +2562,39 @@ function runAnalyze(targetDir, options = {}) {
|
|
|
2369
2562
|
};
|
|
2370
2563
|
}
|
|
2371
2564
|
|
|
2372
|
-
function
|
|
2565
|
+
async function confirmMigrateWrite(projectRoot, options, translator) {
|
|
2566
|
+
if (options.force === true) {
|
|
2567
|
+
return;
|
|
2568
|
+
}
|
|
2569
|
+
|
|
2570
|
+
const ux = createUx({
|
|
2571
|
+
env: options.env,
|
|
2572
|
+
error: options.error,
|
|
2573
|
+
input: options.input,
|
|
2574
|
+
interactive: true,
|
|
2575
|
+
json: options.json,
|
|
2576
|
+
noColor: options.noColor,
|
|
2577
|
+
output: options.output,
|
|
2578
|
+
promptConfirm: options.promptConfirm,
|
|
2579
|
+
stderrIsTTY: options.stderrIsTTY,
|
|
2580
|
+
stdinIsTTY: options.stdinIsTTY,
|
|
2581
|
+
stdoutIsTTY: options.stdoutIsTTY,
|
|
2582
|
+
write: options.write,
|
|
2583
|
+
});
|
|
2584
|
+
|
|
2585
|
+
if (!ux.mode.usePrompts) {
|
|
2586
|
+
throw new Error(formatError(translator.t('migrate.confirm.required')));
|
|
2587
|
+
}
|
|
2588
|
+
|
|
2589
|
+
const confirmed = await ux.promptConfirm(translator.t('migrate.confirm.prompt', { path: projectRoot }), {
|
|
2590
|
+
initialValue: false,
|
|
2591
|
+
});
|
|
2592
|
+
if (!confirmed) {
|
|
2593
|
+
throw new Error(formatError(translator.t('migrate.confirm.declined')));
|
|
2594
|
+
}
|
|
2595
|
+
}
|
|
2596
|
+
|
|
2597
|
+
async function runMigrate(targetDir, options = {}) {
|
|
2373
2598
|
const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
|
|
2374
2599
|
const translator = createTranslator(options.language);
|
|
2375
2600
|
|
|
@@ -2410,6 +2635,8 @@ function runMigrate(targetDir, options = {}) {
|
|
|
2410
2635
|
return;
|
|
2411
2636
|
}
|
|
2412
2637
|
|
|
2638
|
+
await confirmMigrateWrite(projectRoot, options, translator);
|
|
2639
|
+
|
|
2413
2640
|
const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'quiver-migrate-'));
|
|
2414
2641
|
|
|
2415
2642
|
try {
|
|
@@ -3158,8 +3385,9 @@ async function run(argv) {
|
|
|
3158
3385
|
return;
|
|
3159
3386
|
}
|
|
3160
3387
|
|
|
3161
|
-
const args =
|
|
3388
|
+
const args = parseCliArgs(normalizedArgv, {
|
|
3162
3389
|
language: languageArgs.language,
|
|
3390
|
+
legacyParseArgs: parseArgs,
|
|
3163
3391
|
});
|
|
3164
3392
|
args.languageResolution = languageResolution;
|
|
3165
3393
|
args.language = args.languageResolution.language;
|
|
@@ -3180,12 +3408,20 @@ async function run(argv) {
|
|
|
3180
3408
|
for (const warning of args.languageResolution.warnings || []) {
|
|
3181
3409
|
process.stderr.write(`${formatLanguageWarningForCli(warning, args.language)}\n`);
|
|
3182
3410
|
}
|
|
3411
|
+
if (args.legacyAliasCommand) {
|
|
3412
|
+
process.stderr.write(`${formatLegacyNamespaceWarning(args.mode, args.legacyAliasCommand)}\n`);
|
|
3413
|
+
}
|
|
3183
3414
|
}
|
|
3184
3415
|
|
|
3185
3416
|
if (args.mode === 'analyze') {
|
|
3186
|
-
runAnalyze(args.targetDir, {
|
|
3417
|
+
await runAnalyze(args.targetDir, {
|
|
3187
3418
|
dryRun: args.dryRun,
|
|
3419
|
+
json: args.json,
|
|
3188
3420
|
language: args.language,
|
|
3421
|
+
noColor: args.noColor,
|
|
3422
|
+
stderrIsTTY: Boolean(process.stderr.isTTY),
|
|
3423
|
+
stdinIsTTY: Boolean(process.stdin.isTTY),
|
|
3424
|
+
stdoutIsTTY: Boolean(process.stdout.isTTY),
|
|
3189
3425
|
});
|
|
3190
3426
|
return;
|
|
3191
3427
|
}
|
|
@@ -3231,11 +3467,17 @@ async function run(argv) {
|
|
|
3231
3467
|
return;
|
|
3232
3468
|
}
|
|
3233
3469
|
|
|
3470
|
+
if (args.mode === 'changelog') {
|
|
3471
|
+
runChangelog({ json: args.json });
|
|
3472
|
+
return;
|
|
3473
|
+
}
|
|
3474
|
+
|
|
3234
3475
|
if (args.mode === 'config') {
|
|
3235
3476
|
runConfig(process.cwd(), {
|
|
3236
3477
|
command: args.configCommand,
|
|
3237
3478
|
global: args.configGlobal,
|
|
3238
3479
|
json: args.json,
|
|
3480
|
+
language: args.language,
|
|
3239
3481
|
languageResolution: args.languageResolution,
|
|
3240
3482
|
section: args.configSection,
|
|
3241
3483
|
value: args.configValue,
|
|
@@ -3267,7 +3509,28 @@ async function run(argv) {
|
|
|
3267
3509
|
|
|
3268
3510
|
if (args.mode === 'ai') {
|
|
3269
3511
|
if (!args.aiCommand) {
|
|
3270
|
-
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'));
|
|
3512
|
+
throw new Error(formatError('missing ai subcommand. Use: npx create-quiver ai analyze-project | 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'));
|
|
3513
|
+
}
|
|
3514
|
+
|
|
3515
|
+
if (args.aiCommand === 'analyze-project') {
|
|
3516
|
+
await runAiAnalyzeProject(process.cwd(), {
|
|
3517
|
+
deep: args.aiAnalyzeDeep,
|
|
3518
|
+
dryRun: args.dryRun,
|
|
3519
|
+
force: args.force,
|
|
3520
|
+
includeDb: args.aiAnalyzeIncludeDb,
|
|
3521
|
+
includeSource: args.aiAnalyzeIncludeSource,
|
|
3522
|
+
includeTests: args.aiAnalyzeIncludeTests,
|
|
3523
|
+
interactive: args.interactive,
|
|
3524
|
+
json: args.json,
|
|
3525
|
+
language: args.language,
|
|
3526
|
+
maxBytes: args.aiAnalyzeMaxBytes || undefined,
|
|
3527
|
+
maxFiles: args.aiAnalyzeMaxFiles || undefined,
|
|
3528
|
+
printPrompt: args.aiPrintPrompt,
|
|
3529
|
+
review: args.review,
|
|
3530
|
+
scope: args.aiAnalyzeScope || undefined,
|
|
3531
|
+
strict: args.strict,
|
|
3532
|
+
});
|
|
3533
|
+
return;
|
|
3271
3534
|
}
|
|
3272
3535
|
|
|
3273
3536
|
if (args.aiCommand === 'run') {
|
|
@@ -3570,7 +3833,7 @@ async function run(argv) {
|
|
|
3570
3833
|
|
|
3571
3834
|
if (args.aiCommand === 'pr') {
|
|
3572
3835
|
await runAiPr(process.cwd(), {
|
|
3573
|
-
baseBranch: args.aiBaseBranch,
|
|
3836
|
+
baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
|
|
3574
3837
|
create: args.aiCreate,
|
|
3575
3838
|
dryRun: args.dryRun,
|
|
3576
3839
|
input: args.aiInput || undefined,
|
|
@@ -3585,7 +3848,7 @@ async function run(argv) {
|
|
|
3585
3848
|
return;
|
|
3586
3849
|
}
|
|
3587
3850
|
|
|
3588
|
-
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`));
|
|
3851
|
+
throw new Error(formatError(`unsupported ai subcommand: ${args.aiCommand}. Supported tasks: analyze-project, 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`));
|
|
3589
3852
|
}
|
|
3590
3853
|
|
|
3591
3854
|
if (args.mode === 'graph') {
|
|
@@ -3620,7 +3883,9 @@ async function run(argv) {
|
|
|
3620
3883
|
language: args.language,
|
|
3621
3884
|
maxOutput: args.evidenceMaxOutput || undefined,
|
|
3622
3885
|
output: args.evidenceOutput || undefined,
|
|
3886
|
+
json: args.json,
|
|
3623
3887
|
subcommand: args.evidenceCommand,
|
|
3888
|
+
target: args.evidenceTarget,
|
|
3624
3889
|
});
|
|
3625
3890
|
process.exitCode = result.exitCode;
|
|
3626
3891
|
return;
|
|
@@ -3639,10 +3904,16 @@ async function run(argv) {
|
|
|
3639
3904
|
}
|
|
3640
3905
|
|
|
3641
3906
|
if (args.mode === 'migrate') {
|
|
3642
|
-
runMigrate(args.targetDir, {
|
|
3907
|
+
await runMigrate(args.targetDir, {
|
|
3643
3908
|
dryRun: args.dryRun,
|
|
3909
|
+
force: args.force,
|
|
3910
|
+
json: args.json,
|
|
3644
3911
|
language: args.language,
|
|
3912
|
+
noColor: args.noColor,
|
|
3645
3913
|
skipInstall: args.skipInstall,
|
|
3914
|
+
stderrIsTTY: Boolean(process.stderr.isTTY),
|
|
3915
|
+
stdinIsTTY: Boolean(process.stdin.isTTY),
|
|
3916
|
+
stdoutIsTTY: Boolean(process.stdout.isTTY),
|
|
3646
3917
|
});
|
|
3647
3918
|
return;
|
|
3648
3919
|
}
|
|
@@ -3680,7 +3951,11 @@ async function run(argv) {
|
|
|
3680
3951
|
}
|
|
3681
3952
|
|
|
3682
3953
|
if (args.mode === 'check-pr') {
|
|
3683
|
-
checkPrReadiness(args.targetDir, {
|
|
3954
|
+
checkPrReadiness(args.targetDir, {
|
|
3955
|
+
baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
|
|
3956
|
+
language: args.language,
|
|
3957
|
+
remote: args.aiRemote,
|
|
3958
|
+
});
|
|
3684
3959
|
return;
|
|
3685
3960
|
}
|
|
3686
3961
|
|
|
@@ -3751,11 +4026,12 @@ async function run(argv) {
|
|
|
3751
4026
|
}
|
|
3752
4027
|
|
|
3753
4028
|
if (!args.targetDir || args.targetDir === '.') {
|
|
3754
|
-
throw new Error(formatError('
|
|
4029
|
+
throw new Error(formatError(createTranslator(args.language).t('spec.error.missing_directory_command')));
|
|
3755
4030
|
}
|
|
3756
4031
|
|
|
3757
4032
|
if (args.specCommand === 'start') {
|
|
3758
4033
|
const report = startSpecWorktree(process.cwd(), args.targetDir, {
|
|
4034
|
+
baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
|
|
3759
4035
|
dryRun: args.dryRun,
|
|
3760
4036
|
});
|
|
3761
4037
|
process.stdout.write(formatSpecStartResult(report, { language: args.language }));
|
|
@@ -3778,7 +4054,7 @@ async function run(argv) {
|
|
|
3778
4054
|
|
|
3779
4055
|
if (args.specCommand === 'close') {
|
|
3780
4056
|
const report = closeSpecWorktree(process.cwd(), args.targetDir, {
|
|
3781
|
-
baseBranch: args.aiBaseBranch,
|
|
4057
|
+
baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
|
|
3782
4058
|
discard: args.discard,
|
|
3783
4059
|
dryRun: args.dryRun,
|
|
3784
4060
|
force: args.force,
|
|
@@ -3824,25 +4100,60 @@ async function run(argv) {
|
|
|
3824
4100
|
}
|
|
3825
4101
|
|
|
3826
4102
|
const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'quiver-create-'));
|
|
4103
|
+
const translator = createTranslator(args.language);
|
|
4104
|
+
const progress = createCommandProgressUx({
|
|
4105
|
+
json: args.json,
|
|
4106
|
+
noColor: args.noColor,
|
|
4107
|
+
stderrIsTTY: Boolean(process.stderr.isTTY),
|
|
4108
|
+
stdinIsTTY: Boolean(process.stdin.isTTY),
|
|
4109
|
+
stdoutIsTTY: Boolean(process.stdout.isTTY),
|
|
4110
|
+
});
|
|
3827
4111
|
|
|
3828
4112
|
try {
|
|
3829
|
-
|
|
3830
|
-
|
|
3831
|
-
|
|
4113
|
+
let templateRoot = '';
|
|
4114
|
+
await runProgress(
|
|
4115
|
+
progress,
|
|
4116
|
+
translator.t('init.progress.preparing_templates'),
|
|
4117
|
+
() => {
|
|
4118
|
+
ensureDir(targetDir);
|
|
4119
|
+
templateRoot = packTemplate(packageRoot, tempRoot);
|
|
4120
|
+
return templateRoot;
|
|
4121
|
+
},
|
|
4122
|
+
translator.t('init.progress.templates_ready'),
|
|
4123
|
+
);
|
|
3832
4124
|
if (initLayout.profile === 'full') {
|
|
3833
|
-
|
|
3834
|
-
|
|
3835
|
-
|
|
3836
|
-
|
|
3837
|
-
|
|
3838
|
-
|
|
3839
|
-
|
|
3840
|
-
|
|
3841
|
-
|
|
3842
|
-
|
|
4125
|
+
await runProgress(
|
|
4126
|
+
progress,
|
|
4127
|
+
translator.t('init.progress.exporting_templates'),
|
|
4128
|
+
() => exportTemplatesToLegacyRoot(templateRoot, targetDir),
|
|
4129
|
+
translator.t('init.progress.templates_exported'),
|
|
4130
|
+
);
|
|
4131
|
+
}
|
|
4132
|
+
let languageWrite = null;
|
|
4133
|
+
await runProgress(
|
|
4134
|
+
progress,
|
|
4135
|
+
translator.t('init.progress.writing_docs'),
|
|
4136
|
+
() => {
|
|
4137
|
+
runInitDocs(targetDir, initOptions.projectName, {
|
|
4138
|
+
includeTemplates: initOptions.includeTemplates,
|
|
4139
|
+
language: initLanguage.docsLanguage,
|
|
4140
|
+
legacyScripts: initOptions.legacyScripts,
|
|
4141
|
+
profile: initLayout.profile,
|
|
4142
|
+
templateRoot,
|
|
4143
|
+
});
|
|
4144
|
+
languageWrite = persistInitLanguage(targetDir, { language: initLanguage.configLanguage });
|
|
4145
|
+
return languageWrite;
|
|
4146
|
+
},
|
|
4147
|
+
translator.t('init.progress.docs_written'),
|
|
4148
|
+
);
|
|
3843
4149
|
|
|
3844
4150
|
if (!args.skipInstall) {
|
|
3845
|
-
const installResult =
|
|
4151
|
+
const installResult = await runProgress(
|
|
4152
|
+
progress,
|
|
4153
|
+
translator.t('init.progress.installing_package'),
|
|
4154
|
+
() => installSelfAsDevDep(targetDir, CLI_VERSION),
|
|
4155
|
+
translator.t('init.progress.install_checked'),
|
|
4156
|
+
);
|
|
3846
4157
|
if (installResult === 'installed') {
|
|
3847
4158
|
console.log(`Added create-quiver@${CLI_VERSION} as dev dependency`);
|
|
3848
4159
|
} else if (installResult === 'failed') {
|
|
@@ -3850,7 +4161,6 @@ async function run(argv) {
|
|
|
3850
4161
|
}
|
|
3851
4162
|
}
|
|
3852
4163
|
|
|
3853
|
-
const translator = createTranslator(args.language);
|
|
3854
4164
|
console.log(translator.t('init.installed', { path: targetDir }));
|
|
3855
4165
|
if (languageWrite) {
|
|
3856
4166
|
console.log(translator.t('init.language.saved', { language: languageWrite.language }));
|