@lobehub/market-cli 0.0.2 → 0.0.3
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/cli.js +4 -1
- package/dist/cli.js.map +1 -1
- package/package.json +4 -4
package/dist/cli.js
CHANGED
|
@@ -179,7 +179,10 @@ function getPrimaryMacAddress() {
|
|
|
179
179
|
|
|
180
180
|
// src/commands/register.ts
|
|
181
181
|
function registerRegisterCommand(program2) {
|
|
182
|
-
program2.command("register").description("Register this device as an M2M client and save credentials locally").requiredOption("--name <name>", "Client name for registration").option("--description <desc>", "Description of the client").option(
|
|
182
|
+
program2.command("register").description("Register this device as an M2M client and save credentials locally").requiredOption("--name <name>", "Client name for registration").option("--description <desc>", "Description of the client").option(
|
|
183
|
+
"--source <source>",
|
|
184
|
+
"Agent source, lowercase with hyphens (e.g. claude-code, open-claw, codex, cursor)"
|
|
185
|
+
).option("--device-id <id>", "Device identifier (auto-generated if omitted)").option("--base-url <url>", "Market API base URL", "https://market.lobehub.com").option("--output <format>", "Output format (text|json)", "text").action(async (options) => {
|
|
183
186
|
try {
|
|
184
187
|
const deviceId = options.deviceId || generateDeviceId();
|
|
185
188
|
const baseURL = process.env.MARKET_BASE_URL || options.baseUrl;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/commands/auth.ts","../src/utils/config.ts","../src/utils/credentials.ts","../src/utils/output.ts","../src/commands/register.ts","../src/utils/deviceId.ts"],"sourcesContent":["import { createRequire } from 'node:module';\n\nimport { Command } from 'commander';\n\nimport { registerAuthCommand } from './commands/auth';\nimport { registerRegisterCommand } from './commands/register';\n\nconst require = createRequire(import.meta.url);\nconst pkg = require('../package.json');\n\nconst program = new Command();\n\nprogram\n .name('lobehub-market')\n .description('LobeHub Market CLI - Device registration and auth management')\n .version(pkg.version);\n\nregisterRegisterCommand(program);\nregisterAuthCommand(program);\n\nprogram.parse();\n","import type { Command } from 'commander';\nimport { MarketSDK } from '@lobehub/market-sdk';\n\nimport { resolveConfig } from '../utils/config';\nimport { deleteCredentials } from '../utils/credentials';\nimport { formatOutput } from '../utils/output';\n\nexport function registerAuthCommand(program: Command): void {\n const auth = program\n .command('auth')\n .description('Manage authentication credentials and tokens');\n\n auth\n .command('status')\n .description('Show credential and token status')\n .option('--output <format>', 'Output format (text|json)', 'text')\n .action(async (options) => {\n try {\n const config = resolveConfig();\n\n if (!config.clientId || !config.clientSecret) {\n console.error(\n 'No credentials found. Run `lobehub-market register` first or set MARKET_CLIENT_ID and MARKET_CLIENT_SECRET.',\n );\n process.exit(1);\n }\n\n const sdk = new MarketSDK({\n baseURL: config.baseUrl,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n });\n\n const tokenInfo = await sdk.fetchM2MToken();\n\n formatOutput(options.output, {\n baseUrl: config.baseUrl,\n clientId: config.clientId,\n expiresIn: `${tokenInfo.expiresIn}s`,\n source: config.source,\n status: 'authenticated',\n tokenPreview: `${tokenInfo.accessToken.slice(0, 12)}...`,\n });\n } catch (error: any) {\n console.error(`Auth status check failed: ${error.message}`);\n process.exit(1);\n }\n });\n\n auth\n .command('refresh')\n .description('Force refresh the M2M access token')\n .option('--output <format>', 'Output format (text|json)', 'text')\n .action(async (options) => {\n try {\n const config = resolveConfig();\n\n if (!config.clientId || !config.clientSecret) {\n console.error(\n 'No credentials found. Run `lobehub-market register` first or set MARKET_CLIENT_ID and MARKET_CLIENT_SECRET.',\n );\n process.exit(1);\n }\n\n const sdk = new MarketSDK({\n baseURL: config.baseUrl,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n });\n\n const tokenInfo = await sdk.fetchM2MToken();\n\n formatOutput(options.output, {\n accessToken: tokenInfo.accessToken,\n expiresIn: tokenInfo.expiresIn,\n message: 'Token refreshed successfully',\n });\n } catch (error: any) {\n console.error(`Token refresh failed: ${error.message}`);\n process.exit(1);\n }\n });\n\n auth\n .command('logout')\n .description('Clear local credentials')\n .action(async () => {\n try {\n const deleted = await deleteCredentials();\n if (deleted) {\n console.log('Credentials cleared successfully.');\n } else {\n console.log('No credentials file found.');\n }\n } catch (error: any) {\n console.error(`Logout failed: ${error.message}`);\n process.exit(1);\n }\n });\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport interface ResolvedConfig {\n baseUrl: string;\n clientId: string | undefined;\n clientSecret: string | undefined;\n source: 'env' | 'file' | 'mixed' | 'none';\n}\n\nexport function resolveConfig(): ResolvedConfig {\n const envClientId = process.env.MARKET_CLIENT_ID;\n const envClientSecret = process.env.MARKET_CLIENT_SECRET;\n const envBaseUrl = process.env.MARKET_BASE_URL;\n\n let fileCredentials: { baseUrl?: string; clientId?: string; clientSecret?: string } | null = null;\n\n try {\n const filePath = join(homedir(), '.lobehub-market', 'credentials.json');\n if (existsSync(filePath)) {\n const content = readFileSync(filePath, 'utf-8');\n fileCredentials = JSON.parse(content);\n }\n } catch {\n // Ignore file read errors\n }\n\n const clientId = envClientId || fileCredentials?.clientId;\n const clientSecret = envClientSecret || fileCredentials?.clientSecret;\n const baseUrl = envBaseUrl || fileCredentials?.baseUrl || 'https://market.lobehub.com';\n\n let source: ResolvedConfig['source'] = 'none';\n if (clientId && clientSecret) {\n const idFromEnv = !!envClientId;\n const secretFromEnv = !!envClientSecret;\n\n if (idFromEnv && secretFromEnv) {\n source = 'env';\n } else if (!idFromEnv && !secretFromEnv) {\n source = 'file';\n } else {\n source = 'mixed';\n }\n }\n\n return { baseUrl, clientId, clientSecret, source };\n}\n","import { existsSync } from 'node:fs';\nimport { mkdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport interface StoredCredentials {\n baseUrl: string;\n clientId: string;\n clientSecret: string;\n deviceId: string;\n name: string;\n registeredAt: string;\n source?: string;\n}\n\nconst CREDENTIALS_DIR = join(homedir(), '.lobehub-market');\nconst CREDENTIALS_FILE = join(CREDENTIALS_DIR, 'credentials.json');\n\nexport async function saveCredentials(credentials: StoredCredentials): Promise<void> {\n if (!existsSync(CREDENTIALS_DIR)) {\n await mkdir(CREDENTIALS_DIR, { mode: 0o700, recursive: true });\n }\n\n const content = JSON.stringify(credentials, null, 2);\n await writeFile(CREDENTIALS_FILE, content, { encoding: 'utf-8', mode: 0o600 });\n}\n\nexport async function loadCredentials(): Promise<StoredCredentials | null> {\n if (!existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n\n const content = await readFile(CREDENTIALS_FILE, 'utf-8');\n return JSON.parse(content) as StoredCredentials;\n}\n\nexport async function deleteCredentials(): Promise<boolean> {\n if (!existsSync(CREDENTIALS_FILE)) {\n return false;\n }\n\n await rm(CREDENTIALS_FILE);\n return true;\n}\n\nexport function getCredentialsPath(): string {\n return CREDENTIALS_FILE;\n}\n","export function formatOutput(format: string, data: Record<string, unknown>): void {\n if (format === 'json') {\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n for (const [key, value] of Object.entries(data)) {\n const label = key\n .replaceAll(/([A-Z])/g, ' $1')\n .replace(/^./, (s) => s.toUpperCase())\n .trim();\n console.log(` ${label}: ${value}`);\n }\n}\n","import type { Command } from 'commander';\nimport { MarketSDK } from '@lobehub/market-sdk';\n\nimport { getCredentialsPath, saveCredentials } from '../utils/credentials';\nimport { generateDeviceId } from '../utils/deviceId';\nimport { formatOutput } from '../utils/output';\n\nexport function registerRegisterCommand(program: Command): void {\n program\n .command('register')\n .description('Register this device as an M2M client and save credentials locally')\n .requiredOption('--name <name>', 'Client name for registration')\n .option('--description <desc>', 'Description of the client')\n .option('--source <source>', 'Agent source (e.g. claude-code, open-claw, codex, cursor)')\n .option('--device-id <id>', 'Device identifier (auto-generated if omitted)')\n .option('--base-url <url>', 'Market API base URL', 'https://market.lobehub.com')\n .option('--output <format>', 'Output format (text|json)', 'text')\n .action(async (options) => {\n try {\n const deviceId = options.deviceId || generateDeviceId();\n const baseURL = process.env.MARKET_BASE_URL || options.baseUrl;\n const source = options.source;\n\n const description = [options.description, source && `source: ${source}`]\n .filter(Boolean)\n .join('. ');\n\n const sdk = new MarketSDK({ baseURL });\n\n const result = await sdk.auth.registerClient({\n clientName: options.name,\n clientType: 'cli',\n description: description || undefined,\n deviceId,\n platform: process.arch,\n version: process.version,\n });\n\n await saveCredentials({\n baseUrl: baseURL,\n clientId: result.client_id,\n clientSecret: result.client_secret,\n deviceId,\n name: options.name,\n registeredAt: new Date().toISOString(),\n source,\n });\n\n formatOutput(options.output, {\n clientId: result.client_id,\n credentialsPath: getCredentialsPath(),\n message: result.message || 'Client registered successfully',\n });\n } catch (error: any) {\n console.error(`Registration failed: ${error.message}`);\n process.exit(1);\n }\n });\n}\n","import { createHash } from 'node:crypto';\nimport { hostname, networkInterfaces } from 'node:os';\n\nexport function generateDeviceId(): string {\n const host = hostname();\n const mac = getPrimaryMacAddress();\n\n const input = mac ? `${host}:${mac}` : host;\n const hash = createHash('sha256').update(input).digest('hex').slice(0, 16);\n\n return `device-${hash}`;\n}\n\nfunction getPrimaryMacAddress(): string | undefined {\n const interfaces = networkInterfaces();\n\n for (const name of Object.keys(interfaces).sort()) {\n const entries = interfaces[name];\n if (!entries) continue;\n\n for (const entry of entries) {\n if (entry.internal) continue;\n if (entry.mac === '00:00:00:00:00:00') continue;\n\n return entry.mac;\n }\n }\n\n return undefined;\n}\n"],"mappings":"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","names":["existsSync","homedir","join","existsSync","program","MarketSDK","program","MarketSDK","require"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/auth.ts","../src/utils/config.ts","../src/utils/credentials.ts","../src/utils/output.ts","../src/commands/register.ts","../src/utils/deviceId.ts"],"sourcesContent":["import { createRequire } from 'node:module';\n\nimport { Command } from 'commander';\n\nimport { registerAuthCommand } from './commands/auth';\nimport { registerRegisterCommand } from './commands/register';\n\nconst require = createRequire(import.meta.url);\nconst pkg = require('../package.json');\n\nconst program = new Command();\n\nprogram\n .name('lobehub-market')\n .description('LobeHub Market CLI - Device registration and auth management')\n .version(pkg.version);\n\nregisterRegisterCommand(program);\nregisterAuthCommand(program);\n\nprogram.parse();\n","import type { Command } from 'commander';\nimport { MarketSDK } from '@lobehub/market-sdk';\n\nimport { resolveConfig } from '../utils/config';\nimport { deleteCredentials } from '../utils/credentials';\nimport { formatOutput } from '../utils/output';\n\nexport function registerAuthCommand(program: Command): void {\n const auth = program\n .command('auth')\n .description('Manage authentication credentials and tokens');\n\n auth\n .command('status')\n .description('Show credential and token status')\n .option('--output <format>', 'Output format (text|json)', 'text')\n .action(async (options) => {\n try {\n const config = resolveConfig();\n\n if (!config.clientId || !config.clientSecret) {\n console.error(\n 'No credentials found. Run `lobehub-market register` first or set MARKET_CLIENT_ID and MARKET_CLIENT_SECRET.',\n );\n process.exit(1);\n }\n\n const sdk = new MarketSDK({\n baseURL: config.baseUrl,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n });\n\n const tokenInfo = await sdk.fetchM2MToken();\n\n formatOutput(options.output, {\n baseUrl: config.baseUrl,\n clientId: config.clientId,\n expiresIn: `${tokenInfo.expiresIn}s`,\n source: config.source,\n status: 'authenticated',\n tokenPreview: `${tokenInfo.accessToken.slice(0, 12)}...`,\n });\n } catch (error: any) {\n console.error(`Auth status check failed: ${error.message}`);\n process.exit(1);\n }\n });\n\n auth\n .command('refresh')\n .description('Force refresh the M2M access token')\n .option('--output <format>', 'Output format (text|json)', 'text')\n .action(async (options) => {\n try {\n const config = resolveConfig();\n\n if (!config.clientId || !config.clientSecret) {\n console.error(\n 'No credentials found. Run `lobehub-market register` first or set MARKET_CLIENT_ID and MARKET_CLIENT_SECRET.',\n );\n process.exit(1);\n }\n\n const sdk = new MarketSDK({\n baseURL: config.baseUrl,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n });\n\n const tokenInfo = await sdk.fetchM2MToken();\n\n formatOutput(options.output, {\n accessToken: tokenInfo.accessToken,\n expiresIn: tokenInfo.expiresIn,\n message: 'Token refreshed successfully',\n });\n } catch (error: any) {\n console.error(`Token refresh failed: ${error.message}`);\n process.exit(1);\n }\n });\n\n auth\n .command('logout')\n .description('Clear local credentials')\n .action(async () => {\n try {\n const deleted = await deleteCredentials();\n if (deleted) {\n console.log('Credentials cleared successfully.');\n } else {\n console.log('No credentials file found.');\n }\n } catch (error: any) {\n console.error(`Logout failed: ${error.message}`);\n process.exit(1);\n }\n });\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport interface ResolvedConfig {\n baseUrl: string;\n clientId: string | undefined;\n clientSecret: string | undefined;\n source: 'env' | 'file' | 'mixed' | 'none';\n}\n\nexport function resolveConfig(): ResolvedConfig {\n const envClientId = process.env.MARKET_CLIENT_ID;\n const envClientSecret = process.env.MARKET_CLIENT_SECRET;\n const envBaseUrl = process.env.MARKET_BASE_URL;\n\n let fileCredentials: { baseUrl?: string; clientId?: string; clientSecret?: string } | null = null;\n\n try {\n const filePath = join(homedir(), '.lobehub-market', 'credentials.json');\n if (existsSync(filePath)) {\n const content = readFileSync(filePath, 'utf-8');\n fileCredentials = JSON.parse(content);\n }\n } catch {\n // Ignore file read errors\n }\n\n const clientId = envClientId || fileCredentials?.clientId;\n const clientSecret = envClientSecret || fileCredentials?.clientSecret;\n const baseUrl = envBaseUrl || fileCredentials?.baseUrl || 'https://market.lobehub.com';\n\n let source: ResolvedConfig['source'] = 'none';\n if (clientId && clientSecret) {\n const idFromEnv = !!envClientId;\n const secretFromEnv = !!envClientSecret;\n\n if (idFromEnv && secretFromEnv) {\n source = 'env';\n } else if (!idFromEnv && !secretFromEnv) {\n source = 'file';\n } else {\n source = 'mixed';\n }\n }\n\n return { baseUrl, clientId, clientSecret, source };\n}\n","import { existsSync } from 'node:fs';\nimport { mkdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport interface StoredCredentials {\n baseUrl: string;\n clientId: string;\n clientSecret: string;\n deviceId: string;\n name: string;\n registeredAt: string;\n source?: string;\n}\n\nconst CREDENTIALS_DIR = join(homedir(), '.lobehub-market');\nconst CREDENTIALS_FILE = join(CREDENTIALS_DIR, 'credentials.json');\n\nexport async function saveCredentials(credentials: StoredCredentials): Promise<void> {\n if (!existsSync(CREDENTIALS_DIR)) {\n await mkdir(CREDENTIALS_DIR, { mode: 0o700, recursive: true });\n }\n\n const content = JSON.stringify(credentials, null, 2);\n await writeFile(CREDENTIALS_FILE, content, { encoding: 'utf-8', mode: 0o600 });\n}\n\nexport async function loadCredentials(): Promise<StoredCredentials | null> {\n if (!existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n\n const content = await readFile(CREDENTIALS_FILE, 'utf-8');\n return JSON.parse(content) as StoredCredentials;\n}\n\nexport async function deleteCredentials(): Promise<boolean> {\n if (!existsSync(CREDENTIALS_FILE)) {\n return false;\n }\n\n await rm(CREDENTIALS_FILE);\n return true;\n}\n\nexport function getCredentialsPath(): string {\n return CREDENTIALS_FILE;\n}\n","export function formatOutput(format: string, data: Record<string, unknown>): void {\n if (format === 'json') {\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n for (const [key, value] of Object.entries(data)) {\n const label = key\n .replaceAll(/([A-Z])/g, ' $1')\n .replace(/^./, (s) => s.toUpperCase())\n .trim();\n console.log(` ${label}: ${value}`);\n }\n}\n","import { MarketSDK } from '@lobehub/market-sdk';\nimport type { Command } from 'commander';\n\nimport { getCredentialsPath, saveCredentials } from '../utils/credentials';\nimport { generateDeviceId } from '../utils/deviceId';\nimport { formatOutput } from '../utils/output';\n\nexport function registerRegisterCommand(program: Command): void {\n program\n .command('register')\n .description('Register this device as an M2M client and save credentials locally')\n .requiredOption('--name <name>', 'Client name for registration')\n .option('--description <desc>', 'Description of the client')\n .option(\n '--source <source>',\n 'Agent source, lowercase with hyphens (e.g. claude-code, open-claw, codex, cursor)',\n )\n .option('--device-id <id>', 'Device identifier (auto-generated if omitted)')\n .option('--base-url <url>', 'Market API base URL', 'https://market.lobehub.com')\n .option('--output <format>', 'Output format (text|json)', 'text')\n .action(async (options) => {\n try {\n const deviceId = options.deviceId || generateDeviceId();\n const baseURL = process.env.MARKET_BASE_URL || options.baseUrl;\n const source = options.source;\n\n const description = [options.description, source && `source: ${source}`]\n .filter(Boolean)\n .join('. ');\n\n const sdk = new MarketSDK({ baseURL });\n\n const result = await sdk.auth.registerClient({\n clientName: options.name,\n clientType: 'cli',\n description: description || undefined,\n deviceId,\n platform: process.arch,\n version: process.version,\n });\n\n await saveCredentials({\n baseUrl: baseURL,\n clientId: result.client_id,\n clientSecret: result.client_secret,\n deviceId,\n name: options.name,\n registeredAt: new Date().toISOString(),\n source,\n });\n\n formatOutput(options.output, {\n clientId: result.client_id,\n credentialsPath: getCredentialsPath(),\n message: result.message || 'Client registered successfully',\n });\n } catch (error: any) {\n console.error(`Registration failed: ${error.message}`);\n process.exit(1);\n }\n });\n}\n","import { createHash } from 'node:crypto';\nimport { hostname, networkInterfaces } from 'node:os';\n\nexport function generateDeviceId(): string {\n const host = hostname();\n const mac = getPrimaryMacAddress();\n\n const input = mac ? `${host}:${mac}` : host;\n const hash = createHash('sha256').update(input).digest('hex').slice(0, 16);\n\n return `device-${hash}`;\n}\n\nfunction getPrimaryMacAddress(): string | undefined {\n const interfaces = networkInterfaces();\n\n for (const name of Object.keys(interfaces).sort()) {\n const entries = interfaces[name];\n if (!entries) continue;\n\n for (const entry of entries) {\n if (entry.internal) continue;\n if (entry.mac === '00:00:00:00:00:00') continue;\n\n return entry.mac;\n }\n }\n\n return undefined;\n}\n"],"mappings":"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","names":["existsSync","homedir","join","existsSync","program","MarketSDK","program","MarketSDK","require"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lobehub/market-cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "LobeHub Market CLI - Device registration and auth management",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"lobehub",
|
|
@@ -25,10 +25,10 @@
|
|
|
25
25
|
"dist"
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"
|
|
29
|
-
"
|
|
28
|
+
"commander": "^13.1.0",
|
|
29
|
+
"@lobehub/market-sdk": "0.30.4"
|
|
30
30
|
},
|
|
31
31
|
"engines": {
|
|
32
32
|
"node": ">=22.0.0"
|
|
33
33
|
}
|
|
34
|
-
}
|
|
34
|
+
}
|