diff --git a/skills/cloud-sql-postgres-admin/scripts/clone_instance.js b/skills/cloud-sql-postgres-admin/scripts/clone_instance.js index 5d24ece..3c180dd 100755 --- a/skills/cloud-sql-postgres-admin/scripts/clone_instance.js +++ b/skills/cloud-sql-postgres-admin/scripts/clone_instance.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "clone_instance"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-admin/scripts/create_database.js b/skills/cloud-sql-postgres-admin/scripts/create_database.js index 376a99d..9bc5dbb 100755 --- a/skills/cloud-sql-postgres-admin/scripts/create_database.js +++ b/skills/cloud-sql-postgres-admin/scripts/create_database.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "create_database"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-admin/scripts/create_instance.js b/skills/cloud-sql-postgres-admin/scripts/create_instance.js index c66c10e..3961581 100755 --- a/skills/cloud-sql-postgres-admin/scripts/create_instance.js +++ b/skills/cloud-sql-postgres-admin/scripts/create_instance.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "create_instance"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-admin/scripts/create_user.js b/skills/cloud-sql-postgres-admin/scripts/create_user.js index a095348..33d664d 100755 --- a/skills/cloud-sql-postgres-admin/scripts/create_user.js +++ b/skills/cloud-sql-postgres-admin/scripts/create_user.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "create_user"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-admin/scripts/get_instance.js b/skills/cloud-sql-postgres-admin/scripts/get_instance.js index 216e7e8..acd5037 100755 --- a/skills/cloud-sql-postgres-admin/scripts/get_instance.js +++ b/skills/cloud-sql-postgres-admin/scripts/get_instance.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "get_instance"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-admin/scripts/list_databases.js b/skills/cloud-sql-postgres-admin/scripts/list_databases.js index cb0729a..5450ed4 100755 --- a/skills/cloud-sql-postgres-admin/scripts/list_databases.js +++ b/skills/cloud-sql-postgres-admin/scripts/list_databases.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_databases"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-admin/scripts/list_instances.js b/skills/cloud-sql-postgres-admin/scripts/list_instances.js index b24402c..66d0603 100755 --- a/skills/cloud-sql-postgres-admin/scripts/list_instances.js +++ b/skills/cloud-sql-postgres-admin/scripts/list_instances.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_instances"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-admin/scripts/wait_for_operation.js b/skills/cloud-sql-postgres-admin/scripts/wait_for_operation.js index 3bd09d9..06aa8e1 100755 --- a/skills/cloud-sql-postgres-admin/scripts/wait_for_operation.js +++ b/skills/cloud-sql-postgres-admin/scripts/wait_for_operation.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "wait_for_operation"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-data/SKILL.md b/skills/cloud-sql-postgres-data/SKILL.md index f9f6956..e03b432 100644 --- a/skills/cloud-sql-postgres-data/SKILL.md +++ b/skills/cloud-sql-postgres-data/SKILL.md @@ -19,7 +19,7 @@ Note: The scripts automatically load the environment variables from various .env ### execute_sql -Use this skill to execute sql. +Use this tool to execute a single SQL statement. #### Parameters diff --git a/skills/cloud-sql-postgres-data/scripts/execute_sql.js b/skills/cloud-sql-postgres-data/scripts/execute_sql.js index 5e592f7..d1be556 100755 --- a/skills/cloud-sql-postgres-data/scripts/execute_sql.js +++ b/skills/cloud-sql-postgres-data/scripts/execute_sql.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "execute_sql"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-data/scripts/list_indexes.js b/skills/cloud-sql-postgres-data/scripts/list_indexes.js index f1b166c..b64b34d 100755 --- a/skills/cloud-sql-postgres-data/scripts/list_indexes.js +++ b/skills/cloud-sql-postgres-data/scripts/list_indexes.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_indexes"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-data/scripts/list_schemas.js b/skills/cloud-sql-postgres-data/scripts/list_schemas.js index 3f56502..e7f358c 100755 --- a/skills/cloud-sql-postgres-data/scripts/list_schemas.js +++ b/skills/cloud-sql-postgres-data/scripts/list_schemas.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_schemas"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-data/scripts/list_sequences.js b/skills/cloud-sql-postgres-data/scripts/list_sequences.js index 42a90be..034c86f 100755 --- a/skills/cloud-sql-postgres-data/scripts/list_sequences.js +++ b/skills/cloud-sql-postgres-data/scripts/list_sequences.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_sequences"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-data/scripts/list_stored_procedure.js b/skills/cloud-sql-postgres-data/scripts/list_stored_procedure.js index e43c4e6..a148eaa 100755 --- a/skills/cloud-sql-postgres-data/scripts/list_stored_procedure.js +++ b/skills/cloud-sql-postgres-data/scripts/list_stored_procedure.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_stored_procedure"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-data/scripts/list_tables.js b/skills/cloud-sql-postgres-data/scripts/list_tables.js index b90c28e..5131cd8 100755 --- a/skills/cloud-sql-postgres-data/scripts/list_tables.js +++ b/skills/cloud-sql-postgres-data/scripts/list_tables.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_tables"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-data/scripts/list_triggers.js b/skills/cloud-sql-postgres-data/scripts/list_triggers.js index c1e7fff..ed8db23 100755 --- a/skills/cloud-sql-postgres-data/scripts/list_triggers.js +++ b/skills/cloud-sql-postgres-data/scripts/list_triggers.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_triggers"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-data/scripts/list_views.js b/skills/cloud-sql-postgres-data/scripts/list_views.js index 373d4f6..f79f460 100755 --- a/skills/cloud-sql-postgres-data/scripts/list_views.js +++ b/skills/cloud-sql-postgres-data/scripts/list_views.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_views"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-health/scripts/get_query_metrics.js b/skills/cloud-sql-postgres-health/scripts/get_query_metrics.js index 0fb6e93..bcffa4a 100755 --- a/skills/cloud-sql-postgres-health/scripts/get_query_metrics.js +++ b/skills/cloud-sql-postgres-health/scripts/get_query_metrics.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "get_query_metrics"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-health/scripts/get_query_plan.js b/skills/cloud-sql-postgres-health/scripts/get_query_plan.js index 122f3d0..3e6918e 100755 --- a/skills/cloud-sql-postgres-health/scripts/get_query_plan.js +++ b/skills/cloud-sql-postgres-health/scripts/get_query_plan.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "get_query_plan"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-health/scripts/get_system_metrics.js b/skills/cloud-sql-postgres-health/scripts/get_system_metrics.js index 8c759eb..7dd8663 100755 --- a/skills/cloud-sql-postgres-health/scripts/get_system_metrics.js +++ b/skills/cloud-sql-postgres-health/scripts/get_system_metrics.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "get_system_metrics"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-health/scripts/list_active_queries.js b/skills/cloud-sql-postgres-health/scripts/list_active_queries.js index ea548e1..a1e48b9 100755 --- a/skills/cloud-sql-postgres-health/scripts/list_active_queries.js +++ b/skills/cloud-sql-postgres-health/scripts/list_active_queries.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_active_queries"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-health/scripts/list_database_stats.js b/skills/cloud-sql-postgres-health/scripts/list_database_stats.js index 45f17de..612d61a 100755 --- a/skills/cloud-sql-postgres-health/scripts/list_database_stats.js +++ b/skills/cloud-sql-postgres-health/scripts/list_database_stats.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_database_stats"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-health/scripts/list_locks.js b/skills/cloud-sql-postgres-health/scripts/list_locks.js index 1a01686..160c17a 100755 --- a/skills/cloud-sql-postgres-health/scripts/list_locks.js +++ b/skills/cloud-sql-postgres-health/scripts/list_locks.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_locks"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-health/scripts/list_query_stats.js b/skills/cloud-sql-postgres-health/scripts/list_query_stats.js index 60184d6..74ae27f 100755 --- a/skills/cloud-sql-postgres-health/scripts/list_query_stats.js +++ b/skills/cloud-sql-postgres-health/scripts/list_query_stats.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_query_stats"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-health/scripts/long_running_transactions.js b/skills/cloud-sql-postgres-health/scripts/long_running_transactions.js index a7d976e..9d4c56b 100755 --- a/skills/cloud-sql-postgres-health/scripts/long_running_transactions.js +++ b/skills/cloud-sql-postgres-health/scripts/long_running_transactions.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "long_running_transactions"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-lifecycle/scripts/create_backup.js b/skills/cloud-sql-postgres-lifecycle/scripts/create_backup.js index 11eee7e..0339df3 100755 --- a/skills/cloud-sql-postgres-lifecycle/scripts/create_backup.js +++ b/skills/cloud-sql-postgres-lifecycle/scripts/create_backup.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "create_backup"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-lifecycle/scripts/database_overview.js b/skills/cloud-sql-postgres-lifecycle/scripts/database_overview.js index 960d20a..2ac7165 100755 --- a/skills/cloud-sql-postgres-lifecycle/scripts/database_overview.js +++ b/skills/cloud-sql-postgres-lifecycle/scripts/database_overview.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "database_overview"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-lifecycle/scripts/get_instance.js b/skills/cloud-sql-postgres-lifecycle/scripts/get_instance.js index 216e7e8..acd5037 100755 --- a/skills/cloud-sql-postgres-lifecycle/scripts/get_instance.js +++ b/skills/cloud-sql-postgres-lifecycle/scripts/get_instance.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "get_instance"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-lifecycle/scripts/list_instances.js b/skills/cloud-sql-postgres-lifecycle/scripts/list_instances.js index b24402c..66d0603 100755 --- a/skills/cloud-sql-postgres-lifecycle/scripts/list_instances.js +++ b/skills/cloud-sql-postgres-lifecycle/scripts/list_instances.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_instances"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-lifecycle/scripts/postgres_upgrade_precheck.js b/skills/cloud-sql-postgres-lifecycle/scripts/postgres_upgrade_precheck.js index 7b42cfd..1fc2395 100755 --- a/skills/cloud-sql-postgres-lifecycle/scripts/postgres_upgrade_precheck.js +++ b/skills/cloud-sql-postgres-lifecycle/scripts/postgres_upgrade_precheck.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "postgres_upgrade_precheck"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-lifecycle/scripts/restore_backup.js b/skills/cloud-sql-postgres-lifecycle/scripts/restore_backup.js index a6b2426..510ac4c 100755 --- a/skills/cloud-sql-postgres-lifecycle/scripts/restore_backup.js +++ b/skills/cloud-sql-postgres-lifecycle/scripts/restore_backup.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "restore_backup"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-lifecycle/scripts/wait_for_operation.js b/skills/cloud-sql-postgres-lifecycle/scripts/wait_for_operation.js index 3bd09d9..06aa8e1 100755 --- a/skills/cloud-sql-postgres-lifecycle/scripts/wait_for_operation.js +++ b/skills/cloud-sql-postgres-lifecycle/scripts/wait_for_operation.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "wait_for_operation"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-monitor/scripts/get_query_metrics.js b/skills/cloud-sql-postgres-monitor/scripts/get_query_metrics.js index 0fb6e93..bcffa4a 100755 --- a/skills/cloud-sql-postgres-monitor/scripts/get_query_metrics.js +++ b/skills/cloud-sql-postgres-monitor/scripts/get_query_metrics.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "get_query_metrics"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-monitor/scripts/get_query_plan.js b/skills/cloud-sql-postgres-monitor/scripts/get_query_plan.js index 122f3d0..3e6918e 100755 --- a/skills/cloud-sql-postgres-monitor/scripts/get_query_plan.js +++ b/skills/cloud-sql-postgres-monitor/scripts/get_query_plan.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "get_query_plan"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-monitor/scripts/get_system_metrics.js b/skills/cloud-sql-postgres-monitor/scripts/get_system_metrics.js index 8c759eb..7dd8663 100755 --- a/skills/cloud-sql-postgres-monitor/scripts/get_system_metrics.js +++ b/skills/cloud-sql-postgres-monitor/scripts/get_system_metrics.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "get_system_metrics"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-monitor/scripts/list_active_queries.js b/skills/cloud-sql-postgres-monitor/scripts/list_active_queries.js index ea548e1..a1e48b9 100755 --- a/skills/cloud-sql-postgres-monitor/scripts/list_active_queries.js +++ b/skills/cloud-sql-postgres-monitor/scripts/list_active_queries.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_active_queries"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-monitor/scripts/list_database_stats.js b/skills/cloud-sql-postgres-monitor/scripts/list_database_stats.js index 45f17de..612d61a 100755 --- a/skills/cloud-sql-postgres-monitor/scripts/list_database_stats.js +++ b/skills/cloud-sql-postgres-monitor/scripts/list_database_stats.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_database_stats"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-monitor/scripts/list_locks.js b/skills/cloud-sql-postgres-monitor/scripts/list_locks.js index 1a01686..160c17a 100755 --- a/skills/cloud-sql-postgres-monitor/scripts/list_locks.js +++ b/skills/cloud-sql-postgres-monitor/scripts/list_locks.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_locks"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-monitor/scripts/list_query_stats.js b/skills/cloud-sql-postgres-monitor/scripts/list_query_stats.js index 60184d6..74ae27f 100755 --- a/skills/cloud-sql-postgres-monitor/scripts/list_query_stats.js +++ b/skills/cloud-sql-postgres-monitor/scripts/list_query_stats.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_query_stats"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-monitor/scripts/long_running_transactions.js b/skills/cloud-sql-postgres-monitor/scripts/long_running_transactions.js index a7d976e..9d4c56b 100755 --- a/skills/cloud-sql-postgres-monitor/scripts/long_running_transactions.js +++ b/skills/cloud-sql-postgres-monitor/scripts/long_running_transactions.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "long_running_transactions"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-replication/scripts/database_overview.js b/skills/cloud-sql-postgres-replication/scripts/database_overview.js index 960d20a..2ac7165 100755 --- a/skills/cloud-sql-postgres-replication/scripts/database_overview.js +++ b/skills/cloud-sql-postgres-replication/scripts/database_overview.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "database_overview"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-replication/scripts/list_pg_settings.js b/skills/cloud-sql-postgres-replication/scripts/list_pg_settings.js index 0aa7bc5..6b2e5aa 100755 --- a/skills/cloud-sql-postgres-replication/scripts/list_pg_settings.js +++ b/skills/cloud-sql-postgres-replication/scripts/list_pg_settings.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_pg_settings"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-replication/scripts/list_publication_tables.js b/skills/cloud-sql-postgres-replication/scripts/list_publication_tables.js index 621844f..31267e1 100755 --- a/skills/cloud-sql-postgres-replication/scripts/list_publication_tables.js +++ b/skills/cloud-sql-postgres-replication/scripts/list_publication_tables.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_publication_tables"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-replication/scripts/list_replication_slots.js b/skills/cloud-sql-postgres-replication/scripts/list_replication_slots.js index 2be0c12..69c153e 100755 --- a/skills/cloud-sql-postgres-replication/scripts/list_replication_slots.js +++ b/skills/cloud-sql-postgres-replication/scripts/list_replication_slots.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_replication_slots"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-replication/scripts/list_roles.js b/skills/cloud-sql-postgres-replication/scripts/list_roles.js index 5c9c0d9..fedde92 100755 --- a/skills/cloud-sql-postgres-replication/scripts/list_roles.js +++ b/skills/cloud-sql-postgres-replication/scripts/list_roles.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_roles"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-replication/scripts/replication_stats.js b/skills/cloud-sql-postgres-replication/scripts/replication_stats.js index c8318f8..7c2b11d 100755 --- a/skills/cloud-sql-postgres-replication/scripts/replication_stats.js +++ b/skills/cloud-sql-postgres-replication/scripts/replication_stats.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "replication_stats"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-view-config/scripts/database_overview.js b/skills/cloud-sql-postgres-view-config/scripts/database_overview.js index 960d20a..2ac7165 100755 --- a/skills/cloud-sql-postgres-view-config/scripts/database_overview.js +++ b/skills/cloud-sql-postgres-view-config/scripts/database_overview.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "database_overview"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-view-config/scripts/get_instance.js b/skills/cloud-sql-postgres-view-config/scripts/get_instance.js index 216e7e8..acd5037 100755 --- a/skills/cloud-sql-postgres-view-config/scripts/get_instance.js +++ b/skills/cloud-sql-postgres-view-config/scripts/get_instance.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "get_instance"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-view-config/scripts/list_available_extensions.js b/skills/cloud-sql-postgres-view-config/scripts/list_available_extensions.js index fad9ca5..bb6c8a0 100755 --- a/skills/cloud-sql-postgres-view-config/scripts/list_available_extensions.js +++ b/skills/cloud-sql-postgres-view-config/scripts/list_available_extensions.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_available_extensions"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-view-config/scripts/list_installed_extensions.js b/skills/cloud-sql-postgres-view-config/scripts/list_installed_extensions.js index 5ef1047..3744145 100755 --- a/skills/cloud-sql-postgres-view-config/scripts/list_installed_extensions.js +++ b/skills/cloud-sql-postgres-view-config/scripts/list_installed_extensions.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_installed_extensions"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-view-config/scripts/list_memory_configurations.js b/skills/cloud-sql-postgres-view-config/scripts/list_memory_configurations.js index 9e5f7c1..a04fd3f 100755 --- a/skills/cloud-sql-postgres-view-config/scripts/list_memory_configurations.js +++ b/skills/cloud-sql-postgres-view-config/scripts/list_memory_configurations.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_memory_configurations"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main(); diff --git a/skills/cloud-sql-postgres-view-config/scripts/list_pg_settings.js b/skills/cloud-sql-postgres-view-config/scripts/list_pg_settings.js index 0aa7bc5..6b2e5aa 100755 --- a/skills/cloud-sql-postgres-view-config/scripts/list_pg_settings.js +++ b/skills/cloud-sql-postgres-view-config/scripts/list_pg_settings.js @@ -17,78 +17,89 @@ const { spawn, execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const toolName = "list_pg_settings"; const configArgs = ["--prebuilt", "cloud-sql-postgres"]; -function getToolboxPath() { - if (process.env.GEMINI_CLI === '1') { - const localPath = path.resolve(__dirname, '../../../toolbox'); - if (fs.existsSync(localPath)) { - return localPath; - } - } - try { - const checkCommand = process.platform === 'win32' ? 'where toolbox' : 'which toolbox'; - const globalPath = execSync(checkCommand, { stdio: 'pipe', encoding: 'utf-8' }).trim(); - if (globalPath) { - return globalPath.split('\n')[0].trim(); - } - throw new Error("Toolbox binary not found"); - } catch (e) { - throw new Error("Toolbox binary not found"); - } -} +const OPTIONAL_VARS_TO_OMIT_IF_EMPTY = [ + 'CLOUD_SQL_POSTGRES_USER', + 'CLOUD_SQL_POSTGRES_PASSWORD', + 'CLOUD_SQL_POSTGRES_IP_TYPE', +]; -let toolboxBinary; -try { - toolboxBinary = getToolboxPath(); -} catch (err) { - console.error("Error:", err.message); - process.exit(1); + +function mergeEnvVars(env) { + if (process.env.GEMINI_CLI === '1') { + const envPath = path.resolve(__dirname, '../../../.env'); + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf-8'); + envContent.split('\n').forEach(line => { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('#')) { + const splitIdx = trimmed.indexOf('='); + if (splitIdx !== -1) { + const key = trimmed.slice(0, splitIdx).trim(); + let value = trimmed.slice(splitIdx + 1).trim(); + value = value.replace(/(^['"]|['"]$)/g, ''); + if (env[key] === undefined) { + env[key] = value; + } + } + } + }); + } + } else if (process.env.CLAUDECODE === '1') { + const prefix = 'CLAUDE_PLUGIN_OPTION_'; + for (const key in process.env) { + if (key.startsWith(prefix)) { + env[key.substring(prefix.length)] = process.env[key]; + } + } + } } -function getEnv() { - const envPath = path.resolve(__dirname, '../../../.env'); - const env = { ...process.env }; - if (fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8'); - envContent.split('\n').forEach(line => { - const trimmed = line.trim(); - if (trimmed && !trimmed.startsWith('#')) { - const splitIdx = trimmed.indexOf('='); - if (splitIdx !== -1) { - const key = trimmed.slice(0, splitIdx).trim(); - let value = trimmed.slice(splitIdx + 1).trim(); - value = value.replace(/(^['"]|['"]$)/g, ''); - if (env[key] === undefined) { - env[key] = value; - } - } - } - }); +function prepareEnvironment() { + let env = { ...process.env }; + let userAgent = "skills"; + if (process.env.GEMINI_CLI === '1') { + userAgent = "skills-geminicli"; + } else if (process.env.CLAUDECODE === '1') { + userAgent = "skills-claudecode"; + } else if (process.env.CODEX_CI === '1') { + userAgent = "skills-codex"; } - return env; -} + mergeEnvVars(env); + + OPTIONAL_VARS_TO_OMIT_IF_EMPTY.forEach(varName => { + if (env[varName] === '') { + delete env[varName]; + } + }); + -let env = process.env; -let userAgent = "skills"; -if (process.env.GEMINI_CLI === '1') { - env = getEnv(); - userAgent = "skills-geminicli"; + return { env, userAgent }; } -const args = process.argv.slice(2); +function main() { + const { env, userAgent } = prepareEnvironment(); + const args = process.argv.slice(2); + + const command = os.platform() === 'win32' ? 'npx.cmd' : 'npx'; + const processedArgs = os.platform() === 'win32' ? args.map(arg => arg.includes('"') ? '"' + arg.replace(/"/g, '""') + '"' : arg) : args; + const npxArgs = ["--yes", "@toolbox-sdk/server@1.0.0", "--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...processedArgs]; -const toolboxArgs = ["--log-level", "error", ...configArgs, "invoke", toolName, "--user-agent-metadata", userAgent, ...args]; + const child = spawn(command, npxArgs, { shell: os.platform() === 'win32', stdio: 'inherit', env }); + -const child = spawn(toolboxBinary, toolboxArgs, { stdio: 'inherit', env }); + child.on('close', (code) => { + process.exit(code); + }); -child.on('close', (code) => { - process.exit(code); -}); + child.on('error', (err) => { + console.error("Error executing toolbox:", err); + process.exit(1); + }); +} -child.on('error', (err) => { - console.error("Error executing toolbox:", err); - process.exit(1); -}); +main();