@docyrus/cli 0.2.0 → 0.3.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/README.md +1 -1
- package/dist/cli.js +36 -19
- package/dist/cli.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -7
package/dist/index.js
CHANGED
|
@@ -11,7 +11,7 @@ import Conf from 'conf';
|
|
|
11
11
|
// src/storage/file-storage.ts
|
|
12
12
|
|
|
13
13
|
// src/config/constants.ts
|
|
14
|
-
var DOCYRUS_API_URL = "https://
|
|
14
|
+
var DOCYRUS_API_URL = "https://api.docyrus.com";
|
|
15
15
|
var OAUTH_CLIENT_ID = "90565525-8283-4881-82a9-8613eb82ae27";
|
|
16
16
|
var OAUTH_SCOPES = "offline_access Read.All Users.Read Users.Read.All DS.Read.All".split(" ");
|
|
17
17
|
var OAUTH_CALLBACK_PORT_MIN = 9876;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/constants.ts","../src/utils/platform.ts","../src/storage/encryption.ts","../src/storage/file-storage.ts","../src/storage/keychain-storage.ts","../src/storage/cli-token-manager.ts","../src/utils/errors.ts","../src/auth/credential-auth.ts","../src/auth/oauth-server.ts","../src/utils/browser.ts","../src/auth/oauth-auth.ts","../src/config/config-manager.ts"],"names":["join","ApiAuthError","randomBytes","RestApiClient"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Environment Configuration\n * Values are injected at BUILD TIME via tsup.config.ts\n * See tsup.config.ts for default values and .env.example for configuration\n */\n\n// API Configuration (injected at build time)\nexport const DOCYRUS_API_URL = process.env.DOCYRUS_API_URL as string;\n\n// OAuth2 Configuration (injected at build time)\nexport const OAUTH_CLIENT_ID = process.env.DOCYRUS_OAUTH_CLIENT_ID as string;\nexport const OAUTH_SCOPES = (process.env.DOCYRUS_OAUTH_SCOPES as string).split(' ');\n\n// OAuth2 Endpoints (same base as API)\nexport const OAUTH_AUTHORIZE_URL = `${DOCYRUS_API_URL}/v1/oauth2/authorize`;\nexport const OAUTH_TOKEN_URL = `${DOCYRUS_API_URL}/v1/oauth2/token`;\n\n// Local callback server for CLI OAuth flow\nexport const OAUTH_CALLBACK_PORT_MIN = 9876;\nexport const OAUTH_CALLBACK_PORT_MAX = 9899;\nexport const OAUTH_REDIRECT_URI = (port: number) => `http://localhost:${port}/callback`;\nexport const OAUTH_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\n\n// Storage Configuration\nexport const KEYCHAIN_SERVICE = 'docyrus-cli';\nexport const CONFIG_DIR = '.docyrus';\nexport const CREDENTIALS_FILE = 'credentials.enc';\nexport const CONFIG_FILE = 'config.json';\n\n// Token Keys\nexport const TOKEN_KEYS = {\n ACCESS_TOKEN: 'accessToken',\n REFRESH_TOKEN: 'refreshToken',\n USER_EMAIL: 'userEmail',\n EXPIRES_AT: 'expiresAt',\n GITHUB_TOKEN: 'githubToken' // For private template access - persists after logout\n} as const;\n\n// CLI Info\nexport const CLI_NAME = 'docyrus';\nexport const CLI_VERSION = '0.0.1';\nexport const NPM_PACKAGE_NAME = 'docyrus';\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nimport { CONFIG_DIR } from '../config/constants.js';\n\nexport function isWindows(): boolean {\n return process.platform === 'win32';\n}\n\nexport function isMacOS(): boolean {\n return process.platform === 'darwin';\n}\n\nexport function isLinux(): boolean {\n return process.platform === 'linux';\n}\n\nexport function getHomeDir(): string {\n return homedir();\n}\n\nexport function getConfigDir(): string {\n return join(getHomeDir(), CONFIG_DIR);\n}\n\nexport function getPlatformName(): string {\n if (isMacOS()) return 'macOS';\n if (isWindows()) return 'Windows';\n if (isLinux()) return 'Linux';\n\n return process.platform;\n}\n","import {\n createCipheriv, createDecipheriv, randomBytes, scryptSync, createHash\n} from 'node:crypto';\nimport { hostname, userInfo } from 'node:os';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst KEY_LENGTH = 32;\nconst IV_LENGTH = 16;\nconst AUTH_TAG_LENGTH = 16;\nconst SALT_LENGTH = 32;\n\nfunction getMachineId(): string {\n const parts = [\n hostname(),\n userInfo().username,\n process.platform,\n process.arch\n ];\n\n return createHash('sha256').update(parts.join('-')).digest('hex');\n}\n\nexport function deriveKey(salt: Buffer): Buffer {\n const machineId = getMachineId();\n\n return scryptSync(machineId, salt, KEY_LENGTH);\n}\n\nexport function encrypt(data: string): string {\n const salt = randomBytes(SALT_LENGTH);\n const key = deriveKey(salt);\n const iv = randomBytes(IV_LENGTH);\n\n const cipher = createCipheriv(ALGORITHM, key, iv, { authTagLength: AUTH_TAG_LENGTH });\n const encrypted = Buffer.concat([cipher.update(data, 'utf8'), cipher.final()]);\n const authTag = cipher.getAuthTag();\n\n // Format: salt:iv:authTag:encrypted (all base64)\n return [\n salt.toString('base64'),\n iv.toString('base64'),\n authTag.toString('base64'),\n encrypted.toString('base64')\n ].join(':');\n}\n\nexport function decrypt(encryptedData: string): string {\n const parts = encryptedData.split(':');\n\n if (parts.length !== 4) {\n throw new Error('Invalid encrypted data format');\n }\n\n const [\n saltB64,\n ivB64,\n authTagB64,\n dataB64\n ] = parts;\n const salt = Buffer.from(saltB64, 'base64');\n const iv = Buffer.from(ivB64, 'base64');\n const authTag = Buffer.from(authTagB64, 'base64');\n const encrypted = Buffer.from(dataB64, 'base64');\n\n const key = deriveKey(salt);\n\n const decipher = createDecipheriv(ALGORITHM, key, iv, { authTagLength: AUTH_TAG_LENGTH });\n\n decipher.setAuthTag(authTag);\n\n const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);\n\n return decrypted.toString('utf8');\n}\n","import {\n readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync\n} from 'node:fs';\nimport { join } from 'node:path';\n\nimport { getConfigDir } from '../utils/platform.js';\nimport { CREDENTIALS_FILE } from '../config/constants.js';\nimport { encrypt, decrypt } from './encryption.js';\n\nexport interface StorageData {\n [key: string]: string;\n}\n\nexport class FileStorage {\n private filePath: string;\n constructor() {\n const configDir = getConfigDir();\n\n this.filePath = join(configDir, CREDENTIALS_FILE);\n }\n private ensureConfigDir(): void {\n const configDir = getConfigDir();\n\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true, mode: 0o700 });\n }\n }\n private readData(): StorageData {\n if (!existsSync(this.filePath)) {\n return {};\n }\n\n try {\n const encrypted = readFileSync(this.filePath, 'utf8');\n const decrypted = decrypt(encrypted);\n\n return JSON.parse(decrypted);\n } catch {\n return {};\n }\n }\n private writeData(data: StorageData): void {\n this.ensureConfigDir();\n const json = JSON.stringify(data);\n const encrypted = encrypt(json);\n\n writeFileSync(this.filePath, encrypted, { mode: 0o600 });\n }\n async get(key: string): Promise<string | null> {\n const data = this.readData();\n\n return data[key] ?? null;\n }\n async set(key: string, value: string): Promise<void> {\n const data = this.readData();\n\n data[key] = value;\n this.writeData(data);\n }\n async delete(key: string): Promise<void> {\n const data = this.readData();\n\n delete data[key];\n\n if (Object.keys(data).length === 0) {\n this.clear();\n } else {\n this.writeData(data);\n }\n }\n async clear(): Promise<void> {\n if (existsSync(this.filePath)) {\n unlinkSync(this.filePath);\n }\n }\n async has(key: string): Promise<boolean> {\n const data = this.readData();\n\n return key in data;\n }\n}\n","import { KEYCHAIN_SERVICE } from '../config/constants.js';\n\nlet keytar: typeof import('keytar') | null = null;\n\nasync function getKeytar(): Promise<typeof import('keytar') | null> {\n if (keytar !== null) {\n return keytar;\n }\n\n try {\n keytar = await import('keytar');\n\n return keytar;\n } catch {\n keytar = null;\n\n return null;\n }\n}\n\nexport class KeychainStorage {\n private service: string;\n constructor(service = KEYCHAIN_SERVICE) {\n this.service = service;\n }\n async isAvailable(): Promise<boolean> {\n const kt = await getKeytar();\n\n if (!kt) return false;\n\n try {\n // Try a simple operation to verify keychain access\n await kt.findCredentials(this.service);\n\n return true;\n } catch {\n return false;\n }\n }\n async get(key: string): Promise<string | null> {\n const kt = await getKeytar();\n\n if (!kt) return null;\n\n try {\n return await kt.getPassword(this.service, key);\n } catch {\n return null;\n }\n }\n async set(key: string, value: string): Promise<boolean> {\n const kt = await getKeytar();\n\n if (!kt) return false;\n\n try {\n await kt.setPassword(this.service, key, value);\n\n return true;\n } catch {\n return false;\n }\n }\n async delete(key: string): Promise<boolean> {\n const kt = await getKeytar();\n\n if (!kt) return false;\n\n try {\n return await kt.deletePassword(this.service, key);\n } catch {\n return false;\n }\n }\n async clear(): Promise<void> {\n const kt = await getKeytar();\n\n if (!kt) return;\n\n try {\n const credentials = await kt.findCredentials(this.service);\n\n for (const cred of credentials) {\n await kt.deletePassword(this.service, cred.account);\n }\n } catch {\n // Ignore errors during clear\n }\n }\n}\n","import { type TokenManager } from '@docyrus/api-client';\n\nimport { KeychainStorage } from './keychain-storage.js';\nimport { FileStorage } from './file-storage.js';\nimport { TOKEN_KEYS } from '../config/constants.js';\n\nexport class CliTokenManager implements TokenManager {\n private keychain: KeychainStorage;\n private fileStorage: FileStorage;\n private keychainAvailable: boolean | null = null;\n constructor() {\n this.keychain = new KeychainStorage();\n this.fileStorage = new FileStorage();\n }\n private async useKeychain(): Promise<boolean> {\n if (this.keychainAvailable === null) {\n this.keychainAvailable = await this.keychain.isAvailable();\n }\n\n return this.keychainAvailable;\n }\n async getToken(): Promise<string | null> {\n if (await this.useKeychain()) {\n const token = await this.keychain.get(TOKEN_KEYS.ACCESS_TOKEN);\n\n if (token) return token;\n }\n\n return await this.fileStorage.get(TOKEN_KEYS.ACCESS_TOKEN);\n }\n async setToken(token: string): Promise<void> {\n if (await this.useKeychain()) {\n const success = await this.keychain.set(TOKEN_KEYS.ACCESS_TOKEN, token);\n\n if (success) return;\n }\n\n await this.fileStorage.set(TOKEN_KEYS.ACCESS_TOKEN, token);\n }\n async clearToken(): Promise<void> {\n // Clear from both storages to ensure complete cleanup\n await this.keychain.delete(TOKEN_KEYS.ACCESS_TOKEN);\n await this.fileStorage.delete(TOKEN_KEYS.ACCESS_TOKEN);\n }\n async getRefreshToken(): Promise<string | null> {\n if (await this.useKeychain()) {\n const token = await this.keychain.get(TOKEN_KEYS.REFRESH_TOKEN);\n\n if (token) return token;\n }\n\n return await this.fileStorage.get(TOKEN_KEYS.REFRESH_TOKEN);\n }\n async setRefreshToken(token: string): Promise<void> {\n if (await this.useKeychain()) {\n const success = await this.keychain.set(TOKEN_KEYS.REFRESH_TOKEN, token);\n\n if (success) return;\n }\n\n await this.fileStorage.set(TOKEN_KEYS.REFRESH_TOKEN, token);\n }\n async clearRefreshToken(): Promise<void> {\n await this.keychain.delete(TOKEN_KEYS.REFRESH_TOKEN);\n await this.fileStorage.delete(TOKEN_KEYS.REFRESH_TOKEN);\n }\n async getUserEmail(): Promise<string | null> {\n if (await this.useKeychain()) {\n const email = await this.keychain.get(TOKEN_KEYS.USER_EMAIL);\n\n if (email) return email;\n }\n\n return await this.fileStorage.get(TOKEN_KEYS.USER_EMAIL);\n }\n async setUserEmail(email: string): Promise<void> {\n if (await this.useKeychain()) {\n const success = await this.keychain.set(TOKEN_KEYS.USER_EMAIL, email);\n\n if (success) return;\n }\n\n await this.fileStorage.set(TOKEN_KEYS.USER_EMAIL, email);\n }\n // GitHub token for private template access (persists after logout)\n async getGithubToken(): Promise<string | null> {\n if (await this.useKeychain()) {\n const token = await this.keychain.get(TOKEN_KEYS.GITHUB_TOKEN);\n\n if (token) return token;\n }\n\n return await this.fileStorage.get(TOKEN_KEYS.GITHUB_TOKEN);\n }\n async setGithubToken(token: string): Promise<void> {\n if (await this.useKeychain()) {\n const success = await this.keychain.set(TOKEN_KEYS.GITHUB_TOKEN, token);\n\n if (success) return;\n }\n\n await this.fileStorage.set(TOKEN_KEYS.GITHUB_TOKEN, token);\n }\n async clearAll(): Promise<void> {\n // Note: GitHub token is NOT cleared on logout - it persists\n const githubToken = await this.getGithubToken();\n\n await this.keychain.clear();\n await this.fileStorage.clear();\n\n // Restore GitHub token after clearing\n if (githubToken) {\n await this.setGithubToken(githubToken);\n }\n }\n async isLoggedIn(): Promise<boolean> {\n const token = await this.getToken();\n\n return token !== null;\n }\n}\n\n// Singleton instance\nlet instance: CliTokenManager | null = null;\n\nexport function getTokenManager(): CliTokenManager {\n if (!instance) {\n instance = new CliTokenManager();\n }\n\n return instance;\n}\n","export class CliError extends Error {\n public readonly exitCode: number;\n public readonly suggestion?: string;\n constructor(message: string, exitCode = 1, suggestion?: string) {\n super(message);\n this.name = 'CliError';\n this.exitCode = exitCode;\n this.suggestion = suggestion;\n }\n}\n\nexport class AuthenticationError extends CliError {\n constructor(message = 'Authentication failed', suggestion?: string) {\n super(message, 1, suggestion || 'Please check your credentials and try again.');\n this.name = 'AuthenticationError';\n }\n}\n\nexport class NotLoggedInError extends CliError {\n constructor(message = 'You are not logged in.') {\n super(message, 1, 'Run `docyrus login` to authenticate.');\n this.name = 'NotLoggedInError';\n }\n}\n\nexport class ConfigurationError extends CliError {\n constructor(message: string, suggestion?: string) {\n super(message, 1, suggestion);\n this.name = 'ConfigurationError';\n }\n}\n\nexport class NetworkError extends CliError {\n constructor(message = 'Network request failed', suggestion?: string) {\n super(message, 1, suggestion || 'Please check your internet connection and try again.');\n this.name = 'NetworkError';\n }\n}\n\nexport class TimeoutError extends CliError {\n constructor(message = 'Operation timed out') {\n super(message, 1, 'Please try again.');\n this.name = 'TimeoutError';\n }\n}\n\nexport class OAuthError extends CliError {\n constructor(message: string, suggestion?: string) {\n super(message, 1, suggestion || 'Please try again or use email/password login.');\n this.name = 'OAuthError';\n }\n}\n\nexport class TemplateError extends CliError {\n constructor(message: string) {\n super(message, 1, 'Check your internet connection and try again.');\n this.name = 'TemplateError';\n }\n}\n\nexport class ProjectExistsError extends CliError {\n constructor(projectName: string) {\n super(\n `Directory \"${projectName}\" already exists.`,\n 1,\n 'Choose a different project name or delete the existing directory.'\n );\n this.name = 'ProjectExistsError';\n }\n}\n\nexport class ConflictingFlagsError extends CliError {\n constructor(flag1: string, flag2: string) {\n super(\n `Cannot use ${flag1} and ${flag2} together.`,\n 1,\n 'Please use only one option from each group.'\n );\n this.name = 'ConflictingFlagsError';\n }\n}\n","import { RestApiClient, AuthenticationError as ApiAuthError } from '@docyrus/api-client';\n\nimport {\n type AuthCredentials, type AuthTokens, type UserInfo, type LoginResult\n} from './types.js';\n\nimport { DOCYRUS_API_URL, OAUTH_CLIENT_ID } from '../config/constants.js';\nimport { AuthenticationError, NetworkError } from '../utils/errors.js';\n\nfunction getApiClient(): RestApiClient {\n return new RestApiClient({ baseURL: DOCYRUS_API_URL });\n}\n\nexport async function loginWithCredentials(credentials: AuthCredentials): Promise<LoginResult> {\n const client = getApiClient();\n\n try {\n const response = await client.post<{\n success: boolean;\n data: {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n user?: UserInfo;\n };\n }>('/v1/auth/token', {\n email: credentials.email,\n password: credentials.password\n });\n\n const tokens: AuthTokens = {\n accessToken: response.data.access_token,\n refreshToken: response.data.refresh_token,\n expiresIn: response.data.expires_in\n };\n\n if (tokens.expiresIn) {\n tokens.expiresAt = Date.now() + tokens.expiresIn * 1000;\n }\n\n return {\n tokens,\n user: response.data.user\n };\n } catch (error) {\n if (error instanceof ApiAuthError) {\n throw new AuthenticationError('Invalid email or password.');\n }\n\n if (error instanceof Error && error.message.includes('fetch')) {\n throw new NetworkError();\n }\n\n throw error;\n }\n}\n\nexport async function getUserInfo(accessToken: string): Promise<UserInfo> {\n const client = new RestApiClient({ baseURL: DOCYRUS_API_URL });\n\n await client.setAccessToken(accessToken);\n\n try {\n const response = await client.get<{ success: boolean; data: UserInfo }>('/v1/users/me');\n\n return response.data;\n } catch (error) {\n if (error instanceof ApiAuthError) {\n throw new AuthenticationError('Session expired. Please log in again.');\n }\n throw error;\n }\n}\n\nexport async function refreshAccessToken(refreshToken: string): Promise<AuthTokens> {\n const tokenUrl = `${DOCYRUS_API_URL}/v1/oauth2/token`;\n\n try {\n const response = await fetch(tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: OAUTH_CLIENT_ID,\n refresh_token: refreshToken\n }).toString()\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as {\n error?: string;\n error_description?: string;\n };\n\n throw new AuthenticationError(\n errorData.error_description || 'Failed to refresh token'\n );\n }\n\n const data = await response.json() as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n token_type?: string;\n };\n\n const tokens: AuthTokens = {\n accessToken: data.access_token,\n refreshToken: data.refresh_token || refreshToken,\n expiresIn: data.expires_in,\n tokenType: data.token_type\n };\n\n if (tokens.expiresIn) {\n tokens.expiresAt = Date.now() + tokens.expiresIn * 1000;\n }\n\n return tokens;\n } catch (error) {\n if (error instanceof AuthenticationError) {\n throw error;\n }\n\n if (error instanceof Error && error.message.includes('fetch')) {\n throw new NetworkError();\n }\n\n throw new AuthenticationError('Session expired. Please log in again.');\n }\n}\n","\nimport {\n createServer, type Server, type IncomingMessage, type ServerResponse\n} from 'node:http';\nimport { URL } from 'node:url';\nimport { randomBytes } from 'node:crypto';\n\nimport { type OAuthCallbackResult } from './types.js';\n\nimport { OAUTH_CALLBACK_PORT_MIN, OAUTH_CALLBACK_PORT_MAX, OAUTH_TIMEOUT_MS } from '../config/constants.js';\nimport { OAuthError, TimeoutError } from '../utils/errors.js';\n\nconst SUCCESS_HTML = `\n<!DOCTYPE html>\n<html>\n<head>\n <title>Authentication Successful - Docyrus CLI</title>\n <style>\n * { box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(to bottom right, #f8fafc, #f1f5f9);\n }\n .container {\n width: 100%;\n max-width: 400px;\n padding: 32px;\n background: white;\n border-radius: 16px;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.15);\n text-align: center;\n }\n .logo {\n margin-bottom: 24px;\n }\n .logo svg {\n height: 40px;\n width: auto;\n }\n h1 {\n margin: 0 0 8px;\n font-size: 20px;\n font-weight: 600;\n color: #1e293b;\n }\n p {\n margin: 0;\n color: #64748b;\n font-size: 14px;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"logo\">\n <svg viewBox=\"0 0 1325.62 253.55\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"#dc2626\" d=\"M169.13,133.22l-.07.06v29.48c0,7.81-6.35,14.17-14.16,14.17h-29.48c-2.54,0-4.9-.68-6.96-1.85l-33.13,33.14c2.16,3.21,3.43,7.09,3.43,11.21,0,5.53-2.22,10.54-5.84,14.17-3.62,3.62-8.64,5.84-14.17,5.84s-10.55-2.22-14.17-5.84c-3.62-3.63-5.84-8.64-5.84-14.17,0-11.06,8.96-20.08,20.07-20.08,4.22,0,8.09,1.29,11.3,3.48l33.11-33.11c-1.22-2.07-1.91-4.46-1.91-7.02v-29.48c0-3.24,1.11-6.26,2.97-8.65l-27.31-37.16H19.96V15.5h71.85v65.82l28.44,38.71c1.62-.65,3.39-.98,5.23-.98h29.48c7.81,0,14.17,6.36,14.17,14.17Z\"/>\n <path fill=\"#1c1c1c\" d=\"M241.24,60.57h48.58c12.19,0,23,2.42,32.44,7.25,9.44,4.83,16.77,11.61,21.98,20.34,5.21,8.73,7.82,18.75,7.82,30.05s-2.61,21.32-7.82,30.05c-5.22,8.73-12.54,15.51-21.98,20.34-9.44,4.83-20.25,7.25-32.44,7.25h-48.58V60.57ZM288.83,161.51c9.33,0,17.54-1.81,24.62-5.43,7.08-3.62,12.54-8.7,16.38-15.23,3.84-6.53,5.76-14.08,5.76-22.64s-1.92-16.11-5.76-22.64c-3.84-6.53-9.3-11.61-16.38-15.23-7.08-3.62-15.29-5.43-24.62-5.43h-31.12v86.61h31.12Z\"/>\n <path fill=\"#1c1c1c\" d=\"M430.77,169.5c-9.33-5.1-16.66-12.16-21.98-21.16-5.33-9-7.99-19.04-7.99-30.13s2.66-21.13,7.99-30.13c5.32-9,12.65-16.06,21.98-21.16,9.33-5.1,19.81-7.66,31.45-7.66s21.96,2.55,31.29,7.66c9.33,5.1,16.63,12.13,21.9,21.08,5.27,8.95,7.9,19.02,7.9,30.22s-2.63,21.27-7.9,30.22c-5.27,8.95-12.57,15.97-21.9,21.08-9.33,5.1-19.76,7.66-31.29,7.66s-22.12-2.55-31.45-7.66ZM485.03,156.74c6.75-3.84,12.07-9.14,15.97-15.89,3.9-6.75,5.85-14.3,5.85-22.64s-1.95-15.89-5.85-22.64c-3.9-6.75-9.22-12.05-15.97-15.89-6.75-3.84-14.35-5.76-22.81-5.76s-16.11,1.92-22.97,5.76c-6.86,3.84-12.24,9.14-16.14,15.89-3.9,6.75-5.85,14.3-5.85,22.64s1.95,15.89,5.85,22.64c3.9,6.75,9.28,12.05,16.14,15.89,6.86,3.84,14.52,5.76,22.97,5.76s16.06-1.92,22.81-5.76Z\"/>\n <path fill=\"#1c1c1c\" d=\"M601.78,169.5c-9.28-5.1-16.55-12.13-21.82-21.08-5.27-8.95-7.9-19.02-7.9-30.22s2.63-21.27,7.9-30.22c5.27-8.95,12.57-15.97,21.9-21.08,9.33-5.1,19.76-7.66,31.29-7.66,9,0,17.23,1.51,24.7,4.53,7.46,3.02,13.83,7.49,19.1,13.42l-10.7,10.37c-8.67-9.11-19.49-13.67-32.44-13.67-8.56,0-16.3,1.92-23.22,5.76-6.92,3.84-12.32,9.14-16.22,15.89-3.9,6.75-5.85,14.3-5.85,22.64s1.95,15.89,5.85,22.64c3.9,6.75,9.3,12.05,16.22,15.89,6.92,3.84,14.66,5.76,23.22,5.76,12.84,0,23.66-4.61,32.44-13.83l10.7,10.37c-5.27,5.93-11.67,10.43-19.18,13.5-7.52,3.07-15.78,4.61-24.78,4.61-11.53,0-21.93-2.55-31.2-7.66Z\"/>\n <path fill=\"#1c1c1c\" d=\"M775.59,135.99v39.85h-16.3v-40.18l-45.78-75.09h17.62l36.89,60.76,37.05-60.76h16.3l-45.78,75.42Z\"/>\n <path fill=\"#1c1c1c\" d=\"M946.01,175.84l-24.87-35.4c-3.07.22-5.49.33-7.25.33h-28.49v35.07h-16.47V60.57h44.95c14.93,0,26.68,3.57,35.24,10.7,8.56,7.14,12.84,16.96,12.84,29.48,0,8.89-2.2,16.47-6.59,22.72-4.39,6.26-10.65,10.81-18.77,13.67l27.33,38.7h-17.95ZM937.29,120.02c5.49-4.5,8.23-10.92,8.23-19.27s-2.75-14.74-8.23-19.18c-5.49-4.45-13.45-6.67-23.88-6.67h-27.99v51.87h27.99c10.43,0,18.39-2.25,23.88-6.75Z\"/>\n <path fill=\"#1c1c1c\" d=\"M1033.45,163.98c-8.56-8.78-12.84-21.41-12.84-37.87V60.57h16.47v64.88c0,24.7,10.81,37.05,32.44,37.05,10.54,0,18.61-3.05,24.21-9.14s8.4-15.4,8.4-27.91V60.57h15.97v65.54c0,16.58-4.28,29.23-12.84,37.96-8.56,8.73-20.53,13.09-35.9,13.09s-27.33-4.39-35.9-13.17Z\"/>\n <path fill=\"#1c1c1c\" d=\"M1193.26,173.12c-8.07-2.69-14.41-6.18-19.02-10.46l6.09-12.84c4.39,3.95,10.02,7.16,16.88,9.63,6.86,2.47,13.91,3.7,21.16,3.7,9.55,0,16.69-1.62,21.41-4.86,4.72-3.24,7.08-7.55,7.08-12.93,0-3.95-1.29-7.16-3.87-9.63-2.58-2.47-5.76-4.36-9.55-5.68s-9.14-2.8-16.05-4.45c-8.67-2.08-15.67-4.17-21-6.26-5.33-2.08-9.88-5.29-13.67-9.63-3.79-4.34-5.68-10.18-5.68-17.54,0-6.15,1.62-11.69,4.86-16.63,3.24-4.94,8.15-8.89,14.74-11.86,6.59-2.96,14.76-4.45,24.54-4.45,6.81,0,13.5.88,20.09,2.63,6.59,1.76,12.24,4.28,16.96,7.57l-5.43,13.17c-4.83-3.07-9.99-5.41-15.48-7-5.49-1.59-10.87-2.39-16.14-2.39-9.33,0-16.33,1.7-21,5.1-4.67,3.4-7,7.8-7,13.17,0,3.95,1.32,7.16,3.95,9.63,2.63,2.47,5.9,4.39,9.8,5.76,3.9,1.37,9.19,2.83,15.89,4.36,8.67,2.09,15.64,4.17,20.91,6.26,5.27,2.09,9.8,5.27,13.58,9.55,3.79,4.28,5.68,10.04,5.68,17.29,0,6.04-1.65,11.55-4.94,16.55-3.29,5-8.29,8.95-14.99,11.86-6.7,2.91-14.93,4.36-24.7,4.36-8.67,0-17.04-1.34-25.11-4.03Z\"/>\n </svg>\n </div>\n <h1>Authentication Successful</h1>\n <p>You can close this tab and return to the CLI.</p>\n </div>\n</body>\n</html>\n`;\n\nconst ERROR_HTML = (message: string) => `\n<!DOCTYPE html>\n<html>\n<head>\n <title>Authentication Failed - Docyrus CLI</title>\n <style>\n * { box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(to bottom right, #f8fafc, #f1f5f9);\n }\n .container {\n width: 100%;\n max-width: 400px;\n padding: 32px;\n background: white;\n border-radius: 16px;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.15);\n text-align: center;\n }\n .logo {\n margin-bottom: 24px;\n }\n .logo svg {\n height: 40px;\n width: auto;\n }\n h1 {\n margin: 0 0 8px;\n font-size: 20px;\n font-weight: 600;\n color: #1e293b;\n }\n p {\n margin: 0;\n color: #64748b;\n font-size: 14px;\n }\n .error-message {\n margin-top: 16px;\n padding: 12px;\n background: #fef2f2;\n border-radius: 8px;\n color: #dc2626;\n font-size: 13px;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"logo\">\n <svg viewBox=\"0 0 1325.62 253.55\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"#dc2626\" d=\"M169.13,133.22l-.07.06v29.48c0,7.81-6.35,14.17-14.16,14.17h-29.48c-2.54,0-4.9-.68-6.96-1.85l-33.13,33.14c2.16,3.21,3.43,7.09,3.43,11.21,0,5.53-2.22,10.54-5.84,14.17-3.62,3.62-8.64,5.84-14.17,5.84s-10.55-2.22-14.17-5.84c-3.62-3.63-5.84-8.64-5.84-14.17,0-11.06,8.96-20.08,20.07-20.08,4.22,0,8.09,1.29,11.3,3.48l33.11-33.11c-1.22-2.07-1.91-4.46-1.91-7.02v-29.48c0-3.24,1.11-6.26,2.97-8.65l-27.31-37.16H19.96V15.5h71.85v65.82l28.44,38.71c1.62-.65,3.39-.98,5.23-.98h29.48c7.81,0,14.17,6.36,14.17,14.17Z\"/>\n <path fill=\"#1c1c1c\" d=\"M241.24,60.57h48.58c12.19,0,23,2.42,32.44,7.25,9.44,4.83,16.77,11.61,21.98,20.34,5.21,8.73,7.82,18.75,7.82,30.05s-2.61,21.32-7.82,30.05c-5.22,8.73-12.54,15.51-21.98,20.34-9.44,4.83-20.25,7.25-32.44,7.25h-48.58V60.57ZM288.83,161.51c9.33,0,17.54-1.81,24.62-5.43,7.08-3.62,12.54-8.7,16.38-15.23,3.84-6.53,5.76-14.08,5.76-22.64s-1.92-16.11-5.76-22.64c-3.84-6.53-9.3-11.61-16.38-15.23-7.08-3.62-15.29-5.43-24.62-5.43h-31.12v86.61h31.12Z\"/>\n <path fill=\"#1c1c1c\" d=\"M430.77,169.5c-9.33-5.1-16.66-12.16-21.98-21.16-5.33-9-7.99-19.04-7.99-30.13s2.66-21.13,7.99-30.13c5.32-9,12.65-16.06,21.98-21.16,9.33-5.1,19.81-7.66,31.45-7.66s21.96,2.55,31.29,7.66c9.33,5.1,16.63,12.13,21.9,21.08,5.27,8.95,7.9,19.02,7.9,30.22s-2.63,21.27-7.9,30.22c-5.27,8.95-12.57,15.97-21.9,21.08-9.33,5.1-19.76,7.66-31.29,7.66s-22.12-2.55-31.45-7.66ZM485.03,156.74c6.75-3.84,12.07-9.14,15.97-15.89,3.9-6.75,5.85-14.3,5.85-22.64s-1.95-15.89-5.85-22.64c-3.9-6.75-9.22-12.05-15.97-15.89-6.75-3.84-14.35-5.76-22.81-5.76s-16.11,1.92-22.97,5.76c-6.86,3.84-12.24,9.14-16.14,15.89-3.9,6.75-5.85,14.3-5.85,22.64s1.95,15.89,5.85,22.64c3.9,6.75,9.28,12.05,16.14,15.89,6.86,3.84,14.52,5.76,22.97,5.76s16.06-1.92,22.81-5.76Z\"/>\n <path fill=\"#1c1c1c\" d=\"M601.78,169.5c-9.28-5.1-16.55-12.13-21.82-21.08-5.27-8.95-7.9-19.02-7.9-30.22s2.63-21.27,7.9-30.22c5.27-8.95,12.57-15.97,21.9-21.08,9.33-5.1,19.76-7.66,31.29-7.66,9,0,17.23,1.51,24.7,4.53,7.46,3.02,13.83,7.49,19.1,13.42l-10.7,10.37c-8.67-9.11-19.49-13.67-32.44-13.67-8.56,0-16.3,1.92-23.22,5.76-6.92,3.84-12.32,9.14-16.22,15.89-3.9,6.75-5.85,14.3-5.85,22.64s1.95,15.89,5.85,22.64c3.9,6.75,9.3,12.05,16.22,15.89,6.92,3.84,14.66,5.76,23.22,5.76,12.84,0,23.66-4.61,32.44-13.83l10.7,10.37c-5.27,5.93-11.67,10.43-19.18,13.5-7.52,3.07-15.78,4.61-24.78,4.61-11.53,0-21.93-2.55-31.2-7.66Z\"/>\n <path fill=\"#1c1c1c\" d=\"M775.59,135.99v39.85h-16.3v-40.18l-45.78-75.09h17.62l36.89,60.76,37.05-60.76h16.3l-45.78,75.42Z\"/>\n <path fill=\"#1c1c1c\" d=\"M946.01,175.84l-24.87-35.4c-3.07.22-5.49.33-7.25.33h-28.49v35.07h-16.47V60.57h44.95c14.93,0,26.68,3.57,35.24,10.7,8.56,7.14,12.84,16.96,12.84,29.48,0,8.89-2.2,16.47-6.59,22.72-4.39,6.26-10.65,10.81-18.77,13.67l27.33,38.7h-17.95ZM937.29,120.02c5.49-4.5,8.23-10.92,8.23-19.27s-2.75-14.74-8.23-19.18c-5.49-4.45-13.45-6.67-23.88-6.67h-27.99v51.87h27.99c10.43,0,18.39-2.25,23.88-6.75Z\"/>\n <path fill=\"#1c1c1c\" d=\"M1033.45,163.98c-8.56-8.78-12.84-21.41-12.84-37.87V60.57h16.47v64.88c0,24.7,10.81,37.05,32.44,37.05,10.54,0,18.61-3.05,24.21-9.14s8.4-15.4,8.4-27.91V60.57h15.97v65.54c0,16.58-4.28,29.23-12.84,37.96-8.56,8.73-20.53,13.09-35.9,13.09s-27.33-4.39-35.9-13.17Z\"/>\n <path fill=\"#1c1c1c\" d=\"M1193.26,173.12c-8.07-2.69-14.41-6.18-19.02-10.46l6.09-12.84c4.39,3.95,10.02,7.16,16.88,9.63,6.86,2.47,13.91,3.7,21.16,3.7,9.55,0,16.69-1.62,21.41-4.86,4.72-3.24,7.08-7.55,7.08-12.93,0-3.95-1.29-7.16-3.87-9.63-2.58-2.47-5.76-4.36-9.55-5.68s-9.14-2.8-16.05-4.45c-8.67-2.08-15.67-4.17-21-6.26-5.33-2.08-9.88-5.29-13.67-9.63-3.79-4.34-5.68-10.18-5.68-17.54,0-6.15,1.62-11.69,4.86-16.63,3.24-4.94,8.15-8.89,14.74-11.86,6.59-2.96,14.76-4.45,24.54-4.45,6.81,0,13.5.88,20.09,2.63,6.59,1.76,12.24,4.28,16.96,7.57l-5.43,13.17c-4.83-3.07-9.99-5.41-15.48-7-5.49-1.59-10.87-2.39-16.14-2.39-9.33,0-16.33,1.7-21,5.1-4.67,3.4-7,7.8-7,13.17,0,3.95,1.32,7.16,3.95,9.63,2.63,2.47,5.9,4.39,9.8,5.76,3.9,1.37,9.19,2.83,15.89,4.36,8.67,2.09,15.64,4.17,20.91,6.26,5.27,2.09,9.8,5.27,13.58,9.55,3.79,4.28,5.68,10.04,5.68,17.29,0,6.04-1.65,11.55-4.94,16.55-3.29,5-8.29,8.95-14.99,11.86-6.7,2.91-14.93,4.36-24.7,4.36-8.67,0-17.04-1.34-25.11-4.03Z\"/>\n </svg>\n </div>\n <h1>Authentication Failed</h1>\n <p>Something went wrong during authentication.</p>\n <div class=\"error-message\">${message}</div>\n </div>\n</body>\n</html>\n`;\n\nexport function generateState(): string {\n return randomBytes(32).toString('hex');\n}\n\nexport function generateCodeVerifier(): string {\n return randomBytes(32).toString('base64url');\n}\n\nexport async function generateCodeChallenge(verifier: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(verifier);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n\n return Buffer.from(hashBuffer).toString('base64url');\n}\n\nasync function findAvailablePort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const tryPort = (port: number) => {\n if (port > OAUTH_CALLBACK_PORT_MAX) {\n reject(new OAuthError('Could not find an available port for OAuth callback.'));\n\n return;\n }\n\n const server = createServer();\n\n server.listen(port, '127.0.0.1');\n\n server.once('listening', () => {\n server.close(() => resolve(port));\n });\n\n server.once('error', () => {\n tryPort(port + 1);\n });\n };\n\n tryPort(OAUTH_CALLBACK_PORT_MIN);\n });\n}\n\nexport interface CallbackServerResult {\n server: Server;\n port: number;\n resultPromise: Promise<OAuthCallbackResult>;\n cleanup: () => void;\n}\n\nexport async function startCallbackServer(expectedState: string): Promise<CallbackServerResult> {\n const port = await findAvailablePort();\n\n let resolveResult: (result: OAuthCallbackResult) => void;\n let rejectResult: (error: Error) => void;\n\n const resultPromise = new Promise<OAuthCallbackResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const timeoutId = setTimeout(() => {\n rejectResult(new TimeoutError('OAuth authentication timed out.'));\n }, OAUTH_TIMEOUT_MS);\n\n const server = createServer((req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url || '/', `http://127.0.0.1:${port}`);\n\n if (url.pathname === '/callback') {\n const code = url.searchParams.get('code');\n const state = url.searchParams.get('state');\n const error = url.searchParams.get('error');\n const errorDescription = url.searchParams.get('error_description');\n\n if (error) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(ERROR_HTML(errorDescription || error));\n rejectResult(new OAuthError(errorDescription || error));\n\n return;\n }\n\n if (!code || !state) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(ERROR_HTML('Missing authorization code or state.'));\n rejectResult(new OAuthError('Missing authorization code or state.'));\n\n return;\n }\n\n if (state !== expectedState) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(ERROR_HTML('Invalid state parameter. Possible CSRF attack.'));\n rejectResult(new OAuthError('Invalid state parameter.'));\n\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(SUCCESS_HTML);\n resolveResult({ code, state });\n } else {\n res.writeHead(404);\n res.end('Not Found');\n }\n });\n\n server.listen(port, '127.0.0.1');\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n server.close();\n };\n\n return {\n server,\n port,\n resultPromise,\n cleanup\n };\n}\n","import open from 'open';\n\nexport async function openBrowser(url: string): Promise<void> {\n await open(url);\n}\n","import { RestApiClient } from '@docyrus/api-client';\n\nimport {\n type AuthTokens, type OAuthConfig, type LoginResult, type UserInfo\n} from './types.js';\n\nimport {\n startCallbackServer,\n generateState,\n generateCodeVerifier,\n generateCodeChallenge\n} from './oauth-server.js';\nimport { openBrowser } from '../utils/browser.js';\nimport { OAuthError } from '../utils/errors.js';\nimport {\n DOCYRUS_API_URL,\n OAUTH_CLIENT_ID,\n OAUTH_SCOPES,\n OAUTH_REDIRECT_URI\n} from '../config/constants.js';\n\nfunction getOAuthConfig(port: number): OAuthConfig {\n return {\n authorizationUrl: `${DOCYRUS_API_URL}/v1/oauth2/authorize`,\n tokenUrl: `${DOCYRUS_API_URL}/v1/oauth2/token`,\n clientId: OAUTH_CLIENT_ID,\n redirectUri: OAUTH_REDIRECT_URI(port),\n scopes: OAUTH_SCOPES\n };\n}\n\nfunction buildAuthorizationUrl(\n config: OAuthConfig,\n state: string,\n codeChallenge: string\n): string {\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: config.clientId,\n redirect_uri: config.redirectUri,\n scope: config.scopes.join(' '),\n state,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256'\n });\n\n return `${config.authorizationUrl}?${params.toString()}`;\n}\n\nasync function exchangeCodeForTokens(\n config: OAuthConfig,\n code: string,\n codeVerifier: string\n): Promise<AuthTokens> {\n const response = await fetch(config.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: config.clientId,\n code,\n redirect_uri: config.redirectUri,\n code_verifier: codeVerifier\n }).toString()\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n\n throw new OAuthError(`Failed to exchange authorization code: ${errorText}`);\n }\n\n const data = await response.json() as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n token_type?: string;\n };\n\n const tokens: AuthTokens = {\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n expiresIn: data.expires_in,\n tokenType: data.token_type\n };\n\n if (tokens.expiresIn) {\n tokens.expiresAt = Date.now() + tokens.expiresIn * 1000;\n }\n\n return tokens;\n}\n\nasync function getUserInfoFromToken(accessToken: string): Promise<UserInfo | undefined> {\n const client = new RestApiClient({ baseURL: DOCYRUS_API_URL });\n\n await client.setAccessToken(accessToken);\n\n try {\n return await client.get<UserInfo>('/v1/users/me');\n } catch {\n return undefined;\n }\n}\n\nexport interface OAuthLoginOptions {\n onOpeningBrowser?: () => void;\n onWaitingForAuth?: (url: string) => void;\n}\n\nexport async function loginWithOAuth(options: OAuthLoginOptions = {}): Promise<LoginResult> {\n // Generate PKCE values\n const state = generateState();\n const codeVerifier = generateCodeVerifier();\n const codeChallenge = await generateCodeChallenge(codeVerifier);\n\n // Start callback server\n const { port, resultPromise, cleanup } = await startCallbackServer(state);\n const config = getOAuthConfig(port);\n\n // Build authorization URL\n const authUrl = buildAuthorizationUrl(config, state, codeChallenge);\n\n try {\n // Open browser\n options.onOpeningBrowser?.();\n await openBrowser(authUrl);\n\n // Wait for callback\n options.onWaitingForAuth?.(authUrl);\n const { code } = await resultPromise;\n\n // Exchange code for tokens\n const tokens = await exchangeCodeForTokens(config, code, codeVerifier);\n\n // Get user info\n const user = await getUserInfoFromToken(tokens.accessToken);\n\n return { tokens, user };\n } finally {\n cleanup();\n }\n}\n","import Conf from 'conf';\n\nimport { CLI_NAME } from './constants.js';\n\nexport interface CliConfig {\n apiUrl?: string;\n lastLoginEmail?: string;\n telemetryEnabled: boolean;\n}\n\nconst defaults: CliConfig = {\n telemetryEnabled: true\n};\n\nclass ConfigManager {\n private config: Conf<CliConfig>;\n constructor() {\n this.config = new Conf<CliConfig>({\n projectName: CLI_NAME,\n defaults\n });\n }\n get<K extends keyof CliConfig>(key: K): CliConfig[K] {\n return this.config.get(key);\n }\n set<K extends keyof CliConfig>(key: K, value: CliConfig[K]): void {\n this.config.set(key, value);\n }\n delete<K extends keyof CliConfig>(key: K): void {\n this.config.delete(key);\n }\n getAll(): CliConfig {\n return this.config.store;\n }\n clear(): void {\n this.config.clear();\n }\n get path(): string {\n return this.config.path;\n }\n}\n\nexport const configManager = new ConfigManager();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/constants.ts","../src/utils/platform.ts","../src/storage/encryption.ts","../src/storage/file-storage.ts","../src/storage/keychain-storage.ts","../src/storage/cli-token-manager.ts","../src/utils/errors.ts","../src/auth/credential-auth.ts","../src/auth/oauth-server.ts","../src/utils/browser.ts","../src/auth/oauth-auth.ts","../src/config/config-manager.ts"],"names":["join","ApiAuthError","randomBytes","RestApiClient"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Environment Configuration\n * Values are injected at BUILD TIME via tsup.config.ts\n * See tsup.config.ts for default values and .env.example for configuration\n */\n\n// API Configuration (injected at build time)\nexport const DOCYRUS_API_URL = process.env.CLI_DOCYRUS_API_URL as string;\n\n// OAuth2 Configuration (injected at build time)\nexport const OAUTH_CLIENT_ID = process.env.CLI_DOCYRUS_CLIENT_ID as string;\nexport const OAUTH_SCOPES = (process.env.CLI_DOCYRUS_OAUTH_SCOPES as string).split(' ');\n\n// OAuth2 Endpoints (same base as API)\nexport const OAUTH_AUTHORIZE_URL = `${DOCYRUS_API_URL}/v1/oauth2/authorize`;\nexport const OAUTH_TOKEN_URL = `${DOCYRUS_API_URL}/v1/oauth2/token`;\n\n// Local callback server for CLI OAuth flow\nexport const OAUTH_CALLBACK_PORT_MIN = 9876;\nexport const OAUTH_CALLBACK_PORT_MAX = 9899;\nexport const OAUTH_REDIRECT_URI = (port: number) => `http://localhost:${port}/callback`;\nexport const OAUTH_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\n\n// Storage Configuration\nexport const KEYCHAIN_SERVICE = 'docyrus-cli';\nexport const CONFIG_DIR = '.docyrus';\nexport const CREDENTIALS_FILE = 'credentials.enc';\nexport const CONFIG_FILE = 'config.json';\n\n// Token Keys\nexport const TOKEN_KEYS = {\n ACCESS_TOKEN: 'accessToken',\n REFRESH_TOKEN: 'refreshToken',\n USER_EMAIL: 'userEmail',\n EXPIRES_AT: 'expiresAt',\n GITHUB_TOKEN: 'githubToken' // For private template access - persists after logout\n} as const;\n\n// CLI Info\nexport const CLI_NAME = 'docyrus';\nexport const CLI_VERSION = '0.0.1';\nexport const NPM_PACKAGE_NAME = 'docyrus';\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nimport { CONFIG_DIR } from '../config/constants.js';\n\nexport function isWindows(): boolean {\n return process.platform === 'win32';\n}\n\nexport function isMacOS(): boolean {\n return process.platform === 'darwin';\n}\n\nexport function isLinux(): boolean {\n return process.platform === 'linux';\n}\n\nexport function getHomeDir(): string {\n return homedir();\n}\n\nexport function getConfigDir(): string {\n return join(getHomeDir(), CONFIG_DIR);\n}\n\nexport function getPlatformName(): string {\n if (isMacOS()) return 'macOS';\n if (isWindows()) return 'Windows';\n if (isLinux()) return 'Linux';\n\n return process.platform;\n}\n","import {\n createCipheriv, createDecipheriv, randomBytes, scryptSync, createHash\n} from 'node:crypto';\nimport { hostname, userInfo } from 'node:os';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst KEY_LENGTH = 32;\nconst IV_LENGTH = 16;\nconst AUTH_TAG_LENGTH = 16;\nconst SALT_LENGTH = 32;\n\nfunction getMachineId(): string {\n const parts = [\n hostname(),\n userInfo().username,\n process.platform,\n process.arch\n ];\n\n return createHash('sha256').update(parts.join('-')).digest('hex');\n}\n\nexport function deriveKey(salt: Buffer): Buffer {\n const machineId = getMachineId();\n\n return scryptSync(machineId, salt, KEY_LENGTH);\n}\n\nexport function encrypt(data: string): string {\n const salt = randomBytes(SALT_LENGTH);\n const key = deriveKey(salt);\n const iv = randomBytes(IV_LENGTH);\n\n const cipher = createCipheriv(ALGORITHM, key, iv, { authTagLength: AUTH_TAG_LENGTH });\n const encrypted = Buffer.concat([cipher.update(data, 'utf8'), cipher.final()]);\n const authTag = cipher.getAuthTag();\n\n // Format: salt:iv:authTag:encrypted (all base64)\n return [\n salt.toString('base64'),\n iv.toString('base64'),\n authTag.toString('base64'),\n encrypted.toString('base64')\n ].join(':');\n}\n\nexport function decrypt(encryptedData: string): string {\n const parts = encryptedData.split(':');\n\n if (parts.length !== 4) {\n throw new Error('Invalid encrypted data format');\n }\n\n const [\n saltB64,\n ivB64,\n authTagB64,\n dataB64\n ] = parts;\n const salt = Buffer.from(saltB64, 'base64');\n const iv = Buffer.from(ivB64, 'base64');\n const authTag = Buffer.from(authTagB64, 'base64');\n const encrypted = Buffer.from(dataB64, 'base64');\n\n const key = deriveKey(salt);\n\n const decipher = createDecipheriv(ALGORITHM, key, iv, { authTagLength: AUTH_TAG_LENGTH });\n\n decipher.setAuthTag(authTag);\n\n const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);\n\n return decrypted.toString('utf8');\n}\n","import {\n readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync\n} from 'node:fs';\nimport { join } from 'node:path';\n\nimport { getConfigDir } from '../utils/platform.js';\nimport { CREDENTIALS_FILE } from '../config/constants.js';\nimport { encrypt, decrypt } from './encryption.js';\n\nexport interface StorageData {\n [key: string]: string;\n}\n\nexport class FileStorage {\n private filePath: string;\n constructor() {\n const configDir = getConfigDir();\n\n this.filePath = join(configDir, CREDENTIALS_FILE);\n }\n private ensureConfigDir(): void {\n const configDir = getConfigDir();\n\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true, mode: 0o700 });\n }\n }\n private readData(): StorageData {\n if (!existsSync(this.filePath)) {\n return {};\n }\n\n try {\n const encrypted = readFileSync(this.filePath, 'utf8');\n const decrypted = decrypt(encrypted);\n\n return JSON.parse(decrypted);\n } catch {\n return {};\n }\n }\n private writeData(data: StorageData): void {\n this.ensureConfigDir();\n const json = JSON.stringify(data);\n const encrypted = encrypt(json);\n\n writeFileSync(this.filePath, encrypted, { mode: 0o600 });\n }\n async get(key: string): Promise<string | null> {\n const data = this.readData();\n\n return data[key] ?? null;\n }\n async set(key: string, value: string): Promise<void> {\n const data = this.readData();\n\n data[key] = value;\n this.writeData(data);\n }\n async delete(key: string): Promise<void> {\n const data = this.readData();\n\n delete data[key];\n\n if (Object.keys(data).length === 0) {\n this.clear();\n } else {\n this.writeData(data);\n }\n }\n async clear(): Promise<void> {\n if (existsSync(this.filePath)) {\n unlinkSync(this.filePath);\n }\n }\n async has(key: string): Promise<boolean> {\n const data = this.readData();\n\n return key in data;\n }\n}\n","import { KEYCHAIN_SERVICE } from '../config/constants.js';\n\nlet keytar: typeof import('keytar') | null = null;\n\nasync function getKeytar(): Promise<typeof import('keytar') | null> {\n if (keytar !== null) {\n return keytar;\n }\n\n try {\n keytar = await import('keytar');\n\n return keytar;\n } catch {\n keytar = null;\n\n return null;\n }\n}\n\nexport class KeychainStorage {\n private service: string;\n constructor(service = KEYCHAIN_SERVICE) {\n this.service = service;\n }\n async isAvailable(): Promise<boolean> {\n const kt = await getKeytar();\n\n if (!kt) return false;\n\n try {\n // Try a simple operation to verify keychain access\n await kt.findCredentials(this.service);\n\n return true;\n } catch {\n return false;\n }\n }\n async get(key: string): Promise<string | null> {\n const kt = await getKeytar();\n\n if (!kt) return null;\n\n try {\n return await kt.getPassword(this.service, key);\n } catch {\n return null;\n }\n }\n async set(key: string, value: string): Promise<boolean> {\n const kt = await getKeytar();\n\n if (!kt) return false;\n\n try {\n await kt.setPassword(this.service, key, value);\n\n return true;\n } catch {\n return false;\n }\n }\n async delete(key: string): Promise<boolean> {\n const kt = await getKeytar();\n\n if (!kt) return false;\n\n try {\n return await kt.deletePassword(this.service, key);\n } catch {\n return false;\n }\n }\n async clear(): Promise<void> {\n const kt = await getKeytar();\n\n if (!kt) return;\n\n try {\n const credentials = await kt.findCredentials(this.service);\n\n for (const cred of credentials) {\n await kt.deletePassword(this.service, cred.account);\n }\n } catch {\n // Ignore errors during clear\n }\n }\n}\n","import { type TokenManager } from '@docyrus/api-client';\n\nimport { KeychainStorage } from './keychain-storage.js';\nimport { FileStorage } from './file-storage.js';\nimport { TOKEN_KEYS } from '../config/constants.js';\n\nexport class CliTokenManager implements TokenManager {\n private keychain: KeychainStorage;\n private fileStorage: FileStorage;\n private keychainAvailable: boolean | null = null;\n constructor() {\n this.keychain = new KeychainStorage();\n this.fileStorage = new FileStorage();\n }\n private async useKeychain(): Promise<boolean> {\n if (this.keychainAvailable === null) {\n this.keychainAvailable = await this.keychain.isAvailable();\n }\n\n return this.keychainAvailable;\n }\n async getToken(): Promise<string | null> {\n if (await this.useKeychain()) {\n const token = await this.keychain.get(TOKEN_KEYS.ACCESS_TOKEN);\n\n if (token) return token;\n }\n\n return await this.fileStorage.get(TOKEN_KEYS.ACCESS_TOKEN);\n }\n async setToken(token: string): Promise<void> {\n if (await this.useKeychain()) {\n const success = await this.keychain.set(TOKEN_KEYS.ACCESS_TOKEN, token);\n\n if (success) return;\n }\n\n await this.fileStorage.set(TOKEN_KEYS.ACCESS_TOKEN, token);\n }\n async clearToken(): Promise<void> {\n // Clear from both storages to ensure complete cleanup\n await this.keychain.delete(TOKEN_KEYS.ACCESS_TOKEN);\n await this.fileStorage.delete(TOKEN_KEYS.ACCESS_TOKEN);\n }\n async getRefreshToken(): Promise<string | null> {\n if (await this.useKeychain()) {\n const token = await this.keychain.get(TOKEN_KEYS.REFRESH_TOKEN);\n\n if (token) return token;\n }\n\n return await this.fileStorage.get(TOKEN_KEYS.REFRESH_TOKEN);\n }\n async setRefreshToken(token: string): Promise<void> {\n if (await this.useKeychain()) {\n const success = await this.keychain.set(TOKEN_KEYS.REFRESH_TOKEN, token);\n\n if (success) return;\n }\n\n await this.fileStorage.set(TOKEN_KEYS.REFRESH_TOKEN, token);\n }\n async clearRefreshToken(): Promise<void> {\n await this.keychain.delete(TOKEN_KEYS.REFRESH_TOKEN);\n await this.fileStorage.delete(TOKEN_KEYS.REFRESH_TOKEN);\n }\n async getUserEmail(): Promise<string | null> {\n if (await this.useKeychain()) {\n const email = await this.keychain.get(TOKEN_KEYS.USER_EMAIL);\n\n if (email) return email;\n }\n\n return await this.fileStorage.get(TOKEN_KEYS.USER_EMAIL);\n }\n async setUserEmail(email: string): Promise<void> {\n if (await this.useKeychain()) {\n const success = await this.keychain.set(TOKEN_KEYS.USER_EMAIL, email);\n\n if (success) return;\n }\n\n await this.fileStorage.set(TOKEN_KEYS.USER_EMAIL, email);\n }\n // GitHub token for private template access (persists after logout)\n async getGithubToken(): Promise<string | null> {\n if (await this.useKeychain()) {\n const token = await this.keychain.get(TOKEN_KEYS.GITHUB_TOKEN);\n\n if (token) return token;\n }\n\n return await this.fileStorage.get(TOKEN_KEYS.GITHUB_TOKEN);\n }\n async setGithubToken(token: string): Promise<void> {\n if (await this.useKeychain()) {\n const success = await this.keychain.set(TOKEN_KEYS.GITHUB_TOKEN, token);\n\n if (success) return;\n }\n\n await this.fileStorage.set(TOKEN_KEYS.GITHUB_TOKEN, token);\n }\n async clearAll(): Promise<void> {\n // Note: GitHub token is NOT cleared on logout - it persists\n const githubToken = await this.getGithubToken();\n\n await this.keychain.clear();\n await this.fileStorage.clear();\n\n // Restore GitHub token after clearing\n if (githubToken) {\n await this.setGithubToken(githubToken);\n }\n }\n async isLoggedIn(): Promise<boolean> {\n const token = await this.getToken();\n\n return token !== null;\n }\n}\n\n// Singleton instance\nlet instance: CliTokenManager | null = null;\n\nexport function getTokenManager(): CliTokenManager {\n if (!instance) {\n instance = new CliTokenManager();\n }\n\n return instance;\n}\n","export class CliError extends Error {\n public readonly exitCode: number;\n public readonly suggestion?: string;\n constructor(message: string, exitCode = 1, suggestion?: string) {\n super(message);\n this.name = 'CliError';\n this.exitCode = exitCode;\n this.suggestion = suggestion;\n }\n}\n\nexport class AuthenticationError extends CliError {\n constructor(message = 'Authentication failed', suggestion?: string) {\n super(message, 1, suggestion || 'Please check your credentials and try again.');\n this.name = 'AuthenticationError';\n }\n}\n\nexport class NotLoggedInError extends CliError {\n constructor(message = 'You are not logged in.') {\n super(message, 1, 'Run `docyrus login` to authenticate.');\n this.name = 'NotLoggedInError';\n }\n}\n\nexport class ConfigurationError extends CliError {\n constructor(message: string, suggestion?: string) {\n super(message, 1, suggestion);\n this.name = 'ConfigurationError';\n }\n}\n\nexport class NetworkError extends CliError {\n constructor(message = 'Network request failed', suggestion?: string) {\n super(message, 1, suggestion || 'Please check your internet connection and try again.');\n this.name = 'NetworkError';\n }\n}\n\nexport class TimeoutError extends CliError {\n constructor(message = 'Operation timed out') {\n super(message, 1, 'Please try again.');\n this.name = 'TimeoutError';\n }\n}\n\nexport class OAuthError extends CliError {\n constructor(message: string, suggestion?: string) {\n super(message, 1, suggestion || 'Please try again or use email/password login.');\n this.name = 'OAuthError';\n }\n}\n\nexport class TemplateError extends CliError {\n constructor(message: string) {\n super(message, 1, 'Check your internet connection and try again.');\n this.name = 'TemplateError';\n }\n}\n\nexport class ProjectExistsError extends CliError {\n constructor(projectName: string) {\n super(\n `Directory \"${projectName}\" already exists.`,\n 1,\n 'Choose a different project name or delete the existing directory.'\n );\n this.name = 'ProjectExistsError';\n }\n}\n\nexport class ConflictingFlagsError extends CliError {\n constructor(flag1: string, flag2: string) {\n super(\n `Cannot use ${flag1} and ${flag2} together.`,\n 1,\n 'Please use only one option from each group.'\n );\n this.name = 'ConflictingFlagsError';\n }\n}\n","import { RestApiClient, AuthenticationError as ApiAuthError } from '@docyrus/api-client';\n\nimport {\n type AuthCredentials, type AuthTokens, type UserInfo, type LoginResult\n} from './types.js';\n\nimport { DOCYRUS_API_URL, OAUTH_CLIENT_ID } from '../config/constants.js';\nimport { AuthenticationError, NetworkError } from '../utils/errors.js';\n\nfunction getApiClient(): RestApiClient {\n return new RestApiClient({ baseURL: DOCYRUS_API_URL });\n}\n\nexport async function loginWithCredentials(credentials: AuthCredentials): Promise<LoginResult> {\n const client = getApiClient();\n\n try {\n const response = await client.post<{\n success: boolean;\n data: {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n user?: UserInfo;\n };\n }>('/v1/auth/token', {\n email: credentials.email,\n password: credentials.password\n });\n\n const tokens: AuthTokens = {\n accessToken: response.data.access_token,\n refreshToken: response.data.refresh_token,\n expiresIn: response.data.expires_in\n };\n\n if (tokens.expiresIn) {\n tokens.expiresAt = Date.now() + tokens.expiresIn * 1000;\n }\n\n return {\n tokens,\n user: response.data.user\n };\n } catch (error) {\n if (error instanceof ApiAuthError) {\n throw new AuthenticationError('Invalid email or password.');\n }\n\n if (error instanceof Error && error.message.includes('fetch')) {\n throw new NetworkError();\n }\n\n throw error;\n }\n}\n\nexport async function getUserInfo(accessToken: string): Promise<UserInfo> {\n const client = new RestApiClient({ baseURL: DOCYRUS_API_URL });\n\n await client.setAccessToken(accessToken);\n\n try {\n const response = await client.get<{ success: boolean; data: UserInfo }>('/v1/users/me');\n\n return response.data;\n } catch (error) {\n if (error instanceof ApiAuthError) {\n throw new AuthenticationError('Session expired. Please log in again.');\n }\n throw error;\n }\n}\n\nexport async function refreshAccessToken(refreshToken: string): Promise<AuthTokens> {\n const tokenUrl = `${DOCYRUS_API_URL}/v1/oauth2/token`;\n\n try {\n const response = await fetch(tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: OAUTH_CLIENT_ID,\n refresh_token: refreshToken\n }).toString()\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as {\n error?: string;\n error_description?: string;\n };\n\n throw new AuthenticationError(\n errorData.error_description || 'Failed to refresh token'\n );\n }\n\n const data = await response.json() as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n token_type?: string;\n };\n\n const tokens: AuthTokens = {\n accessToken: data.access_token,\n refreshToken: data.refresh_token || refreshToken,\n expiresIn: data.expires_in,\n tokenType: data.token_type\n };\n\n if (tokens.expiresIn) {\n tokens.expiresAt = Date.now() + tokens.expiresIn * 1000;\n }\n\n return tokens;\n } catch (error) {\n if (error instanceof AuthenticationError) {\n throw error;\n }\n\n if (error instanceof Error && error.message.includes('fetch')) {\n throw new NetworkError();\n }\n\n throw new AuthenticationError('Session expired. Please log in again.');\n }\n}\n","\nimport {\n createServer, type Server, type IncomingMessage, type ServerResponse\n} from 'node:http';\nimport { URL } from 'node:url';\nimport { randomBytes } from 'node:crypto';\n\nimport { type OAuthCallbackResult } from './types.js';\n\nimport { OAUTH_CALLBACK_PORT_MIN, OAUTH_CALLBACK_PORT_MAX, OAUTH_TIMEOUT_MS } from '../config/constants.js';\nimport { OAuthError, TimeoutError } from '../utils/errors.js';\n\nconst SUCCESS_HTML = `\n<!DOCTYPE html>\n<html>\n<head>\n <title>Authentication Successful - Docyrus CLI</title>\n <style>\n * { box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(to bottom right, #f8fafc, #f1f5f9);\n }\n .container {\n width: 100%;\n max-width: 400px;\n padding: 32px;\n background: white;\n border-radius: 16px;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.15);\n text-align: center;\n }\n .logo {\n margin-bottom: 24px;\n }\n .logo svg {\n height: 40px;\n width: auto;\n }\n h1 {\n margin: 0 0 8px;\n font-size: 20px;\n font-weight: 600;\n color: #1e293b;\n }\n p {\n margin: 0;\n color: #64748b;\n font-size: 14px;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"logo\">\n <svg viewBox=\"0 0 1325.62 253.55\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"#dc2626\" d=\"M169.13,133.22l-.07.06v29.48c0,7.81-6.35,14.17-14.16,14.17h-29.48c-2.54,0-4.9-.68-6.96-1.85l-33.13,33.14c2.16,3.21,3.43,7.09,3.43,11.21,0,5.53-2.22,10.54-5.84,14.17-3.62,3.62-8.64,5.84-14.17,5.84s-10.55-2.22-14.17-5.84c-3.62-3.63-5.84-8.64-5.84-14.17,0-11.06,8.96-20.08,20.07-20.08,4.22,0,8.09,1.29,11.3,3.48l33.11-33.11c-1.22-2.07-1.91-4.46-1.91-7.02v-29.48c0-3.24,1.11-6.26,2.97-8.65l-27.31-37.16H19.96V15.5h71.85v65.82l28.44,38.71c1.62-.65,3.39-.98,5.23-.98h29.48c7.81,0,14.17,6.36,14.17,14.17Z\"/>\n <path fill=\"#1c1c1c\" d=\"M241.24,60.57h48.58c12.19,0,23,2.42,32.44,7.25,9.44,4.83,16.77,11.61,21.98,20.34,5.21,8.73,7.82,18.75,7.82,30.05s-2.61,21.32-7.82,30.05c-5.22,8.73-12.54,15.51-21.98,20.34-9.44,4.83-20.25,7.25-32.44,7.25h-48.58V60.57ZM288.83,161.51c9.33,0,17.54-1.81,24.62-5.43,7.08-3.62,12.54-8.7,16.38-15.23,3.84-6.53,5.76-14.08,5.76-22.64s-1.92-16.11-5.76-22.64c-3.84-6.53-9.3-11.61-16.38-15.23-7.08-3.62-15.29-5.43-24.62-5.43h-31.12v86.61h31.12Z\"/>\n <path fill=\"#1c1c1c\" d=\"M430.77,169.5c-9.33-5.1-16.66-12.16-21.98-21.16-5.33-9-7.99-19.04-7.99-30.13s2.66-21.13,7.99-30.13c5.32-9,12.65-16.06,21.98-21.16,9.33-5.1,19.81-7.66,31.45-7.66s21.96,2.55,31.29,7.66c9.33,5.1,16.63,12.13,21.9,21.08,5.27,8.95,7.9,19.02,7.9,30.22s-2.63,21.27-7.9,30.22c-5.27,8.95-12.57,15.97-21.9,21.08-9.33,5.1-19.76,7.66-31.29,7.66s-22.12-2.55-31.45-7.66ZM485.03,156.74c6.75-3.84,12.07-9.14,15.97-15.89,3.9-6.75,5.85-14.3,5.85-22.64s-1.95-15.89-5.85-22.64c-3.9-6.75-9.22-12.05-15.97-15.89-6.75-3.84-14.35-5.76-22.81-5.76s-16.11,1.92-22.97,5.76c-6.86,3.84-12.24,9.14-16.14,15.89-3.9,6.75-5.85,14.3-5.85,22.64s1.95,15.89,5.85,22.64c3.9,6.75,9.28,12.05,16.14,15.89,6.86,3.84,14.52,5.76,22.97,5.76s16.06-1.92,22.81-5.76Z\"/>\n <path fill=\"#1c1c1c\" d=\"M601.78,169.5c-9.28-5.1-16.55-12.13-21.82-21.08-5.27-8.95-7.9-19.02-7.9-30.22s2.63-21.27,7.9-30.22c5.27-8.95,12.57-15.97,21.9-21.08,9.33-5.1,19.76-7.66,31.29-7.66,9,0,17.23,1.51,24.7,4.53,7.46,3.02,13.83,7.49,19.1,13.42l-10.7,10.37c-8.67-9.11-19.49-13.67-32.44-13.67-8.56,0-16.3,1.92-23.22,5.76-6.92,3.84-12.32,9.14-16.22,15.89-3.9,6.75-5.85,14.3-5.85,22.64s1.95,15.89,5.85,22.64c3.9,6.75,9.3,12.05,16.22,15.89,6.92,3.84,14.66,5.76,23.22,5.76,12.84,0,23.66-4.61,32.44-13.83l10.7,10.37c-5.27,5.93-11.67,10.43-19.18,13.5-7.52,3.07-15.78,4.61-24.78,4.61-11.53,0-21.93-2.55-31.2-7.66Z\"/>\n <path fill=\"#1c1c1c\" d=\"M775.59,135.99v39.85h-16.3v-40.18l-45.78-75.09h17.62l36.89,60.76,37.05-60.76h16.3l-45.78,75.42Z\"/>\n <path fill=\"#1c1c1c\" d=\"M946.01,175.84l-24.87-35.4c-3.07.22-5.49.33-7.25.33h-28.49v35.07h-16.47V60.57h44.95c14.93,0,26.68,3.57,35.24,10.7,8.56,7.14,12.84,16.96,12.84,29.48,0,8.89-2.2,16.47-6.59,22.72-4.39,6.26-10.65,10.81-18.77,13.67l27.33,38.7h-17.95ZM937.29,120.02c5.49-4.5,8.23-10.92,8.23-19.27s-2.75-14.74-8.23-19.18c-5.49-4.45-13.45-6.67-23.88-6.67h-27.99v51.87h27.99c10.43,0,18.39-2.25,23.88-6.75Z\"/>\n <path fill=\"#1c1c1c\" d=\"M1033.45,163.98c-8.56-8.78-12.84-21.41-12.84-37.87V60.57h16.47v64.88c0,24.7,10.81,37.05,32.44,37.05,10.54,0,18.61-3.05,24.21-9.14s8.4-15.4,8.4-27.91V60.57h15.97v65.54c0,16.58-4.28,29.23-12.84,37.96-8.56,8.73-20.53,13.09-35.9,13.09s-27.33-4.39-35.9-13.17Z\"/>\n <path fill=\"#1c1c1c\" d=\"M1193.26,173.12c-8.07-2.69-14.41-6.18-19.02-10.46l6.09-12.84c4.39,3.95,10.02,7.16,16.88,9.63,6.86,2.47,13.91,3.7,21.16,3.7,9.55,0,16.69-1.62,21.41-4.86,4.72-3.24,7.08-7.55,7.08-12.93,0-3.95-1.29-7.16-3.87-9.63-2.58-2.47-5.76-4.36-9.55-5.68s-9.14-2.8-16.05-4.45c-8.67-2.08-15.67-4.17-21-6.26-5.33-2.08-9.88-5.29-13.67-9.63-3.79-4.34-5.68-10.18-5.68-17.54,0-6.15,1.62-11.69,4.86-16.63,3.24-4.94,8.15-8.89,14.74-11.86,6.59-2.96,14.76-4.45,24.54-4.45,6.81,0,13.5.88,20.09,2.63,6.59,1.76,12.24,4.28,16.96,7.57l-5.43,13.17c-4.83-3.07-9.99-5.41-15.48-7-5.49-1.59-10.87-2.39-16.14-2.39-9.33,0-16.33,1.7-21,5.1-4.67,3.4-7,7.8-7,13.17,0,3.95,1.32,7.16,3.95,9.63,2.63,2.47,5.9,4.39,9.8,5.76,3.9,1.37,9.19,2.83,15.89,4.36,8.67,2.09,15.64,4.17,20.91,6.26,5.27,2.09,9.8,5.27,13.58,9.55,3.79,4.28,5.68,10.04,5.68,17.29,0,6.04-1.65,11.55-4.94,16.55-3.29,5-8.29,8.95-14.99,11.86-6.7,2.91-14.93,4.36-24.7,4.36-8.67,0-17.04-1.34-25.11-4.03Z\"/>\n </svg>\n </div>\n <h1>Authentication Successful</h1>\n <p>You can close this tab and return to the CLI.</p>\n </div>\n</body>\n</html>\n`;\n\nconst ERROR_HTML = (message: string) => `\n<!DOCTYPE html>\n<html>\n<head>\n <title>Authentication Failed - Docyrus CLI</title>\n <style>\n * { box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(to bottom right, #f8fafc, #f1f5f9);\n }\n .container {\n width: 100%;\n max-width: 400px;\n padding: 32px;\n background: white;\n border-radius: 16px;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.15);\n text-align: center;\n }\n .logo {\n margin-bottom: 24px;\n }\n .logo svg {\n height: 40px;\n width: auto;\n }\n h1 {\n margin: 0 0 8px;\n font-size: 20px;\n font-weight: 600;\n color: #1e293b;\n }\n p {\n margin: 0;\n color: #64748b;\n font-size: 14px;\n }\n .error-message {\n margin-top: 16px;\n padding: 12px;\n background: #fef2f2;\n border-radius: 8px;\n color: #dc2626;\n font-size: 13px;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"logo\">\n <svg viewBox=\"0 0 1325.62 253.55\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"#dc2626\" d=\"M169.13,133.22l-.07.06v29.48c0,7.81-6.35,14.17-14.16,14.17h-29.48c-2.54,0-4.9-.68-6.96-1.85l-33.13,33.14c2.16,3.21,3.43,7.09,3.43,11.21,0,5.53-2.22,10.54-5.84,14.17-3.62,3.62-8.64,5.84-14.17,5.84s-10.55-2.22-14.17-5.84c-3.62-3.63-5.84-8.64-5.84-14.17,0-11.06,8.96-20.08,20.07-20.08,4.22,0,8.09,1.29,11.3,3.48l33.11-33.11c-1.22-2.07-1.91-4.46-1.91-7.02v-29.48c0-3.24,1.11-6.26,2.97-8.65l-27.31-37.16H19.96V15.5h71.85v65.82l28.44,38.71c1.62-.65,3.39-.98,5.23-.98h29.48c7.81,0,14.17,6.36,14.17,14.17Z\"/>\n <path fill=\"#1c1c1c\" d=\"M241.24,60.57h48.58c12.19,0,23,2.42,32.44,7.25,9.44,4.83,16.77,11.61,21.98,20.34,5.21,8.73,7.82,18.75,7.82,30.05s-2.61,21.32-7.82,30.05c-5.22,8.73-12.54,15.51-21.98,20.34-9.44,4.83-20.25,7.25-32.44,7.25h-48.58V60.57ZM288.83,161.51c9.33,0,17.54-1.81,24.62-5.43,7.08-3.62,12.54-8.7,16.38-15.23,3.84-6.53,5.76-14.08,5.76-22.64s-1.92-16.11-5.76-22.64c-3.84-6.53-9.3-11.61-16.38-15.23-7.08-3.62-15.29-5.43-24.62-5.43h-31.12v86.61h31.12Z\"/>\n <path fill=\"#1c1c1c\" d=\"M430.77,169.5c-9.33-5.1-16.66-12.16-21.98-21.16-5.33-9-7.99-19.04-7.99-30.13s2.66-21.13,7.99-30.13c5.32-9,12.65-16.06,21.98-21.16,9.33-5.1,19.81-7.66,31.45-7.66s21.96,2.55,31.29,7.66c9.33,5.1,16.63,12.13,21.9,21.08,5.27,8.95,7.9,19.02,7.9,30.22s-2.63,21.27-7.9,30.22c-5.27,8.95-12.57,15.97-21.9,21.08-9.33,5.1-19.76,7.66-31.29,7.66s-22.12-2.55-31.45-7.66ZM485.03,156.74c6.75-3.84,12.07-9.14,15.97-15.89,3.9-6.75,5.85-14.3,5.85-22.64s-1.95-15.89-5.85-22.64c-3.9-6.75-9.22-12.05-15.97-15.89-6.75-3.84-14.35-5.76-22.81-5.76s-16.11,1.92-22.97,5.76c-6.86,3.84-12.24,9.14-16.14,15.89-3.9,6.75-5.85,14.3-5.85,22.64s1.95,15.89,5.85,22.64c3.9,6.75,9.28,12.05,16.14,15.89,6.86,3.84,14.52,5.76,22.97,5.76s16.06-1.92,22.81-5.76Z\"/>\n <path fill=\"#1c1c1c\" d=\"M601.78,169.5c-9.28-5.1-16.55-12.13-21.82-21.08-5.27-8.95-7.9-19.02-7.9-30.22s2.63-21.27,7.9-30.22c5.27-8.95,12.57-15.97,21.9-21.08,9.33-5.1,19.76-7.66,31.29-7.66,9,0,17.23,1.51,24.7,4.53,7.46,3.02,13.83,7.49,19.1,13.42l-10.7,10.37c-8.67-9.11-19.49-13.67-32.44-13.67-8.56,0-16.3,1.92-23.22,5.76-6.92,3.84-12.32,9.14-16.22,15.89-3.9,6.75-5.85,14.3-5.85,22.64s1.95,15.89,5.85,22.64c3.9,6.75,9.3,12.05,16.22,15.89,6.92,3.84,14.66,5.76,23.22,5.76,12.84,0,23.66-4.61,32.44-13.83l10.7,10.37c-5.27,5.93-11.67,10.43-19.18,13.5-7.52,3.07-15.78,4.61-24.78,4.61-11.53,0-21.93-2.55-31.2-7.66Z\"/>\n <path fill=\"#1c1c1c\" d=\"M775.59,135.99v39.85h-16.3v-40.18l-45.78-75.09h17.62l36.89,60.76,37.05-60.76h16.3l-45.78,75.42Z\"/>\n <path fill=\"#1c1c1c\" d=\"M946.01,175.84l-24.87-35.4c-3.07.22-5.49.33-7.25.33h-28.49v35.07h-16.47V60.57h44.95c14.93,0,26.68,3.57,35.24,10.7,8.56,7.14,12.84,16.96,12.84,29.48,0,8.89-2.2,16.47-6.59,22.72-4.39,6.26-10.65,10.81-18.77,13.67l27.33,38.7h-17.95ZM937.29,120.02c5.49-4.5,8.23-10.92,8.23-19.27s-2.75-14.74-8.23-19.18c-5.49-4.45-13.45-6.67-23.88-6.67h-27.99v51.87h27.99c10.43,0,18.39-2.25,23.88-6.75Z\"/>\n <path fill=\"#1c1c1c\" d=\"M1033.45,163.98c-8.56-8.78-12.84-21.41-12.84-37.87V60.57h16.47v64.88c0,24.7,10.81,37.05,32.44,37.05,10.54,0,18.61-3.05,24.21-9.14s8.4-15.4,8.4-27.91V60.57h15.97v65.54c0,16.58-4.28,29.23-12.84,37.96-8.56,8.73-20.53,13.09-35.9,13.09s-27.33-4.39-35.9-13.17Z\"/>\n <path fill=\"#1c1c1c\" d=\"M1193.26,173.12c-8.07-2.69-14.41-6.18-19.02-10.46l6.09-12.84c4.39,3.95,10.02,7.16,16.88,9.63,6.86,2.47,13.91,3.7,21.16,3.7,9.55,0,16.69-1.62,21.41-4.86,4.72-3.24,7.08-7.55,7.08-12.93,0-3.95-1.29-7.16-3.87-9.63-2.58-2.47-5.76-4.36-9.55-5.68s-9.14-2.8-16.05-4.45c-8.67-2.08-15.67-4.17-21-6.26-5.33-2.08-9.88-5.29-13.67-9.63-3.79-4.34-5.68-10.18-5.68-17.54,0-6.15,1.62-11.69,4.86-16.63,3.24-4.94,8.15-8.89,14.74-11.86,6.59-2.96,14.76-4.45,24.54-4.45,6.81,0,13.5.88,20.09,2.63,6.59,1.76,12.24,4.28,16.96,7.57l-5.43,13.17c-4.83-3.07-9.99-5.41-15.48-7-5.49-1.59-10.87-2.39-16.14-2.39-9.33,0-16.33,1.7-21,5.1-4.67,3.4-7,7.8-7,13.17,0,3.95,1.32,7.16,3.95,9.63,2.63,2.47,5.9,4.39,9.8,5.76,3.9,1.37,9.19,2.83,15.89,4.36,8.67,2.09,15.64,4.17,20.91,6.26,5.27,2.09,9.8,5.27,13.58,9.55,3.79,4.28,5.68,10.04,5.68,17.29,0,6.04-1.65,11.55-4.94,16.55-3.29,5-8.29,8.95-14.99,11.86-6.7,2.91-14.93,4.36-24.7,4.36-8.67,0-17.04-1.34-25.11-4.03Z\"/>\n </svg>\n </div>\n <h1>Authentication Failed</h1>\n <p>Something went wrong during authentication.</p>\n <div class=\"error-message\">${message}</div>\n </div>\n</body>\n</html>\n`;\n\nexport function generateState(): string {\n return randomBytes(32).toString('hex');\n}\n\nexport function generateCodeVerifier(): string {\n return randomBytes(32).toString('base64url');\n}\n\nexport async function generateCodeChallenge(verifier: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(verifier);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n\n return Buffer.from(hashBuffer).toString('base64url');\n}\n\nasync function findAvailablePort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const tryPort = (port: number) => {\n if (port > OAUTH_CALLBACK_PORT_MAX) {\n reject(new OAuthError('Could not find an available port for OAuth callback.'));\n\n return;\n }\n\n const server = createServer();\n\n server.listen(port, '127.0.0.1');\n\n server.once('listening', () => {\n server.close(() => resolve(port));\n });\n\n server.once('error', () => {\n tryPort(port + 1);\n });\n };\n\n tryPort(OAUTH_CALLBACK_PORT_MIN);\n });\n}\n\nexport interface CallbackServerResult {\n server: Server;\n port: number;\n resultPromise: Promise<OAuthCallbackResult>;\n cleanup: () => void;\n}\n\nexport async function startCallbackServer(expectedState: string): Promise<CallbackServerResult> {\n const port = await findAvailablePort();\n\n let resolveResult: (result: OAuthCallbackResult) => void;\n let rejectResult: (error: Error) => void;\n\n const resultPromise = new Promise<OAuthCallbackResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const timeoutId = setTimeout(() => {\n rejectResult(new TimeoutError('OAuth authentication timed out.'));\n }, OAUTH_TIMEOUT_MS);\n\n const server = createServer((req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url || '/', `http://127.0.0.1:${port}`);\n\n if (url.pathname === '/callback') {\n const code = url.searchParams.get('code');\n const state = url.searchParams.get('state');\n const error = url.searchParams.get('error');\n const errorDescription = url.searchParams.get('error_description');\n\n if (error) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(ERROR_HTML(errorDescription || error));\n rejectResult(new OAuthError(errorDescription || error));\n\n return;\n }\n\n if (!code || !state) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(ERROR_HTML('Missing authorization code or state.'));\n rejectResult(new OAuthError('Missing authorization code or state.'));\n\n return;\n }\n\n if (state !== expectedState) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(ERROR_HTML('Invalid state parameter. Possible CSRF attack.'));\n rejectResult(new OAuthError('Invalid state parameter.'));\n\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(SUCCESS_HTML);\n resolveResult({ code, state });\n } else {\n res.writeHead(404);\n res.end('Not Found');\n }\n });\n\n server.listen(port, '127.0.0.1');\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n server.close();\n };\n\n return {\n server,\n port,\n resultPromise,\n cleanup\n };\n}\n","import open from 'open';\n\nexport async function openBrowser(url: string): Promise<void> {\n await open(url);\n}\n","import { RestApiClient } from '@docyrus/api-client';\n\nimport {\n type AuthTokens, type OAuthConfig, type LoginResult, type UserInfo\n} from './types.js';\n\nimport {\n startCallbackServer,\n generateState,\n generateCodeVerifier,\n generateCodeChallenge\n} from './oauth-server.js';\nimport { openBrowser } from '../utils/browser.js';\nimport { OAuthError } from '../utils/errors.js';\nimport {\n DOCYRUS_API_URL,\n OAUTH_CLIENT_ID,\n OAUTH_SCOPES,\n OAUTH_REDIRECT_URI\n} from '../config/constants.js';\n\nfunction getOAuthConfig(port: number): OAuthConfig {\n return {\n authorizationUrl: `${DOCYRUS_API_URL}/v1/oauth2/authorize`,\n tokenUrl: `${DOCYRUS_API_URL}/v1/oauth2/token`,\n clientId: OAUTH_CLIENT_ID,\n redirectUri: OAUTH_REDIRECT_URI(port),\n scopes: OAUTH_SCOPES\n };\n}\n\nfunction buildAuthorizationUrl(\n config: OAuthConfig,\n state: string,\n codeChallenge: string\n): string {\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: config.clientId,\n redirect_uri: config.redirectUri,\n scope: config.scopes.join(' '),\n state,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256'\n });\n\n return `${config.authorizationUrl}?${params.toString()}`;\n}\n\nasync function exchangeCodeForTokens(\n config: OAuthConfig,\n code: string,\n codeVerifier: string\n): Promise<AuthTokens> {\n const response = await fetch(config.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: config.clientId,\n code,\n redirect_uri: config.redirectUri,\n code_verifier: codeVerifier\n }).toString()\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n\n throw new OAuthError(`Failed to exchange authorization code: ${errorText}`);\n }\n\n const data = await response.json() as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n token_type?: string;\n };\n\n const tokens: AuthTokens = {\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n expiresIn: data.expires_in,\n tokenType: data.token_type\n };\n\n if (tokens.expiresIn) {\n tokens.expiresAt = Date.now() + tokens.expiresIn * 1000;\n }\n\n return tokens;\n}\n\nasync function getUserInfoFromToken(accessToken: string): Promise<UserInfo | undefined> {\n const client = new RestApiClient({ baseURL: DOCYRUS_API_URL });\n\n await client.setAccessToken(accessToken);\n\n try {\n return await client.get<UserInfo>('/v1/users/me');\n } catch {\n return undefined;\n }\n}\n\nexport interface OAuthLoginOptions {\n onOpeningBrowser?: () => void;\n onWaitingForAuth?: (url: string) => void;\n}\n\nexport async function loginWithOAuth(options: OAuthLoginOptions = {}): Promise<LoginResult> {\n // Generate PKCE values\n const state = generateState();\n const codeVerifier = generateCodeVerifier();\n const codeChallenge = await generateCodeChallenge(codeVerifier);\n\n // Start callback server\n const { port, resultPromise, cleanup } = await startCallbackServer(state);\n const config = getOAuthConfig(port);\n\n // Build authorization URL\n const authUrl = buildAuthorizationUrl(config, state, codeChallenge);\n\n try {\n // Open browser\n options.onOpeningBrowser?.();\n await openBrowser(authUrl);\n\n // Wait for callback\n options.onWaitingForAuth?.(authUrl);\n const { code } = await resultPromise;\n\n // Exchange code for tokens\n const tokens = await exchangeCodeForTokens(config, code, codeVerifier);\n\n // Get user info\n const user = await getUserInfoFromToken(tokens.accessToken);\n\n return { tokens, user };\n } finally {\n cleanup();\n }\n}\n","import Conf from 'conf';\n\nimport { CLI_NAME } from './constants.js';\n\nexport interface CliConfig {\n apiUrl?: string;\n lastLoginEmail?: string;\n telemetryEnabled: boolean;\n}\n\nconst defaults: CliConfig = {\n telemetryEnabled: true\n};\n\nclass ConfigManager {\n private config: Conf<CliConfig>;\n constructor() {\n this.config = new Conf<CliConfig>({\n projectName: CLI_NAME,\n defaults\n });\n }\n get<K extends keyof CliConfig>(key: K): CliConfig[K] {\n return this.config.get(key);\n }\n set<K extends keyof CliConfig>(key: K, value: CliConfig[K]): void {\n this.config.set(key, value);\n }\n delete<K extends keyof CliConfig>(key: K): void {\n this.config.delete(key);\n }\n getAll(): CliConfig {\n return this.config.store;\n }\n clear(): void {\n this.config.clear();\n }\n get path(): string {\n return this.config.path;\n }\n}\n\nexport const configManager = new ConfigManager();\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@docyrus/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/Docyrus/docyrus-devkit.git",
|
|
@@ -39,19 +39,16 @@
|
|
|
39
39
|
"keytar": "7.9.0",
|
|
40
40
|
"open": "11.0.0",
|
|
41
41
|
"ora": "9.3.0",
|
|
42
|
-
"@docyrus/api-client": "0.0
|
|
43
|
-
"@docyrus/tanstack-db-generator": "0.
|
|
42
|
+
"@docyrus/api-client": "0.1.0",
|
|
43
|
+
"@docyrus/tanstack-db-generator": "0.5.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@types/node": "25.2.
|
|
46
|
+
"@types/node": "25.2.3",
|
|
47
47
|
"dotenv": "17.2.4",
|
|
48
48
|
"tsup": "8.5.1",
|
|
49
49
|
"tsx": "4.21.0",
|
|
50
50
|
"typescript": "5.9.3"
|
|
51
51
|
},
|
|
52
|
-
"publishConfig": {
|
|
53
|
-
"access": "public"
|
|
54
|
-
},
|
|
55
52
|
"scripts": {
|
|
56
53
|
"build": "tsup",
|
|
57
54
|
"dev": "tsx watch src/cli.ts",
|