@@ -7,7 +7,7 @@ import { tmpdir } from 'node:os'
77import { join } from 'node:path'
88import * as v from 'valibot'
99import { PackageNameSchema , UsernameSchema , OrgNameSchema , ScopeTeamSchema } from './schemas.ts'
10- import { logCommand , logSuccess , logError } from './logger.ts'
10+ import { logCommand , logSuccess , logError , logDebug } from './logger.ts'
1111
1212const execFileAsync = promisify ( execFile )
1313
@@ -75,10 +75,15 @@ function detectOtpRequired(stderr: string): boolean {
7575 'EOTP' ,
7676 'one-time password' ,
7777 'This operation requires a one-time password' ,
78+ 'OTP required for authentication' ,
7879 '--otp=<code>' ,
7980 ]
8081 const lowerStderr = stderr . toLowerCase ( )
81- return otpPatterns . some ( pattern => lowerStderr . includes ( pattern . toLowerCase ( ) ) )
82+ logDebug ( 'Checking for OTP requirement in stderr:' , stderr )
83+ logDebug ( 'OTP patterns:' , otpPatterns )
84+ const result = otpPatterns . some ( pattern => lowerStderr . includes ( pattern . toLowerCase ( ) ) )
85+ logDebug ( 'OTP required:' , result )
86+ return result
8287}
8388
8489function detectAuthFailure ( stderr : string ) : boolean {
@@ -96,7 +101,11 @@ function detectAuthFailure(stderr: string): boolean {
96101 'npm adduser' ,
97102 ]
98103 const lowerStderr = stderr . toLowerCase ( )
99- return authPatterns . some ( pattern => lowerStderr . includes ( pattern . toLowerCase ( ) ) )
104+ logDebug ( 'Checking for auth failure in stderr:' , stderr )
105+ logDebug ( 'Auth patterns:' , authPatterns )
106+ const result = authPatterns . some ( pattern => lowerStderr . includes ( pattern . toLowerCase ( ) ) )
107+ logDebug ( 'Auth failure:' , result )
108+ return result
100109}
101110
102111function filterNpmWarnings ( stderr : string ) : string {
@@ -123,6 +132,7 @@ async function execNpm(
123132 }
124133
125134 try {
135+ logDebug ( 'Executing npm command:' , { command : 'npm' , args : npmArgs } )
126136 // Use execFile instead of exec to avoid shell injection vulnerabilities
127137 // On Windows, shell: true is required to execute .cmd files (like npm.cmd)
128138 // On Unix, we keep it false for better security and performance
@@ -132,6 +142,8 @@ async function execNpm(
132142 shell : process . platform === 'win32' ,
133143 } )
134144
145+ logDebug ( 'Command succeeded:' , { stdout, stderr } )
146+
135147 if ( ! options . silent ) {
136148 logSuccess ( 'Done' )
137149 }
@@ -144,6 +156,7 @@ async function execNpm(
144156 } catch ( error ) {
145157 const err = error as { stdout ?: string ; stderr ?: string ; code ?: number }
146158 const stderr = err . stderr ?. trim ( ) ?? String ( error )
159+ logDebug ( 'Command failed:' , { error, stdout : err . stdout , stderr : err . stderr , code : err . code } )
147160 const requiresOtp = detectOtpRequired ( stderr )
148161 const authFailure = detectAuthFailure ( stderr )
149162
0 commit comments