@tpmjs/cli 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +18 -0
- package/bin/run.js +0 -0
- package/dist/commands/agent/chat.js +7 -7
- package/dist/commands/agent/chat.js.map +1 -1
- package/dist/commands/agent/create.js +6 -6
- package/dist/commands/agent/create.js.map +1 -1
- package/dist/commands/agent/delete.js +9 -7
- package/dist/commands/agent/delete.js.map +1 -1
- package/dist/commands/agent/list.js +6 -6
- package/dist/commands/agent/list.js.map +1 -1
- package/dist/commands/agent/update.js +6 -6
- package/dist/commands/agent/update.js.map +1 -1
- package/dist/commands/auth/login.js +6 -6
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/auth/logout.js +4 -4
- package/dist/commands/auth/logout.js.map +1 -1
- package/dist/commands/auth/status.js +12 -9
- package/dist/commands/auth/status.js.map +1 -1
- package/dist/commands/auth/whoami.js +6 -6
- package/dist/commands/auth/whoami.js.map +1 -1
- package/dist/commands/collection/add.js +6 -6
- package/dist/commands/collection/add.js.map +1 -1
- package/dist/commands/collection/create.js +6 -6
- package/dist/commands/collection/create.js.map +1 -1
- package/dist/commands/collection/delete.js +7 -7
- package/dist/commands/collection/delete.js.map +1 -1
- package/dist/commands/collection/import.js +7 -7
- package/dist/commands/collection/import.js.map +1 -1
- package/dist/commands/collection/info.d.ts +17 -0
- package/dist/commands/collection/info.js +358 -0
- package/dist/commands/collection/info.js.map +1 -0
- package/dist/commands/collection/list.js +6 -6
- package/dist/commands/collection/list.js.map +1 -1
- package/dist/commands/collection/remove.js +7 -9
- package/dist/commands/collection/remove.js.map +1 -1
- package/dist/commands/collection/update.js +6 -6
- package/dist/commands/collection/update.js.map +1 -1
- package/dist/commands/doctor.js +7 -7
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/mcp/config.js +4 -4
- package/dist/commands/mcp/config.js.map +1 -1
- package/dist/commands/mcp/serve.js +7 -7
- package/dist/commands/mcp/serve.js.map +1 -1
- package/dist/commands/playground.js +7 -7
- package/dist/commands/playground.js.map +1 -1
- package/dist/commands/publish/check.js +11 -11
- package/dist/commands/publish/check.js.map +1 -1
- package/dist/commands/publish/preview.js +4 -4
- package/dist/commands/publish/preview.js.map +1 -1
- package/dist/commands/run.d.ts +24 -0
- package/dist/commands/run.js +454 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/scenario/generate.js +6 -6
- package/dist/commands/scenario/generate.js.map +1 -1
- package/dist/commands/scenario/info.js +6 -6
- package/dist/commands/scenario/info.js.map +1 -1
- package/dist/commands/scenario/list.js +11 -11
- package/dist/commands/scenario/list.js.map +1 -1
- package/dist/commands/scenario/run.js +7 -7
- package/dist/commands/scenario/run.js.map +1 -1
- package/dist/commands/scenario/test.js +8 -8
- package/dist/commands/scenario/test.js.map +1 -1
- package/dist/commands/tool/execute.js +9 -7
- package/dist/commands/tool/execute.js.map +1 -1
- package/dist/commands/tool/info.js +16 -9
- package/dist/commands/tool/info.js.map +1 -1
- package/dist/commands/tool/init.js +7 -13
- package/dist/commands/tool/init.js.map +1 -1
- package/dist/commands/tool/search.js +7 -11
- package/dist/commands/tool/search.js.map +1 -1
- package/dist/commands/tool/trending.js +6 -6
- package/dist/commands/tool/trending.js.map +1 -1
- package/dist/commands/tool/validate.js +15 -9
- package/dist/commands/tool/validate.js.map +1 -1
- package/dist/commands/update.js +4 -4
- package/dist/commands/update.js.map +1 -1
- package/dist/hooks/init.js +1 -1
- package/dist/hooks/init.js.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/oclif.manifest.json +146 -1
- package/package.json +10 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/config.ts","../../../src/lib/api-client.ts","../../../src/lib/output.ts","../../../src/commands/tool/trending.ts"],"names":[],"mappings":"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","file":"trending.js","sourcesContent":["import Conf from 'conf';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nexport interface TpmConfig {\n apiUrl?: string;\n defaultOutput?: 'human' | 'json';\n verbose?: boolean;\n analytics?: boolean;\n env?: Record<string, string>;\n}\n\nexport interface TpmCredentials {\n apiKey?: string;\n refreshToken?: string;\n expiresAt?: string;\n}\n\nconst CONFIG_DIR = path.join(os.homedir(), '.tpmjs');\nconst CREDENTIALS_FILE = path.join(CONFIG_DIR, 'credentials.json');\nconst HISTORY_DIR = path.join(CONFIG_DIR, 'history');\n\n// Ensure config directory exists\nfunction ensureConfigDir(): void {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\n// Config store using Conf\nconst configStore = new Conf<TpmConfig>({\n projectName: 'tpmjs',\n cwd: CONFIG_DIR,\n configName: 'config',\n defaults: {\n apiUrl: 'https://tpmjs.com/api',\n defaultOutput: 'human',\n verbose: false,\n analytics: false,\n },\n});\n\nexport function getConfig(): TpmConfig {\n return configStore.store;\n}\n\nexport function setConfig(config: Partial<TpmConfig>): void {\n for (const [key, value] of Object.entries(config)) {\n if (value !== undefined) {\n configStore.set(key, value);\n }\n }\n}\n\nexport function getConfigValue<K extends keyof TpmConfig>(key: K): TpmConfig[K] {\n return configStore.get(key);\n}\n\nexport function setConfigValue<K extends keyof TpmConfig>(\n key: K,\n value: TpmConfig[K]\n): void {\n configStore.set(key, value);\n}\n\nexport function resetConfig(): void {\n configStore.clear();\n}\n\n// Credentials management with secure file permissions\nexport function loadCredentials(): TpmCredentials | null {\n ensureConfigDir();\n\n if (!fs.existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n\n try {\n const content = fs.readFileSync(CREDENTIALS_FILE, 'utf-8');\n return JSON.parse(content) as TpmCredentials;\n } catch {\n return null;\n }\n}\n\nexport function saveCredentials(credentials: TpmCredentials): void {\n ensureConfigDir();\n\n const content = JSON.stringify(credentials, null, 2);\n fs.writeFileSync(CREDENTIALS_FILE, content, { mode: 0o600 });\n}\n\nexport function deleteCredentials(): void {\n if (fs.existsSync(CREDENTIALS_FILE)) {\n fs.unlinkSync(CREDENTIALS_FILE);\n }\n}\n\nexport function hasCredentials(): boolean {\n const creds = loadCredentials();\n return creds !== null && !!creds.apiKey;\n}\n\n// Get API key from multiple sources (priority order)\nexport function getApiKey(): string | undefined {\n // 1. Environment variable\n if (process.env.TPMJS_API_KEY) {\n return process.env.TPMJS_API_KEY;\n }\n\n // 2. Credentials file\n const creds = loadCredentials();\n if (creds?.apiKey) {\n return creds.apiKey;\n }\n\n return undefined;\n}\n\n// Get API URL\nexport function getApiUrl(): string {\n return process.env.TPMJS_API_URL ?? getConfigValue('apiUrl') ?? 'https://tpmjs.com/api';\n}\n\n// History directory for conversation caching\nexport function getHistoryDir(): string {\n if (!fs.existsSync(HISTORY_DIR)) {\n fs.mkdirSync(HISTORY_DIR, { recursive: true, mode: 0o700 });\n }\n return HISTORY_DIR;\n}\n\n// Config directory path\nexport function getConfigDir(): string {\n ensureConfigDir();\n return CONFIG_DIR;\n}\n","import { getApiKey, getApiUrl } from './config.js';\n\nexport interface TpmClientOptions {\n baseUrl?: string;\n apiKey?: string;\n timeout?: number;\n}\n\nexport interface ApiResponse<T> {\n success: boolean;\n data?: T;\n error?: string;\n message?: string;\n}\n\nexport interface PaginationOptions {\n limit?: number;\n offset?: number;\n}\n\nexport interface PaginatedResponse<T> {\n data: T[];\n pagination: {\n limit: number;\n offset: number;\n hasMore: boolean;\n };\n}\n\n// Tool types\nexport interface Tool {\n id: string;\n name: string;\n slug: string;\n description: string;\n category: string;\n tier: string;\n qualityScore: number | null;\n importHealth: string;\n executionHealth: string;\n likeCount: number;\n npmPackageName: string;\n npmVersion: string;\n npmDownloadsLastMonth: number;\n isOfficial: boolean;\n inputSchema?: Record<string, unknown>;\n outputSchema?: Record<string, unknown>;\n tools?: { name: string; description?: string }[];\n package?: {\n npmPackageName: string;\n category: string;\n npmDownloadsLastMonth: number;\n isOfficial: boolean;\n };\n}\n\nexport interface ToolSearchOptions extends PaginationOptions {\n category?: string;\n query?: string;\n}\n\n// Agent types\nexport interface Agent {\n id: string;\n uid: string;\n name: string;\n description: string | null;\n provider: string;\n modelId: string;\n systemPrompt: string | null;\n temperature: number;\n isPublic: boolean;\n likeCount: number;\n _count?: {\n tools: number;\n collections: number;\n };\n}\n\nexport interface CreateAgentInput {\n name: string;\n uid?: string;\n description?: string;\n provider: string;\n modelId: string;\n systemPrompt?: string;\n temperature?: number;\n isPublic?: boolean;\n collectionIds?: string[];\n toolIds?: string[];\n}\n\nexport interface UpdateAgentInput {\n name?: string;\n uid?: string;\n description?: string;\n provider?: string;\n modelId?: string;\n systemPrompt?: string;\n temperature?: number;\n isPublic?: boolean;\n maxToolCallsPerTurn?: number;\n maxMessagesInContext?: number;\n}\n\n// Collection types\nexport interface Collection {\n id: string;\n name: string;\n slug: string | null;\n description: string | null;\n isPublic: boolean;\n likeCount: number;\n _count?: {\n tools: number;\n };\n}\n\nexport interface CreateCollectionInput {\n name: string;\n description?: string;\n isPublic: boolean;\n}\n\nexport interface UpdateCollectionInput {\n name?: string;\n description?: string;\n isPublic?: boolean;\n}\n\n// User types\nexport interface User {\n id: string;\n name: string | null;\n username: string | null;\n email: string;\n image: string | null;\n}\n\n// API Key types\nexport interface ApiKey {\n id: string;\n name: string;\n keyPrefix: string;\n scopes: string[];\n isActive: boolean;\n lastUsedAt: string | null;\n expiresAt: string | null;\n createdAt: string;\n}\n\n// Scenario types\nexport interface Scenario {\n id: string;\n collectionId: string | null;\n prompt: string;\n name: string | null;\n description: string | null;\n tags: string[];\n qualityScore: number;\n totalRuns: number;\n lastRunAt: string | null;\n lastRunStatus: string | null;\n consecutivePasses: number;\n consecutiveFails: number;\n createdAt: string;\n updatedAt: string;\n collection?: {\n id: string;\n name: string;\n slug: string | null;\n username: string | null;\n } | null;\n}\n\nexport interface ScenarioRun {\n id: string;\n status: string;\n success: boolean;\n evaluator: {\n model: string | null;\n verdict: string | null;\n reason: string | null;\n };\n assertions: unknown;\n usage: {\n inputTokens: number | null;\n outputTokens: number | null;\n totalTokens: number | null;\n executionTimeMs: number | null;\n };\n timestamps: {\n startedAt: string | null;\n completedAt: string | null;\n createdAt: string;\n };\n quotaRemaining?: number;\n}\n\nexport interface ScenarioListOptions extends PaginationOptions {\n collectionId?: string;\n tags?: string;\n sortBy?: 'qualityScore' | 'totalRuns' | 'createdAt' | 'lastRunAt';\n}\n\nexport interface CreateScenarioInput {\n collectionId: string;\n prompt: string;\n name?: string;\n description?: string;\n tags?: string[];\n}\n\nexport interface GenerateScenariosInput {\n count?: number;\n skipSimilarityCheck?: boolean;\n}\n\n// Stats types\nexport interface Stats {\n tools: {\n total: number;\n official: number;\n healthyImport: number;\n healthyExecution: number;\n };\n packages: {\n total: number;\n official: number;\n };\n categories: { name: string; count: number }[];\n}\n\nexport class TpmClient {\n private baseUrl: string;\n private apiKey: string | undefined;\n private timeout: number;\n\n constructor(options: TpmClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? getApiUrl();\n this.apiKey = options.apiKey ?? getApiKey();\n this.timeout = options.timeout ?? 30000;\n }\n\n private async request<T>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(options.headers as Record<string, string>),\n };\n\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n });\n\n const data = (await response.json()) as T & { message?: string; error?: string };\n\n if (!response.ok) {\n throw new ApiError(\n data.message || data.error || `HTTP ${response.status}`,\n response.status,\n data\n );\n }\n\n return data as T;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // Health check\n async health(): Promise<{ status: string; timestamp: string }> {\n return this.request('/health');\n }\n\n // Stats\n async getStats(): Promise<ApiResponse<Stats>> {\n return this.request('/stats');\n }\n\n // Tools\n async searchTools(options: ToolSearchOptions = {}): Promise<PaginatedResponse<Tool>> {\n const params = new URLSearchParams();\n if (options.query) params.set('q', options.query);\n if (options.category) params.set('category', options.category);\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/tools?${queryString}` : '/tools';\n\n return this.request<PaginatedResponse<Tool>>(endpoint);\n }\n\n async getTool(packageName: string, toolName: string): Promise<ApiResponse<Tool>> {\n return this.request(\n `/tools/${encodeURIComponent(packageName)}/${encodeURIComponent(toolName)}`\n );\n }\n\n async getToolBySlug(slug: string): Promise<ApiResponse<Tool>> {\n // Search for the tool by slug\n const searchResult = await this.searchTools({ query: slug, limit: 1 });\n if (searchResult.data && searchResult.data.length > 0) {\n const tool = searchResult.data.find((t) => t.slug === slug) || searchResult.data[0];\n return { success: true, data: tool };\n }\n return { success: false, error: 'Tool not found' };\n }\n\n async getTrendingTools(options: PaginationOptions = {}): Promise<PaginatedResponse<Tool>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/tools/trending?${queryString}` : '/tools/trending';\n\n return this.request<PaginatedResponse<Tool>>(endpoint);\n }\n\n async validateTpmjsField(\n field: unknown\n ): Promise<ApiResponse<{ valid: boolean; tier: string | null; errors?: unknown[] }>> {\n return this.request('/tools/validate', {\n method: 'POST',\n body: JSON.stringify(field),\n });\n }\n\n async executeTool(slug: string, params: Record<string, unknown>): Promise<unknown> {\n return this.request(`/tools/${encodeURIComponent(slug)}/execute`, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n async *executeToolStream(\n slug: string,\n params: Record<string, unknown>\n ): AsyncGenerator<{ type: string; data: string }> {\n const url = `${this.baseUrl}/tools/${encodeURIComponent(slug)}/execute`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n };\n\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ ...params, stream: true }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new ApiError(errorText || `HTTP ${response.status}`, response.status);\n }\n\n if (!response.body) {\n throw new ApiError('No response body', 0);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n yield { type: 'done', data: '' };\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n yield { type: 'done', data: '' };\n return;\n }\n try {\n const parsed = JSON.parse(data);\n yield { type: parsed.type || 'text', data: parsed.content || parsed.data || data };\n } catch {\n yield { type: 'text', data };\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n // Agents\n async listAgents(options: PaginationOptions = {}): Promise<PaginatedResponse<Agent>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/agents?${queryString}` : '/agents';\n\n return this.request<PaginatedResponse<Agent>>(endpoint);\n }\n\n async getAgent(id: string): Promise<ApiResponse<Agent>> {\n return this.request(`/agents/${id}`);\n }\n\n async createAgent(input: CreateAgentInput): Promise<ApiResponse<Agent>> {\n return this.request('/agents', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async updateAgent(id: string, input: UpdateAgentInput): Promise<ApiResponse<Agent>> {\n return this.request(`/agents/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n });\n }\n\n async deleteAgent(id: string): Promise<ApiResponse<void>> {\n return this.request(`/agents/${id}`, {\n method: 'DELETE',\n });\n }\n\n // Collections\n async listCollections(options: PaginationOptions = {}): Promise<PaginatedResponse<Collection>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/collections?${queryString}` : '/collections';\n\n return this.request<PaginatedResponse<Collection>>(endpoint);\n }\n\n async getCollection(id: string): Promise<ApiResponse<Collection>> {\n return this.request(`/collections/${id}`);\n }\n\n async createCollection(input: CreateCollectionInput): Promise<ApiResponse<Collection>> {\n return this.request('/collections', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async updateCollection(\n id: string,\n input: UpdateCollectionInput\n ): Promise<ApiResponse<Collection>> {\n return this.request(`/collections/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n });\n }\n\n async deleteCollection(id: string): Promise<ApiResponse<void>> {\n return this.request(`/collections/${id}`, {\n method: 'DELETE',\n });\n }\n\n async addToolsToCollection(id: string, toolIds: string[]): Promise<ApiResponse<void>> {\n // Add tools one by one (API doesn't support bulk)\n for (const toolId of toolIds) {\n await this.request(`/collections/${id}/tools/${toolId}`, {\n method: 'POST',\n });\n }\n return { success: true };\n }\n\n async removeToolFromCollection(id: string, toolId: string): Promise<ApiResponse<void>> {\n return this.request(`/collections/${id}/tools/${toolId}`, {\n method: 'DELETE',\n });\n }\n\n // User\n async whoami(): Promise<ApiResponse<User>> {\n return this.request('/user/profile');\n }\n\n async listApiKeys(): Promise<ApiResponse<ApiKey[]>> {\n return this.request('/user/tpmjs-api-keys');\n }\n\n // Scenarios\n async listScenarios(options: ScenarioListOptions = {}): Promise<PaginatedResponse<Scenario>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n if (options.collectionId) params.set('collectionId', options.collectionId);\n if (options.tags) params.set('tags', options.tags);\n if (options.sortBy) params.set('sortBy', options.sortBy);\n\n const queryString = params.toString();\n const endpoint = queryString ? `/scenarios?${queryString}` : '/scenarios';\n\n return this.request<PaginatedResponse<Scenario>>(endpoint);\n }\n\n async listCollectionScenarios(\n collectionId: string,\n options: PaginationOptions = {}\n ): Promise<ApiResponse<{ scenarios: Scenario[] }>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString\n ? `/collections/${collectionId}/scenarios?${queryString}`\n : `/collections/${collectionId}/scenarios`;\n\n return this.request<ApiResponse<{ scenarios: Scenario[] }>>(endpoint);\n }\n\n async getScenario(id: string): Promise<ApiResponse<Scenario>> {\n return this.request(`/scenarios/${id}`);\n }\n\n async createScenario(input: CreateScenarioInput): Promise<ApiResponse<Scenario>> {\n return this.request('/scenarios', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async generateScenarios(\n collectionId: string,\n input: GenerateScenariosInput = {}\n ): Promise<ApiResponse<{ scenarios: { scenario: Scenario; similarity?: unknown }[] }>> {\n return this.request(`/collections/${collectionId}/scenarios/generate`, {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async runScenario(scenarioId: string): Promise<ApiResponse<ScenarioRun>> {\n return this.request(`/scenarios/${scenarioId}/run`, {\n method: 'POST',\n });\n }\n\n async getScenarioRuns(\n scenarioId: string,\n options: PaginationOptions = {}\n ): Promise<PaginatedResponse<ScenarioRun>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString\n ? `/scenarios/${scenarioId}/runs?${queryString}`\n : `/scenarios/${scenarioId}/runs`;\n\n return this.request<PaginatedResponse<ScenarioRun>>(endpoint);\n }\n\n // Check if authenticated\n isAuthenticated(): boolean {\n return !!this.apiKey;\n }\n}\n\n// Custom error class for API errors\nexport class ApiError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public data?: unknown\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\n// Singleton instance\nlet clientInstance: TpmClient | null = null;\n\nexport function getClient(options?: TpmClientOptions): TpmClient {\n if (!clientInstance || options) {\n clientInstance = new TpmClient(options);\n }\n return clientInstance;\n}\n","import Table from 'cli-table3';\nimport ora, { type Ora } from 'ora';\nimport pc from 'picocolors';\n\nexport interface OutputOptions {\n json?: boolean;\n verbose?: boolean;\n noColor?: boolean;\n}\n\nexport class OutputFormatter {\n private options: OutputOptions;\n\n constructor(options: OutputOptions = {}) {\n this.options = options;\n }\n\n // Output as JSON\n json(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n }\n\n // Output a table\n table<T extends Record<string, unknown>>(\n data: T[],\n columns: { key: keyof T; header: string; width?: number }[]\n ): void {\n if (this.options.json) {\n this.json(data);\n return;\n }\n\n const table = new Table({\n head: columns.map((col) => pc.bold(col.header)),\n colWidths: columns.map((col) => col.width ?? null),\n style: {\n head: [],\n border: [],\n },\n });\n\n for (const row of data) {\n table.push(columns.map((col) => String(row[col.key] ?? '')));\n }\n\n console.log(table.toString());\n }\n\n // Success message\n success(message: string): void {\n if (this.options.json) return;\n console.log(pc.green('✓'), message);\n }\n\n // Error message\n error(message: string, details?: string): void {\n if (this.options.json) {\n this.json({ error: message, details });\n return;\n }\n console.error(pc.red('✗'), message);\n if (details && this.options.verbose) {\n console.error(pc.dim(details));\n }\n }\n\n // Warning message\n warning(message: string): void {\n if (this.options.json) return;\n console.log(pc.yellow('⚠'), message);\n }\n\n // Info message\n info(message: string): void {\n if (this.options.json) return;\n console.log(pc.blue('ℹ'), message);\n }\n\n // Debug message (only in verbose mode)\n debug(message: string): void {\n if (this.options.json) return;\n if (this.options.verbose) {\n console.log(pc.dim(`[debug] ${message}`));\n }\n }\n\n // Plain text output\n text(message: string): void {\n if (this.options.json) return;\n console.log(message);\n }\n\n // Heading\n heading(text: string): void {\n if (this.options.json) return;\n console.log();\n console.log(pc.bold(pc.underline(text)));\n console.log();\n }\n\n // Subheading\n subheading(text: string): void {\n if (this.options.json) return;\n console.log(pc.bold(text));\n }\n\n // Key-value pair\n keyValue(key: string, value: string | number | boolean | undefined): void {\n if (this.options.json) return;\n console.log(`${pc.dim(key + ':')} ${value ?? pc.dim('(not set)')}`);\n }\n\n // List item\n listItem(text: string, indent = 0): void {\n if (this.options.json) return;\n const prefix = ' '.repeat(indent) + '•';\n console.log(`${prefix} ${text}`);\n }\n\n // Spinner\n spinner(message: string): Ora {\n return ora({\n text: message,\n isSilent: this.options.json,\n }).start();\n }\n\n // Blank line\n newLine(): void {\n if (this.options.json) return;\n console.log();\n }\n\n // Horizontal rule\n hr(): void {\n if (this.options.json) return;\n console.log(pc.dim('─'.repeat(50)));\n }\n\n // Alias for hr\n divider(): void {\n this.hr();\n }\n\n // Code block\n code(text: string, language?: string): void {\n if (this.options.json) {\n this.json({ code: text, language });\n return;\n }\n console.log(pc.dim('```' + (language ?? '')));\n console.log(text);\n console.log(pc.dim('```'));\n }\n\n // Highlight text\n highlight(text: string): string {\n return pc.cyan(text);\n }\n\n // Dim text\n dim(text: string): string {\n return pc.dim(text);\n }\n\n // Bold text\n bold(text: string): string {\n return pc.bold(text);\n }\n\n // Link (just returns text in terminal)\n link(text: string, url: string): string {\n // OSC 8 hyperlink support for modern terminals\n return `\\x1b]8;;${url}\\x07${pc.underline(pc.blue(text))}\\x1b]8;;\\x07`;\n }\n\n // Color helpers\n green(text: string): string {\n return pc.green(text);\n }\n\n red(text: string): string {\n return pc.red(text);\n }\n\n yellow(text: string): string {\n return pc.yellow(text);\n }\n\n blue(text: string): string {\n return pc.blue(text);\n }\n\n cyan(text: string): string {\n return pc.cyan(text);\n }\n}\n\n// Convenience function to create formatter from command flags\nexport function createOutput(flags: { json?: boolean; verbose?: boolean }): OutputFormatter {\n return new OutputFormatter({\n json: flags.json,\n verbose: flags.verbose,\n });\n}\n","import { Command, Flags } from '@oclif/core';\nimport { getClient } from '../../lib/api-client.js';\nimport { createOutput } from '../../lib/output.js';\n\nexport default class ToolTrending extends Command {\n static description = 'Show trending tools';\n\n static examples = [\n '<%= config.bin %> <%= command.id %>',\n '<%= config.bin %> <%= command.id %> --limit 10',\n ];\n\n static flags = {\n limit: Flags.integer({\n char: 'l',\n description: 'Maximum number of results',\n default: 10,\n }),\n json: Flags.boolean({\n description: 'Output in JSON format',\n default: false,\n }),\n verbose: Flags.boolean({\n char: 'v',\n description: 'Show verbose output',\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(ToolTrending);\n const output = createOutput(flags);\n const client = getClient();\n\n const spinner = output.spinner('Fetching trending tools...');\n\n try {\n const response = await client.getTrendingTools({\n limit: flags.limit,\n });\n\n spinner.stop();\n\n if (flags.json) {\n output.json(response);\n return;\n }\n\n if (response.data.length === 0) {\n output.info('No trending tools found');\n return;\n }\n\n output.heading('Trending Tools');\n\n output.table(\n response.data.map((tool, index) => ({\n rank: `#${index + 1}`,\n name: tool.name,\n package: tool.npmPackageName,\n category: tool.category,\n downloads: formatDownloads(tool.npmDownloadsLastMonth),\n score: typeof tool.qualityScore === 'number' ? tool.qualityScore.toFixed(2) : '-',\n })),\n [\n { key: 'rank', header: '#', width: 4 },\n { key: 'name', header: 'Name', width: 25 },\n { key: 'package', header: 'Package', width: 35 },\n { key: 'category', header: 'Category', width: 15 },\n { key: 'downloads', header: 'Downloads', width: 12 },\n { key: 'score', header: 'Score', width: 8 },\n ]\n );\n } catch (error) {\n spinner.fail('Failed to fetch trending tools');\n output.error(\n error instanceof Error ? error.message : 'Unknown error',\n flags.verbose ? String(error) : undefined\n );\n }\n }\n}\n\nfunction formatDownloads(count: number | undefined): string {\n if (count === undefined || count === null) return '-';\n if (count >= 1000000) return `${(count / 1000000).toFixed(1)}M`;\n if (count >= 1000) return `${(count / 1000).toFixed(1)}k`;\n return count.toString();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/config.ts","../../../src/lib/api-client.ts","../../../src/lib/output.ts","../../../src/commands/tool/trending.ts"],"names":[],"mappings":"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","file":"trending.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport Conf from 'conf';\n\nexport interface TpmConfig {\n apiUrl?: string;\n defaultOutput?: 'human' | 'json';\n verbose?: boolean;\n analytics?: boolean;\n env?: Record<string, string>;\n}\n\nexport interface TpmCredentials {\n apiKey?: string;\n refreshToken?: string;\n expiresAt?: string;\n}\n\nconst CONFIG_DIR = path.join(os.homedir(), '.tpmjs');\nconst CREDENTIALS_FILE = path.join(CONFIG_DIR, 'credentials.json');\nconst HISTORY_DIR = path.join(CONFIG_DIR, 'history');\n\n// Ensure config directory exists\nfunction ensureConfigDir(): void {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\n// Config store using Conf\nconst configStore = new Conf<TpmConfig>({\n projectName: 'tpmjs',\n cwd: CONFIG_DIR,\n configName: 'config',\n defaults: {\n apiUrl: 'https://tpmjs.com/api',\n defaultOutput: 'human',\n verbose: false,\n analytics: false,\n },\n});\n\nexport function getConfig(): TpmConfig {\n return configStore.store;\n}\n\nexport function setConfig(config: Partial<TpmConfig>): void {\n for (const [key, value] of Object.entries(config)) {\n if (value !== undefined) {\n configStore.set(key, value);\n }\n }\n}\n\nexport function getConfigValue<K extends keyof TpmConfig>(key: K): TpmConfig[K] {\n return configStore.get(key);\n}\n\nexport function setConfigValue<K extends keyof TpmConfig>(key: K, value: TpmConfig[K]): void {\n configStore.set(key, value);\n}\n\nexport function resetConfig(): void {\n configStore.clear();\n}\n\n// Credentials management with secure file permissions\nexport function loadCredentials(): TpmCredentials | null {\n ensureConfigDir();\n\n if (!fs.existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n\n try {\n const content = fs.readFileSync(CREDENTIALS_FILE, 'utf-8');\n return JSON.parse(content) as TpmCredentials;\n } catch {\n return null;\n }\n}\n\nexport function saveCredentials(credentials: TpmCredentials): void {\n ensureConfigDir();\n\n const content = JSON.stringify(credentials, null, 2);\n fs.writeFileSync(CREDENTIALS_FILE, content, { mode: 0o600 });\n}\n\nexport function deleteCredentials(): void {\n if (fs.existsSync(CREDENTIALS_FILE)) {\n fs.unlinkSync(CREDENTIALS_FILE);\n }\n}\n\nexport function hasCredentials(): boolean {\n const creds = loadCredentials();\n return creds !== null && !!creds.apiKey;\n}\n\n// Get API key from multiple sources (priority order)\nexport function getApiKey(): string | undefined {\n // 1. Environment variable\n if (process.env.TPMJS_API_KEY) {\n return process.env.TPMJS_API_KEY;\n }\n\n // 2. Credentials file\n const creds = loadCredentials();\n if (creds?.apiKey) {\n return creds.apiKey;\n }\n\n return undefined;\n}\n\n// Get API URL\nexport function getApiUrl(): string {\n return process.env.TPMJS_API_URL ?? getConfigValue('apiUrl') ?? 'https://tpmjs.com/api';\n}\n\n// History directory for conversation caching\nexport function getHistoryDir(): string {\n if (!fs.existsSync(HISTORY_DIR)) {\n fs.mkdirSync(HISTORY_DIR, { recursive: true, mode: 0o700 });\n }\n return HISTORY_DIR;\n}\n\n// Config directory path\nexport function getConfigDir(): string {\n ensureConfigDir();\n return CONFIG_DIR;\n}\n","import { getApiKey, getApiUrl } from './config.js';\n\nexport interface TpmClientOptions {\n baseUrl?: string;\n apiKey?: string;\n timeout?: number;\n}\n\nexport interface ApiResponse<T> {\n success: boolean;\n data?: T;\n error?: string;\n message?: string;\n}\n\nexport interface PaginationOptions {\n limit?: number;\n offset?: number;\n}\n\nexport interface PaginatedResponse<T> {\n data: T[];\n pagination: {\n limit: number;\n offset: number;\n hasMore: boolean;\n };\n}\n\n// Tool types\nexport interface Tool {\n id: string;\n name: string;\n slug: string;\n description: string;\n category: string;\n tier: string;\n qualityScore: number | null;\n importHealth: string;\n executionHealth: string;\n likeCount: number;\n npmPackageName: string;\n npmVersion: string;\n npmDownloadsLastMonth: number;\n isOfficial: boolean;\n inputSchema?: Record<string, unknown>;\n outputSchema?: Record<string, unknown>;\n tools?: { name: string; description?: string }[];\n package?: {\n npmPackageName: string;\n category: string;\n npmDownloadsLastMonth: number;\n isOfficial: boolean;\n };\n}\n\nexport interface ToolSearchOptions extends PaginationOptions {\n category?: string;\n query?: string;\n}\n\n// Agent types\nexport interface Agent {\n id: string;\n uid: string;\n name: string;\n description: string | null;\n provider: string;\n modelId: string;\n systemPrompt: string | null;\n temperature: number;\n isPublic: boolean;\n likeCount: number;\n _count?: {\n tools: number;\n collections: number;\n };\n}\n\nexport interface CreateAgentInput {\n name: string;\n uid?: string;\n description?: string;\n provider: string;\n modelId: string;\n systemPrompt?: string;\n temperature?: number;\n isPublic?: boolean;\n collectionIds?: string[];\n toolIds?: string[];\n}\n\nexport interface UpdateAgentInput {\n name?: string;\n uid?: string;\n description?: string;\n provider?: string;\n modelId?: string;\n systemPrompt?: string;\n temperature?: number;\n isPublic?: boolean;\n maxToolCallsPerTurn?: number;\n maxMessagesInContext?: number;\n}\n\n// Collection types\nexport interface Collection {\n id: string;\n name: string;\n slug: string | null;\n description: string | null;\n isPublic: boolean;\n likeCount: number;\n _count?: {\n tools: number;\n };\n}\n\nexport interface CreateCollectionInput {\n name: string;\n description?: string;\n isPublic: boolean;\n}\n\nexport interface UpdateCollectionInput {\n name?: string;\n description?: string;\n isPublic?: boolean;\n}\n\n// User types\nexport interface User {\n id: string;\n name: string | null;\n username: string | null;\n email: string;\n image: string | null;\n}\n\n// API Key types\nexport interface ApiKey {\n id: string;\n name: string;\n keyPrefix: string;\n scopes: string[];\n isActive: boolean;\n lastUsedAt: string | null;\n expiresAt: string | null;\n createdAt: string;\n}\n\n// Scenario types\nexport interface Scenario {\n id: string;\n collectionId: string | null;\n prompt: string;\n name: string | null;\n description: string | null;\n tags: string[];\n qualityScore: number;\n totalRuns: number;\n lastRunAt: string | null;\n lastRunStatus: string | null;\n consecutivePasses: number;\n consecutiveFails: number;\n createdAt: string;\n updatedAt: string;\n collection?: {\n id: string;\n name: string;\n slug: string | null;\n username: string | null;\n } | null;\n}\n\nexport interface ScenarioRun {\n id: string;\n status: string;\n success: boolean;\n evaluator: {\n model: string | null;\n verdict: string | null;\n reason: string | null;\n };\n assertions: unknown;\n usage: {\n inputTokens: number | null;\n outputTokens: number | null;\n totalTokens: number | null;\n executionTimeMs: number | null;\n };\n timestamps: {\n startedAt: string | null;\n completedAt: string | null;\n createdAt: string;\n };\n quotaRemaining?: number;\n}\n\nexport interface ScenarioListOptions extends PaginationOptions {\n collectionId?: string;\n tags?: string;\n sortBy?: 'qualityScore' | 'totalRuns' | 'createdAt' | 'lastRunAt';\n}\n\nexport interface CreateScenarioInput {\n collectionId: string;\n prompt: string;\n name?: string;\n description?: string;\n tags?: string[];\n}\n\nexport interface GenerateScenariosInput {\n count?: number;\n skipSimilarityCheck?: boolean;\n}\n\n// Stats types\nexport interface Stats {\n tools: {\n total: number;\n official: number;\n healthyImport: number;\n healthyExecution: number;\n };\n packages: {\n total: number;\n official: number;\n };\n categories: { name: string; count: number }[];\n}\n\nexport class TpmClient {\n private baseUrl: string;\n private apiKey: string | undefined;\n private timeout: number;\n\n constructor(options: TpmClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? getApiUrl();\n this.apiKey = options.apiKey ?? getApiKey();\n this.timeout = options.timeout ?? 30000;\n }\n\n private async request<T>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(options.headers as Record<string, string>),\n };\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n });\n\n const data = (await response.json()) as T & { message?: string; error?: string };\n\n if (!response.ok) {\n throw new ApiError(\n data.message || data.error || `HTTP ${response.status}`,\n response.status,\n data\n );\n }\n\n return data as T;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // Health check\n async health(): Promise<{ status: string; timestamp: string }> {\n return this.request('/health');\n }\n\n // Stats\n async getStats(): Promise<ApiResponse<Stats>> {\n return this.request('/stats');\n }\n\n // Tools\n async searchTools(options: ToolSearchOptions = {}): Promise<PaginatedResponse<Tool>> {\n const params = new URLSearchParams();\n if (options.query) params.set('q', options.query);\n if (options.category) params.set('category', options.category);\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/tools?${queryString}` : '/tools';\n\n return this.request<PaginatedResponse<Tool>>(endpoint);\n }\n\n async getTool(packageName: string, toolName: string): Promise<ApiResponse<Tool>> {\n return this.request(\n `/tools/${encodeURIComponent(packageName)}/${encodeURIComponent(toolName)}`\n );\n }\n\n async getToolBySlug(slug: string): Promise<ApiResponse<Tool>> {\n // Search for the tool by slug\n const searchResult = await this.searchTools({ query: slug, limit: 1 });\n if (searchResult.data && searchResult.data.length > 0) {\n const tool = searchResult.data.find((t) => t.slug === slug) || searchResult.data[0];\n return { success: true, data: tool };\n }\n return { success: false, error: 'Tool not found' };\n }\n\n async getTrendingTools(options: PaginationOptions = {}): Promise<PaginatedResponse<Tool>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/tools/trending?${queryString}` : '/tools/trending';\n\n return this.request<PaginatedResponse<Tool>>(endpoint);\n }\n\n async validateTpmjsField(\n field: unknown\n ): Promise<ApiResponse<{ valid: boolean; tier: string | null; errors?: unknown[] }>> {\n return this.request('/tools/validate', {\n method: 'POST',\n body: JSON.stringify(field),\n });\n }\n\n async executeTool(slug: string, params: Record<string, unknown>): Promise<unknown> {\n return this.request(`/tools/${encodeURIComponent(slug)}/execute`, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n async *executeToolStream(\n slug: string,\n params: Record<string, unknown>\n ): AsyncGenerator<{ type: string; data: string }> {\n const url = `${this.baseUrl}/tools/${encodeURIComponent(slug)}/execute`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n };\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ ...params, stream: true }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new ApiError(errorText || `HTTP ${response.status}`, response.status);\n }\n\n if (!response.body) {\n throw new ApiError('No response body', 0);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n yield { type: 'done', data: '' };\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n yield { type: 'done', data: '' };\n return;\n }\n try {\n const parsed = JSON.parse(data);\n yield { type: parsed.type || 'text', data: parsed.content || parsed.data || data };\n } catch {\n yield { type: 'text', data };\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n // Agents\n async listAgents(options: PaginationOptions = {}): Promise<PaginatedResponse<Agent>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/agents?${queryString}` : '/agents';\n\n return this.request<PaginatedResponse<Agent>>(endpoint);\n }\n\n async getAgent(id: string): Promise<ApiResponse<Agent>> {\n return this.request(`/agents/${id}`);\n }\n\n async createAgent(input: CreateAgentInput): Promise<ApiResponse<Agent>> {\n return this.request('/agents', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async updateAgent(id: string, input: UpdateAgentInput): Promise<ApiResponse<Agent>> {\n return this.request(`/agents/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n });\n }\n\n async deleteAgent(id: string): Promise<ApiResponse<void>> {\n return this.request(`/agents/${id}`, {\n method: 'DELETE',\n });\n }\n\n // Collections\n async listCollections(options: PaginationOptions = {}): Promise<PaginatedResponse<Collection>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/collections?${queryString}` : '/collections';\n\n return this.request<PaginatedResponse<Collection>>(endpoint);\n }\n\n async getCollection(id: string): Promise<ApiResponse<Collection>> {\n return this.request(`/collections/${id}`);\n }\n\n async createCollection(input: CreateCollectionInput): Promise<ApiResponse<Collection>> {\n return this.request('/collections', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async updateCollection(\n id: string,\n input: UpdateCollectionInput\n ): Promise<ApiResponse<Collection>> {\n return this.request(`/collections/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n });\n }\n\n async deleteCollection(id: string): Promise<ApiResponse<void>> {\n return this.request(`/collections/${id}`, {\n method: 'DELETE',\n });\n }\n\n async addToolsToCollection(id: string, toolIds: string[]): Promise<ApiResponse<void>> {\n // Add tools one by one (API doesn't support bulk)\n for (const toolId of toolIds) {\n await this.request(`/collections/${id}/tools/${toolId}`, {\n method: 'POST',\n });\n }\n return { success: true };\n }\n\n async removeToolFromCollection(id: string, toolId: string): Promise<ApiResponse<void>> {\n return this.request(`/collections/${id}/tools/${toolId}`, {\n method: 'DELETE',\n });\n }\n\n // User\n async whoami(): Promise<ApiResponse<User>> {\n return this.request('/user/profile');\n }\n\n async listApiKeys(): Promise<ApiResponse<ApiKey[]>> {\n return this.request('/user/tpmjs-api-keys');\n }\n\n // Scenarios\n async listScenarios(options: ScenarioListOptions = {}): Promise<PaginatedResponse<Scenario>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n if (options.collectionId) params.set('collectionId', options.collectionId);\n if (options.tags) params.set('tags', options.tags);\n if (options.sortBy) params.set('sortBy', options.sortBy);\n\n const queryString = params.toString();\n const endpoint = queryString ? `/scenarios?${queryString}` : '/scenarios';\n\n return this.request<PaginatedResponse<Scenario>>(endpoint);\n }\n\n async listCollectionScenarios(\n collectionId: string,\n options: PaginationOptions = {}\n ): Promise<ApiResponse<{ scenarios: Scenario[] }>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString\n ? `/collections/${collectionId}/scenarios?${queryString}`\n : `/collections/${collectionId}/scenarios`;\n\n return this.request<ApiResponse<{ scenarios: Scenario[] }>>(endpoint);\n }\n\n async getScenario(id: string): Promise<ApiResponse<Scenario>> {\n return this.request(`/scenarios/${id}`);\n }\n\n async createScenario(input: CreateScenarioInput): Promise<ApiResponse<Scenario>> {\n return this.request('/scenarios', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async generateScenarios(\n collectionId: string,\n input: GenerateScenariosInput = {}\n ): Promise<ApiResponse<{ scenarios: { scenario: Scenario; similarity?: unknown }[] }>> {\n return this.request(`/collections/${collectionId}/scenarios/generate`, {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async runScenario(scenarioId: string): Promise<ApiResponse<ScenarioRun>> {\n return this.request(`/scenarios/${scenarioId}/run`, {\n method: 'POST',\n });\n }\n\n async getScenarioRuns(\n scenarioId: string,\n options: PaginationOptions = {}\n ): Promise<PaginatedResponse<ScenarioRun>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString\n ? `/scenarios/${scenarioId}/runs?${queryString}`\n : `/scenarios/${scenarioId}/runs`;\n\n return this.request<PaginatedResponse<ScenarioRun>>(endpoint);\n }\n\n // Check if authenticated\n isAuthenticated(): boolean {\n return !!this.apiKey;\n }\n}\n\n// Custom error class for API errors\nexport class ApiError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public data?: unknown\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\n// Singleton instance\nlet clientInstance: TpmClient | null = null;\n\nexport function getClient(options?: TpmClientOptions): TpmClient {\n if (!clientInstance || options) {\n clientInstance = new TpmClient(options);\n }\n return clientInstance;\n}\n","import Table from 'cli-table3';\nimport ora, { type Ora } from 'ora';\nimport pc from 'picocolors';\n\nexport interface OutputOptions {\n json?: boolean;\n verbose?: boolean;\n noColor?: boolean;\n}\n\nexport class OutputFormatter {\n private options: OutputOptions;\n\n constructor(options: OutputOptions = {}) {\n this.options = options;\n }\n\n // Output as JSON\n json(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n }\n\n // Output a table\n table<T extends Record<string, unknown>>(\n data: T[],\n columns: { key: keyof T; header: string; width?: number }[]\n ): void {\n if (this.options.json) {\n this.json(data);\n return;\n }\n\n const table = new Table({\n head: columns.map((col) => pc.bold(col.header)),\n colWidths: columns.map((col) => col.width ?? null),\n style: {\n head: [],\n border: [],\n },\n });\n\n for (const row of data) {\n table.push(columns.map((col) => String(row[col.key] ?? '')));\n }\n\n console.log(table.toString());\n }\n\n // Success message\n success(message: string): void {\n if (this.options.json) return;\n console.log(pc.green('✓'), message);\n }\n\n // Error message\n error(message: string, details?: string): void {\n if (this.options.json) {\n this.json({ error: message, details });\n return;\n }\n console.error(pc.red('✗'), message);\n if (details && this.options.verbose) {\n console.error(pc.dim(details));\n }\n }\n\n // Warning message\n warning(message: string): void {\n if (this.options.json) return;\n console.log(pc.yellow('⚠'), message);\n }\n\n // Info message\n info(message: string): void {\n if (this.options.json) return;\n console.log(pc.blue('ℹ'), message);\n }\n\n // Debug message (only in verbose mode)\n debug(message: string): void {\n if (this.options.json) return;\n if (this.options.verbose) {\n console.log(pc.dim(`[debug] ${message}`));\n }\n }\n\n // Plain text output\n text(message: string): void {\n if (this.options.json) return;\n console.log(message);\n }\n\n // Heading\n heading(text: string): void {\n if (this.options.json) return;\n console.log();\n console.log(pc.bold(pc.underline(text)));\n console.log();\n }\n\n // Subheading\n subheading(text: string): void {\n if (this.options.json) return;\n console.log(pc.bold(text));\n }\n\n // Key-value pair\n keyValue(key: string, value: string | number | boolean | undefined): void {\n if (this.options.json) return;\n console.log(`${pc.dim(`${key}:`)} ${value ?? pc.dim('(not set)')}`);\n }\n\n // List item\n listItem(text: string, indent = 0): void {\n if (this.options.json) return;\n const prefix = `${' '.repeat(indent)}•`;\n console.log(`${prefix} ${text}`);\n }\n\n // Spinner\n spinner(message: string): Ora {\n return ora({\n text: message,\n isSilent: this.options.json,\n }).start();\n }\n\n // Blank line\n newLine(): void {\n if (this.options.json) return;\n console.log();\n }\n\n // Horizontal rule\n hr(): void {\n if (this.options.json) return;\n console.log(pc.dim('─'.repeat(50)));\n }\n\n // Alias for hr\n divider(): void {\n this.hr();\n }\n\n // Code block\n code(text: string, language?: string): void {\n if (this.options.json) {\n this.json({ code: text, language });\n return;\n }\n console.log(pc.dim(`\\`\\`\\`${language ?? ''}`));\n console.log(text);\n console.log(pc.dim('```'));\n }\n\n // Highlight text\n highlight(text: string): string {\n return pc.cyan(text);\n }\n\n // Dim text\n dim(text: string): string {\n return pc.dim(text);\n }\n\n // Bold text\n bold(text: string): string {\n return pc.bold(text);\n }\n\n // Link (just returns text in terminal)\n link(text: string, url: string): string {\n // OSC 8 hyperlink support for modern terminals\n return `\\x1b]8;;${url}\\x07${pc.underline(pc.blue(text))}\\x1b]8;;\\x07`;\n }\n\n // Color helpers\n green(text: string): string {\n return pc.green(text);\n }\n\n red(text: string): string {\n return pc.red(text);\n }\n\n yellow(text: string): string {\n return pc.yellow(text);\n }\n\n blue(text: string): string {\n return pc.blue(text);\n }\n\n cyan(text: string): string {\n return pc.cyan(text);\n }\n}\n\n// Convenience function to create formatter from command flags\nexport function createOutput(flags: { json?: boolean; verbose?: boolean }): OutputFormatter {\n return new OutputFormatter({\n json: flags.json,\n verbose: flags.verbose,\n });\n}\n","import { Command, Flags } from '@oclif/core';\nimport { getClient } from '../../lib/api-client.js';\nimport { createOutput } from '../../lib/output.js';\n\nexport default class ToolTrending extends Command {\n static description = 'Show trending tools';\n\n static examples = [\n '<%= config.bin %> <%= command.id %>',\n '<%= config.bin %> <%= command.id %> --limit 10',\n ];\n\n static flags = {\n limit: Flags.integer({\n char: 'l',\n description: 'Maximum number of results',\n default: 10,\n }),\n json: Flags.boolean({\n description: 'Output in JSON format',\n default: false,\n }),\n verbose: Flags.boolean({\n char: 'v',\n description: 'Show verbose output',\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(ToolTrending);\n const output = createOutput(flags);\n const client = getClient();\n\n const spinner = output.spinner('Fetching trending tools...');\n\n try {\n const response = await client.getTrendingTools({\n limit: flags.limit,\n });\n\n spinner.stop();\n\n if (flags.json) {\n output.json(response);\n return;\n }\n\n if (response.data.length === 0) {\n output.info('No trending tools found');\n return;\n }\n\n output.heading('Trending Tools');\n\n output.table(\n response.data.map((tool, index) => ({\n rank: `#${index + 1}`,\n name: tool.name,\n package: tool.npmPackageName,\n category: tool.category,\n downloads: formatDownloads(tool.npmDownloadsLastMonth),\n score: typeof tool.qualityScore === 'number' ? tool.qualityScore.toFixed(2) : '-',\n })),\n [\n { key: 'rank', header: '#', width: 4 },\n { key: 'name', header: 'Name', width: 25 },\n { key: 'package', header: 'Package', width: 35 },\n { key: 'category', header: 'Category', width: 15 },\n { key: 'downloads', header: 'Downloads', width: 12 },\n { key: 'score', header: 'Score', width: 8 },\n ]\n );\n } catch (error) {\n spinner.fail('Failed to fetch trending tools');\n output.error(\n error instanceof Error ? error.message : 'Unknown error',\n flags.verbose ? String(error) : undefined\n );\n }\n }\n}\n\nfunction formatDownloads(count: number | undefined): string {\n if (count === undefined || count === null) return '-';\n if (count >= 1000000) return `${(count / 1000000).toFixed(1)}M`;\n if (count >= 1000) return `${(count / 1000).toFixed(1)}k`;\n return count.toString();\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Command, Flags } from '@oclif/core';
|
|
2
1
|
import * as fs from 'fs';
|
|
3
2
|
import * as path from 'path';
|
|
4
|
-
import
|
|
3
|
+
import { Command, Flags } from '@oclif/core';
|
|
5
4
|
import * as os from 'os';
|
|
5
|
+
import Conf from 'conf';
|
|
6
6
|
import Table from 'cli-table3';
|
|
7
7
|
import ora from 'ora';
|
|
8
8
|
import pc from 'picocolors';
|
|
@@ -73,7 +73,7 @@ var TpmClient = class {
|
|
|
73
73
|
...options.headers
|
|
74
74
|
};
|
|
75
75
|
if (this.apiKey) {
|
|
76
|
-
headers
|
|
76
|
+
headers.Authorization = `Bearer ${this.apiKey}`;
|
|
77
77
|
}
|
|
78
78
|
const controller = new AbortController();
|
|
79
79
|
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
@@ -155,7 +155,7 @@ var TpmClient = class {
|
|
|
155
155
|
Accept: "text/event-stream"
|
|
156
156
|
};
|
|
157
157
|
if (this.apiKey) {
|
|
158
|
-
headers
|
|
158
|
+
headers.Authorization = `Bearer ${this.apiKey}`;
|
|
159
159
|
}
|
|
160
160
|
const response = await fetch(url, {
|
|
161
161
|
method: "POST",
|
|
@@ -429,12 +429,12 @@ var OutputFormatter = class {
|
|
|
429
429
|
// Key-value pair
|
|
430
430
|
keyValue(key, value) {
|
|
431
431
|
if (this.options.json) return;
|
|
432
|
-
console.log(`${pc.dim(key
|
|
432
|
+
console.log(`${pc.dim(`${key}:`)} ${value ?? pc.dim("(not set)")}`);
|
|
433
433
|
}
|
|
434
434
|
// List item
|
|
435
435
|
listItem(text, indent = 0) {
|
|
436
436
|
if (this.options.json) return;
|
|
437
|
-
const prefix = " ".repeat(indent)
|
|
437
|
+
const prefix = `${" ".repeat(indent)}\u2022`;
|
|
438
438
|
console.log(`${prefix} ${text}`);
|
|
439
439
|
}
|
|
440
440
|
// Spinner
|
|
@@ -464,7 +464,7 @@ var OutputFormatter = class {
|
|
|
464
464
|
this.json({ code: text, language });
|
|
465
465
|
return;
|
|
466
466
|
}
|
|
467
|
-
console.log(pc.dim(
|
|
467
|
+
console.log(pc.dim(`\`\`\`${language ?? ""}`));
|
|
468
468
|
console.log(text);
|
|
469
469
|
console.log(pc.dim("```"));
|
|
470
470
|
}
|
|
@@ -545,7 +545,10 @@ var ToolValidate = class _ToolValidate extends Command {
|
|
|
545
545
|
const content = fs.readFileSync(packagePath, "utf-8");
|
|
546
546
|
packageJson = JSON.parse(content);
|
|
547
547
|
} catch (error) {
|
|
548
|
-
output.error(
|
|
548
|
+
output.error(
|
|
549
|
+
"Failed to parse package.json",
|
|
550
|
+
error instanceof Error ? error.message : void 0
|
|
551
|
+
);
|
|
549
552
|
return;
|
|
550
553
|
}
|
|
551
554
|
const keywords = packageJson.keywords || [];
|
|
@@ -591,7 +594,10 @@ var ToolValidate = class _ToolValidate extends Command {
|
|
|
591
594
|
output.success("Configuration is valid");
|
|
592
595
|
output.newLine();
|
|
593
596
|
output.keyValue("Tier", response.data.tier || "minimal");
|
|
594
|
-
output.keyValue(
|
|
597
|
+
output.keyValue(
|
|
598
|
+
"Has tpmjs keyword",
|
|
599
|
+
hasTpmjsKeyword ? "Yes" : "No (add for auto-discovery)"
|
|
600
|
+
);
|
|
595
601
|
if (!hasTpmjsKeyword) {
|
|
596
602
|
output.newLine();
|
|
597
603
|
output.warning('Add "tpmjs" to keywords for auto-discovery on npm publish');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/config.ts","../../../src/lib/api-client.ts","../../../src/lib/output.ts","../../../src/commands/tool/validate.ts"],"names":["path2","fs2"],"mappings":"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","file":"validate.js","sourcesContent":["import Conf from 'conf';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nexport interface TpmConfig {\n apiUrl?: string;\n defaultOutput?: 'human' | 'json';\n verbose?: boolean;\n analytics?: boolean;\n env?: Record<string, string>;\n}\n\nexport interface TpmCredentials {\n apiKey?: string;\n refreshToken?: string;\n expiresAt?: string;\n}\n\nconst CONFIG_DIR = path.join(os.homedir(), '.tpmjs');\nconst CREDENTIALS_FILE = path.join(CONFIG_DIR, 'credentials.json');\nconst HISTORY_DIR = path.join(CONFIG_DIR, 'history');\n\n// Ensure config directory exists\nfunction ensureConfigDir(): void {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\n// Config store using Conf\nconst configStore = new Conf<TpmConfig>({\n projectName: 'tpmjs',\n cwd: CONFIG_DIR,\n configName: 'config',\n defaults: {\n apiUrl: 'https://tpmjs.com/api',\n defaultOutput: 'human',\n verbose: false,\n analytics: false,\n },\n});\n\nexport function getConfig(): TpmConfig {\n return configStore.store;\n}\n\nexport function setConfig(config: Partial<TpmConfig>): void {\n for (const [key, value] of Object.entries(config)) {\n if (value !== undefined) {\n configStore.set(key, value);\n }\n }\n}\n\nexport function getConfigValue<K extends keyof TpmConfig>(key: K): TpmConfig[K] {\n return configStore.get(key);\n}\n\nexport function setConfigValue<K extends keyof TpmConfig>(\n key: K,\n value: TpmConfig[K]\n): void {\n configStore.set(key, value);\n}\n\nexport function resetConfig(): void {\n configStore.clear();\n}\n\n// Credentials management with secure file permissions\nexport function loadCredentials(): TpmCredentials | null {\n ensureConfigDir();\n\n if (!fs.existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n\n try {\n const content = fs.readFileSync(CREDENTIALS_FILE, 'utf-8');\n return JSON.parse(content) as TpmCredentials;\n } catch {\n return null;\n }\n}\n\nexport function saveCredentials(credentials: TpmCredentials): void {\n ensureConfigDir();\n\n const content = JSON.stringify(credentials, null, 2);\n fs.writeFileSync(CREDENTIALS_FILE, content, { mode: 0o600 });\n}\n\nexport function deleteCredentials(): void {\n if (fs.existsSync(CREDENTIALS_FILE)) {\n fs.unlinkSync(CREDENTIALS_FILE);\n }\n}\n\nexport function hasCredentials(): boolean {\n const creds = loadCredentials();\n return creds !== null && !!creds.apiKey;\n}\n\n// Get API key from multiple sources (priority order)\nexport function getApiKey(): string | undefined {\n // 1. Environment variable\n if (process.env.TPMJS_API_KEY) {\n return process.env.TPMJS_API_KEY;\n }\n\n // 2. Credentials file\n const creds = loadCredentials();\n if (creds?.apiKey) {\n return creds.apiKey;\n }\n\n return undefined;\n}\n\n// Get API URL\nexport function getApiUrl(): string {\n return process.env.TPMJS_API_URL ?? getConfigValue('apiUrl') ?? 'https://tpmjs.com/api';\n}\n\n// History directory for conversation caching\nexport function getHistoryDir(): string {\n if (!fs.existsSync(HISTORY_DIR)) {\n fs.mkdirSync(HISTORY_DIR, { recursive: true, mode: 0o700 });\n }\n return HISTORY_DIR;\n}\n\n// Config directory path\nexport function getConfigDir(): string {\n ensureConfigDir();\n return CONFIG_DIR;\n}\n","import { getApiKey, getApiUrl } from './config.js';\n\nexport interface TpmClientOptions {\n baseUrl?: string;\n apiKey?: string;\n timeout?: number;\n}\n\nexport interface ApiResponse<T> {\n success: boolean;\n data?: T;\n error?: string;\n message?: string;\n}\n\nexport interface PaginationOptions {\n limit?: number;\n offset?: number;\n}\n\nexport interface PaginatedResponse<T> {\n data: T[];\n pagination: {\n limit: number;\n offset: number;\n hasMore: boolean;\n };\n}\n\n// Tool types\nexport interface Tool {\n id: string;\n name: string;\n slug: string;\n description: string;\n category: string;\n tier: string;\n qualityScore: number | null;\n importHealth: string;\n executionHealth: string;\n likeCount: number;\n npmPackageName: string;\n npmVersion: string;\n npmDownloadsLastMonth: number;\n isOfficial: boolean;\n inputSchema?: Record<string, unknown>;\n outputSchema?: Record<string, unknown>;\n tools?: { name: string; description?: string }[];\n package?: {\n npmPackageName: string;\n category: string;\n npmDownloadsLastMonth: number;\n isOfficial: boolean;\n };\n}\n\nexport interface ToolSearchOptions extends PaginationOptions {\n category?: string;\n query?: string;\n}\n\n// Agent types\nexport interface Agent {\n id: string;\n uid: string;\n name: string;\n description: string | null;\n provider: string;\n modelId: string;\n systemPrompt: string | null;\n temperature: number;\n isPublic: boolean;\n likeCount: number;\n _count?: {\n tools: number;\n collections: number;\n };\n}\n\nexport interface CreateAgentInput {\n name: string;\n uid?: string;\n description?: string;\n provider: string;\n modelId: string;\n systemPrompt?: string;\n temperature?: number;\n isPublic?: boolean;\n collectionIds?: string[];\n toolIds?: string[];\n}\n\nexport interface UpdateAgentInput {\n name?: string;\n uid?: string;\n description?: string;\n provider?: string;\n modelId?: string;\n systemPrompt?: string;\n temperature?: number;\n isPublic?: boolean;\n maxToolCallsPerTurn?: number;\n maxMessagesInContext?: number;\n}\n\n// Collection types\nexport interface Collection {\n id: string;\n name: string;\n slug: string | null;\n description: string | null;\n isPublic: boolean;\n likeCount: number;\n _count?: {\n tools: number;\n };\n}\n\nexport interface CreateCollectionInput {\n name: string;\n description?: string;\n isPublic: boolean;\n}\n\nexport interface UpdateCollectionInput {\n name?: string;\n description?: string;\n isPublic?: boolean;\n}\n\n// User types\nexport interface User {\n id: string;\n name: string | null;\n username: string | null;\n email: string;\n image: string | null;\n}\n\n// API Key types\nexport interface ApiKey {\n id: string;\n name: string;\n keyPrefix: string;\n scopes: string[];\n isActive: boolean;\n lastUsedAt: string | null;\n expiresAt: string | null;\n createdAt: string;\n}\n\n// Scenario types\nexport interface Scenario {\n id: string;\n collectionId: string | null;\n prompt: string;\n name: string | null;\n description: string | null;\n tags: string[];\n qualityScore: number;\n totalRuns: number;\n lastRunAt: string | null;\n lastRunStatus: string | null;\n consecutivePasses: number;\n consecutiveFails: number;\n createdAt: string;\n updatedAt: string;\n collection?: {\n id: string;\n name: string;\n slug: string | null;\n username: string | null;\n } | null;\n}\n\nexport interface ScenarioRun {\n id: string;\n status: string;\n success: boolean;\n evaluator: {\n model: string | null;\n verdict: string | null;\n reason: string | null;\n };\n assertions: unknown;\n usage: {\n inputTokens: number | null;\n outputTokens: number | null;\n totalTokens: number | null;\n executionTimeMs: number | null;\n };\n timestamps: {\n startedAt: string | null;\n completedAt: string | null;\n createdAt: string;\n };\n quotaRemaining?: number;\n}\n\nexport interface ScenarioListOptions extends PaginationOptions {\n collectionId?: string;\n tags?: string;\n sortBy?: 'qualityScore' | 'totalRuns' | 'createdAt' | 'lastRunAt';\n}\n\nexport interface CreateScenarioInput {\n collectionId: string;\n prompt: string;\n name?: string;\n description?: string;\n tags?: string[];\n}\n\nexport interface GenerateScenariosInput {\n count?: number;\n skipSimilarityCheck?: boolean;\n}\n\n// Stats types\nexport interface Stats {\n tools: {\n total: number;\n official: number;\n healthyImport: number;\n healthyExecution: number;\n };\n packages: {\n total: number;\n official: number;\n };\n categories: { name: string; count: number }[];\n}\n\nexport class TpmClient {\n private baseUrl: string;\n private apiKey: string | undefined;\n private timeout: number;\n\n constructor(options: TpmClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? getApiUrl();\n this.apiKey = options.apiKey ?? getApiKey();\n this.timeout = options.timeout ?? 30000;\n }\n\n private async request<T>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(options.headers as Record<string, string>),\n };\n\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n });\n\n const data = (await response.json()) as T & { message?: string; error?: string };\n\n if (!response.ok) {\n throw new ApiError(\n data.message || data.error || `HTTP ${response.status}`,\n response.status,\n data\n );\n }\n\n return data as T;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // Health check\n async health(): Promise<{ status: string; timestamp: string }> {\n return this.request('/health');\n }\n\n // Stats\n async getStats(): Promise<ApiResponse<Stats>> {\n return this.request('/stats');\n }\n\n // Tools\n async searchTools(options: ToolSearchOptions = {}): Promise<PaginatedResponse<Tool>> {\n const params = new URLSearchParams();\n if (options.query) params.set('q', options.query);\n if (options.category) params.set('category', options.category);\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/tools?${queryString}` : '/tools';\n\n return this.request<PaginatedResponse<Tool>>(endpoint);\n }\n\n async getTool(packageName: string, toolName: string): Promise<ApiResponse<Tool>> {\n return this.request(\n `/tools/${encodeURIComponent(packageName)}/${encodeURIComponent(toolName)}`\n );\n }\n\n async getToolBySlug(slug: string): Promise<ApiResponse<Tool>> {\n // Search for the tool by slug\n const searchResult = await this.searchTools({ query: slug, limit: 1 });\n if (searchResult.data && searchResult.data.length > 0) {\n const tool = searchResult.data.find((t) => t.slug === slug) || searchResult.data[0];\n return { success: true, data: tool };\n }\n return { success: false, error: 'Tool not found' };\n }\n\n async getTrendingTools(options: PaginationOptions = {}): Promise<PaginatedResponse<Tool>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/tools/trending?${queryString}` : '/tools/trending';\n\n return this.request<PaginatedResponse<Tool>>(endpoint);\n }\n\n async validateTpmjsField(\n field: unknown\n ): Promise<ApiResponse<{ valid: boolean; tier: string | null; errors?: unknown[] }>> {\n return this.request('/tools/validate', {\n method: 'POST',\n body: JSON.stringify(field),\n });\n }\n\n async executeTool(slug: string, params: Record<string, unknown>): Promise<unknown> {\n return this.request(`/tools/${encodeURIComponent(slug)}/execute`, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n async *executeToolStream(\n slug: string,\n params: Record<string, unknown>\n ): AsyncGenerator<{ type: string; data: string }> {\n const url = `${this.baseUrl}/tools/${encodeURIComponent(slug)}/execute`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n };\n\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ ...params, stream: true }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new ApiError(errorText || `HTTP ${response.status}`, response.status);\n }\n\n if (!response.body) {\n throw new ApiError('No response body', 0);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n yield { type: 'done', data: '' };\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n yield { type: 'done', data: '' };\n return;\n }\n try {\n const parsed = JSON.parse(data);\n yield { type: parsed.type || 'text', data: parsed.content || parsed.data || data };\n } catch {\n yield { type: 'text', data };\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n // Agents\n async listAgents(options: PaginationOptions = {}): Promise<PaginatedResponse<Agent>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/agents?${queryString}` : '/agents';\n\n return this.request<PaginatedResponse<Agent>>(endpoint);\n }\n\n async getAgent(id: string): Promise<ApiResponse<Agent>> {\n return this.request(`/agents/${id}`);\n }\n\n async createAgent(input: CreateAgentInput): Promise<ApiResponse<Agent>> {\n return this.request('/agents', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async updateAgent(id: string, input: UpdateAgentInput): Promise<ApiResponse<Agent>> {\n return this.request(`/agents/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n });\n }\n\n async deleteAgent(id: string): Promise<ApiResponse<void>> {\n return this.request(`/agents/${id}`, {\n method: 'DELETE',\n });\n }\n\n // Collections\n async listCollections(options: PaginationOptions = {}): Promise<PaginatedResponse<Collection>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/collections?${queryString}` : '/collections';\n\n return this.request<PaginatedResponse<Collection>>(endpoint);\n }\n\n async getCollection(id: string): Promise<ApiResponse<Collection>> {\n return this.request(`/collections/${id}`);\n }\n\n async createCollection(input: CreateCollectionInput): Promise<ApiResponse<Collection>> {\n return this.request('/collections', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async updateCollection(\n id: string,\n input: UpdateCollectionInput\n ): Promise<ApiResponse<Collection>> {\n return this.request(`/collections/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n });\n }\n\n async deleteCollection(id: string): Promise<ApiResponse<void>> {\n return this.request(`/collections/${id}`, {\n method: 'DELETE',\n });\n }\n\n async addToolsToCollection(id: string, toolIds: string[]): Promise<ApiResponse<void>> {\n // Add tools one by one (API doesn't support bulk)\n for (const toolId of toolIds) {\n await this.request(`/collections/${id}/tools/${toolId}`, {\n method: 'POST',\n });\n }\n return { success: true };\n }\n\n async removeToolFromCollection(id: string, toolId: string): Promise<ApiResponse<void>> {\n return this.request(`/collections/${id}/tools/${toolId}`, {\n method: 'DELETE',\n });\n }\n\n // User\n async whoami(): Promise<ApiResponse<User>> {\n return this.request('/user/profile');\n }\n\n async listApiKeys(): Promise<ApiResponse<ApiKey[]>> {\n return this.request('/user/tpmjs-api-keys');\n }\n\n // Scenarios\n async listScenarios(options: ScenarioListOptions = {}): Promise<PaginatedResponse<Scenario>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n if (options.collectionId) params.set('collectionId', options.collectionId);\n if (options.tags) params.set('tags', options.tags);\n if (options.sortBy) params.set('sortBy', options.sortBy);\n\n const queryString = params.toString();\n const endpoint = queryString ? `/scenarios?${queryString}` : '/scenarios';\n\n return this.request<PaginatedResponse<Scenario>>(endpoint);\n }\n\n async listCollectionScenarios(\n collectionId: string,\n options: PaginationOptions = {}\n ): Promise<ApiResponse<{ scenarios: Scenario[] }>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString\n ? `/collections/${collectionId}/scenarios?${queryString}`\n : `/collections/${collectionId}/scenarios`;\n\n return this.request<ApiResponse<{ scenarios: Scenario[] }>>(endpoint);\n }\n\n async getScenario(id: string): Promise<ApiResponse<Scenario>> {\n return this.request(`/scenarios/${id}`);\n }\n\n async createScenario(input: CreateScenarioInput): Promise<ApiResponse<Scenario>> {\n return this.request('/scenarios', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async generateScenarios(\n collectionId: string,\n input: GenerateScenariosInput = {}\n ): Promise<ApiResponse<{ scenarios: { scenario: Scenario; similarity?: unknown }[] }>> {\n return this.request(`/collections/${collectionId}/scenarios/generate`, {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async runScenario(scenarioId: string): Promise<ApiResponse<ScenarioRun>> {\n return this.request(`/scenarios/${scenarioId}/run`, {\n method: 'POST',\n });\n }\n\n async getScenarioRuns(\n scenarioId: string,\n options: PaginationOptions = {}\n ): Promise<PaginatedResponse<ScenarioRun>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString\n ? `/scenarios/${scenarioId}/runs?${queryString}`\n : `/scenarios/${scenarioId}/runs`;\n\n return this.request<PaginatedResponse<ScenarioRun>>(endpoint);\n }\n\n // Check if authenticated\n isAuthenticated(): boolean {\n return !!this.apiKey;\n }\n}\n\n// Custom error class for API errors\nexport class ApiError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public data?: unknown\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\n// Singleton instance\nlet clientInstance: TpmClient | null = null;\n\nexport function getClient(options?: TpmClientOptions): TpmClient {\n if (!clientInstance || options) {\n clientInstance = new TpmClient(options);\n }\n return clientInstance;\n}\n","import Table from 'cli-table3';\nimport ora, { type Ora } from 'ora';\nimport pc from 'picocolors';\n\nexport interface OutputOptions {\n json?: boolean;\n verbose?: boolean;\n noColor?: boolean;\n}\n\nexport class OutputFormatter {\n private options: OutputOptions;\n\n constructor(options: OutputOptions = {}) {\n this.options = options;\n }\n\n // Output as JSON\n json(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n }\n\n // Output a table\n table<T extends Record<string, unknown>>(\n data: T[],\n columns: { key: keyof T; header: string; width?: number }[]\n ): void {\n if (this.options.json) {\n this.json(data);\n return;\n }\n\n const table = new Table({\n head: columns.map((col) => pc.bold(col.header)),\n colWidths: columns.map((col) => col.width ?? null),\n style: {\n head: [],\n border: [],\n },\n });\n\n for (const row of data) {\n table.push(columns.map((col) => String(row[col.key] ?? '')));\n }\n\n console.log(table.toString());\n }\n\n // Success message\n success(message: string): void {\n if (this.options.json) return;\n console.log(pc.green('✓'), message);\n }\n\n // Error message\n error(message: string, details?: string): void {\n if (this.options.json) {\n this.json({ error: message, details });\n return;\n }\n console.error(pc.red('✗'), message);\n if (details && this.options.verbose) {\n console.error(pc.dim(details));\n }\n }\n\n // Warning message\n warning(message: string): void {\n if (this.options.json) return;\n console.log(pc.yellow('⚠'), message);\n }\n\n // Info message\n info(message: string): void {\n if (this.options.json) return;\n console.log(pc.blue('ℹ'), message);\n }\n\n // Debug message (only in verbose mode)\n debug(message: string): void {\n if (this.options.json) return;\n if (this.options.verbose) {\n console.log(pc.dim(`[debug] ${message}`));\n }\n }\n\n // Plain text output\n text(message: string): void {\n if (this.options.json) return;\n console.log(message);\n }\n\n // Heading\n heading(text: string): void {\n if (this.options.json) return;\n console.log();\n console.log(pc.bold(pc.underline(text)));\n console.log();\n }\n\n // Subheading\n subheading(text: string): void {\n if (this.options.json) return;\n console.log(pc.bold(text));\n }\n\n // Key-value pair\n keyValue(key: string, value: string | number | boolean | undefined): void {\n if (this.options.json) return;\n console.log(`${pc.dim(key + ':')} ${value ?? pc.dim('(not set)')}`);\n }\n\n // List item\n listItem(text: string, indent = 0): void {\n if (this.options.json) return;\n const prefix = ' '.repeat(indent) + '•';\n console.log(`${prefix} ${text}`);\n }\n\n // Spinner\n spinner(message: string): Ora {\n return ora({\n text: message,\n isSilent: this.options.json,\n }).start();\n }\n\n // Blank line\n newLine(): void {\n if (this.options.json) return;\n console.log();\n }\n\n // Horizontal rule\n hr(): void {\n if (this.options.json) return;\n console.log(pc.dim('─'.repeat(50)));\n }\n\n // Alias for hr\n divider(): void {\n this.hr();\n }\n\n // Code block\n code(text: string, language?: string): void {\n if (this.options.json) {\n this.json({ code: text, language });\n return;\n }\n console.log(pc.dim('```' + (language ?? '')));\n console.log(text);\n console.log(pc.dim('```'));\n }\n\n // Highlight text\n highlight(text: string): string {\n return pc.cyan(text);\n }\n\n // Dim text\n dim(text: string): string {\n return pc.dim(text);\n }\n\n // Bold text\n bold(text: string): string {\n return pc.bold(text);\n }\n\n // Link (just returns text in terminal)\n link(text: string, url: string): string {\n // OSC 8 hyperlink support for modern terminals\n return `\\x1b]8;;${url}\\x07${pc.underline(pc.blue(text))}\\x1b]8;;\\x07`;\n }\n\n // Color helpers\n green(text: string): string {\n return pc.green(text);\n }\n\n red(text: string): string {\n return pc.red(text);\n }\n\n yellow(text: string): string {\n return pc.yellow(text);\n }\n\n blue(text: string): string {\n return pc.blue(text);\n }\n\n cyan(text: string): string {\n return pc.cyan(text);\n }\n}\n\n// Convenience function to create formatter from command flags\nexport function createOutput(flags: { json?: boolean; verbose?: boolean }): OutputFormatter {\n return new OutputFormatter({\n json: flags.json,\n verbose: flags.verbose,\n });\n}\n","import { Command, Flags } from '@oclif/core';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { getClient } from '../../lib/api-client.js';\nimport { createOutput } from '../../lib/output.js';\n\nexport default class ToolValidate extends Command {\n static description = 'Validate a tpmjs package configuration';\n\n static examples = [\n '<%= config.bin %> <%= command.id %>',\n '<%= config.bin %> <%= command.id %> --path ./my-tool',\n ];\n\n static flags = {\n path: Flags.string({\n char: 'p',\n description: 'Path to package directory (defaults to current directory)',\n default: '.',\n }),\n json: Flags.boolean({\n description: 'Output in JSON format',\n default: false,\n }),\n verbose: Flags.boolean({\n char: 'v',\n description: 'Show verbose output',\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(ToolValidate);\n const output = createOutput(flags);\n const client = getClient();\n\n const packagePath = path.resolve(flags.path, 'package.json');\n\n // Check if package.json exists\n if (!fs.existsSync(packagePath)) {\n output.error(`package.json not found at ${packagePath}`);\n return;\n }\n\n let packageJson: Record<string, unknown>;\n try {\n const content = fs.readFileSync(packagePath, 'utf-8');\n packageJson = JSON.parse(content);\n } catch (error) {\n output.error('Failed to parse package.json', error instanceof Error ? error.message : undefined);\n return;\n }\n\n // Check for tpmjs keyword\n const keywords = (packageJson.keywords as string[]) || [];\n const hasTpmjsKeyword = keywords.includes('tpmjs');\n\n if (!hasTpmjsKeyword) {\n output.warning('Missing \"tpmjs\" keyword in package.json');\n output.text('Add \"tpmjs\" to the keywords array for auto-discovery');\n }\n\n // Check for tpmjs field\n const tpmjsField = packageJson.tpmjs;\n if (!tpmjsField) {\n output.error('Missing \"tpmjs\" field in package.json');\n output.newLine();\n output.text('Add a tpmjs field like:');\n output.code(\n JSON.stringify(\n {\n tpmjs: {\n category: 'utilities',\n tools: ['myTool'],\n },\n },\n null,\n 2\n ),\n 'json'\n );\n return;\n }\n\n // Validate with API\n const spinner = output.spinner('Validating tpmjs configuration...');\n\n try {\n const response = await client.validateTpmjsField(tpmjsField);\n\n spinner.stop();\n\n if (flags.json) {\n output.json({\n valid: response.data?.valid ?? false,\n tier: response.data?.tier,\n errors: response.data?.errors,\n hasTpmjsKeyword,\n });\n return;\n }\n\n if (response.data?.valid) {\n output.success('Configuration is valid');\n output.newLine();\n output.keyValue('Tier', response.data.tier || 'minimal');\n output.keyValue('Has tpmjs keyword', hasTpmjsKeyword ? 'Yes' : 'No (add for auto-discovery)');\n\n if (!hasTpmjsKeyword) {\n output.newLine();\n output.warning('Add \"tpmjs\" to keywords for auto-discovery on npm publish');\n }\n } else {\n output.error('Configuration is invalid');\n if (response.data?.errors && Array.isArray(response.data.errors)) {\n output.newLine();\n output.subheading('Errors:');\n for (const error of response.data.errors) {\n output.listItem(JSON.stringify(error));\n }\n }\n }\n } catch (error) {\n spinner.fail('Validation failed');\n output.error(\n error instanceof Error ? error.message : 'Unknown error',\n flags.verbose ? String(error) : undefined\n );\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/config.ts","../../../src/lib/api-client.ts","../../../src/lib/output.ts","../../../src/commands/tool/validate.ts"],"names":["path2","fs2"],"mappings":"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","file":"validate.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport Conf from 'conf';\n\nexport interface TpmConfig {\n apiUrl?: string;\n defaultOutput?: 'human' | 'json';\n verbose?: boolean;\n analytics?: boolean;\n env?: Record<string, string>;\n}\n\nexport interface TpmCredentials {\n apiKey?: string;\n refreshToken?: string;\n expiresAt?: string;\n}\n\nconst CONFIG_DIR = path.join(os.homedir(), '.tpmjs');\nconst CREDENTIALS_FILE = path.join(CONFIG_DIR, 'credentials.json');\nconst HISTORY_DIR = path.join(CONFIG_DIR, 'history');\n\n// Ensure config directory exists\nfunction ensureConfigDir(): void {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\n// Config store using Conf\nconst configStore = new Conf<TpmConfig>({\n projectName: 'tpmjs',\n cwd: CONFIG_DIR,\n configName: 'config',\n defaults: {\n apiUrl: 'https://tpmjs.com/api',\n defaultOutput: 'human',\n verbose: false,\n analytics: false,\n },\n});\n\nexport function getConfig(): TpmConfig {\n return configStore.store;\n}\n\nexport function setConfig(config: Partial<TpmConfig>): void {\n for (const [key, value] of Object.entries(config)) {\n if (value !== undefined) {\n configStore.set(key, value);\n }\n }\n}\n\nexport function getConfigValue<K extends keyof TpmConfig>(key: K): TpmConfig[K] {\n return configStore.get(key);\n}\n\nexport function setConfigValue<K extends keyof TpmConfig>(key: K, value: TpmConfig[K]): void {\n configStore.set(key, value);\n}\n\nexport function resetConfig(): void {\n configStore.clear();\n}\n\n// Credentials management with secure file permissions\nexport function loadCredentials(): TpmCredentials | null {\n ensureConfigDir();\n\n if (!fs.existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n\n try {\n const content = fs.readFileSync(CREDENTIALS_FILE, 'utf-8');\n return JSON.parse(content) as TpmCredentials;\n } catch {\n return null;\n }\n}\n\nexport function saveCredentials(credentials: TpmCredentials): void {\n ensureConfigDir();\n\n const content = JSON.stringify(credentials, null, 2);\n fs.writeFileSync(CREDENTIALS_FILE, content, { mode: 0o600 });\n}\n\nexport function deleteCredentials(): void {\n if (fs.existsSync(CREDENTIALS_FILE)) {\n fs.unlinkSync(CREDENTIALS_FILE);\n }\n}\n\nexport function hasCredentials(): boolean {\n const creds = loadCredentials();\n return creds !== null && !!creds.apiKey;\n}\n\n// Get API key from multiple sources (priority order)\nexport function getApiKey(): string | undefined {\n // 1. Environment variable\n if (process.env.TPMJS_API_KEY) {\n return process.env.TPMJS_API_KEY;\n }\n\n // 2. Credentials file\n const creds = loadCredentials();\n if (creds?.apiKey) {\n return creds.apiKey;\n }\n\n return undefined;\n}\n\n// Get API URL\nexport function getApiUrl(): string {\n return process.env.TPMJS_API_URL ?? getConfigValue('apiUrl') ?? 'https://tpmjs.com/api';\n}\n\n// History directory for conversation caching\nexport function getHistoryDir(): string {\n if (!fs.existsSync(HISTORY_DIR)) {\n fs.mkdirSync(HISTORY_DIR, { recursive: true, mode: 0o700 });\n }\n return HISTORY_DIR;\n}\n\n// Config directory path\nexport function getConfigDir(): string {\n ensureConfigDir();\n return CONFIG_DIR;\n}\n","import { getApiKey, getApiUrl } from './config.js';\n\nexport interface TpmClientOptions {\n baseUrl?: string;\n apiKey?: string;\n timeout?: number;\n}\n\nexport interface ApiResponse<T> {\n success: boolean;\n data?: T;\n error?: string;\n message?: string;\n}\n\nexport interface PaginationOptions {\n limit?: number;\n offset?: number;\n}\n\nexport interface PaginatedResponse<T> {\n data: T[];\n pagination: {\n limit: number;\n offset: number;\n hasMore: boolean;\n };\n}\n\n// Tool types\nexport interface Tool {\n id: string;\n name: string;\n slug: string;\n description: string;\n category: string;\n tier: string;\n qualityScore: number | null;\n importHealth: string;\n executionHealth: string;\n likeCount: number;\n npmPackageName: string;\n npmVersion: string;\n npmDownloadsLastMonth: number;\n isOfficial: boolean;\n inputSchema?: Record<string, unknown>;\n outputSchema?: Record<string, unknown>;\n tools?: { name: string; description?: string }[];\n package?: {\n npmPackageName: string;\n category: string;\n npmDownloadsLastMonth: number;\n isOfficial: boolean;\n };\n}\n\nexport interface ToolSearchOptions extends PaginationOptions {\n category?: string;\n query?: string;\n}\n\n// Agent types\nexport interface Agent {\n id: string;\n uid: string;\n name: string;\n description: string | null;\n provider: string;\n modelId: string;\n systemPrompt: string | null;\n temperature: number;\n isPublic: boolean;\n likeCount: number;\n _count?: {\n tools: number;\n collections: number;\n };\n}\n\nexport interface CreateAgentInput {\n name: string;\n uid?: string;\n description?: string;\n provider: string;\n modelId: string;\n systemPrompt?: string;\n temperature?: number;\n isPublic?: boolean;\n collectionIds?: string[];\n toolIds?: string[];\n}\n\nexport interface UpdateAgentInput {\n name?: string;\n uid?: string;\n description?: string;\n provider?: string;\n modelId?: string;\n systemPrompt?: string;\n temperature?: number;\n isPublic?: boolean;\n maxToolCallsPerTurn?: number;\n maxMessagesInContext?: number;\n}\n\n// Collection types\nexport interface Collection {\n id: string;\n name: string;\n slug: string | null;\n description: string | null;\n isPublic: boolean;\n likeCount: number;\n _count?: {\n tools: number;\n };\n}\n\nexport interface CreateCollectionInput {\n name: string;\n description?: string;\n isPublic: boolean;\n}\n\nexport interface UpdateCollectionInput {\n name?: string;\n description?: string;\n isPublic?: boolean;\n}\n\n// User types\nexport interface User {\n id: string;\n name: string | null;\n username: string | null;\n email: string;\n image: string | null;\n}\n\n// API Key types\nexport interface ApiKey {\n id: string;\n name: string;\n keyPrefix: string;\n scopes: string[];\n isActive: boolean;\n lastUsedAt: string | null;\n expiresAt: string | null;\n createdAt: string;\n}\n\n// Scenario types\nexport interface Scenario {\n id: string;\n collectionId: string | null;\n prompt: string;\n name: string | null;\n description: string | null;\n tags: string[];\n qualityScore: number;\n totalRuns: number;\n lastRunAt: string | null;\n lastRunStatus: string | null;\n consecutivePasses: number;\n consecutiveFails: number;\n createdAt: string;\n updatedAt: string;\n collection?: {\n id: string;\n name: string;\n slug: string | null;\n username: string | null;\n } | null;\n}\n\nexport interface ScenarioRun {\n id: string;\n status: string;\n success: boolean;\n evaluator: {\n model: string | null;\n verdict: string | null;\n reason: string | null;\n };\n assertions: unknown;\n usage: {\n inputTokens: number | null;\n outputTokens: number | null;\n totalTokens: number | null;\n executionTimeMs: number | null;\n };\n timestamps: {\n startedAt: string | null;\n completedAt: string | null;\n createdAt: string;\n };\n quotaRemaining?: number;\n}\n\nexport interface ScenarioListOptions extends PaginationOptions {\n collectionId?: string;\n tags?: string;\n sortBy?: 'qualityScore' | 'totalRuns' | 'createdAt' | 'lastRunAt';\n}\n\nexport interface CreateScenarioInput {\n collectionId: string;\n prompt: string;\n name?: string;\n description?: string;\n tags?: string[];\n}\n\nexport interface GenerateScenariosInput {\n count?: number;\n skipSimilarityCheck?: boolean;\n}\n\n// Stats types\nexport interface Stats {\n tools: {\n total: number;\n official: number;\n healthyImport: number;\n healthyExecution: number;\n };\n packages: {\n total: number;\n official: number;\n };\n categories: { name: string; count: number }[];\n}\n\nexport class TpmClient {\n private baseUrl: string;\n private apiKey: string | undefined;\n private timeout: number;\n\n constructor(options: TpmClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? getApiUrl();\n this.apiKey = options.apiKey ?? getApiKey();\n this.timeout = options.timeout ?? 30000;\n }\n\n private async request<T>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(options.headers as Record<string, string>),\n };\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n });\n\n const data = (await response.json()) as T & { message?: string; error?: string };\n\n if (!response.ok) {\n throw new ApiError(\n data.message || data.error || `HTTP ${response.status}`,\n response.status,\n data\n );\n }\n\n return data as T;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // Health check\n async health(): Promise<{ status: string; timestamp: string }> {\n return this.request('/health');\n }\n\n // Stats\n async getStats(): Promise<ApiResponse<Stats>> {\n return this.request('/stats');\n }\n\n // Tools\n async searchTools(options: ToolSearchOptions = {}): Promise<PaginatedResponse<Tool>> {\n const params = new URLSearchParams();\n if (options.query) params.set('q', options.query);\n if (options.category) params.set('category', options.category);\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/tools?${queryString}` : '/tools';\n\n return this.request<PaginatedResponse<Tool>>(endpoint);\n }\n\n async getTool(packageName: string, toolName: string): Promise<ApiResponse<Tool>> {\n return this.request(\n `/tools/${encodeURIComponent(packageName)}/${encodeURIComponent(toolName)}`\n );\n }\n\n async getToolBySlug(slug: string): Promise<ApiResponse<Tool>> {\n // Search for the tool by slug\n const searchResult = await this.searchTools({ query: slug, limit: 1 });\n if (searchResult.data && searchResult.data.length > 0) {\n const tool = searchResult.data.find((t) => t.slug === slug) || searchResult.data[0];\n return { success: true, data: tool };\n }\n return { success: false, error: 'Tool not found' };\n }\n\n async getTrendingTools(options: PaginationOptions = {}): Promise<PaginatedResponse<Tool>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/tools/trending?${queryString}` : '/tools/trending';\n\n return this.request<PaginatedResponse<Tool>>(endpoint);\n }\n\n async validateTpmjsField(\n field: unknown\n ): Promise<ApiResponse<{ valid: boolean; tier: string | null; errors?: unknown[] }>> {\n return this.request('/tools/validate', {\n method: 'POST',\n body: JSON.stringify(field),\n });\n }\n\n async executeTool(slug: string, params: Record<string, unknown>): Promise<unknown> {\n return this.request(`/tools/${encodeURIComponent(slug)}/execute`, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n async *executeToolStream(\n slug: string,\n params: Record<string, unknown>\n ): AsyncGenerator<{ type: string; data: string }> {\n const url = `${this.baseUrl}/tools/${encodeURIComponent(slug)}/execute`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n };\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ ...params, stream: true }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new ApiError(errorText || `HTTP ${response.status}`, response.status);\n }\n\n if (!response.body) {\n throw new ApiError('No response body', 0);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n yield { type: 'done', data: '' };\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n yield { type: 'done', data: '' };\n return;\n }\n try {\n const parsed = JSON.parse(data);\n yield { type: parsed.type || 'text', data: parsed.content || parsed.data || data };\n } catch {\n yield { type: 'text', data };\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n // Agents\n async listAgents(options: PaginationOptions = {}): Promise<PaginatedResponse<Agent>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/agents?${queryString}` : '/agents';\n\n return this.request<PaginatedResponse<Agent>>(endpoint);\n }\n\n async getAgent(id: string): Promise<ApiResponse<Agent>> {\n return this.request(`/agents/${id}`);\n }\n\n async createAgent(input: CreateAgentInput): Promise<ApiResponse<Agent>> {\n return this.request('/agents', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async updateAgent(id: string, input: UpdateAgentInput): Promise<ApiResponse<Agent>> {\n return this.request(`/agents/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n });\n }\n\n async deleteAgent(id: string): Promise<ApiResponse<void>> {\n return this.request(`/agents/${id}`, {\n method: 'DELETE',\n });\n }\n\n // Collections\n async listCollections(options: PaginationOptions = {}): Promise<PaginatedResponse<Collection>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString ? `/collections?${queryString}` : '/collections';\n\n return this.request<PaginatedResponse<Collection>>(endpoint);\n }\n\n async getCollection(id: string): Promise<ApiResponse<Collection>> {\n return this.request(`/collections/${id}`);\n }\n\n async createCollection(input: CreateCollectionInput): Promise<ApiResponse<Collection>> {\n return this.request('/collections', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async updateCollection(\n id: string,\n input: UpdateCollectionInput\n ): Promise<ApiResponse<Collection>> {\n return this.request(`/collections/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(input),\n });\n }\n\n async deleteCollection(id: string): Promise<ApiResponse<void>> {\n return this.request(`/collections/${id}`, {\n method: 'DELETE',\n });\n }\n\n async addToolsToCollection(id: string, toolIds: string[]): Promise<ApiResponse<void>> {\n // Add tools one by one (API doesn't support bulk)\n for (const toolId of toolIds) {\n await this.request(`/collections/${id}/tools/${toolId}`, {\n method: 'POST',\n });\n }\n return { success: true };\n }\n\n async removeToolFromCollection(id: string, toolId: string): Promise<ApiResponse<void>> {\n return this.request(`/collections/${id}/tools/${toolId}`, {\n method: 'DELETE',\n });\n }\n\n // User\n async whoami(): Promise<ApiResponse<User>> {\n return this.request('/user/profile');\n }\n\n async listApiKeys(): Promise<ApiResponse<ApiKey[]>> {\n return this.request('/user/tpmjs-api-keys');\n }\n\n // Scenarios\n async listScenarios(options: ScenarioListOptions = {}): Promise<PaginatedResponse<Scenario>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n if (options.collectionId) params.set('collectionId', options.collectionId);\n if (options.tags) params.set('tags', options.tags);\n if (options.sortBy) params.set('sortBy', options.sortBy);\n\n const queryString = params.toString();\n const endpoint = queryString ? `/scenarios?${queryString}` : '/scenarios';\n\n return this.request<PaginatedResponse<Scenario>>(endpoint);\n }\n\n async listCollectionScenarios(\n collectionId: string,\n options: PaginationOptions = {}\n ): Promise<ApiResponse<{ scenarios: Scenario[] }>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString\n ? `/collections/${collectionId}/scenarios?${queryString}`\n : `/collections/${collectionId}/scenarios`;\n\n return this.request<ApiResponse<{ scenarios: Scenario[] }>>(endpoint);\n }\n\n async getScenario(id: string): Promise<ApiResponse<Scenario>> {\n return this.request(`/scenarios/${id}`);\n }\n\n async createScenario(input: CreateScenarioInput): Promise<ApiResponse<Scenario>> {\n return this.request('/scenarios', {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async generateScenarios(\n collectionId: string,\n input: GenerateScenariosInput = {}\n ): Promise<ApiResponse<{ scenarios: { scenario: Scenario; similarity?: unknown }[] }>> {\n return this.request(`/collections/${collectionId}/scenarios/generate`, {\n method: 'POST',\n body: JSON.stringify(input),\n });\n }\n\n async runScenario(scenarioId: string): Promise<ApiResponse<ScenarioRun>> {\n return this.request(`/scenarios/${scenarioId}/run`, {\n method: 'POST',\n });\n }\n\n async getScenarioRuns(\n scenarioId: string,\n options: PaginationOptions = {}\n ): Promise<PaginatedResponse<ScenarioRun>> {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.offset) params.set('offset', String(options.offset));\n\n const queryString = params.toString();\n const endpoint = queryString\n ? `/scenarios/${scenarioId}/runs?${queryString}`\n : `/scenarios/${scenarioId}/runs`;\n\n return this.request<PaginatedResponse<ScenarioRun>>(endpoint);\n }\n\n // Check if authenticated\n isAuthenticated(): boolean {\n return !!this.apiKey;\n }\n}\n\n// Custom error class for API errors\nexport class ApiError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public data?: unknown\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\n// Singleton instance\nlet clientInstance: TpmClient | null = null;\n\nexport function getClient(options?: TpmClientOptions): TpmClient {\n if (!clientInstance || options) {\n clientInstance = new TpmClient(options);\n }\n return clientInstance;\n}\n","import Table from 'cli-table3';\nimport ora, { type Ora } from 'ora';\nimport pc from 'picocolors';\n\nexport interface OutputOptions {\n json?: boolean;\n verbose?: boolean;\n noColor?: boolean;\n}\n\nexport class OutputFormatter {\n private options: OutputOptions;\n\n constructor(options: OutputOptions = {}) {\n this.options = options;\n }\n\n // Output as JSON\n json(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n }\n\n // Output a table\n table<T extends Record<string, unknown>>(\n data: T[],\n columns: { key: keyof T; header: string; width?: number }[]\n ): void {\n if (this.options.json) {\n this.json(data);\n return;\n }\n\n const table = new Table({\n head: columns.map((col) => pc.bold(col.header)),\n colWidths: columns.map((col) => col.width ?? null),\n style: {\n head: [],\n border: [],\n },\n });\n\n for (const row of data) {\n table.push(columns.map((col) => String(row[col.key] ?? '')));\n }\n\n console.log(table.toString());\n }\n\n // Success message\n success(message: string): void {\n if (this.options.json) return;\n console.log(pc.green('✓'), message);\n }\n\n // Error message\n error(message: string, details?: string): void {\n if (this.options.json) {\n this.json({ error: message, details });\n return;\n }\n console.error(pc.red('✗'), message);\n if (details && this.options.verbose) {\n console.error(pc.dim(details));\n }\n }\n\n // Warning message\n warning(message: string): void {\n if (this.options.json) return;\n console.log(pc.yellow('⚠'), message);\n }\n\n // Info message\n info(message: string): void {\n if (this.options.json) return;\n console.log(pc.blue('ℹ'), message);\n }\n\n // Debug message (only in verbose mode)\n debug(message: string): void {\n if (this.options.json) return;\n if (this.options.verbose) {\n console.log(pc.dim(`[debug] ${message}`));\n }\n }\n\n // Plain text output\n text(message: string): void {\n if (this.options.json) return;\n console.log(message);\n }\n\n // Heading\n heading(text: string): void {\n if (this.options.json) return;\n console.log();\n console.log(pc.bold(pc.underline(text)));\n console.log();\n }\n\n // Subheading\n subheading(text: string): void {\n if (this.options.json) return;\n console.log(pc.bold(text));\n }\n\n // Key-value pair\n keyValue(key: string, value: string | number | boolean | undefined): void {\n if (this.options.json) return;\n console.log(`${pc.dim(`${key}:`)} ${value ?? pc.dim('(not set)')}`);\n }\n\n // List item\n listItem(text: string, indent = 0): void {\n if (this.options.json) return;\n const prefix = `${' '.repeat(indent)}•`;\n console.log(`${prefix} ${text}`);\n }\n\n // Spinner\n spinner(message: string): Ora {\n return ora({\n text: message,\n isSilent: this.options.json,\n }).start();\n }\n\n // Blank line\n newLine(): void {\n if (this.options.json) return;\n console.log();\n }\n\n // Horizontal rule\n hr(): void {\n if (this.options.json) return;\n console.log(pc.dim('─'.repeat(50)));\n }\n\n // Alias for hr\n divider(): void {\n this.hr();\n }\n\n // Code block\n code(text: string, language?: string): void {\n if (this.options.json) {\n this.json({ code: text, language });\n return;\n }\n console.log(pc.dim(`\\`\\`\\`${language ?? ''}`));\n console.log(text);\n console.log(pc.dim('```'));\n }\n\n // Highlight text\n highlight(text: string): string {\n return pc.cyan(text);\n }\n\n // Dim text\n dim(text: string): string {\n return pc.dim(text);\n }\n\n // Bold text\n bold(text: string): string {\n return pc.bold(text);\n }\n\n // Link (just returns text in terminal)\n link(text: string, url: string): string {\n // OSC 8 hyperlink support for modern terminals\n return `\\x1b]8;;${url}\\x07${pc.underline(pc.blue(text))}\\x1b]8;;\\x07`;\n }\n\n // Color helpers\n green(text: string): string {\n return pc.green(text);\n }\n\n red(text: string): string {\n return pc.red(text);\n }\n\n yellow(text: string): string {\n return pc.yellow(text);\n }\n\n blue(text: string): string {\n return pc.blue(text);\n }\n\n cyan(text: string): string {\n return pc.cyan(text);\n }\n}\n\n// Convenience function to create formatter from command flags\nexport function createOutput(flags: { json?: boolean; verbose?: boolean }): OutputFormatter {\n return new OutputFormatter({\n json: flags.json,\n verbose: flags.verbose,\n });\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command, Flags } from '@oclif/core';\nimport { getClient } from '../../lib/api-client.js';\nimport { createOutput } from '../../lib/output.js';\n\nexport default class ToolValidate extends Command {\n static description = 'Validate a tpmjs package configuration';\n\n static examples = [\n '<%= config.bin %> <%= command.id %>',\n '<%= config.bin %> <%= command.id %> --path ./my-tool',\n ];\n\n static flags = {\n path: Flags.string({\n char: 'p',\n description: 'Path to package directory (defaults to current directory)',\n default: '.',\n }),\n json: Flags.boolean({\n description: 'Output in JSON format',\n default: false,\n }),\n verbose: Flags.boolean({\n char: 'v',\n description: 'Show verbose output',\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(ToolValidate);\n const output = createOutput(flags);\n const client = getClient();\n\n const packagePath = path.resolve(flags.path, 'package.json');\n\n // Check if package.json exists\n if (!fs.existsSync(packagePath)) {\n output.error(`package.json not found at ${packagePath}`);\n return;\n }\n\n let packageJson: Record<string, unknown>;\n try {\n const content = fs.readFileSync(packagePath, 'utf-8');\n packageJson = JSON.parse(content);\n } catch (error) {\n output.error(\n 'Failed to parse package.json',\n error instanceof Error ? error.message : undefined\n );\n return;\n }\n\n // Check for tpmjs keyword\n const keywords = (packageJson.keywords as string[]) || [];\n const hasTpmjsKeyword = keywords.includes('tpmjs');\n\n if (!hasTpmjsKeyword) {\n output.warning('Missing \"tpmjs\" keyword in package.json');\n output.text('Add \"tpmjs\" to the keywords array for auto-discovery');\n }\n\n // Check for tpmjs field\n const tpmjsField = packageJson.tpmjs;\n if (!tpmjsField) {\n output.error('Missing \"tpmjs\" field in package.json');\n output.newLine();\n output.text('Add a tpmjs field like:');\n output.code(\n JSON.stringify(\n {\n tpmjs: {\n category: 'utilities',\n tools: ['myTool'],\n },\n },\n null,\n 2\n ),\n 'json'\n );\n return;\n }\n\n // Validate with API\n const spinner = output.spinner('Validating tpmjs configuration...');\n\n try {\n const response = await client.validateTpmjsField(tpmjsField);\n\n spinner.stop();\n\n if (flags.json) {\n output.json({\n valid: response.data?.valid ?? false,\n tier: response.data?.tier,\n errors: response.data?.errors,\n hasTpmjsKeyword,\n });\n return;\n }\n\n if (response.data?.valid) {\n output.success('Configuration is valid');\n output.newLine();\n output.keyValue('Tier', response.data.tier || 'minimal');\n output.keyValue(\n 'Has tpmjs keyword',\n hasTpmjsKeyword ? 'Yes' : 'No (add for auto-discovery)'\n );\n\n if (!hasTpmjsKeyword) {\n output.newLine();\n output.warning('Add \"tpmjs\" to keywords for auto-discovery on npm publish');\n }\n } else {\n output.error('Configuration is invalid');\n if (response.data?.errors && Array.isArray(response.data.errors)) {\n output.newLine();\n output.subheading('Errors:');\n for (const error of response.data.errors) {\n output.listItem(JSON.stringify(error));\n }\n }\n }\n } catch (error) {\n spinner.fail('Validation failed');\n output.error(\n error instanceof Error ? error.message : 'Unknown error',\n flags.verbose ? String(error) : undefined\n );\n }\n }\n}\n"]}
|
package/dist/commands/update.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Command, Flags } from '@oclif/core';
|
|
2
1
|
import { execSync } from 'child_process';
|
|
2
|
+
import { Command, Flags } from '@oclif/core';
|
|
3
3
|
import Table from 'cli-table3';
|
|
4
4
|
import ora from 'ora';
|
|
5
5
|
import pc from 'picocolors';
|
|
@@ -86,12 +86,12 @@ var OutputFormatter = class {
|
|
|
86
86
|
// Key-value pair
|
|
87
87
|
keyValue(key, value) {
|
|
88
88
|
if (this.options.json) return;
|
|
89
|
-
console.log(`${pc.dim(key
|
|
89
|
+
console.log(`${pc.dim(`${key}:`)} ${value ?? pc.dim("(not set)")}`);
|
|
90
90
|
}
|
|
91
91
|
// List item
|
|
92
92
|
listItem(text, indent = 0) {
|
|
93
93
|
if (this.options.json) return;
|
|
94
|
-
const prefix = " ".repeat(indent)
|
|
94
|
+
const prefix = `${" ".repeat(indent)}\u2022`;
|
|
95
95
|
console.log(`${prefix} ${text}`);
|
|
96
96
|
}
|
|
97
97
|
// Spinner
|
|
@@ -121,7 +121,7 @@ var OutputFormatter = class {
|
|
|
121
121
|
this.json({ code: text, language });
|
|
122
122
|
return;
|
|
123
123
|
}
|
|
124
|
-
console.log(pc.dim(
|
|
124
|
+
console.log(pc.dim(`\`\`\`${language ?? ""}`));
|
|
125
125
|
console.log(text);
|
|
126
126
|
console.log(pc.dim("```"));
|
|
127
127
|
}
|