From b5aedc8b7e661ae1715da5d3f63155220deb06b1 Mon Sep 17 00:00:00 2001 From: Ryu <114303361+ryuapp@users.noreply.github.com> Date: Sat, 21 Feb 2026 14:28:22 +0900 Subject: [PATCH 1/2] fix: remove package manager fallback --- src/hooks/dependencies.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/hooks/dependencies.ts b/src/hooks/dependencies.ts index 979587b..1eef001 100644 --- a/src/hooks/dependencies.ts +++ b/src/hooks/dependencies.ts @@ -84,7 +84,7 @@ const registerInstallationHook = ( let packageManager: string - if (pmArg && installedPackageManagerNames.includes(pmArg)) { + if (pmArg) { packageManager = pmArg } else { packageManager = await select({ @@ -111,6 +111,10 @@ const registerInstallationHook = ( try { await spawn(command, args, { cwd: directoryPath, + // On Windows, stderr from cmd.exe is encoded in the OEM code page (e.g. CP932), + // which causes garbled text when Node.js reads it as UTF-8. + // Using 'inherit' pipes stderr directly to the terminal to avoid this. + stderr: 'inherit', }) } catch (error: unknown) { if (error instanceof SubprocessError) { From 8ad9a050059929832eb29bf70bec754bd3a20f52 Mon Sep 17 00:00:00 2001 From: Ryu <114303361+ryuapp@users.noreply.github.com> Date: Sat, 21 Feb 2026 15:24:07 +0900 Subject: [PATCH 2/2] fix: improve type safe for package manager names --- src/hooks/dependencies.ts | 22 ++++++++++++++-------- src/index.ts | 6 +++--- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/hooks/dependencies.ts b/src/hooks/dependencies.ts index 1eef001..02763ea 100644 --- a/src/hooks/dependencies.ts +++ b/src/hooks/dependencies.ts @@ -7,9 +7,16 @@ import type { EventEmitter } from 'node:events' import { exit } from 'node:process' import { projectDependenciesHook } from '../hook' -type PackageManager = 'npm' | 'bun' | 'deno' | 'pnpm' | 'yarn' - -const knownPackageManagers: { [key: string]: string } = { +export const knownPackageManagerNames = [ + 'npm', + 'bun', + 'deno', + 'pnpm', + 'yarn', +] as const +export type PackageManager = (typeof knownPackageManagerNames)[number] + +const knownPackageManagers: Record = { npm: 'npm install', bun: 'bun install', deno: 'deno install', @@ -17,7 +24,6 @@ const knownPackageManagers: { [key: string]: string } = { yarn: 'yarn', } -export const knownPackageManagerNames = Object.keys(knownPackageManagers) const currentPackageManager = getCurrentPackageManager() // Deno and Netlify need no dependency installation step @@ -25,14 +31,14 @@ const excludeTemplate = ['deno', 'netlify'] export type EventMap = { dependencies: unknown[] - packageManager: unknown[] + packageManager: [PackageManager] completed: unknown[] } const registerInstallationHook = ( template: string, installArg: boolean | undefined, - pmArg: string | undefined, + pmArg: PackageManager | undefined, emitter: EventEmitter, ) => { if (excludeTemplate.includes(template)) { @@ -82,14 +88,14 @@ const registerInstallationHook = ( return } - let packageManager: string + let packageManager: PackageManager if (pmArg) { packageManager = pmArg } else { packageManager = await select({ message: 'Which package manager do you want to use?', - choices: installedPackageManagerNames.map((template: string) => ({ + choices: installedPackageManagerNames.map((template) => ({ title: template, value: template, })), diff --git a/src/index.ts b/src/index.ts index ce4aecc..28279e7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -16,7 +16,7 @@ import { knownPackageManagerNames, registerInstallationHook, } from './hooks/dependencies' -import type { EventMap } from './hooks/dependencies' +import type { EventMap, PackageManager } from './hooks/dependencies' const [major, minor] = version.split('.') const ref = `v${major}.${minor}` @@ -78,7 +78,7 @@ program .action(main) type ArgOptions = { - pm?: string + pm?: PackageManager offline: boolean install?: boolean template?: string @@ -156,7 +156,7 @@ async function main( // Default package manager let packageManager = pm ?? 'npm' emitter.addListener('packageManager', (pm) => { - packageManager = String(pm) + packageManager = pm }) registerInstallationHook(templateName, install, pm, emitter)