From 9905514f2c0f2270db76cc2fffd21e171481583e Mon Sep 17 00:00:00 2001 From: Marcos Passos Date: Fri, 11 Sep 2026 17:35:42 -0300 Subject: [PATCH 1/2] Honor the --cwd option --- src/infrastructure/application/cli/program.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/infrastructure/application/cli/program.ts b/src/infrastructure/application/cli/program.ts index 7729a80a..e9791f23 100644 --- a/src/infrastructure/application/cli/program.ts +++ b/src/infrastructure/application/cli/program.ts @@ -1,6 +1,6 @@ import {Argument, Command, InvalidOptionArgumentError, Option} from '@commander-js/extra-typings'; import type {JsonPrimitive, JsonValue} from '@croct/json'; -import {realpathSync} from 'fs'; +import {realpathSync, statSync} from 'fs'; import {ApiKey} from '@croct/sdk/apiKey'; import {Token} from '@croct/sdk/token'; import {Cli} from '@/infrastructure/application/cli/cli'; @@ -21,11 +21,19 @@ function createProgram(config: Configuration): typeof program { .description('Manage your Croct projects') .enablePositionalOptions() .option('--cwd ', 'The working directory.', path => { + let directory: string; + try { - return realpathSync(path); + directory = realpathSync(path); } catch { throw new InvalidOptionArgumentError('The path does not exist.'); } + + if (!statSync(directory).isDirectory()) { + throw new InvalidOptionArgumentError('The path is not a directory.'); + } + + return directory; }) .addOption( new Option('--api-key ', 'The API key to use for authentication.') @@ -457,6 +465,9 @@ export async function run(args: string[] = process.argv, welcome = true): Promis ? undefined : new URL(options.registry), configurationFile: options.config, + directories: { + current: options.cwd, + }, }); const template = getTemplate(invocation.args); From 4bdc36028b3432f00ada6ea20e56cdd16f1fc286 Mon Sep 17 00:00:00 2001 From: Marcos Passos Date: Fri, 11 Sep 2026 18:00:22 -0300 Subject: [PATCH 2/2] Report --cwd resolution errors by cause --- src/infrastructure/application/cli/program.ts | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/infrastructure/application/cli/program.ts b/src/infrastructure/application/cli/program.ts index e9791f23..74439e68 100644 --- a/src/infrastructure/application/cli/program.ts +++ b/src/infrastructure/application/cli/program.ts @@ -22,14 +22,29 @@ function createProgram(config: Configuration): typeof program { .enablePositionalOptions() .option('--cwd ', 'The working directory.', path => { let directory: string; + let isDirectory: boolean; try { directory = realpathSync(path); - } catch { - throw new InvalidOptionArgumentError('The path does not exist.'); + isDirectory = statSync(directory).isDirectory(); + } catch (error) { + const code = error instanceof Error && 'code' in error ? error.code : null; + + switch (code) { + case 'ENOENT': + case 'ENOTDIR': + throw new InvalidOptionArgumentError('The path does not exist.'); + + case 'EACCES': + case 'EPERM': + throw new InvalidOptionArgumentError('The path is not accessible.'); + + default: + throw new InvalidOptionArgumentError('The path cannot be resolved.'); + } } - if (!statSync(directory).isDirectory()) { + if (!isDirectory) { throw new InvalidOptionArgumentError('The path is not a directory.'); }