@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.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +18 -0
  3. package/bin/run.js +0 -0
  4. package/dist/commands/agent/chat.js +7 -7
  5. package/dist/commands/agent/chat.js.map +1 -1
  6. package/dist/commands/agent/create.js +6 -6
  7. package/dist/commands/agent/create.js.map +1 -1
  8. package/dist/commands/agent/delete.js +9 -7
  9. package/dist/commands/agent/delete.js.map +1 -1
  10. package/dist/commands/agent/list.js +6 -6
  11. package/dist/commands/agent/list.js.map +1 -1
  12. package/dist/commands/agent/update.js +6 -6
  13. package/dist/commands/agent/update.js.map +1 -1
  14. package/dist/commands/auth/login.js +6 -6
  15. package/dist/commands/auth/login.js.map +1 -1
  16. package/dist/commands/auth/logout.js +4 -4
  17. package/dist/commands/auth/logout.js.map +1 -1
  18. package/dist/commands/auth/status.js +12 -9
  19. package/dist/commands/auth/status.js.map +1 -1
  20. package/dist/commands/auth/whoami.js +6 -6
  21. package/dist/commands/auth/whoami.js.map +1 -1
  22. package/dist/commands/collection/add.js +6 -6
  23. package/dist/commands/collection/add.js.map +1 -1
  24. package/dist/commands/collection/create.js +6 -6
  25. package/dist/commands/collection/create.js.map +1 -1
  26. package/dist/commands/collection/delete.js +7 -7
  27. package/dist/commands/collection/delete.js.map +1 -1
  28. package/dist/commands/collection/import.js +7 -7
  29. package/dist/commands/collection/import.js.map +1 -1
  30. package/dist/commands/collection/info.d.ts +17 -0
  31. package/dist/commands/collection/info.js +358 -0
  32. package/dist/commands/collection/info.js.map +1 -0
  33. package/dist/commands/collection/list.js +6 -6
  34. package/dist/commands/collection/list.js.map +1 -1
  35. package/dist/commands/collection/remove.js +7 -9
  36. package/dist/commands/collection/remove.js.map +1 -1
  37. package/dist/commands/collection/update.js +6 -6
  38. package/dist/commands/collection/update.js.map +1 -1
  39. package/dist/commands/doctor.js +7 -7
  40. package/dist/commands/doctor.js.map +1 -1
  41. package/dist/commands/mcp/config.js +4 -4
  42. package/dist/commands/mcp/config.js.map +1 -1
  43. package/dist/commands/mcp/serve.js +7 -7
  44. package/dist/commands/mcp/serve.js.map +1 -1
  45. package/dist/commands/playground.js +7 -7
  46. package/dist/commands/playground.js.map +1 -1
  47. package/dist/commands/publish/check.js +11 -11
  48. package/dist/commands/publish/check.js.map +1 -1
  49. package/dist/commands/publish/preview.js +4 -4
  50. package/dist/commands/publish/preview.js.map +1 -1
  51. package/dist/commands/run.d.ts +24 -0
  52. package/dist/commands/run.js +454 -0
  53. package/dist/commands/run.js.map +1 -0
  54. package/dist/commands/scenario/generate.js +6 -6
  55. package/dist/commands/scenario/generate.js.map +1 -1
  56. package/dist/commands/scenario/info.js +6 -6
  57. package/dist/commands/scenario/info.js.map +1 -1
  58. package/dist/commands/scenario/list.js +11 -11
  59. package/dist/commands/scenario/list.js.map +1 -1
  60. package/dist/commands/scenario/run.js +7 -7
  61. package/dist/commands/scenario/run.js.map +1 -1
  62. package/dist/commands/scenario/test.js +8 -8
  63. package/dist/commands/scenario/test.js.map +1 -1
  64. package/dist/commands/tool/execute.js +9 -7
  65. package/dist/commands/tool/execute.js.map +1 -1
  66. package/dist/commands/tool/info.js +16 -9
  67. package/dist/commands/tool/info.js.map +1 -1
  68. package/dist/commands/tool/init.js +7 -13
  69. package/dist/commands/tool/init.js.map +1 -1
  70. package/dist/commands/tool/search.js +7 -11
  71. package/dist/commands/tool/search.js.map +1 -1
  72. package/dist/commands/tool/trending.js +6 -6
  73. package/dist/commands/tool/trending.js.map +1 -1
  74. package/dist/commands/tool/validate.js +15 -9
  75. package/dist/commands/tool/validate.js.map +1 -1
  76. package/dist/commands/update.js +4 -4
  77. package/dist/commands/update.js.map +1 -1
  78. package/dist/hooks/init.js +1 -1
  79. package/dist/hooks/init.js.map +1 -1
  80. package/dist/index.js +6 -6
  81. package/dist/index.js.map +1 -1
  82. package/oclif.manifest.json +146 -1
  83. package/package.json +10 -12
@@ -1,6 +1,6 @@
1
- import { Command, Flags } from '@oclif/core';
2
1
  import * as fs from 'fs';
3
2
  import * as path from 'path';
3
+ import { Command, Flags } from '@oclif/core';
4
4
  import Table from 'cli-table3';
5
5
  import ora from 'ora';
6
6
  import pc from 'picocolors';
@@ -87,12 +87,12 @@ var OutputFormatter = class {
87
87
  // Key-value pair
88
88
  keyValue(key, value) {
89
89
  if (this.options.json) return;
90
- console.log(`${pc.dim(key + ":")} ${value ?? pc.dim("(not set)")}`);
90
+ console.log(`${pc.dim(`${key}:`)} ${value ?? pc.dim("(not set)")}`);
91
91
  }
92
92
  // List item
93
93
  listItem(text, indent = 0) {
94
94
  if (this.options.json) return;
95
- const prefix = " ".repeat(indent) + "\u2022";
95
+ const prefix = `${" ".repeat(indent)}\u2022`;
96
96
  console.log(`${prefix} ${text}`);
97
97
  }
98
98
  // Spinner
@@ -122,7 +122,7 @@ var OutputFormatter = class {
122
122
  this.json({ code: text, language });
123
123
  return;
124
124
  }
125
- console.log(pc.dim("```" + (language ?? "")));
125
+ console.log(pc.dim(`\`\`\`${language ?? ""}`));
126
126
  console.log(text);
127
127
  console.log(pc.dim("```"));
128
128
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/output.ts","../../../src/commands/publish/preview.ts"],"names":[],"mappings":"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","file":"preview.js","sourcesContent":["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 { createOutput } from '../../lib/output.js';\n\nexport default class PublishPreview extends Command {\n static description = 'Preview how your tool will appear on tpmjs.com';\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',\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(PublishPreview);\n const output = createOutput(flags);\n\n const packagePath = path.resolve(flags.path, 'package.json');\n\n if (!fs.existsSync(packagePath)) {\n output.error(`No package.json found at ${packagePath}`);\n return;\n }\n\n const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));\n const tpmjs = packageJson.tpmjs;\n\n if (!tpmjs) {\n output.error('No tpmjs field found in package.json');\n output.text('Run `tpm tool validate` for detailed validation');\n return;\n }\n\n // Build preview data\n const preview = {\n name: tpmjs.name || packageJson.name,\n description: tpmjs.description || packageJson.description,\n category: tpmjs.category,\n tier: this.determineTier(tpmjs),\n slug: this.generateSlug(tpmjs.name || packageJson.name),\n version: packageJson.version,\n author: this.extractAuthor(packageJson),\n repository: this.extractRepo(packageJson),\n tools: tpmjs.tools || [],\n tags: tpmjs.tags || [],\n documentation: tpmjs.documentation,\n examples: tpmjs.examples,\n };\n\n if (flags.json) {\n output.json(preview);\n return;\n }\n\n // Display preview\n output.heading('Tool Preview');\n output.divider();\n\n output.text(`Name: ${preview.name}`);\n output.text(`Slug: ${preview.slug}`);\n output.text(`Version: ${preview.version}`);\n output.text(`Category: ${preview.category}`);\n output.text(`Tier: ${preview.tier}`);\n output.text('');\n output.text(`Description:`);\n output.text(` ${preview.description || '(none)'}`);\n\n if (preview.author) {\n output.text('');\n output.text(`Author: ${preview.author}`);\n }\n\n if (preview.repository) {\n output.text(`Repository: ${preview.repository}`);\n }\n\n if (preview.tools.length > 0) {\n output.text('');\n output.text(`Tools (${preview.tools.length}):`);\n for (const tool of preview.tools) {\n if (typeof tool === 'string') {\n output.listItem(tool);\n } else {\n output.listItem(`${tool.name}: ${tool.description || ''}`);\n }\n }\n }\n\n if (preview.tags.length > 0) {\n output.text('');\n output.text(`Tags: ${preview.tags.join(', ')}`);\n }\n\n if (preview.documentation) {\n output.text('');\n output.text(`Documentation: ${preview.documentation}`);\n }\n\n if (preview.examples && preview.examples.length > 0) {\n output.text('');\n output.text(`Examples: ${preview.examples.length} example(s) provided`);\n }\n\n output.divider();\n output.text('');\n output.info('This is how your tool will appear on tpmjs.com');\n output.text('Run `tpm tool validate` to check for issues before publishing');\n }\n\n private determineTier(tpmjs: Record<string, unknown>): string {\n // Rich tier requires: tools array with schemas, examples, documentation\n const hasTools = Array.isArray(tpmjs.tools) && tpmjs.tools.length > 0;\n const hasExamples = Array.isArray(tpmjs.examples) && tpmjs.examples.length > 0;\n const hasDocumentation = Boolean(tpmjs.documentation);\n\n if (hasTools && hasExamples && hasDocumentation) {\n return 'rich';\n }\n return 'minimal';\n }\n\n private generateSlug(name: string): string {\n return name\n .toLowerCase()\n .replace(/@/g, '')\n .replace(/\\//g, '-')\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n }\n\n private extractAuthor(packageJson: Record<string, unknown>): string | undefined {\n const author = packageJson.author;\n if (typeof author === 'string') {\n return author;\n }\n if (author && typeof author === 'object') {\n const authorObj = author as Record<string, string>;\n return authorObj.name || authorObj.email;\n }\n return undefined;\n }\n\n private extractRepo(packageJson: Record<string, unknown>): string | undefined {\n const repo = packageJson.repository;\n if (typeof repo === 'string') {\n return repo;\n }\n if (repo && typeof repo === 'object') {\n return (repo as Record<string, string>).url;\n }\n return undefined;\n }\n}\n"]}
1
+ {"version":3,"sources":["../../../src/lib/output.ts","../../../src/commands/publish/preview.ts"],"names":[],"mappings":"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","file":"preview.js","sourcesContent":["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 { createOutput } from '../../lib/output.js';\n\nexport default class PublishPreview extends Command {\n static description = 'Preview how your tool will appear on tpmjs.com';\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',\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(PublishPreview);\n const output = createOutput(flags);\n\n const packagePath = path.resolve(flags.path, 'package.json');\n\n if (!fs.existsSync(packagePath)) {\n output.error(`No package.json found at ${packagePath}`);\n return;\n }\n\n const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));\n const tpmjs = packageJson.tpmjs;\n\n if (!tpmjs) {\n output.error('No tpmjs field found in package.json');\n output.text('Run `tpm tool validate` for detailed validation');\n return;\n }\n\n // Build preview data\n const preview = {\n name: tpmjs.name || packageJson.name,\n description: tpmjs.description || packageJson.description,\n category: tpmjs.category,\n tier: this.determineTier(tpmjs),\n slug: this.generateSlug(tpmjs.name || packageJson.name),\n version: packageJson.version,\n author: this.extractAuthor(packageJson),\n repository: this.extractRepo(packageJson),\n tools: tpmjs.tools || [],\n tags: tpmjs.tags || [],\n documentation: tpmjs.documentation,\n examples: tpmjs.examples,\n };\n\n if (flags.json) {\n output.json(preview);\n return;\n }\n\n // Display preview\n output.heading('Tool Preview');\n output.divider();\n\n output.text(`Name: ${preview.name}`);\n output.text(`Slug: ${preview.slug}`);\n output.text(`Version: ${preview.version}`);\n output.text(`Category: ${preview.category}`);\n output.text(`Tier: ${preview.tier}`);\n output.text('');\n output.text(`Description:`);\n output.text(` ${preview.description || '(none)'}`);\n\n if (preview.author) {\n output.text('');\n output.text(`Author: ${preview.author}`);\n }\n\n if (preview.repository) {\n output.text(`Repository: ${preview.repository}`);\n }\n\n if (preview.tools.length > 0) {\n output.text('');\n output.text(`Tools (${preview.tools.length}):`);\n for (const tool of preview.tools) {\n if (typeof tool === 'string') {\n output.listItem(tool);\n } else {\n output.listItem(`${tool.name}: ${tool.description || ''}`);\n }\n }\n }\n\n if (preview.tags.length > 0) {\n output.text('');\n output.text(`Tags: ${preview.tags.join(', ')}`);\n }\n\n if (preview.documentation) {\n output.text('');\n output.text(`Documentation: ${preview.documentation}`);\n }\n\n if (preview.examples && preview.examples.length > 0) {\n output.text('');\n output.text(`Examples: ${preview.examples.length} example(s) provided`);\n }\n\n output.divider();\n output.text('');\n output.info('This is how your tool will appear on tpmjs.com');\n output.text('Run `tpm tool validate` to check for issues before publishing');\n }\n\n private determineTier(tpmjs: Record<string, unknown>): string {\n // Rich tier requires: tools array with schemas, examples, documentation\n const hasTools = Array.isArray(tpmjs.tools) && tpmjs.tools.length > 0;\n const hasExamples = Array.isArray(tpmjs.examples) && tpmjs.examples.length > 0;\n const hasDocumentation = Boolean(tpmjs.documentation);\n\n if (hasTools && hasExamples && hasDocumentation) {\n return 'rich';\n }\n return 'minimal';\n }\n\n private generateSlug(name: string): string {\n return name\n .toLowerCase()\n .replace(/@/g, '')\n .replace(/\\//g, '-')\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n }\n\n private extractAuthor(packageJson: Record<string, unknown>): string | undefined {\n const author = packageJson.author;\n if (typeof author === 'string') {\n return author;\n }\n if (author && typeof author === 'object') {\n const authorObj = author as Record<string, string>;\n return authorObj.name || authorObj.email;\n }\n return undefined;\n }\n\n private extractRepo(packageJson: Record<string, unknown>): string | undefined {\n const repo = packageJson.repository;\n if (typeof repo === 'string') {\n return repo;\n }\n if (repo && typeof repo === 'object') {\n return (repo as Record<string, string>).url;\n }\n return undefined;\n }\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import * as _oclif_core_interfaces from '@oclif/core/interfaces';
2
+ import { Command } from '@oclif/core';
3
+
4
+ declare class Run extends Command {
5
+ static description: string;
6
+ static examples: {
7
+ description: string;
8
+ command: string;
9
+ }[];
10
+ static flags: {
11
+ collection: _oclif_core_interfaces.OptionFlag<string, _oclif_core_interfaces.CustomOptions>;
12
+ tool: _oclif_core_interfaces.OptionFlag<string, _oclif_core_interfaces.CustomOptions>;
13
+ args: _oclif_core_interfaces.OptionFlag<string, _oclif_core_interfaces.CustomOptions>;
14
+ env: _oclif_core_interfaces.OptionFlag<string[] | undefined, _oclif_core_interfaces.CustomOptions>;
15
+ json: _oclif_core_interfaces.BooleanFlag<boolean>;
16
+ verbose: _oclif_core_interfaces.BooleanFlag<boolean>;
17
+ timeout: _oclif_core_interfaces.OptionFlag<number, _oclif_core_interfaces.CustomOptions>;
18
+ };
19
+ run(): Promise<void>;
20
+ private executeToolCall;
21
+ private handleResult;
22
+ }
23
+
24
+ export { Run as default };
@@ -0,0 +1,454 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import * as fs from 'fs';
3
+ import * as os from 'os';
4
+ import * as path from 'path';
5
+ import Conf from 'conf';
6
+ import Table from 'cli-table3';
7
+ import ora from 'ora';
8
+ import pc from 'picocolors';
9
+
10
+ // src/commands/run.ts
11
+ var CONFIG_DIR = path.join(os.homedir(), ".tpmjs");
12
+ var CREDENTIALS_FILE = path.join(CONFIG_DIR, "credentials.json");
13
+ path.join(CONFIG_DIR, "history");
14
+ function ensureConfigDir() {
15
+ if (!fs.existsSync(CONFIG_DIR)) {
16
+ fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 448 });
17
+ }
18
+ }
19
+ var configStore = new Conf({
20
+ projectName: "tpmjs",
21
+ cwd: CONFIG_DIR,
22
+ configName: "config",
23
+ defaults: {
24
+ apiUrl: "https://tpmjs.com/api",
25
+ defaultOutput: "human",
26
+ verbose: false,
27
+ analytics: false
28
+ }
29
+ });
30
+ function getConfigValue(key) {
31
+ return configStore.get(key);
32
+ }
33
+ function loadCredentials() {
34
+ ensureConfigDir();
35
+ if (!fs.existsSync(CREDENTIALS_FILE)) {
36
+ return null;
37
+ }
38
+ try {
39
+ const content = fs.readFileSync(CREDENTIALS_FILE, "utf-8");
40
+ return JSON.parse(content);
41
+ } catch {
42
+ return null;
43
+ }
44
+ }
45
+ function getApiKey() {
46
+ if (process.env.TPMJS_API_KEY) {
47
+ return process.env.TPMJS_API_KEY;
48
+ }
49
+ const creds = loadCredentials();
50
+ if (creds?.apiKey) {
51
+ return creds.apiKey;
52
+ }
53
+ return void 0;
54
+ }
55
+ function getApiUrl() {
56
+ return process.env.TPMJS_API_URL ?? getConfigValue("apiUrl") ?? "https://tpmjs.com/api";
57
+ }
58
+ var OutputFormatter = class {
59
+ options;
60
+ constructor(options = {}) {
61
+ this.options = options;
62
+ }
63
+ // Output as JSON
64
+ json(data) {
65
+ console.log(JSON.stringify(data, null, 2));
66
+ }
67
+ // Output a table
68
+ table(data, columns) {
69
+ if (this.options.json) {
70
+ this.json(data);
71
+ return;
72
+ }
73
+ const table = new Table({
74
+ head: columns.map((col) => pc.bold(col.header)),
75
+ colWidths: columns.map((col) => col.width ?? null),
76
+ style: {
77
+ head: [],
78
+ border: []
79
+ }
80
+ });
81
+ for (const row of data) {
82
+ table.push(columns.map((col) => String(row[col.key] ?? "")));
83
+ }
84
+ console.log(table.toString());
85
+ }
86
+ // Success message
87
+ success(message) {
88
+ if (this.options.json) return;
89
+ console.log(pc.green("\u2713"), message);
90
+ }
91
+ // Error message
92
+ error(message, details) {
93
+ if (this.options.json) {
94
+ this.json({ error: message, details });
95
+ return;
96
+ }
97
+ console.error(pc.red("\u2717"), message);
98
+ if (details && this.options.verbose) {
99
+ console.error(pc.dim(details));
100
+ }
101
+ }
102
+ // Warning message
103
+ warning(message) {
104
+ if (this.options.json) return;
105
+ console.log(pc.yellow("\u26A0"), message);
106
+ }
107
+ // Info message
108
+ info(message) {
109
+ if (this.options.json) return;
110
+ console.log(pc.blue("\u2139"), message);
111
+ }
112
+ // Debug message (only in verbose mode)
113
+ debug(message) {
114
+ if (this.options.json) return;
115
+ if (this.options.verbose) {
116
+ console.log(pc.dim(`[debug] ${message}`));
117
+ }
118
+ }
119
+ // Plain text output
120
+ text(message) {
121
+ if (this.options.json) return;
122
+ console.log(message);
123
+ }
124
+ // Heading
125
+ heading(text) {
126
+ if (this.options.json) return;
127
+ console.log();
128
+ console.log(pc.bold(pc.underline(text)));
129
+ console.log();
130
+ }
131
+ // Subheading
132
+ subheading(text) {
133
+ if (this.options.json) return;
134
+ console.log(pc.bold(text));
135
+ }
136
+ // Key-value pair
137
+ keyValue(key, value) {
138
+ if (this.options.json) return;
139
+ console.log(`${pc.dim(`${key}:`)} ${value ?? pc.dim("(not set)")}`);
140
+ }
141
+ // List item
142
+ listItem(text, indent = 0) {
143
+ if (this.options.json) return;
144
+ const prefix = `${" ".repeat(indent)}\u2022`;
145
+ console.log(`${prefix} ${text}`);
146
+ }
147
+ // Spinner
148
+ spinner(message) {
149
+ return ora({
150
+ text: message,
151
+ isSilent: this.options.json
152
+ }).start();
153
+ }
154
+ // Blank line
155
+ newLine() {
156
+ if (this.options.json) return;
157
+ console.log();
158
+ }
159
+ // Horizontal rule
160
+ hr() {
161
+ if (this.options.json) return;
162
+ console.log(pc.dim("\u2500".repeat(50)));
163
+ }
164
+ // Alias for hr
165
+ divider() {
166
+ this.hr();
167
+ }
168
+ // Code block
169
+ code(text, language) {
170
+ if (this.options.json) {
171
+ this.json({ code: text, language });
172
+ return;
173
+ }
174
+ console.log(pc.dim(`\`\`\`${language ?? ""}`));
175
+ console.log(text);
176
+ console.log(pc.dim("```"));
177
+ }
178
+ // Highlight text
179
+ highlight(text) {
180
+ return pc.cyan(text);
181
+ }
182
+ // Dim text
183
+ dim(text) {
184
+ return pc.dim(text);
185
+ }
186
+ // Bold text
187
+ bold(text) {
188
+ return pc.bold(text);
189
+ }
190
+ // Link (just returns text in terminal)
191
+ link(text, url) {
192
+ return `\x1B]8;;${url}\x07${pc.underline(pc.blue(text))}\x1B]8;;\x07`;
193
+ }
194
+ // Color helpers
195
+ green(text) {
196
+ return pc.green(text);
197
+ }
198
+ red(text) {
199
+ return pc.red(text);
200
+ }
201
+ yellow(text) {
202
+ return pc.yellow(text);
203
+ }
204
+ blue(text) {
205
+ return pc.blue(text);
206
+ }
207
+ cyan(text) {
208
+ return pc.cyan(text);
209
+ }
210
+ };
211
+ function createOutput(flags) {
212
+ return new OutputFormatter({
213
+ json: flags.json,
214
+ verbose: flags.verbose
215
+ });
216
+ }
217
+
218
+ // src/commands/run.ts
219
+ function parseCollection(collection) {
220
+ const parts = collection.split("/");
221
+ if (parts.length !== 2) return null;
222
+ const [username, slug] = parts;
223
+ if (!username || !slug) return null;
224
+ return { username, slug };
225
+ }
226
+ function parseToolArgs(argsStr) {
227
+ try {
228
+ return JSON.parse(argsStr);
229
+ } catch {
230
+ return null;
231
+ }
232
+ }
233
+ function buildEnvVars(envFlags, output) {
234
+ const envVars = {};
235
+ for (const [key, value] of Object.entries(process.env)) {
236
+ if (value && (key.endsWith("_API_KEY") || key.endsWith("_TOKEN") || key.endsWith("_SECRET"))) {
237
+ envVars[key] = value;
238
+ }
239
+ }
240
+ if (envFlags) {
241
+ for (const envPair of envFlags) {
242
+ const [key, ...valueParts] = envPair.split("=");
243
+ if (key && valueParts.length > 0) {
244
+ envVars[key] = valueParts.join("=");
245
+ } else {
246
+ output.warning(`Invalid env var format: ${envPair}. Use: KEY=value`);
247
+ }
248
+ }
249
+ }
250
+ return envVars;
251
+ }
252
+ function displayVerboseInfo(output, mcpUrl, tool, toolArgs, envVars) {
253
+ output.info(`MCP Endpoint: ${mcpUrl}`);
254
+ output.info(`Tool: ${tool}`);
255
+ output.info(`Arguments: ${JSON.stringify(toolArgs, null, 2)}`);
256
+ if (Object.keys(envVars).length > 0) {
257
+ output.info(`Environment: ${Object.keys(envVars).join(", ")}`);
258
+ }
259
+ output.divider();
260
+ }
261
+ async function handleHttpError(response, output) {
262
+ const errorText = await response.text();
263
+ try {
264
+ const errorJson = JSON.parse(errorText);
265
+ output.error(errorJson.error?.message || errorJson.message || `HTTP ${response.status}`);
266
+ } catch {
267
+ output.error(`HTTP ${response.status}: ${errorText}`);
268
+ }
269
+ }
270
+ function displayContent(result, output) {
271
+ if (!result) {
272
+ output.text("(empty result)");
273
+ return;
274
+ }
275
+ if (result.content && Array.isArray(result.content)) {
276
+ for (const item of result.content) {
277
+ displayContentItem(item, output);
278
+ }
279
+ } else {
280
+ output.text(JSON.stringify(result, null, 2));
281
+ }
282
+ }
283
+ function displayContentItem(item, output) {
284
+ if (item.type === "text") {
285
+ try {
286
+ const parsed = JSON.parse(item.text);
287
+ output.text(JSON.stringify(parsed, null, 2));
288
+ } catch {
289
+ output.text(item.text);
290
+ }
291
+ } else if (item.type === "image") {
292
+ output.info("[Image content]");
293
+ } else {
294
+ output.text(JSON.stringify(item, null, 2));
295
+ }
296
+ }
297
+ function handleExecutionError(error, flags, output) {
298
+ if (error instanceof Error) {
299
+ if (error.name === "AbortError") {
300
+ output.error(`Request timed out after ${flags.timeout} seconds`);
301
+ } else {
302
+ output.error(error.message);
303
+ }
304
+ } else {
305
+ output.error("Unknown error occurred");
306
+ }
307
+ if (flags.verbose) {
308
+ output.info(`Full error: ${String(error)}`);
309
+ }
310
+ }
311
+ var Run = class _Run extends Command {
312
+ static description = "Execute a tool from a collection via MCP";
313
+ static examples = [
314
+ {
315
+ description: "First, list all tools in a collection",
316
+ command: "<%= config.bin %> collection info ajax/unsandbox"
317
+ },
318
+ {
319
+ description: "Execute Python code in the unsandbox collection",
320
+ command: `<%= config.bin %> run -c ajax/unsandbox -t unsandbox--execute --args '{"language":"python","code":"print(42)"}'`
321
+ },
322
+ {
323
+ description: "Pass environment variables for tool authentication",
324
+ command: `<%= config.bin %> run -c ajax/unsandbox -t unsandbox--execute -e UNSANDBOX_PUBLIC_KEY=xxx -e UNSANDBOX_SECRET_KEY=xxx --args '{"language":"python","code":"print(1)"}'`
325
+ },
326
+ {
327
+ description: "Output result as JSON",
328
+ command: `<%= config.bin %> run -c ajax/tools -t search --args '{"query":"test"}' --json`
329
+ },
330
+ {
331
+ description: "Show verbose output for debugging",
332
+ command: "<%= config.bin %> run -c ajax/unsandbox -t unsandbox--healthCheck --args '{}' -v"
333
+ }
334
+ ];
335
+ static flags = {
336
+ collection: Flags.string({
337
+ char: "c",
338
+ description: "Collection identifier (username/slug)",
339
+ required: true
340
+ }),
341
+ tool: Flags.string({
342
+ char: "t",
343
+ description: "Tool name (MCP format: package--toolName)",
344
+ required: true
345
+ }),
346
+ args: Flags.string({
347
+ char: "a",
348
+ description: "Tool arguments as JSON string",
349
+ default: "{}"
350
+ }),
351
+ env: Flags.string({
352
+ char: "e",
353
+ description: "Environment variables (key=value)",
354
+ multiple: true
355
+ }),
356
+ json: Flags.boolean({
357
+ description: "Output result as JSON",
358
+ default: false
359
+ }),
360
+ verbose: Flags.boolean({
361
+ char: "v",
362
+ description: "Show verbose output",
363
+ default: false
364
+ }),
365
+ timeout: Flags.integer({
366
+ description: "Request timeout in seconds",
367
+ default: 60
368
+ })
369
+ };
370
+ async run() {
371
+ const { flags } = await this.parse(_Run);
372
+ const output = createOutput(flags);
373
+ const collection = parseCollection(flags.collection);
374
+ if (!collection) {
375
+ output.error("Invalid collection format. Use: username/slug");
376
+ return;
377
+ }
378
+ const toolArgs = parseToolArgs(flags.args);
379
+ if (!toolArgs) {
380
+ output.error("Invalid JSON in --args flag");
381
+ return;
382
+ }
383
+ const envVars = buildEnvVars(flags.env, output);
384
+ const baseUrl = getApiUrl().replace(/\/api$/, "");
385
+ const mcpUrl = `${baseUrl}/api/mcp/${collection.username}/${collection.slug}/http`;
386
+ const apiKey = getApiKey();
387
+ if (!apiKey) {
388
+ output.warning("No API key configured. Some operations may fail.");
389
+ output.warning("Run `tpm auth login` to authenticate.");
390
+ }
391
+ if (flags.verbose) {
392
+ displayVerboseInfo(output, mcpUrl, flags.tool, toolArgs, envVars);
393
+ }
394
+ await this.executeToolCall(flags, output, mcpUrl, apiKey, toolArgs, envVars);
395
+ }
396
+ async executeToolCall(flags, output, mcpUrl, apiKey, toolArgs, envVars) {
397
+ const jsonRpcRequest = {
398
+ jsonrpc: "2.0",
399
+ id: Date.now(),
400
+ method: "tools/call",
401
+ params: {
402
+ name: flags.tool,
403
+ arguments: toolArgs,
404
+ ...Object.keys(envVars).length > 0 ? { env: envVars } : {}
405
+ }
406
+ };
407
+ const spinner = output.spinner(`Executing ${flags.tool}...`);
408
+ try {
409
+ const controller = new AbortController();
410
+ const timeoutId = setTimeout(() => controller.abort(), flags.timeout * 1e3);
411
+ const response = await fetch(mcpUrl, {
412
+ method: "POST",
413
+ headers: {
414
+ "Content-Type": "application/json",
415
+ ...apiKey ? { Authorization: `Bearer ${apiKey}` } : {}
416
+ },
417
+ body: JSON.stringify(jsonRpcRequest),
418
+ signal: controller.signal
419
+ });
420
+ clearTimeout(timeoutId);
421
+ if (!response.ok) {
422
+ spinner.fail("Request failed");
423
+ await handleHttpError(response, output);
424
+ return;
425
+ }
426
+ const result = await response.json();
427
+ spinner.stop();
428
+ this.handleResult(flags, output, result);
429
+ } catch (error) {
430
+ spinner.fail("Execution failed");
431
+ handleExecutionError(error, flags, output);
432
+ }
433
+ }
434
+ handleResult(flags, output, result) {
435
+ if (result.error) {
436
+ output.error(`Tool execution failed: ${result.error.message}`);
437
+ if (flags.verbose && result.error.data) {
438
+ output.info(`Error data: ${JSON.stringify(result.error.data, null, 2)}`);
439
+ }
440
+ return;
441
+ }
442
+ if (flags.json) {
443
+ output.json(result.result);
444
+ return;
445
+ }
446
+ output.success("Tool execution complete");
447
+ output.divider();
448
+ displayContent(result.result, output);
449
+ }
450
+ };
451
+
452
+ export { Run as default };
453
+ //# sourceMappingURL=run.js.map
454
+ //# sourceMappingURL=run.js.map