shincloud-cli 1.0.0 → 1.0.2
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/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1252,7 +1252,7 @@ function run(brand, version = "0.0.0") {
|
|
|
1252
1252
|
// package.json
|
|
1253
1253
|
var package_default = {
|
|
1254
1254
|
name: "shincloud-cli",
|
|
1255
|
-
version: "1.0.
|
|
1255
|
+
version: "1.0.2",
|
|
1256
1256
|
description: "Official CLI for Shincloud API \u2014 manage your Shincloud hosting from the terminal",
|
|
1257
1257
|
type: "module",
|
|
1258
1258
|
bin: {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../core/src/index.ts","../../../shared/src/api-client.ts","../../core/src/commands/auth/login.ts","../../core/src/lib/config.ts","../../core/src/lib/command-helper.ts","../../core/src/lib/output.ts","../../core/src/commands/server/info.ts","../../core/src/commands/server/cron/index.ts","../../core/src/commands/server/wp/index.ts","../../core/src/commands/server/mail/index.ts","../../core/src/commands/server/mail-filter/index.ts","../../core/src/commands/server/ftp/index.ts","../../core/src/commands/server/db/index.ts","../../core/src/commands/server/php-version/index.ts","../../core/src/commands/server/domain/index.ts","../../core/src/commands/server/subdomain/index.ts","../../core/src/commands/server/ssl/index.ts","../../core/src/commands/server/dns/index.ts","../../core/src/commands/server/ssh/index.ts","../../core/src/commands/server/log/index.ts","../../core/src/commands/me/index.ts","../package.json","../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiError } from 'xnp-shared';\r\nimport { registerAuthCommands } from './commands/auth/login.js';\r\nimport { registerServerInfoCommands } from './commands/server/info.js';\r\nimport { registerCronCommands } from './commands/server/cron/index.js';\r\nimport { registerWpCommands } from './commands/server/wp/index.js';\r\nimport { registerMailCommands } from './commands/server/mail/index.js';\r\nimport { registerMailFilterCommands } from './commands/server/mail-filter/index.js';\r\nimport { registerFtpCommands } from './commands/server/ftp/index.js';\r\nimport { registerDbCommands } from './commands/server/db/index.js';\r\nimport { registerPhpVersionCommands } from './commands/server/php-version/index.js';\r\nimport { registerServerDomainCommands } from './commands/server/domain/index.js';\r\nimport { registerSubdomainCommands } from './commands/server/subdomain/index.js';\r\nimport { registerSslCommands } from './commands/server/ssl/index.js';\r\nimport { registerDnsCommands } from './commands/server/dns/index.js';\r\nimport { registerSshCommands } from './commands/server/ssh/index.js';\r\nimport { registerLogCommands } from './commands/server/log/index.js';\r\nimport { registerMeCommand } from './commands/me/index.js';\r\n\r\nexport type { BrandConfig } from 'xnp-shared';\r\n\r\nexport function run(brand: BrandConfig, version = '0.0.0'): void {\r\n const program = new Command();\r\n\r\n program\r\n .name(brand.commandName)\r\n .description(`${brand.displayName} CLI`)\r\n .version(version)\r\n .option('--format <format>', '出力形式 (json, table)', (value: string) => {\r\n if (!['json', 'table'].includes(value)) {\r\n throw new Error(`--format は json または table を指定してください(入力値: ${value})`);\r\n }\r\n return value;\r\n }, 'table')\r\n .option('--profile <name>', '使用するプロファイル')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .option('--debug', 'デバッグ出力を有効化(リクエストURL・レスポンスヘッダを表示)');\r\n\r\n registerAuthCommands(program, brand);\r\n registerMeCommand(program, brand);\r\n\r\n // サーバー管理API(/server/v1)\r\n const server = program\r\n .command('server')\r\n .description('サーバー管理API(WordPress・メール・DBなど)')\r\n .option('--servername <name>', 'サーバー名(プロファイルのデフォルトを上書き)');\r\n\r\n registerServerInfoCommands(server, brand);\r\n registerCronCommands(server, brand);\r\n registerSshCommands(server, brand);\r\n registerWpCommands(server, brand);\r\n registerMailCommands(server, brand);\r\n registerMailFilterCommands(server, brand);\r\n registerFtpCommands(server, brand);\r\n registerDbCommands(server, brand);\r\n registerPhpVersionCommands(server, brand);\r\n registerServerDomainCommands(server, brand);\r\n registerSubdomainCommands(server, brand);\r\n registerSslCommands(server, brand);\r\n registerDnsCommands(server, brand);\r\n registerLogCommands(server, brand);\r\n\r\n program.parseAsync(process.argv).catch((err: unknown) => {\r\n if (err instanceof ApiError) {\r\n console.error(`エラー [${err.errorCode}]: ${err.message}`);\r\n if (err.errors.length > 0) {\r\n for (const e of err.errors) {\r\n console.error(` - ${e}`);\r\n }\r\n }\r\n process.exit(1);\r\n }\r\n if (err instanceof Error) {\r\n console.error(`エラー: ${err.message}`);\r\n process.exit(1);\r\n }\r\n console.error('予期しないエラーが発生しました');\r\n process.exit(1);\r\n });\r\n}\r\n","const DEFAULT_TIMEOUT_MS = 30_000;\r\n\r\nexport interface ApiErrorDetail {\r\n code: string;\r\n message: string;\r\n errors: string[];\r\n httpStatus: number;\r\n}\r\n\r\nexport class ApiError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly httpStatus: number,\r\n public readonly errorCode: string,\r\n public readonly errors: string[],\r\n ) {\r\n super(message);\r\n this.name = 'ApiError';\r\n }\r\n}\r\n\r\nexport interface RateLimitInfo {\r\n limit: number;\r\n remaining: number;\r\n reset: number;\r\n}\r\n\r\nexport interface ApiClientOptions {\r\n apiKey: string;\r\n apiBase: string;\r\n servername?: string;\r\n debug?: boolean;\r\n}\r\n\r\nexport class ApiClient {\r\n private readonly apiBase: string;\r\n private readonly apiKey: string;\r\n private readonly servername?: string;\r\n private readonly debug: boolean;\r\n public lastRateLimit: RateLimitInfo | null = null;\r\n\r\n constructor(opts: ApiClientOptions) {\r\n this.apiBase = opts.apiBase.replace(/\\/+$/, '');\r\n this.apiKey = opts.apiKey;\r\n this.servername = opts.servername;\r\n this.debug = opts.debug ?? false;\r\n }\r\n\r\n private serverPath(): string {\r\n if (!this.servername) {\r\n throw new Error('サーバー名が設定されていません。');\r\n }\r\n return `/v1/server/${encodeURIComponent(this.servername)}`;\r\n }\r\n\r\n // ================================================================\r\n // サーバー情報\r\n // ================================================================\r\n\r\n async getServerInfo(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/server-info`);\r\n }\r\n\r\n async getServerUsage(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/server-info/usage`);\r\n }\r\n\r\n // ================================================================\r\n // Cron\r\n // ================================================================\r\n\r\n async listCron(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/cron`);\r\n }\r\n\r\n async addCron(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/cron`, data);\r\n }\r\n\r\n async updateCron(cronId: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/cron/${enc(cronId)}`, data);\r\n }\r\n\r\n async deleteCron(cronId: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/cron/${enc(cronId)}`);\r\n }\r\n\r\n // ================================================================\r\n // WordPress\r\n // ================================================================\r\n\r\n async listWordpress(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/wp`, params);\r\n }\r\n\r\n async addWordpress(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/wp`, data);\r\n }\r\n\r\n async updateWordpress(wpId: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/wp/${enc(wpId)}`, data);\r\n }\r\n\r\n async deleteWordpress(wpId: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/wp/${enc(wpId)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // メールアカウント\r\n // ================================================================\r\n\r\n async listMail(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mail`, params);\r\n }\r\n\r\n async getMail(mailAccount: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mail/${enc(mailAccount)}`);\r\n }\r\n\r\n async addMail(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/mail`, data);\r\n }\r\n\r\n async updateMail(mailAccount: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/mail/${enc(mailAccount)}`, data);\r\n }\r\n\r\n async deleteMail(mailAccount: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/mail/${enc(mailAccount)}`);\r\n }\r\n\r\n async getMailForwarding(mailAccount: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mail/${enc(mailAccount)}/forwarding`);\r\n }\r\n\r\n async updateMailForwarding(mailAccount: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/mail/${enc(mailAccount)}/forwarding`, data);\r\n }\r\n\r\n // ================================================================\r\n // メール振り分け\r\n // ================================================================\r\n\r\n async listMailFilter(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mail-filter`, params);\r\n }\r\n\r\n async addMailFilter(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/mail-filter`, data);\r\n }\r\n\r\n async deleteMailFilter(filterId: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/mail-filter/${enc(filterId)}`);\r\n }\r\n\r\n // ================================================================\r\n // FTP\r\n // ================================================================\r\n\r\n async listFtp(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/ftp`, params);\r\n }\r\n\r\n async addFtp(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/ftp`, data);\r\n }\r\n\r\n async updateFtp(ftpAccount: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/ftp/${enc(ftpAccount)}`, data);\r\n }\r\n\r\n async deleteFtp(ftpAccount: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/ftp/${enc(ftpAccount)}`);\r\n }\r\n\r\n // ================================================================\r\n // MySQL\r\n // ================================================================\r\n\r\n async listDb(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/db`);\r\n }\r\n\r\n async addDb(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/db`, data);\r\n }\r\n\r\n async updateDb(dbName: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/db/${enc(dbName)}`, data);\r\n }\r\n\r\n async deleteDb(dbName: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/db/${enc(dbName)}`);\r\n }\r\n\r\n async listDbUser(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/db/user`);\r\n }\r\n\r\n async addDbUser(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/db/user`, data);\r\n }\r\n\r\n async updateDbUser(dbUser: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/db/user/${enc(dbUser)}`, data);\r\n }\r\n\r\n async deleteDbUser(dbUser: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/db/user/${enc(dbUser)}`);\r\n }\r\n\r\n async listDbUserGrant(dbUser: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/db/user/${enc(dbUser)}/grant`);\r\n }\r\n\r\n async addDbUserGrant(dbUser: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/db/user/${enc(dbUser)}/grant`, data);\r\n }\r\n\r\n async deleteDbUserGrant(dbUser: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/db/user/${enc(dbUser)}/grant`, data);\r\n }\r\n\r\n // ================================================================\r\n // PHP バージョン\r\n // ================================================================\r\n\r\n async getPhpVersion(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/php-version`, params);\r\n }\r\n\r\n async updatePhpVersion(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/php-version/${enc(domain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // ドメイン(サーバーパネル)\r\n // ================================================================\r\n\r\n async listDomain(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/domain`);\r\n }\r\n\r\n async getDomain(domain: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/domain/${enc(domain)}`);\r\n }\r\n\r\n async addDomain(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/domain`, data);\r\n }\r\n\r\n async updateDomain(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/domain/${enc(domain)}`, data);\r\n }\r\n\r\n async deleteDomain(domain: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/domain/${enc(domain)}`, data);\r\n }\r\n\r\n async resetDomain(domain: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/domain/${enc(domain)}/reset`, data);\r\n }\r\n\r\n // ================================================================\r\n // サブドメイン\r\n // ================================================================\r\n\r\n async listSubdomain(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/subdomain`, params);\r\n }\r\n\r\n async addSubdomain(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/subdomain`, data);\r\n }\r\n\r\n async updateSubdomain(subdomain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/subdomain/${enc(subdomain)}`, data);\r\n }\r\n\r\n async deleteSubdomain(subdomain: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/subdomain/${enc(subdomain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // SSL\r\n // ================================================================\r\n\r\n async listSsl(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/ssl`, params);\r\n }\r\n\r\n async installSsl(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/ssl`, data);\r\n }\r\n\r\n async uninstallSsl(commonName: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/ssl/${enc(commonName)}`);\r\n }\r\n\r\n // ================================================================\r\n // DNS(サーバーパネル)\r\n // ================================================================\r\n\r\n async listDns(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/dns`, params);\r\n }\r\n\r\n async addDns(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/dns`, data);\r\n }\r\n\r\n async updateDns(dnsId: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/dns/${enc(dnsId)}`, data);\r\n }\r\n\r\n async deleteDns(dnsId: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/dns/${enc(dnsId)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // SSH\r\n // ================================================================\r\n\r\n async getSsh(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/ssh`);\r\n }\r\n\r\n async updateSsh(data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/ssh`, data);\r\n }\r\n\r\n async listSshKey(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/ssh/key`);\r\n }\r\n\r\n async addSshKey(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/ssh/key`, data);\r\n }\r\n\r\n async updateSshKey(keyId: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/ssh/key/${enc(keyId)}`, data);\r\n }\r\n\r\n async deleteSshKey(keyId: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/ssh/key/${enc(keyId)}`);\r\n }\r\n\r\n // ================================================================\r\n // ログ\r\n // ================================================================\r\n\r\n async getAccessLog(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/access-log`, params);\r\n }\r\n\r\n async getErrorLog(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/error-log`, params);\r\n }\r\n\r\n // ================================================================\r\n // APIキー情報\r\n // ================================================================\r\n\r\n async getMe(): Promise<unknown> {\r\n return this.get('/v1/me');\r\n }\r\n\r\n // ================================================================\r\n // HTTP 基盤\r\n // ================================================================\r\n\r\n async get(path: string, params?: Record<string, string>): Promise<unknown> {\r\n let url = `${this.apiBase}${path}`;\r\n if (params && Object.keys(params).length > 0) {\r\n url += '?' + new URLSearchParams(params).toString();\r\n }\r\n return this.request('GET', url);\r\n }\r\n\r\n async post(path: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.request('POST', `${this.apiBase}${path}`, data);\r\n }\r\n\r\n async put(path: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.request('PUT', `${this.apiBase}${path}`, data);\r\n }\r\n\r\n async delete(path: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.request('DELETE', `${this.apiBase}${path}`, data);\r\n }\r\n\r\n private async request(method: string, url: string, body?: Record<string, unknown>): Promise<unknown> {\r\n const headers: Record<string, string> = {\r\n 'Authorization': `Bearer ${this.apiKey}`,\r\n 'Accept': 'application/json',\r\n };\r\n\r\n const init: RequestInit = {\r\n method,\r\n headers,\r\n signal: AbortSignal.timeout(DEFAULT_TIMEOUT_MS),\r\n };\r\n\r\n if (body && method !== 'GET') {\r\n headers['Content-Type'] = 'application/json';\r\n init.body = JSON.stringify(body);\r\n }\r\n\r\n if (this.debug) {\r\n const dbg = (msg: string) => process.stderr.write(`[DEBUG] ${msg}\\n`);\r\n dbg(`${method} ${url}`);\r\n if (init.body) dbg(`Body: ${init.body as string}`);\r\n }\r\n\r\n let response: Response;\r\n try {\r\n response = await fetch(url, init);\r\n } catch (err) {\r\n throw new Error(`通信エラー: ${err instanceof Error ? err.message : String(err)}`);\r\n }\r\n\r\n if (this.debug) {\r\n const dbg = (msg: string) => process.stderr.write(`[DEBUG] ${msg}\\n`);\r\n dbg(`HTTP ${response.status} ${response.statusText}`);\r\n const debugHeaders = ['x-ratelimit-limit', 'x-ratelimit-remaining', 'x-ratelimit-reset', 'x-concurrent-limit', 'x-concurrent-remaining', 'content-type'];\r\n for (const h of debugHeaders) {\r\n const v = response.headers.get(h);\r\n if (v !== null) dbg(` ${h}: ${v}`);\r\n }\r\n }\r\n\r\n const rateLimitHeader = response.headers.get('x-ratelimit-limit');\r\n if (rateLimitHeader) {\r\n this.lastRateLimit = {\r\n limit: parseInt(rateLimitHeader, 10),\r\n remaining: parseInt(response.headers.get('x-ratelimit-remaining') || '0', 10),\r\n reset: parseInt(response.headers.get('x-ratelimit-reset') || '0', 10),\r\n };\r\n }\r\n\r\n const text = await response.text();\r\n let data: unknown;\r\n try {\r\n data = JSON.parse(text);\r\n } catch {\r\n if (this.debug) {\r\n process.stderr.write(`[DEBUG] Raw response: ${text.substring(0, 500)}\\n`);\r\n }\r\n throw new ApiError(`Response parse error (HTTP ${response.status})`, response.status, 'PARSE_ERROR', []);\r\n }\r\n\r\n if (!response.ok) {\r\n const err = data as { error?: { code?: string; message?: string; errors?: string[] } };\r\n const errorCode = err?.error?.code || 'UNKNOWN_ERROR';\r\n const errorMessage = err?.error?.message || 'エラーが発生しました';\r\n const errors = err?.error?.errors || [];\r\n throw new ApiError(errorMessage, response.status, errorCode, errors);\r\n }\r\n\r\n return data;\r\n }\r\n}\r\n\r\nfunction enc(s: string): string {\r\n return encodeURIComponent(s);\r\n}\r\n","import { Command } from 'commander';\r\nimport { password } from '@inquirer/prompts';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiClient, ApiError } from 'xnp-shared';\r\nimport { loadConfig, saveConfig } from '../../lib/config.js';\r\nimport { getFormat, printResult } from '../../lib/command-helper.js';\r\n\r\nfunction maskApiKey(apiKey: string): string {\r\n return `${apiKey.substring(0, 8)}...`;\r\n}\r\n\r\nexport function registerAuthCommands(program: Command, brand: BrandConfig): void {\r\n const auth = program\r\n .command('auth')\r\n .description('認証設定');\r\n\r\n auth\r\n .command('login')\r\n .description('APIキーを設定(サーバー名は自動検出)')\r\n .option('--api-key <key>', 'APIキー')\r\n .option('--servername <name>', 'サーバー名(自動検出を上書き)')\r\n .action(async (opts: { apiKey?: string; servername?: string }, cmd: Command) => {\r\n const profileName: string = (cmd.optsWithGlobals().profile as string | undefined) ?? 'default';\r\n let apiKey = opts.apiKey;\r\n let servername = opts.servername;\r\n\r\n if (!apiKey) {\r\n apiKey = await password({ message: 'APIキーを入力:', mask: true });\r\n }\r\n if (!apiKey) {\r\n console.error('エラー: APIキーは必須です');\r\n process.exit(1);\r\n }\r\n\r\n console.error('認証情報を検証中...');\r\n const client = new ApiClient({ apiKey, apiBase: brand.apiBase });\r\n let meData: Record<string, unknown>;\r\n try {\r\n meData = await client.getMe() as Record<string, unknown>;\r\n } catch (err) {\r\n if (err instanceof ApiError && err.errorCode === 'UNAUTHORIZED') {\r\n console.error('エラー: APIキーが無効です。正しいAPIキーを指定してください。');\r\n process.exit(1);\r\n }\r\n throw err;\r\n }\r\n console.error('✓ 認証に成功しました');\r\n\r\n if (!servername && meData.servername) {\r\n servername = meData.servername as string;\r\n console.error(` サーバー名を自動検出しました: ${servername}`);\r\n }\r\n\r\n const config = loadConfig(brand);\r\n config.profiles[profileName] = {\r\n apiKey,\r\n ...(servername ? { servername } : {}),\r\n };\r\n if (!config.defaultProfile) {\r\n config.defaultProfile = profileName;\r\n }\r\n saveConfig(brand, config);\r\n\r\n console.error(`✓ プロファイル \"${profileName}\" を保存しました`);\r\n console.error(` 設定ファイル: ~/.config/${brand.configDir}/config.json`);\r\n });\r\n\r\n auth\r\n .command('status')\r\n .description('現在の認証状態を表示')\r\n .action((_opts: Record<string, unknown>, cmd: Command) => {\r\n const format = getFormat(cmd);\r\n const config = loadConfig(brand);\r\n const profileName = (cmd.optsWithGlobals().profile as string | undefined) || config.defaultProfile || 'default';\r\n const profile = config.profiles[profileName];\r\n\r\n if (!profile) {\r\n if (format === 'json') {\r\n printResult({\r\n authenticated: false,\r\n profile: profileName,\r\n message: `プロファイル \"${profileName}\" が見つかりません`,\r\n }, format);\r\n } else {\r\n console.error(`プロファイル \"${profileName}\" が見つかりません`);\r\n console.error(`\\`${brand.commandName} auth login\\` で認証設定を行ってください`);\r\n }\r\n process.exit(1);\r\n }\r\n\r\n if (format === 'json') {\r\n printResult({\r\n authenticated: true,\r\n profile: profileName,\r\n api_key: maskApiKey(profile.apiKey),\r\n servername: profile.servername ?? null,\r\n api_base: brand.apiBase,\r\n }, format);\r\n return;\r\n }\r\n\r\n console.log(`プロファイル: ${profileName}`);\r\n console.log(`APIキー: ${maskApiKey(profile.apiKey)}`);\r\n if (profile.servername) {\r\n console.log(`サーバー名: ${profile.servername}`);\r\n }\r\n console.log(`APIエンドポイント: ${brand.apiBase}`);\r\n });\r\n\r\n auth\r\n .command('profiles')\r\n .description('プロファイル一覧を表示')\r\n .action((_opts: Record<string, unknown>, cmd: Command) => {\r\n const format = getFormat(cmd);\r\n const config = loadConfig(brand);\r\n const profiles = Object.keys(config.profiles);\r\n\r\n if (profiles.length === 0) {\r\n if (format === 'json') {\r\n printResult({\r\n default_profile: config.defaultProfile || null,\r\n profiles: [],\r\n message: 'プロファイルが見つかりません',\r\n }, format);\r\n } else {\r\n console.error('プロファイルが見つかりません');\r\n console.error(`\\`${brand.commandName} auth login\\` で認証設定を行ってください`);\r\n }\r\n process.exit(1);\r\n }\r\n\r\n const rows = profiles.map((name) => {\r\n const p = config.profiles[name]!;\r\n return {\r\n name,\r\n default: name === config.defaultProfile,\r\n api_key: maskApiKey(p.apiKey),\r\n servername: p.servername ?? null,\r\n };\r\n });\r\n\r\n if (format === 'json') {\r\n printResult({\r\n default_profile: config.defaultProfile || null,\r\n profiles: rows,\r\n }, format);\r\n return;\r\n }\r\n\r\n for (const name of profiles) {\r\n const marker = name === config.defaultProfile ? ' (default)' : '';\r\n const p = config.profiles[name]!;\r\n const key = maskApiKey(p.apiKey);\r\n const sv = p.servername ? ` servername=${p.servername}` : '';\r\n console.log(`${name}${marker}: key=${key}${sv}`);\r\n }\r\n });\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport os from 'node:os';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport type { AppConfig, Profile } from '../types.js';\r\n\r\nfunction getConfigDir(brand: BrandConfig): string {\r\n const home = os.homedir();\r\n return path.join(home, '.config', brand.configDir);\r\n}\r\n\r\nfunction getConfigPath(brand: BrandConfig): string {\r\n return path.join(getConfigDir(brand), 'config.json');\r\n}\r\n\r\nexport function loadConfig(brand: BrandConfig): AppConfig {\r\n const configPath = getConfigPath(brand);\r\n if (!fs.existsSync(configPath)) {\r\n return { defaultProfile: 'default', profiles: {} };\r\n }\r\n const raw = fs.readFileSync(configPath, 'utf-8');\r\n return JSON.parse(raw) as AppConfig;\r\n}\r\n\r\nexport function saveConfig(brand: BrandConfig, config: AppConfig): void {\r\n const configDir = getConfigDir(brand);\r\n fs.mkdirSync(configDir, { recursive: true });\r\n const configPath = getConfigPath(brand);\r\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\r\n}\r\n\r\nexport function getActiveProfile(brand: BrandConfig, profileName?: string): Profile | null {\r\n const envPrefix = brand.brand.toUpperCase();\r\n const envApiKey = process.env[`${envPrefix}_API_KEY`] || process.env['XSERVER_API_KEY'];\r\n const envServername = process.env[`${envPrefix}_SERVERNAME`] || process.env['XSERVER_SERVERNAME'];\r\n\r\n if (envApiKey) {\r\n return {\r\n apiKey: envApiKey,\r\n servername: envServername,\r\n };\r\n }\r\n\r\n const config = loadConfig(brand);\r\n const name = profileName || config.defaultProfile || 'default';\r\n return config.profiles[name] || null;\r\n}\r\n","import type { Command } from 'commander';\r\nimport { confirm } from '@inquirer/prompts';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiClient } from 'xnp-shared';\r\nimport { getActiveProfile } from './config.js';\r\nimport { formatOutput, type OutputFormat } from './output.js';\r\n\r\nfunction findRoot(cmd: Command): Command {\r\n let root = cmd;\r\n while (root.parent) root = root.parent;\r\n return root;\r\n}\r\n\r\nexport function resolveClient(cmd: Command, brand: BrandConfig): ApiClient {\r\n const root = findRoot(cmd);\r\n const rootOpts = root.opts();\r\n const profile = getActiveProfile(brand, rootOpts.profile as string);\r\n if (!profile) {\r\n console.error(`認証設定が見つかりません。\\`${brand.commandName} auth login\\` を実行してください。`);\r\n process.exit(1);\r\n }\r\n\r\n const debug = !!(rootOpts.debug || process.env.XSERVER_DEBUG === '1');\r\n const servername = resolveServername(cmd) ?? profile.servername;\r\n return new ApiClient({\r\n apiKey: profile.apiKey,\r\n apiBase: brand.apiBase,\r\n servername,\r\n debug,\r\n });\r\n}\r\n\r\nfunction resolveServername(cmd: Command): string | undefined {\r\n let current: Command | null = cmd;\r\n while (current) {\r\n const val = current.opts()?.servername as string | undefined;\r\n if (val) return val;\r\n current = current.parent;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getFormat(cmd: Command): OutputFormat {\r\n const root = findRoot(cmd);\r\n return (root.opts().format as OutputFormat) || 'table';\r\n}\r\n\r\nexport function printResult(data: unknown, format: OutputFormat): void {\r\n console.log(formatOutput(data, format));\r\n}\r\n\r\nexport async function confirmDestructiveAction(cmd: Command, message: string): Promise<void> {\r\n const root = findRoot(cmd);\r\n if (root.opts().yes || process.argv.includes('--yes') || process.argv.includes('-y')) return;\r\n\r\n const ok = await confirm({ message, default: false });\r\n if (!ok) {\r\n console.error('キャンセルしました');\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport function pickDefined(obj: Record<string, unknown>): Record<string, unknown> {\r\n const result: Record<string, unknown> = {};\r\n for (const [key, value] of Object.entries(obj)) {\r\n if (value !== undefined) result[key] = value;\r\n }\r\n return result;\r\n}\r\n","export type OutputFormat = 'json' | 'table';\r\n\r\nexport function formatOutput(data: unknown, format: OutputFormat): string {\r\n if (format === 'json') {\r\n return JSON.stringify(data, null, 2);\r\n }\r\n return formatTable(data);\r\n}\r\n\r\nfunction formatTable(data: unknown): string {\r\n if (data === null || data === undefined) {\r\n return '(データなし)';\r\n }\r\n\r\n if (Array.isArray(data)) {\r\n if (data.length === 0) return '(データなし)';\r\n return renderArrayTable(data as Record<string, unknown>[]);\r\n }\r\n\r\n if (typeof data === 'object') {\r\n const obj = data as Record<string, unknown>;\r\n const arrayEntry = Object.entries(obj).find(\r\n ([, v]) => Array.isArray(v) && (v.length === 0 || (typeof v[0] === 'object' && v[0] !== null)),\r\n );\r\n if (arrayEntry) {\r\n const scalarEntries = Object.entries(obj).filter(([k]) => k !== arrayEntry[0]);\r\n const parts: string[] = [];\r\n if (scalarEntries.length > 0) {\r\n parts.push(renderKeyValueTable(Object.fromEntries(scalarEntries)));\r\n parts.push('');\r\n }\r\n parts.push(renderArrayTable(arrayEntry[1] as Record<string, unknown>[]));\r\n return parts.join('\\n');\r\n }\r\n return renderKeyValueTable(obj);\r\n }\r\n\r\n return String(data);\r\n}\r\n\r\nfunction renderKeyValueTable(obj: Record<string, unknown>): string {\r\n const entries = Object.entries(obj).map(([key, value]) => ({\r\n key,\r\n value: formatValue(value),\r\n }));\r\n\r\n const maxKeyLen = Math.max(...entries.map(e => displayWidth(e.key)));\r\n const lines = entries.map(e => `${padRight(e.key, maxKeyLen)} ${e.value}`);\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction renderArrayTable(items: Record<string, unknown>[]): string {\r\n if (items.length === 0) return '(データなし)';\r\n\r\n const keys = Object.keys(items[0]!);\r\n\r\n const colWidths = keys.map(key => {\r\n const headerWidth = displayWidth(key);\r\n const maxDataWidth = Math.max(\r\n ...items.map(item => displayWidth(formatValue(item[key]))),\r\n );\r\n return Math.max(headerWidth, maxDataWidth);\r\n });\r\n\r\n const header = keys.map((key, i) => padRight(key, colWidths[i]!)).join(' ');\r\n const separator = colWidths.map(w => '-'.repeat(w)).join(' ');\r\n const rows = items.map(item =>\r\n keys.map((key, i) => padRight(formatValue(item[key]), colWidths[i]!)).join(' '),\r\n );\r\n\r\n return [header, separator, ...rows].join('\\n');\r\n}\r\n\r\nfunction formatValue(value: unknown): string {\r\n if (value === null || value === undefined) return '-';\r\n if (typeof value === 'object') return JSON.stringify(value);\r\n return String(value);\r\n}\r\n\r\nfunction displayWidth(str: string): number {\r\n let width = 0;\r\n for (const char of str) {\r\n const code = char.codePointAt(0)!;\r\n if (\r\n (code >= 0x1100 && code <= 0x115f) ||\r\n (code >= 0x2e80 && code <= 0xa4cf) ||\r\n (code >= 0xac00 && code <= 0xd7af) ||\r\n (code >= 0xf900 && code <= 0xfaff) ||\r\n (code >= 0xfe10 && code <= 0xfe6f) ||\r\n (code >= 0xff01 && code <= 0xff60) ||\r\n (code >= 0xffe0 && code <= 0xffe6) ||\r\n (code >= 0x20000 && code <= 0x2fffd) ||\r\n (code >= 0x30000 && code <= 0x3fffd)\r\n ) {\r\n width += 2;\r\n } else {\r\n width += 1;\r\n }\r\n }\r\n return width;\r\n}\r\n\r\nfunction padRight(str: string, targetWidth: number): string {\r\n const currentWidth = displayWidth(str);\r\n const padding = Math.max(0, targetWidth - currentWidth);\r\n return str + ' '.repeat(padding);\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../lib/command-helper.js';\r\n\r\nexport function registerServerInfoCommands(parent: Command, brand: BrandConfig): void {\r\n parent\r\n .command('info')\r\n .description('サーバー情報を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getServerInfo(), getFormat(parent));\r\n });\r\n\r\n parent\r\n .command('usage')\r\n .description('サーバー利用状況を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getServerUsage(), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerCronCommands(parent: Command, brand: BrandConfig): void {\r\n const cron = parent\r\n .command('cron')\r\n .description('Cron設定');\r\n\r\n cron\r\n .command('list')\r\n .description('Cron一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listCron(), getFormat(parent));\r\n });\r\n\r\n cron\r\n .command('add')\r\n .description('Cronを新規追加')\r\n .requiredOption('--minute <value>', '分(例: */5, 0, *)')\r\n .requiredOption('--hour <value>', '時(例: *, 3, 0-6)')\r\n .requiredOption('--command <value>', '実行コマンド')\r\n .option('--day <value>', '日', '*')\r\n .option('--month <value>', '月', '*')\r\n .option('--weekday <value>', '曜日', '*')\r\n .option('--comment <value>', 'メモ')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n minute: opts.minute, hour: opts.hour, day: opts.day,\r\n month: opts.month, weekday: opts.weekday, command: opts.command,\r\n comment: opts.comment,\r\n });\r\n printResult(await client.addCron(data), getFormat(parent));\r\n });\r\n\r\n cron\r\n .command('update <cronId>')\r\n .description('Cronを更新')\r\n .option('--minute <value>', '分')\r\n .option('--hour <value>', '時')\r\n .option('--day <value>', '日')\r\n .option('--month <value>', '月')\r\n .option('--weekday <value>', '曜日')\r\n .option('--command <value>', '実行コマンド')\r\n .option('--comment <value>', 'メモ')\r\n .option('--enabled <value>', '有効/無効 (true/false)')\r\n .action(async (cronId: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n minute: opts.minute, hour: opts.hour, day: opts.day,\r\n month: opts.month, weekday: opts.weekday, command: opts.command,\r\n comment: opts.comment,\r\n });\r\n if (opts.enabled !== undefined) data.enabled = opts.enabled === 'true';\r\n printResult(await client.updateCron(cronId, data), getFormat(parent));\r\n });\r\n\r\n cron\r\n .command('delete <cronId>')\r\n .description('Cronを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (cronId: string) => {\r\n await confirmDestructiveAction(parent, `Cron \"${cronId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteCron(cronId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerWpCommands(parent: Command, brand: BrandConfig): void {\r\n const wp = parent\r\n .command('wp')\r\n .description('WordPress簡単インストール');\r\n\r\n wp\r\n .command('list')\r\n .description('WordPress一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listWordpress(params), getFormat(parent));\r\n });\r\n\r\n wp\r\n .command('add')\r\n .description('WordPressを新規インストール')\r\n .requiredOption('--url <url>', 'インストール先URL(例: example.com/blog)')\r\n .requiredOption('--title <title>', 'サイトタイトル')\r\n .requiredOption('--admin-username <username>', '管理者ユーザー名')\r\n .requiredOption('--admin-password <password>', '管理者パスワード')\r\n .requiredOption('--admin-email <email>', '管理者メールアドレス')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n url: opts.url, title: opts.title,\r\n admin_username: opts.adminUsername, admin_password: opts.adminPassword,\r\n admin_email: opts.adminEmail, memo: opts.memo,\r\n });\r\n printResult(await client.addWordpress(data), getFormat(parent));\r\n });\r\n\r\n wp\r\n .command('update <wpId>')\r\n .description('WordPress設定を変更')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (wpId: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateWordpress(wpId, pickDefined({ memo: opts.memo })), getFormat(parent));\r\n });\r\n\r\n wp\r\n .command('delete <wpId>')\r\n .description('WordPressを削除')\r\n .option('--delete-db <value>', '関連するMySQLデータベースも削除するか(デフォルト: true)')\r\n .option('--delete-db-user <value>', '関連するMySQLユーザーも削除するか(デフォルト: false)')\r\n .option('--delete-cron <value>', 'キャッシュ自動削除Cronも削除するか(デフォルト: true)')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (wpId: string, opts) => {\r\n await confirmDestructiveAction(parent, `WordPress \"${wpId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n delete_db: opts.deleteDb !== undefined ? opts.deleteDb === 'true' : undefined,\r\n delete_db_user: opts.deleteDbUser !== undefined ? opts.deleteDbUser === 'true' : undefined,\r\n delete_cron: opts.deleteCron !== undefined ? opts.deleteCron === 'true' : undefined,\r\n });\r\n printResult(await client.deleteWordpress(wpId, data), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerMailCommands(parent: Command, brand: BrandConfig): void {\r\n const mail = parent\r\n .command('mail')\r\n .description('メールアカウント設定');\r\n\r\n mail\r\n .command('list')\r\n .description('メールアカウント一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listMail(params), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('get <mailAccount>')\r\n .description('メールアカウント詳細を取得')\r\n .action(async (mailAccount: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getMail(mailAccount), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('add <mailAddress>')\r\n .description('メールアカウントを新規追加')\r\n .requiredOption('--password <password>', 'パスワード')\r\n .option('--quota-mb <mb>', '容量(MB)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (mailAddress: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n mail_address: mailAddress, password: opts.password,\r\n quota_mb: opts.quotaMb !== undefined ? parseInt(opts.quotaMb, 10) : undefined,\r\n memo: opts.memo,\r\n });\r\n printResult(await client.addMail(data), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('update <mailAccount>')\r\n .description('メールアカウント設定を変更')\r\n .option('--password <password>', 'パスワード')\r\n .option('--quota-mb <mb>', '容量(MB)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (mailAccount: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateMail(mailAccount, pickDefined({\r\n password: opts.password,\r\n quota_mb: opts.quotaMb !== undefined ? parseInt(opts.quotaMb, 10) : undefined,\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('delete <mailAccount>')\r\n .description('メールアカウントを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (mailAccount: string) => {\r\n await confirmDestructiveAction(parent, `メールアカウント \"${mailAccount}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteMail(mailAccount), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('forwarding-get <mailAccount>')\r\n .description('メール転送設定を取得')\r\n .action(async (mailAccount: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getMailForwarding(mailAccount), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('forwarding-update <mailAccount>')\r\n .description('メール転送設定を更新')\r\n .option('--forwarding-addresses <addresses>', '転送先アドレス(カンマ区切り)')\r\n .option('--keep-in-mailbox <value>', '転送後もメールボックスに残すか(true/false)')\r\n .action(async (mailAccount: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {};\r\n if (opts.forwardingAddresses) data.forwarding_addresses = opts.forwardingAddresses.split(',').map((a: string) => a.trim());\r\n if (opts.keepInMailbox !== undefined) data.keep_in_mailbox = opts.keepInMailbox === 'true';\r\n printResult(await client.updateMailForwarding(mailAccount, data), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerMailFilterCommands(parent: Command, brand: BrandConfig): void {\r\n const mailFilter = parent\r\n .command('mail-filter')\r\n .description('メール振り分け設定');\r\n\r\n mailFilter\r\n .command('list')\r\n .description('メール振り分け設定の一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listMailFilter(params), getFormat(parent));\r\n });\r\n\r\n mailFilter\r\n .command('add')\r\n .description('メール振り分け設定を新規追加')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .requiredOption('--condition-keyword <keyword>', '条件キーワード')\r\n .requiredOption('--condition-field <field>', '条件対象(subject / from / to / body / header)')\r\n .option('--condition-match-type <type>', '一致条件(contain / match / start_from。デフォルト: contain)')\r\n .requiredOption('--action-type <type>', 'アクション種別(mail_address / spam_folder / trash / delete)')\r\n .option('--action-target <target>', '転送先メールアドレス(action-typeがmail_addressの場合)')\r\n .option('--action-method <method>', '処理方法(move / copy。デフォルト: move)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {\r\n domain: opts.domain,\r\n conditions: [{\r\n keyword: opts.conditionKeyword,\r\n field: opts.conditionField,\r\n match_type: opts.conditionMatchType || 'contain',\r\n }],\r\n action: {\r\n type: opts.actionType,\r\n target: opts.actionTarget || '',\r\n method: opts.actionMethod || 'move',\r\n },\r\n };\r\n printResult(await client.addMailFilter(data), getFormat(parent));\r\n });\r\n\r\n mailFilter\r\n .command('delete <filterId>')\r\n .description('メール振り分け設定を削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (filterId: string) => {\r\n await confirmDestructiveAction(parent, `メール振り分け設定 \"${filterId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteMailFilter(filterId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerFtpCommands(parent: Command, brand: BrandConfig): void {\r\n const ftp = parent\r\n .command('ftp')\r\n .description('FTPアカウント設定');\r\n\r\n ftp\r\n .command('list')\r\n .description('FTPアカウント一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listFtp(params), getFormat(parent));\r\n });\r\n\r\n ftp\r\n .command('add <ftpAccount>')\r\n .description('FTPアカウントを新規追加')\r\n .requiredOption('--password <password>', 'パスワード')\r\n .option('--directory <dir>', 'ディレクトリ')\r\n .option('--quota <mb>', '容量制限(MB。0で無制限)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (ftpAccount: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n ftp_account: ftpAccount, password: opts.password,\r\n directory: opts.directory, quota_mb: opts.quota !== undefined ? parseInt(opts.quota, 10) : undefined,\r\n memo: opts.memo,\r\n });\r\n printResult(await client.addFtp(data), getFormat(parent));\r\n });\r\n\r\n ftp\r\n .command('update <ftpAccount>')\r\n .description('FTPアカウント設定を変更')\r\n .option('--password <password>', 'パスワード')\r\n .option('--directory <dir>', 'ディレクトリ')\r\n .option('--quota <mb>', '容量制限(MB)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (ftpAccount: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateFtp(ftpAccount, pickDefined({\r\n password: opts.password, directory: opts.directory,\r\n quota_mb: opts.quota !== undefined ? parseInt(opts.quota, 10) : undefined,\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n ftp\r\n .command('delete <ftpAccount>')\r\n .description('FTPアカウントを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (ftpAccount: string) => {\r\n await confirmDestructiveAction(parent, `FTPアカウント \"${ftpAccount}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteFtp(ftpAccount), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerDbCommands(parent: Command, brand: BrandConfig): void {\r\n const db = parent\r\n .command('db')\r\n .description('MySQL設定');\r\n\r\n db\r\n .command('list')\r\n .description('データベース一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listDb(), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('add <nameSuffix>')\r\n .description('データベースを新規作成')\r\n .option('--character-set <charset>', '文字コード(utf8mb4 / UTF-8 / EUC-JP / SHIFT-JIS / Binary。デフォルト: utf8mb4)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (nameSuffix: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addDb(pickDefined({\r\n name_suffix: nameSuffix, character_set: opts.characterSet, memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('update <dbName>')\r\n .description('データベースのメモを更新')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (dbName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDb(dbName, pickDefined({\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('delete <dbName>')\r\n .description('データベースを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (dbName: string) => {\r\n await confirmDestructiveAction(parent, `データベース \"${dbName}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteDb(dbName), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('user-list')\r\n .description('MySQLユーザー一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listDbUser(), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('user-add <nameSuffix>')\r\n .description('MySQLユーザーを新規作成')\r\n .requiredOption('--password <password>', 'パスワード')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (nameSuffix: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addDbUser(pickDefined({\r\n name_suffix: nameSuffix, password: opts.password, memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('user-update <dbUser>')\r\n .description('MySQLユーザー設定を変更')\r\n .option('--password <password>', 'パスワード')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (dbUser: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDbUser(dbUser, pickDefined({\r\n password: opts.password, memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('user-delete <dbUser>')\r\n .description('MySQLユーザーを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (dbUser: string) => {\r\n await confirmDestructiveAction(parent, `MySQLユーザー \"${dbUser}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteDbUser(dbUser), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('grant-list <dbUser>')\r\n .description('MySQLユーザーの権限一覧を取得')\r\n .action(async (dbUser: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listDbUserGrant(dbUser), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('grant-add <dbUser>')\r\n .description('MySQLユーザーに権限を追加')\r\n .requiredOption('--db-name <dbName>', '対象データベース名')\r\n .action(async (dbUser: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addDbUserGrant(dbUser, { db_name: opts.dbName }), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('grant-delete <dbUser>')\r\n .description('MySQLユーザーの権限を削除')\r\n .requiredOption('--db-name <dbName>', '対象データベース名')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (dbUser: string, opts) => {\r\n await confirmDestructiveAction(parent, `MySQLユーザー \"${dbUser}\" のデータベース \"${opts.dbName}\" への権限を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteDbUserGrant(dbUser, { db_name: opts.dbName }), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nexport function registerPhpVersionCommands(parent: Command, brand: BrandConfig): void {\r\n const phpVer = parent\r\n .command('php-version')\r\n .description('PHPバージョン設定');\r\n\r\n phpVer\r\n .command('get')\r\n .description('PHPバージョン確認')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.getPhpVersion(params), getFormat(parent));\r\n });\r\n\r\n phpVer\r\n .command('update <domain>')\r\n .description('PHPバージョンを変更')\r\n .requiredOption('--php <version>', 'PHPバージョン(例: 8.2)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updatePhpVersion(domain, { version: opts.php }), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerServerDomainCommands(parent: Command, brand: BrandConfig): void {\r\n const domain = parent\r\n .command('domain')\r\n .description('ドメイン設定');\r\n\r\n domain\r\n .command('list')\r\n .description('ドメイン設定一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listDomain(), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('get <domain>')\r\n .description('ドメイン設定詳細を取得')\r\n .action(async (domainName: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getDomain(domainName), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('add <domain>')\r\n .description('ドメイン設定を新規追加')\r\n .option('--ssl <value>', 'SSL設定(デフォルト: true)')\r\n .option('--redirect-https <value>', 'HTTPS転送設定(デフォルト: sslと同じ値)')\r\n .option('--ai-crawler-block <value>', 'AIクローラー遮断設定(デフォルト: true)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (domainName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = { domain: domainName };\r\n if (opts.ssl !== undefined) data.ssl = opts.ssl === 'true';\r\n if (opts.redirectHttps !== undefined) data.redirect_https = opts.redirectHttps === 'true';\r\n if (opts.aiCrawlerBlock !== undefined) data.ai_crawler_block_enabled = opts.aiCrawlerBlock === 'true';\r\n if (opts.memo !== undefined) data.memo = opts.memo;\r\n printResult(await client.addDomain(data), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('update <domain>')\r\n .description('ドメイン設定を変更')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (domainName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDomain(domainName, pickDefined({\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('delete <domain>')\r\n .description('ドメイン設定を削除')\r\n .option('--delete-files', 'ユーザー公開領域のドメインディレクトリも削除する')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (domainName: string, opts) => {\r\n const suffix = opts.deleteFiles ? '(関連ファイルも削除します)' : '';\r\n await confirmDestructiveAction(parent, `ドメイン設定 \"${domainName}\" を削除します${suffix}。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {};\r\n if (opts.deleteFiles) data.delete_files = true;\r\n printResult(await client.deleteDomain(domainName, data), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('reset <domain>')\r\n .description('ドメイン設定を初期化')\r\n .requiredOption('--type <type>', 'リセット種別(all: 全初期化 / web: Web領域のみ / other: Web以外)')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (domainName: string, opts) => {\r\n await confirmDestructiveAction(parent, `ドメイン設定 \"${domainName}\" を \"${opts.type}\" で初期化します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.resetDomain(domainName, { type: opts.type }), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerSubdomainCommands(parent: Command, brand: BrandConfig): void {\r\n const subdomain = parent\r\n .command('subdomain')\r\n .description('サブドメイン設定');\r\n\r\n subdomain\r\n .command('list')\r\n .description('サブドメイン設定一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listSubdomain(params), getFormat(parent));\r\n });\r\n\r\n subdomain\r\n .command('add <subdomain>')\r\n .description('サブドメインを新規追加')\r\n .option('--document-root-type <type>', 'ドキュメントルート種別(subdomain_only: /public_html/sub, full_subdomain: /public_html/sub.example.com)')\r\n .option('--ssl <value>', 'SSL設定(デフォルト: true)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (subdomainName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = { subdomain: subdomainName };\r\n if (opts.documentRootType !== undefined) data.document_root_type = opts.documentRootType;\r\n if (opts.ssl !== undefined) data.ssl = opts.ssl === 'true';\r\n if (opts.memo !== undefined) data.memo = opts.memo;\r\n printResult(await client.addSubdomain(data), getFormat(parent));\r\n });\r\n\r\n subdomain\r\n .command('update <subdomain>')\r\n .description('サブドメインのメモを更新')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (subdomainName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateSubdomain(subdomainName, pickDefined({\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n subdomain\r\n .command('delete <subdomain>')\r\n .description('サブドメインを削除')\r\n .option('--delete-files', '関連ファイルも削除する')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (subdomainName: string, opts) => {\r\n const suffix = opts.deleteFiles ? '(関連ファイルも削除します)' : '';\r\n await confirmDestructiveAction(parent, `サブドメイン \"${subdomainName}\" を削除します${suffix}。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {};\r\n if (opts.deleteFiles) data.delete_files = true;\r\n printResult(await client.deleteSubdomain(subdomainName, data), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerSslCommands(parent: Command, brand: BrandConfig): void {\r\n const ssl = parent\r\n .command('ssl')\r\n .description('SSL設定');\r\n\r\n ssl\r\n .command('list')\r\n .description('SSL設定の一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listSsl(params), getFormat(parent));\r\n });\r\n\r\n ssl\r\n .command('install <commonName>')\r\n .description('無料SSLをインストール')\r\n .action(async (commonName: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.installSsl(pickDefined({\r\n common_name: commonName,\r\n })), getFormat(parent));\r\n });\r\n\r\n ssl\r\n .command('uninstall <commonName>')\r\n .description('無料SSLをアンインストール')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (commonName: string) => {\r\n await confirmDestructiveAction(parent, `無料SSL \"${commonName}\" をアンインストールします。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.uninstallSsl(commonName), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerDnsCommands(parent: Command, brand: BrandConfig): void {\r\n const dns = parent\r\n .command('dns')\r\n .description('DNSレコード設定');\r\n\r\n dns\r\n .command('list')\r\n .description('DNSレコード一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listDns(params), getFormat(parent));\r\n });\r\n\r\n dns\r\n .command('add')\r\n .description('DNSレコードを新規追加')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .requiredOption('--host <host>', 'ホスト名(@でapex)')\r\n .requiredOption('--type <type>', 'レコードタイプ(A / AAAA / CNAME / MX / TXT / SRV / CAA)')\r\n .requiredOption('--content <content>', 'レコード値')\r\n .option('--ttl <ttl>', 'TTL(60-86400。デフォルト: 3600)')\r\n .option('--priority <priority>', '優先度(MX/SRVレコード用)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addDns(pickDefined({\r\n domain: opts.domain, host: opts.host, type: opts.type,\r\n content: opts.content,\r\n ttl: opts.ttl !== undefined ? parseInt(opts.ttl, 10) : undefined,\r\n priority: opts.priority !== undefined ? parseInt(opts.priority, 10) : undefined,\r\n })), getFormat(parent));\r\n });\r\n\r\n dns\r\n .command('update <dnsId>')\r\n .description('DNSレコードを更新')\r\n .option('--domain <domain>', 'ドメイン')\r\n .option('--host <host>', 'ホスト名')\r\n .option('--type <type>', 'レコードタイプ')\r\n .option('--content <content>', 'レコード値')\r\n .option('--ttl <ttl>', 'TTL(60-86400)')\r\n .option('--priority <priority>', '優先度')\r\n .action(async (dnsId: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDns(dnsId, pickDefined({\r\n domain: opts.domain, host: opts.host, type: opts.type,\r\n content: opts.content,\r\n ttl: opts.ttl !== undefined ? parseInt(opts.ttl, 10) : undefined,\r\n priority: opts.priority !== undefined ? parseInt(opts.priority, 10) : undefined,\r\n })), getFormat(parent));\r\n });\r\n\r\n dns\r\n .command('delete <dnsId>')\r\n .description('DNSレコードを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (dnsId: string) => {\r\n await confirmDestructiveAction(parent, `DNSレコード \"${dnsId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteDns(dnsId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerSshCommands(parent: Command, brand: BrandConfig): void {\r\n const ssh = parent\r\n .command('ssh')\r\n .description('SSH設定');\r\n\r\n ssh\r\n .command('show')\r\n .description('SSH設定を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getSsh(), getFormat(parent));\r\n });\r\n\r\n ssh\r\n .command('update')\r\n .description('SSH設定を変更')\r\n .option('--ssh-enabled <value>', 'SSH接続の有効/無効(true/false)')\r\n .option('--abroad-access-restriction <value>', '国外アクセス制限の有効/無効(true/false)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {};\r\n if (opts.sshEnabled !== undefined) data.ssh_enabled = opts.sshEnabled === 'true';\r\n if (opts.abroadAccessRestriction !== undefined) data.abroad_access_restriction = opts.abroadAccessRestriction === 'true';\r\n printResult(await client.updateSsh(data), getFormat(parent));\r\n });\r\n\r\n const key = ssh\r\n .command('key')\r\n .description('SSH公開鍵管理');\r\n\r\n key\r\n .command('list')\r\n .description('SSH公開鍵一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listSshKey(), getFormat(parent));\r\n });\r\n\r\n key\r\n .command('add')\r\n .description('SSH公開鍵を登録')\r\n .option('--public-key <key>', '公開鍵(手動登録時)')\r\n .option('--generate', 'サーバー側で鍵ペアを自動生成')\r\n .option('--passphrase <value>', 'パスフレーズ(自動生成時)')\r\n .requiredOption('--label <value>', 'ラベル')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = { label: opts.label };\r\n if (opts.generate) {\r\n data.generate = true;\r\n if (opts.passphrase !== undefined) data.passphrase = opts.passphrase;\r\n } else {\r\n if (opts.publicKey) data.public_key = opts.publicKey;\r\n }\r\n printResult(await client.addSshKey(data), getFormat(parent));\r\n });\r\n\r\n key\r\n .command('update <keyId>')\r\n .description('SSH公開鍵を更新')\r\n .option('--label <value>', 'ラベル')\r\n .option('--status <value>', 'ステータス(on/off)')\r\n .action(async (keyId: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateSshKey(keyId, pickDefined({\r\n label: opts.label,\r\n status: opts.status,\r\n })), getFormat(parent));\r\n });\r\n\r\n key\r\n .command('delete <keyId>')\r\n .description('SSH公開鍵を削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (keyId: string) => {\r\n await confirmDestructiveAction(parent, `SSH公開鍵 \"${keyId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteSshKey(keyId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nexport function registerLogCommands(parent: Command, brand: BrandConfig): void {\r\n const log = parent\r\n .command('log')\r\n .description('ログ');\r\n\r\n log\r\n .command('access')\r\n .description('アクセスログを取得')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .option('--lines <n>', '取得行数')\r\n .option('--keyword <keyword>', 'キーワード検索')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = { domain: opts.domain };\r\n if (opts.lines) params.lines = opts.lines;\r\n if (opts.keyword) params.keyword = opts.keyword;\r\n printResult(await client.getAccessLog(params), getFormat(parent));\r\n });\r\n\r\n log\r\n .command('error')\r\n .description('エラーログを取得')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .option('--lines <n>', '取得行数')\r\n .option('--keyword <keyword>', 'キーワード検索')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = { domain: opts.domain };\r\n if (opts.lines) params.lines = opts.lines;\r\n if (opts.keyword) params.keyword = opts.keyword;\r\n printResult(await client.getErrorLog(params), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiClient } from 'xnp-shared';\r\nimport { getActiveProfile } from '../../lib/config.js';\r\nimport { getFormat, printResult } from '../../lib/command-helper.js';\r\n\r\nexport function registerMeCommand(program: Command, brand: BrandConfig): void {\r\n program\r\n .command('me')\r\n .description('現在のAPIキー情報を表示')\r\n .action(async (_opts: Record<string, unknown>, cmd: Command) => {\r\n const root = cmd.parent!;\r\n const rootOpts = root.opts();\r\n const profile = getActiveProfile(brand, rootOpts.profile as string);\r\n if (!profile) {\r\n console.error(`認証設定が見つかりません。\\`${brand.commandName} auth login\\` を実行してください。`);\r\n process.exit(1);\r\n }\r\n\r\n const debug = !!(rootOpts.debug || process.env.XSERVER_DEBUG === '1');\r\n const client = new ApiClient({\r\n apiKey: profile.apiKey,\r\n apiBase: brand.apiBase,\r\n servername: profile.servername,\r\n debug,\r\n });\r\n printResult(await client.getMe(), getFormat(cmd));\r\n });\r\n}\r\n","{\n \"name\": \"shincloud-cli\",\n \"version\": \"1.0.0\",\n \"description\": \"Official CLI for Shincloud API — manage your Shincloud hosting from the terminal\",\n \"type\": \"module\",\n \"bin\": {\n \"shincloud\": \"./dist/index.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"tsc\": \"tsc --noEmit\",\n \"prepublishOnly\": \"tsup\"\n },\n \"keywords\": [\n \"shincloud\",\n \"cli\",\n \"api\",\n \"hosting\",\n \"server\",\n \"webhosting\"\n ],\n \"author\": \"Xserver Inc.\",\n \"license\": \"MIT\",\n \"homepage\": \"https://developer.xserver.ne.jp\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^7.10.1\",\n \"commander\": \"^13.0.0\"\n },\n \"devDependencies\": {\n \"xnp-cli-core\": \"*\",\n \"xnp-shared\": \"*\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n }\n}\n","import { run } from 'xnp-cli-core';\r\nimport pkg from '../package.json' with { type: 'json' };\r\n\r\nrun({\r\n brand: 'shincloud',\r\n apiBase: 'https://api.shin-server.jp',\r\n displayName: 'シンクラウド API',\r\n commandName: 'shincloud',\r\n configDir: 'shincloud-cli',\r\n}, pkg.version);\r\n"],"mappings":"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","names":["path"]}
|
|
1
|
+
{"version":3,"sources":["../../core/src/index.ts","../../../shared/src/api-client.ts","../../core/src/commands/auth/login.ts","../../core/src/lib/config.ts","../../core/src/lib/command-helper.ts","../../core/src/lib/output.ts","../../core/src/commands/server/info.ts","../../core/src/commands/server/cron/index.ts","../../core/src/commands/server/wp/index.ts","../../core/src/commands/server/mail/index.ts","../../core/src/commands/server/mail-filter/index.ts","../../core/src/commands/server/ftp/index.ts","../../core/src/commands/server/db/index.ts","../../core/src/commands/server/php-version/index.ts","../../core/src/commands/server/domain/index.ts","../../core/src/commands/server/subdomain/index.ts","../../core/src/commands/server/ssl/index.ts","../../core/src/commands/server/dns/index.ts","../../core/src/commands/server/ssh/index.ts","../../core/src/commands/server/log/index.ts","../../core/src/commands/me/index.ts","../package.json","../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiError } from 'xnp-shared';\r\nimport { registerAuthCommands } from './commands/auth/login.js';\r\nimport { registerServerInfoCommands } from './commands/server/info.js';\r\nimport { registerCronCommands } from './commands/server/cron/index.js';\r\nimport { registerWpCommands } from './commands/server/wp/index.js';\r\nimport { registerMailCommands } from './commands/server/mail/index.js';\r\nimport { registerMailFilterCommands } from './commands/server/mail-filter/index.js';\r\nimport { registerFtpCommands } from './commands/server/ftp/index.js';\r\nimport { registerDbCommands } from './commands/server/db/index.js';\r\nimport { registerPhpVersionCommands } from './commands/server/php-version/index.js';\r\nimport { registerServerDomainCommands } from './commands/server/domain/index.js';\r\nimport { registerSubdomainCommands } from './commands/server/subdomain/index.js';\r\nimport { registerSslCommands } from './commands/server/ssl/index.js';\r\nimport { registerDnsCommands } from './commands/server/dns/index.js';\r\nimport { registerSshCommands } from './commands/server/ssh/index.js';\r\nimport { registerLogCommands } from './commands/server/log/index.js';\r\nimport { registerMeCommand } from './commands/me/index.js';\r\n\r\nexport type { BrandConfig } from 'xnp-shared';\r\n\r\nexport function run(brand: BrandConfig, version = '0.0.0'): void {\r\n const program = new Command();\r\n\r\n program\r\n .name(brand.commandName)\r\n .description(`${brand.displayName} CLI`)\r\n .version(version)\r\n .option('--format <format>', '出力形式 (json, table)', (value: string) => {\r\n if (!['json', 'table'].includes(value)) {\r\n throw new Error(`--format は json または table を指定してください(入力値: ${value})`);\r\n }\r\n return value;\r\n }, 'table')\r\n .option('--profile <name>', '使用するプロファイル')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .option('--debug', 'デバッグ出力を有効化(リクエストURL・レスポンスヘッダを表示)');\r\n\r\n registerAuthCommands(program, brand);\r\n registerMeCommand(program, brand);\r\n\r\n // サーバー管理API(/server/v1)\r\n const server = program\r\n .command('server')\r\n .description('サーバー管理API(WordPress・メール・DBなど)')\r\n .option('--servername <name>', 'サーバー名(プロファイルのデフォルトを上書き)');\r\n\r\n registerServerInfoCommands(server, brand);\r\n registerCronCommands(server, brand);\r\n registerSshCommands(server, brand);\r\n registerWpCommands(server, brand);\r\n registerMailCommands(server, brand);\r\n registerMailFilterCommands(server, brand);\r\n registerFtpCommands(server, brand);\r\n registerDbCommands(server, brand);\r\n registerPhpVersionCommands(server, brand);\r\n registerServerDomainCommands(server, brand);\r\n registerSubdomainCommands(server, brand);\r\n registerSslCommands(server, brand);\r\n registerDnsCommands(server, brand);\r\n registerLogCommands(server, brand);\r\n\r\n program.parseAsync(process.argv).catch((err: unknown) => {\r\n if (err instanceof ApiError) {\r\n console.error(`エラー [${err.errorCode}]: ${err.message}`);\r\n if (err.errors.length > 0) {\r\n for (const e of err.errors) {\r\n console.error(` - ${e}`);\r\n }\r\n }\r\n process.exit(1);\r\n }\r\n if (err instanceof Error) {\r\n console.error(`エラー: ${err.message}`);\r\n process.exit(1);\r\n }\r\n console.error('予期しないエラーが発生しました');\r\n process.exit(1);\r\n });\r\n}\r\n","const DEFAULT_TIMEOUT_MS = 30_000;\r\n\r\nexport interface ApiErrorDetail {\r\n code: string;\r\n message: string;\r\n errors: string[];\r\n httpStatus: number;\r\n}\r\n\r\nexport class ApiError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly httpStatus: number,\r\n public readonly errorCode: string,\r\n public readonly errors: string[],\r\n ) {\r\n super(message);\r\n this.name = 'ApiError';\r\n }\r\n}\r\n\r\nexport interface RateLimitInfo {\r\n limit: number;\r\n remaining: number;\r\n reset: number;\r\n}\r\n\r\nexport interface ApiClientOptions {\r\n apiKey: string;\r\n apiBase: string;\r\n servername?: string;\r\n debug?: boolean;\r\n}\r\n\r\nexport class ApiClient {\r\n private readonly apiBase: string;\r\n private readonly apiKey: string;\r\n private readonly servername?: string;\r\n private readonly debug: boolean;\r\n public lastRateLimit: RateLimitInfo | null = null;\r\n\r\n constructor(opts: ApiClientOptions) {\r\n this.apiBase = opts.apiBase.replace(/\\/+$/, '');\r\n this.apiKey = opts.apiKey;\r\n this.servername = opts.servername;\r\n this.debug = opts.debug ?? false;\r\n }\r\n\r\n private serverPath(): string {\r\n if (!this.servername) {\r\n throw new Error('サーバー名が設定されていません。');\r\n }\r\n return `/v1/server/${encodeURIComponent(this.servername)}`;\r\n }\r\n\r\n // ================================================================\r\n // サーバー情報\r\n // ================================================================\r\n\r\n async getServerInfo(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/server-info`);\r\n }\r\n\r\n async getServerUsage(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/server-info/usage`);\r\n }\r\n\r\n // ================================================================\r\n // Cron\r\n // ================================================================\r\n\r\n async listCron(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/cron`);\r\n }\r\n\r\n async addCron(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/cron`, data);\r\n }\r\n\r\n async updateCron(cronId: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/cron/${enc(cronId)}`, data);\r\n }\r\n\r\n async deleteCron(cronId: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/cron/${enc(cronId)}`);\r\n }\r\n\r\n // ================================================================\r\n // WordPress\r\n // ================================================================\r\n\r\n async listWordpress(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/wp`, params);\r\n }\r\n\r\n async addWordpress(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/wp`, data);\r\n }\r\n\r\n async updateWordpress(wpId: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/wp/${enc(wpId)}`, data);\r\n }\r\n\r\n async deleteWordpress(wpId: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/wp/${enc(wpId)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // メールアカウント\r\n // ================================================================\r\n\r\n async listMail(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mail`, params);\r\n }\r\n\r\n async getMail(mailAccount: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mail/${enc(mailAccount)}`);\r\n }\r\n\r\n async addMail(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/mail`, data);\r\n }\r\n\r\n async updateMail(mailAccount: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/mail/${enc(mailAccount)}`, data);\r\n }\r\n\r\n async deleteMail(mailAccount: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/mail/${enc(mailAccount)}`);\r\n }\r\n\r\n async getMailForwarding(mailAccount: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mail/${enc(mailAccount)}/forwarding`);\r\n }\r\n\r\n async updateMailForwarding(mailAccount: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/mail/${enc(mailAccount)}/forwarding`, data);\r\n }\r\n\r\n // ================================================================\r\n // メール振り分け\r\n // ================================================================\r\n\r\n async listMailFilter(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mail-filter`, params);\r\n }\r\n\r\n async addMailFilter(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/mail-filter`, data);\r\n }\r\n\r\n async deleteMailFilter(filterId: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/mail-filter/${enc(filterId)}`);\r\n }\r\n\r\n // ================================================================\r\n // FTP\r\n // ================================================================\r\n\r\n async listFtp(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/ftp`, params);\r\n }\r\n\r\n async addFtp(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/ftp`, data);\r\n }\r\n\r\n async updateFtp(ftpAccount: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/ftp/${enc(ftpAccount)}`, data);\r\n }\r\n\r\n async deleteFtp(ftpAccount: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/ftp/${enc(ftpAccount)}`);\r\n }\r\n\r\n // ================================================================\r\n // MySQL\r\n // ================================================================\r\n\r\n async listDb(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/db`);\r\n }\r\n\r\n async addDb(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/db`, data);\r\n }\r\n\r\n async updateDb(dbName: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/db/${enc(dbName)}`, data);\r\n }\r\n\r\n async deleteDb(dbName: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/db/${enc(dbName)}`);\r\n }\r\n\r\n async listDbUser(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/db/user`);\r\n }\r\n\r\n async addDbUser(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/db/user`, data);\r\n }\r\n\r\n async updateDbUser(dbUser: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/db/user/${enc(dbUser)}`, data);\r\n }\r\n\r\n async deleteDbUser(dbUser: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/db/user/${enc(dbUser)}`);\r\n }\r\n\r\n async listDbUserGrant(dbUser: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/db/user/${enc(dbUser)}/grant`);\r\n }\r\n\r\n async addDbUserGrant(dbUser: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/db/user/${enc(dbUser)}/grant`, data);\r\n }\r\n\r\n async deleteDbUserGrant(dbUser: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/db/user/${enc(dbUser)}/grant`, data);\r\n }\r\n\r\n // ================================================================\r\n // PHP バージョン\r\n // ================================================================\r\n\r\n async getPhpVersion(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/php-version`, params);\r\n }\r\n\r\n async updatePhpVersion(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/php-version/${enc(domain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // ドメイン(サーバーパネル)\r\n // ================================================================\r\n\r\n async listDomain(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/domain`);\r\n }\r\n\r\n async getDomain(domain: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/domain/${enc(domain)}`);\r\n }\r\n\r\n async addDomain(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/domain`, data);\r\n }\r\n\r\n async updateDomain(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/domain/${enc(domain)}`, data);\r\n }\r\n\r\n async deleteDomain(domain: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/domain/${enc(domain)}`, data);\r\n }\r\n\r\n async resetDomain(domain: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/domain/${enc(domain)}/reset`, data);\r\n }\r\n\r\n // ================================================================\r\n // サブドメイン\r\n // ================================================================\r\n\r\n async listSubdomain(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/subdomain`, params);\r\n }\r\n\r\n async addSubdomain(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/subdomain`, data);\r\n }\r\n\r\n async updateSubdomain(subdomain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/subdomain/${enc(subdomain)}`, data);\r\n }\r\n\r\n async deleteSubdomain(subdomain: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/subdomain/${enc(subdomain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // SSL\r\n // ================================================================\r\n\r\n async listSsl(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/ssl`, params);\r\n }\r\n\r\n async installSsl(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/ssl`, data);\r\n }\r\n\r\n async uninstallSsl(commonName: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/ssl/${enc(commonName)}`);\r\n }\r\n\r\n // ================================================================\r\n // DNS(サーバーパネル)\r\n // ================================================================\r\n\r\n async listDns(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/dns`, params);\r\n }\r\n\r\n async addDns(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/dns`, data);\r\n }\r\n\r\n async updateDns(dnsId: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/dns/${enc(dnsId)}`, data);\r\n }\r\n\r\n async deleteDns(dnsId: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/dns/${enc(dnsId)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // SSH\r\n // ================================================================\r\n\r\n async getSsh(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/ssh`);\r\n }\r\n\r\n async updateSsh(data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/ssh`, data);\r\n }\r\n\r\n async listSshKey(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/ssh/key`);\r\n }\r\n\r\n async addSshKey(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/ssh/key`, data);\r\n }\r\n\r\n async updateSshKey(keyId: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/ssh/key/${enc(keyId)}`, data);\r\n }\r\n\r\n async deleteSshKey(keyId: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/ssh/key/${enc(keyId)}`);\r\n }\r\n\r\n // ================================================================\r\n // ログ\r\n // ================================================================\r\n\r\n async getAccessLog(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/access-log`, params);\r\n }\r\n\r\n async getErrorLog(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/error-log`, params);\r\n }\r\n\r\n // ================================================================\r\n // APIキー情報\r\n // ================================================================\r\n\r\n async getMe(): Promise<unknown> {\r\n return this.get('/v1/me');\r\n }\r\n\r\n // ================================================================\r\n // HTTP 基盤\r\n // ================================================================\r\n\r\n async get(path: string, params?: Record<string, string>): Promise<unknown> {\r\n let url = `${this.apiBase}${path}`;\r\n if (params && Object.keys(params).length > 0) {\r\n url += '?' + new URLSearchParams(params).toString();\r\n }\r\n return this.request('GET', url);\r\n }\r\n\r\n async post(path: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.request('POST', `${this.apiBase}${path}`, data);\r\n }\r\n\r\n async put(path: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.request('PUT', `${this.apiBase}${path}`, data);\r\n }\r\n\r\n async delete(path: string, data?: Record<string, unknown>): Promise<unknown> {\r\n return this.request('DELETE', `${this.apiBase}${path}`, data);\r\n }\r\n\r\n private async request(method: string, url: string, body?: Record<string, unknown>): Promise<unknown> {\r\n const headers: Record<string, string> = {\r\n 'Authorization': `Bearer ${this.apiKey}`,\r\n 'Accept': 'application/json',\r\n };\r\n\r\n const init: RequestInit = {\r\n method,\r\n headers,\r\n signal: AbortSignal.timeout(DEFAULT_TIMEOUT_MS),\r\n };\r\n\r\n if (body && method !== 'GET') {\r\n headers['Content-Type'] = 'application/json';\r\n init.body = JSON.stringify(body);\r\n }\r\n\r\n if (this.debug) {\r\n const dbg = (msg: string) => process.stderr.write(`[DEBUG] ${msg}\\n`);\r\n dbg(`${method} ${url}`);\r\n if (init.body) dbg(`Body: ${init.body as string}`);\r\n }\r\n\r\n let response: Response;\r\n try {\r\n response = await fetch(url, init);\r\n } catch (err) {\r\n throw new Error(`通信エラー: ${err instanceof Error ? err.message : String(err)}`);\r\n }\r\n\r\n if (this.debug) {\r\n const dbg = (msg: string) => process.stderr.write(`[DEBUG] ${msg}\\n`);\r\n dbg(`HTTP ${response.status} ${response.statusText}`);\r\n const debugHeaders = ['x-ratelimit-limit', 'x-ratelimit-remaining', 'x-ratelimit-reset', 'x-concurrent-limit', 'x-concurrent-remaining', 'content-type'];\r\n for (const h of debugHeaders) {\r\n const v = response.headers.get(h);\r\n if (v !== null) dbg(` ${h}: ${v}`);\r\n }\r\n }\r\n\r\n const rateLimitHeader = response.headers.get('x-ratelimit-limit');\r\n if (rateLimitHeader) {\r\n this.lastRateLimit = {\r\n limit: parseInt(rateLimitHeader, 10),\r\n remaining: parseInt(response.headers.get('x-ratelimit-remaining') || '0', 10),\r\n reset: parseInt(response.headers.get('x-ratelimit-reset') || '0', 10),\r\n };\r\n }\r\n\r\n const text = await response.text();\r\n let data: unknown;\r\n try {\r\n data = JSON.parse(text);\r\n } catch {\r\n if (this.debug) {\r\n process.stderr.write(`[DEBUG] Raw response: ${text.substring(0, 500)}\\n`);\r\n }\r\n throw new ApiError(`Response parse error (HTTP ${response.status})`, response.status, 'PARSE_ERROR', []);\r\n }\r\n\r\n if (!response.ok) {\r\n const err = data as { error?: { code?: string; message?: string; errors?: string[] } };\r\n const errorCode = err?.error?.code || 'UNKNOWN_ERROR';\r\n const errorMessage = err?.error?.message || 'エラーが発生しました';\r\n const errors = err?.error?.errors || [];\r\n throw new ApiError(errorMessage, response.status, errorCode, errors);\r\n }\r\n\r\n return data;\r\n }\r\n}\r\n\r\nfunction enc(s: string): string {\r\n return encodeURIComponent(s);\r\n}\r\n","import { Command } from 'commander';\r\nimport { password } from '@inquirer/prompts';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiClient, ApiError } from 'xnp-shared';\r\nimport { loadConfig, saveConfig } from '../../lib/config.js';\r\nimport { getFormat, printResult } from '../../lib/command-helper.js';\r\n\r\nfunction maskApiKey(apiKey: string): string {\r\n return `${apiKey.substring(0, 8)}...`;\r\n}\r\n\r\nexport function registerAuthCommands(program: Command, brand: BrandConfig): void {\r\n const auth = program\r\n .command('auth')\r\n .description('認証設定');\r\n\r\n auth\r\n .command('login')\r\n .description('APIキーを設定(サーバー名は自動検出)')\r\n .option('--api-key <key>', 'APIキー')\r\n .option('--servername <name>', 'サーバー名(自動検出を上書き)')\r\n .action(async (opts: { apiKey?: string; servername?: string }, cmd: Command) => {\r\n const profileName: string = (cmd.optsWithGlobals().profile as string | undefined) ?? 'default';\r\n let apiKey = opts.apiKey;\r\n let servername = opts.servername;\r\n\r\n if (!apiKey) {\r\n apiKey = await password({ message: 'APIキーを入力:', mask: true });\r\n }\r\n if (!apiKey) {\r\n console.error('エラー: APIキーは必須です');\r\n process.exit(1);\r\n }\r\n\r\n console.error('認証情報を検証中...');\r\n const client = new ApiClient({ apiKey, apiBase: brand.apiBase });\r\n let meData: Record<string, unknown>;\r\n try {\r\n meData = await client.getMe() as Record<string, unknown>;\r\n } catch (err) {\r\n if (err instanceof ApiError && err.errorCode === 'UNAUTHORIZED') {\r\n console.error('エラー: APIキーが無効です。正しいAPIキーを指定してください。');\r\n process.exit(1);\r\n }\r\n throw err;\r\n }\r\n console.error('✓ 認証に成功しました');\r\n\r\n if (!servername && meData.servername) {\r\n servername = meData.servername as string;\r\n console.error(` サーバー名を自動検出しました: ${servername}`);\r\n }\r\n\r\n const config = loadConfig(brand);\r\n config.profiles[profileName] = {\r\n apiKey,\r\n ...(servername ? { servername } : {}),\r\n };\r\n if (!config.defaultProfile) {\r\n config.defaultProfile = profileName;\r\n }\r\n saveConfig(brand, config);\r\n\r\n console.error(`✓ プロファイル \"${profileName}\" を保存しました`);\r\n console.error(` 設定ファイル: ~/.config/${brand.configDir}/config.json`);\r\n });\r\n\r\n auth\r\n .command('status')\r\n .description('現在の認証状態を表示')\r\n .action((_opts: Record<string, unknown>, cmd: Command) => {\r\n const format = getFormat(cmd);\r\n const config = loadConfig(brand);\r\n const profileName = (cmd.optsWithGlobals().profile as string | undefined) || config.defaultProfile || 'default';\r\n const profile = config.profiles[profileName];\r\n\r\n if (!profile) {\r\n if (format === 'json') {\r\n printResult({\r\n authenticated: false,\r\n profile: profileName,\r\n message: `プロファイル \"${profileName}\" が見つかりません`,\r\n }, format);\r\n } else {\r\n console.error(`プロファイル \"${profileName}\" が見つかりません`);\r\n console.error(`\\`${brand.commandName} auth login\\` で認証設定を行ってください`);\r\n }\r\n process.exit(1);\r\n }\r\n\r\n if (format === 'json') {\r\n printResult({\r\n authenticated: true,\r\n profile: profileName,\r\n api_key: maskApiKey(profile.apiKey),\r\n servername: profile.servername ?? null,\r\n api_base: brand.apiBase,\r\n }, format);\r\n return;\r\n }\r\n\r\n console.log(`プロファイル: ${profileName}`);\r\n console.log(`APIキー: ${maskApiKey(profile.apiKey)}`);\r\n if (profile.servername) {\r\n console.log(`サーバー名: ${profile.servername}`);\r\n }\r\n console.log(`APIエンドポイント: ${brand.apiBase}`);\r\n });\r\n\r\n auth\r\n .command('profiles')\r\n .description('プロファイル一覧を表示')\r\n .action((_opts: Record<string, unknown>, cmd: Command) => {\r\n const format = getFormat(cmd);\r\n const config = loadConfig(brand);\r\n const profiles = Object.keys(config.profiles);\r\n\r\n if (profiles.length === 0) {\r\n if (format === 'json') {\r\n printResult({\r\n default_profile: config.defaultProfile || null,\r\n profiles: [],\r\n message: 'プロファイルが見つかりません',\r\n }, format);\r\n } else {\r\n console.error('プロファイルが見つかりません');\r\n console.error(`\\`${brand.commandName} auth login\\` で認証設定を行ってください`);\r\n }\r\n process.exit(1);\r\n }\r\n\r\n const rows = profiles.map((name) => {\r\n const p = config.profiles[name]!;\r\n return {\r\n name,\r\n default: name === config.defaultProfile,\r\n api_key: maskApiKey(p.apiKey),\r\n servername: p.servername ?? null,\r\n };\r\n });\r\n\r\n if (format === 'json') {\r\n printResult({\r\n default_profile: config.defaultProfile || null,\r\n profiles: rows,\r\n }, format);\r\n return;\r\n }\r\n\r\n for (const name of profiles) {\r\n const marker = name === config.defaultProfile ? ' (default)' : '';\r\n const p = config.profiles[name]!;\r\n const key = maskApiKey(p.apiKey);\r\n const sv = p.servername ? ` servername=${p.servername}` : '';\r\n console.log(`${name}${marker}: key=${key}${sv}`);\r\n }\r\n });\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport os from 'node:os';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport type { AppConfig, Profile } from '../types.js';\r\n\r\nfunction getConfigDir(brand: BrandConfig): string {\r\n const home = os.homedir();\r\n return path.join(home, '.config', brand.configDir);\r\n}\r\n\r\nfunction getConfigPath(brand: BrandConfig): string {\r\n return path.join(getConfigDir(brand), 'config.json');\r\n}\r\n\r\nexport function loadConfig(brand: BrandConfig): AppConfig {\r\n const configPath = getConfigPath(brand);\r\n if (!fs.existsSync(configPath)) {\r\n return { defaultProfile: 'default', profiles: {} };\r\n }\r\n const raw = fs.readFileSync(configPath, 'utf-8');\r\n return JSON.parse(raw) as AppConfig;\r\n}\r\n\r\nexport function saveConfig(brand: BrandConfig, config: AppConfig): void {\r\n const configDir = getConfigDir(brand);\r\n fs.mkdirSync(configDir, { recursive: true });\r\n const configPath = getConfigPath(brand);\r\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\r\n}\r\n\r\nexport function getActiveProfile(brand: BrandConfig, profileName?: string): Profile | null {\r\n const envPrefix = brand.brand.toUpperCase();\r\n const envApiKey = process.env[`${envPrefix}_API_KEY`] || process.env['XSERVER_API_KEY'];\r\n const envServername = process.env[`${envPrefix}_SERVERNAME`] || process.env['XSERVER_SERVERNAME'];\r\n\r\n if (envApiKey) {\r\n return {\r\n apiKey: envApiKey,\r\n servername: envServername,\r\n };\r\n }\r\n\r\n const config = loadConfig(brand);\r\n const name = profileName || config.defaultProfile || 'default';\r\n return config.profiles[name] || null;\r\n}\r\n","import type { Command } from 'commander';\r\nimport { confirm } from '@inquirer/prompts';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiClient } from 'xnp-shared';\r\nimport { getActiveProfile } from './config.js';\r\nimport { formatOutput, type OutputFormat } from './output.js';\r\n\r\nfunction findRoot(cmd: Command): Command {\r\n let root = cmd;\r\n while (root.parent) root = root.parent;\r\n return root;\r\n}\r\n\r\nexport function resolveClient(cmd: Command, brand: BrandConfig): ApiClient {\r\n const root = findRoot(cmd);\r\n const rootOpts = root.opts();\r\n const profile = getActiveProfile(brand, rootOpts.profile as string);\r\n if (!profile) {\r\n console.error(`認証設定が見つかりません。\\`${brand.commandName} auth login\\` を実行してください。`);\r\n process.exit(1);\r\n }\r\n\r\n const debug = !!(rootOpts.debug || process.env.XSERVER_DEBUG === '1');\r\n const servername = resolveServername(cmd) ?? profile.servername;\r\n return new ApiClient({\r\n apiKey: profile.apiKey,\r\n apiBase: brand.apiBase,\r\n servername,\r\n debug,\r\n });\r\n}\r\n\r\nfunction resolveServername(cmd: Command): string | undefined {\r\n let current: Command | null = cmd;\r\n while (current) {\r\n const val = current.opts()?.servername as string | undefined;\r\n if (val) return val;\r\n current = current.parent;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getFormat(cmd: Command): OutputFormat {\r\n const root = findRoot(cmd);\r\n return (root.opts().format as OutputFormat) || 'table';\r\n}\r\n\r\nexport function printResult(data: unknown, format: OutputFormat): void {\r\n console.log(formatOutput(data, format));\r\n}\r\n\r\nexport async function confirmDestructiveAction(cmd: Command, message: string): Promise<void> {\r\n const root = findRoot(cmd);\r\n if (root.opts().yes || process.argv.includes('--yes') || process.argv.includes('-y')) return;\r\n\r\n const ok = await confirm({ message, default: false });\r\n if (!ok) {\r\n console.error('キャンセルしました');\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport function pickDefined(obj: Record<string, unknown>): Record<string, unknown> {\r\n const result: Record<string, unknown> = {};\r\n for (const [key, value] of Object.entries(obj)) {\r\n if (value !== undefined) result[key] = value;\r\n }\r\n return result;\r\n}\r\n","export type OutputFormat = 'json' | 'table';\r\n\r\nexport function formatOutput(data: unknown, format: OutputFormat): string {\r\n if (format === 'json') {\r\n return JSON.stringify(data, null, 2);\r\n }\r\n return formatTable(data);\r\n}\r\n\r\nfunction formatTable(data: unknown): string {\r\n if (data === null || data === undefined) {\r\n return '(データなし)';\r\n }\r\n\r\n if (Array.isArray(data)) {\r\n if (data.length === 0) return '(データなし)';\r\n return renderArrayTable(data as Record<string, unknown>[]);\r\n }\r\n\r\n if (typeof data === 'object') {\r\n const obj = data as Record<string, unknown>;\r\n const arrayEntry = Object.entries(obj).find(\r\n ([, v]) => Array.isArray(v) && (v.length === 0 || (typeof v[0] === 'object' && v[0] !== null)),\r\n );\r\n if (arrayEntry) {\r\n const scalarEntries = Object.entries(obj).filter(([k]) => k !== arrayEntry[0]);\r\n const parts: string[] = [];\r\n if (scalarEntries.length > 0) {\r\n parts.push(renderKeyValueTable(Object.fromEntries(scalarEntries)));\r\n parts.push('');\r\n }\r\n parts.push(renderArrayTable(arrayEntry[1] as Record<string, unknown>[]));\r\n return parts.join('\\n');\r\n }\r\n return renderKeyValueTable(obj);\r\n }\r\n\r\n return String(data);\r\n}\r\n\r\nfunction renderKeyValueTable(obj: Record<string, unknown>): string {\r\n const entries = Object.entries(obj).map(([key, value]) => ({\r\n key,\r\n value: formatValue(value),\r\n }));\r\n\r\n const maxKeyLen = Math.max(...entries.map(e => displayWidth(e.key)));\r\n const lines = entries.map(e => `${padRight(e.key, maxKeyLen)} ${e.value}`);\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction renderArrayTable(items: Record<string, unknown>[]): string {\r\n if (items.length === 0) return '(データなし)';\r\n\r\n const keys = Object.keys(items[0]!);\r\n\r\n const colWidths = keys.map(key => {\r\n const headerWidth = displayWidth(key);\r\n const maxDataWidth = Math.max(\r\n ...items.map(item => displayWidth(formatValue(item[key]))),\r\n );\r\n return Math.max(headerWidth, maxDataWidth);\r\n });\r\n\r\n const header = keys.map((key, i) => padRight(key, colWidths[i]!)).join(' ');\r\n const separator = colWidths.map(w => '-'.repeat(w)).join(' ');\r\n const rows = items.map(item =>\r\n keys.map((key, i) => padRight(formatValue(item[key]), colWidths[i]!)).join(' '),\r\n );\r\n\r\n return [header, separator, ...rows].join('\\n');\r\n}\r\n\r\nfunction formatValue(value: unknown): string {\r\n if (value === null || value === undefined) return '-';\r\n if (typeof value === 'object') return JSON.stringify(value);\r\n return String(value);\r\n}\r\n\r\nfunction displayWidth(str: string): number {\r\n let width = 0;\r\n for (const char of str) {\r\n const code = char.codePointAt(0)!;\r\n if (\r\n (code >= 0x1100 && code <= 0x115f) ||\r\n (code >= 0x2e80 && code <= 0xa4cf) ||\r\n (code >= 0xac00 && code <= 0xd7af) ||\r\n (code >= 0xf900 && code <= 0xfaff) ||\r\n (code >= 0xfe10 && code <= 0xfe6f) ||\r\n (code >= 0xff01 && code <= 0xff60) ||\r\n (code >= 0xffe0 && code <= 0xffe6) ||\r\n (code >= 0x20000 && code <= 0x2fffd) ||\r\n (code >= 0x30000 && code <= 0x3fffd)\r\n ) {\r\n width += 2;\r\n } else {\r\n width += 1;\r\n }\r\n }\r\n return width;\r\n}\r\n\r\nfunction padRight(str: string, targetWidth: number): string {\r\n const currentWidth = displayWidth(str);\r\n const padding = Math.max(0, targetWidth - currentWidth);\r\n return str + ' '.repeat(padding);\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../lib/command-helper.js';\r\n\r\nexport function registerServerInfoCommands(parent: Command, brand: BrandConfig): void {\r\n parent\r\n .command('info')\r\n .description('サーバー情報を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getServerInfo(), getFormat(parent));\r\n });\r\n\r\n parent\r\n .command('usage')\r\n .description('サーバー利用状況を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getServerUsage(), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerCronCommands(parent: Command, brand: BrandConfig): void {\r\n const cron = parent\r\n .command('cron')\r\n .description('Cron設定');\r\n\r\n cron\r\n .command('list')\r\n .description('Cron一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listCron(), getFormat(parent));\r\n });\r\n\r\n cron\r\n .command('add')\r\n .description('Cronを新規追加')\r\n .requiredOption('--minute <value>', '分(例: */5, 0, *)')\r\n .requiredOption('--hour <value>', '時(例: *, 3, 0-6)')\r\n .requiredOption('--command <value>', '実行コマンド')\r\n .option('--day <value>', '日', '*')\r\n .option('--month <value>', '月', '*')\r\n .option('--weekday <value>', '曜日', '*')\r\n .option('--comment <value>', 'メモ')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n minute: opts.minute, hour: opts.hour, day: opts.day,\r\n month: opts.month, weekday: opts.weekday, command: opts.command,\r\n comment: opts.comment,\r\n });\r\n printResult(await client.addCron(data), getFormat(parent));\r\n });\r\n\r\n cron\r\n .command('update <cronId>')\r\n .description('Cronを更新')\r\n .option('--minute <value>', '分')\r\n .option('--hour <value>', '時')\r\n .option('--day <value>', '日')\r\n .option('--month <value>', '月')\r\n .option('--weekday <value>', '曜日')\r\n .option('--command <value>', '実行コマンド')\r\n .option('--comment <value>', 'メモ')\r\n .option('--enabled <value>', '有効/無効 (true/false)')\r\n .action(async (cronId: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n minute: opts.minute, hour: opts.hour, day: opts.day,\r\n month: opts.month, weekday: opts.weekday, command: opts.command,\r\n comment: opts.comment,\r\n });\r\n if (opts.enabled !== undefined) data.enabled = opts.enabled === 'true';\r\n printResult(await client.updateCron(cronId, data), getFormat(parent));\r\n });\r\n\r\n cron\r\n .command('delete <cronId>')\r\n .description('Cronを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (cronId: string) => {\r\n await confirmDestructiveAction(parent, `Cron \"${cronId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteCron(cronId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerWpCommands(parent: Command, brand: BrandConfig): void {\r\n const wp = parent\r\n .command('wp')\r\n .description('WordPress簡単インストール');\r\n\r\n wp\r\n .command('list')\r\n .description('WordPress一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listWordpress(params), getFormat(parent));\r\n });\r\n\r\n wp\r\n .command('add')\r\n .description('WordPressを新規インストール')\r\n .requiredOption('--url <url>', 'インストール先URL(例: example.com/blog)')\r\n .requiredOption('--title <title>', 'サイトタイトル')\r\n .requiredOption('--admin-username <username>', '管理者ユーザー名')\r\n .requiredOption('--admin-password <password>', '管理者パスワード')\r\n .requiredOption('--admin-email <email>', '管理者メールアドレス')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n url: opts.url, title: opts.title,\r\n admin_username: opts.adminUsername, admin_password: opts.adminPassword,\r\n admin_email: opts.adminEmail, memo: opts.memo,\r\n });\r\n printResult(await client.addWordpress(data), getFormat(parent));\r\n });\r\n\r\n wp\r\n .command('update <wpId>')\r\n .description('WordPress設定を変更')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (wpId: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateWordpress(wpId, pickDefined({ memo: opts.memo })), getFormat(parent));\r\n });\r\n\r\n wp\r\n .command('delete <wpId>')\r\n .description('WordPressを削除')\r\n .option('--delete-db <value>', '関連するMySQLデータベースも削除するか(デフォルト: true)')\r\n .option('--delete-db-user <value>', '関連するMySQLユーザーも削除するか(デフォルト: false)')\r\n .option('--delete-cron <value>', 'キャッシュ自動削除Cronも削除するか(デフォルト: true)')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (wpId: string, opts) => {\r\n await confirmDestructiveAction(parent, `WordPress \"${wpId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n delete_db: opts.deleteDb !== undefined ? opts.deleteDb === 'true' : undefined,\r\n delete_db_user: opts.deleteDbUser !== undefined ? opts.deleteDbUser === 'true' : undefined,\r\n delete_cron: opts.deleteCron !== undefined ? opts.deleteCron === 'true' : undefined,\r\n });\r\n printResult(await client.deleteWordpress(wpId, data), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerMailCommands(parent: Command, brand: BrandConfig): void {\r\n const mail = parent\r\n .command('mail')\r\n .description('メールアカウント設定');\r\n\r\n mail\r\n .command('list')\r\n .description('メールアカウント一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listMail(params), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('get <mailAccount>')\r\n .description('メールアカウント詳細を取得')\r\n .action(async (mailAccount: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getMail(mailAccount), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('add <mailAddress>')\r\n .description('メールアカウントを新規追加')\r\n .requiredOption('--password <password>', 'パスワード')\r\n .option('--quota-mb <mb>', '容量(MB)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (mailAddress: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n mail_address: mailAddress, password: opts.password,\r\n quota_mb: opts.quotaMb !== undefined ? parseInt(opts.quotaMb, 10) : undefined,\r\n memo: opts.memo,\r\n });\r\n printResult(await client.addMail(data), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('update <mailAccount>')\r\n .description('メールアカウント設定を変更')\r\n .option('--password <password>', 'パスワード')\r\n .option('--quota-mb <mb>', '容量(MB)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (mailAccount: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateMail(mailAccount, pickDefined({\r\n password: opts.password,\r\n quota_mb: opts.quotaMb !== undefined ? parseInt(opts.quotaMb, 10) : undefined,\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('delete <mailAccount>')\r\n .description('メールアカウントを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (mailAccount: string) => {\r\n await confirmDestructiveAction(parent, `メールアカウント \"${mailAccount}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteMail(mailAccount), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('forwarding-get <mailAccount>')\r\n .description('メール転送設定を取得')\r\n .action(async (mailAccount: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getMailForwarding(mailAccount), getFormat(parent));\r\n });\r\n\r\n mail\r\n .command('forwarding-update <mailAccount>')\r\n .description('メール転送設定を更新')\r\n .option('--forwarding-addresses <addresses>', '転送先アドレス(カンマ区切り)')\r\n .option('--keep-in-mailbox <value>', '転送後もメールボックスに残すか(true/false)')\r\n .action(async (mailAccount: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {};\r\n if (opts.forwardingAddresses) data.forwarding_addresses = opts.forwardingAddresses.split(',').map((a: string) => a.trim());\r\n if (opts.keepInMailbox !== undefined) data.keep_in_mailbox = opts.keepInMailbox === 'true';\r\n printResult(await client.updateMailForwarding(mailAccount, data), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerMailFilterCommands(parent: Command, brand: BrandConfig): void {\r\n const mailFilter = parent\r\n .command('mail-filter')\r\n .description('メール振り分け設定');\r\n\r\n mailFilter\r\n .command('list')\r\n .description('メール振り分け設定の一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listMailFilter(params), getFormat(parent));\r\n });\r\n\r\n mailFilter\r\n .command('add')\r\n .description('メール振り分け設定を新規追加')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .requiredOption('--condition-keyword <keyword>', '条件キーワード')\r\n .requiredOption('--condition-field <field>', '条件対象(subject / from / to / body / header)')\r\n .option('--condition-match-type <type>', '一致条件(contain / match / start_from。デフォルト: contain)')\r\n .requiredOption('--action-type <type>', 'アクション種別(mail_address / spam_folder / trash / delete)')\r\n .option('--action-target <target>', '転送先メールアドレス(action-typeがmail_addressの場合)')\r\n .option('--action-method <method>', '処理方法(move / copy。デフォルト: move)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {\r\n domain: opts.domain,\r\n conditions: [{\r\n keyword: opts.conditionKeyword,\r\n field: opts.conditionField,\r\n match_type: opts.conditionMatchType || 'contain',\r\n }],\r\n action: {\r\n type: opts.actionType,\r\n target: opts.actionTarget || '',\r\n method: opts.actionMethod || 'move',\r\n },\r\n };\r\n printResult(await client.addMailFilter(data), getFormat(parent));\r\n });\r\n\r\n mailFilter\r\n .command('delete <filterId>')\r\n .description('メール振り分け設定を削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (filterId: string) => {\r\n await confirmDestructiveAction(parent, `メール振り分け設定 \"${filterId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteMailFilter(filterId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerFtpCommands(parent: Command, brand: BrandConfig): void {\r\n const ftp = parent\r\n .command('ftp')\r\n .description('FTPアカウント設定');\r\n\r\n ftp\r\n .command('list')\r\n .description('FTPアカウント一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listFtp(params), getFormat(parent));\r\n });\r\n\r\n ftp\r\n .command('add <ftpAccount>')\r\n .description('FTPアカウントを新規追加')\r\n .requiredOption('--password <password>', 'パスワード')\r\n .option('--directory <dir>', 'ディレクトリ')\r\n .option('--quota <mb>', '容量制限(MB。0で無制限)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (ftpAccount: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data = pickDefined({\r\n ftp_account: ftpAccount, password: opts.password,\r\n directory: opts.directory, quota_mb: opts.quota !== undefined ? parseInt(opts.quota, 10) : undefined,\r\n memo: opts.memo,\r\n });\r\n printResult(await client.addFtp(data), getFormat(parent));\r\n });\r\n\r\n ftp\r\n .command('update <ftpAccount>')\r\n .description('FTPアカウント設定を変更')\r\n .option('--password <password>', 'パスワード')\r\n .option('--directory <dir>', 'ディレクトリ')\r\n .option('--quota <mb>', '容量制限(MB)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (ftpAccount: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateFtp(ftpAccount, pickDefined({\r\n password: opts.password, directory: opts.directory,\r\n quota_mb: opts.quota !== undefined ? parseInt(opts.quota, 10) : undefined,\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n ftp\r\n .command('delete <ftpAccount>')\r\n .description('FTPアカウントを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (ftpAccount: string) => {\r\n await confirmDestructiveAction(parent, `FTPアカウント \"${ftpAccount}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteFtp(ftpAccount), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerDbCommands(parent: Command, brand: BrandConfig): void {\r\n const db = parent\r\n .command('db')\r\n .description('MySQL設定');\r\n\r\n db\r\n .command('list')\r\n .description('データベース一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listDb(), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('add <nameSuffix>')\r\n .description('データベースを新規作成')\r\n .option('--character-set <charset>', '文字コード(utf8mb4 / UTF-8 / EUC-JP / SHIFT-JIS / Binary。デフォルト: utf8mb4)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (nameSuffix: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addDb(pickDefined({\r\n name_suffix: nameSuffix, character_set: opts.characterSet, memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('update <dbName>')\r\n .description('データベースのメモを更新')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (dbName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDb(dbName, pickDefined({\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('delete <dbName>')\r\n .description('データベースを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (dbName: string) => {\r\n await confirmDestructiveAction(parent, `データベース \"${dbName}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteDb(dbName), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('user-list')\r\n .description('MySQLユーザー一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listDbUser(), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('user-add <nameSuffix>')\r\n .description('MySQLユーザーを新規作成')\r\n .requiredOption('--password <password>', 'パスワード')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (nameSuffix: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addDbUser(pickDefined({\r\n name_suffix: nameSuffix, password: opts.password, memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('user-update <dbUser>')\r\n .description('MySQLユーザー設定を変更')\r\n .option('--password <password>', 'パスワード')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (dbUser: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDbUser(dbUser, pickDefined({\r\n password: opts.password, memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('user-delete <dbUser>')\r\n .description('MySQLユーザーを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (dbUser: string) => {\r\n await confirmDestructiveAction(parent, `MySQLユーザー \"${dbUser}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteDbUser(dbUser), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('grant-list <dbUser>')\r\n .description('MySQLユーザーの権限一覧を取得')\r\n .action(async (dbUser: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listDbUserGrant(dbUser), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('grant-add <dbUser>')\r\n .description('MySQLユーザーに権限を追加')\r\n .requiredOption('--db-name <dbName>', '対象データベース名')\r\n .action(async (dbUser: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addDbUserGrant(dbUser, { db_name: opts.dbName }), getFormat(parent));\r\n });\r\n\r\n db\r\n .command('grant-delete <dbUser>')\r\n .description('MySQLユーザーの権限を削除')\r\n .requiredOption('--db-name <dbName>', '対象データベース名')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (dbUser: string, opts) => {\r\n await confirmDestructiveAction(parent, `MySQLユーザー \"${dbUser}\" のデータベース \"${opts.dbName}\" への権限を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteDbUserGrant(dbUser, { db_name: opts.dbName }), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nexport function registerPhpVersionCommands(parent: Command, brand: BrandConfig): void {\r\n const phpVer = parent\r\n .command('php-version')\r\n .description('PHPバージョン設定');\r\n\r\n phpVer\r\n .command('get')\r\n .description('PHPバージョン確認')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.getPhpVersion(params), getFormat(parent));\r\n });\r\n\r\n phpVer\r\n .command('update <domain>')\r\n .description('PHPバージョンを変更')\r\n .requiredOption('--php <version>', 'PHPバージョン(例: 8.2)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updatePhpVersion(domain, { version: opts.php }), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerServerDomainCommands(parent: Command, brand: BrandConfig): void {\r\n const domain = parent\r\n .command('domain')\r\n .description('ドメイン設定');\r\n\r\n domain\r\n .command('list')\r\n .description('ドメイン設定一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listDomain(), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('get <domain>')\r\n .description('ドメイン設定詳細を取得')\r\n .action(async (domainName: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getDomain(domainName), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('add <domain>')\r\n .description('ドメイン設定を新規追加')\r\n .option('--ssl <value>', 'SSL設定(デフォルト: true)')\r\n .option('--redirect-https <value>', 'HTTPS転送設定(デフォルト: sslと同じ値)')\r\n .option('--ai-crawler-block <value>', 'AIクローラー遮断設定(デフォルト: true)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (domainName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = { domain: domainName };\r\n if (opts.ssl !== undefined) data.ssl = opts.ssl === 'true';\r\n if (opts.redirectHttps !== undefined) data.redirect_https = opts.redirectHttps === 'true';\r\n if (opts.aiCrawlerBlock !== undefined) data.ai_crawler_block_enabled = opts.aiCrawlerBlock === 'true';\r\n if (opts.memo !== undefined) data.memo = opts.memo;\r\n printResult(await client.addDomain(data), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('update <domain>')\r\n .description('ドメイン設定を変更')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (domainName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDomain(domainName, pickDefined({\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('delete <domain>')\r\n .description('ドメイン設定を削除')\r\n .option('--delete-files', 'ユーザー公開領域のドメインディレクトリも削除する')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (domainName: string, opts) => {\r\n const suffix = opts.deleteFiles ? '(関連ファイルも削除します)' : '';\r\n await confirmDestructiveAction(parent, `ドメイン設定 \"${domainName}\" を削除します${suffix}。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {};\r\n if (opts.deleteFiles) data.delete_files = true;\r\n printResult(await client.deleteDomain(domainName, data), getFormat(parent));\r\n });\r\n\r\n domain\r\n .command('reset <domain>')\r\n .description('ドメイン設定を初期化')\r\n .requiredOption('--type <type>', 'リセット種別(all: 全初期化 / web: Web領域のみ / other: Web以外)')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (domainName: string, opts) => {\r\n await confirmDestructiveAction(parent, `ドメイン設定 \"${domainName}\" を \"${opts.type}\" で初期化します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.resetDomain(domainName, { type: opts.type }), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerSubdomainCommands(parent: Command, brand: BrandConfig): void {\r\n const subdomain = parent\r\n .command('subdomain')\r\n .description('サブドメイン設定');\r\n\r\n subdomain\r\n .command('list')\r\n .description('サブドメイン設定一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listSubdomain(params), getFormat(parent));\r\n });\r\n\r\n subdomain\r\n .command('add <subdomain>')\r\n .description('サブドメインを新規追加')\r\n .option('--document-root-type <type>', 'ドキュメントルート種別(subdomain_only: /public_html/sub, full_subdomain: /public_html/sub.example.com)')\r\n .option('--ssl <value>', 'SSL設定(デフォルト: true)')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (subdomainName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = { subdomain: subdomainName };\r\n if (opts.documentRootType !== undefined) data.document_root_type = opts.documentRootType;\r\n if (opts.ssl !== undefined) data.ssl = opts.ssl === 'true';\r\n if (opts.memo !== undefined) data.memo = opts.memo;\r\n printResult(await client.addSubdomain(data), getFormat(parent));\r\n });\r\n\r\n subdomain\r\n .command('update <subdomain>')\r\n .description('サブドメインのメモを更新')\r\n .option('--memo <value>', 'メモ')\r\n .action(async (subdomainName: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateSubdomain(subdomainName, pickDefined({\r\n memo: opts.memo,\r\n })), getFormat(parent));\r\n });\r\n\r\n subdomain\r\n .command('delete <subdomain>')\r\n .description('サブドメインを削除')\r\n .option('--delete-files', '関連ファイルも削除する')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (subdomainName: string, opts) => {\r\n const suffix = opts.deleteFiles ? '(関連ファイルも削除します)' : '';\r\n await confirmDestructiveAction(parent, `サブドメイン \"${subdomainName}\" を削除します${suffix}。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {};\r\n if (opts.deleteFiles) data.delete_files = true;\r\n printResult(await client.deleteSubdomain(subdomainName, data), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerSslCommands(parent: Command, brand: BrandConfig): void {\r\n const ssl = parent\r\n .command('ssl')\r\n .description('SSL設定');\r\n\r\n ssl\r\n .command('list')\r\n .description('SSL設定の一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listSsl(params), getFormat(parent));\r\n });\r\n\r\n ssl\r\n .command('install <commonName>')\r\n .description('無料SSLをインストール')\r\n .action(async (commonName: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.installSsl(pickDefined({\r\n common_name: commonName,\r\n })), getFormat(parent));\r\n });\r\n\r\n ssl\r\n .command('uninstall <commonName>')\r\n .description('無料SSLをアンインストール')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (commonName: string) => {\r\n await confirmDestructiveAction(parent, `無料SSL \"${commonName}\" をアンインストールします。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.uninstallSsl(commonName), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerDnsCommands(parent: Command, brand: BrandConfig): void {\r\n const dns = parent\r\n .command('dns')\r\n .description('DNSレコード設定');\r\n\r\n dns\r\n .command('list')\r\n .description('DNSレコード一覧を取得')\r\n .option('--domain <domain>', 'ドメインで絞り込み')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = {};\r\n if (opts.domain) params.domain = opts.domain;\r\n printResult(await client.listDns(params), getFormat(parent));\r\n });\r\n\r\n dns\r\n .command('add')\r\n .description('DNSレコードを新規追加')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .requiredOption('--host <host>', 'ホスト名(@でapex)')\r\n .requiredOption('--type <type>', 'レコードタイプ(A / AAAA / CNAME / MX / TXT / SRV / CAA)')\r\n .requiredOption('--content <content>', 'レコード値')\r\n .option('--ttl <ttl>', 'TTL(60-86400。デフォルト: 3600)')\r\n .option('--priority <priority>', '優先度(MX/SRVレコード用)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addDns(pickDefined({\r\n domain: opts.domain, host: opts.host, type: opts.type,\r\n content: opts.content,\r\n ttl: opts.ttl !== undefined ? parseInt(opts.ttl, 10) : undefined,\r\n priority: opts.priority !== undefined ? parseInt(opts.priority, 10) : undefined,\r\n })), getFormat(parent));\r\n });\r\n\r\n dns\r\n .command('update <dnsId>')\r\n .description('DNSレコードを更新')\r\n .option('--domain <domain>', 'ドメイン')\r\n .option('--host <host>', 'ホスト名')\r\n .option('--type <type>', 'レコードタイプ')\r\n .option('--content <content>', 'レコード値')\r\n .option('--ttl <ttl>', 'TTL(60-86400)')\r\n .option('--priority <priority>', '優先度')\r\n .action(async (dnsId: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDns(dnsId, pickDefined({\r\n domain: opts.domain, host: opts.host, type: opts.type,\r\n content: opts.content,\r\n ttl: opts.ttl !== undefined ? parseInt(opts.ttl, 10) : undefined,\r\n priority: opts.priority !== undefined ? parseInt(opts.priority, 10) : undefined,\r\n })), getFormat(parent));\r\n });\r\n\r\n dns\r\n .command('delete <dnsId>')\r\n .description('DNSレコードを削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (dnsId: string) => {\r\n await confirmDestructiveAction(parent, `DNSレコード \"${dnsId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteDns(dnsId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, pickDefined, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerSshCommands(parent: Command, brand: BrandConfig): void {\r\n const ssh = parent\r\n .command('ssh')\r\n .description('SSH設定');\r\n\r\n ssh\r\n .command('show')\r\n .description('SSH設定を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getSsh(), getFormat(parent));\r\n });\r\n\r\n ssh\r\n .command('update')\r\n .description('SSH設定を変更')\r\n .option('--ssh-enabled <value>', 'SSH接続の有効/無効(true/false)')\r\n .option('--abroad-access-restriction <value>', '国外アクセス制限の有効/無効(true/false)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = {};\r\n if (opts.sshEnabled !== undefined) data.ssh_enabled = opts.sshEnabled === 'true';\r\n if (opts.abroadAccessRestriction !== undefined) data.abroad_access_restriction = opts.abroadAccessRestriction === 'true';\r\n printResult(await client.updateSsh(data), getFormat(parent));\r\n });\r\n\r\n const key = ssh\r\n .command('key')\r\n .description('SSH公開鍵管理');\r\n\r\n key\r\n .command('list')\r\n .description('SSH公開鍵一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listSshKey(), getFormat(parent));\r\n });\r\n\r\n key\r\n .command('add')\r\n .description('SSH公開鍵を登録')\r\n .option('--public-key <key>', '公開鍵(手動登録時)')\r\n .option('--generate', 'サーバー側で鍵ペアを自動生成')\r\n .option('--passphrase <value>', 'パスフレーズ(自動生成時)')\r\n .requiredOption('--label <value>', 'ラベル')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const data: Record<string, unknown> = { label: opts.label };\r\n if (opts.generate) {\r\n data.generate = true;\r\n if (opts.passphrase !== undefined) data.passphrase = opts.passphrase;\r\n } else {\r\n if (opts.publicKey) data.public_key = opts.publicKey;\r\n }\r\n printResult(await client.addSshKey(data), getFormat(parent));\r\n });\r\n\r\n key\r\n .command('update <keyId>')\r\n .description('SSH公開鍵を更新')\r\n .option('--label <value>', 'ラベル')\r\n .option('--status <value>', 'ステータス(on/off)')\r\n .action(async (keyId: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateSshKey(keyId, pickDefined({\r\n label: opts.label,\r\n status: opts.status,\r\n })), getFormat(parent));\r\n });\r\n\r\n key\r\n .command('delete <keyId>')\r\n .description('SSH公開鍵を削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (keyId: string) => {\r\n await confirmDestructiveAction(parent, `SSH公開鍵 \"${keyId}\" を削除します。よろしいですか?`);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteSshKey(keyId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nexport function registerLogCommands(parent: Command, brand: BrandConfig): void {\r\n const log = parent\r\n .command('log')\r\n .description('ログ');\r\n\r\n log\r\n .command('access')\r\n .description('アクセスログを取得')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .option('--lines <n>', '取得行数')\r\n .option('--keyword <keyword>', 'キーワード検索')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = { domain: opts.domain };\r\n if (opts.lines) params.lines = opts.lines;\r\n if (opts.keyword) params.keyword = opts.keyword;\r\n printResult(await client.getAccessLog(params), getFormat(parent));\r\n });\r\n\r\n log\r\n .command('error')\r\n .description('エラーログを取得')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .option('--lines <n>', '取得行数')\r\n .option('--keyword <keyword>', 'キーワード検索')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n const params: Record<string, string> = { domain: opts.domain };\r\n if (opts.lines) params.lines = opts.lines;\r\n if (opts.keyword) params.keyword = opts.keyword;\r\n printResult(await client.getErrorLog(params), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiClient } from 'xnp-shared';\r\nimport { getActiveProfile } from '../../lib/config.js';\r\nimport { getFormat, printResult } from '../../lib/command-helper.js';\r\n\r\nexport function registerMeCommand(program: Command, brand: BrandConfig): void {\r\n program\r\n .command('me')\r\n .description('現在のAPIキー情報を表示')\r\n .action(async (_opts: Record<string, unknown>, cmd: Command) => {\r\n const root = cmd.parent!;\r\n const rootOpts = root.opts();\r\n const profile = getActiveProfile(brand, rootOpts.profile as string);\r\n if (!profile) {\r\n console.error(`認証設定が見つかりません。\\`${brand.commandName} auth login\\` を実行してください。`);\r\n process.exit(1);\r\n }\r\n\r\n const debug = !!(rootOpts.debug || process.env.XSERVER_DEBUG === '1');\r\n const client = new ApiClient({\r\n apiKey: profile.apiKey,\r\n apiBase: brand.apiBase,\r\n servername: profile.servername,\r\n debug,\r\n });\r\n printResult(await client.getMe(), getFormat(cmd));\r\n });\r\n}\r\n","{\n \"name\": \"shincloud-cli\",\n \"version\": \"1.0.2\",\n \"description\": \"Official CLI for Shincloud API — manage your Shincloud hosting from the terminal\",\n \"type\": \"module\",\n \"bin\": {\n \"shincloud\": \"./dist/index.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"tsc\": \"tsc --noEmit\",\n \"prepublishOnly\": \"tsup\"\n },\n \"keywords\": [\n \"shincloud\",\n \"cli\",\n \"api\",\n \"hosting\",\n \"server\",\n \"webhosting\"\n ],\n \"author\": \"Xserver Inc.\",\n \"license\": \"MIT\",\n \"homepage\": \"https://developer.xserver.ne.jp\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^7.10.1\",\n \"commander\": \"^13.0.0\"\n },\n \"devDependencies\": {\n \"xnp-cli-core\": \"*\",\n \"xnp-shared\": \"*\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n }\n}\n","import { run } from 'xnp-cli-core';\r\nimport pkg from '../package.json' with { type: 'json' };\r\n\r\nrun({\r\n brand: 'shincloud',\r\n apiBase: 'https://api.shin-server.jp',\r\n displayName: 'シンクラウド API',\r\n commandName: 'shincloud',\r\n configDir: 'shincloud-cli',\r\n}, pkg.version);\r\n"],"mappings":"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","names":["path"]}
|