From aabbb0a3b031b39e854d3fad188615597d05c4ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A2=85=EA=B2=BD?= Date: Tue, 24 Mar 2026 22:27:28 +0900 Subject: [PATCH 1/3] fix(create): suggest `vp run dev` for non-Vite-native templates (#1123) --- .../create-next-command-application/snap.txt | 6 ++++ .../steps.json | 8 +++++ .../create-next-command-library/snap.txt | 6 ++++ .../create-next-command-library/steps.json | 8 +++++ .../cli/src/create/__tests__/utils.spec.ts | 2 ++ packages/cli/src/create/bin.ts | 21 +++++--------- packages/cli/src/create/utils.ts | 29 +++++++++++++++++++ 7 files changed, 66 insertions(+), 14 deletions(-) create mode 100644 packages/cli/snap-tests-global/create-next-command-application/snap.txt create mode 100644 packages/cli/snap-tests-global/create-next-command-application/steps.json create mode 100644 packages/cli/snap-tests-global/create-next-command-library/snap.txt create mode 100644 packages/cli/snap-tests-global/create-next-command-library/steps.json diff --git a/packages/cli/snap-tests-global/create-next-command-application/snap.txt b/packages/cli/snap-tests-global/create-next-command-application/snap.txt new file mode 100644 index 0000000000..0791b3a6ab --- /dev/null +++ b/packages/cli/snap-tests-global/create-next-command-application/snap.txt @@ -0,0 +1,6 @@ +> vp create vite:application --no-interactive # verify next command suggests vp dev + +Using default package name: vite-plus-application +◇ Scaffolded vite-plus-application with Vite application +• Node pnpm +→ Next: cd vite-plus-application && vp dev diff --git a/packages/cli/snap-tests-global/create-next-command-application/steps.json b/packages/cli/snap-tests-global/create-next-command-application/steps.json new file mode 100644 index 0000000000..89a759b384 --- /dev/null +++ b/packages/cli/snap-tests-global/create-next-command-application/steps.json @@ -0,0 +1,8 @@ +{ + "commands": [ + { + "command": "vp create vite:application --no-interactive # verify next command suggests vp dev", + "ignoreOutput": false + } + ] +} diff --git a/packages/cli/snap-tests-global/create-next-command-library/snap.txt b/packages/cli/snap-tests-global/create-next-command-library/snap.txt new file mode 100644 index 0000000000..356407ee87 --- /dev/null +++ b/packages/cli/snap-tests-global/create-next-command-library/snap.txt @@ -0,0 +1,6 @@ +> vp create vite:library --no-interactive # verify next command suggests vp run dev + +Using default package name: vite-plus-library +◇ Scaffolded vite-plus-library with TypeScript library +• Node pnpm +→ Next: cd vite-plus-library && vp run dev diff --git a/packages/cli/snap-tests-global/create-next-command-library/steps.json b/packages/cli/snap-tests-global/create-next-command-library/steps.json new file mode 100644 index 0000000000..e06f8ada63 --- /dev/null +++ b/packages/cli/snap-tests-global/create-next-command-library/steps.json @@ -0,0 +1,8 @@ +{ + "commands": [ + { + "command": "vp create vite:library --no-interactive # verify next command suggests vp run dev", + "ignoreOutput": false + } + ] +} diff --git a/packages/cli/src/create/__tests__/utils.spec.ts b/packages/cli/src/create/__tests__/utils.spec.ts index fd01ce4ed8..4be5f95ff6 100644 --- a/packages/cli/src/create/__tests__/utils.spec.ts +++ b/packages/cli/src/create/__tests__/utils.spec.ts @@ -3,6 +3,8 @@ import { describe, expect, it } from 'vitest'; import { deriveDefaultPackageName, formatTargetDir, + getCreateNextCommand, + getNextCommand, getProjectDirFromPackageName, } from '../utils.js'; diff --git a/packages/cli/src/create/bin.ts b/packages/cli/src/create/bin.ts index 63b0f2ce4d..dc291f84d1 100644 --- a/packages/cli/src/create/bin.ts +++ b/packages/cli/src/create/bin.ts @@ -53,7 +53,12 @@ import { } from './templates/index.js'; import { InitialMonorepoAppDir } from './templates/monorepo.js'; import { BuiltinTemplate, TemplateType } from './templates/types.js'; -import { deriveDefaultPackageName, formatTargetDir } from './utils.js'; +import { + deriveDefaultPackageName, + formatTargetDir, + getCreateNextCommand, + getNextCommand, +} from './utils.js'; const helpMessage = renderCliDoc({ usage: 'vp create [TEMPLATE] [OPTIONS] [-- TEMPLATE_OPTIONS]', @@ -307,13 +312,6 @@ function formatDuration(durationMs: number) { return `${Math.round(durationSeconds)}s`; } -function getNextCommand(projectDir: string, command: string) { - if (!projectDir || projectDir === '.') { - return command; - } - return `cd ${projectDir} && ${command}`; -} - function showCreateSummary(options: { description?: string; installSummary?: CommandRunSummary; @@ -963,12 +961,7 @@ Use \`vp create --list\` to list all available templates, or run \`vp create --h showCreateSummary({ description: describeScaffold(selectedTemplateName, selectedTemplateArgs), installSummary, - nextCommand: isMonorepo - ? `vp dev ${projectDir}` - : getNextCommand( - projectDir, - selectedTemplateName === BuiltinTemplate.library ? 'vp run dev' : 'vp dev', - ), + nextCommand: getCreateNextCommand(projectDir, selectedTemplateName, isMonorepo), packageManager: workspaceInfo.packageManager, packageManagerVersion: workspaceInfo.downloadPackageManager.version, projectDir, diff --git a/packages/cli/src/create/utils.ts b/packages/cli/src/create/utils.ts index 38f5098faa..90ad30aafc 100644 --- a/packages/cli/src/create/utils.ts +++ b/packages/cli/src/create/utils.ts @@ -5,6 +5,7 @@ import validateNpmPackageName from 'validate-npm-package-name'; import { editJsonFile } from '../utils/json.js'; import { getRandomProjectName } from './random-name.js'; +import { BuiltinTemplate } from './templates/types.js'; // Helper functions for file operations export function copy(src: string, dest: string) { @@ -139,3 +140,31 @@ export function deriveDefaultPackageName( ? candidate : getRandomProjectName({ scope, fallbackName }); } + +export function getNextCommand(projectDir: string, command: string) { + if (!projectDir || projectDir === '.') { + return command; + } + return `cd ${projectDir} && ${command}`; +} + +/** + * Determine the "Next:" command to show after `vp create`. + * + * - Builtin templates (except `vite:library`) use Vite's dev server directly → `vp dev` + * - Non-builtin templates (Astro, Nuxt, etc.) and `vite:library` run the + * package.json `dev` script → `vp run dev` + */ +export function getCreateNextCommand( + projectDir: string, + selectedTemplateName: string, + isMonorepo: boolean, +): string { + const isBuiltinTemplate = selectedTemplateName.startsWith('vite:'); + const hasBuiltinDevServer = isBuiltinTemplate && selectedTemplateName !== BuiltinTemplate.library; + + if (isMonorepo) { + return hasBuiltinDevServer ? `vp dev ${projectDir}` : getNextCommand(projectDir, 'vp run dev'); + } + return getNextCommand(projectDir, hasBuiltinDevServer ? 'vp dev' : 'vp run dev'); +} From dcaecc6a7afde7a9348d4701b035d9b28e97ffbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A2=85=EA=B2=BD?= Date: Wed, 25 Mar 2026 00:10:01 +0900 Subject: [PATCH 2/3] test(create): add tests for next command suggestion across template types --- .../apps/existing-app/package.json | 3 + .../package.json | 6 ++ .../snap.txt | 6 ++ .../steps.json | 8 +++ .../package.json | 6 ++ .../packages/existing-lib/package.json | 3 + .../snap.txt | 6 ++ .../steps.json | 8 +++ .../cli/src/create/__tests__/utils.spec.ts | 61 +++++++++++++++++++ 9 files changed, 107 insertions(+) create mode 100644 packages/cli/snap-tests-global/create-next-command-monorepo-application/apps/existing-app/package.json create mode 100644 packages/cli/snap-tests-global/create-next-command-monorepo-application/package.json create mode 100644 packages/cli/snap-tests-global/create-next-command-monorepo-application/snap.txt create mode 100644 packages/cli/snap-tests-global/create-next-command-monorepo-application/steps.json create mode 100644 packages/cli/snap-tests-global/create-next-command-monorepo-library/package.json create mode 100644 packages/cli/snap-tests-global/create-next-command-monorepo-library/packages/existing-lib/package.json create mode 100644 packages/cli/snap-tests-global/create-next-command-monorepo-library/snap.txt create mode 100644 packages/cli/snap-tests-global/create-next-command-monorepo-library/steps.json diff --git a/packages/cli/snap-tests-global/create-next-command-monorepo-application/apps/existing-app/package.json b/packages/cli/snap-tests-global/create-next-command-monorepo-application/apps/existing-app/package.json new file mode 100644 index 0000000000..8d1e4c6cf3 --- /dev/null +++ b/packages/cli/snap-tests-global/create-next-command-monorepo-application/apps/existing-app/package.json @@ -0,0 +1,3 @@ +{ + "name": "existing-app" +} diff --git a/packages/cli/snap-tests-global/create-next-command-monorepo-application/package.json b/packages/cli/snap-tests-global/create-next-command-monorepo-application/package.json new file mode 100644 index 0000000000..5620c26fcb --- /dev/null +++ b/packages/cli/snap-tests-global/create-next-command-monorepo-application/package.json @@ -0,0 +1,6 @@ +{ + "name": "test-monorepo", + "workspaces": [ + "apps/*" + ] +} diff --git a/packages/cli/snap-tests-global/create-next-command-monorepo-application/snap.txt b/packages/cli/snap-tests-global/create-next-command-monorepo-application/snap.txt new file mode 100644 index 0000000000..e2c83c78f8 --- /dev/null +++ b/packages/cli/snap-tests-global/create-next-command-monorepo-application/snap.txt @@ -0,0 +1,6 @@ +> vp create vite:application --no-interactive # monorepo: next command should suggest vp dev + +Using default package name: vite-plus-application +◇ Scaffolded apps/vite-plus-application with Vite application +• Node pnpm +→ Next: vp dev apps/vite-plus-application diff --git a/packages/cli/snap-tests-global/create-next-command-monorepo-application/steps.json b/packages/cli/snap-tests-global/create-next-command-monorepo-application/steps.json new file mode 100644 index 0000000000..19d9789963 --- /dev/null +++ b/packages/cli/snap-tests-global/create-next-command-monorepo-application/steps.json @@ -0,0 +1,8 @@ +{ + "commands": [ + { + "command": "vp create vite:application --no-interactive # monorepo: next command should suggest vp dev ", + "ignoreOutput": false + } + ] +} diff --git a/packages/cli/snap-tests-global/create-next-command-monorepo-library/package.json b/packages/cli/snap-tests-global/create-next-command-monorepo-library/package.json new file mode 100644 index 0000000000..d124232d55 --- /dev/null +++ b/packages/cli/snap-tests-global/create-next-command-monorepo-library/package.json @@ -0,0 +1,6 @@ +{ + "name": "test-monorepo", + "workspaces": [ + "packages/*" + ] +} diff --git a/packages/cli/snap-tests-global/create-next-command-monorepo-library/packages/existing-lib/package.json b/packages/cli/snap-tests-global/create-next-command-monorepo-library/packages/existing-lib/package.json new file mode 100644 index 0000000000..a996b73115 --- /dev/null +++ b/packages/cli/snap-tests-global/create-next-command-monorepo-library/packages/existing-lib/package.json @@ -0,0 +1,3 @@ +{ + "name": "existing-lib" +} diff --git a/packages/cli/snap-tests-global/create-next-command-monorepo-library/snap.txt b/packages/cli/snap-tests-global/create-next-command-monorepo-library/snap.txt new file mode 100644 index 0000000000..b43df1b1dd --- /dev/null +++ b/packages/cli/snap-tests-global/create-next-command-monorepo-library/snap.txt @@ -0,0 +1,6 @@ +> vp create vite:library --no-interactive # monorepo: next command should suggest cd && vp run dev + +Using default package name: vite-plus-library +◇ Scaffolded packages/vite-plus-library with TypeScript library +• Node pnpm +→ Next: cd packages/vite-plus-library && vp run dev diff --git a/packages/cli/snap-tests-global/create-next-command-monorepo-library/steps.json b/packages/cli/snap-tests-global/create-next-command-monorepo-library/steps.json new file mode 100644 index 0000000000..f42eb12618 --- /dev/null +++ b/packages/cli/snap-tests-global/create-next-command-monorepo-library/steps.json @@ -0,0 +1,8 @@ +{ + "commands": [ + { + "command": "vp create vite:library --no-interactive # monorepo: next command should suggest cd && vp run dev", + "ignoreOutput": false + } + ] +} diff --git a/packages/cli/src/create/__tests__/utils.spec.ts b/packages/cli/src/create/__tests__/utils.spec.ts index 4be5f95ff6..5ff5305912 100644 --- a/packages/cli/src/create/__tests__/utils.spec.ts +++ b/packages/cli/src/create/__tests__/utils.spec.ts @@ -65,6 +65,67 @@ describe('formatTargetDir', () => { }); }); +describe('getNextCommand', () => { + it('should prepend cd when projectDir is a named directory', () => { + expect(getNextCommand('my-app', 'vp dev')).toBe('cd my-app && vp dev'); + expect(getNextCommand('my-app', 'vp run dev')).toBe('cd my-app && vp run dev'); + }); + + it('should return command only when projectDir is "."', () => { + expect(getNextCommand('.', 'vp dev')).toBe('vp dev'); + }); + + it('should return command only when projectDir is empty', () => { + expect(getNextCommand('', 'vp dev')).toBe('vp dev'); + }); +}); + +describe('getCreateNextCommand', () => { + // standalone + it('should suggest vp dev for builtin application (standalone)', () => { + expect(getCreateNextCommand('my-app', 'vite:application', false)).toBe('cd my-app && vp dev'); + }); + + it('should suggest vp run dev for builtin library (standalone)', () => { + expect(getCreateNextCommand('my-app', 'vite:library', false)).toBe('cd my-app && vp run dev'); + }); + + it('should suggest vp run dev for remote template (standalone)', () => { + expect(getCreateNextCommand('my-astro', 'astro', false)).toBe('cd my-astro && vp run dev'); + }); + + it('should suggest vp run dev for bingo template (standalone)', () => { + expect(getCreateNextCommand('my-app', 'my-bingo-template', false)).toBe( + 'cd my-app && vp run dev', + ); + }); + + // monorepo + it('should suggest vp dev for builtin application (monorepo)', () => { + expect(getCreateNextCommand('packages/my-app', 'vite:application', true)).toBe( + 'vp dev packages/my-app', + ); + }); + + it('should suggest cd + vp run dev for builtin library (monorepo)', () => { + expect(getCreateNextCommand('packages/my-lib', 'vite:library', true)).toBe( + 'cd packages/my-lib && vp run dev', + ); + }); + + it('should suggest cd + vp run dev for remote template (monorepo)', () => { + expect(getCreateNextCommand('packages/my-nuxt', 'nuxt', true)).toBe( + 'cd packages/my-nuxt && vp run dev', + ); + }); + + // projectDir edge cases + it('should omit cd when projectDir is "." (standalone)', () => { + expect(getCreateNextCommand('.', 'vite:application', false)).toBe('vp dev'); + expect(getCreateNextCommand('.', 'astro', false)).toBe('vp run dev'); + }); +}); + describe('deriveDefaultPackageName', () => { it('should derive package name from directory basename', () => { expect(deriveDefaultPackageName('/home/user/my-app', undefined, 'fallback')).toBe('my-app'); From 54948506cdfff7e2f55b295a5e6185a71e517734 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A2=85=EA=B2=BD?= Date: Wed, 25 Mar 2026 10:39:47 +0900 Subject: [PATCH 3/3] fix(create): simplify next command suggestion to `vp run` Always suggest `vp run` after `vp create` regardless of template type, as suggested by maintainer. This removes template-type and monorepo branching logic, letting users choose which script to run. Closes #1123 --- .../create-next-command-application/snap.txt | 4 +- .../steps.json | 2 +- .../create-next-command-library/snap.txt | 4 +- .../create-next-command-library/steps.json | 2 +- .../snap.txt | 4 +- .../steps.json | 2 +- .../snap.txt | 4 +- .../steps.json | 2 +- .../cli/src/create/__tests__/utils.spec.ts | 63 ------------------- packages/cli/src/create/bin.ts | 19 +++--- packages/cli/src/create/utils.ts | 29 --------- 11 files changed, 22 insertions(+), 113 deletions(-) diff --git a/packages/cli/snap-tests-global/create-next-command-application/snap.txt b/packages/cli/snap-tests-global/create-next-command-application/snap.txt index 0791b3a6ab..aadd9b6f00 100644 --- a/packages/cli/snap-tests-global/create-next-command-application/snap.txt +++ b/packages/cli/snap-tests-global/create-next-command-application/snap.txt @@ -1,6 +1,6 @@ -> vp create vite:application --no-interactive # verify next command suggests vp dev +> vp create vite:application --no-interactive # verify next command suggests vp run Using default package name: vite-plus-application ◇ Scaffolded vite-plus-application with Vite application • Node pnpm -→ Next: cd vite-plus-application && vp dev +→ Next: cd vite-plus-application && vp run diff --git a/packages/cli/snap-tests-global/create-next-command-application/steps.json b/packages/cli/snap-tests-global/create-next-command-application/steps.json index 89a759b384..b0929700e1 100644 --- a/packages/cli/snap-tests-global/create-next-command-application/steps.json +++ b/packages/cli/snap-tests-global/create-next-command-application/steps.json @@ -1,7 +1,7 @@ { "commands": [ { - "command": "vp create vite:application --no-interactive # verify next command suggests vp dev", + "command": "vp create vite:application --no-interactive # verify next command suggests vp run", "ignoreOutput": false } ] diff --git a/packages/cli/snap-tests-global/create-next-command-library/snap.txt b/packages/cli/snap-tests-global/create-next-command-library/snap.txt index 356407ee87..6ef32752f6 100644 --- a/packages/cli/snap-tests-global/create-next-command-library/snap.txt +++ b/packages/cli/snap-tests-global/create-next-command-library/snap.txt @@ -1,6 +1,6 @@ -> vp create vite:library --no-interactive # verify next command suggests vp run dev +> vp create vite:library --no-interactive # verify next command suggests vp run Using default package name: vite-plus-library ◇ Scaffolded vite-plus-library with TypeScript library • Node pnpm -→ Next: cd vite-plus-library && vp run dev +→ Next: cd vite-plus-library && vp run diff --git a/packages/cli/snap-tests-global/create-next-command-library/steps.json b/packages/cli/snap-tests-global/create-next-command-library/steps.json index e06f8ada63..54e4288e92 100644 --- a/packages/cli/snap-tests-global/create-next-command-library/steps.json +++ b/packages/cli/snap-tests-global/create-next-command-library/steps.json @@ -1,7 +1,7 @@ { "commands": [ { - "command": "vp create vite:library --no-interactive # verify next command suggests vp run dev", + "command": "vp create vite:library --no-interactive # verify next command suggests vp run", "ignoreOutput": false } ] diff --git a/packages/cli/snap-tests-global/create-next-command-monorepo-application/snap.txt b/packages/cli/snap-tests-global/create-next-command-monorepo-application/snap.txt index e2c83c78f8..c54f0492ec 100644 --- a/packages/cli/snap-tests-global/create-next-command-monorepo-application/snap.txt +++ b/packages/cli/snap-tests-global/create-next-command-monorepo-application/snap.txt @@ -1,6 +1,6 @@ -> vp create vite:application --no-interactive # monorepo: next command should suggest vp dev +> vp create vite:application --no-interactive # monorepo: next command should suggest vp run Using default package name: vite-plus-application ◇ Scaffolded apps/vite-plus-application with Vite application • Node pnpm -→ Next: vp dev apps/vite-plus-application +→ Next: cd apps/vite-plus-application && vp run diff --git a/packages/cli/snap-tests-global/create-next-command-monorepo-application/steps.json b/packages/cli/snap-tests-global/create-next-command-monorepo-application/steps.json index 19d9789963..01d50c7f4c 100644 --- a/packages/cli/snap-tests-global/create-next-command-monorepo-application/steps.json +++ b/packages/cli/snap-tests-global/create-next-command-monorepo-application/steps.json @@ -1,7 +1,7 @@ { "commands": [ { - "command": "vp create vite:application --no-interactive # monorepo: next command should suggest vp dev ", + "command": "vp create vite:application --no-interactive # monorepo: next command should suggest vp run", "ignoreOutput": false } ] diff --git a/packages/cli/snap-tests-global/create-next-command-monorepo-library/snap.txt b/packages/cli/snap-tests-global/create-next-command-monorepo-library/snap.txt index b43df1b1dd..a84e32f35f 100644 --- a/packages/cli/snap-tests-global/create-next-command-monorepo-library/snap.txt +++ b/packages/cli/snap-tests-global/create-next-command-monorepo-library/snap.txt @@ -1,6 +1,6 @@ -> vp create vite:library --no-interactive # monorepo: next command should suggest cd && vp run dev +> vp create vite:library --no-interactive # monorepo: next command should suggest vp run Using default package name: vite-plus-library ◇ Scaffolded packages/vite-plus-library with TypeScript library • Node pnpm -→ Next: cd packages/vite-plus-library && vp run dev +→ Next: cd packages/vite-plus-library && vp run diff --git a/packages/cli/snap-tests-global/create-next-command-monorepo-library/steps.json b/packages/cli/snap-tests-global/create-next-command-monorepo-library/steps.json index f42eb12618..846a971114 100644 --- a/packages/cli/snap-tests-global/create-next-command-monorepo-library/steps.json +++ b/packages/cli/snap-tests-global/create-next-command-monorepo-library/steps.json @@ -1,7 +1,7 @@ { "commands": [ { - "command": "vp create vite:library --no-interactive # monorepo: next command should suggest cd && vp run dev", + "command": "vp create vite:library --no-interactive # monorepo: next command should suggest vp run", "ignoreOutput": false } ] diff --git a/packages/cli/src/create/__tests__/utils.spec.ts b/packages/cli/src/create/__tests__/utils.spec.ts index 5ff5305912..fd01ce4ed8 100644 --- a/packages/cli/src/create/__tests__/utils.spec.ts +++ b/packages/cli/src/create/__tests__/utils.spec.ts @@ -3,8 +3,6 @@ import { describe, expect, it } from 'vitest'; import { deriveDefaultPackageName, formatTargetDir, - getCreateNextCommand, - getNextCommand, getProjectDirFromPackageName, } from '../utils.js'; @@ -65,67 +63,6 @@ describe('formatTargetDir', () => { }); }); -describe('getNextCommand', () => { - it('should prepend cd when projectDir is a named directory', () => { - expect(getNextCommand('my-app', 'vp dev')).toBe('cd my-app && vp dev'); - expect(getNextCommand('my-app', 'vp run dev')).toBe('cd my-app && vp run dev'); - }); - - it('should return command only when projectDir is "."', () => { - expect(getNextCommand('.', 'vp dev')).toBe('vp dev'); - }); - - it('should return command only when projectDir is empty', () => { - expect(getNextCommand('', 'vp dev')).toBe('vp dev'); - }); -}); - -describe('getCreateNextCommand', () => { - // standalone - it('should suggest vp dev for builtin application (standalone)', () => { - expect(getCreateNextCommand('my-app', 'vite:application', false)).toBe('cd my-app && vp dev'); - }); - - it('should suggest vp run dev for builtin library (standalone)', () => { - expect(getCreateNextCommand('my-app', 'vite:library', false)).toBe('cd my-app && vp run dev'); - }); - - it('should suggest vp run dev for remote template (standalone)', () => { - expect(getCreateNextCommand('my-astro', 'astro', false)).toBe('cd my-astro && vp run dev'); - }); - - it('should suggest vp run dev for bingo template (standalone)', () => { - expect(getCreateNextCommand('my-app', 'my-bingo-template', false)).toBe( - 'cd my-app && vp run dev', - ); - }); - - // monorepo - it('should suggest vp dev for builtin application (monorepo)', () => { - expect(getCreateNextCommand('packages/my-app', 'vite:application', true)).toBe( - 'vp dev packages/my-app', - ); - }); - - it('should suggest cd + vp run dev for builtin library (monorepo)', () => { - expect(getCreateNextCommand('packages/my-lib', 'vite:library', true)).toBe( - 'cd packages/my-lib && vp run dev', - ); - }); - - it('should suggest cd + vp run dev for remote template (monorepo)', () => { - expect(getCreateNextCommand('packages/my-nuxt', 'nuxt', true)).toBe( - 'cd packages/my-nuxt && vp run dev', - ); - }); - - // projectDir edge cases - it('should omit cd when projectDir is "." (standalone)', () => { - expect(getCreateNextCommand('.', 'vite:application', false)).toBe('vp dev'); - expect(getCreateNextCommand('.', 'astro', false)).toBe('vp run dev'); - }); -}); - describe('deriveDefaultPackageName', () => { it('should derive package name from directory basename', () => { expect(deriveDefaultPackageName('/home/user/my-app', undefined, 'fallback')).toBe('my-app'); diff --git a/packages/cli/src/create/bin.ts b/packages/cli/src/create/bin.ts index dc291f84d1..9eac102709 100644 --- a/packages/cli/src/create/bin.ts +++ b/packages/cli/src/create/bin.ts @@ -51,14 +51,8 @@ import { executeMonorepoTemplate, executeRemoteTemplate, } from './templates/index.js'; -import { InitialMonorepoAppDir } from './templates/monorepo.js'; import { BuiltinTemplate, TemplateType } from './templates/types.js'; -import { - deriveDefaultPackageName, - formatTargetDir, - getCreateNextCommand, - getNextCommand, -} from './utils.js'; +import { deriveDefaultPackageName, formatTargetDir } from './utils.js'; const helpMessage = renderCliDoc({ usage: 'vp create [TEMPLATE] [OPTIONS] [-- TEMPLATE_OPTIONS]', @@ -312,6 +306,13 @@ function formatDuration(durationMs: number) { return `${Math.round(durationSeconds)}s`; } +function getNextCommand(projectDir: string, command: string) { + if (!projectDir || projectDir === '.') { + return command; + } + return `cd ${projectDir} && ${command}`; +} + function showCreateSummary(options: { description?: string; installSummary?: CommandRunSummary; @@ -794,7 +795,7 @@ Use \`vp create --list\` to list all available templates, or run \`vp create --h showCreateSummary({ description: describeScaffold(selectedTemplateName, selectedTemplateArgs), installSummary, - nextCommand: getNextCommand(projectDir, `vp dev ${InitialMonorepoAppDir}`), + nextCommand: getNextCommand(projectDir, 'vp run'), packageManager: workspaceInfo.packageManager, packageManagerVersion: workspaceInfo.downloadPackageManager.version, projectDir, @@ -961,7 +962,7 @@ Use \`vp create --list\` to list all available templates, or run \`vp create --h showCreateSummary({ description: describeScaffold(selectedTemplateName, selectedTemplateArgs), installSummary, - nextCommand: getCreateNextCommand(projectDir, selectedTemplateName, isMonorepo), + nextCommand: getNextCommand(projectDir, 'vp run'), packageManager: workspaceInfo.packageManager, packageManagerVersion: workspaceInfo.downloadPackageManager.version, projectDir, diff --git a/packages/cli/src/create/utils.ts b/packages/cli/src/create/utils.ts index 90ad30aafc..38f5098faa 100644 --- a/packages/cli/src/create/utils.ts +++ b/packages/cli/src/create/utils.ts @@ -5,7 +5,6 @@ import validateNpmPackageName from 'validate-npm-package-name'; import { editJsonFile } from '../utils/json.js'; import { getRandomProjectName } from './random-name.js'; -import { BuiltinTemplate } from './templates/types.js'; // Helper functions for file operations export function copy(src: string, dest: string) { @@ -140,31 +139,3 @@ export function deriveDefaultPackageName( ? candidate : getRandomProjectName({ scope, fallbackName }); } - -export function getNextCommand(projectDir: string, command: string) { - if (!projectDir || projectDir === '.') { - return command; - } - return `cd ${projectDir} && ${command}`; -} - -/** - * Determine the "Next:" command to show after `vp create`. - * - * - Builtin templates (except `vite:library`) use Vite's dev server directly → `vp dev` - * - Non-builtin templates (Astro, Nuxt, etc.) and `vite:library` run the - * package.json `dev` script → `vp run dev` - */ -export function getCreateNextCommand( - projectDir: string, - selectedTemplateName: string, - isMonorepo: boolean, -): string { - const isBuiltinTemplate = selectedTemplateName.startsWith('vite:'); - const hasBuiltinDevServer = isBuiltinTemplate && selectedTemplateName !== BuiltinTemplate.library; - - if (isMonorepo) { - return hasBuiltinDevServer ? `vp dev ${projectDir}` : getNextCommand(projectDir, 'vp run dev'); - } - return getNextCommand(projectDir, hasBuiltinDevServer ? 'vp dev' : 'vp run dev'); -}