gsheet-lvt 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +163 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +3140 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +276 -0
- package/dist/index.js +1246 -0
- package/dist/index.js.map +1 -0
- package/package.json +78 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/account/add.ts","../src/auth/oauth-flow.ts","../src/config/constants.ts","../src/utils/logger.ts","../src/auth/oauth-scopes.ts","../src/cli/define.ts","../src/config/config-manager.ts","../src/auth/token-refresh.ts","../src/utils/json.ts","../src/config/types.ts","../src/commands/account/list.ts","../src/commands/account/reauth.ts","../src/commands/account/remove.ts","../src/commands/account/select.ts","../src/commands/completion.ts","../src/cli/completion/shared.ts","../src/cli/completion/bash.ts","../src/cli/completion/fish.ts","../src/cli/completion/zsh.ts","../src/core/google-sheets.service.ts","../src/core/command-helpers.ts","../src/commands/sheet/data_operations/append.ts","../src/utils/cell.ts","../src/commands/sheet/data_operations/write.ts","../src/commands/sheet/import_export/export.ts","../src/utils/formatters.ts","../src/commands/sheet/import_export/import.ts","../src/utils/csv.ts","../src/commands/sheet/list.ts","../src/commands/sheet/read.ts","../src/utils/validators.ts","../src/commands/sheet/row_operations/add.ts","../src/commands/sheet/row_operations/remove.ts","../src/commands/sheet/sheet_operations/active.ts","../src/commands/sheet/sheet_operations/add.ts","../src/commands/sheet/sheet_operations/copy.ts","../src/commands/sheet/sheet_operations/remove.ts","../src/commands/sheet/sheet_operations/rename.ts","../src/commands/sheet/sheet_operations/select.ts","../src/utils/spreadsheet.ts","../src/commands/spreadsheet/active.ts","../src/commands/spreadsheet/add.ts","../src/core/google-drive.service.ts","../src/core/spreadsheet-title.ts","../src/commands/spreadsheet/list.ts","../src/commands/spreadsheet/remove.ts","../src/commands/spreadsheet/select.ts","../src/commands/update.ts","../src/cli/catalog.ts","../src/utils/error-handler.ts","../src/cli/register.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { realpathSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { basename } from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport type { Program as CaporalProgram } from '@caporal/core';\n\nimport { cliCommands } from './cli/catalog';\nimport { registerProgram } from './cli/register';\nimport { createCompletionCommand } from './commands/completion';\nimport { APP_INFO } from './config/constants';\n\nconst program = createProgram(getProgramBin());\n\nregisterProgram(program, cliCommands);\ncreateCompletionCommand(program);\n\ntry {\n await program.run(process.argv.slice(2).length === 0 ? ['--help'] : process.argv.slice(2));\n} catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.log(`error: ${message}`);\n process.exitCode = 1;\n}\n\nfunction createProgram(binName: string): CaporalProgram {\n return new (getProgramConstructor())()\n .bin(binName)\n .name(binName)\n .description('Google Sheets CLI - A tool to interact with Google Sheets')\n .version(APP_INFO.version)\n .disableGlobalOption('--no-color')\n .disableGlobalOption('--quiet')\n .disableGlobalOption('--silent')\n .disableGlobalOption('-v');\n}\n\nfunction getProgramConstructor() {\n const require = createRequire(import.meta.url);\n const module = require('@caporal/core') as {\n Program?: new () => CaporalProgram;\n default?: { Program?: new () => CaporalProgram };\n };\n const Program = module.Program ?? module.default?.Program;\n if (!Program) throw new Error('Caporal Program constructor not found');\n return Program;\n}\n\nfunction getProgramBin() {\n if (process.env.SHEET_CMD_PROG_NAME) return process.env.SHEET_CMD_PROG_NAME;\n if (isDirectRun() && process.argv[1]) return basename(process.argv[1]);\n return APP_INFO.name;\n}\n\nfunction isDirectRun() {\n if (!process.argv[1]) return false;\n\n try {\n return realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url));\n } catch {\n return import.meta.url === pathToFileURL(process.argv[1]).href;\n }\n}\n","import * as readline from 'readline';\nimport { performOAuthFlow } from '../../auth/oauth-flow';\nimport { defineSubCommand } from '../../cli/define';\nimport { ConfigManager } from '../../config/config-manager';\nimport { GOOGLE_CLOUD_CONSOLE_URLS } from '../../config/constants';\nimport { Logger } from '../../utils/logger';\n\nasync function promptInput(question: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nexport const addAccountCommand = defineSubCommand({\n name: 'add',\n description: 'Add a Google account via OAuth',\n errorMessage: 'Failed to add account',\n action: async () => {\n Logger.bold('='.repeat(70));\n Logger.bold(' GOOGLE CLOUD CONSOLE SETUP');\n Logger.bold('='.repeat(70));\n Logger.plain('');\n Logger.info('Follow these steps to get OAuth credentials:\\n');\n\n Logger.bold('STEP 1: Create or Select a Project');\n Logger.link(` ${GOOGLE_CLOUD_CONSOLE_URLS.CREDENTIALS}`);\n Logger.info(' - Go to Google Cloud Console');\n Logger.info(' - Create a new project OR select an existing one');\n Logger.info(' - Note: May require setting up billing (free tier available)');\n Logger.plain('');\n\n Logger.bold('STEP 2: Enable Required APIs');\n Logger.info(' a) Enable Google Sheets API:');\n Logger.link(` ${GOOGLE_CLOUD_CONSOLE_URLS.ENABLE_SHEETS_API}`);\n Logger.info(' b) Enable Google Drive API:');\n Logger.link(` ${GOOGLE_CLOUD_CONSOLE_URLS.ENABLE_DRIVE_API}`);\n Logger.plain('');\n\n Logger.bold('STEP 3: Configure OAuth Consent Screen');\n Logger.link(` ${GOOGLE_CLOUD_CONSOLE_URLS.CONSENT_SCREEN}`);\n Logger.info(' - User Type: External');\n Logger.info(' - App name: gsheet (or any name)');\n Logger.info(' - User support email: your email');\n Logger.info(' - Developer contact: your email');\n Logger.info(' - Click \"SAVE AND CONTINUE\"');\n Logger.plain('');\n\n Logger.bold('STEP 4: Add Scopes');\n Logger.link(` ${GOOGLE_CLOUD_CONSOLE_URLS.SCOPES}`);\n Logger.info(' - Click \"ADD OR REMOVE SCOPES\"');\n Logger.info(' - Search and add:');\n Logger.info(' → .../auth/spreadsheets');\n Logger.info(' → .../auth/drive.readonly');\n Logger.info(' → .../auth/userinfo.email');\n Logger.info(' - Click \"UPDATE\" then \"SAVE AND CONTINUE\"');\n Logger.plain('');\n\n Logger.bold('STEP 5: Add Test Users');\n Logger.link(` ${GOOGLE_CLOUD_CONSOLE_URLS.TEST_USERS}`);\n Logger.info(' - Click \"ADD USERS\"');\n Logger.info(' - Add your email address');\n Logger.info(' - Click \"SAVE AND CONTINUE\"');\n Logger.plain('');\n\n Logger.bold('STEP 6: Create OAuth 2.0 Client ID');\n Logger.link(` ${GOOGLE_CLOUD_CONSOLE_URLS.CREDENTIALS}`);\n Logger.info(' - Click \"CREATE CREDENTIALS\" → \"OAuth client ID\"');\n Logger.info(' - Application type: Desktop app');\n Logger.info(' - Name: gsheet');\n Logger.info(' - Click \"CREATE\"');\n Logger.info(' - Copy the Client ID and Client Secret');\n Logger.plain('');\n\n Logger.bold('='.repeat(70));\n Logger.plain('');\n\n const clientId = await promptInput('Enter OAuth Client ID: ');\n if (!clientId) {\n Logger.error('Client ID is required');\n process.exit(1);\n }\n\n const clientSecret = await promptInput('Enter OAuth Client Secret: ');\n if (!clientSecret) {\n Logger.error('Client Secret is required');\n process.exit(1);\n }\n\n Logger.info('\\nStarting OAuth authentication flow...');\n\n const result = await performOAuthFlow(clientId, clientSecret);\n\n const configManager = new ConfigManager();\n await configManager.addAccount(result.email, result.credentials);\n\n const accounts = configManager.getAllAccounts();\n if (accounts.length === 1) {\n configManager.setActiveAccount(result.email);\n Logger.success(`Account '${result.email}' added and set as active!`);\n } else {\n Logger.success(`Account '${result.email}' added successfully!`);\n Logger.info('Switch to this account: gsheet account select');\n }\n process.exit(0);\n }\n});\n","import { OAuth2Client } from 'google-auth-library';\nimport http from 'http';\nimport { GOOGLE_API_URLS, OAUTH_CONFIG, OAUTH_SCOPES } from '../config/constants';\nimport type { OAuthCredentials } from '../config/types';\nimport { Logger } from '../utils/logger';\nimport { assertRequiredOAuthScopes } from './oauth-scopes';\n\nexport interface OAuthFlowResult {\n email: string;\n credentials: OAuthCredentials;\n}\n\nexport interface OAuthFlowOptions {\n loginHint?: string;\n onAuthUrl?: (url: string) => void;\n}\n\nexport async function performOAuthFlow(\n clientId: string,\n clientSecret: string,\n options: OAuthFlowOptions = {}\n): Promise<OAuthFlowResult> {\n const port = await getRandomAvailablePort();\n const redirectUri = `http://${OAUTH_CONFIG.REDIRECT_HOST}:${port}${OAUTH_CONFIG.REDIRECT_PATH}`;\n\n const oauth2Client = new OAuth2Client(clientId, clientSecret, redirectUri);\n\n const authUrl = oauth2Client.generateAuthUrl({\n access_type: OAUTH_CONFIG.ACCESS_TYPE,\n scope: [OAUTH_SCOPES.SPREADSHEETS, OAUTH_SCOPES.DRIVE_READONLY, OAUTH_SCOPES.USERINFO_EMAIL],\n prompt: OAUTH_CONFIG.PROMPT,\n include_granted_scopes: true,\n login_hint: options.loginHint\n });\n\n if (options.onAuthUrl) {\n options.onAuthUrl(authUrl);\n } else {\n Logger.info('Opening browser for authentication...');\n Logger.info(`Visit: ${authUrl}`);\n }\n\n const authCode = await startCallbackServer(port);\n\n const { tokens } = await oauth2Client.getToken(authCode);\n oauth2Client.setCredentials(tokens);\n\n if (!tokens.access_token) {\n throw new Error('No access token received. Try re-authenticating.');\n }\n\n const tokenInfo = await oauth2Client.getTokenInfo(tokens.access_token);\n assertRequiredOAuthScopes(tokenInfo.scopes);\n\n const userInfo = await fetch(GOOGLE_API_URLS.USERINFO, {\n headers: { Authorization: `Bearer ${tokens.access_token}` }\n });\n const userData = (await userInfo.json()) as { email: string };\n\n if (!tokens.refresh_token) {\n throw new Error('No refresh token received. Try revoking app access and re-authenticating.');\n }\n\n return {\n email: userData.email,\n credentials: {\n client_id: clientId,\n client_secret: clientSecret,\n refresh_token: tokens.refresh_token,\n access_token: tokens.access_token ?? undefined,\n expiry_date: tokens.expiry_date ?? undefined\n }\n };\n}\n\nasync function getRandomAvailablePort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = http.createServer();\n server.listen(0, () => {\n const address = server.address();\n if (address && typeof address !== 'string') {\n const port = address.port;\n server.close(() => resolve(port));\n } else {\n reject(new Error('Failed to get port'));\n }\n });\n });\n}\n\nasync function startCallbackServer(port: number): Promise<string> {\n return new Promise((resolve, reject) => {\n const server = http.createServer((req, res) => {\n if (req.url?.startsWith(OAUTH_CONFIG.REDIRECT_PATH)) {\n const url = new URL(req.url, `http://${OAUTH_CONFIG.REDIRECT_HOST}:${port}`);\n const code = url.searchParams.get('code');\n\n if (code) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`\n <html>\n <body style=\"font-family: system-ui; text-align: center; padding: 50px;\">\n <h1 style=\"color: #10b981;\">Authentication Successful</h1>\n <p>You can close this window and return to the terminal.</p>\n </body>\n </html>\n `);\n\n server.close();\n resolve(code);\n } else {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(`\n <html>\n <body style=\"font-family: system-ui; text-align: center; padding: 50px;\">\n <h1 style=\"color: #ef4444;\">✗ Authentication Failed</h1>\n <p>No authorization code received.</p>\n </body>\n </html>\n `);\n server.close();\n reject(new Error('No authorization code received'));\n }\n }\n });\n\n server.listen(port, OAUTH_CONFIG.REDIRECT_HOST);\n });\n}\n","import { existsSync, readFileSync } from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst packageJsonPath = findPackageJsonPath(__dirname);\nconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\nexport const APP_INFO = {\n name: 'gsheet',\n packageName: packageJson.name,\n display_name: 'Google Sheets CLI',\n version: packageJson.version\n};\n\nenum SupportedOS {\n Linux = 'linux',\n Mac = 'mac',\n Windows = 'windows',\n Wsl = 'wsl'\n}\n\nconst configDirectoryByOS = {\n [SupportedOS.Linux]: (homeDir: string) => path.join(homeDir, '.config', APP_INFO.name),\n [SupportedOS.Wsl]: (homeDir: string) => path.join(homeDir, '.config', APP_INFO.name),\n [SupportedOS.Mac]: (homeDir: string) => path.join(homeDir, 'Library', 'Preferences', APP_INFO.name),\n [SupportedOS.Windows]: (homeDir: string) => path.join(homeDir, 'AppData', 'Roaming', APP_INFO.name)\n} as const satisfies Record<SupportedOS, (homeDir: string) => string>;\n\nexport function getUserOS(): SupportedOS {\n const platform = os.platform();\n\n if (platform === 'linux') {\n try {\n const release = os.release().toLowerCase();\n if (release.includes('microsoft') || release.includes('wsl')) {\n return SupportedOS.Wsl;\n }\n } catch {}\n return SupportedOS.Linux;\n }\n\n if (platform === 'darwin') return SupportedOS.Mac;\n if (platform === 'win32') return SupportedOS.Windows;\n\n throw new Error(`Unsupported OS: ${platform}`);\n}\n\nexport function getConfigDirectory(): string {\n const userOS = getUserOS();\n const homeDir = os.homedir();\n\n return configDirectoryByOS[userOS](homeDir);\n}\n\nexport const CONFIG_PATHS = {\n configDir: getConfigDirectory(),\n userMetadataFile: path.join(getConfigDirectory(), 'user_metadata.json'),\n defaultConfigFile: path.join(getConfigDirectory(), 'config.json')\n};\n\nexport const OAUTH_SCOPES = {\n SPREADSHEETS: 'https://www.googleapis.com/auth/spreadsheets',\n DRIVE_READONLY: 'https://www.googleapis.com/auth/drive.readonly',\n USERINFO_EMAIL: 'https://www.googleapis.com/auth/userinfo.email'\n};\n\nexport const GOOGLE_API_URLS = {\n USERINFO: 'https://www.googleapis.com/oauth2/v2/userinfo',\n SHEETS_CREATE: 'https://sheets.google.com'\n};\n\nexport const GOOGLE_CLOUD_CONSOLE_URLS = {\n CREDENTIALS: 'https://console.cloud.google.com/apis/credentials',\n CONSENT_SCREEN: 'https://console.cloud.google.com/apis/credentials/consent',\n SCOPES: 'https://console.cloud.google.com/auth/scopes',\n TEST_USERS: 'https://console.cloud.google.com/auth/audience',\n ENABLE_SHEETS_API: 'https://console.cloud.google.com/apis/library/sheets.googleapis.com',\n ENABLE_DRIVE_API: 'https://console.cloud.google.com/apis/library/drive.googleapis.com'\n};\n\nexport const OAUTH_CONFIG = {\n REDIRECT_HOST: '127.0.0.1',\n REDIRECT_PATH: '/callback',\n ACCESS_TYPE: 'offline' as const,\n PROMPT: 'consent' as const\n};\n\nexport const TOKEN_REFRESH_THRESHOLD_MS = 5 * 60 * 1000;\n\nfunction findPackageJsonPath(startDir: string): string {\n let currentDir = startDir;\n\n while (true) {\n const candidate = path.join(currentDir, 'package.json');\n\n if (existsSync(candidate)) {\n return candidate;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n throw new Error('Could not find package.json');\n }\n\n currentDir = parentDir;\n }\n}\n","import chalk from 'chalk';\n\nexport class Logger {\n static error(message: string, error?: unknown): void {\n if (error === undefined) {\n console.error(chalk.red(`❌ ${message}`));\n return;\n }\n\n const errorText = error instanceof Error ? error.message : 'Unknown error';\n console.error(chalk.red(`❌ ${message}: ${errorText}`));\n }\n\n static success(message: string): void {\n console.log(chalk.green(`✅ ${message}`));\n }\n\n static warning(message: string): void {\n console.log(chalk.yellow(`⚠️ ${message}`));\n }\n\n static info(message: string): void {\n console.log(`${message}`);\n }\n\n static dim(message: string): void {\n console.log(chalk.dim(message));\n }\n\n static plain(message: string): void {\n console.log(message);\n }\n\n static json(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n }\n\n static bold(message: string): void {\n console.log(chalk.bold(message));\n }\n\n static loading(message: string): void {\n console.log(`🔄 ${message}`);\n }\n\n static link(url: string, prefix?: string): void {\n const linkText = prefix ? `${prefix} ${url}` : url;\n console.log(chalk.dim(`🔗 ${linkText}`));\n }\n}\n","import { OAUTH_SCOPES } from '../config/constants';\n\nconst DRIVE_SCOPES = new Set([OAUTH_SCOPES.DRIVE_READONLY, 'https://www.googleapis.com/auth/drive']);\n\nconst REQUIRED_OAUTH_SCOPES = [OAUTH_SCOPES.SPREADSHEETS, OAUTH_SCOPES.DRIVE_READONLY] as const;\n\nfunction getMissingOAuthScopes(grantedScopes: string[]): string[] {\n return REQUIRED_OAUTH_SCOPES.filter((scope) => {\n if (scope === OAUTH_SCOPES.DRIVE_READONLY) {\n return !grantedScopes.some((grantedScope) => DRIVE_SCOPES.has(grantedScope));\n }\n\n return !grantedScopes.includes(scope);\n });\n}\n\nexport function assertRequiredOAuthScopes(grantedScopes: string[]): void {\n const missingScopes = getMissingOAuthScopes(grantedScopes);\n\n if (missingScopes.length === 0) {\n return;\n }\n\n throw new Error(\n [\n 'Google returned an access token without required scopes.',\n `Missing scopes: ${missingScopes.join(', ')}`,\n `Granted scopes: ${grantedScopes.length > 0 ? grantedScopes.join(', ') : 'none'}`,\n 'Fix: in Google Cloud Console, add the missing scopes to the OAuth consent screen, publish/save the consent screen, then run `gsheet account reauth` again.'\n ].join('\\n')\n );\n}\n","import {\n type CommandArgument,\n type CommandFlag,\n CommandFlagType,\n type ParentCommandDefinition,\n type SubCommandDefinition\n} from './types';\n\nexport function defineCommand<const Subcommands extends readonly SubCommandDefinition[]>(\n definition: Omit<ParentCommandDefinition<Subcommands>, 'kind'>\n): ParentCommandDefinition<Subcommands> {\n return { kind: 'command', ...definition };\n}\n\nexport function defineSubCommand<\n const Args extends readonly CommandArgument[],\n const Flags extends readonly CommandFlag[]\n>(definition: Omit<SubCommandDefinition<Args, Flags>, 'kind'>): SubCommandDefinition<Args, Flags> {\n return { kind: 'subcommand', ...definition };\n}\n\nexport const flag = {\n string<const Name extends string, const Required extends boolean | undefined = undefined>(\n name: Name,\n description: string,\n options?: { alias?: string; required?: Required }\n ): CommandFlag<Name, CommandFlagType.String, Required> {\n return { name, description, type: CommandFlagType.String, ...options };\n },\n\n boolean<const Name extends string, const Required extends boolean | undefined = undefined>(\n name: Name,\n description: string,\n options?: { alias?: string; required?: Required }\n ): CommandFlag<Name, CommandFlagType.Boolean, Required> {\n return { name, description, type: CommandFlagType.Boolean, ...options };\n }\n};\n\nexport const argument = {\n string<const Name extends string, const Required extends boolean | undefined = undefined>(\n name: Name,\n description: string,\n options?: { required?: Required }\n ): CommandArgument<Name, 'string', Required> {\n return { name, description, type: 'string', ...options };\n }\n};\n","import * as fs from 'fs';\nimport { OAuth2Client } from 'google-auth-library';\nimport { assertRequiredOAuthScopes } from '../auth/oauth-scopes';\nimport { refreshTokenIfNeeded } from '../auth/token-refresh';\nimport { readJson, writeJson } from '../utils/json';\nimport { CONFIG_PATHS } from './constants';\nimport type { Account, OAuthCredentials, SheetsConfig, SpreadsheetConfig, UserMetadata } from './types';\nimport { sheetsConfigSchema, userMetadataSchema } from './types';\n\nexport class ConfigManager {\n private userMetadata: UserMetadata | null = null;\n private config: SheetsConfig | null = null;\n\n constructor() {\n this.ensureConfigDirectory();\n this.initializeUserMetadata();\n }\n\n private ensureConfigDirectory(): void {\n if (!fs.existsSync(CONFIG_PATHS.configDir)) {\n fs.mkdirSync(CONFIG_PATHS.configDir, { recursive: true });\n }\n }\n\n private initializeUserMetadata(): void {\n if (!fs.existsSync(CONFIG_PATHS.userMetadataFile)) {\n this.createDefaultUserMetadata();\n }\n this.loadUserMetadata();\n }\n\n private createDefaultUserMetadata(): void {\n const defaultMetadata: UserMetadata = {\n config_path: CONFIG_PATHS.defaultConfigFile,\n accounts: {}\n };\n writeJson(CONFIG_PATHS.userMetadataFile, defaultMetadata);\n }\n\n private loadUserMetadata(): void {\n try {\n const data = readJson<UserMetadata>(CONFIG_PATHS.userMetadataFile);\n const validated = userMetadataSchema.parse(data);\n this.userMetadata = validated;\n } catch (error) {\n throw new Error(`Failed to load user metadata: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n private saveUserMetadata(): void {\n if (!this.userMetadata) {\n throw new Error('User metadata not loaded');\n }\n writeJson(CONFIG_PATHS.userMetadataFile, this.userMetadata);\n }\n\n private getConfigPath(): string {\n if (!this.userMetadata) {\n throw new Error('User metadata not loaded');\n }\n return this.userMetadata.config_path;\n }\n\n private loadConfig(): SheetsConfig {\n if (this.config) {\n return this.config;\n }\n\n const configPath = this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n this.createDefaultConfig();\n }\n\n try {\n const data = readJson<SheetsConfig>(configPath);\n const validated = sheetsConfigSchema.parse(data);\n this.config = validated;\n return this.config;\n } catch (error) {\n throw new Error(`Failed to load config: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n private createDefaultConfig(): void {\n const defaultConfig: SheetsConfig = {\n settings: {\n max_results: 50,\n default_columns: 'A:Z'\n }\n };\n\n const configPath = this.getConfigPath();\n writeJson(configPath, defaultConfig);\n }\n\n private saveConfig(): void {\n if (!this.config) {\n throw new Error('No config to save');\n }\n\n const configPath = this.getConfigPath();\n writeJson(configPath, this.config);\n }\n\n async addAccount(email: string, credentials: OAuthCredentials): Promise<void> {\n if (!this.userMetadata) {\n throw new Error('User metadata not loaded');\n }\n\n if (this.userMetadata.accounts[email]) {\n throw new Error(`Account '${email}' already exists`);\n }\n\n const account: Account = {\n email,\n oauth: credentials,\n spreadsheets: {}\n };\n\n this.userMetadata.accounts[email] = account;\n this.saveUserMetadata();\n }\n\n async removeAccount(email: string): Promise<void> {\n if (!this.userMetadata) {\n throw new Error('User metadata not loaded');\n }\n\n if (!this.userMetadata.accounts[email]) {\n throw new Error(`Account '${email}' not found`);\n }\n\n delete this.userMetadata.accounts[email];\n\n if (this.userMetadata.activeAccount === email) {\n this.userMetadata.activeAccount = undefined;\n }\n\n this.saveUserMetadata();\n }\n\n getAllAccounts(): Account[] {\n if (!this.userMetadata) {\n throw new Error('User metadata not loaded');\n }\n\n return Object.values(this.userMetadata.accounts);\n }\n\n getAccount(email: string): Account | null {\n if (!this.userMetadata) {\n throw new Error('User metadata not loaded');\n }\n\n return this.userMetadata.accounts[email] || null;\n }\n\n setActiveAccount(email: string): void {\n if (!this.userMetadata) {\n throw new Error('User metadata not loaded');\n }\n\n if (!this.userMetadata.accounts[email]) {\n throw new Error(`Account '${email}' not found`);\n }\n\n this.userMetadata.activeAccount = email;\n this.saveUserMetadata();\n }\n\n getActiveAccount(): Account | null {\n if (!this.userMetadata?.activeAccount) {\n return null;\n }\n\n return this.getAccount(this.userMetadata.activeAccount);\n }\n\n getActiveAccountEmail(): string | null {\n return this.userMetadata?.activeAccount || null;\n }\n\n async updateAccountCredentials(email: string, credentials: OAuthCredentials): Promise<void> {\n if (!this.userMetadata) {\n throw new Error('User metadata not loaded');\n }\n\n const account = this.userMetadata.accounts[email];\n if (!account) {\n throw new Error(`Account '${email}' not found`);\n }\n\n account.oauth = credentials;\n this.saveUserMetadata();\n }\n\n async getRefreshedCredentials(email: string): Promise<OAuthCredentials> {\n const account = this.getAccount(email);\n if (!account) {\n throw new Error(`Account '${email}' not found`);\n }\n\n const refreshedCredentials = await refreshTokenIfNeeded(account.oauth);\n await assertCredentialsHaveRequiredScopes(refreshedCredentials);\n\n if (refreshedCredentials !== account.oauth) {\n await this.updateAccountCredentials(email, refreshedCredentials);\n }\n\n return refreshedCredentials;\n }\n\n async addSpreadsheet(email: string, name: string, spreadsheetId: string): Promise<void> {\n if (!this.userMetadata) {\n throw new Error('User metadata not loaded');\n }\n\n const account = this.userMetadata.accounts[email];\n if (!account) {\n throw new Error(`Account '${email}' not found`);\n }\n\n if (account.spreadsheets[name]) {\n throw new Error(`Spreadsheet '${name}' already exists for account '${email}'`);\n }\n\n const spreadsheet: SpreadsheetConfig = {\n spreadsheet_id: spreadsheetId\n };\n\n account.spreadsheets[name] = spreadsheet;\n this.saveUserMetadata();\n }\n\n async removeSpreadsheet(email: string, name: string): Promise<void> {\n if (!this.userMetadata) {\n throw new Error('User metadata not loaded');\n }\n\n const account = this.userMetadata.accounts[email];\n if (!account) {\n throw new Error(`Account '${email}' not found`);\n }\n\n if (!account.spreadsheets[name]) {\n throw new Error(`Spreadsheet '${name}' not found for account '${email}'`);\n }\n\n delete account.spreadsheets[name];\n\n if (account.activeSpreadsheet === name) {\n account.activeSpreadsheet = undefined;\n }\n\n this.saveUserMetadata();\n }\n\n listSpreadsheets(email: string): Array<{ name: string; spreadsheetId: string; activeSheet?: string }> {\n if (!this.userMetadata) {\n throw new Error('User metadata not loaded');\n }\n\n const account = this.userMetadata.accounts[email];\n if (!account) {\n throw new Error(`Account '${email}' not found`);\n }\n\n return Object.entries(account.spreadsheets).map(([name, spreadsheet]) => ({\n name,\n spreadsheetId: spreadsheet.spreadsheet_id,\n activeSheet: spreadsheet.activeSheet\n }));\n }\n\n getSpreadsheet(email: string, name: string): SpreadsheetConfig | null {\n if (!this.userMetadata) {\n throw new Error('User metadata not loaded');\n }\n\n const account = this.userMetadata.accounts[email];\n if (!account) {\n return null;\n }\n\n return account.spreadsheets[name] || null;\n }\n\n getSpreadsheetById(email: string, id: string): SpreadsheetConfig | null {\n if (!this.userMetadata) {\n throw new Error('User metadata not loaded');\n }\n\n const account = this.userMetadata.accounts[email];\n if (!account) {\n return null;\n }\n\n return Object.values(account.spreadsheets).find((s) => s.spreadsheet_id === id) || null;\n }\n\n setActiveSpreadsheet(email: string, name: string): void {\n if (!this.userMetadata) {\n throw new Error('User metadata not loaded');\n }\n\n const account = this.userMetadata.accounts[email];\n if (!account) {\n throw new Error(`Account '${email}' not found`);\n }\n\n if (!account.spreadsheets[name]) {\n throw new Error(`Spreadsheet '${name}' not found for account '${email}'`);\n }\n\n account.activeSpreadsheet = name;\n this.saveUserMetadata();\n }\n\n getActiveSpreadsheet(email: string): SpreadsheetConfig | null {\n if (!this.userMetadata) {\n throw new Error('User metadata not loaded');\n }\n\n const account = this.userMetadata.accounts[email];\n if (!account || !account.activeSpreadsheet) {\n return null;\n }\n\n return account.spreadsheets[account.activeSpreadsheet] || null;\n }\n\n getActiveSpreadsheetName(email: string): string | null {\n if (!this.userMetadata) {\n throw new Error('User metadata not loaded');\n }\n\n const account = this.userMetadata.accounts[email];\n return account?.activeSpreadsheet || null;\n }\n\n setActiveSheet(email: string, spreadsheetName: string, sheetName: string): void {\n if (!this.userMetadata) {\n throw new Error('User metadata not loaded');\n }\n\n const account = this.userMetadata.accounts[email];\n if (!account) {\n throw new Error(`Account '${email}' not found`);\n }\n\n const spreadsheet = account.spreadsheets[spreadsheetName];\n if (!spreadsheet) {\n throw new Error(`Spreadsheet '${spreadsheetName}' not found for account '${email}'`);\n }\n\n spreadsheet.activeSheet = sheetName;\n this.saveUserMetadata();\n }\n\n getActiveSheetName(email: string, spreadsheetName: string): string | null {\n if (!this.userMetadata) {\n throw new Error('User metadata not loaded');\n }\n\n const account = this.userMetadata.accounts[email];\n if (!account) {\n return null;\n }\n\n const spreadsheet = account.spreadsheets[spreadsheetName];\n return spreadsheet?.activeSheet || null;\n }\n\n markCompletionInstalled(): void {\n const config = this.loadConfig();\n if (!config.settings) {\n config.settings = {\n max_results: 50,\n default_columns: 'A:Z'\n };\n }\n config.settings.completion_installed = true;\n this.saveConfig();\n }\n\n isCompletionInstalled(): boolean {\n const config = this.loadConfig();\n return config.settings?.completion_installed === true;\n }\n}\n\nasync function assertCredentialsHaveRequiredScopes(credentials: OAuthCredentials): Promise<void> {\n if (!credentials.access_token) {\n throw new Error('No access token available. Run `gsheet account reauth`.');\n }\n\n const oauth2Client = new OAuth2Client(credentials.client_id, credentials.client_secret);\n const tokenInfo = await oauth2Client.getTokenInfo(credentials.access_token);\n assertRequiredOAuthScopes(tokenInfo.scopes);\n}\n","import { OAuth2Client } from 'google-auth-library';\nimport { TOKEN_REFRESH_THRESHOLD_MS } from '../config/constants';\nimport type { OAuthCredentials } from '../config/types';\nimport { assertRequiredOAuthScopes } from './oauth-scopes';\n\nexport async function refreshTokenIfNeeded(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n const now = Date.now();\n const expiryDate = credentials.expiry_date || 0;\n\n if (now >= expiryDate - TOKEN_REFRESH_THRESHOLD_MS) {\n return await refreshToken(credentials);\n }\n\n return credentials;\n}\n\nexport async function refreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n const oauth2Client = new OAuth2Client(credentials.client_id, credentials.client_secret);\n\n oauth2Client.setCredentials({\n refresh_token: credentials.refresh_token\n });\n\n const { credentials: newTokens } = await oauth2Client.refreshAccessToken();\n const accessToken = newTokens.access_token || credentials.access_token;\n\n if (!accessToken) {\n throw new Error('No access token available after refresh. Run `gsheet account reauth`.');\n }\n\n const tokenInfo = await oauth2Client.getTokenInfo(accessToken);\n assertRequiredOAuthScopes(tokenInfo.scopes);\n\n return {\n client_id: credentials.client_id,\n client_secret: credentials.client_secret,\n refresh_token: credentials.refresh_token,\n access_token: accessToken,\n expiry_date: newTokens.expiry_date || credentials.expiry_date\n };\n}\n","import * as fs from 'fs';\n\nexport function readJson<T = Record<string, unknown>>(filePath: string): T {\n if (!fs.existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n try {\n const rawData = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(rawData) as T;\n } catch (error) {\n throw new Error(\n `Failed to parse JSON file: ${filePath}. Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n\nexport function writeJson<T>(filePath: string, data: T, pretty = true): void {\n try {\n const jsonString = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);\n fs.writeFileSync(filePath, jsonString, 'utf-8');\n } catch (error) {\n throw new Error(\n `Failed to write JSON file: ${filePath}. Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n","import { z } from 'zod';\n\nexport const oauthCredentialsSchema = z.object({\n client_id: z.string(),\n client_secret: z.string(),\n refresh_token: z.string(),\n access_token: z.string().optional(),\n expiry_date: z.number().optional()\n});\n\nexport const spreadsheetConfigSchema = z.object({\n spreadsheet_id: z.string(),\n activeSheet: z.string().optional()\n});\n\nexport const accountSchema = z.object({\n email: z.string(),\n oauth: oauthCredentialsSchema,\n activeSpreadsheet: z.string().optional(),\n spreadsheets: z.record(z.string(), spreadsheetConfigSchema)\n});\n\nexport const userMetadataSchema = z.object({\n config_path: z.string(),\n activeAccount: z.string().optional(),\n accounts: z.record(z.string(), accountSchema)\n});\n\nexport const sheetsConfigSchema = z.object({\n $schema: z.string().optional(),\n settings: z\n .object({\n max_results: z.number().default(50),\n default_columns: z.string().default('A:Z'),\n completion_installed: z.boolean().optional()\n })\n .optional()\n});\n\nexport const sheetDataSchema = z.object({\n title: z.string(),\n index: z.number()\n});\n\nexport type OAuthCredentials = z.infer<typeof oauthCredentialsSchema>;\nexport type SpreadsheetConfig = z.infer<typeof spreadsheetConfigSchema>;\nexport type Account = z.infer<typeof accountSchema>;\nexport type UserMetadata = z.infer<typeof userMetadataSchema>;\nexport type SheetsConfig = z.infer<typeof sheetsConfigSchema>;\nexport type SheetData = z.infer<typeof sheetDataSchema>;\n","import { defineSubCommand } from '../../cli/define';\nimport { ConfigManager } from '../../config/config-manager';\nimport { Logger } from '../../utils/logger';\n\nexport const listAccountsCommand = defineSubCommand({\n name: 'list',\n description: 'List all configured Google accounts',\n errorMessage: 'Failed to list accounts',\n action: () => {\n const configManager = new ConfigManager();\n const accounts = configManager.getAllAccounts();\n const activeAccountEmail = configManager.getActiveAccountEmail();\n\n if (accounts.length === 0) {\n Logger.info('No accounts configured.');\n Logger.info('Add one with: gsheet account add');\n return;\n }\n\n Logger.info('Configured accounts:');\n accounts.forEach((account) => {\n const isActive = account.email === activeAccountEmail;\n const spreadsheetCount = Object.keys(account.spreadsheets).length;\n const prefix = isActive ? '->' : ' ';\n Logger.info(`${prefix} ${account.email} (${spreadsheetCount} spreadsheet${spreadsheetCount !== 1 ? 's' : ''})`);\n });\n }\n});\n","import { performOAuthFlow } from '../../auth/oauth-flow';\nimport { defineSubCommand } from '../../cli/define';\nimport { ConfigManager } from '../../config/config-manager';\nimport { Logger } from '../../utils/logger';\n\nexport const reauthAccountCommand = defineSubCommand({\n name: 'reauth',\n description: 'Re-authenticate the active account',\n errorMessage: 'Failed to re-authenticate account',\n action: async () => {\n const configManager = new ConfigManager();\n const activeAccount = configManager.getActiveAccount();\n\n if (!activeAccount) {\n Logger.error('No active account set.');\n Logger.info('Use: gsheet account switch <email>');\n process.exit(1);\n }\n\n Logger.info(`Re-authenticating account: ${activeAccount.email}`);\n Logger.info('Opening browser for authentication...\\n');\n\n const result = await performOAuthFlow(activeAccount.oauth.client_id, activeAccount.oauth.client_secret, {\n loginHint: activeAccount.email\n });\n\n if (result.email !== activeAccount.email) {\n Logger.error(`Authentication email mismatch. Expected ${activeAccount.email}, got ${result.email}`);\n process.exit(1);\n }\n\n await configManager.updateAccountCredentials(result.email, result.credentials);\n Logger.success(`Account '${result.email}' re-authenticated successfully!`);\n process.exit(0);\n }\n});\n","import inquirer from 'inquirer';\nimport { argument, defineSubCommand } from '../../cli/define';\nimport { ConfigManager } from '../../config/config-manager';\nimport { Logger } from '../../utils/logger';\n\nexport const removeAccountCommand = defineSubCommand({\n name: 'remove',\n description: 'Remove a Google account',\n arguments: [argument.string('email', 'Account email to remove (optional - interactive if not provided)')],\n errorMessage: 'Failed to remove account',\n action: async ({ args }) => {\n const configManager = new ConfigManager();\n const accounts = configManager.getAllAccounts();\n\n if (accounts.length === 0) {\n Logger.warning('No accounts configured.');\n Logger.info('Use: gsheet account add');\n process.exit(0);\n }\n\n let selectedEmail = args.email;\n\n if (!selectedEmail) {\n const choices = accounts.map((acc) => ({\n name: acc.email,\n value: acc.email\n }));\n\n const answer = await inquirer.prompt([\n {\n type: 'list',\n name: 'email',\n message: 'Select account to remove:',\n choices\n }\n ]);\n\n selectedEmail = answer.email;\n }\n\n if (!selectedEmail) {\n Logger.error('No account selected');\n process.exit(1);\n }\n\n const account = configManager.getAccount(selectedEmail);\n if (!account) {\n Logger.error(`Account '${selectedEmail}' not found`);\n process.exit(1);\n }\n\n const spreadsheetCount = Object.keys(account.spreadsheets).length;\n if (spreadsheetCount > 0) {\n Logger.warning(\n `This will remove ${spreadsheetCount} spreadsheet${spreadsheetCount !== 1 ? 's' : ''} associated with this account.`\n );\n }\n\n const confirmation = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirmed',\n message: `Are you sure you want to remove account '${selectedEmail}'?`,\n default: false\n }\n ]);\n\n if (!confirmation.confirmed) {\n Logger.info('Removal cancelled');\n process.exit(0);\n }\n\n await configManager.removeAccount(selectedEmail);\n Logger.success(`Account '${selectedEmail}' removed successfully`);\n }\n});\n","import inquirer from 'inquirer';\nimport { argument, defineSubCommand } from '../../cli/define';\nimport { ConfigManager } from '../../config/config-manager';\nimport { Logger } from '../../utils/logger';\n\nexport const selectAccountCommand = defineSubCommand({\n name: 'select',\n description: 'Select active Google account',\n arguments: [argument.string('email', 'Account email to select (optional - interactive if not provided)')],\n errorMessage: 'Failed to select account',\n action: async ({ args }) => {\n const configManager = new ConfigManager();\n const accounts = configManager.getAllAccounts();\n\n if (accounts.length === 0) {\n Logger.warning('No accounts configured.');\n Logger.info('Use: gsheet account add');\n process.exit(0);\n }\n\n let selectedEmail = args.email;\n\n if (!selectedEmail) {\n const activeAccount = configManager.getActiveAccount();\n\n const choices = accounts.map((acc) => ({\n name: acc.email === activeAccount?.email ? `${acc.email} (current)` : acc.email,\n value: acc.email\n }));\n\n const answer = await inquirer.prompt([\n {\n type: 'list',\n name: 'email',\n message: 'Select account:',\n choices\n }\n ]);\n\n selectedEmail = answer.email;\n }\n\n if (!selectedEmail) {\n Logger.error('No account selected');\n process.exit(1);\n }\n\n configManager.setActiveAccount(selectedEmail);\n Logger.success(`Selected account: ${selectedEmail}`);\n }\n});\n","import { accessSync, constants, existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Program as CaporalProgram } from '@caporal/core';\nimport { getBashCompletionScript } from '../cli/completion/bash';\nimport { getFishCompletionScript } from '../cli/completion/fish';\nimport {\n type CompletionGroup,\n type CompletionOption,\n getCompletionBinNames,\n getOptionGroups,\n getRootCommands,\n getSubcommandGroups,\n isVisibleCompletionCommand\n} from '../cli/completion/shared';\nimport { getZshCompletionScript } from '../cli/completion/zsh';\nimport { defineCommand, defineSubCommand } from '../cli/define';\nimport { ConfigManager } from '../config/config-manager';\nimport { APP_INFO } from '../config/constants';\nimport { Logger } from '../utils/logger';\n\nenum CompletionShell {\n Bash = 'bash',\n Fish = 'fish',\n Zsh = 'zsh'\n}\n\nconst completionShells = [CompletionShell.Zsh, CompletionShell.Bash, CompletionShell.Fish] as const;\n\nexport const completionCommand = defineCommand({\n name: 'completion',\n description: 'Generate shell completion scripts',\n subcommands: completionShells.map((shell) =>\n defineSubCommand({\n name: shell,\n description: `Generate ${shell} completion script`,\n action: async () => {}\n })\n )\n});\n\nconst completionScriptGenerators = {\n [CompletionShell.Bash]: getBashCompletionScript,\n [CompletionShell.Fish]: getFishCompletionScript,\n [CompletionShell.Zsh]: getZshCompletionScript\n} as const satisfies Record<\n CompletionShell,\n (\n binNames: string[],\n roots: CompletionGroup[],\n subcommands: Map<string, CompletionGroup[]>,\n options: Map<string, CompletionOption[]>\n ) => string\n>;\n\nconst shellMatchers = [\n { shell: CompletionShell.Zsh, matches: (value: string) => value.includes(CompletionShell.Zsh) },\n { shell: CompletionShell.Bash, matches: (value: string) => value.includes(CompletionShell.Bash) },\n { shell: CompletionShell.Fish, matches: (value: string) => value.includes(CompletionShell.Fish) }\n] as const;\n\nconst silentCompletionInstallers = {\n [CompletionShell.Bash]: installBashCompletionSilent,\n [CompletionShell.Fish]: installFishCompletionSilent,\n [CompletionShell.Zsh]: async () => {\n await installZshCompletionSilent();\n await clearZshCompletionCache();\n }\n} as const satisfies Record<CompletionShell, () => Promise<void>>;\n\nlet completionProgram: CaporalProgram | undefined;\n\nexport function createCompletionCommand(program: CaporalProgram): void {\n completionProgram = program;\n\n program.command(completionCommand.name, completionCommand.description).action(async () => {\n Logger.info(`Available shells: ${completionShells.join(', ')}`);\n Logger.info(`Usage: ${APP_INFO.name} completion <shell>`);\n });\n\n for (const shellCommand of completionCommand.subcommands) {\n program\n .command(`${completionCommand.name} ${shellCommand.name}`, shellCommand.description)\n .action(async ({ program }) => {\n if (!isCompletionShell(shellCommand.name)) {\n throw new Error(`Unsupported shell: ${shellCommand.name}`);\n }\n console.log(await getCompletionScript(program, shellCommand.name));\n return 0;\n });\n }\n}\n\nfunction detectShell(): CompletionShell {\n const shell = process.env.SHELL || '';\n return shellMatchers.find((matcher) => matcher.matches(shell))?.shell ?? CompletionShell.Zsh;\n}\n\nexport async function reinstallCompletionSilently(): Promise<boolean> {\n const configManager = new ConfigManager();\n\n if (!configManager.isCompletionInstalled()) {\n return false;\n }\n\n const shell = detectShell();\n\n try {\n await silentCompletionInstallers[shell]();\n return true;\n } catch {\n return false;\n }\n}\n\nasync function installZshCompletionSilent(): Promise<void> {\n const homeDir = homedir();\n\n const possibleDirs = [\n join(homeDir, '.oh-my-zsh', 'completions'),\n join(homeDir, '.zsh', 'completions'),\n join(homeDir, '.config', 'zsh', 'completions'),\n join(homeDir, '.local', 'share', 'zsh', 'site-functions'),\n '/usr/local/share/zsh/site-functions'\n ];\n\n let targetDir: string | null = null;\n\n for (const dir of possibleDirs) {\n if (existsSync(dir)) {\n try {\n accessSync(dir, constants.W_OK);\n targetDir = dir;\n break;\n } catch {}\n }\n }\n\n if (!targetDir) {\n targetDir = join(homeDir, '.zsh', 'completions');\n mkdirSync(targetDir, { recursive: true });\n }\n\n const completionFile = join(targetDir, `_${APP_INFO.name}`);\n writeFileSync(completionFile, await getCurrentCompletionScript(CompletionShell.Zsh));\n}\n\nasync function installBashCompletionSilent(): Promise<void> {\n const homeDir = homedir();\n\n const possibleDirs = [\n join(homeDir, '.bash_completion.d'),\n join(homeDir, '.local', 'share', 'bash-completion', 'completions'),\n '/usr/local/etc/bash_completion.d',\n '/etc/bash_completion.d'\n ];\n\n let targetDir: string | null = null;\n\n for (const dir of possibleDirs) {\n if (existsSync(dir)) {\n try {\n accessSync(dir, constants.W_OK);\n targetDir = dir;\n break;\n } catch {}\n }\n }\n\n if (!targetDir) {\n targetDir = join(homeDir, '.bash_completion.d');\n mkdirSync(targetDir, { recursive: true });\n }\n\n const completionFile = join(targetDir, APP_INFO.name);\n writeFileSync(completionFile, await getCurrentCompletionScript(CompletionShell.Bash));\n}\n\nasync function installFishCompletionSilent(): Promise<void> {\n const homeDir = homedir();\n const targetDir = join(homeDir, '.config', 'fish', 'completions');\n mkdirSync(targetDir, { recursive: true });\n\n const completionFile = join(targetDir, `${APP_INFO.name}.fish`);\n writeFileSync(completionFile, await getCurrentCompletionScript(CompletionShell.Fish));\n}\n\nasync function clearZshCompletionCache(): Promise<void> {\n const homeDir = homedir();\n const zshCacheFile = join(homeDir, '.zcompdump');\n\n try {\n if (existsSync(zshCacheFile)) {\n const fs = await import('fs');\n fs.unlinkSync(zshCacheFile);\n }\n } catch {}\n}\n\nfunction isCompletionShell(value: string): value is CompletionShell {\n return (completionShells as readonly string[]).includes(value);\n}\n\nasync function getCurrentCompletionScript(shell: CompletionShell) {\n if (!completionProgram) {\n throw new Error('Completion program not initialized');\n }\n\n return getCompletionScript(completionProgram, shell);\n}\n\nasync function getCompletionScript(program: CaporalProgram, shell: CompletionShell) {\n const commands = (await program.getAllCommands()).filter(isVisibleCompletionCommand);\n const roots = getRootCommands(commands);\n const subcommands = getSubcommandGroups(commands);\n subcommands.set(\n completionCommand.name,\n completionShells.map((shell) => ({ name: shell, description: `Generate ${shell} completion` }))\n );\n const options = getOptionGroups(commands);\n return completionScriptGenerators[shell](getCompletionBinNames(program.getBin()), roots, subcommands, options);\n}\n","import type { Command } from '@caporal/core';\nimport { APP_INFO } from '../../config/constants';\n\nexport type CompletionGroup = {\n description?: string;\n name: string;\n};\n\nexport type CompletionOption = {\n description?: string;\n long?: string;\n names: string[];\n short?: string;\n};\n\nexport const globalOptions: CompletionOption[] = [\n { description: 'Show help', long: 'help', names: ['-h', '--help'], short: 'h' },\n { description: 'Show version', long: 'version', names: ['-V', '--version'], short: 'V' }\n];\n\nexport function isVisibleCompletionCommand(command: Command) {\n return command.visible;\n}\n\nexport function getCompletionBinNames(binName: string) {\n return [...new Set([binName, APP_INFO.name, 'gs'])];\n}\n\nexport function getRootCommands(commands: Command[]) {\n const roots = new Map<string, CompletionGroup>();\n\n for (const command of commands) {\n const parts = command.name.split(' ');\n const root = parts[0];\n if (!root || roots.has(root)) continue;\n\n roots.set(root, {\n name: root,\n description: command.description\n });\n }\n\n return [...roots.values()];\n}\n\nexport function getSubcommandGroups(commands: Command[]) {\n const groups = new Map<string, CompletionGroup[]>();\n\n for (const command of commands) {\n const [root, subcommand] = command.name.split(' ');\n if (!root || !subcommand) continue;\n\n const group = groups.get(root) ?? [];\n if (!group.some((item) => item.name === subcommand)) {\n group.push({ name: subcommand, description: command.description });\n }\n groups.set(root, group);\n }\n\n return groups;\n}\n\nexport function getOptionGroups(commands: Command[]) {\n const groups = new Map<string, CompletionOption[]>();\n\n for (const command of commands) {\n const options = command.options.filter((option) => option.visible);\n if (options.length === 0) continue;\n\n groups.set(\n command.name,\n options.map((option) => ({\n description: option.description,\n long: option.allNotations.find((notation) => notation.startsWith('--'))?.replace(/^--/, ''),\n names: option.allNotations,\n short: option.allNotations.find((notation) => /^-[^-]/.test(notation))?.replace(/^-/, '')\n }))\n );\n }\n\n return groups;\n}\n\nexport function commandKey(command: string) {\n return command.replace(/\\W+/g, '_');\n}\n\nexport function optionWords(items: CompletionOption[]) {\n return items.flatMap((item) => item.names).join(' ');\n}\n\nexport function getFunctionName(binName: string) {\n return `_${commandKey(binName)}_completion`;\n}\n","import { APP_INFO } from '../../config/constants';\nimport { type CompletionGroup, type CompletionOption, getFunctionName, globalOptions, optionWords } from './shared';\n\nexport function getBashCompletionScript(\n binNames: string[],\n roots: CompletionGroup[],\n subcommands: Map<string, CompletionGroup[]>,\n _options: Map<string, CompletionOption[]>\n) {\n const functionName = getFunctionName(binNames[0] ?? APP_INFO.name);\n return `${functionName}() {\n local cur root subcommand\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n root=\"\\${COMP_WORDS[1]}\"\n subcommand=\"\\${COMP_WORDS[2]}\"\n COMPREPLY=()\n\n if [[ \"$cur\" == -* ]]; then\n COMPREPLY=($(compgen -W \"${optionWords(globalOptions)}\" -- \"$cur\"))\n return\n fi\n\n case \"$COMP_CWORD\" in\n 1)\n COMPREPLY=($(compgen -W \"${roots.map((item) => item.name).join(' ')}\" -- \"$cur\"))\n ;;\n 2)\n case \"\\${COMP_WORDS[1]}\" in\n${formatBashSubcommandCases(subcommands)}\n esac\n ;;\n esac\n}\n\n${binNames.map((binName) => `complete -F ${functionName} ${binName}`).join('\\n')}`;\n}\n\nfunction formatBashSubcommandCases(groups: Map<string, CompletionGroup[]>) {\n return [...groups.entries()]\n .map(\n ([root, items]) => ` ${root})\n COMPREPLY=($(compgen -W \"${items.map((item) => item.name).join(' ')}\" -- \"$cur\"))\n ;;`\n )\n .join('\\n');\n}\n","import { type CompletionGroup, type CompletionOption, commandKey, globalOptions } from './shared';\n\nexport function getFishCompletionScript(\n binNames: string[],\n roots: CompletionGroup[],\n subcommands: Map<string, CompletionGroup[]>,\n options: Map<string, CompletionOption[]>\n) {\n return binNames.map((binName) => getFishCompletionForBin(binName, roots, subcommands, options)).join('\\n');\n}\n\nfunction getFishCompletionForBin(\n binName: string,\n roots: CompletionGroup[],\n subcommands: Map<string, CompletionGroup[]>,\n options: Map<string, CompletionOption[]>\n) {\n const rootNames = roots.map((item) => item.name).join(' ');\n return `function __${commandKey(binName)}_seen_command\n set -l tokens (commandline -opc)\n for token in $tokens[2..-1]\n switch $token\n case ${rootNames}\n return 0\n end\n end\n return 1\nend\n\nfunction __${commandKey(binName)}_using_command\n set -l tokens (commandline -opc)\n test (count $tokens) -ge 2; and test \"$tokens[2]\" = \"$argv[1]\"\nend\n\nfunction __${commandKey(binName)}_using_subcommand\n set -l tokens (commandline -opc)\n test (count $tokens) -ge 3; and test \"$tokens[2]\" = \"$argv[1]\"; and test \"$tokens[3]\" = \"$argv[2]\"\nend\n\ncomplete -c ${binName} -f\n${formatFishRootCompletions(binName, roots)}\n${formatFishSubcommandCompletions(binName, subcommands)}\n${formatFishOptionCompletions(binName, subcommands, options)}\n${formatFishGlobalOptionCompletions(binName)}`;\n}\n\nfunction formatFishRootCompletions(binName: string, roots: CompletionGroup[]) {\n return roots\n .map(\n (item) =>\n `complete -c ${binName} -f -n \"not __${commandKey(binName)}_seen_command\" -a ${quoteFish(item.name)} -d ${quoteFish(item.description ?? '')}`\n )\n .join('\\n');\n}\n\nfunction formatFishSubcommandCompletions(binName: string, groups: Map<string, CompletionGroup[]>) {\n return [...groups.entries()]\n .flatMap(([root, items]) =>\n items.map(\n (item) =>\n `complete -c ${binName} -f -n \"__${commandKey(binName)}_using_command ${quoteFish(root)}\" -a ${quoteFish(item.name)} -d ${quoteFish(item.description ?? '')}`\n )\n )\n .join('\\n');\n}\n\nfunction formatFishOptionCompletions(\n binName: string,\n subcommands: Map<string, CompletionGroup[]>,\n options: Map<string, CompletionOption[]>\n) {\n return [...options.entries()]\n .flatMap(([command, items]) => {\n const parts = command.split(' ');\n const condition =\n parts.length === 1\n ? `__${commandKey(binName)}_using_command ${quoteFish(parts[0] ?? '')}`\n : `__${commandKey(binName)}_using_subcommand ${quoteFish(parts[0] ?? '')} ${quoteFish(parts[1] ?? '')}`;\n if (parts.length > 1 && !(subcommands.get(parts[0] ?? '') ?? []).some((item) => item.name === parts[1])) {\n return [];\n }\n\n return items.map((item) => {\n const flags = [item.short ? `-s ${quoteFish(item.short)}` : '', item.long ? `-l ${quoteFish(item.long)}` : '']\n .filter(Boolean)\n .join(' ');\n return `complete -c ${binName} -f -n \"${condition}\" ${flags} -d ${quoteFish(item.description ?? '')}`;\n });\n })\n .join('\\n');\n}\n\nfunction formatFishGlobalOptionCompletions(binName: string) {\n return globalOptions\n .map((item) => {\n const flags = [item.short ? `-s ${quoteFish(item.short)}` : '', item.long ? `-l ${quoteFish(item.long)}` : '']\n .filter(Boolean)\n .join(' ');\n return `complete -c ${binName} -f ${flags} -d ${quoteFish(item.description ?? '')}`;\n })\n .join('\\n');\n}\n\nfunction quoteFish(value: string) {\n return `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`;\n}\n","import { APP_INFO } from '../../config/constants';\nimport { type CompletionGroup, type CompletionOption, commandKey, getFunctionName, globalOptions } from './shared';\n\nexport function getZshCompletionScript(\n binNames: string[],\n roots: CompletionGroup[],\n subcommands: Map<string, CompletionGroup[]>,\n options: Map<string, CompletionOption[]>\n) {\n const functionName = getFunctionName(binNames[0] ?? APP_INFO.name);\n return `#compdef ${binNames.join(' ')}\n\n${functionName}() {\n local -a commands\n commands=(\n${formatZshItems(roots)}\n )\n local -a global_options\n global_options=(\n${formatZshOptionItems(globalOptions)}\n )\n${formatSubcommandArrays(subcommands)}\n${formatZshOptionArrays(options)}\n\n if [[ \"$words[CURRENT]\" == -* ]]; then\n _describe '${binNames[0]} options' global_options\n return\n fi\n\n if (( CURRENT == 2 )); then\n _describe '${binNames[0]} commands' commands\n return\n fi\n\n case $words[2] in\n${formatZshCompletionCases(binNames[0] ?? APP_INFO.name, subcommands, options)}\n esac\n}\n\ncompdef ${functionName} ${binNames.join(' ')}`;\n}\n\nfunction formatZshItems(items: CompletionGroup[]) {\n return items.map((item) => ` '${escapeZshItem(item)}'`).join('\\n');\n}\n\nfunction formatZshOptionItems(items: CompletionOption[]) {\n return items\n .flatMap((item) =>\n item.names.map((name) => ({\n description: item.description,\n name\n }))\n )\n .map((item) => ` '${escapeZshItem(item)}'`)\n .join('\\n');\n}\n\nfunction formatSubcommandArrays(groups: Map<string, CompletionGroup[]>) {\n return [...groups.entries()]\n .map(\n ([root, items]) => `\n local -a ${commandKey(root)}_commands\n ${commandKey(root)}_commands=(\n${formatZshItems(items)}\n )`\n )\n .join('\\n');\n}\n\nfunction formatZshOptionArrays(groups: Map<string, CompletionOption[]>) {\n return [...groups.entries()]\n .map(\n ([command, items]) => `\n local -a ${commandKey(command)}_options\n ${commandKey(command)}_options=(\n${formatZshOptionItems(items)}\n )`\n )\n .join('\\n');\n}\n\nfunction formatZshCompletionCases(\n binName: string,\n subcommands: Map<string, CompletionGroup[]>,\n options: Map<string, CompletionOption[]>\n) {\n const rootCommands = new Set(\n [...subcommands.keys(), ...[...options.keys()].map((command) => command.split(' ')[0])].filter(\n (command): command is string => Boolean(command)\n )\n );\n\n return [...rootCommands]\n .map((root) => {\n const rootOptions = options.get(root);\n if (rootOptions) {\n return ` ${root})\n _describe '${binName} ${root} options' ${commandKey(root)}_options\n ;;`;\n }\n\n const subcommandCases = (subcommands.get(root) ?? [])\n .map((item) => {\n const key = `${root} ${item.name}`;\n if (!options.has(key)) return '';\n return ` ${item.name})\n _describe '${binName} ${root} ${item.name} options' ${commandKey(key)}_options\n ;;`;\n })\n .filter(Boolean)\n .join('\\n');\n\n return ` ${root})\n if (( CURRENT == 3 )) && [[ $words[CURRENT] != -* ]]; then\n _describe '${binName} ${root} commands' ${commandKey(root)}_commands\n return\n fi\n case $words[3] in\n${subcommandCases}\n esac\n ;;`;\n })\n .join('\\n');\n}\n\nfunction escapeZshItem(item: CompletionGroup) {\n const text = item.description ? `${item.name}:${item.description}` : item.name;\n return text.replace(/'/g, \"'\\\\''\");\n}\n","import { OAuth2Client } from 'google-auth-library';\nimport { GoogleSpreadsheet } from 'google-spreadsheet';\nimport type { OAuthCredentials } from '../config/types';\n\nexport interface GoogleSheetsConfig {\n spreadsheetId: string;\n oauthCredentials: OAuthCredentials;\n}\n\nexport class GoogleSheetsService {\n private doc: GoogleSpreadsheet | null = null;\n private auth: OAuth2Client;\n\n constructor(private config: GoogleSheetsConfig) {\n this.auth = new OAuth2Client(config.oauthCredentials.client_id, config.oauthCredentials.client_secret);\n\n this.auth.setCredentials({\n access_token: config.oauthCredentials.access_token,\n refresh_token: config.oauthCredentials.refresh_token,\n expiry_date: config.oauthCredentials.expiry_date\n });\n }\n\n private async ensureConnection(): Promise<void> {\n if (!this.doc) {\n this.doc = new GoogleSpreadsheet(this.config.spreadsheetId, this.auth);\n await this.doc.loadInfo();\n }\n }\n\n async getSheetInfo(): Promise<{\n title: string;\n sheets: Array<{ title: string; index: number; sheetId: number }>;\n }> {\n await this.ensureConnection();\n\n if (!this.doc) {\n throw new Error('Failed to connect to Google Sheets');\n }\n\n return {\n title: this.doc.title,\n sheets: this.doc.sheetsByIndex.map((sheet, index) => ({\n title: sheet.title,\n index,\n sheetId: sheet.sheetId\n }))\n };\n }\n\n async getSheetData(sheetName: string, includeFormulas = false): Promise<string[][]> {\n await this.ensureConnection();\n\n if (!this.doc) {\n throw new Error('Failed to connect to Google Sheets');\n }\n\n const sheet = this.doc.sheetsByTitle[sheetName];\n if (!sheet) {\n throw new Error(`Sheet '${sheetName}' not found`);\n }\n\n await sheet.loadCells();\n\n let lastRow = 0;\n let lastCol = 0;\n\n for (let row = 0; row < sheet.rowCount; row++) {\n for (let col = 0; col < sheet.columnCount; col++) {\n const cell = sheet.getCell(row, col);\n const value = includeFormulas && cell.formula ? cell.formula : (cell.formattedValue ?? '');\n\n if (value !== '') {\n lastRow = Math.max(lastRow, row);\n lastCol = Math.max(lastCol, col);\n }\n }\n }\n\n if (lastRow === 0 && lastCol === 0) {\n const firstCell = sheet.getCell(0, 0);\n const firstValue = includeFormulas && firstCell.formula ? firstCell.formula : (firstCell.formattedValue ?? '');\n\n if (firstValue === '') {\n return [];\n }\n }\n\n const data: string[][] = [];\n for (let row = 0; row <= lastRow; row++) {\n const rowData: string[] = [];\n for (let col = 0; col <= lastCol; col++) {\n const cell = sheet.getCell(row, col);\n const value = includeFormulas && cell.formula ? cell.formula : (cell.formattedValue ?? '');\n rowData.push(value);\n }\n data.push(rowData);\n }\n\n return data;\n }\n\n async addSheet(sheetName: string): Promise<void> {\n await this.ensureConnection();\n\n if (!this.doc) {\n throw new Error('Failed to connect to Google Sheets');\n }\n\n await this.doc.addSheet({ title: sheetName });\n }\n\n async removeSheet(sheetName: string): Promise<void> {\n await this.ensureConnection();\n\n if (!this.doc) {\n throw new Error('Failed to connect to Google Sheets');\n }\n\n const sheet = this.doc.sheetsByTitle[sheetName];\n if (!sheet) {\n throw new Error(`Sheet '${sheetName}' not found`);\n }\n\n await sheet.delete();\n }\n\n async renameSheet(oldName: string, newName: string): Promise<void> {\n await this.ensureConnection();\n\n if (!this.doc) {\n throw new Error('Failed to connect to Google Sheets');\n }\n\n const sheet = this.doc.sheetsByTitle[oldName];\n if (!sheet) {\n throw new Error(`Sheet '${oldName}' not found`);\n }\n\n await sheet.updateProperties({ title: newName });\n }\n\n async copySheet(sheetName: string, newSheetName: string): Promise<void> {\n await this.ensureConnection();\n\n if (!this.doc) {\n throw new Error('Failed to connect to Google Sheets');\n }\n\n const sheet = this.doc.sheetsByTitle[sheetName];\n if (!sheet) {\n throw new Error(`Sheet '${sheetName}' not found`);\n }\n\n await sheet.duplicate({ title: newSheetName });\n }\n\n async writeCell(sheetName: string, cell: string, value: string): Promise<void> {\n await this.ensureConnection();\n\n if (!this.doc) {\n throw new Error('Failed to connect to Google Sheets');\n }\n\n const sheet = this.doc.sheetsByTitle[sheetName];\n if (!sheet) {\n throw new Error(`Sheet '${sheetName}' not found`);\n }\n\n await sheet.loadCells(cell);\n const targetCell = sheet.getCellByA1(cell);\n targetCell.value = value;\n await sheet.saveUpdatedCells();\n }\n\n async writeCellRange(\n sheetName: string,\n range: string,\n values: (string | number)[][],\n noPreserve?: boolean\n ): Promise<void> {\n await this.ensureConnection();\n\n if (!this.doc) {\n throw new Error('Failed to connect to Google Sheets');\n }\n\n const sheet = this.doc.sheetsByTitle[sheetName];\n if (!sheet) {\n throw new Error(`Sheet '${sheetName}' not found`);\n }\n\n await sheet.loadCells(range);\n\n const [start, end] = range.split(':');\n const startCell = sheet.getCellByA1(start);\n const endCell = sheet.getCellByA1(end);\n\n let valueRowIndex = 0;\n for (let row = startCell.rowIndex; row <= endCell.rowIndex; row++) {\n let valueColIndex = 0;\n for (let col = startCell.columnIndex; col <= endCell.columnIndex; col++) {\n const cell = sheet.getCell(row, col);\n const cellWithRawData = cell as unknown as {\n _rawData?: { dataValidation?: unknown; userEnteredValue?: { formulaValue?: string } };\n };\n const hasDataValidation = cellWithRawData._rawData?.dataValidation !== undefined;\n const hasFormula = cellWithRawData._rawData?.userEnteredValue?.formulaValue !== undefined;\n const isCellEmpty = !cell.value || cell.value === '';\n\n if (values[valueRowIndex] && values[valueRowIndex][valueColIndex] !== undefined) {\n const newValue = values[valueRowIndex][valueColIndex];\n const isNewValueEmpty = newValue === '' || newValue === null;\n\n if (noPreserve) {\n cell.value = newValue;\n } else {\n if (!(hasDataValidation && isCellEmpty && isNewValueEmpty) && !hasFormula) {\n cell.value = newValue;\n }\n }\n }\n valueColIndex++;\n }\n valueRowIndex++;\n }\n\n await sheet.saveUpdatedCells();\n }\n\n async appendRow(sheetName: string, values: string[]): Promise<void> {\n await this.ensureConnection();\n\n if (!this.doc) {\n throw new Error('Failed to connect to Google Sheets');\n }\n\n const sheet = this.doc.sheetsByTitle[sheetName];\n if (!sheet) {\n throw new Error(`Sheet '${sheetName}' not found`);\n }\n\n await sheet.addRow(values);\n }\n\n async getSheetDataRange(sheetName: string, range: string, includeFormulas = false): Promise<string[][]> {\n await this.ensureConnection();\n\n if (!this.doc) {\n throw new Error('Failed to connect to Google Sheets');\n }\n\n const sheet = this.doc.sheetsByTitle[sheetName];\n if (!sheet) {\n throw new Error(`Sheet '${sheetName}' not found`);\n }\n\n await sheet.loadCells(range);\n\n const [start, end] = range.split(':');\n const startCell = sheet.getCellByA1(start);\n const endCell = sheet.getCellByA1(end);\n\n const data: string[][] = [];\n for (let row = startCell.rowIndex; row <= endCell.rowIndex; row++) {\n const rowData: string[] = [];\n for (let col = startCell.columnIndex; col <= endCell.columnIndex; col++) {\n const cell = sheet.getCell(row, col);\n const value = includeFormulas && cell.formula ? cell.formula : (cell.formattedValue ?? '');\n rowData.push(value);\n }\n data.push(rowData);\n }\n\n return data;\n }\n\n async insertRows(\n sheetName: string,\n range: { startIndex: number; endIndex: number },\n inheritFromBefore = false\n ): Promise<void> {\n await this.ensureConnection();\n\n if (!this.doc) {\n throw new Error('Failed to connect to Google Sheets');\n }\n\n const sheet = this.doc.sheetsByTitle[sheetName];\n if (!sheet) {\n throw new Error(`Sheet '${sheetName}' not found`);\n }\n\n await sheet.insertDimension('ROWS', range, inheritFromBefore);\n }\n\n async deleteRows(sheetName: string, range: { startIndex: number; endIndex: number }): Promise<void> {\n await this.ensureConnection();\n\n if (!this.doc) {\n throw new Error('Failed to connect to Google Sheets');\n }\n\n const sheet = this.doc.sheetsByTitle[sheetName];\n if (!sheet) {\n throw new Error(`Sheet '${sheetName}' not found`);\n }\n\n await sheet._makeSingleUpdateRequest('deleteDimension', {\n range: {\n sheetId: sheet.sheetId,\n dimension: 'ROWS',\n startIndex: range.startIndex,\n endIndex: range.endIndex\n }\n });\n }\n\n async getRowFormulas(sheetName: string, rowIndex: number): Promise<Map<number, string>> {\n await this.ensureConnection();\n\n if (!this.doc) {\n throw new Error('Failed to connect to Google Sheets');\n }\n\n const sheet = this.doc.sheetsByTitle[sheetName];\n if (!sheet) {\n throw new Error(`Sheet '${sheetName}' not found`);\n }\n\n await sheet.loadCells(`A${rowIndex + 1}:${rowIndex + 1}`);\n\n const formulas = new Map<number, string>();\n for (let col = 0; col < sheet.columnCount; col++) {\n const cell = sheet.getCell(rowIndex, col);\n if (cell.formula) {\n formulas.set(col, cell.formula);\n }\n }\n\n return formulas;\n }\n\n async copyRowFormulas(sheetName: string, sourceRowIndex: number, targetRowIndex: number): Promise<void> {\n await this.ensureConnection();\n\n if (!this.doc) {\n throw new Error('Failed to connect to Google Sheets');\n }\n\n const sheet = this.doc.sheetsByTitle[sheetName];\n if (!sheet) {\n throw new Error(`Sheet '${sheetName}' not found`);\n }\n\n const formulas = await this.getRowFormulas(sheetName, sourceRowIndex);\n\n if (formulas.size === 0) {\n return;\n }\n\n await sheet.loadCells(`A${targetRowIndex + 1}:${targetRowIndex + 1}`);\n\n const rowDiff = targetRowIndex - sourceRowIndex;\n\n for (const [col, formula] of formulas) {\n const cell = sheet.getCell(targetRowIndex, col);\n const adjustedFormula = this.adjustFormulaReferences(formula, rowDiff);\n cell.formula = adjustedFormula;\n }\n\n await sheet.saveUpdatedCells();\n }\n\n async copyRowFormulasBulk(\n sheetName: string,\n sourceRowIndex: number,\n startTargetRowIndex: number,\n count: number\n ): Promise<void> {\n await this.ensureConnection();\n\n if (!this.doc) {\n throw new Error('Failed to connect to Google Sheets');\n }\n\n const sheet = this.doc.sheetsByTitle[sheetName];\n if (!sheet) {\n throw new Error(`Sheet '${sheetName}' not found`);\n }\n\n const formulas = await this.getRowFormulas(sheetName, sourceRowIndex);\n\n if (formulas.size === 0) {\n return;\n }\n\n const endTargetRowIndex = startTargetRowIndex + count - 1;\n await sheet.loadCells(`A${startTargetRowIndex + 1}:${endTargetRowIndex + 1}`);\n\n for (let i = 0; i < count; i++) {\n const targetRowIndex = startTargetRowIndex + i;\n const rowDiff = targetRowIndex - sourceRowIndex;\n\n for (const [col, formula] of formulas) {\n const cell = sheet.getCell(targetRowIndex, col);\n const adjustedFormula = this.adjustFormulaReferences(formula, rowDiff);\n cell.formula = adjustedFormula;\n }\n }\n\n await sheet.saveUpdatedCells();\n }\n\n private adjustFormulaReferences(formula: string, rowDiff: number): string {\n return formula.replace(/([A-Z]+)(\\d+)/g, (_match, colLetter, rowNum) => {\n const newRow = parseInt(rowNum, 10) + rowDiff;\n return `${colLetter}${newRow}`;\n });\n }\n}\n","import { ConfigManager } from '../config/config-manager';\nimport { Logger } from '../utils/logger';\nimport { GoogleSheetsService } from './google-sheets.service';\n\nexport async function getGoogleSheetsService(): Promise<GoogleSheetsService> {\n const configManager = new ConfigManager();\n\n const activeAccount = configManager.getActiveAccount();\n if (!activeAccount) {\n Logger.error('No active account set.');\n Logger.info('Use: gsheet account add');\n process.exit(1);\n }\n\n const activeSpreadsheetName = configManager.getActiveSpreadsheetName(activeAccount.email);\n if (!activeSpreadsheetName) {\n Logger.error('No active spreadsheet set.');\n Logger.info('Use: gsheet spreadsheet select');\n process.exit(1);\n }\n\n const spreadsheet = configManager.getSpreadsheet(activeAccount.email, activeSpreadsheetName);\n\n if (!spreadsheet) {\n Logger.error(`Spreadsheet '${activeSpreadsheetName}' not found. Use \"gsheet spreadsheet add\" to add one.`);\n process.exit(1);\n }\n\n const refreshedCredentials = await configManager.getRefreshedCredentials(activeAccount.email);\n\n return new GoogleSheetsService({\n spreadsheetId: spreadsheet.spreadsheet_id,\n oauthCredentials: refreshedCredentials\n });\n}\n\nexport function getActiveSheetName(sheetName?: string): string {\n if (sheetName) {\n return sheetName;\n }\n\n const configManager = new ConfigManager();\n const activeAccount = configManager.getActiveAccount();\n\n if (!activeAccount) {\n Logger.error('No active account set.');\n Logger.info('Use: gsheet account add');\n process.exit(1);\n }\n\n const activeSpreadsheetName = configManager.getActiveSpreadsheetName(activeAccount.email);\n if (!activeSpreadsheetName) {\n Logger.error('No active spreadsheet set.');\n Logger.info('Use: gsheet spreadsheet select');\n process.exit(1);\n }\n\n const activeSheetName = configManager.getActiveSheetName(activeAccount.email, activeSpreadsheetName);\n if (!activeSheetName) {\n Logger.error('No active sheet set.');\n Logger.info('Use: gsheet sheet select');\n process.exit(1);\n }\n\n return activeSheetName;\n}\n","import { defineSubCommand, flag } from '../../../cli/define';\nimport { getActiveSheetName, getGoogleSheetsService } from '../../../core/command-helpers';\nimport { Logger } from '../../../utils/logger';\n\nexport const appendCommand = defineSubCommand({\n name: 'append',\n description: 'Append a new row to the end of the sheet',\n flags: [\n flag.string('--name', 'Tab name (uses active if not provided)', { alias: '-n' }),\n flag.string('--value', 'Values to append (comma-separated)', { alias: '-v', required: true })\n ],\n errorMessage: 'Failed to append row',\n action: async ({ options }) => {\n const sheetsService = await getGoogleSheetsService();\n const sheetName = getActiveSheetName(options.name);\n\n const values = options.value.split(',').map((v) => v.trim());\n\n Logger.loading(`Appending row to '${sheetName}'...`);\n await sheetsService.appendRow(sheetName, values);\n\n Logger.success(`Row appended to '${sheetName}' successfully`);\n }\n});\n","export function columnLetterToNumber(colLetter: string): number {\n let result = 0;\n const letters = colLetter.toUpperCase();\n\n for (let i = 0; i < letters.length; i++) {\n result = result * 26 + (letters.charCodeAt(i) - 64);\n }\n\n return result - 1;\n}\n","import { defineSubCommand, flag } from '../../../cli/define';\nimport { getActiveSheetName, getGoogleSheetsService } from '../../../core/command-helpers';\nimport { columnLetterToNumber } from '../../../utils/cell';\nimport { Logger } from '../../../utils/logger';\n\nexport const writeCommand = defineSubCommand({\n name: 'write',\n description: 'Write to a specific cell or range of cells',\n flags: [\n flag.string('--name', 'Tab name (uses active if not provided)', { alias: '-n' }),\n flag.string('--cell', 'Cell address (e.g., A1) - required if --range not provided', { alias: '-c' }),\n flag.string('--range', 'Range (e.g., A1:B2) - required if --cell not provided', { alias: '-r' }),\n flag.string('--value', 'Value to write (use , for columns, ; for rows)', { alias: '-v', required: true }),\n flag.boolean('--no-preserve', 'Overwrite cells with formulas or data validation')\n ],\n errorMessage: 'Failed to write to sheet',\n action: async ({ options }) => {\n if (!options.cell && !options.range) {\n Logger.error('Either --cell or --range must be specified');\n process.exit(1);\n }\n\n if (options.cell && options.range) {\n Logger.error('Cannot use both --cell and --range at the same time');\n process.exit(1);\n }\n\n const sheetsService = await getGoogleSheetsService();\n const sheetName = getActiveSheetName(options.name);\n\n if (options.cell) {\n Logger.loading(`Writing to cell ${options.cell}...`);\n await sheetsService.writeCell(sheetName, options.cell, options.value);\n Logger.success(`Cell ${options.cell} updated successfully`);\n } else if (options.range) {\n let values: (string | number)[][];\n\n if (options.value.trim().startsWith('[')) {\n try {\n values = JSON.parse(options.value);\n if (!Array.isArray(values) || !Array.isArray(values[0])) {\n throw new Error('Value must be a 2D array');\n }\n } catch (_error) {\n Logger.error('Invalid JSON array format. Expected 2D array like [[\"a\",\"b\"],[\"c\",\"d\"]]');\n process.exit(1);\n }\n } else {\n const rows = options.value.split(';').map((row) => row.trim());\n values = rows.map((row) =>\n row.split(',').map((cell) => {\n const trimmed = cell.trim();\n const numericValue = trimmed.replace(',', '.');\n if (!Number.isNaN(Number(numericValue)) && numericValue !== '') {\n return Number(numericValue);\n }\n return trimmed;\n })\n );\n }\n\n const rangeParts = options.range.split(':');\n if (rangeParts.length === 2) {\n const [startCell, endCell] = rangeParts;\n\n const startMatch = startCell.match(/^([A-Z]+)(\\d+)$/);\n const endMatch = endCell.match(/^([A-Z]+)(\\d+)$/);\n\n if (startMatch && endMatch) {\n const startRow = parseInt(startMatch[2], 10);\n const endRow = parseInt(endMatch[2], 10);\n const startCol = startMatch[1];\n const endCol = endMatch[1];\n\n const expectedRows = endRow - startRow + 1;\n const expectedCols = columnLetterToNumber(endCol) - columnLetterToNumber(startCol) + 1;\n\n const actualRows = values.length;\n const actualCols = Math.max(...values.map((row) => row.length));\n\n if (actualRows !== expectedRows || actualCols !== expectedCols) {\n Logger.error(\n `Dimension mismatch: Range ${options.range} expects ${expectedRows}x${expectedCols} ` +\n `but got ${actualRows}x${actualCols} values`\n );\n Logger.info(`Tip: Provide ${expectedRows} rows with ${expectedCols} columns each`);\n process.exit(1);\n }\n }\n }\n\n // Caporal converts --no-preserve to preserve: false.\n const noPreserve = options.preserve === false;\n Logger.loading(`Writing to range ${options.range}...`);\n await sheetsService.writeCellRange(sheetName, options.range, values, noPreserve);\n Logger.success(`Range ${options.range} updated successfully`);\n }\n }\n});\n","import { writeFileSync } from 'fs';\nimport { defineSubCommand, flag } from '../../../cli/define';\nimport { getActiveSheetName, getGoogleSheetsService } from '../../../core/command-helpers';\nimport { formatAsCSV, formatAsJSON } from '../../../utils/formatters';\nimport { Logger } from '../../../utils/logger';\n\nenum ExportFormat {\n Csv = 'csv',\n Json = 'json'\n}\n\nconst exportFormats = Object.values(ExportFormat);\n\nconst exportFormatters = {\n [ExportFormat.Csv]: formatAsCSV,\n [ExportFormat.Json]: formatAsJSON\n} as const satisfies Record<ExportFormat, (data: string[][]) => string>;\n\nexport const exportCommand = defineSubCommand({\n name: 'export',\n description: 'Export sheet data to JSON or CSV format',\n flags: [\n flag.string('--name', 'Tab name (uses active if not provided)', { alias: '-n' }),\n flag.string('--range', 'Range to export (optional)', { alias: '-r' }),\n flag.string('--format', 'Export format', { alias: '-f', required: true }),\n flag.string('--output', 'Output file path', { alias: '-o' })\n ],\n errorMessage: 'Failed to export data',\n action: async ({ options }) => {\n if (!isExportFormat(options.format)) {\n Logger.error(`Invalid format '${options.format}'. Valid formats: ${exportFormats.join(', ')}`);\n process.exit(1);\n }\n\n const sheetsService = await getGoogleSheetsService();\n const sheetName = getActiveSheetName(options.name);\n\n Logger.loading(`Exporting data from '${sheetName}'${options.range ? ` (range: ${options.range})` : ''}...`);\n\n let data: string[][];\n if (options.range) {\n data = await sheetsService.getSheetDataRange(sheetName, options.range);\n } else {\n data = await sheetsService.getSheetData(sheetName);\n }\n\n if (data.length === 0) {\n Logger.warning('No data to export');\n process.exit(0);\n }\n\n const output = exportFormatters[options.format](data);\n\n if (options.output) {\n writeFileSync(options.output, output, 'utf-8');\n Logger.success(`Data exported to ${options.output}`);\n } else {\n Logger.success('Exported data:\\n');\n Logger.plain(output);\n }\n }\n});\n\nfunction isExportFormat(value: string): value is ExportFormat {\n return (exportFormats as readonly string[]).includes(value);\n}\n","export function formatAsMarkdown(data: string[][]): string {\n if (data.length === 0) return '';\n\n const [headers, ...rows] = data;\n const colWidths = headers.map((_, colIndex) => Math.max(...data.map((row) => (row[colIndex] || '').length)));\n\n const separator = `| ${colWidths.map((w) => '-'.repeat(w)).join(' | ')} |`;\n const formatRow = (row: string[]) => `| ${row.map((cell, i) => (cell || '').padEnd(colWidths[i])).join(' | ')} |`;\n\n return [formatRow(headers), separator, ...rows.map(formatRow)].join('\\n');\n}\n\nexport function formatAsCSV(data: string[][]): string {\n return data\n .map((row) =>\n row\n .map((cell) => {\n const value = cell || '';\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n })\n .join(',')\n )\n .join('\\n');\n}\n\nexport function formatAsJSON(data: string[][]): string {\n if (data.length === 0) return '[]';\n\n const [headers, ...rows] = data;\n\n const jsonData = rows.map((row) => {\n const obj: Record<string, string> = {};\n headers.forEach((header, index) => {\n obj[header] = row[index] || '';\n });\n return obj;\n });\n\n return JSON.stringify(jsonData, null, 2);\n}\n","import { readFileSync } from 'fs';\nimport { defineSubCommand, flag } from '../../../cli/define';\nimport { getActiveSheetName, getGoogleSheetsService } from '../../../core/command-helpers';\nimport { parseCSV } from '../../../utils/csv';\nimport { Logger } from '../../../utils/logger';\n\nexport const importCommand = defineSubCommand({\n name: 'import',\n description: 'Import CSV file to a sheet',\n flags: [\n flag.string('--name', 'Tab name (uses active if not provided)', { alias: '-n' }),\n flag.string('--file', 'CSV file path', { alias: '-f', required: true }),\n flag.boolean('--skip-header', 'Skip header row when importing')\n ],\n errorMessage: 'Failed to import data',\n action: async ({ options }) => {\n const sheetsService = await getGoogleSheetsService();\n const sheetName = getActiveSheetName(options.name);\n\n Logger.loading(`Reading CSV file '${options.file}'...`);\n const csvContent = readFileSync(options.file, 'utf-8');\n const data = parseCSV(csvContent);\n\n if (data.length === 0) {\n Logger.warning('CSV file is empty');\n process.exit(0);\n }\n\n const dataToImport = options.skipHeader ? data.slice(1) : data;\n\n if (dataToImport.length === 0) {\n Logger.warning('No data to import after skipping header');\n process.exit(0);\n }\n\n Logger.loading(`Importing ${dataToImport.length} rows to '${sheetName}'...`);\n\n if (options.skipHeader) {\n if (dataToImport.length > 0) {\n const firstRowRange = `A1:${String.fromCharCode(65 + dataToImport[0].length - 1)}1`;\n await sheetsService.writeCellRange(sheetName, firstRowRange, [dataToImport[0]]);\n\n for (let i = 1; i < dataToImport.length; i++) {\n await sheetsService.appendRow(sheetName, dataToImport[i]);\n if ((i + 1) % 10 === 0) {\n Logger.loading(`Imported ${i + 1}/${dataToImport.length} rows...`);\n }\n }\n }\n } else {\n if (data.length > 0) {\n const headerRange = `A1:${String.fromCharCode(65 + data[0].length - 1)}1`;\n await sheetsService.writeCellRange(sheetName, headerRange, [data[0]]);\n\n for (let i = 1; i < data.length; i++) {\n await sheetsService.appendRow(sheetName, data[i]);\n if ((i + 1) % 10 === 0) {\n Logger.loading(`Imported ${i + 1}/${data.length} rows...`);\n }\n }\n }\n }\n\n Logger.success(`Successfully imported ${dataToImport.length} rows to '${sheetName}'`);\n }\n});\n","export function parseCSV(content: string): string[][] {\n const lines = content.split('\\n').filter((line) => line.trim() !== '');\n const result: string[][] = [];\n\n for (const line of lines) {\n const row: string[] = [];\n let current = '';\n let inQuotes = false;\n\n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n\n if (char === '\"') {\n if (inQuotes && line[i + 1] === '\"') {\n current += '\"';\n i++;\n } else {\n inQuotes = !inQuotes;\n }\n } else if (char === ',' && !inQuotes) {\n row.push(current.trim());\n current = '';\n } else {\n current += char;\n }\n }\n\n row.push(current.trim());\n result.push(row);\n }\n\n return result;\n}\n","import { defineSubCommand, flag } from '../../cli/define';\nimport { getGoogleSheetsService } from '../../core/command-helpers';\nimport { Logger } from '../../utils/logger';\n\nexport const listCommand = defineSubCommand({\n name: 'list',\n description: 'List all sheets in a spreadsheet',\n flags: [flag.string('--output', 'Output format', { alias: '-o' })],\n errorMessage: 'Failed to list sheets',\n action: async ({ options }) => {\n const sheetsService = await getGoogleSheetsService();\n\n if (options.output !== 'json') {\n Logger.loading('Fetching spreadsheet info...');\n }\n const info = await sheetsService.getSheetInfo();\n\n if (options.output === 'json') {\n Logger.json(info);\n return;\n }\n\n Logger.success(`Connected to spreadsheet: ${info.title}`);\n Logger.bold(`\\n📋 Sheets (${info.sheets.length}):\\n`);\n\n info.sheets.forEach((sheet) => {\n Logger.plain(` ${sheet.index + 1}. ${sheet.title}`);\n Logger.dim(` ID: ${sheet.sheetId}`);\n });\n }\n});\n","import { writeFileSync } from 'fs';\nimport { defineSubCommand, flag } from '../../cli/define';\nimport { getActiveSheetName, getGoogleSheetsService } from '../../core/command-helpers';\nimport { formatAsCSV, formatAsJSON, formatAsMarkdown } from '../../utils/formatters';\nimport { Logger } from '../../utils/logger';\n\nenum OutputFormat {\n Csv = 'csv',\n Json = 'json',\n Markdown = 'markdown'\n}\n\nconst outputFormats = Object.values(OutputFormat);\n\nconst outputFormatters = {\n [OutputFormat.Csv]: formatAsCSV,\n [OutputFormat.Json]: formatAsJSON,\n [OutputFormat.Markdown]: formatAsMarkdown\n} as const satisfies Record<OutputFormat, (data: string[][]) => string>;\n\nexport const readCommand = defineSubCommand({\n name: 'read',\n description: 'Read the complete content of a sheet',\n flags: [\n flag.string('--name', 'Tab name (uses active if not provided)', { alias: '-n' }),\n flag.string('--output', 'Output format', { alias: '-o' }),\n flag.boolean('--formulas', 'Include formulas instead of values', { alias: '-f' }),\n flag.string('--export', 'Export to file', { alias: '-e' }),\n flag.string('--range', 'Range to read (e.g., A1:B10)', { alias: '-r' })\n ],\n errorMessage: 'Failed to read sheet',\n action: async ({ options }) => {\n const outputFormat = options.output ?? OutputFormat.Markdown;\n if (!isOutputFormat(outputFormat)) {\n Logger.error(`Invalid output format '${outputFormat}'. Valid formats: ${outputFormats.join(', ')}`);\n process.exit(1);\n }\n\n const sheetsService = await getGoogleSheetsService();\n const sheetName = getActiveSheetName(options.name);\n\n if (outputFormat !== OutputFormat.Json || options.export) {\n Logger.loading(`Reading sheet '${sheetName}'...`);\n }\n const includeFormulas = options.formulas ?? false;\n const data = options.range\n ? await sheetsService.getSheetDataRange(sheetName, options.range, includeFormulas)\n : await sheetsService.getSheetData(sheetName, includeFormulas);\n\n if (data.length === 0) {\n Logger.warning('Sheet is empty');\n process.exit(0);\n }\n\n const output = outputFormatters[outputFormat](data);\n\n if (options.export) {\n writeFileSync(options.export, output, 'utf-8');\n Logger.success(`Content exported to ${options.export}`);\n } else if (outputFormat === OutputFormat.Json) {\n Logger.plain(output);\n } else {\n Logger.success(`Content of sheet '${sheetName}':\\n`);\n Logger.plain(output);\n }\n }\n});\n\nfunction isOutputFormat(value: string): value is OutputFormat {\n return (outputFormats as readonly string[]).includes(value);\n}\n","export function validatePositiveInteger(value: string, fieldName: string): number {\n const num = parseInt(value, 10);\n if (Number.isNaN(num) || num < 1) {\n throw new Error(`${fieldName} must be a positive integer`);\n }\n return num;\n}\n\nexport function validateRequired(value: string | undefined, fieldName: string): string {\n if (!value || !value.trim()) {\n throw new Error(`${fieldName} is required`);\n }\n return value.trim();\n}\n","import { defineSubCommand, flag } from '../../../cli/define';\nimport { getActiveSheetName, getGoogleSheetsService } from '../../../core/command-helpers';\nimport { Logger } from '../../../utils/logger';\nimport { validatePositiveInteger, validateRequired } from '../../../utils/validators';\n\nexport const rowAddCommand = defineSubCommand({\n name: 'row-add',\n description: 'Add a row to the sheet',\n flags: [\n flag.string('--row', 'Row number (1-indexed)', { alias: '-r', required: true }),\n flag.string('--name', 'Tab name (uses active if not provided)', { alias: '-n' }),\n flag.boolean('--above', 'Insert row above the specified row'),\n flag.boolean('--below', 'Insert row below the specified row'),\n flag.boolean('--formulas', 'Copy formatting, formulas, and data validation from adjacent row', { alias: '-f' }),\n flag.string('--count', 'Number of rows to add (default: 1)', { alias: '-c' })\n ],\n errorMessage: 'Failed to add row',\n action: async ({ options }) => {\n const rowValue = validateRequired(options.row, 'Row number');\n const rowNumber = validatePositiveInteger(rowValue, 'Row number');\n\n if (options.above && options.below) {\n Logger.error('Cannot use both --above and --below. Choose one');\n process.exit(1);\n }\n\n const count = options.count ? validatePositiveInteger(options.count, 'Count') : 1;\n\n const sheetsService = await getGoogleSheetsService();\n const sheetName = getActiveSheetName(options.name);\n\n let insertPosition: number;\n let inheritFromBefore: boolean;\n let sourceRowForFormulas: number;\n\n if (options.below) {\n insertPosition = rowNumber;\n sourceRowForFormulas = rowNumber - 1;\n inheritFromBefore = false;\n } else {\n insertPosition = rowNumber - 1;\n sourceRowForFormulas = rowNumber - 1;\n inheritFromBefore = !!options.formulas;\n }\n\n const rowWord = count === 1 ? 'row' : 'rows';\n Logger.loading(`Adding ${count} ${rowWord} ${options.below ? 'below' : 'above'} row ${rowNumber}...`);\n\n await sheetsService.insertRows(\n sheetName,\n {\n startIndex: insertPosition,\n endIndex: insertPosition + count\n },\n inheritFromBefore\n );\n\n if (options.formulas) {\n Logger.loading('Copying formulas from adjacent row...');\n await sheetsService.copyRowFormulasBulk(sheetName, sourceRowForFormulas, insertPosition, count);\n }\n\n Logger.success(`${count} ${rowWord} added successfully ${options.below ? 'below' : 'above'} row ${rowNumber}`);\n if (options.formulas) {\n Logger.info(`Formatting, formulas, and dropdowns copied from row ${sourceRowForFormulas + 1}`);\n }\n }\n});\n","import { defineSubCommand, flag } from '../../../cli/define';\nimport { getActiveSheetName, getGoogleSheetsService } from '../../../core/command-helpers';\nimport { Logger } from '../../../utils/logger';\nimport { validatePositiveInteger, validateRequired } from '../../../utils/validators';\n\nexport const rowRemoveCommand = defineSubCommand({\n name: 'row-remove',\n description: 'Remove a row from the sheet',\n flags: [\n flag.string('--row', 'Row number (1-indexed)', { alias: '-r', required: true }),\n flag.string('--name', 'Tab name (uses active if not provided)', { alias: '-n' }),\n flag.boolean('--above', 'Remove rows above the specified row'),\n flag.boolean('--below', 'Remove rows below the specified row'),\n flag.string('--count', 'Number of rows to remove (default: 1)', { alias: '-c' })\n ],\n errorMessage: 'Failed to remove row',\n action: async ({ options }) => {\n const rowValue = validateRequired(options.row, 'Row number');\n const rowNumber = validatePositiveInteger(rowValue, 'Row number');\n\n if (options.above && options.below) {\n Logger.error('Cannot use both --above and --below. Choose one');\n process.exit(1);\n }\n\n const count = options.count ? validatePositiveInteger(options.count, 'Count') : 1;\n\n const sheetsService = await getGoogleSheetsService();\n const sheetName = getActiveSheetName(options.name);\n\n let startIndex: number;\n let endIndex: number;\n\n if (options.above) {\n startIndex = rowNumber - count - 1;\n endIndex = rowNumber - 1;\n if (startIndex < 0) {\n Logger.error(`Cannot remove ${count} rows above row ${rowNumber} (would go above row 1)`);\n process.exit(1);\n }\n } else if (options.below) {\n startIndex = rowNumber;\n endIndex = rowNumber + count;\n } else {\n startIndex = rowNumber - 1;\n endIndex = rowNumber + count - 1;\n }\n\n const rowWord = count === 1 ? 'row' : 'rows';\n const direction = options.above ? 'above' : options.below ? 'below' : 'starting from';\n Logger.loading(`Removing ${count} ${rowWord} ${direction} row ${rowNumber}...`);\n\n await sheetsService.deleteRows(sheetName, {\n startIndex,\n endIndex\n });\n\n Logger.success(`${count} ${rowWord} removed successfully`);\n }\n});\n","import { defineSubCommand, flag } from '../../../cli/define';\nimport { ConfigManager } from '../../../config/config-manager';\nimport { getGoogleSheetsService } from '../../../core/command-helpers';\nimport { Logger } from '../../../utils/logger';\n\nexport const activeCommand = defineSubCommand({\n name: 'active',\n description: 'Show the currently active sheet',\n flags: [flag.string('--output', 'Output format', { alias: '-o' })],\n errorMessage: 'Failed to get active sheet',\n action: async ({ options }) => {\n const configManager = new ConfigManager();\n const activeAccount = configManager.getActiveAccount();\n\n if (!activeAccount) {\n Logger.error('No active account set.');\n Logger.info('Use: gsheet account add');\n return;\n }\n\n const activeSpreadsheetName = configManager.getActiveSpreadsheetName(activeAccount.email);\n if (!activeSpreadsheetName) {\n Logger.warning('No active spreadsheet set.');\n Logger.info('Use: gsheet spreadsheet select');\n return;\n }\n\n const activeSheetName = configManager.getActiveSheetName(activeAccount.email, activeSpreadsheetName);\n if (!activeSheetName) {\n Logger.warning('No active sheet set.');\n Logger.info('Use: gsheet sheet select');\n return;\n }\n\n const sheetsService = await getGoogleSheetsService();\n const info = await sheetsService.getSheetInfo();\n const activeSheet = info.sheets.find((sheet) => sheet.title === activeSheetName);\n\n if (options.output === 'json') {\n Logger.json({\n spreadsheetTitle: info.title,\n spreadsheetName: activeSpreadsheetName,\n sheet: activeSheet\n ? {\n title: activeSheet.title,\n index: activeSheet.index,\n sheetId: activeSheet.sheetId\n }\n : {\n title: activeSheetName,\n index: null,\n sheetId: null\n }\n });\n return;\n }\n\n Logger.success(`Active sheet: ${activeSheetName}`);\n Logger.dim(` Spreadsheet: ${activeSpreadsheetName}`);\n if (activeSheet) {\n Logger.dim(` Index: ${activeSheet.index + 1}`);\n Logger.dim(` ID: ${activeSheet.sheetId}`);\n }\n }\n});\n","import { defineSubCommand, flag } from '../../../cli/define';\nimport { getGoogleSheetsService } from '../../../core/command-helpers';\nimport { Logger } from '../../../utils/logger';\n\nexport const addCommand = defineSubCommand({\n name: 'add',\n description: 'Add a new sheet to the spreadsheet',\n flags: [flag.string('--name', 'Tab name', { alias: '-n', required: true })],\n errorMessage: 'Failed to add sheet',\n action: async ({ options }) => {\n const sheetsService = await getGoogleSheetsService();\n\n Logger.loading(`Creating sheet '${options.name}'...`);\n await sheetsService.addSheet(options.name);\n\n Logger.success(`Sheet '${options.name}' created successfully`);\n }\n});\n","import { defineSubCommand, flag } from '../../../cli/define';\nimport { getActiveSheetName, getGoogleSheetsService } from '../../../core/command-helpers';\nimport { Logger } from '../../../utils/logger';\n\nexport const copyCommand = defineSubCommand({\n name: 'copy',\n description: 'Copy a sheet to a new sheet',\n flags: [\n flag.string('--name', 'Source tab name (uses active if not provided)', { alias: '-n' }),\n flag.string('--to', 'Destination tab name', { required: true })\n ],\n errorMessage: 'Failed to copy sheet',\n action: async ({ options }) => {\n const sheetsService = await getGoogleSheetsService();\n const sheetName = getActiveSheetName(options.name);\n\n Logger.loading(`Copying sheet '${sheetName}' to '${options.to}'...`);\n await sheetsService.copySheet(sheetName, options.to);\n\n Logger.success(`Sheet '${sheetName}' copied to '${options.to}' successfully`);\n }\n});\n","import { defineSubCommand, flag } from '../../../cli/define';\nimport { getActiveSheetName, getGoogleSheetsService } from '../../../core/command-helpers';\nimport { Logger } from '../../../utils/logger';\n\nexport const removeCommand = defineSubCommand({\n name: 'remove',\n description: 'Remove a sheet from the spreadsheet',\n flags: [flag.string('--name', 'Tab name (uses active if not provided)', { alias: '-n' })],\n errorMessage: 'Failed to remove sheet',\n action: async ({ options }) => {\n const sheetsService = await getGoogleSheetsService();\n const sheetName = getActiveSheetName(options.name);\n\n Logger.loading(`Removing sheet '${sheetName}'...`);\n await sheetsService.removeSheet(sheetName);\n\n Logger.success(`Sheet '${sheetName}' removed successfully`);\n }\n});\n","import { defineSubCommand, flag } from '../../../cli/define';\nimport { getActiveSheetName, getGoogleSheetsService } from '../../../core/command-helpers';\nimport { Logger } from '../../../utils/logger';\n\nexport const renameCommand = defineSubCommand({\n name: 'rename',\n description: 'Rename a sheet in the spreadsheet',\n flags: [\n flag.string('--name', 'Current tab name (uses active if not provided)', { alias: '-n' }),\n flag.string('--new-name', 'New tab name', { required: true })\n ],\n errorMessage: 'Failed to rename sheet',\n action: async ({ options }) => {\n const sheetsService = await getGoogleSheetsService();\n const sheetName = getActiveSheetName(options.name);\n\n Logger.loading(`Renaming sheet '${sheetName}' to '${options.newName}'...`);\n await sheetsService.renameSheet(sheetName, options.newName);\n\n Logger.success(`Sheet '${sheetName}' renamed to '${options.newName}' successfully`);\n }\n});\n","import inquirer from 'inquirer';\nimport { defineSubCommand, flag } from '../../../cli/define';\nimport { ConfigManager } from '../../../config/config-manager';\nimport { getGoogleSheetsService } from '../../../core/command-helpers';\nimport { Logger } from '../../../utils/logger';\n\nexport const selectCommand = defineSubCommand({\n name: 'select',\n description: 'Select a sheet (sets as active)',\n flags: [flag.string('--name', 'Tab name (skips interactive selection)', { alias: '-n' })],\n errorMessage: 'Failed to select sheet',\n action: async ({ options }) => {\n const configManager = new ConfigManager();\n const activeAccount = configManager.getActiveAccount();\n\n if (!activeAccount) {\n Logger.error('No active account set.');\n Logger.info('Use: gsheet account add');\n process.exit(1);\n }\n\n const activeSpreadsheetName = configManager.getActiveSpreadsheetName(activeAccount.email);\n if (!activeSpreadsheetName) {\n Logger.error('No active spreadsheet set.');\n Logger.info('Use: gsheet spreadsheet select');\n process.exit(1);\n }\n\n let sheetName = options.name;\n\n if (!sheetName) {\n const sheetsService = await getGoogleSheetsService();\n Logger.loading('Fetching sheets...');\n const info = await sheetsService.getSheetInfo();\n\n if (info.sheets.length === 0) {\n Logger.warning('No sheets found in spreadsheet.');\n return;\n }\n\n const activeSheet = configManager.getActiveSheetName(activeAccount.email, activeSpreadsheetName);\n\n const answer = await inquirer.prompt([\n {\n type: 'list',\n name: 'sheet',\n message: 'Select sheet:',\n choices: info.sheets.map((s) => ({\n name: s.title === activeSheet ? `${s.title} (current)` : s.title,\n value: s.title\n }))\n }\n ]);\n\n sheetName = answer.sheet;\n }\n\n if (!sheetName) {\n Logger.error('No sheet name provided');\n return;\n }\n\n configManager.setActiveSheet(activeAccount.email, activeSpreadsheetName, sheetName);\n Logger.success(`Selected sheet: ${sheetName}`);\n }\n});\n","export function parseSpreadsheetId(value: string): string {\n const trimmed = value.trim();\n\n if (!trimmed) {\n throw new Error('Spreadsheet ID or URL is required');\n }\n\n try {\n const url = new URL(trimmed);\n const match = url.pathname.match(/\\/spreadsheets\\/d\\/([^/]+)/);\n\n if (match?.[1]) {\n return match[1];\n }\n } catch {}\n\n return trimmed;\n}\n\nexport function getSpreadsheetUrl(spreadsheetId: string): string {\n return `https://docs.google.com/spreadsheets/d/${spreadsheetId}`;\n}\n","import { defineSubCommand, flag } from '../../cli/define';\nimport { ConfigManager } from '../../config/config-manager';\nimport { Logger } from '../../utils/logger';\nimport { getSpreadsheetUrl } from '../../utils/spreadsheet';\n\nexport const activeSpreadsheetCommand = defineSubCommand({\n name: 'active',\n description: 'Show the currently active spreadsheet',\n flags: [flag.string('--output', 'Output format', { alias: '-o' })],\n errorMessage: 'Failed to get active spreadsheet',\n action: async ({ options }) => {\n const configManager = new ConfigManager();\n const activeAccount = configManager.getActiveAccount();\n\n if (!activeAccount) {\n Logger.error('No active account set.');\n Logger.info('Use: gsheet account add');\n return;\n }\n\n const activeSpreadsheetName = configManager.getActiveSpreadsheetName(activeAccount.email);\n\n if (!activeSpreadsheetName) {\n Logger.warning('No active spreadsheet set.');\n Logger.info('Use \"gsheet spreadsheet select\" to set one.');\n return;\n }\n\n const activeSpreadsheet = configManager.getSpreadsheet(activeAccount.email, activeSpreadsheetName);\n\n if (!activeSpreadsheet) {\n Logger.error('Active spreadsheet not found.');\n return;\n }\n\n if (options.output === 'json') {\n Logger.json({\n activeAccount: activeAccount.email,\n name: activeSpreadsheetName,\n spreadsheetId: activeSpreadsheet.spreadsheet_id,\n url: getSpreadsheetUrl(activeSpreadsheet.spreadsheet_id),\n activeSheet: activeSpreadsheet.activeSheet ?? null\n });\n return;\n }\n\n Logger.success(`Active spreadsheet: ${activeSpreadsheetName}`);\n Logger.dim(` ID: ${activeSpreadsheet.spreadsheet_id}`);\n Logger.dim(` URL: ${getSpreadsheetUrl(activeSpreadsheet.spreadsheet_id)}`);\n if (activeSpreadsheet.activeSheet) {\n Logger.dim(` Active sheet: ${activeSpreadsheet.activeSheet}`);\n }\n }\n});\n","import inquirer from 'inquirer';\nimport { defineSubCommand, flag } from '../../cli/define';\nimport { ConfigManager } from '../../config/config-manager';\nimport { GOOGLE_API_URLS } from '../../config/constants';\nimport { GoogleDriveService } from '../../core/google-drive.service';\nimport { getSpreadsheetTitle } from '../../core/spreadsheet-title';\nimport { Logger } from '../../utils/logger';\nimport { parseSpreadsheetId } from '../../utils/spreadsheet';\n\nexport const addSpreadsheetCommand = defineSubCommand({\n name: 'add',\n description: 'Add a new spreadsheet (interactive by default, use --id for manual)',\n flags: [\n flag.string('--id', 'Spreadsheet ID or URL (skips interactive selection)', { alias: '-i' }),\n flag.string('--name', 'Local name for the spreadsheet')\n ],\n errorMessage: 'Failed to add spreadsheet',\n action: async ({ options }) => {\n const configManager = new ConfigManager();\n const activeAccount = configManager.getActiveAccount();\n\n if (!activeAccount) {\n Logger.error('No active account set.');\n Logger.info('Use: gsheet account add');\n process.exit(1);\n }\n\n let spreadsheetId: string;\n let name: string;\n\n const spreadsheetIdOption = options.id ?? (options as Record<string, string | number | boolean | undefined>).i;\n\n if (spreadsheetIdOption !== undefined) {\n spreadsheetId = parseSpreadsheetId(String(spreadsheetIdOption));\n name = options.name?.trim() || '';\n\n if (!name) {\n const defaultName = await getSpreadsheetTitle(configManager, activeAccount.email, spreadsheetId);\n const answer = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'Enter a local name for this spreadsheet:',\n default: defaultName,\n validate: (input: string) => {\n if (!input.trim()) {\n return 'Name cannot be empty';\n }\n return true;\n }\n }\n ]);\n\n name = answer.name;\n }\n } else {\n Logger.loading('Fetching your spreadsheets from Google Drive...');\n\n const credentials = await configManager.getRefreshedCredentials(activeAccount.email);\n const driveService = new GoogleDriveService(credentials);\n const spreadsheets = await driveService.listSpreadsheets();\n\n if (spreadsheets.length === 0) {\n Logger.warning('No spreadsheets found in your Google Drive.');\n Logger.info(`Create one at: ${GOOGLE_API_URLS.SHEETS_CREATE}`);\n process.exit(0);\n }\n\n const choices = spreadsheets.map((s) => ({\n name: `${s.name} (Modified: ${new Date(s.modifiedTime).toLocaleDateString()})`,\n value: { id: s.id, name: s.name }\n }));\n\n const selection = await inquirer.prompt([\n {\n type: 'list',\n name: 'spreadsheet',\n message: `Select a spreadsheet (${spreadsheets.length} found):`,\n choices,\n pageSize: 15\n },\n {\n type: 'input',\n name: 'localName',\n message: 'Enter a local name for this spreadsheet:',\n default: (answers: any) => answers.spreadsheet.name,\n validate: (input: string) => {\n if (!input.trim()) {\n return 'Name cannot be empty';\n }\n return true;\n }\n }\n ]);\n\n spreadsheetId = selection.spreadsheet.id;\n name = selection.localName;\n }\n\n await configManager.addSpreadsheet(activeAccount.email, name, spreadsheetId);\n\n const spreadsheets = configManager.listSpreadsheets(activeAccount.email);\n if (spreadsheets.length === 1) {\n configManager.setActiveSpreadsheet(activeAccount.email, name);\n Logger.success(`Spreadsheet '${name}' added and set as active!`);\n } else {\n Logger.success(`Spreadsheet '${name}' added successfully!`);\n Logger.info(`Switch to this spreadsheet: gsheet spreadsheet select ${name}`);\n }\n }\n});\n","import { google } from 'googleapis';\nimport { OAUTH_SCOPES } from '../config/constants';\nimport type { OAuthCredentials } from '../config/types';\nimport { Logger } from '../utils/logger';\n\nexport interface DriveSpreadsheet {\n id: string;\n name: string;\n modifiedTime: string;\n webViewLink: string;\n}\n\nexport class GoogleDriveService {\n private credentials: OAuthCredentials;\n\n constructor(oauthCredentials: OAuthCredentials) {\n this.credentials = oauthCredentials;\n }\n\n async listSpreadsheets(): Promise<DriveSpreadsheet[]> {\n const oauth2Client = new google.auth.OAuth2(this.credentials.client_id, this.credentials.client_secret);\n\n oauth2Client.setCredentials({\n access_token: this.credentials.access_token,\n refresh_token: this.credentials.refresh_token,\n expiry_date: this.credentials.expiry_date\n });\n\n Logger.info('Checking access token...');\n const tokenInfo = await oauth2Client.getTokenInfo(this.credentials.access_token || '');\n Logger.info(`Token scopes: ${tokenInfo.scopes?.join(', ') || 'none'}`);\n Logger.info(\n `Token expires at: ${this.credentials.expiry_date ? new Date(this.credentials.expiry_date).toLocaleString() : 'unknown'}`\n );\n\n const drive = google.drive({ version: 'v3', auth: oauth2Client });\n\n Logger.info('Requesting spreadsheets from Google Drive API...');\n\n try {\n const response = await drive.files.list({\n q: \"mimeType='application/vnd.google-apps.spreadsheet' and trashed=false\",\n fields: 'files(id, name, modifiedTime, webViewLink)',\n orderBy: 'modifiedTime desc',\n pageSize: 100\n });\n\n const files = response.data.files || [];\n Logger.info(`Found ${files.length} spreadsheet(s)`);\n\n return files.map((file) => ({\n id: file.id || '',\n name: file.name || 'Untitled',\n modifiedTime: file.modifiedTime || '',\n webViewLink: file.webViewLink || ''\n }));\n } catch (error: unknown) {\n Logger.error('Google Drive API error:', error);\n Logger.info('\\nRequired scopes for this operation:');\n Logger.info(` - ${OAUTH_SCOPES.SPREADSHEETS}`);\n Logger.info(` - ${OAUTH_SCOPES.DRIVE_READONLY}`);\n Logger.info('\\nTo fix this:');\n Logger.info(' 1. Add Drive API scope in OAuth Consent Screen');\n Logger.info(' 2. Run: gsheet account reauth');\n throw error;\n }\n }\n}\n","import { ConfigManager } from '../config/config-manager';\nimport { GoogleSheetsService } from './google-sheets.service';\n\nexport async function getSpreadsheetTitle(\n configManager: ConfigManager,\n email: string,\n spreadsheetId: string\n): Promise<string> {\n const credentials = await configManager.getRefreshedCredentials(email);\n const sheetsService = new GoogleSheetsService({\n spreadsheetId,\n oauthCredentials: credentials\n });\n const info = await sheetsService.getSheetInfo();\n return info.title;\n}\n","import { defineSubCommand, flag } from '../../cli/define';\nimport { ConfigManager } from '../../config/config-manager';\nimport { Logger } from '../../utils/logger';\nimport { getSpreadsheetUrl } from '../../utils/spreadsheet';\n\nexport const listSpreadsheetsCommand = defineSubCommand({\n name: 'list',\n description: 'List all configured spreadsheets',\n flags: [flag.string('--output', 'Output format', { alias: '-o' })],\n errorMessage: 'Failed to list spreadsheets',\n action: async ({ options }) => {\n const configManager = new ConfigManager();\n const activeAccount = configManager.getActiveAccount();\n\n if (!activeAccount) {\n Logger.error('No active account set.');\n Logger.info('Use: gsheet account add');\n return;\n }\n\n const spreadsheets = configManager.listSpreadsheets(activeAccount.email);\n const activeSpreadsheetName = configManager.getActiveSpreadsheetName(activeAccount.email);\n\n if (options.output === 'json') {\n Logger.json({\n activeAccount: activeAccount.email,\n activeSpreadsheet: activeSpreadsheetName,\n spreadsheets: spreadsheets.map((spreadsheet) => ({\n name: spreadsheet.name,\n spreadsheetId: spreadsheet.spreadsheetId,\n url: getSpreadsheetUrl(spreadsheet.spreadsheetId),\n activeSheet: spreadsheet.activeSheet ?? null,\n active: spreadsheet.name === activeSpreadsheetName\n }))\n });\n return;\n }\n\n if (spreadsheets.length === 0) {\n Logger.warning('No spreadsheets configured. Use \"gsheet spreadsheet add\" to add one.');\n return;\n }\n\n Logger.bold(`\\nSpreadsheets for ${activeAccount.email}:`);\n spreadsheets.forEach((spreadsheet) => {\n const isActive = spreadsheet.name === activeSpreadsheetName;\n const marker = isActive ? '* ' : ' ';\n Logger.plain(`${marker}${spreadsheet.name}${isActive ? ' (active)' : ''}`);\n Logger.dim(` ID: ${spreadsheet.spreadsheetId}`);\n Logger.dim(` URL: ${getSpreadsheetUrl(spreadsheet.spreadsheetId)}`);\n if (spreadsheet.activeSheet) {\n Logger.dim(` Active sheet: ${spreadsheet.activeSheet}`);\n }\n });\n\n if (activeSpreadsheetName) {\n Logger.plain('');\n Logger.dim('* = active spreadsheet');\n }\n }\n});\n","import inquirer from 'inquirer';\nimport { defineSubCommand, flag } from '../../cli/define';\nimport { ConfigManager } from '../../config/config-manager';\nimport { Logger } from '../../utils/logger';\nimport { parseSpreadsheetId } from '../../utils/spreadsheet';\n\nexport const removeSpreadsheetCommand = defineSubCommand({\n name: 'remove',\n description: 'Remove a spreadsheet configuration',\n flags: [flag.string('--id', 'Spreadsheet ID or URL (skips interactive selection)', { alias: '-i' })],\n errorMessage: 'Failed to remove spreadsheet',\n action: async ({ options }) => {\n const configManager = new ConfigManager();\n const activeAccount = configManager.getActiveAccount();\n\n if (!activeAccount) {\n Logger.error('No active account set.');\n Logger.info('Use: gsheet account add');\n process.exit(1);\n }\n\n const spreadsheetIdOption = options.id ?? (options as Record<string, string | number | boolean | undefined>).i;\n let spreadsheetId = spreadsheetIdOption !== undefined ? parseSpreadsheetId(String(spreadsheetIdOption)) : undefined;\n\n if (!spreadsheetId) {\n const spreadsheets = configManager.listSpreadsheets(activeAccount.email);\n\n if (spreadsheets.length === 0) {\n Logger.warning('No spreadsheets configured.');\n return;\n }\n\n const answer = await inquirer.prompt([\n {\n type: 'list',\n name: 'spreadsheet',\n message: 'Select spreadsheet to remove:',\n choices: spreadsheets.map((s) => ({\n name: s.name,\n value: s.spreadsheetId\n }))\n }\n ]);\n\n spreadsheetId = answer.spreadsheet;\n }\n\n if (!spreadsheetId) {\n Logger.error('No spreadsheet ID provided');\n return;\n }\n\n const spreadsheet = configManager.getSpreadsheetById(activeAccount.email, spreadsheetId);\n if (!spreadsheet) {\n Logger.error(`Spreadsheet with ID '${spreadsheetId}' not found`);\n process.exit(1);\n }\n\n const spreadsheetName = Object.entries(configManager.listSpreadsheets(activeAccount.email)).find(\n ([_, s]) => s.spreadsheetId === spreadsheetId\n )?.[1]?.name;\n\n if (!spreadsheetName) {\n Logger.error(`Spreadsheet with ID '${spreadsheetId}' not found`);\n process.exit(1);\n }\n\n const confirm = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirmed',\n message: `Are you sure you want to remove '${spreadsheetName}'?`,\n default: false\n }\n ]);\n\n if (!confirm.confirmed) {\n Logger.info('Cancelled');\n return;\n }\n\n await configManager.removeSpreadsheet(activeAccount.email, spreadsheetName);\n Logger.success(`Spreadsheet '${spreadsheetName}' removed successfully!`);\n }\n});\n","import inquirer from 'inquirer';\nimport { defineSubCommand, flag } from '../../cli/define';\nimport { ConfigManager } from '../../config/config-manager';\nimport { getSpreadsheetTitle } from '../../core/spreadsheet-title';\nimport { Logger } from '../../utils/logger';\nimport { parseSpreadsheetId } from '../../utils/spreadsheet';\n\nexport const selectSpreadsheetCommand = defineSubCommand({\n name: 'select',\n description: 'Select a different spreadsheet (sets as active)',\n flags: [\n flag.string('--id', 'Spreadsheet ID or URL (skips interactive selection)', { alias: '-i' }),\n flag.boolean('--add', 'Add the spreadsheet if it is not configured'),\n flag.string('--name', 'Local name to use with --add')\n ],\n errorMessage: 'Failed to select spreadsheet',\n action: async ({ options }) => {\n const configManager = new ConfigManager();\n const activeAccount = configManager.getActiveAccount();\n\n if (!activeAccount) {\n Logger.error('No active account set.');\n Logger.info('Use: gsheet account add');\n process.exit(1);\n }\n\n const spreadsheetIdOption = options.id ?? (options as Record<string, string | number | boolean | undefined>).i;\n let spreadsheetId = spreadsheetIdOption !== undefined ? parseSpreadsheetId(String(spreadsheetIdOption)) : undefined;\n\n if (!spreadsheetId) {\n const spreadsheets = configManager.listSpreadsheets(activeAccount.email);\n\n if (spreadsheets.length === 0) {\n Logger.warning('No spreadsheets configured. Use \"gsheet spreadsheet add\" to add one.');\n return;\n }\n\n const activeSpreadsheet = configManager.getActiveSpreadsheetName(activeAccount.email);\n\n const answer = await inquirer.prompt([\n {\n type: 'list',\n name: 'spreadsheet',\n message: 'Select spreadsheet:',\n choices: spreadsheets.map((s) => ({\n name: s.name === activeSpreadsheet ? `${s.name} (current)` : s.name,\n value: s.spreadsheetId\n }))\n }\n ]);\n\n spreadsheetId = answer.spreadsheet;\n }\n\n if (!spreadsheetId) {\n Logger.error('No spreadsheet ID provided');\n return;\n }\n\n let spreadsheet = configManager.getSpreadsheetById(activeAccount.email, spreadsheetId);\n if (!spreadsheet) {\n if (!options.add) {\n Logger.error(`Spreadsheet with ID '${spreadsheetId}' not found`);\n Logger.info('Use --add to add and select this spreadsheet.');\n process.exit(1);\n }\n\n const name =\n options.name?.trim() || (await getSpreadsheetTitle(configManager, activeAccount.email, spreadsheetId));\n await configManager.addSpreadsheet(activeAccount.email, name, spreadsheetId);\n spreadsheet = configManager.getSpreadsheetById(activeAccount.email, spreadsheetId);\n Logger.success(`Added spreadsheet: ${name}`);\n }\n\n const spreadsheetName = Object.entries(configManager.listSpreadsheets(activeAccount.email)).find(\n ([_, s]) => s.spreadsheetId === spreadsheetId\n )?.[1]?.name;\n\n if (!spreadsheetName) {\n Logger.error(`Spreadsheet with ID '${spreadsheetId}' not found`);\n process.exit(1);\n }\n\n configManager.setActiveSpreadsheet(activeAccount.email, spreadsheetName);\n Logger.success(`Selected spreadsheet: ${spreadsheetName}`);\n }\n});\n","import { exec } from 'child_process';\nimport { readFileSync } from 'fs';\nimport { platform } from 'os';\nimport { dirname, join } from 'path';\nimport { fileURLToPath } from 'url';\nimport { promisify } from 'util';\nimport { defineSubCommand } from '../cli/define';\nimport { APP_INFO } from '../config/constants';\nimport { Logger } from '../utils/logger';\nimport { reinstallCompletionSilently } from './completion';\n\nconst execAsync = promisify(exec);\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nenum PackageManager {\n Npm = 'npm',\n Pnpm = 'pnpm',\n Yarn = 'yarn'\n}\n\nconst updateCommandsByPackageManager = {\n [PackageManager.Npm]: `npm update -g ${APP_INFO.packageName}`,\n [PackageManager.Pnpm]: `pnpm update -g ${APP_INFO.packageName}`,\n [PackageManager.Yarn]: `yarn global upgrade ${APP_INFO.packageName}`\n} as const satisfies Record<PackageManager, string>;\n\nexport const updateCommand = defineSubCommand({\n name: 'update',\n description: `Update ${APP_INFO.name} to latest version`,\n errorMessage: 'Failed to check for updates',\n action: async () => {\n Logger.loading('Checking current version...');\n\n const currentVersion = getCurrentVersion();\n if (!currentVersion) {\n Logger.error('Could not determine current version');\n return;\n }\n\n Logger.loading('Checking latest version...');\n\n const latestVersion = await getLatestVersion();\n if (!latestVersion) {\n Logger.error('Could not fetch latest version from npm');\n return;\n }\n\n Logger.info(`📦 Current version: ${currentVersion}`);\n Logger.info(`📦 Latest version: ${latestVersion}`);\n\n if (currentVersion === latestVersion) {\n Logger.success(`${APP_INFO.name} is already up to date!`);\n return;\n }\n\n Logger.loading('Detecting package manager...');\n\n const packageManager = await detectPackageManager();\n\n if (!packageManager) {\n Logger.error(`Could not detect how ${APP_INFO.name} was installed`);\n Logger.dim('Please update manually using your package manager');\n return;\n }\n\n Logger.info(`📦 Detected package manager: ${packageManager}`);\n Logger.loading(`Updating ${APP_INFO.name} from ${currentVersion} to ${latestVersion}...`);\n\n const updateCommand = getUpdateCommand(packageManager);\n const { stdout, stderr } = await execAsync(updateCommand);\n\n if (stderr && !stderr.includes('npm WARN')) {\n Logger.error(`Error updating: ${stderr}`);\n return;\n }\n\n Logger.success(`${APP_INFO.name} updated successfully from ${currentVersion} to ${latestVersion}!`);\n\n if (stdout) {\n Logger.dim(stdout);\n }\n\n const completionReinstalled = await reinstallCompletionSilently();\n if (completionReinstalled) {\n Logger.dim('✨ Shell completion updated');\n Logger.info('');\n Logger.info('To activate the updated completion, run:');\n\n const currentShell = process.env.SHELL || '';\n if (currentShell.includes('zsh')) {\n Logger.info(' exec zsh');\n } else if (currentShell.includes('bash')) {\n Logger.info(' exec bash');\n } else {\n Logger.info(' # Restart your shell');\n }\n }\n }\n});\n\nasync function detectPackageManager(): Promise<PackageManager | null> {\n const npmPath = await getGlobalNpmPath();\n\n if (!npmPath) {\n return null;\n }\n\n const possiblePaths = [\n { manager: PackageManager.Npm, patterns: ['/npm/', '\\\\npm\\\\', '/node/', '\\\\node\\\\'] },\n { manager: PackageManager.Yarn, patterns: ['/yarn/', '\\\\yarn\\\\', '/.yarn/', '\\\\.yarn\\\\'] },\n { manager: PackageManager.Pnpm, patterns: ['/pnpm/', '\\\\pnpm\\\\', '/.pnpm/', '\\\\.pnpm\\\\'] }\n ];\n\n for (const { manager, patterns } of possiblePaths) {\n if (patterns.some((pattern) => npmPath.includes(pattern))) {\n return manager;\n }\n }\n\n return PackageManager.Npm;\n}\n\nasync function getGlobalNpmPath(): Promise<string | null> {\n const isWindows = platform() === 'win32';\n\n try {\n const whereCommand = isWindows ? 'where' : 'which';\n const { stdout } = await execAsync(`${whereCommand} ${APP_INFO.name}`);\n const execPath = stdout.trim();\n\n if (execPath) {\n if (!isWindows) {\n try {\n const { stdout: realPath } = await execAsync(`readlink -f \"${execPath}\"`);\n return realPath.trim() || execPath;\n } catch {\n return execPath;\n }\n }\n return execPath;\n }\n } catch {\n try {\n const { stdout } = await execAsync(`npm list -g --depth=0 ${APP_INFO.packageName}`);\n if (stdout.includes(APP_INFO.packageName)) {\n return PackageManager.Npm;\n }\n } catch {}\n }\n\n return null;\n}\n\nfunction getCurrentVersion(): string | null {\n try {\n const packagePath = join(__dirname, '../../package.json');\n const packageJson = JSON.parse(readFileSync(packagePath, 'utf8'));\n return packageJson.version;\n } catch {\n return null;\n }\n}\n\nasync function getLatestVersion(): Promise<string | null> {\n try {\n const { stdout } = await execAsync(`npm view ${APP_INFO.packageName} version`);\n return stdout.trim();\n } catch {\n return null;\n }\n}\n\nfunction getUpdateCommand(packageManager: PackageManager): string {\n return updateCommandsByPackageManager[packageManager];\n}\n","import { addAccountCommand } from '../commands/account/add';\nimport { listAccountsCommand } from '../commands/account/list';\nimport { reauthAccountCommand } from '../commands/account/reauth';\nimport { removeAccountCommand } from '../commands/account/remove';\nimport { selectAccountCommand } from '../commands/account/select';\nimport { completionCommand } from '../commands/completion';\nimport { appendCommand } from '../commands/sheet/data_operations/append';\nimport { writeCommand } from '../commands/sheet/data_operations/write';\nimport { exportCommand } from '../commands/sheet/import_export/export';\nimport { importCommand } from '../commands/sheet/import_export/import';\nimport { listCommand } from '../commands/sheet/list';\nimport { readCommand } from '../commands/sheet/read';\nimport { rowAddCommand } from '../commands/sheet/row_operations/add';\nimport { rowRemoveCommand } from '../commands/sheet/row_operations/remove';\nimport { activeCommand } from '../commands/sheet/sheet_operations/active';\nimport { addCommand } from '../commands/sheet/sheet_operations/add';\nimport { copyCommand } from '../commands/sheet/sheet_operations/copy';\nimport { removeCommand } from '../commands/sheet/sheet_operations/remove';\nimport { renameCommand } from '../commands/sheet/sheet_operations/rename';\nimport { selectCommand } from '../commands/sheet/sheet_operations/select';\nimport { activeSpreadsheetCommand } from '../commands/spreadsheet/active';\nimport { addSpreadsheetCommand } from '../commands/spreadsheet/add';\nimport { listSpreadsheetsCommand } from '../commands/spreadsheet/list';\nimport { removeSpreadsheetCommand } from '../commands/spreadsheet/remove';\nimport { selectSpreadsheetCommand } from '../commands/spreadsheet/select';\nimport { updateCommand } from '../commands/update';\nimport { defineCommand } from './define';\n\nconst accountCommand = defineCommand({\n name: 'account',\n description: 'Manage Google accounts',\n subcommands: [\n addAccountCommand,\n listAccountsCommand,\n selectAccountCommand,\n removeAccountCommand,\n reauthAccountCommand\n ]\n});\n\nconst spreadsheetCommand = defineCommand({\n name: 'spreadsheet',\n description: 'Manage spreadsheet configurations',\n subcommands: [\n addSpreadsheetCommand,\n listSpreadsheetsCommand,\n removeSpreadsheetCommand,\n selectSpreadsheetCommand,\n activeSpreadsheetCommand\n ]\n});\n\nconst sheetCommand = defineCommand({\n name: 'sheet',\n description: 'Manage and interact with spreadsheet sheets',\n subcommands: [\n listCommand,\n activeCommand,\n selectCommand,\n readCommand,\n addCommand,\n removeCommand,\n renameCommand,\n copyCommand,\n writeCommand,\n appendCommand,\n importCommand,\n exportCommand,\n rowAddCommand,\n rowRemoveCommand\n ]\n});\n\nexport const cliCommands = [accountCommand, spreadsheetCommand, sheetCommand, updateCommand] as const;\nexport const docsCommands = [...cliCommands, completionCommand] as const;\n","import { Logger } from './logger';\n\nfunction formatError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n return String(error);\n}\n\nexport function handleCommandError(baseMessage: string | ((error: unknown) => string)) {\n return (error: unknown) => {\n const errorDetails = formatError(error);\n\n if (errorDetails.includes('invalid_grant')) {\n Logger.error('OAuth token refresh failed: invalid_grant');\n Logger.info('Your refresh token is expired or invalid');\n Logger.info('Fix: gsheet account reauth');\n process.exit(1);\n }\n\n const prefix = typeof baseMessage === 'function' ? baseMessage(error) : baseMessage;\n const fullMessage = `${prefix}: ${errorDetails}`;\n Logger.error(fullMessage);\n process.exit(1);\n };\n}\n","import type { Command as CaporalCommand, Program as CaporalProgram } from '@caporal/core';\nimport { APP_INFO } from '../config/constants';\nimport { handleCommandError } from '../utils/error-handler';\nimport {\n type CommandArgument,\n type CommandDefinition,\n type CommandFlag,\n CommandFlagType,\n type ParentCommandDefinition,\n type SubCommandDefinition\n} from './types';\n\nexport function registerProgram(program: CaporalProgram, commands: readonly CommandDefinition[]): void {\n for (const command of commands) {\n if (command.kind === 'command') {\n registerParentCommand(program, command);\n for (const subcommand of command.subcommands) {\n registerSubCommand(program, command.name, subcommand);\n }\n continue;\n }\n\n registerSubCommand(program, undefined, command);\n }\n}\n\nfunction registerParentCommand(program: CaporalProgram, definition: ParentCommandDefinition): CaporalCommand {\n const command = program.command(definition.name, definition.description);\n applyAliases(command, definition.aliases);\n\n command.action(async () => {\n const commandPromise = async () => {\n console.log(`Usage: ${APP_INFO.name} ${definition.name} <command>`);\n console.log('');\n console.log(`Available commands: ${definition.subcommands.map((subcommand) => subcommand.name).join(', ')}`);\n };\n\n await commandPromise().catch(\n handleCommandError(resolveErrorMessage(definition.errorMessage, `Failed to execute: ${definition.name}`))\n );\n });\n\n return command;\n}\n\nfunction registerSubCommand(\n program: CaporalProgram,\n parentName: string | undefined,\n definition: SubCommandDefinition\n): CaporalCommand {\n const commandName = parentName ? `${parentName} ${definition.name}` : definition.name;\n const command = program.command(commandName, definition.description);\n\n applyAliases(command, definition.aliases);\n applyArguments(command, definition.arguments);\n applyFlags(command, definition.flags);\n\n command.action(async ({ args, options }: { args: Record<string, unknown>; options: Record<string, unknown> }) => {\n const commandPromise = async () => {\n await definition.action({\n args: args as Record<string, string>,\n options: options as Record<string, string | boolean>\n });\n };\n\n await commandPromise().catch(\n handleCommandError(resolveErrorMessage(definition.errorMessage, `Failed to execute: ${commandName}`))\n );\n });\n\n return command;\n}\n\nfunction applyAliases(command: CaporalCommand, aliases: readonly string[] | undefined): void {\n if (!aliases) return;\n\n for (const alias of aliases) {\n command.alias(alias);\n }\n}\n\nfunction applyArguments(command: CaporalCommand, args: readonly CommandArgument[] | undefined): void {\n if (!args) return;\n\n for (const arg of args) {\n const argString = arg.required ? `<${arg.name}>` : `[${arg.name}]`;\n command.argument(argString, arg.description);\n }\n}\n\nfunction applyFlags(command: CaporalCommand, flags: readonly CommandFlag[] | undefined): void {\n if (!flags) return;\n\n for (const flag of flags) {\n let flagString = flag.name;\n\n if (flag.alias) {\n flagString = `${flag.alias}, ${flagString}`;\n }\n\n if (flag.type === CommandFlagType.String) {\n flagString += ' <value>';\n }\n\n command.option(flagString, flag.description, {\n required: flag.required,\n default: flag.name.startsWith('--no-') ? true : undefined\n });\n }\n}\n\nfunction resolveErrorMessage(errorMessage: string | ((error: unknown) => string) | undefined, fallback: string) {\n if (!errorMessage) return () => fallback;\n if (typeof errorMessage === 'function') return errorMessage;\n return () => errorMessage;\n}\n"],"mappings":"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","names":["fileURLToPath","platform","release","fs","OAuth2Client","OAuth2Client","OAuth2Client","OAuth2Client","inquirer","inquirer","existsSync","mkdirSync","writeFileSync","homedir","join","program","homedir","join","existsSync","mkdirSync","writeFileSync","fs","shell","OAuth2Client","writeFileSync","ExportFormat","writeFileSync","readFileSync","readFileSync","writeFileSync","OutputFormat","writeFileSync","inquirer","inquirer","inquirer","inquirer","spreadsheets","inquirer","inquirer","inquirer","inquirer","readFileSync","platform","dirname","join","fileURLToPath","__dirname","dirname","fileURLToPath","updateCommand","platform","join","__dirname","packageJson","readFileSync","program","flag","require","fileURLToPath"]}
|