@tpmjs/cli 0.1.0

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 (97) hide show
  1. package/README.md +127 -0
  2. package/bin/run.js +5 -0
  3. package/dist/commands/agent/chat.d.ts +23 -0
  4. package/dist/commands/agent/chat.js +608 -0
  5. package/dist/commands/agent/chat.js.map +1 -0
  6. package/dist/commands/agent/create.d.ts +22 -0
  7. package/dist/commands/agent/create.js +549 -0
  8. package/dist/commands/agent/create.js.map +1 -0
  9. package/dist/commands/agent/delete.d.ts +19 -0
  10. package/dist/commands/agent/delete.js +529 -0
  11. package/dist/commands/agent/delete.js.map +1 -0
  12. package/dist/commands/agent/list.d.ts +16 -0
  13. package/dist/commands/agent/list.js +535 -0
  14. package/dist/commands/agent/list.js.map +1 -0
  15. package/dist/commands/agent/update.d.ts +25 -0
  16. package/dist/commands/agent/update.js +547 -0
  17. package/dist/commands/agent/update.js.map +1 -0
  18. package/dist/commands/auth/login.d.ts +21 -0
  19. package/dist/commands/auth/login.js +603 -0
  20. package/dist/commands/auth/login.js.map +1 -0
  21. package/dist/commands/auth/logout.d.ts +13 -0
  22. package/dist/commands/auth/logout.js +227 -0
  23. package/dist/commands/auth/logout.js.map +1 -0
  24. package/dist/commands/auth/status.d.ts +14 -0
  25. package/dist/commands/auth/status.js +542 -0
  26. package/dist/commands/auth/status.js.map +1 -0
  27. package/dist/commands/auth/whoami.d.ts +14 -0
  28. package/dist/commands/auth/whoami.js +500 -0
  29. package/dist/commands/auth/whoami.js.map +1 -0
  30. package/dist/commands/collection/add.d.ts +18 -0
  31. package/dist/commands/collection/add.js +509 -0
  32. package/dist/commands/collection/add.js.map +1 -0
  33. package/dist/commands/collection/create.d.ts +17 -0
  34. package/dist/commands/collection/create.js +521 -0
  35. package/dist/commands/collection/create.js.map +1 -0
  36. package/dist/commands/collection/delete.d.ts +19 -0
  37. package/dist/commands/collection/delete.js +531 -0
  38. package/dist/commands/collection/delete.js.map +1 -0
  39. package/dist/commands/collection/import.d.ts +18 -0
  40. package/dist/commands/collection/import.js +546 -0
  41. package/dist/commands/collection/import.js.map +1 -0
  42. package/dist/commands/collection/list.d.ts +16 -0
  43. package/dist/commands/collection/list.js +531 -0
  44. package/dist/commands/collection/list.js.map +1 -0
  45. package/dist/commands/collection/remove.d.ts +18 -0
  46. package/dist/commands/collection/remove.js +501 -0
  47. package/dist/commands/collection/remove.js.map +1 -0
  48. package/dist/commands/collection/update.d.ts +20 -0
  49. package/dist/commands/collection/update.js +522 -0
  50. package/dist/commands/collection/update.js.map +1 -0
  51. package/dist/commands/doctor.d.ts +14 -0
  52. package/dist/commands/doctor.js +592 -0
  53. package/dist/commands/doctor.js.map +1 -0
  54. package/dist/commands/mcp/config.d.ts +19 -0
  55. package/dist/commands/mcp/config.js +265 -0
  56. package/dist/commands/mcp/config.js.map +1 -0
  57. package/dist/commands/mcp/serve.d.ts +23 -0
  58. package/dist/commands/mcp/serve.js +689 -0
  59. package/dist/commands/mcp/serve.js.map +1 -0
  60. package/dist/commands/playground.d.ts +23 -0
  61. package/dist/commands/playground.js +666 -0
  62. package/dist/commands/playground.js.map +1 -0
  63. package/dist/commands/publish/check.d.ts +17 -0
  64. package/dist/commands/publish/check.js +544 -0
  65. package/dist/commands/publish/check.js.map +1 -0
  66. package/dist/commands/publish/preview.d.ts +19 -0
  67. package/dist/commands/publish/preview.js +291 -0
  68. package/dist/commands/publish/preview.js.map +1 -0
  69. package/dist/commands/tool/execute.d.ts +21 -0
  70. package/dist/commands/tool/execute.js +574 -0
  71. package/dist/commands/tool/execute.js.map +1 -0
  72. package/dist/commands/tool/info.d.ts +18 -0
  73. package/dist/commands/tool/info.js +537 -0
  74. package/dist/commands/tool/info.js.map +1 -0
  75. package/dist/commands/tool/init.d.ts +24 -0
  76. package/dist/commands/tool/init.js +461 -0
  77. package/dist/commands/tool/init.js.map +1 -0
  78. package/dist/commands/tool/search.d.ts +20 -0
  79. package/dist/commands/tool/search.js +566 -0
  80. package/dist/commands/tool/search.js.map +1 -0
  81. package/dist/commands/tool/trending.d.ts +15 -0
  82. package/dist/commands/tool/trending.js +523 -0
  83. package/dist/commands/tool/trending.js.map +1 -0
  84. package/dist/commands/tool/validate.d.ts +15 -0
  85. package/dist/commands/tool/validate.js +555 -0
  86. package/dist/commands/tool/validate.js.map +1 -0
  87. package/dist/commands/update.d.ts +15 -0
  88. package/dist/commands/update.js +228 -0
  89. package/dist/commands/update.js.map +1 -0
  90. package/dist/hooks/init.d.ts +5 -0
  91. package/dist/hooks/init.js +8 -0
  92. package/dist/hooks/init.js.map +1 -0
  93. package/dist/index.d.ts +262 -0
  94. package/dist/index.js +473 -0
  95. package/dist/index.js.map +1 -0
  96. package/oclif.manifest.json +1699 -0
  97. package/package.json +104 -0
@@ -0,0 +1,461 @@
1
+ import { Command, Flags, Args } from '@oclif/core';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import * as readline from 'readline';
5
+ import Table from 'cli-table3';
6
+ import ora from 'ora';
7
+ import pc from 'picocolors';
8
+
9
+ // src/commands/tool/init.ts
10
+ var OutputFormatter = class {
11
+ options;
12
+ constructor(options = {}) {
13
+ this.options = options;
14
+ }
15
+ // Output as JSON
16
+ json(data) {
17
+ console.log(JSON.stringify(data, null, 2));
18
+ }
19
+ // Output a table
20
+ table(data, columns) {
21
+ if (this.options.json) {
22
+ this.json(data);
23
+ return;
24
+ }
25
+ const table = new Table({
26
+ head: columns.map((col) => pc.bold(col.header)),
27
+ colWidths: columns.map((col) => col.width ?? null),
28
+ style: {
29
+ head: [],
30
+ border: []
31
+ }
32
+ });
33
+ for (const row of data) {
34
+ table.push(columns.map((col) => String(row[col.key] ?? "")));
35
+ }
36
+ console.log(table.toString());
37
+ }
38
+ // Success message
39
+ success(message) {
40
+ if (this.options.json) return;
41
+ console.log(pc.green("\u2713"), message);
42
+ }
43
+ // Error message
44
+ error(message, details) {
45
+ if (this.options.json) {
46
+ this.json({ error: message, details });
47
+ return;
48
+ }
49
+ console.error(pc.red("\u2717"), message);
50
+ if (details && this.options.verbose) {
51
+ console.error(pc.dim(details));
52
+ }
53
+ }
54
+ // Warning message
55
+ warning(message) {
56
+ if (this.options.json) return;
57
+ console.log(pc.yellow("\u26A0"), message);
58
+ }
59
+ // Info message
60
+ info(message) {
61
+ if (this.options.json) return;
62
+ console.log(pc.blue("\u2139"), message);
63
+ }
64
+ // Debug message (only in verbose mode)
65
+ debug(message) {
66
+ if (this.options.json) return;
67
+ if (this.options.verbose) {
68
+ console.log(pc.dim(`[debug] ${message}`));
69
+ }
70
+ }
71
+ // Plain text output
72
+ text(message) {
73
+ if (this.options.json) return;
74
+ console.log(message);
75
+ }
76
+ // Heading
77
+ heading(text) {
78
+ if (this.options.json) return;
79
+ console.log();
80
+ console.log(pc.bold(pc.underline(text)));
81
+ console.log();
82
+ }
83
+ // Subheading
84
+ subheading(text) {
85
+ if (this.options.json) return;
86
+ console.log(pc.bold(text));
87
+ }
88
+ // Key-value pair
89
+ keyValue(key, value) {
90
+ if (this.options.json) return;
91
+ console.log(`${pc.dim(key + ":")} ${value ?? pc.dim("(not set)")}`);
92
+ }
93
+ // List item
94
+ listItem(text, indent = 0) {
95
+ if (this.options.json) return;
96
+ const prefix = " ".repeat(indent) + "\u2022";
97
+ console.log(`${prefix} ${text}`);
98
+ }
99
+ // Spinner
100
+ spinner(message) {
101
+ return ora({
102
+ text: message,
103
+ isSilent: this.options.json
104
+ }).start();
105
+ }
106
+ // Blank line
107
+ newLine() {
108
+ if (this.options.json) return;
109
+ console.log();
110
+ }
111
+ // Horizontal rule
112
+ hr() {
113
+ if (this.options.json) return;
114
+ console.log(pc.dim("\u2500".repeat(50)));
115
+ }
116
+ // Alias for hr
117
+ divider() {
118
+ this.hr();
119
+ }
120
+ // Code block
121
+ code(text, language) {
122
+ if (this.options.json) {
123
+ this.json({ code: text, language });
124
+ return;
125
+ }
126
+ console.log(pc.dim("```" + (language ?? "")));
127
+ console.log(text);
128
+ console.log(pc.dim("```"));
129
+ }
130
+ // Highlight text
131
+ highlight(text) {
132
+ return pc.cyan(text);
133
+ }
134
+ // Dim text
135
+ dim(text) {
136
+ return pc.dim(text);
137
+ }
138
+ // Bold text
139
+ bold(text) {
140
+ return pc.bold(text);
141
+ }
142
+ // Link (just returns text in terminal)
143
+ link(text, url) {
144
+ return `\x1B]8;;${url}\x07${pc.underline(pc.blue(text))}\x1B]8;;\x07`;
145
+ }
146
+ };
147
+ function createOutput(flags) {
148
+ return new OutputFormatter({
149
+ json: flags.json,
150
+ verbose: flags.verbose
151
+ });
152
+ }
153
+
154
+ // src/commands/tool/init.ts
155
+ var CATEGORIES = [
156
+ "research",
157
+ "web",
158
+ "data",
159
+ "documentation",
160
+ "engineering",
161
+ "security",
162
+ "statistics",
163
+ "ops",
164
+ "agent",
165
+ "sandbox",
166
+ "utilities",
167
+ "html",
168
+ "compliance"
169
+ ];
170
+ var ToolInit = class _ToolInit extends Command {
171
+ static description = "Initialize a new TPMJS tool package";
172
+ static examples = [
173
+ "<%= config.bin %> <%= command.id %>",
174
+ "<%= config.bin %> <%= command.id %> my-tool",
175
+ "<%= config.bin %> <%= command.id %> --template minimal"
176
+ ];
177
+ static flags = {
178
+ template: Flags.string({
179
+ char: "t",
180
+ description: "Template to use",
181
+ options: ["minimal", "rich"],
182
+ default: "minimal"
183
+ }),
184
+ category: Flags.string({
185
+ char: "c",
186
+ description: "Tool category",
187
+ options: CATEGORIES
188
+ }),
189
+ force: Flags.boolean({
190
+ char: "f",
191
+ description: "Overwrite existing files",
192
+ default: false
193
+ }),
194
+ yes: Flags.boolean({
195
+ char: "y",
196
+ description: "Skip prompts and use defaults",
197
+ default: false
198
+ }),
199
+ verbose: Flags.boolean({
200
+ char: "v",
201
+ description: "Show verbose output",
202
+ default: false
203
+ })
204
+ };
205
+ static args = {
206
+ name: Args.string({
207
+ description: "Tool name (creates directory if not exists)",
208
+ required: false
209
+ })
210
+ };
211
+ rl;
212
+ async run() {
213
+ const { args, flags } = await this.parse(_ToolInit);
214
+ const output = createOutput(flags);
215
+ this.rl = readline.createInterface({
216
+ input: process.stdin,
217
+ output: process.stdout
218
+ });
219
+ try {
220
+ const config = await this.gatherConfig(args.name, flags, output);
221
+ const targetDir = config.name ? path.resolve(config.name) : process.cwd();
222
+ const packageJsonPath = path.join(targetDir, "package.json");
223
+ if (fs.existsSync(packageJsonPath) && !flags.force) {
224
+ output.error("package.json already exists. Use --force to overwrite.");
225
+ return;
226
+ }
227
+ if (!fs.existsSync(targetDir)) {
228
+ fs.mkdirSync(targetDir, { recursive: true });
229
+ }
230
+ await this.generateFiles(targetDir, config, flags.template, output);
231
+ output.success("TPMJS tool initialized successfully!");
232
+ output.text("");
233
+ output.text("Next steps:");
234
+ output.listItem("Install dependencies: npm install");
235
+ output.listItem("Implement your tool in src/index.ts");
236
+ output.listItem("Validate: tpm tool validate");
237
+ output.listItem("Build: npm run build");
238
+ output.listItem("Publish: npm publish");
239
+ } finally {
240
+ this.rl?.close();
241
+ }
242
+ }
243
+ async gatherConfig(name, flags, output) {
244
+ if (flags.yes) {
245
+ return {
246
+ name: name || "my-tpmjs-tool",
247
+ description: "A TPMJS tool",
248
+ category: flags.category || "utilities",
249
+ author: process.env.USER || "unknown"
250
+ };
251
+ }
252
+ output.heading("TPMJS Tool Initialization");
253
+ output.text("");
254
+ const toolName = name || await this.prompt("Tool name: ") || "my-tpmjs-tool";
255
+ const description = await this.prompt("Description: ") || "A TPMJS tool";
256
+ let category = flags.category;
257
+ if (!category) {
258
+ output.text("");
259
+ output.text("Available categories:");
260
+ CATEGORIES.forEach((cat, i) => {
261
+ output.text(` ${i + 1}. ${cat}`);
262
+ });
263
+ const catIndex = await this.prompt("Category (number or name): ");
264
+ const index = parseInt(catIndex, 10);
265
+ if (index > 0 && index <= CATEGORIES.length) {
266
+ category = CATEGORIES[index - 1];
267
+ } else if (CATEGORIES.includes(catIndex)) {
268
+ category = catIndex;
269
+ } else {
270
+ category = "utilities";
271
+ }
272
+ }
273
+ const author = await this.prompt(`Author (${process.env.USER}): `) || process.env.USER || "unknown";
274
+ return { name: toolName, description, category: category ?? "utilities", author };
275
+ }
276
+ prompt(question) {
277
+ return new Promise((resolve2) => {
278
+ this.rl?.question(question, (answer) => {
279
+ resolve2(answer.trim());
280
+ });
281
+ });
282
+ }
283
+ async generateFiles(targetDir, config, template, output) {
284
+ const spinner = output.spinner("Generating files...");
285
+ const packageJson = {
286
+ name: config.name.startsWith("@") ? config.name : config.name,
287
+ version: "0.1.0",
288
+ description: config.description,
289
+ type: "module",
290
+ main: "./dist/index.js",
291
+ types: "./dist/index.d.ts",
292
+ exports: {
293
+ ".": {
294
+ import: "./dist/index.js",
295
+ types: "./dist/index.d.ts"
296
+ }
297
+ },
298
+ files: ["dist"],
299
+ keywords: ["tpmjs", "mcp", "ai-tools", config.category],
300
+ author: config.author,
301
+ license: "MIT",
302
+ scripts: {
303
+ build: "tsup",
304
+ dev: "tsup --watch",
305
+ "type-check": "tsc --noEmit",
306
+ prepublishOnly: "npm run build"
307
+ },
308
+ dependencies: {
309
+ ai: "^4.0.0"
310
+ },
311
+ devDependencies: {
312
+ "@types/node": "^20.0.0",
313
+ tsup: "^8.0.0",
314
+ typescript: "^5.0.0"
315
+ },
316
+ tpmjs: {
317
+ name: config.name.replace(/@[^/]+\//, "").replace(/-/g, " "),
318
+ description: config.description,
319
+ category: config.category,
320
+ tools: [
321
+ {
322
+ name: "myTool",
323
+ description: "Description of what this tool does"
324
+ }
325
+ ],
326
+ ...template === "rich" ? {
327
+ documentation: "https://github.com/yourname/" + config.name + "#readme",
328
+ examples: [
329
+ {
330
+ title: "Basic usage",
331
+ code: 'const result = await myTool.execute({ input: "hello" });'
332
+ }
333
+ ]
334
+ } : {}
335
+ }
336
+ };
337
+ fs.writeFileSync(
338
+ path.join(targetDir, "package.json"),
339
+ JSON.stringify(packageJson, null, 2)
340
+ );
341
+ const tsconfig = {
342
+ compilerOptions: {
343
+ target: "ES2022",
344
+ module: "ESNext",
345
+ moduleResolution: "bundler",
346
+ declaration: true,
347
+ declarationMap: true,
348
+ strict: true,
349
+ esModuleInterop: true,
350
+ skipLibCheck: true,
351
+ outDir: "./dist",
352
+ rootDir: "./src"
353
+ },
354
+ include: ["src"],
355
+ exclude: ["node_modules", "dist"]
356
+ };
357
+ fs.writeFileSync(
358
+ path.join(targetDir, "tsconfig.json"),
359
+ JSON.stringify(tsconfig, null, 2)
360
+ );
361
+ const tsupConfig = `import { defineConfig } from 'tsup';
362
+
363
+ export default defineConfig({
364
+ entry: ['src/index.ts'],
365
+ format: ['esm'],
366
+ dts: true,
367
+ clean: true,
368
+ sourcemap: true,
369
+ });
370
+ `;
371
+ fs.writeFileSync(path.join(targetDir, "tsup.config.ts"), tsupConfig);
372
+ const srcDir = path.join(targetDir, "src");
373
+ if (!fs.existsSync(srcDir)) {
374
+ fs.mkdirSync(srcDir, { recursive: true });
375
+ }
376
+ const indexTs = `import { jsonSchema, tool } from 'ai';
377
+
378
+ /**
379
+ * ${config.description}
380
+ */
381
+ export const myTool = tool({
382
+ description: '${config.description}',
383
+ parameters: jsonSchema<{ input: string }>({
384
+ type: 'object',
385
+ properties: {
386
+ input: {
387
+ type: 'string',
388
+ description: 'The input to process',
389
+ },
390
+ },
391
+ required: ['input'],
392
+ }),
393
+ async execute({ input }) {
394
+ // TODO: Implement your tool logic here
395
+ return {
396
+ result: \`Processed: \${input}\`,
397
+ };
398
+ },
399
+ });
400
+
401
+ export default myTool;
402
+ `;
403
+ fs.writeFileSync(path.join(srcDir, "index.ts"), indexTs);
404
+ const blockTs = `import { myTool } from './src/index.js';
405
+
406
+ export const block = {
407
+ name: '${config.name}',
408
+ tools: { myTool },
409
+ };
410
+ `;
411
+ fs.writeFileSync(path.join(targetDir, "block.ts"), blockTs);
412
+ const readme = `# ${config.name}
413
+
414
+ ${config.description}
415
+
416
+ ## Installation
417
+
418
+ \`\`\`bash
419
+ npm install ${config.name}
420
+ \`\`\`
421
+
422
+ ## Usage
423
+
424
+ \`\`\`typescript
425
+ import { myTool } from '${config.name}';
426
+
427
+ const result = await myTool.execute({ input: 'hello' });
428
+ console.log(result);
429
+ \`\`\`
430
+
431
+ ## Category
432
+
433
+ ${config.category}
434
+
435
+ ## License
436
+
437
+ MIT
438
+ `;
439
+ fs.writeFileSync(path.join(targetDir, "README.md"), readme);
440
+ const gitignore = `node_modules/
441
+ dist/
442
+ *.log
443
+ .DS_Store
444
+ `;
445
+ fs.writeFileSync(path.join(targetDir, ".gitignore"), gitignore);
446
+ spinner.stop();
447
+ output.text("");
448
+ output.text("Files created:");
449
+ output.listItem("package.json");
450
+ output.listItem("tsconfig.json");
451
+ output.listItem("tsup.config.ts");
452
+ output.listItem("src/index.ts");
453
+ output.listItem("block.ts");
454
+ output.listItem("README.md");
455
+ output.listItem(".gitignore");
456
+ }
457
+ };
458
+
459
+ export { ToolInit as default };
460
+ //# sourceMappingURL=init.js.map
461
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/output.ts","../../../src/commands/tool/init.ts"],"names":["resolve"],"mappings":"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","file":"init.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\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 { Args, Command, Flags } from '@oclif/core';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as readline from 'node:readline';\nimport { createOutput } from '../../lib/output.js';\n\nconst CATEGORIES = [\n 'research',\n 'web',\n 'data',\n 'documentation',\n 'engineering',\n 'security',\n 'statistics',\n 'ops',\n 'agent',\n 'sandbox',\n 'utilities',\n 'html',\n 'compliance',\n];\n\nexport default class ToolInit extends Command {\n static description = 'Initialize a new TPMJS tool package';\n\n static examples = [\n '<%= config.bin %> <%= command.id %>',\n '<%= config.bin %> <%= command.id %> my-tool',\n '<%= config.bin %> <%= command.id %> --template minimal',\n ];\n\n static flags = {\n template: Flags.string({\n char: 't',\n description: 'Template to use',\n options: ['minimal', 'rich'],\n default: 'minimal',\n }),\n category: Flags.string({\n char: 'c',\n description: 'Tool category',\n options: CATEGORIES,\n }),\n force: Flags.boolean({\n char: 'f',\n description: 'Overwrite existing files',\n default: false,\n }),\n yes: Flags.boolean({\n char: 'y',\n description: 'Skip prompts and use defaults',\n default: false,\n }),\n verbose: Flags.boolean({\n char: 'v',\n description: 'Show verbose output',\n default: false,\n }),\n };\n\n static args = {\n name: Args.string({\n description: 'Tool name (creates directory if not exists)',\n required: false,\n }),\n };\n\n private rl?: readline.Interface;\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(ToolInit);\n const output = createOutput(flags);\n\n this.rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n // Gather configuration\n const config = await this.gatherConfig(args.name as string | undefined, flags, output);\n\n // Determine target directory\n const targetDir = config.name ? path.resolve(config.name) : process.cwd();\n\n // Check if files exist\n const packageJsonPath = path.join(targetDir, 'package.json');\n if (fs.existsSync(packageJsonPath) && !flags.force) {\n output.error('package.json already exists. Use --force to overwrite.');\n return;\n }\n\n // Create directory if needed\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n\n // Generate files\n await this.generateFiles(targetDir, config, flags.template, output);\n\n output.success('TPMJS tool initialized successfully!');\n output.text('');\n output.text('Next steps:');\n output.listItem('Install dependencies: npm install');\n output.listItem('Implement your tool in src/index.ts');\n output.listItem('Validate: tpm tool validate');\n output.listItem('Build: npm run build');\n output.listItem('Publish: npm publish');\n } finally {\n this.rl?.close();\n }\n }\n\n private async gatherConfig(\n name: string | undefined,\n flags: { category?: string; yes: boolean },\n output: ReturnType<typeof createOutput>\n ): Promise<{\n name: string;\n description: string;\n category: string;\n author: string;\n }> {\n if (flags.yes) {\n return {\n name: name || 'my-tpmjs-tool',\n description: 'A TPMJS tool',\n category: flags.category || 'utilities',\n author: process.env.USER || 'unknown',\n };\n }\n\n output.heading('TPMJS Tool Initialization');\n output.text('');\n\n const toolName = name || (await this.prompt('Tool name: ')) || 'my-tpmjs-tool';\n const description = (await this.prompt('Description: ')) || 'A TPMJS tool';\n\n let category = flags.category;\n if (!category) {\n output.text('');\n output.text('Available categories:');\n CATEGORIES.forEach((cat, i) => {\n output.text(` ${i + 1}. ${cat}`);\n });\n const catIndex = await this.prompt('Category (number or name): ');\n const index = parseInt(catIndex, 10);\n if (index > 0 && index <= CATEGORIES.length) {\n category = CATEGORIES[index - 1];\n } else if (CATEGORIES.includes(catIndex)) {\n category = catIndex;\n } else {\n category = 'utilities';\n }\n }\n\n const author = (await this.prompt(`Author (${process.env.USER}): `)) || process.env.USER || 'unknown';\n\n return { name: toolName, description, category: category ?? 'utilities', author };\n }\n\n private prompt(question: string): Promise<string> {\n return new Promise((resolve) => {\n this.rl?.question(question, (answer) => {\n resolve(answer.trim());\n });\n });\n }\n\n private async generateFiles(\n targetDir: string,\n config: { name: string; description: string; category: string; author: string },\n template: string,\n output: ReturnType<typeof createOutput>\n ): Promise<void> {\n const spinner = output.spinner('Generating files...');\n\n // package.json\n const packageJson = {\n name: config.name.startsWith('@') ? config.name : config.name,\n version: '0.1.0',\n description: config.description,\n type: 'module',\n main: './dist/index.js',\n types: './dist/index.d.ts',\n exports: {\n '.': {\n import: './dist/index.js',\n types: './dist/index.d.ts',\n },\n },\n files: ['dist'],\n keywords: ['tpmjs', 'mcp', 'ai-tools', config.category],\n author: config.author,\n license: 'MIT',\n scripts: {\n build: 'tsup',\n dev: 'tsup --watch',\n 'type-check': 'tsc --noEmit',\n prepublishOnly: 'npm run build',\n },\n dependencies: {\n ai: '^4.0.0',\n },\n devDependencies: {\n '@types/node': '^20.0.0',\n tsup: '^8.0.0',\n typescript: '^5.0.0',\n },\n tpmjs: {\n name: config.name.replace(/@[^/]+\\//, '').replace(/-/g, ' '),\n description: config.description,\n category: config.category,\n tools: [\n {\n name: 'myTool',\n description: 'Description of what this tool does',\n },\n ],\n ...(template === 'rich'\n ? {\n documentation: 'https://github.com/yourname/' + config.name + '#readme',\n examples: [\n {\n title: 'Basic usage',\n code: 'const result = await myTool.execute({ input: \"hello\" });',\n },\n ],\n }\n : {}),\n },\n };\n\n fs.writeFileSync(\n path.join(targetDir, 'package.json'),\n JSON.stringify(packageJson, null, 2)\n );\n\n // tsconfig.json\n const tsconfig = {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n declaration: true,\n declarationMap: true,\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n outDir: './dist',\n rootDir: './src',\n },\n include: ['src'],\n exclude: ['node_modules', 'dist'],\n };\n\n fs.writeFileSync(\n path.join(targetDir, 'tsconfig.json'),\n JSON.stringify(tsconfig, null, 2)\n );\n\n // tsup.config.ts\n const tsupConfig = `import { defineConfig } from 'tsup';\n\nexport default defineConfig({\n entry: ['src/index.ts'],\n format: ['esm'],\n dts: true,\n clean: true,\n sourcemap: true,\n});\n`;\n\n fs.writeFileSync(path.join(targetDir, 'tsup.config.ts'), tsupConfig);\n\n // Create src directory\n const srcDir = path.join(targetDir, 'src');\n if (!fs.existsSync(srcDir)) {\n fs.mkdirSync(srcDir, { recursive: true });\n }\n\n // src/index.ts\n const indexTs = `import { jsonSchema, tool } from 'ai';\n\n/**\n * ${config.description}\n */\nexport const myTool = tool({\n description: '${config.description}',\n parameters: jsonSchema<{ input: string }>({\n type: 'object',\n properties: {\n input: {\n type: 'string',\n description: 'The input to process',\n },\n },\n required: ['input'],\n }),\n async execute({ input }) {\n // TODO: Implement your tool logic here\n return {\n result: \\`Processed: \\${input}\\`,\n };\n },\n});\n\nexport default myTool;\n`;\n\n fs.writeFileSync(path.join(srcDir, 'index.ts'), indexTs);\n\n // block.ts (required for TPMJS validation)\n const blockTs = `import { myTool } from './src/index.js';\n\nexport const block = {\n name: '${config.name}',\n tools: { myTool },\n};\n`;\n\n fs.writeFileSync(path.join(targetDir, 'block.ts'), blockTs);\n\n // README.md\n const readme = `# ${config.name}\n\n${config.description}\n\n## Installation\n\n\\`\\`\\`bash\nnpm install ${config.name}\n\\`\\`\\`\n\n## Usage\n\n\\`\\`\\`typescript\nimport { myTool } from '${config.name}';\n\nconst result = await myTool.execute({ input: 'hello' });\nconsole.log(result);\n\\`\\`\\`\n\n## Category\n\n${config.category}\n\n## License\n\nMIT\n`;\n\n fs.writeFileSync(path.join(targetDir, 'README.md'), readme);\n\n // .gitignore\n const gitignore = `node_modules/\ndist/\n*.log\n.DS_Store\n`;\n\n fs.writeFileSync(path.join(targetDir, '.gitignore'), gitignore);\n\n spinner.stop();\n\n output.text('');\n output.text('Files created:');\n output.listItem('package.json');\n output.listItem('tsconfig.json');\n output.listItem('tsup.config.ts');\n output.listItem('src/index.ts');\n output.listItem('block.ts');\n output.listItem('README.md');\n output.listItem('.gitignore');\n }\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import * as _oclif_core_interfaces from '@oclif/core/interfaces';
2
+ import { Command } from '@oclif/core';
3
+
4
+ declare class ToolSearch extends Command {
5
+ static description: string;
6
+ static examples: string[];
7
+ static flags: {
8
+ category: _oclif_core_interfaces.OptionFlag<string | undefined, _oclif_core_interfaces.CustomOptions>;
9
+ limit: _oclif_core_interfaces.OptionFlag<number, _oclif_core_interfaces.CustomOptions>;
10
+ offset: _oclif_core_interfaces.OptionFlag<number, _oclif_core_interfaces.CustomOptions>;
11
+ json: _oclif_core_interfaces.BooleanFlag<boolean>;
12
+ verbose: _oclif_core_interfaces.BooleanFlag<boolean>;
13
+ };
14
+ static args: {
15
+ query: _oclif_core_interfaces.Arg<string | undefined, Record<string, unknown>>;
16
+ };
17
+ run(): Promise<void>;
18
+ }
19
+
20
+ export { ToolSearch as default };