From d113424b7336d4e8cafc206bf1401f9db23d65a6 Mon Sep 17 00:00:00 2001 From: Pavel Jbanov Date: Mon, 13 May 2024 08:51:48 -0400 Subject: [PATCH] Added (experimental) non-intetractive mode option for `genkit init` --- genkit-tools/cli/src/commands/init.ts | 29 ++++++++++++++-------- genkit-tools/common/src/utils/analytics.ts | 5 +++- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/genkit-tools/cli/src/commands/init.ts b/genkit-tools/cli/src/commands/init.ts index 4e9f4ed591..5d93eecd4c 100644 --- a/genkit-tools/cli/src/commands/init.ts +++ b/genkit-tools/cli/src/commands/init.ts @@ -57,6 +57,8 @@ interface InitOptions { model: ModelProvider; // Path to local Genkit dist archive. distArchive: string; + // Non-interactive mode. + nonInteractive: boolean; } interface ImportOptions { @@ -166,6 +168,10 @@ export const init = new Command('init') '-m, --model ', 'Model provider (googleai, vertexai, ollama, or none)' ) + .option( + '--non-interactive', + 'Run init in non-interactive mode (experimental)' + ) .option( '-d, --dist-archive ', 'Path to local Genkit dist archive' @@ -243,13 +249,14 @@ export const init = new Command('init') if (!fs.existsSync('src')) { fs.mkdirSync('src'); } - await updateTsConfig(); - await updatePackageJson(); + await updateTsConfig(options.nonInteractive); + await updatePackageJson(options.nonInteractive); if ( - await confirm({ + options.nonInteractive || + (await confirm({ message: 'Would you like to generate a sample flow?', default: true, - }) + })) ) { generateSampleFile(platform, modelOptions[model].plugin, plugins); } @@ -275,7 +282,7 @@ export const init = new Command('init') /** * Updates package.json with Genkit-expected fields. */ -async function updatePackageJson() { +async function updatePackageJson(nonInteractive: boolean) { const packageJsonPath = path.join(process.cwd(), 'package.json'); // package.json should exist before reaching this point. if (!fs.existsSync(packageJsonPath)) { @@ -284,9 +291,11 @@ async function updatePackageJson() { const existingPackageJson = JSON.parse( fs.readFileSync(packageJsonPath, 'utf8') ); - const choice = await promptWriteMode( - 'Would you like to update your package.json with suggested settings?' - ); + const choice = nonInteractive + ? 'overwrite' + : await promptWriteMode( + 'Would you like to update your package.json with suggested settings?' + ); const packageJson = { main: 'lib/index.js', scripts: { @@ -458,7 +467,7 @@ async function promptWriteMode( /** * Updates tsconfig.json with required flags for Genkit. */ -async function updateTsConfig() { +async function updateTsConfig(nonInteractive: boolean) { try { const tsConfigPath = path.join(process.cwd(), 'tsconfig.json'); let existingTsConfig = undefined; @@ -466,7 +475,7 @@ async function updateTsConfig() { existingTsConfig = JSON.parse(fs.readFileSync(tsConfigPath, 'utf-8')); } let choice: WriteMode = 'overwrite'; - if (existingTsConfig) { + if (!nonInteractive && existingTsConfig) { choice = await promptWriteMode( 'Would you like to update your tsconfig.json with suggested settings?' ); diff --git a/genkit-tools/common/src/utils/analytics.ts b/genkit-tools/common/src/utils/analytics.ts index 9106d3d835..0aaf4bcdab 100644 --- a/genkit-tools/common/src/utils/analytics.ts +++ b/genkit-tools/common/src/utils/analytics.ts @@ -207,7 +207,10 @@ function isValidateOnly(): boolean { // are set. Once we have opt-out and we're ready for public preview this will // get updated. function isAnalyticsEnabled(): boolean { - return !getUserSettings()[ANALYTICS_OPT_OUT_CONFIG_TAG]; + return ( + !process.argv.includes('--non-interactive') && + !getUserSettings()[ANALYTICS_OPT_OUT_CONFIG_TAG] + ); } async function recordInternal(