shincloud-cli 1.1.0 → 1.2.1

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.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/spam-filter/index.ts","../../core/src/commands/server/mail-filter/index.ts","../../core/src/commands/server/auto-reply/index.ts","../../core/src/commands/server/smtp-abroad-restriction/index.ts","../../core/src/commands/server/dkim/index.ts","../../core/src/commands/server/dmarc/index.ts","../../core/src/commands/server/spf/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 { registerSpamFilterCommands } from './commands/server/spam-filter/index.js';\r\nimport { registerMailFilterCommands } from './commands/server/mail-filter/index.js';\r\nimport { registerAutoReplyCommands } from './commands/server/auto-reply/index.js';\r\nimport { registerSmtpAbroadRestrictionCommands } from './commands/server/smtp-abroad-restriction/index.js';\r\nimport { registerDkimCommands } from './commands/server/dkim/index.js';\r\nimport { registerDmarcCommands } from './commands/server/dmarc/index.js';\r\nimport { registerSpfCommands } from './commands/server/spf/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 registerSpamFilterCommands(server, brand);\r\n registerMailFilterCommands(server, brand);\r\n registerAutoReplyCommands(server, brand);\r\n registerSmtpAbroadRestrictionCommands(server, brand);\r\n registerDkimCommands(server, brand);\r\n registerDmarcCommands(server, brand);\r\n registerSpfCommands(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 // 迷惑メールフィルタ設定\r\n // ================================================================\r\n\r\n async listSpamFilter(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/spam-filter`, params);\r\n }\r\n\r\n async updateSpamFilter(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/spam-filter/${enc(domain)}`, data);\r\n }\r\n\r\n async updateSpamFilterDmarcReceiver(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/spam-filter/${enc(domain)}/dmarc-receiver`, data);\r\n }\r\n\r\n // ================================================================\r\n // 自動応答設定\r\n // ================================================================\r\n\r\n async listAutoReply(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/auto-reply`, params);\r\n }\r\n\r\n async getAutoReply(mailAddress: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/auto-reply/${enc(mailAddress)}`);\r\n }\r\n\r\n async addAutoReply(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/auto-reply`, data);\r\n }\r\n\r\n async updateAutoReply(mailAddress: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/auto-reply/${enc(mailAddress)}`, data);\r\n }\r\n\r\n async deleteAutoReply(mailAddress: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/auto-reply/${enc(mailAddress)}`);\r\n }\r\n\r\n // ================================================================\r\n // SMTP認証国外アクセス制限\r\n // ================================================================\r\n\r\n async listSmtpAbroadRestriction(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/smtp-abroad-restriction`, params);\r\n }\r\n\r\n async updateSmtpAbroadRestriction(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/smtp-abroad-restriction/${enc(domain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // DKIM設定\r\n // ================================================================\r\n\r\n async listDkim(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/dkim`, params);\r\n }\r\n\r\n async getDkim(fqdn: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/dkim/${enc(fqdn)}`);\r\n }\r\n\r\n async updateDkim(fqdn: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/dkim/${enc(fqdn)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // SPF設定\r\n // ================================================================\r\n\r\n async listSpf(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/spf`, params);\r\n }\r\n\r\n async addSpf(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/spf`, data);\r\n }\r\n\r\n async updateSpf(fqdn: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/spf/${enc(fqdn)}`, data);\r\n }\r\n\r\n async deleteSpf(fqdn: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/spf/${enc(fqdn)}`);\r\n }\r\n\r\n // ================================================================\r\n // DMARC設定(送信側)\r\n // ================================================================\r\n\r\n async listDmarc(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/dmarc`, params);\r\n }\r\n\r\n async updateDmarc(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/dmarc/${enc(domain)}`, data);\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 } from '../../../lib/command-helper.js';\r\n\r\nfunction parseAddressList(value: string): string[] {\r\n if (value === '') {\r\n return [];\r\n }\r\n return value.split(',').map((a) => a.trim()).filter((a) => a !== '');\r\n}\r\n\r\nexport function registerSpamFilterCommands(parent: Command, brand: BrandConfig): void {\r\n const spamFilter = parent\r\n .command('spam-filter')\r\n .description('迷惑メールフィルタ設定');\r\n\r\n spamFilter\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.listSpamFilter(params), getFormat(parent));\r\n });\r\n\r\n spamFilter\r\n .command('update <domain>')\r\n .description('迷惑メールフィルタ設定を更新(指定した項目のみ)')\r\n .option('--filter-type <value>', '迷惑メールフィルタ(off / standard / cloudmark_authority)')\r\n .option('--detection-action <action>', '検知時の処理(inbox / spam / trash / delete)')\r\n .option('--white-list <addresses>', 'ホワイトリスト(カンマ区切り。空文字でクリア)')\r\n .option('--black-list <addresses>', 'ブラックリスト(カンマ区切り。空文字でクリア)')\r\n .option(\r\n '--spam-level <level>',\r\n '標準スパムフィルタ判定基準(very_lenient / lenient / normal / strict / very_strict / strictest)',\r\n )\r\n .option('--strict-non-japanese-subject <value>', '日本語を含まない件名に対して判定を厳しくする(true/false)')\r\n .option('--strict-html-mail <value>', 'HTMLメールに対して判定を厳しくする(true/false)')\r\n .action(async (domain: string, opts) => {\r\n const data: Record<string, unknown> = {};\r\n\r\n if (opts.filterType !== undefined) data.filter_type = opts.filterType;\r\n if (opts.detectionAction !== undefined) data.detection_action = opts.detectionAction;\r\n if (opts.whiteList !== undefined) data.white_list = parseAddressList(opts.whiteList);\r\n if (opts.blackList !== undefined) data.black_list = parseAddressList(opts.blackList);\r\n if (opts.spamLevel !== undefined) data.spam_level = opts.spamLevel;\r\n if (opts.strictNonJapaneseSubject !== undefined) {\r\n data.strict_non_japanese_subject = opts.strictNonJapaneseSubject;\r\n }\r\n if (opts.strictHtmlMail !== undefined) {\r\n data.strict_html_mail = opts.strictHtmlMail;\r\n }\r\n\r\n if (Object.keys(data).length === 0) {\r\n throw new Error('更新するフィールドを1つ以上指定してください');\r\n }\r\n\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateSpamFilter(domain, data), getFormat(parent));\r\n });\r\n\r\n spamFilter\r\n .command('dmarc-receiver-update <domain>')\r\n .description('受信側DMARC設定を更新')\r\n .requiredOption('--dmarc-receiver <value>', '受信側DMARC設定(true/false)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.updateSpamFilterDmarcReceiver(domain, {\r\n dmarc_receiver: opts.dmarcReceiver,\r\n }),\r\n getFormat(parent),\r\n );\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, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerAutoReplyCommands(parent: Command, brand: BrandConfig): void {\r\n const autoReply = parent\r\n .command('auto-reply')\r\n .description('自動応答設定');\r\n\r\n autoReply\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.listAutoReply(params), getFormat(parent));\r\n });\r\n\r\n autoReply\r\n .command('get <mailAddress>')\r\n .description('自動応答設定の詳細を取得')\r\n .action(async (mailAccount: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getAutoReply(mailAccount), getFormat(parent));\r\n });\r\n\r\n autoReply\r\n .command('add')\r\n .description('自動応答設定を追加')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .requiredOption('--mail-address <address>', 'メールアドレス')\r\n .requiredOption('--from-name <name>', '送信者名')\r\n .requiredOption('--subject <subject>', '件名')\r\n .requiredOption('--body <body>', '本文')\r\n .requiredOption('--quote-incoming <value>', '受信メールの引用(true/false または 1/0)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addAutoReply({\r\n domain: opts.domain,\r\n mail_address: opts.mailAddress,\r\n from_name: opts.fromName,\r\n subject: opts.subject,\r\n body: opts.body,\r\n quote_incoming: opts.quoteIncoming,\r\n }), getFormat(parent));\r\n });\r\n\r\n autoReply\r\n .command('update <mailAddress>')\r\n .description('自動応答設定を更新(指定した項目のみ)')\r\n .option('--from-name <name>', '送信者名')\r\n .option('--subject <subject>', '件名')\r\n .option('--body <body>', '本文')\r\n .option('--quote-incoming <value>', '受信メールの引用(true/false または 1/0)')\r\n .action(async (mailAccount: string, opts) => {\r\n const data: Record<string, unknown> = {};\r\n if (opts.fromName !== undefined) data.from_name = opts.fromName;\r\n if (opts.subject !== undefined) data.subject = opts.subject;\r\n if (opts.body !== undefined) data.body = opts.body;\r\n if (opts.quoteIncoming !== undefined) {\r\n data.quote_incoming = opts.quoteIncoming;\r\n }\r\n\r\n if (Object.keys(data).length === 0) {\r\n throw new Error('更新するフィールドを1つ以上指定してください(--from-name / --subject / --body / --quote-incoming)');\r\n }\r\n\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateAutoReply(mailAccount, data), getFormat(parent));\r\n });\r\n\r\n autoReply\r\n .command('delete <mailAddress>')\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.deleteAutoReply(mailAccount), 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 registerSmtpAbroadRestrictionCommands(parent: Command, brand: BrandConfig): void {\r\n const smtpAbroadRestriction = parent\r\n .command('smtp-abroad-restriction')\r\n .description('SMTP認証の国外アクセス制限設定');\r\n\r\n smtpAbroadRestriction\r\n .command('list')\r\n .description('SMTP認証の国外アクセス制限設定を取得')\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.listSmtpAbroadRestriction(params), getFormat(parent));\r\n });\r\n\r\n smtpAbroadRestriction\r\n .command('update <domain>')\r\n .description('SMTP認証の国外アクセス制限設定を更新')\r\n .requiredOption('--abroad-access-restriction <value>', '国外アクセス制限の有効/無効(true/false または 1/0)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.updateSmtpAbroadRestriction(domain, {\r\n abroad_access_restriction: opts.abroadAccessRestriction,\r\n }),\r\n getFormat(parent),\r\n );\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 registerDkimCommands(parent: Command, brand: BrandConfig): void {\r\n const dkim = parent\r\n .command('dkim')\r\n .description('DKIM設定');\r\n\r\n dkim\r\n .command('list')\r\n .description('DKIM設定一覧を取得')\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.listDkim(params), getFormat(parent));\r\n });\r\n\r\n dkim\r\n .command('get <fqdn>')\r\n .description('DKIM設定の詳細を取得')\r\n .action(async (fqdn: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getDkim(fqdn), getFormat(parent));\r\n });\r\n\r\n dkim\r\n .command('update <fqdn>')\r\n .description('DKIM設定の有効/無効を切り替え')\r\n .requiredOption('--enabled <value>', 'DKIMの有効/無効(true/false または 1/0)')\r\n .action(async (fqdn: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.updateDkim(fqdn, { enabled: opts.enabled }),\r\n getFormat(parent),\r\n );\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\nfunction parseNotificationMailAddresses(value: string): string[] {\r\n if (value === '') {\r\n return [];\r\n }\r\n return value.split(',').map((address) => address.trim()).filter((address) => address !== '');\r\n}\r\n\r\nexport function registerDmarcCommands(parent: Command, brand: BrandConfig): void {\r\n const dmarc = parent\r\n .command('dmarc')\r\n .description('送信側DMARC設定');\r\n\r\n dmarc\r\n .command('list')\r\n .description('送信側DMARC設定を取得')\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.listDmarc(params), getFormat(parent));\r\n });\r\n\r\n dmarc\r\n .command('update <domain>')\r\n .description('送信側DMARC設定を更新(指定した項目のみ)')\r\n .option('--policy <policy>', 'DMARCポリシー(none / quarantine / reject)')\r\n .option('--report-enabled <value>', 'レポート通知の有効/無効(true/false または 1/0)。false のとき通知先は自動的に空になる')\r\n .option('--notification-mail-addresses <addresses>', 'レポート通知先メールアドレス(カンマ区切り)。--report-enabled true のときは1件以上必須')\r\n .action(async (domain: string, opts) => {\r\n const data: Record<string, unknown> = {};\r\n\r\n if (opts.policy !== undefined) data.policy = opts.policy;\r\n if (opts.reportEnabled !== undefined) {\r\n data.report_enabled = opts.reportEnabled;\r\n }\r\n if (opts.notificationMailAddresses !== undefined) {\r\n data.notification_mail_addresses = parseNotificationMailAddresses(opts.notificationMailAddresses);\r\n }\r\n\r\n if (Object.keys(data).length === 0) {\r\n throw new Error('更新するフィールドを1つ以上指定してください');\r\n }\r\n\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDmarc(domain, 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 } from '../../../lib/command-helper.js';\r\n\r\nconst UPDATE_ACTIONS = ['reset', 'enable_gmail', 'custom'] as const;\r\n\r\nexport function registerSpfCommands(parent: Command, brand: BrandConfig): void {\r\n const spf = parent\r\n .command('spf')\r\n .description('SPF設定');\r\n\r\n spf\r\n .command('list')\r\n .description('SPF設定一覧を取得')\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.listSpf(params), getFormat(parent));\r\n });\r\n\r\n spf\r\n .command('add')\r\n .description('SPF設定を追加')\r\n .requiredOption('--fqdn <fqdn>', 'FQDN(example.com または sub.example.com)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addSpf({ fqdn: opts.fqdn }), getFormat(parent));\r\n });\r\n\r\n spf\r\n .command('update <fqdn>')\r\n .description('SPF設定を更新(reset / enable_gmail / custom)')\r\n .requiredOption(\r\n '--action <action>',\r\n `操作種別(${UPDATE_ACTIONS.join(' / ')})`,\r\n )\r\n .option('--spf-record <record>', 'カスタムSPFレコード(action=custom のとき必須)')\r\n .action(async (fqdn: string, opts) => {\r\n const body: Record<string, unknown> = { action: opts.action };\r\n if (opts.spfRecord !== undefined) body.spf_record = opts.spfRecord;\r\n\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateSpf(fqdn, body), getFormat(parent));\r\n });\r\n\r\n spf\r\n .command('delete <fqdn>')\r\n .description('SPF設定を削除')\r\n .action(async (fqdn: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteSpf(fqdn), 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.1.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/spam-filter/index.ts","../../core/src/commands/server/mail-filter/index.ts","../../core/src/commands/server/auto-reply/index.ts","../../core/src/commands/server/smtp-abroad-restriction/index.ts","../../core/src/commands/server/dkim/index.ts","../../core/src/commands/server/dmarc/index.ts","../../core/src/commands/server/spf/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/server/resource-monitor/index.ts","../../core/src/commands/server/waf/index.ts","../../core/src/commands/server/php-ini/index.ts","../../core/src/commands/server/wordpress-security/index.ts","../../core/src/commands/server/x-accelerator/index.ts","../../core/src/commands/server/server-cache/index.ts","../../core/src/commands/server/browser-cache/index.ts","../../core/src/commands/server/url-redirect/index.ts","../../core/src/commands/server/access-deny/index.ts","../../core/src/commands/server/xpagespeed/index.ts","../../core/src/commands/server/auto-backup/index.ts","../../core/src/commands/server/mysql-backup/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 { registerSpamFilterCommands } from './commands/server/spam-filter/index.js';\r\nimport { registerMailFilterCommands } from './commands/server/mail-filter/index.js';\r\nimport { registerAutoReplyCommands } from './commands/server/auto-reply/index.js';\r\nimport { registerSmtpAbroadRestrictionCommands } from './commands/server/smtp-abroad-restriction/index.js';\r\nimport { registerDkimCommands } from './commands/server/dkim/index.js';\r\nimport { registerDmarcCommands } from './commands/server/dmarc/index.js';\r\nimport { registerSpfCommands } from './commands/server/spf/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 { registerResourceMonitorCommands } from './commands/server/resource-monitor/index.js';\r\nimport { registerWafCommands } from './commands/server/waf/index.js';\r\nimport { registerPhpIniCommands } from './commands/server/php-ini/index.js';\r\nimport { registerWordPressSecurityCommands } from './commands/server/wordpress-security/index.js';\r\nimport { registerXAcceleratorCommands } from './commands/server/x-accelerator/index.js';\r\nimport { registerServerCacheCommands } from './commands/server/server-cache/index.js';\r\nimport { registerBrowserCacheCommands } from './commands/server/browser-cache/index.js';\r\nimport { registerUrlRedirectCommands } from './commands/server/url-redirect/index.js';\r\nimport { registerAccessDenyCommands } from './commands/server/access-deny/index.js';\r\nimport { registerXPageSpeedCommands } from './commands/server/xpagespeed/index.js';\r\nimport { registerAutoBackupCommands } from './commands/server/auto-backup/index.js';\r\nimport { registerMysqlBackupCommands } from './commands/server/mysql-backup/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 registerSpamFilterCommands(server, brand);\r\n registerMailFilterCommands(server, brand);\r\n registerAutoReplyCommands(server, brand);\r\n registerSmtpAbroadRestrictionCommands(server, brand);\r\n registerDkimCommands(server, brand);\r\n registerDmarcCommands(server, brand);\r\n registerSpfCommands(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 registerResourceMonitorCommands(server, brand);\r\n registerWafCommands(server, brand);\r\n registerPhpIniCommands(server, brand);\r\n registerWordPressSecurityCommands(server, brand);\r\n registerXAcceleratorCommands(server, brand);\r\n registerServerCacheCommands(server, brand);\r\n registerBrowserCacheCommands(server, brand);\r\n registerUrlRedirectCommands(server, brand);\r\n registerAccessDenyCommands(server, brand);\r\n registerXPageSpeedCommands(server, brand);\r\n registerAutoBackupCommands(server, brand);\r\n registerMysqlBackupCommands(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 // 迷惑メールフィルタ設定\r\n // ================================================================\r\n\r\n async listSpamFilter(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/spam-filter`, params);\r\n }\r\n\r\n async updateSpamFilter(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/spam-filter/${enc(domain)}`, data);\r\n }\r\n\r\n async updateSpamFilterDmarcReceiver(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/spam-filter/${enc(domain)}/dmarc-receiver`, data);\r\n }\r\n\r\n // ================================================================\r\n // 自動応答設定\r\n // ================================================================\r\n\r\n async listAutoReply(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/auto-reply`, params);\r\n }\r\n\r\n async getAutoReply(mailAddress: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/auto-reply/${enc(mailAddress)}`);\r\n }\r\n\r\n async addAutoReply(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/auto-reply`, data);\r\n }\r\n\r\n async updateAutoReply(mailAddress: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/auto-reply/${enc(mailAddress)}`, data);\r\n }\r\n\r\n async deleteAutoReply(mailAddress: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/auto-reply/${enc(mailAddress)}`);\r\n }\r\n\r\n // ================================================================\r\n // SMTP認証国外アクセス制限\r\n // ================================================================\r\n\r\n async listSmtpAbroadRestriction(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/smtp-abroad-restriction`, params);\r\n }\r\n\r\n async updateSmtpAbroadRestriction(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/smtp-abroad-restriction/${enc(domain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // DKIM設定\r\n // ================================================================\r\n\r\n async listDkim(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/dkim`, params);\r\n }\r\n\r\n async getDkim(fqdn: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/dkim/${enc(fqdn)}`);\r\n }\r\n\r\n async updateDkim(fqdn: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/dkim/${enc(fqdn)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // SPF設定\r\n // ================================================================\r\n\r\n async listSpf(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/spf`, params);\r\n }\r\n\r\n async addSpf(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/spf`, data);\r\n }\r\n\r\n async updateSpf(fqdn: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/spf/${enc(fqdn)}`, data);\r\n }\r\n\r\n async deleteSpf(fqdn: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/spf/${enc(fqdn)}`);\r\n }\r\n\r\n // ================================================================\r\n // DMARC設定(送信側)\r\n // ================================================================\r\n\r\n async listDmarc(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/dmarc`, params);\r\n }\r\n\r\n async updateDmarc(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/dmarc/${enc(domain)}`, data);\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 getResourceMonitor(date: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/resource-monitor`, { date });\r\n }\r\n\r\n // ================================================================\r\n // WAF設定\r\n // ================================================================\r\n\r\n async listWaf(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/waf`, params);\r\n }\r\n\r\n async updateWaf(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/waf/${enc(domain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // php.ini設定\r\n // ================================================================\r\n\r\n async listPhpIni(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/php-ini`, params);\r\n }\r\n\r\n async updatePhpIni(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/php-ini/${enc(domain)}`, data);\r\n }\r\n\r\n async resetPhpIni(domain: string): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/php-ini/${enc(domain)}/reset`);\r\n }\r\n\r\n // ================================================================\r\n // WordPressセキュリティ設定\r\n // ================================================================\r\n\r\n async getWordPressSecurity(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/wordpress-security`, params);\r\n }\r\n\r\n async updateWordPressSecurity(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/wordpress-security`, data);\r\n }\r\n\r\n // ================================================================\r\n // Xアクセラレータ設定\r\n // ================================================================\r\n\r\n async listXAccelerator(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/x-accelerator`, params);\r\n }\r\n\r\n async updateXAccelerator(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/x-accelerator/${enc(domain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // サーバーキャッシュ設定\r\n // ================================================================\r\n\r\n async listServerCache(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/server-cache`, params);\r\n }\r\n\r\n async updateServerCache(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/server-cache/${enc(domain)}`, data);\r\n }\r\n\r\n async clearServerCache(domain: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/server-cache/${enc(domain)}/cache`);\r\n }\r\n\r\n // ================================================================\r\n // ブラウザキャッシュ設定\r\n // ================================================================\r\n\r\n async listBrowserCache(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/browser-cache`, params);\r\n }\r\n\r\n async updateBrowserCache(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/browser-cache/${enc(domain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // サイト転送設定\r\n // ================================================================\r\n\r\n async listUrlRedirect(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/url-redirect`, params);\r\n }\r\n\r\n async addUrlRedirect(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/url-redirect`, data);\r\n }\r\n\r\n async deleteUrlRedirect(redirectId: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/url-redirect/${enc(redirectId)}`);\r\n }\r\n\r\n // ================================================================\r\n // アクセス拒否設定\r\n // ================================================================\r\n\r\n async listAccessDeny(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/access-deny`, params);\r\n }\r\n\r\n async addAccessDeny(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/access-deny`, data);\r\n }\r\n\r\n async updateAccessDeny(denyId: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/access-deny/${enc(denyId)}`, data);\r\n }\r\n\r\n async deleteAccessDeny(denyId: string): Promise<unknown> {\r\n return this.delete(`${this.serverPath()}/access-deny/${enc(denyId)}`);\r\n }\r\n\r\n // ================================================================\r\n // XPageSpeed設定\r\n // ================================================================\r\n\r\n async listXPageSpeed(params?: Record<string, string>): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/xpagespeed`, params);\r\n }\r\n\r\n async updateXPageSpeed(domain: string, data: Record<string, unknown>): Promise<unknown> {\r\n return this.put(`${this.serverPath()}/xpagespeed/${enc(domain)}`, data);\r\n }\r\n\r\n // ================================================================\r\n // 自動バックアップの取得・復元\r\n // ================================================================\r\n\r\n async listAutoBackupBackupDates(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/auto-backup/backup-dates`);\r\n }\r\n\r\n async listAutoBackup(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/auto-backup`);\r\n }\r\n\r\n async getAutoBackup(requestId: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/auto-backup/${enc(requestId)}`);\r\n }\r\n\r\n async createAutoBackup(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/auto-backup`, data);\r\n }\r\n\r\n // ================================================================\r\n // MySQLバックアップの取得・復元\r\n // ================================================================\r\n\r\n async listMysqlBackupDatabases(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mysql-backup/databases`);\r\n }\r\n\r\n async listMysqlBackup(): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mysql-backup`);\r\n }\r\n\r\n async getMysqlBackup(requestId: string): Promise<unknown> {\r\n return this.get(`${this.serverPath()}/mysql-backup/${enc(requestId)}`);\r\n }\r\n\r\n async createMysqlBackup(data: Record<string, unknown>): Promise<unknown> {\r\n return this.post(`${this.serverPath()}/mysql-backup`, data);\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キーを設定(対象サーバーが1台のキーはサーバー名を自動検出)')\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 } else if (!servername) {\r\n console.error(' このAPIキーは対象サーバーが固定されていません(「すべてのサーバー」等)。');\r\n console.error(' サーバー系コマンドでは --servername で対象を指定してください。');\r\n console.error(` 例: ${brand.commandName} server --servername <サーバーID> info`);\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 } else {\r\n console.log('サーバー名: 未固定(サーバー系コマンドでは --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}` : ' 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\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 [arrayKey, arrayValue] = arrayEntry;\r\n const scalarEntries = Object.entries(obj).filter(([k]) => k !== arrayKey);\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 const items = arrayValue as Record<string, unknown>[];\r\n if (items.length === 0) {\r\n // 一覧0件単体は (データなし)。他フィールドと併存する空配列は (0件)\r\n parts.push(scalarEntries.length > 0 ? `${arrayKey} (0件)` : '(データなし)');\r\n } else {\r\n parts.push(renderArrayTable(items));\r\n }\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 collectTableKeys(items: Record<string, unknown>[]): string[] {\r\n const keys: string[] = [];\r\n const seen = new Set<string>();\r\n for (const item of items) {\r\n for (const key of Object.keys(item)) {\r\n if (!seen.has(key)) {\r\n seen.add(key);\r\n keys.push(key);\r\n }\r\n }\r\n }\r\n return keys;\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 = collectTableKeys(items);\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 } from '../../../lib/command-helper.js';\r\n\r\nfunction parseAddressList(value: string): string[] {\r\n if (value === '') {\r\n return [];\r\n }\r\n return value.split(',').map((a) => a.trim()).filter((a) => a !== '');\r\n}\r\n\r\nexport function registerSpamFilterCommands(parent: Command, brand: BrandConfig): void {\r\n const spamFilter = parent\r\n .command('spam-filter')\r\n .description('迷惑メールフィルタ設定');\r\n\r\n spamFilter\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.listSpamFilter(params), getFormat(parent));\r\n });\r\n\r\n spamFilter\r\n .command('update <domain>')\r\n .description('迷惑メールフィルタ設定を更新(指定した項目のみ)')\r\n .option('--filter-type <value>', '迷惑メールフィルタ(off / standard / cloudmark_authority)')\r\n .option('--detection-action <action>', '検知時の処理(inbox / spam / trash / delete)')\r\n .option('--white-list <addresses>', 'ホワイトリスト(カンマ区切り。空文字でクリア)')\r\n .option('--black-list <addresses>', 'ブラックリスト(カンマ区切り。空文字でクリア)')\r\n .option(\r\n '--spam-level <level>',\r\n '標準スパムフィルタ判定基準(very_lenient / lenient / normal / strict / very_strict / strictest)',\r\n )\r\n .option('--strict-non-japanese-subject <value>', '日本語を含まない件名に対して判定を厳しくする(true/false)')\r\n .option('--strict-html-mail <value>', 'HTMLメールに対して判定を厳しくする(true/false)')\r\n .action(async (domain: string, opts) => {\r\n const data: Record<string, unknown> = {};\r\n\r\n if (opts.filterType !== undefined) data.filter_type = opts.filterType;\r\n if (opts.detectionAction !== undefined) data.detection_action = opts.detectionAction;\r\n if (opts.whiteList !== undefined) data.white_list = parseAddressList(opts.whiteList);\r\n if (opts.blackList !== undefined) data.black_list = parseAddressList(opts.blackList);\r\n if (opts.spamLevel !== undefined) data.spam_level = opts.spamLevel;\r\n if (opts.strictNonJapaneseSubject !== undefined) {\r\n data.strict_non_japanese_subject = opts.strictNonJapaneseSubject;\r\n }\r\n if (opts.strictHtmlMail !== undefined) {\r\n data.strict_html_mail = opts.strictHtmlMail;\r\n }\r\n\r\n if (Object.keys(data).length === 0) {\r\n throw new Error('更新するフィールドを1つ以上指定してください');\r\n }\r\n\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateSpamFilter(domain, data), getFormat(parent));\r\n });\r\n\r\n spamFilter\r\n .command('dmarc-receiver-update <domain>')\r\n .description('受信側DMARC設定を更新')\r\n .requiredOption('--dmarc-receiver <value>', '受信側DMARC設定(true/false)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.updateSpamFilterDmarcReceiver(domain, {\r\n dmarc_receiver: opts.dmarcReceiver,\r\n }),\r\n getFormat(parent),\r\n );\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, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nexport function registerAutoReplyCommands(parent: Command, brand: BrandConfig): void {\r\n const autoReply = parent\r\n .command('auto-reply')\r\n .description('自動応答設定');\r\n\r\n autoReply\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.listAutoReply(params), getFormat(parent));\r\n });\r\n\r\n autoReply\r\n .command('get <mailAddress>')\r\n .description('自動応答設定の詳細を取得')\r\n .action(async (mailAccount: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getAutoReply(mailAccount), getFormat(parent));\r\n });\r\n\r\n autoReply\r\n .command('add')\r\n .description('自動応答設定を追加')\r\n .requiredOption('--domain <domain>', '対象ドメイン')\r\n .requiredOption('--mail-address <address>', 'メールアドレス')\r\n .requiredOption('--from-name <name>', '送信者名')\r\n .requiredOption('--subject <subject>', '件名')\r\n .requiredOption('--body <body>', '本文')\r\n .requiredOption('--quote-incoming <value>', '受信メールの引用(true/false または 1/0)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addAutoReply({\r\n domain: opts.domain,\r\n mail_address: opts.mailAddress,\r\n from_name: opts.fromName,\r\n subject: opts.subject,\r\n body: opts.body,\r\n quote_incoming: opts.quoteIncoming,\r\n }), getFormat(parent));\r\n });\r\n\r\n autoReply\r\n .command('update <mailAddress>')\r\n .description('自動応答設定を更新(指定した項目のみ)')\r\n .option('--from-name <name>', '送信者名')\r\n .option('--subject <subject>', '件名')\r\n .option('--body <body>', '本文')\r\n .option('--quote-incoming <value>', '受信メールの引用(true/false または 1/0)')\r\n .action(async (mailAccount: string, opts) => {\r\n const data: Record<string, unknown> = {};\r\n if (opts.fromName !== undefined) data.from_name = opts.fromName;\r\n if (opts.subject !== undefined) data.subject = opts.subject;\r\n if (opts.body !== undefined) data.body = opts.body;\r\n if (opts.quoteIncoming !== undefined) {\r\n data.quote_incoming = opts.quoteIncoming;\r\n }\r\n\r\n if (Object.keys(data).length === 0) {\r\n throw new Error('更新するフィールドを1つ以上指定してください(--from-name / --subject / --body / --quote-incoming)');\r\n }\r\n\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateAutoReply(mailAccount, data), getFormat(parent));\r\n });\r\n\r\n autoReply\r\n .command('delete <mailAddress>')\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.deleteAutoReply(mailAccount), 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 registerSmtpAbroadRestrictionCommands(parent: Command, brand: BrandConfig): void {\r\n const smtpAbroadRestriction = parent\r\n .command('smtp-abroad-restriction')\r\n .description('SMTP認証の国外アクセス制限設定');\r\n\r\n smtpAbroadRestriction\r\n .command('list')\r\n .description('SMTP認証の国外アクセス制限設定を取得')\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.listSmtpAbroadRestriction(params), getFormat(parent));\r\n });\r\n\r\n smtpAbroadRestriction\r\n .command('update <domain>')\r\n .description('SMTP認証の国外アクセス制限設定を更新')\r\n .requiredOption('--abroad-access-restriction <value>', '国外アクセス制限の有効/無効(true/false または 1/0)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.updateSmtpAbroadRestriction(domain, {\r\n abroad_access_restriction: opts.abroadAccessRestriction,\r\n }),\r\n getFormat(parent),\r\n );\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 registerDkimCommands(parent: Command, brand: BrandConfig): void {\r\n const dkim = parent\r\n .command('dkim')\r\n .description('DKIM設定');\r\n\r\n dkim\r\n .command('list')\r\n .description('DKIM設定一覧を取得')\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.listDkim(params), getFormat(parent));\r\n });\r\n\r\n dkim\r\n .command('get <fqdn>')\r\n .description('DKIM設定の詳細を取得')\r\n .action(async (fqdn: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getDkim(fqdn), getFormat(parent));\r\n });\r\n\r\n dkim\r\n .command('update <fqdn>')\r\n .description('DKIM設定の有効/無効を切り替え')\r\n .requiredOption('--enabled <value>', 'DKIMの有効/無効(true/false または 1/0)')\r\n .action(async (fqdn: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.updateDkim(fqdn, { enabled: opts.enabled }),\r\n getFormat(parent),\r\n );\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\nfunction parseNotificationMailAddresses(value: string): string[] {\r\n if (value === '') {\r\n return [];\r\n }\r\n return value.split(',').map((address) => address.trim()).filter((address) => address !== '');\r\n}\r\n\r\nexport function registerDmarcCommands(parent: Command, brand: BrandConfig): void {\r\n const dmarc = parent\r\n .command('dmarc')\r\n .description('送信側DMARC設定');\r\n\r\n dmarc\r\n .command('list')\r\n .description('送信側DMARC設定を取得')\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.listDmarc(params), getFormat(parent));\r\n });\r\n\r\n dmarc\r\n .command('update <domain>')\r\n .description('送信側DMARC設定を更新(指定した項目のみ)')\r\n .option('--policy <policy>', 'DMARCポリシー(none / quarantine / reject)')\r\n .option('--report-enabled <value>', 'レポート通知の有効/無効(true/false または 1/0)。false のとき通知先は自動的に空になる')\r\n .option('--notification-mail-addresses <addresses>', 'レポート通知先メールアドレス(カンマ区切り)。--report-enabled true のときは1件以上必須')\r\n .action(async (domain: string, opts) => {\r\n const data: Record<string, unknown> = {};\r\n\r\n if (opts.policy !== undefined) data.policy = opts.policy;\r\n if (opts.reportEnabled !== undefined) {\r\n data.report_enabled = opts.reportEnabled;\r\n }\r\n if (opts.notificationMailAddresses !== undefined) {\r\n data.notification_mail_addresses = parseNotificationMailAddresses(opts.notificationMailAddresses);\r\n }\r\n\r\n if (Object.keys(data).length === 0) {\r\n throw new Error('更新するフィールドを1つ以上指定してください');\r\n }\r\n\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateDmarc(domain, 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 } from '../../../lib/command-helper.js';\r\n\r\nconst UPDATE_ACTIONS = ['reset', 'enable_gmail', 'custom'] as const;\r\n\r\nexport function registerSpfCommands(parent: Command, brand: BrandConfig): void {\r\n const spf = parent\r\n .command('spf')\r\n .description('SPF設定');\r\n\r\n spf\r\n .command('list')\r\n .description('SPF設定一覧を取得')\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.listSpf(params), getFormat(parent));\r\n });\r\n\r\n spf\r\n .command('add')\r\n .description('SPF設定を追加')\r\n .requiredOption('--fqdn <fqdn>', 'FQDN(example.com または sub.example.com)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.addSpf({ fqdn: opts.fqdn }), getFormat(parent));\r\n });\r\n\r\n spf\r\n .command('update <fqdn>')\r\n .description('SPF設定を更新(reset / enable_gmail / custom)')\r\n .requiredOption(\r\n '--action <action>',\r\n `操作種別(${UPDATE_ACTIONS.join(' / ')})`,\r\n )\r\n .option('--spf-record <record>', 'カスタムSPFレコード(action=custom のとき必須)')\r\n .action(async (fqdn: string, opts) => {\r\n const body: Record<string, unknown> = { action: opts.action };\r\n if (opts.spfRecord !== undefined) body.spf_record = opts.spfRecord;\r\n\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateSpf(fqdn, body), getFormat(parent));\r\n });\r\n\r\n spf\r\n .command('delete <fqdn>')\r\n .description('SPF設定を削除')\r\n .action(async (fqdn: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteSpf(fqdn), 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 { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nexport function registerResourceMonitorCommands(parent: Command, brand: BrandConfig): void {\r\n const resourceMonitor = parent\r\n .command('resource-monitor')\r\n .description('リソースモニター');\r\n\r\n resourceMonitor\r\n .command('get')\r\n .description('指定日のCPU・メモリ・転送量時系列を取得')\r\n .requiredOption('--date <date>', '対象日(Y-m-d または Ymd。当日含む直近1か月)')\r\n .action(async (opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getResourceMonitor(opts.date), 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 registerWafCommands(parent: Command, brand: BrandConfig): void {\r\n const waf = parent\r\n .command('waf')\r\n .description('WAF設定');\r\n\r\n waf\r\n .command('list')\r\n .description('WAF設定一覧を取得')\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.listWaf(params), getFormat(parent));\r\n });\r\n\r\n waf\r\n .command('update <domain>')\r\n .description('WAF設定を更新(指定した項目のみ)')\r\n .option('--xss-protection <value>', 'XSS対策(true/false または 1/0)')\r\n .option('--sql-injection-protection <value>', 'SQL対策(true/false または 1/0)')\r\n .option('--file-protection <value>', 'ファイル対策(true/false または 1/0)')\r\n .option('--mail-protection <value>', 'メール対策(true/false または 1/0)')\r\n .option('--command-protection <value>', 'コマンド対策(true/false または 1/0)')\r\n .option('--php-protection <value>', 'PHP対策(true/false または 1/0)')\r\n .action(async (domain: string, opts) => {\r\n const data: Record<string, unknown> = {};\r\n\r\n if (opts.xssProtection !== undefined) data.xss_protection = opts.xssProtection;\r\n if (opts.sqlInjectionProtection !== undefined) data.sql_injection_protection = opts.sqlInjectionProtection;\r\n if (opts.fileProtection !== undefined) data.file_protection = opts.fileProtection;\r\n if (opts.mailProtection !== undefined) data.mail_protection = opts.mailProtection;\r\n if (opts.commandProtection !== undefined) data.command_protection = opts.commandProtection;\r\n if (opts.phpProtection !== undefined) data.php_protection = opts.phpProtection;\r\n\r\n if (Object.keys(data).length === 0) {\r\n throw new Error('更新するフィールドを1つ以上指定してください');\r\n }\r\n\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateWaf(domain, 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\n/** CLI kebab-case オプション名 → API ボディキー */\r\nconst PHP_INI_UPDATE_OPTIONS: { cli: string; api: string; desc: string }[] = [\r\n { cli: 'display-errors', api: 'display_errors', desc: 'エラー内容を画面に出力(On / Off)' },\r\n { cli: 'error-reporting', api: 'error_reporting', desc: 'エラー出力レベル' },\r\n { cli: 'display-startup-errors', api: 'display_startup_errors', desc: '起動時エラーを表示(On / Off)' },\r\n { cli: 'session-auto-start', api: 'session.auto_start', desc: 'セッション自動開始(0 / 1)' },\r\n { cli: 'session-name', api: 'session.name', desc: 'セッション名' },\r\n { cli: 'session-use-cookies', api: 'session.use_cookies', desc: 'セッションIDにクッキーを使用(0 / 1)' },\r\n { cli: 'session-use-only-cookies', api: 'session.use_only_cookies', desc: 'クッキーのみでセッションIDを保存(0 / 1)' },\r\n { cli: 'session-use-trans-sid', api: 'session.use_trans_sid', desc: 'URLへセッションIDを自動設定(0 / 1)' },\r\n { cli: 'session-cookie-lifetime', api: 'session.cookie_lifetime', desc: 'クッキー有効期間(秒)' },\r\n { cli: 'session-cookie-path', api: 'session.cookie_path', desc: 'クッキーを有効とするパス' },\r\n { cli: 'session-cookie-domain', api: 'session.cookie_domain', desc: 'クッキーを有効とするドメイン' },\r\n { cli: 'mbstring-language', api: 'mbstring.language', desc: 'デフォルト言語' },\r\n { cli: 'mbstring-internal-encoding', api: 'mbstring.internal_encoding', desc: '内部文字エンコーディング' },\r\n { cli: 'mbstring-http-input', api: 'mbstring.http_input', desc: 'HTTP入力文字エンコーディング変換' },\r\n { cli: 'mbstring-http-output', api: 'mbstring.http_output', desc: 'HTTP出力文字エンコーディング変換' },\r\n { cli: 'mbstring-encoding-translation', api: 'mbstring.encoding_translation', desc: '内部エンコーディングへの変換(On / Off)' },\r\n { cli: 'mbstring-detect-order', api: 'mbstring.detect_order', desc: '文字コード検出' },\r\n { cli: 'mbstring-substitute-character', api: 'mbstring.substitute_character', desc: '無効文字の代替文字' },\r\n { cli: 'max-execution-time', api: 'max_execution_time', desc: '最大実行時間(秒)' },\r\n { cli: 'max-input-time', api: 'max_input_time', desc: '入力パース最大時間(秒)' },\r\n { cli: 'memory-limit', api: 'memory_limit', desc: '最大メモリ' },\r\n { cli: 'post-max-size', api: 'post_max_size', desc: 'POSTデータ最大サイズ' },\r\n { cli: 'upload-max-filesize', api: 'upload_max_filesize', desc: 'アップロードファイル最大サイズ' },\r\n { cli: 'register-globals', api: 'register_globals', desc: 'register_globals(On / Off)' },\r\n { cli: 'magic-quotes-gpc', api: 'magic_quotes_gpc', desc: 'magic_quotes_gpc(On / Off)' },\r\n { cli: 'safe-mode', api: 'safe_mode', desc: 'safe_mode(On / Off。user_ini_active が true のときは変更不可)' },\r\n { cli: 'file-uploads', api: 'file_uploads', desc: 'HTTPファイルアップロード(On / Off。user_ini_active が true のときは変更不可)' },\r\n { cli: 'allow-url-fopen', api: 'allow_url_fopen', desc: 'allow_url_fopen(On / Off。user_ini_active が true のときは変更不可)' },\r\n { cli: 'allow-url-include', api: 'allow_url_include', desc: 'allow_url_include(On / Off。user_ini_active が true のときは変更不可)' },\r\n];\r\n\r\nfunction cliOptionToCamelCase(cli: string): string {\r\n return cli.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\r\n}\r\n\r\nfunction buildUpdateData(opts: Record<string, unknown>): Record<string, unknown> {\r\n const data: Record<string, unknown> = {};\r\n for (const { cli, api } of PHP_INI_UPDATE_OPTIONS) {\r\n const value = opts[cliOptionToCamelCase(cli)];\r\n if (value !== undefined) data[api] = value;\r\n }\r\n return data;\r\n}\r\n\r\nexport function registerPhpIniCommands(parent: Command, brand: BrandConfig): void {\r\n const phpIni = parent\r\n .command('php-ini')\r\n .description('php.ini設定(php-version とは別)');\r\n\r\n phpIni\r\n .command('list')\r\n .description('php.ini設定を取得')\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.listPhpIni(params), getFormat(parent));\r\n });\r\n\r\n const update = phpIni\r\n .command('update <domain>')\r\n .description('php.ini設定を更新(指定した項目のみ)');\r\n\r\n for (const { cli, desc } of PHP_INI_UPDATE_OPTIONS) {\r\n update.option(`--${cli} <value>`, desc);\r\n }\r\n\r\n update.action(async (domain: string, opts) => {\r\n const data = buildUpdateData(opts);\r\n if (Object.keys(data).length === 0) {\r\n throw new Error('更新するフィールドを1つ以上指定してください');\r\n }\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updatePhpIni(domain, data), getFormat(parent));\r\n });\r\n\r\n phpIni\r\n .command('reset <domain>')\r\n .description('php.ini設定を初期値に戻す')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (domain: string) => {\r\n await confirmDestructiveAction(\r\n parent,\r\n `ドメイン \"${domain}\" の php.ini を初期値に戻します。この操作は取り消しできません。よろしいですか?`,\r\n );\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.resetPhpIni(domain), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiError } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nconst UPDATE_BLOCKS = [\r\n 'comment_restriction',\r\n 'login_attempt_limit',\r\n 'foreign_ip_restriction',\r\n 'ip_restriction',\r\n] as const;\r\n\r\nconst UPDATE_OPTIONS: { cli: string; desc: string }[] = [\r\n { cli: 'comment-restriction-bulk-post-enabled', desc: '単一ユーザーからの大量投稿(true/false または 1/0)' },\r\n { cli: 'comment-restriction-foreign-post-enabled', desc: '国外からの投稿(true/false または 1/0)' },\r\n { cli: 'login-attempt-limit-enabled', desc: 'ログイン試行回数制限(true/false または 1/0)' },\r\n { cli: 'foreign-ip-dashboard-enabled', desc: 'ダッシュボード アクセス制限(true/false または 1/0)' },\r\n { cli: 'foreign-ip-dashboard-allowed-ips', desc: 'ダッシュボード アクセス制限のホワイトリスト(カンマ区切り。通常はクォート不要。空にする場合のみ \"\")' },\r\n { cli: 'foreign-ip-xml-rpc-api-enabled', desc: 'XML-RPC API アクセス制限(true/false または 1/0)' },\r\n { cli: 'foreign-ip-xml-rpc-api-allowed-ips', desc: 'XML-RPC API アクセス制限のホワイトリスト(カンマ区切り。通常はクォート不要。空にする場合のみ \"\")' },\r\n { cli: 'foreign-ip-rest-api-enabled', desc: 'REST API アクセス制限(true/false または 1/0)' },\r\n { cli: 'foreign-ip-rest-api-allowed-ips', desc: 'REST API アクセス制限のホワイトリスト(カンマ区切り。通常はクォート不要。空にする場合のみ \"\")' },\r\n { cli: 'foreign-ip-wlwmanifest-enabled', desc: 'wlwmanifest.xml アクセス制限(true/false または 1/0)' },\r\n { cli: 'foreign-ip-wlwmanifest-allowed-ips', desc: 'wlwmanifest.xml アクセス制限のホワイトリスト(カンマ区切り。通常はクォート不要。空にする場合のみ \"\")' },\r\n { cli: 'ip-restriction-enabled', desc: 'IPアドレス制限(ダッシュボード)(true/false または 1/0)' },\r\n { cli: 'ip-restriction-allowed-ips', desc: 'IPアドレス制限のホワイトリスト(カンマ区切り IPv4 または CIDR。通常はクォート不要。空にする場合のみ \"\")' },\r\n];\r\n\r\nfunction parseIpAddressList(value: string): string[] {\r\n if (value === '') {\r\n return [];\r\n }\r\n return value.split(',').map((a) => a.trim()).filter((a) => a !== '');\r\n}\r\n\r\nfunction parseBooleanParam(label: string, value: string): boolean {\r\n const normalized = value.trim().toLowerCase();\r\n if (normalized !== 'true' && normalized !== 'false' && normalized !== '1' && normalized !== '0') {\r\n throw new ApiError(\r\n '入力値が正しくありません',\r\n 422,\r\n 'VALIDATION_ERROR',\r\n [`${label}は true/false または 1/0 で指定してください。`],\r\n );\r\n }\r\n return normalized === 'true' || normalized === '1';\r\n}\r\n\r\nfunction setForeignIpTarget(\r\n block: Record<string, unknown>,\r\n target: string,\r\n enabledLabel: string,\r\n enabled: string | undefined,\r\n allowedIps: string | undefined,\r\n): void {\r\n const entry: Record<string, unknown> = {};\r\n if (enabled !== undefined) entry.enabled = parseBooleanParam(enabledLabel, enabled);\r\n if (allowedIps !== undefined) entry.allowed_ip_addresses = parseIpAddressList(allowedIps);\r\n if (Object.keys(entry).length > 0) block[target] = entry;\r\n}\r\n\r\nfunction buildUpdateData(domain: string, opts: Record<string, unknown>): Record<string, unknown> {\r\n const data: Record<string, unknown> = { domain };\r\n\r\n const commentRestriction: Record<string, unknown> = {};\r\n if (opts.commentRestrictionBulkPostEnabled !== undefined) {\r\n commentRestriction.bulk_post = {\r\n enabled: parseBooleanParam('単一ユーザーからの大量投稿', opts.commentRestrictionBulkPostEnabled as string),\r\n };\r\n }\r\n if (opts.commentRestrictionForeignPostEnabled !== undefined) {\r\n commentRestriction.foreign_post = {\r\n enabled: parseBooleanParam('国外からの投稿', opts.commentRestrictionForeignPostEnabled as string),\r\n };\r\n }\r\n if (Object.keys(commentRestriction).length > 0) {\r\n data.comment_restriction = commentRestriction;\r\n }\r\n\r\n if (opts.loginAttemptLimitEnabled !== undefined) {\r\n data.login_attempt_limit = {\r\n enabled: parseBooleanParam('ログイン試行回数制限', opts.loginAttemptLimitEnabled as string),\r\n };\r\n }\r\n\r\n const foreignIpRestriction: Record<string, unknown> = {};\r\n setForeignIpTarget(\r\n foreignIpRestriction,\r\n 'dashboard',\r\n 'ダッシュボード アクセス制限',\r\n opts.foreignIpDashboardEnabled as string | undefined,\r\n opts.foreignIpDashboardAllowedIps as string | undefined,\r\n );\r\n setForeignIpTarget(\r\n foreignIpRestriction,\r\n 'xml_rpc_api',\r\n 'XML-RPC API アクセス制限',\r\n opts.foreignIpXmlRpcApiEnabled as string | undefined,\r\n opts.foreignIpXmlRpcApiAllowedIps as string | undefined,\r\n );\r\n setForeignIpTarget(\r\n foreignIpRestriction,\r\n 'rest_api',\r\n 'REST API アクセス制限',\r\n opts.foreignIpRestApiEnabled as string | undefined,\r\n opts.foreignIpRestApiAllowedIps as string | undefined,\r\n );\r\n setForeignIpTarget(\r\n foreignIpRestriction,\r\n 'wlwmanifest',\r\n 'wlwmanifest.xml アクセス制限',\r\n opts.foreignIpWlwmanifestEnabled as string | undefined,\r\n opts.foreignIpWlwmanifestAllowedIps as string | undefined,\r\n );\r\n if (Object.keys(foreignIpRestriction).length > 0) {\r\n data.foreign_ip_restriction = foreignIpRestriction;\r\n }\r\n\r\n const ipRestriction: Record<string, unknown> = {};\r\n if (opts.ipRestrictionEnabled !== undefined) {\r\n ipRestriction.enabled = parseBooleanParam('IPアドレス制限(ダッシュボード)', opts.ipRestrictionEnabled as string);\r\n }\r\n if (opts.ipRestrictionAllowedIps !== undefined) {\r\n ipRestriction.allowed_ip_addresses = parseIpAddressList(opts.ipRestrictionAllowedIps as string);\r\n }\r\n if (Object.keys(ipRestriction).length > 0) {\r\n data.ip_restriction = ipRestriction;\r\n }\r\n\r\n if (!UPDATE_BLOCKS.some((key) => key in data)) {\r\n throw new Error('更新するフィールドを1つ以上指定してください');\r\n }\r\n\r\n return data;\r\n}\r\n\r\nexport function registerWordPressSecurityCommands(parent: Command, brand: BrandConfig): void {\r\n const wordpressSecurity = parent\r\n .command('wordpress-security')\r\n .description('WordPressセキュリティ設定');\r\n\r\n wordpressSecurity\r\n .command('get')\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.getWordPressSecurity(params), getFormat(parent));\r\n });\r\n\r\n const update = wordpressSecurity\r\n .command('update <domain>')\r\n .description('WordPressセキュリティ設定を更新(指定した項目のみ)');\r\n\r\n for (const { cli, desc } of UPDATE_OPTIONS) {\r\n update.option(`--${cli} <value>`, desc);\r\n }\r\n\r\n update.action(async (domain: string, opts) => {\r\n const data = buildUpdateData(domain, opts);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateWordPressSecurity(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 } from '../../../lib/command-helper.js';\r\n\r\nexport function registerXAcceleratorCommands(parent: Command, brand: BrandConfig): void {\r\n const xAccelerator = parent\r\n .command('x-accelerator')\r\n .description('Xアクセラレータ設定');\r\n\r\n xAccelerator\r\n .command('list')\r\n .description('Xアクセラレータ設定一覧を取得')\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.listXAccelerator(params), getFormat(parent));\r\n });\r\n\r\n xAccelerator\r\n .command('update <domain>')\r\n .description('Xアクセラレータ設定を変更')\r\n .requiredOption('--xaccelerator-status <status>', 'Xアクセラレータ設定(off / v1 / v2)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.updateXAccelerator(domain, { xaccelerator_status: opts.xacceleratorStatus }),\r\n getFormat(parent),\r\n );\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 registerServerCacheCommands(parent: Command, brand: BrandConfig): void {\r\n const serverCache = parent\r\n .command('server-cache')\r\n .description('サーバーキャッシュ設定');\r\n\r\n serverCache\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.listServerCache(params), getFormat(parent));\r\n });\r\n\r\n serverCache\r\n .command('update <domain>')\r\n .description('サーバーキャッシュ設定を変更')\r\n .requiredOption('--server-cache-status <status>', 'サーバーキャッシュ設定(on / off)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.updateServerCache(domain, { server_cache_status: opts.serverCacheStatus }),\r\n getFormat(parent),\r\n );\r\n });\r\n\r\n serverCache\r\n .command('clear-cache <domain>')\r\n .description('サーバーキャッシュの内容を削除(パージ)')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (domain: string) => {\r\n await confirmDestructiveAction(\r\n parent,\r\n `ドメイン \"${domain}\" のサーバーキャッシュ内容を削除します。よろしいですか?`,\r\n );\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.clearServerCache(domain), 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 registerBrowserCacheCommands(parent: Command, brand: BrandConfig): void {\r\n const browserCache = parent\r\n .command('browser-cache')\r\n .description('ブラウザキャッシュ設定');\r\n\r\n browserCache\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.listBrowserCache(params), getFormat(parent));\r\n });\r\n\r\n browserCache\r\n .command('update <domain>')\r\n .description('ブラウザキャッシュ設定を変更')\r\n .requiredOption('--browser-cache-status <status>', 'ブラウザキャッシュ設定(all / ignore-css-js / off)')\r\n .action(async (domain: string, opts) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.updateBrowserCache(domain, { browser_cache_status: opts.browserCacheStatus }),\r\n getFormat(parent),\r\n );\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 registerUrlRedirectCommands(parent: Command, brand: BrandConfig): void {\r\n const urlRedirect = parent\r\n .command('url-redirect')\r\n .description('サイト転送設定');\r\n\r\n urlRedirect\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.listUrlRedirect(params), getFormat(parent));\r\n });\r\n\r\n urlRedirect\r\n .command('add')\r\n .description('サイト転送設定を追加')\r\n .requiredOption('--domain <domain>', '契約ドメイン')\r\n .requiredOption('--from-host <host>', '転送元ホスト(FQDN)')\r\n .option('--from-path <path>', '転送元パス(省略時は /。先頭が / でない場合は API 側で / を付与)')\r\n .requiredOption('--redirect-to-url <url>', '転送先URL(http または https)')\r\n .requiredOption('--status-code <code>', '転送時のステータスコード(301 / 302)')\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 from_host: opts.fromHost,\r\n redirect_to_url: opts.redirectToUrl,\r\n status_code: Number(opts.statusCode),\r\n };\r\n if (opts.fromPath !== undefined) data.from_path = opts.fromPath;\r\n printResult(await client.addUrlRedirect(data), getFormat(parent));\r\n });\r\n\r\n urlRedirect\r\n .command('delete <redirectId>')\r\n .description('サイト転送設定を削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (redirectId: string) => {\r\n await confirmDestructiveAction(\r\n parent,\r\n `サイト転送設定 \"${redirectId}\" を削除します。よろしいですか?`,\r\n );\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteUrlRedirect(redirectId), 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 registerAccessDenyCommands(parent: Command, brand: BrandConfig): void {\r\n const accessDeny = parent\r\n .command('access-deny')\r\n .description('アクセス拒否設定');\r\n\r\n accessDeny\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.listAccessDeny(params), getFormat(parent));\r\n });\r\n\r\n accessDeny\r\n .command('add')\r\n .description('アクセス拒否設定を追加')\r\n .requiredOption('--domain <domain>', '契約ドメイン')\r\n .requiredOption('--ip-address <address>', '拒否IPアドレス・ホスト(IPv4 / CIDR / 部分IP / ホスト名)')\r\n .option('--memo <memo>', 'メモ(最大500文字)')\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 ip_address: opts.ipAddress,\r\n };\r\n if (opts.memo !== undefined) data.memo = opts.memo;\r\n printResult(await client.addAccessDeny(data), getFormat(parent));\r\n });\r\n\r\n accessDeny\r\n .command('update <denyId>')\r\n .description('アクセス拒否設定のメモを更新')\r\n .option('--memo <memo>', 'メモ(省略または空文字でクリア)')\r\n .action(async (denyId: string, opts) => {\r\n if (opts.memo === undefined) {\r\n throw new Error('--memo を指定してください');\r\n }\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateAccessDeny(denyId, { memo: opts.memo }), getFormat(parent));\r\n });\r\n\r\n accessDeny\r\n .command('delete <denyId>')\r\n .description('アクセス拒否設定を削除')\r\n .option('-y, --yes', '確認プロンプトをスキップ')\r\n .action(async (denyId: string) => {\r\n await confirmDestructiveAction(\r\n parent,\r\n `アクセス拒否設定 \"${denyId}\" を削除します。よろしいですか?`,\r\n );\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.deleteAccessDeny(denyId), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiError } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult } from '../../../lib/command-helper.js';\r\n\r\nconst UPDATE_OPTIONS: { cli: string; api: string; label: string; desc: string }[] = [\r\n { cli: 'xoptimize-images', api: 'xoptimize_images', label: '画像最適化', desc: '画像最適化(true/false または 1/0)' },\r\n { cli: 'lazyload-images', api: 'lazyload_images', label: '画像遅延読み込み', desc: '画像遅延読み込み(true/false または 1/0)' },\r\n { cli: 'xoptimize-css', api: 'xoptimize_css', label: 'CSS最適化', desc: 'CSS最適化(true/false または 1/0)' },\r\n { cli: 'lazyload-css', api: 'lazyload_css', label: 'CSS遅延読み込み', desc: 'CSS遅延読み込み(true/false または 1/0)' },\r\n { cli: 'xoptimize-javascript', api: 'xoptimize_javascript', label: 'JavaScript最適化', desc: 'JavaScript最適化(true/false または 1/0)' },\r\n { cli: 'lazyload-javascript', api: 'lazyload_javascript', label: 'JavaScript遅延読み込み', desc: 'JavaScript遅延読み込み(true/false または 1/0)' },\r\n];\r\n\r\nfunction cliOptionToCamelCase(cli: string): string {\r\n return cli.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\r\n}\r\n\r\nfunction parseBooleanParam(label: string, value: string): boolean {\r\n const normalized = value.trim().toLowerCase();\r\n if (normalized !== 'true' && normalized !== 'false' && normalized !== '1' && normalized !== '0') {\r\n throw new ApiError(\r\n '入力値が正しくありません',\r\n 422,\r\n 'VALIDATION_ERROR',\r\n [`${label}は true/false または 1/0 で指定してください。`],\r\n );\r\n }\r\n return normalized === 'true' || normalized === '1';\r\n}\r\n\r\nfunction buildUpdateData(opts: Record<string, unknown>): Record<string, unknown> {\r\n const data: Record<string, unknown> = {};\r\n for (const { cli, api, label } of UPDATE_OPTIONS) {\r\n const value = opts[cliOptionToCamelCase(cli)];\r\n if (value !== undefined) data[api] = parseBooleanParam(label, value as string);\r\n }\r\n if (Object.keys(data).length === 0) {\r\n throw new Error('更新するフィールドを1つ以上指定してください');\r\n }\r\n if (Object.keys(data).length > 1) {\r\n throw new Error('1リクエストで変更できるのは1つの最適化機能のみです');\r\n }\r\n return data;\r\n}\r\n\r\nexport function registerXPageSpeedCommands(parent: Command, brand: BrandConfig): void {\r\n const xPageSpeed = parent\r\n .command('xpagespeed')\r\n .description('XPageSpeed設定');\r\n\r\n xPageSpeed\r\n .command('list')\r\n .description('XPageSpeed設定一覧を取得')\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.listXPageSpeed(params), getFormat(parent));\r\n });\r\n\r\n const update = xPageSpeed\r\n .command('update <domain>')\r\n .description('XPageSpeedの最適化機能を変更(1リクエストで1機能のみ)');\r\n\r\n for (const { cli, desc } of UPDATE_OPTIONS) {\r\n update.option(`--${cli} <value>`, desc);\r\n }\r\n\r\n update.action(async (domain: string, opts) => {\r\n const data = buildUpdateData(opts);\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.updateXPageSpeed(domain, data), getFormat(parent));\r\n });\r\n}\r\n","import type { Command } from 'commander';\r\nimport type { BrandConfig } from 'xnp-shared';\r\nimport { ApiError } from 'xnp-shared';\r\nimport { resolveClient, getFormat, printResult, confirmDestructiveAction } from '../../../lib/command-helper.js';\r\n\r\nconst DOMAIN_ELEMENT_TYPES = ['web', 'setting', 'mail'] as const;\r\n\r\nfunction validationError(...errors: string[]): never {\r\n throw new ApiError('入力値が正しくありません', 422, 'VALIDATION_ERROR', errors);\r\n}\r\n\r\n\r\nfunction collectFlagValue(value: string, previous: string[]): string[] {\r\n\r\n return previous.concat([value]);\r\n\r\n}\r\n\r\n\r\n\r\nfunction parseDomainElementEntry(part: string): { domain: string; elements: string[] } {\r\n\r\n const equalIndex = part.indexOf('=');\r\n\r\n if (equalIndex === -1) {\r\n\r\n validationError(\r\n 'domain_elements の形式が正しくありません。example.com=web,setting 形式で指定してください',\r\n );\r\n\r\n }\r\n\r\n\r\n\r\n const domain = part.slice(0, equalIndex).trim();\r\n\r\n const elementsRaw = part.slice(equalIndex + 1).trim();\r\n\r\n if (domain === '' || elementsRaw === '') {\r\n\r\n validationError(\r\n 'domain_elements の形式が正しくありません。example.com=web,setting 形式で指定してください',\r\n );\r\n\r\n }\r\n\r\n\r\n\r\n const elements = elementsRaw.split(',').map((e) => e.trim()).filter((e) => e !== '');\r\n\r\n if (elements.length === 0) {\r\n\r\n validationError(`domain_elements の ${domain} に elements(${DOMAIN_ELEMENT_TYPES.join(', ')})を1件以上指定してください`);\r\n\r\n }\r\n\r\n\r\n\r\n return { domain, elements };\r\n\r\n}\r\n\r\n\r\n\r\nfunction parseDomainElements(values: string[]): Array<{ domain: string; elements: string[] }> {\r\n\r\n if (values.length === 0) {\r\n\r\n validationError('scope が selected の場合、domain_elements を1件以上指定してください');\r\n\r\n }\r\n\r\n\r\n\r\n return values.map((value) => parseDomainElementEntry(value.trim()));\r\n\r\n}\r\n\r\n\r\n\r\nexport function registerAutoBackupCommands(parent: Command, brand: BrandConfig): void {\r\n\r\n const autoBackup = parent\r\n\r\n .command('auto-backup')\r\n\r\n .description('自動バックアップの取得・復元');\r\n\r\n\r\n\r\n autoBackup\r\n\r\n .command('backup-dates')\r\n\r\n .description('選択可能なバックアップ日一覧を取得')\r\n\r\n .action(async () => {\r\n\r\n const client = resolveClient(parent, brand);\r\n\r\n printResult(await client.listAutoBackupBackupDates(), getFormat(parent));\r\n\r\n });\r\n\r\n\r\n\r\n autoBackup\r\n\r\n .command('list')\r\n\r\n .description('自動バックアップ申込履歴一覧を取得')\r\n\r\n .action(async () => {\r\n\r\n const client = resolveClient(parent, brand);\r\n\r\n printResult(await client.listAutoBackup(), getFormat(parent));\r\n\r\n });\r\n\r\n\r\n\r\n autoBackup\r\n\r\n .command('show <requestId>')\r\n\r\n .description('自動バックアップ申込履歴の詳細を取得')\r\n\r\n .action(async (requestId: string) => {\r\n\r\n const client = resolveClient(parent, brand);\r\n\r\n printResult(await client.getAutoBackup(requestId), getFormat(parent));\r\n\r\n });\r\n\r\n\r\n\r\n autoBackup\r\n\r\n .command('create')\r\n\r\n .description('自動バックアップの取得または復元を申し込む')\r\n\r\n .requiredOption('--backup-date <date>', '対象バックアップ日(Y-m-d)')\r\n\r\n .requiredOption('--operation-type <type>', '処理種別(fetch / restore)')\r\n\r\n .requiredOption('--scope <scope>', '処理方法(all / selected)')\r\n\r\n .option(\r\n\r\n '--domain-elements <value>',\r\n\r\n '対象ドメイン・ディレクトリ(scope=selected のとき必須。繰り返し可)。形式: example.com=web,setting(elements: web / setting / mail)',\r\n\r\n collectFlagValue,\r\n\r\n [],\r\n\r\n )\r\n\r\n .option('-y, --yes', '確認プロンプトをスキップ(restore 時)')\r\n\r\n .action(async (opts) => {\r\n\r\n const operationType = opts.operationType as string;\r\n\r\n const scope = opts.scope as string;\r\n\r\n\r\n\r\n if (operationType === 'restore') {\r\n\r\n await confirmDestructiveAction(\r\n\r\n parent,\r\n\r\n '自動バックアップの復元を申し込みます。サーバー上のデータが上書きされ、取り消しできません。よろしいですか?',\r\n\r\n );\r\n\r\n }\r\n\r\n\r\n\r\n const data: Record<string, unknown> = {\r\n backup_date: opts.backupDate,\r\n operation_type: operationType,\r\n scope,\r\n };\r\n\r\n const domainElementValues = opts.domainElements as string[];\r\n\r\n if (scope === 'selected') {\r\n if (domainElementValues.length === 0) {\r\n validationError('scope が selected の場合、--domain-elements を指定してください');\r\n }\r\n data.domain_elements = parseDomainElements(domainElementValues);\r\n } else if (domainElementValues.length > 0) {\r\n validationError('対象ドメイン・ディレクトリは 処理方法 が selected の場合のみ指定できます。');\r\n }\r\n\r\n\r\n\r\n const client = resolveClient(parent, brand);\r\n\r\n printResult(await client.createAutoBackup(data), getFormat(parent));\r\n\r\n });\r\n\r\n}\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 registerMysqlBackupCommands(parent: Command, brand: BrandConfig): void {\r\n const mysqlBackup = parent\r\n .command('mysql-backup')\r\n .description('MySQLバックアップの取得・復元');\r\n\r\n mysqlBackup\r\n .command('databases')\r\n .description('MySQLバックアップの状態を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listMysqlBackupDatabases(), getFormat(parent));\r\n });\r\n\r\n mysqlBackup\r\n .command('list')\r\n .description('MySQLバックアップ申込履歴一覧を取得')\r\n .action(async () => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.listMysqlBackup(), getFormat(parent));\r\n });\r\n\r\n mysqlBackup\r\n .command('show <requestId>')\r\n .description('MySQLバックアップ申込履歴詳細を取得')\r\n .action(async (requestId: string) => {\r\n const client = resolveClient(parent, brand);\r\n printResult(await client.getMysqlBackup(requestId), getFormat(parent));\r\n });\r\n\r\n mysqlBackup\r\n .command('create')\r\n .description('MySQLバックアップの取得または復元を申し込む')\r\n .requiredOption('--db-name <name>', 'データベース名')\r\n .requiredOption('--backup-date <date>', '対象バックアップ日(Y-m-d)')\r\n .requiredOption('--operation-type <type>', '処理種別(fetch / restore)')\r\n .option('-y, --yes', '確認プロンプトをスキップ(restore 時)')\r\n .action(async (opts) => {\r\n const operationType = opts.operationType as string;\r\n\r\n if (operationType === 'restore') {\r\n await confirmDestructiveAction(\r\n parent,\r\n `データベース \"${opts.dbName}\" の MySQLバックアップ復元を申し込みます。対象 DB が上書きされ、取り消しできません。よろしいですか?`,\r\r\n );\r\n }\r\n\r\n const client = resolveClient(parent, brand);\r\n printResult(\r\n await client.createMysqlBackup({\r\n db_name: opts.dbName,\r\n backup_date: opts.backupDate,\r\n operation_type: operationType,\r\n }),\r\n getFormat(parent),\r\n );\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.2.1\",\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","buildUpdateData","UPDATE_OPTIONS","cliOptionToCamelCase","parseBooleanParam","buildUpdateData"]}