@toolshedai/cli 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -6,7 +6,9 @@ import { Command } from "commander";
6
6
 
7
7
  // src/commands/add.ts
8
8
  import { spawn } from "child_process";
9
- import { cp, mkdir, mkdtemp, readFile, rm, stat } from "fs/promises";
9
+ import { createInterface } from "readline/promises";
10
+ import { stdin as input, stdout as output } from "process";
11
+ import { mkdir, mkdtemp, readdir, readFile, rm, stat, writeFile } from "fs/promises";
10
12
  import os from "os";
11
13
  import path from "path";
12
14
  import kleur from "kleur";
@@ -189,9 +191,9 @@ var publishReleaseSchema = z2.object({
189
191
  });
190
192
 
191
193
  // src/utils/tool-spec.ts
192
- function parseToolSpecifier(input, options = {}) {
194
+ function parseToolSpecifier(input2, options = {}) {
193
195
  const allowVersion = options.allowVersion ?? true;
194
- const trimmed = input.trim();
196
+ const trimmed = input2.trim();
195
197
  const withoutPrefix = trimmed.replace(/^@/, "");
196
198
  const slashIndex = withoutPrefix.indexOf("/");
197
199
  if (slashIndex < 1) {
@@ -254,6 +256,7 @@ var resolveResponseSchema = z3.object({
254
256
  installCommand: z3.string()
255
257
  });
256
258
  var packageJsonSchema = z3.object({
259
+ packageManager: z3.string().optional(),
257
260
  dependencies: z3.record(z3.string(), z3.string()).optional(),
258
261
  devDependencies: z3.record(z3.string(), z3.string()).optional(),
259
262
  peerDependencies: z3.record(z3.string(), z3.string()).optional(),
@@ -267,6 +270,139 @@ function resolveWithin(root, relativePath, label) {
267
270
  }
268
271
  return candidate;
269
272
  }
273
+ var ENV_FILE_REGEX = /^\.env(\.|$)/;
274
+ function isEnvLikeFile(filePath) {
275
+ return ENV_FILE_REGEX.test(path.basename(filePath));
276
+ }
277
+ function normalizeText(content) {
278
+ return content.replace(/\r\n/g, "\n").trim();
279
+ }
280
+ function parseEnv(content) {
281
+ const out = /* @__PURE__ */ new Map();
282
+ for (const line of content.split("\n")) {
283
+ const trimmed = line.trim();
284
+ if (!trimmed || trimmed.startsWith("#")) continue;
285
+ const separatorIndex = trimmed.indexOf("=");
286
+ if (separatorIndex < 0) continue;
287
+ const key = trimmed.slice(0, separatorIndex).trim();
288
+ const value = trimmed.slice(separatorIndex + 1).trim().replace(/^["']|["']$/g, "");
289
+ if (key) out.set(key, value);
290
+ }
291
+ return out;
292
+ }
293
+ function mergeEnv(existingContent, incomingContent) {
294
+ const existing = parseEnv(existingContent);
295
+ const incoming = parseEnv(incomingContent);
296
+ const addedKeys = [];
297
+ let merged = existingContent.trimEnd();
298
+ if (merged.length > 0 && !merged.endsWith("\n")) {
299
+ merged += "\n";
300
+ }
301
+ for (const [key, value] of incoming.entries()) {
302
+ if (!existing.has(key)) {
303
+ if (merged.length > 0 && !merged.endsWith("\n")) {
304
+ merged += "\n";
305
+ }
306
+ merged += `${key}=${value}
307
+ `;
308
+ addedKeys.push(key);
309
+ }
310
+ }
311
+ if (merged.length > 0 && !merged.endsWith("\n")) {
312
+ merged += "\n";
313
+ }
314
+ return { merged, addedKeys };
315
+ }
316
+ async function collectSourceFiles(sourcePath) {
317
+ const sourceStats = await stat(sourcePath);
318
+ if (!sourceStats.isDirectory()) {
319
+ return [sourcePath];
320
+ }
321
+ const files = [];
322
+ const queue = [sourcePath];
323
+ while (queue.length > 0) {
324
+ const current = queue.pop();
325
+ if (!current) break;
326
+ const entries = await readdir(current, { withFileTypes: true });
327
+ for (const entry of entries) {
328
+ const absoluteEntryPath = path.join(current, entry.name);
329
+ if (entry.isDirectory()) {
330
+ queue.push(absoluteEntryPath);
331
+ } else if (entry.isFile()) {
332
+ files.push(absoluteEntryPath);
333
+ }
334
+ }
335
+ }
336
+ return files.sort();
337
+ }
338
+ async function promptForOverwrite(targetPath) {
339
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
340
+ return false;
341
+ }
342
+ const rl = createInterface({ input, output });
343
+ try {
344
+ const answer = await rl.question(`Overwrite ${targetPath}? (y/N): `);
345
+ const normalized = answer.trim().toLowerCase();
346
+ return normalized === "y" || normalized === "yes";
347
+ } finally {
348
+ rl.close();
349
+ }
350
+ }
351
+ async function writeOneFile(targetPath, incomingContent, overwrite) {
352
+ const targetExists = await exists(targetPath);
353
+ if (targetExists) {
354
+ const targetStats = await stat(targetPath);
355
+ if (targetStats.isDirectory()) {
356
+ throw new Error(`Target path is a directory: ${targetPath}`);
357
+ }
358
+ }
359
+ const envLikeFile = isEnvLikeFile(targetPath);
360
+ if (targetExists && envLikeFile) {
361
+ const current = await readFile(targetPath, "utf8");
362
+ const { merged, addedKeys } = mergeEnv(current, incomingContent);
363
+ if (addedKeys.length === 0) {
364
+ return { path: targetPath, action: "skipped_identical", reason: "no new env keys" };
365
+ }
366
+ await mkdir(path.dirname(targetPath), { recursive: true });
367
+ await writeFile(targetPath, merged, "utf8");
368
+ return { path: targetPath, action: "updated", reason: `added env keys: ${addedKeys.join(", ")}` };
369
+ }
370
+ if (targetExists && !envLikeFile) {
371
+ const current = await readFile(targetPath, "utf8");
372
+ if (normalizeText(current) === normalizeText(incomingContent)) {
373
+ return { path: targetPath, action: "skipped_identical", reason: "content identical" };
374
+ }
375
+ if (!overwrite) {
376
+ const confirmed = await promptForOverwrite(targetPath);
377
+ if (!confirmed) {
378
+ return { path: targetPath, action: "skipped_user", reason: "user declined overwrite" };
379
+ }
380
+ }
381
+ await mkdir(path.dirname(targetPath), { recursive: true });
382
+ await writeFile(targetPath, incomingContent, "utf8");
383
+ return { path: targetPath, action: "updated" };
384
+ }
385
+ await mkdir(path.dirname(targetPath), { recursive: true });
386
+ await writeFile(targetPath, incomingContent, "utf8");
387
+ return { path: targetPath, action: "created" };
388
+ }
389
+ function printWriteSummary(decisions) {
390
+ const created = decisions.filter((decision) => decision.action === "created");
391
+ const updated = decisions.filter((decision) => decision.action === "updated");
392
+ const skippedIdentical = decisions.filter(
393
+ (decision) => decision.action === "skipped_identical"
394
+ );
395
+ const skippedUser = decisions.filter((decision) => decision.action === "skipped_user");
396
+ console.log(kleur.dim("Write summary:"));
397
+ console.log(` created: ${created.length}`);
398
+ console.log(` updated: ${updated.length}`);
399
+ console.log(` skipped_identical: ${skippedIdentical.length}`);
400
+ console.log(` skipped_user: ${skippedUser.length}`);
401
+ for (const skipped of [...skippedIdentical, ...skippedUser]) {
402
+ const suffix = skipped.reason ? ` (${skipped.reason})` : "";
403
+ console.log(kleur.dim(` - ${skipped.path}${suffix}`));
404
+ }
405
+ }
270
406
  function runCommand(command, args, cwd) {
271
407
  return new Promise((resolve, reject) => {
272
408
  const child = spawn(command, args, {
@@ -292,11 +428,43 @@ async function exists(filePath) {
292
428
  return false;
293
429
  }
294
430
  }
431
+ function parsePackageManager(value) {
432
+ if (!value) return null;
433
+ const normalized = value.trim().toLowerCase();
434
+ if (!normalized) return null;
435
+ if (normalized === "pnpm" || normalized.startsWith("pnpm@") || normalized.startsWith("pnpm/")) {
436
+ return "pnpm";
437
+ }
438
+ if (normalized === "yarn" || normalized.startsWith("yarn@") || normalized.startsWith("yarn/")) {
439
+ return "yarn";
440
+ }
441
+ if (normalized === "bun" || normalized.startsWith("bun@") || normalized.startsWith("bun/")) {
442
+ return "bun";
443
+ }
444
+ if (normalized === "npm" || normalized.startsWith("npm@") || normalized.startsWith("npm/")) {
445
+ return "npm";
446
+ }
447
+ return null;
448
+ }
295
449
  async function detectPackageManager(cwd) {
450
+ const packageJsonPath = path.join(cwd, "package.json");
451
+ if (await exists(packageJsonPath)) {
452
+ try {
453
+ const packageJsonRaw = await readFile(packageJsonPath, "utf8");
454
+ const parsed = packageJsonSchema.parse(JSON.parse(packageJsonRaw));
455
+ const packageManager = parsePackageManager(parsed.packageManager);
456
+ if (packageManager) return packageManager;
457
+ } catch {
458
+ }
459
+ }
460
+ if (await exists(path.join(cwd, "pnpm-workspace.yaml"))) return "pnpm";
296
461
  if (await exists(path.join(cwd, "pnpm-lock.yaml"))) return "pnpm";
297
462
  if (await exists(path.join(cwd, "yarn.lock"))) return "yarn";
298
463
  if (await exists(path.join(cwd, "bun.lockb"))) return "bun";
299
464
  if (await exists(path.join(cwd, "bun.lock"))) return "bun";
465
+ const userAgentManager = parsePackageManager(process.env.npm_config_user_agent);
466
+ if (userAgentManager) return userAgentManager;
467
+ if (await exists(path.join(cwd, "package-lock.json"))) return "npm";
300
468
  return "npm";
301
469
  }
302
470
  function normalizeProjectAiRange(value) {
@@ -434,16 +602,24 @@ async function runAdd(specifier, apiBaseUrl2, options) {
434
602
  const installedMcpFiles = filesToInstall.filter(
435
603
  (entry) => entry.variant === MCP_MANIFEST_VARIANT
436
604
  ).length;
605
+ const writeDecisions = [];
437
606
  for (const entry of filesToInstall) {
438
607
  const sourcePath = resolveWithin(toolRoot, entry.source, "source");
439
608
  const targetPath = resolveWithin(options.cwd, entry.target, "target");
440
- await mkdir(path.dirname(targetPath), { recursive: true });
441
- await cp(sourcePath, targetPath, {
442
- recursive: true,
443
- force: options.overwrite,
444
- errorOnExist: !options.overwrite
445
- });
609
+ const sourceFiles = await collectSourceFiles(sourcePath);
610
+ for (const sourceFilePath of sourceFiles) {
611
+ const sourceRelativePath = path.relative(sourcePath, sourceFilePath);
612
+ const resolvedTargetPath = sourceFiles.length === 1 && sourceRelativePath === "" ? targetPath : path.join(targetPath, sourceRelativePath);
613
+ const incomingContent = await readFile(sourceFilePath, "utf8");
614
+ const decision = await writeOneFile(
615
+ resolvedTargetPath,
616
+ incomingContent,
617
+ options.overwrite
618
+ );
619
+ writeDecisions.push(decision);
620
+ }
446
621
  }
622
+ printWriteSummary(writeDecisions);
447
623
  await installDependencies(
448
624
  options.cwd,
449
625
  manifest.dependencies ?? [],
@@ -494,9 +670,9 @@ var searchResponseSchema = z4.object({
494
670
  })
495
671
  )
496
672
  });
497
- function parseLimit(input) {
498
- if (!Number.isFinite(input) || input <= 0) return 20;
499
- return Math.min(Math.floor(input), 100);
673
+ function parseLimit(input2) {
674
+ if (!Number.isFinite(input2) || input2 <= 0) return 20;
675
+ return Math.min(Math.floor(input2), 100);
500
676
  }
501
677
  async function runSearch(query, apiBaseUrl2, options) {
502
678
  const url = new URL("/cli/search", apiBaseUrl2);
@@ -590,13 +766,15 @@ program.command("add").description("add a published tool to your project").argum
590
766
  "-c, --cwd <cwd>",
591
767
  "the working directory. defaults to the current directory.",
592
768
  process.cwd()
593
- ).option("-o, --overwrite", "overwrite existing files.", false).option("--with-mcp", "install optional MCP adapter files when available.", false).action(async (tool, opts) => {
594
- await runAdd(tool, apiBaseUrl, {
595
- cwd: path2.resolve(opts.cwd),
596
- overwrite: opts.overwrite,
597
- withMcp: opts.withMcp
598
- });
599
- });
769
+ ).option("-o, --overwrite", "overwrite existing files.", false).option("--overwrite-files", "overwrite changed files without prompts.", false).option("--with-mcp", "install optional MCP adapter files when available.", false).action(
770
+ async (tool, opts) => {
771
+ await runAdd(tool, apiBaseUrl, {
772
+ cwd: path2.resolve(opts.cwd),
773
+ overwrite: opts.overwrite || opts.overwriteFiles,
774
+ withMcp: opts.withMcp
775
+ });
776
+ }
777
+ );
600
778
  program.command("search").description("search published tools").argument("[query]", "tool search query").option("-l, --limit <limit>", "number of tools to return", "20").action(async (query, opts) => {
601
779
  await runSearch(query ?? "", apiBaseUrl, {
602
780
  limit: Number.parseInt(opts.limit, 10)
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/add.ts","../../shared/src/index.ts","../../shared/src/tool-release-map.ts","../src/utils/tool-spec.ts","../src/commands/search.ts","../src/commands/view.ts"],"sourcesContent":["#!/usr/bin/env node\nimport path from \"node:path\"\n\nimport { Command } from \"commander\"\n\nimport { runAdd } from \"./commands/add\"\nimport { runSearch } from \"./commands/search\"\nimport { runView } from \"./commands/view\"\n\nconst program = new Command()\nconst apiBaseUrl = \"https://api.toolshed.tech\"\n\nprogram\n .name(\"toolshed\")\n .description(\"Add and discover toolshed tools\")\n .version(\"0.1.0\")\n\nprogram\n .command(\"add\")\n .description(\"add a published tool to your project\")\n .argument(\"<tool>\", \"tool coordinate in the form @owner/name[@version]\")\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .option(\"-o, --overwrite\", \"overwrite existing files.\", false)\n .option(\"--with-mcp\", \"install optional MCP adapter files when available.\", false)\n .action(async (tool: string, opts: { cwd: string; overwrite: boolean; withMcp: boolean }) => {\n await runAdd(tool, apiBaseUrl, {\n cwd: path.resolve(opts.cwd),\n overwrite: opts.overwrite,\n withMcp: opts.withMcp,\n })\n })\n\nprogram\n .command(\"search\")\n .description(\"search published tools\")\n .argument(\"[query]\", \"tool search query\")\n .option(\"-l, --limit <limit>\", \"number of tools to return\", \"20\")\n .action(async (query: string | undefined, opts: { limit: string }) => {\n await runSearch(query ?? \"\", apiBaseUrl, {\n limit: Number.parseInt(opts.limit, 10),\n })\n })\n\nprogram\n .command(\"view\")\n .description(\"view details for a published tool\")\n .argument(\"<tool>\", \"tool coordinate in the form @owner/name\")\n .action(async (tool: string) => {\n await runView(tool, apiBaseUrl)\n })\n\nprogram.parseAsync().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error)\n console.error(message)\n process.exit(1)\n})\n","import { spawn } from \"node:child_process\"\nimport { cp, mkdir, mkdtemp, readFile, rm, stat } from \"node:fs/promises\"\nimport os from \"node:os\"\nimport path from \"node:path\"\n\nimport kleur from \"kleur\"\nimport { z } from \"zod\"\n\nimport {\n AI_SDK_REQUIRED_MAJOR,\n MCP_MANIFEST_VARIANT,\n TOOLSHED_MANIFEST_FILENAME,\n isAiSdkRangeCompatible,\n toolManifestSchema,\n} from \"@toolshed/shared\"\n\nimport { parseToolSpecifier } from \"../utils/tool-spec\"\n\nconst resolveResponseSchema = z.object({\n tool: z.object({\n owner: z.string(),\n name: z.string(),\n slug: z.string(),\n description: z.string(),\n isVerifiedOwner: z.boolean(),\n isFork: z.boolean(),\n }),\n version: z.object({\n version: z.string(),\n manifestHash: z.string(),\n aiSdk: z.object({\n major: z.number(),\n range: z.string(),\n }),\n repo: z.object({\n owner: z.string(),\n name: z.string(),\n url: z.string(),\n commitSha: z.string(),\n }),\n }),\n installCommand: z.string(),\n})\n\ntype AddOptions = {\n cwd: string\n overwrite: boolean\n withMcp: boolean\n}\n\nconst packageJsonSchema = z.object({\n dependencies: z.record(z.string(), z.string()).optional(),\n devDependencies: z.record(z.string(), z.string()).optional(),\n peerDependencies: z.record(z.string(), z.string()).optional(),\n optionalDependencies: z.record(z.string(), z.string()).optional(),\n})\n\nexport function resolveWithin(root: string, relativePath: string, label: string) {\n const absoluteRoot = path.resolve(root)\n const candidate = path.resolve(absoluteRoot, relativePath)\n if (candidate !== absoluteRoot && !candidate.startsWith(`${absoluteRoot}${path.sep}`)) {\n throw new Error(`Invalid ${label} path in manifest: ${relativePath}`)\n }\n\n return candidate\n}\n\nfunction runCommand(command: string, args: string[], cwd?: string) {\n return new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n stdio: \"inherit\",\n env: process.env,\n })\n\n child.on(\"error\", reject)\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve()\n return\n }\n\n reject(new Error(`${command} ${args.join(\" \")} exited with code ${code ?? \"unknown\"}`))\n })\n })\n}\n\nasync function exists(filePath: string) {\n try {\n await stat(filePath)\n return true\n } catch {\n return false\n }\n}\n\nasync function detectPackageManager(cwd: string) {\n if (await exists(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\"\n if (await exists(path.join(cwd, \"yarn.lock\"))) return \"yarn\"\n if (await exists(path.join(cwd, \"bun.lockb\"))) return \"bun\"\n if (await exists(path.join(cwd, \"bun.lock\"))) return \"bun\"\n return \"npm\"\n}\n\nexport function normalizeProjectAiRange(value: string) {\n let normalized = value.trim()\n const prefixes = [\"workspace:\", \"catalog:\", \"npm:\", \"pnpm:\", \"yarn:\"]\n for (const prefix of prefixes) {\n if (normalized.startsWith(prefix)) {\n normalized = normalized.slice(prefix.length).trim()\n }\n }\n\n if (normalized.startsWith(\"ai@\")) {\n normalized = normalized.slice(\"ai@\".length)\n }\n\n return normalized\n}\n\nexport async function detectProjectAiRange(cwd: string) {\n const packageJsonPath = path.join(cwd, \"package.json\")\n if (!(await exists(packageJsonPath))) {\n return null\n }\n\n try {\n const packageJsonRaw = await readFile(packageJsonPath, \"utf8\")\n const parsed = packageJsonSchema.parse(JSON.parse(packageJsonRaw))\n const groups = [\n parsed.dependencies,\n parsed.devDependencies,\n parsed.peerDependencies,\n parsed.optionalDependencies,\n ]\n\n for (const group of groups) {\n const aiRange = group?.ai\n if (aiRange) return normalizeProjectAiRange(aiRange)\n }\n } catch {\n return null\n }\n\n return null\n}\n\nasync function installDependencies(\n cwd: string,\n dependencies: string[],\n devDependencies: string[]\n) {\n const deps = [...new Set(dependencies)]\n const devDeps = [...new Set(devDependencies)]\n if (!deps.length && !devDeps.length) return\n\n const packageManager = await detectPackageManager(cwd)\n console.log(kleur.dim(`Installing dependencies with ${packageManager}...`))\n\n if (packageManager === \"pnpm\") {\n if (deps.length) await runCommand(\"pnpm\", [\"add\", ...deps], cwd)\n if (devDeps.length) await runCommand(\"pnpm\", [\"add\", \"-D\", ...devDeps], cwd)\n return\n }\n\n if (packageManager === \"yarn\") {\n if (deps.length) await runCommand(\"yarn\", [\"add\", ...deps], cwd)\n if (devDeps.length) await runCommand(\"yarn\", [\"add\", \"-D\", ...devDeps], cwd)\n return\n }\n\n if (packageManager === \"bun\") {\n if (deps.length) await runCommand(\"bun\", [\"add\", ...deps], cwd)\n if (devDeps.length) await runCommand(\"bun\", [\"add\", \"-d\", ...devDeps], cwd)\n return\n }\n\n if (deps.length) await runCommand(\"npm\", [\"install\", ...deps], cwd)\n if (devDeps.length) await runCommand(\"npm\", [\"install\", \"-D\", ...devDeps], cwd)\n}\n\nexport async function runAdd(specifier: string, apiBaseUrl: string, options: AddOptions) {\n const coordinate = parseToolSpecifier(specifier, { allowVersion: true })\n const versionSuffix = coordinate.version ? `/${encodeURIComponent(coordinate.version)}` : \"\"\n const endpoint = `${apiBaseUrl}/cli/resolve/${coordinate.owner}/${coordinate.name}${versionSuffix}`\n\n console.log(kleur.dim(`Resolving @${coordinate.owner}/${coordinate.name}...`))\n const response = await fetch(endpoint)\n if (!response.ok) {\n const errorBody = await response.text()\n throw new Error(`Failed to resolve ${specifier} (${response.status}): ${errorBody}`)\n }\n\n const payload = resolveResponseSchema.parse(await response.json())\n if (!payload.tool.isVerifiedOwner) {\n console.log(\n kleur.yellow(\n `Warning: @${payload.tool.owner}/${payload.tool.name} is not from a verified owner.`\n )\n )\n }\n\n const tmpDir = await mkdtemp(path.join(os.tmpdir(), \"toolshed-\"))\n const repoDir = path.join(tmpDir, \"repo\")\n\n try {\n console.log(kleur.dim(`Cloning ${payload.version.repo.url}...`))\n await runCommand(\"git\", [\"clone\", \"--quiet\", payload.version.repo.url, repoDir])\n await runCommand(\"git\", [\"-C\", repoDir, \"checkout\", \"--quiet\", payload.version.repo.commitSha])\n\n const toolRootCandidates = [repoDir, path.join(repoDir, \"tools\", payload.tool.name)]\n const toolRoot = (\n await Promise.all(\n toolRootCandidates.map(async (candidate) => {\n const candidateManifestPath = path.join(candidate, TOOLSHED_MANIFEST_FILENAME)\n return (await exists(candidateManifestPath)) ? candidate : null\n })\n )\n ).find((value): value is string => value !== null)\n\n if (!toolRoot) {\n throw new Error(\n `Unable to locate ${TOOLSHED_MANIFEST_FILENAME} in repository root or tools/${payload.tool.name}`\n )\n }\n\n const manifestPath = path.join(toolRoot, TOOLSHED_MANIFEST_FILENAME)\n const manifestRaw = await readFile(manifestPath, \"utf8\")\n const manifest = toolManifestSchema.parse(JSON.parse(manifestRaw))\n\n if (\n payload.version.aiSdk.major !== manifest.aiSdk.major ||\n payload.version.aiSdk.range !== manifest.aiSdk.range\n ) {\n console.log(\n kleur.yellow(\n `Warning: registry metadata reports AI SDK ${payload.version.aiSdk.major} (${payload.version.aiSdk.range}), but manifest requires AI SDK ${manifest.aiSdk.major} (${manifest.aiSdk.range}).`\n )\n )\n }\n\n const projectAiRange = await detectProjectAiRange(options.cwd)\n if (!projectAiRange) {\n console.log(\n kleur.yellow(\n `Warning: no \"ai\" dependency found in ${path.join(\n options.cwd,\n \"package.json\"\n )}. This tool requires AI SDK ${manifest.aiSdk.major} (${manifest.aiSdk.range}).`\n )\n )\n } else if (!isAiSdkRangeCompatible(projectAiRange)) {\n console.log(\n kleur.yellow(\n `Warning: project declares ai@${projectAiRange}, but this tool requires AI SDK ${AI_SDK_REQUIRED_MAJOR} (${manifest.aiSdk.range}).`\n )\n )\n }\n\n const filesToInstall = manifest.files.filter((entry) => {\n if (entry.variant === MCP_MANIFEST_VARIANT && !options.withMcp) {\n return false\n }\n\n return true\n })\n\n const mcpFileCount = manifest.files.filter(\n (entry) => entry.variant === MCP_MANIFEST_VARIANT\n ).length\n const installedMcpFiles = filesToInstall.filter(\n (entry) => entry.variant === MCP_MANIFEST_VARIANT\n ).length\n\n for (const entry of filesToInstall) {\n const sourcePath = resolveWithin(toolRoot, entry.source, \"source\")\n const targetPath = resolveWithin(options.cwd, entry.target, \"target\")\n\n await mkdir(path.dirname(targetPath), { recursive: true })\n await cp(sourcePath, targetPath, {\n recursive: true,\n force: options.overwrite,\n errorOnExist: !options.overwrite,\n })\n }\n\n await installDependencies(\n options.cwd,\n manifest.dependencies ?? [],\n manifest.devDependencies ?? []\n )\n\n console.log(\n kleur.green(\n `Installed @${payload.tool.owner}/${payload.tool.name}@${payload.version.version}`\n )\n )\n console.log(kleur.dim(`Source: ${payload.version.repo.url}#${payload.version.repo.commitSha}`))\n console.log(`Provider: ${manifest.provider}`)\n console.log(`Operation: ${manifest.operation}`)\n if (manifest.operation === \"write\") {\n console.log(`Write guardrail: ${manifest.guardrail}`)\n }\n\n const envKeys = Object.keys(manifest.envVars ?? {})\n if (envKeys.length) {\n console.log(kleur.yellow(\"Required environment variables:\"))\n for (const envKey of envKeys) {\n console.log(` - ${envKey}`)\n }\n }\n\n if (options.withMcp && installedMcpFiles === 0) {\n console.log(kleur.yellow(\"No MCP adapter files were found in this tool package.\"))\n } else if (options.withMcp && installedMcpFiles > 0) {\n console.log(kleur.dim(`Included ${installedMcpFiles} MCP adapter file(s).`))\n } else if (!options.withMcp && mcpFileCount > 0) {\n console.log(kleur.dim(\"Tip: re-run with --with-mcp to install optional MCP adapter files.\"))\n }\n } finally {\n await rm(tmpDir, { recursive: true, force: true })\n }\n}\n","import { z } from \"zod\"\nexport * from \"./tool-release-map\"\n\nexport const TOOLSHED_MANIFEST_FILENAME = \"toolshed.tool.json\"\nexport const AI_SDK_PACKAGE_NAME = \"ai\"\nexport const AI_SDK_REQUIRED_MAJOR = 6\nexport const AI_SDK_REQUIRED_RANGE = \">=6 <7\"\nexport const MCP_MANIFEST_VARIANT = \"mcp\"\n\nfunction stripVersionProtocol(value: string) {\n let normalized = value.trim()\n const protocols = [\"workspace:\", \"npm:\", \"pnpm:\", \"yarn:\", \"catalog:\"]\n for (const protocol of protocols) {\n if (normalized.startsWith(protocol)) {\n normalized = normalized.slice(protocol.length).trim()\n }\n }\n\n return normalized\n}\n\nfunction extractDependencyNameAndRange(specifier: string): { name: string; range: string | null } {\n const normalized = stripVersionProtocol(specifier)\n const scopedMatch = normalized.match(/^(@[^/@\\s]+\\/[^@\\s]+)(?:@(.+))?$/)\n if (scopedMatch) {\n return {\n name: scopedMatch[1] ?? normalized,\n range: scopedMatch[2]?.trim() || null,\n }\n }\n\n const plainMatch = normalized.match(/^([^@\\s]+)(?:@(.+))?$/)\n if (plainMatch) {\n return {\n name: plainMatch[1] ?? normalized,\n range: plainMatch[2]?.trim() || null,\n }\n }\n\n return {\n name: normalized,\n range: null,\n }\n}\n\nfunction isAiSdk6Range(range: string) {\n const normalized = stripVersionProtocol(range).replace(/\\s+/g, \"\")\n if (!normalized) return false\n\n const disjunctive = normalized.split(\"||\")\n return disjunctive.some((candidate) => {\n if (/^[~^]?6(?:\\.|$)/.test(candidate)) return true\n if (/^6(?:\\.x)?(?:\\.x)?$/.test(candidate)) return true\n if (/^>=6(?:\\.0\\.0)?<7(?:\\.0\\.0)?$/.test(candidate)) return true\n return false\n })\n}\n\nexport function parseDependencySpecifier(specifier: string) {\n return extractDependencyNameAndRange(specifier)\n}\n\nexport function findAiSdkDependencySpecifier(entries: string[]) {\n return entries.find((entry) => {\n const parsed = extractDependencyNameAndRange(entry)\n return parsed.name === AI_SDK_PACKAGE_NAME\n })\n}\n\nexport function isAiSdkSpecifierCompatible(specifier: string) {\n const parsed = extractDependencyNameAndRange(specifier)\n if (parsed.name !== AI_SDK_PACKAGE_NAME || !parsed.range) return false\n return isAiSdk6Range(parsed.range)\n}\n\nexport function isAiSdkRangeCompatible(range: string) {\n return isAiSdk6Range(range)\n}\n\nexport const aiSdkRequirementSchema = z.object({\n package: z.literal(AI_SDK_PACKAGE_NAME).default(AI_SDK_PACKAGE_NAME),\n major: z.literal(AI_SDK_REQUIRED_MAJOR).default(AI_SDK_REQUIRED_MAJOR),\n range: z.string().min(1).default(AI_SDK_REQUIRED_RANGE),\n})\n\nexport const toolProviderSchema = z.enum([\"github\", \"gmail\", \"spotify\", \"generic\"])\nexport const toolOperationSchema = z.enum([\"read\", \"write\", \"mixed\"])\nexport const toolGuardrailSchema = z.enum([\"confirm_true\", \"none\"])\nexport const manifestFileVariantSchema = z.enum([\"core\", MCP_MANIFEST_VARIANT])\n\nexport const toolManifestFileSchema = z.object({\n source: z.string().min(1),\n target: z.string().min(1),\n variant: manifestFileVariantSchema.default(\"core\"),\n})\n\nexport const toolManifestSchema = z.object({\n name: z.string().min(2),\n version: z.string().min(1),\n description: z.string().min(10),\n aiSdk: aiSdkRequirementSchema.default({\n package: AI_SDK_PACKAGE_NAME,\n major: AI_SDK_REQUIRED_MAJOR,\n range: AI_SDK_REQUIRED_RANGE,\n }),\n entry: z.string().min(1),\n files: z.array(toolManifestFileSchema),\n dependencies: z.array(z.string()).default([]),\n devDependencies: z.array(z.string()).default([]),\n envVars: z.record(z.string(), z.string()).optional(),\n provider: toolProviderSchema.default(\"generic\"),\n operation: toolOperationSchema.default(\"read\"),\n guardrail: toolGuardrailSchema.default(\"none\"),\n mcpAdapterAvailable: z.boolean().default(false),\n keywords: z.array(z.string()).default([]),\n}).superRefine((manifest, ctx) => {\n const dependencyEntries = [...manifest.dependencies, ...manifest.devDependencies]\n const aiSpecifier = findAiSdkDependencySpecifier(dependencyEntries)\n\n if (!aiSpecifier) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Manifest must include ${AI_SDK_PACKAGE_NAME} with an explicit ${AI_SDK_REQUIRED_RANGE} range in dependencies or devDependencies.`,\n path: [\"dependencies\"],\n })\n return\n }\n\n if (!isAiSdkSpecifierCompatible(aiSpecifier)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `${AI_SDK_PACKAGE_NAME} dependency must be compatible with ${AI_SDK_REQUIRED_RANGE}; received \"${aiSpecifier}\".`,\n path: [\"dependencies\"],\n })\n }\n\n const hasMcpFiles = manifest.files.some((entry) => entry.variant === MCP_MANIFEST_VARIANT)\n if (manifest.mcpAdapterAvailable && !hasMcpFiles) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"mcpAdapterAvailable=true requires at least one files entry with variant=\\\"mcp\\\".\",\n path: [\"files\"],\n })\n }\n\n if (!manifest.mcpAdapterAvailable && hasMcpFiles) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"files entries with variant=\\\"mcp\\\" require mcpAdapterAvailable=true.\",\n path: [\"mcpAdapterAvailable\"],\n })\n }\n\n if (\n (manifest.operation === \"write\" || manifest.operation === \"mixed\") &&\n manifest.guardrail !== \"confirm_true\"\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Write-capable tools must set guardrail to \\\"confirm_true\\\".\",\n path: [\"guardrail\"],\n })\n }\n})\n\nexport type ToolManifest = z.infer<typeof toolManifestSchema>\n\nexport const toolCoordinateSchema = z.object({\n owner: z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9-]{0,38}$/),\n tool: z.string().regex(/^[a-z0-9-]+$/),\n version: z.string().optional(),\n})\n\nexport type ToolCoordinate = z.infer<typeof toolCoordinateSchema>\n\nexport const releaseVersionSchema = z.string().regex(/^\\d+\\.\\d+\\.\\d+(?:[-+][0-9A-Za-z.-]+)?$/)\nexport const commitShaSchema = z.string().regex(/^[a-f0-9]{40}$/i)\nexport const manifestHashSchema = z.string().regex(/^[a-f0-9]{64}$/i)\n\nexport const publishReleaseSchema = z.object({\n owner: toolCoordinateSchema.shape.owner,\n name: toolCoordinateSchema.shape.tool,\n description: z.string().min(10),\n version: releaseVersionSchema,\n repoUrl: z.string().url(),\n commitSha: commitShaSchema,\n manifestHash: manifestHashSchema,\n isVerifiedOwner: z.boolean(),\n isFork: z.boolean().default(false),\n upstreamOwner: z.string().optional(),\n upstreamRepo: z.string().optional(),\n upstreamUrl: z.string().url().optional(),\n aiSdkMajor: z.literal(AI_SDK_REQUIRED_MAJOR).default(AI_SDK_REQUIRED_MAJOR),\n aiSdkRange: z.string().min(1).default(AI_SDK_REQUIRED_RANGE),\n})\n\nexport type PublishReleaseInput = z.infer<typeof publishReleaseSchema>\n\nexport const publishReleaseFromCiSchema = publishReleaseSchema\n\nexport type PublishReleaseFromCiInput = z.infer<typeof publishReleaseFromCiSchema>\n","import { z } from \"zod\"\n\nexport const toolReleaseMapEntrySchema = z.object({\n toolName: z.string().regex(/^[a-z0-9-]+$/),\n sourcePath: z.string().min(1),\n publicRepo: z.string().url().regex(/^https:\\/\\/github\\.com\\/[^/]+\\/[^/]+(?:\\.git)?$/),\n publicDefaultBranch: z.string().min(1).default(\"main\"),\n})\n\nexport type ToolReleaseMapEntry = z.infer<typeof toolReleaseMapEntrySchema>\n\nexport const toolReleaseMapSchema = z.object({\n tools: z.array(toolReleaseMapEntrySchema),\n})\n\nexport type ToolReleaseMap = z.infer<typeof toolReleaseMapSchema>\n\n","import { toolCoordinateSchema } from \"@toolshed/shared\"\n\ntype ParseOptions = {\n allowVersion?: boolean\n}\n\nexport function parseToolSpecifier(input: string, options: ParseOptions = {}) {\n const allowVersion = options.allowVersion ?? true\n const trimmed = input.trim()\n const withoutPrefix = trimmed.replace(/^@/, \"\")\n\n const slashIndex = withoutPrefix.indexOf(\"/\")\n if (slashIndex < 1) {\n throw new Error(\"Tool must be in the format @owner/name[@version]\")\n }\n\n const owner = withoutPrefix.slice(0, slashIndex)\n const remainder = withoutPrefix.slice(slashIndex + 1)\n if (!remainder || remainder.includes(\"/\")) {\n throw new Error(\"Tool must be in the format @owner/name[@version]\")\n }\n\n let name = remainder\n let version: string | undefined\n const atIndex = remainder.lastIndexOf(\"@\")\n if (atIndex > 0) {\n if (!allowVersion) {\n throw new Error(\"Tool must be in the format @owner/name\")\n }\n name = remainder.slice(0, atIndex)\n version = remainder.slice(atIndex + 1)\n }\n\n const parsed = toolCoordinateSchema.safeParse({\n owner,\n tool: name,\n version,\n })\n\n if (!parsed.success) {\n throw new Error(\"Tool must be in the format @owner/name[@version]\")\n }\n\n return {\n owner: parsed.data.owner.toLowerCase(),\n name: parsed.data.tool,\n version: parsed.data.version,\n }\n}\n","import kleur from \"kleur\"\nimport { z } from \"zod\"\n\nconst searchResponseSchema = z.object({\n items: z.array(\n z.object({\n owner: z.string(),\n name: z.string(),\n description: z.string(),\n latestVersion: z.string().nullable(),\n isVerifiedOwner: z.boolean(),\n isFork: z.boolean(),\n })\n ),\n})\n\ntype SearchOptions = {\n limit: number\n}\n\nfunction parseLimit(input: number) {\n if (!Number.isFinite(input) || input <= 0) return 20\n return Math.min(Math.floor(input), 100)\n}\n\nexport async function runSearch(query: string, apiBaseUrl: string, options: SearchOptions) {\n const url = new URL(\"/cli/search\", apiBaseUrl)\n if (query.trim()) {\n url.searchParams.set(\"q\", query.trim())\n }\n url.searchParams.set(\"limit\", String(parseLimit(options.limit)))\n\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`Search failed (${response.status})`)\n }\n\n const payload = searchResponseSchema.parse(await response.json())\n if (!payload.items.length) {\n console.log(\"No tools found.\")\n return\n }\n\n for (const item of payload.items) {\n const version = item.latestVersion ?? \"n/a\"\n const ownerState = item.isVerifiedOwner\n ? kleur.green(\"verified\")\n : item.isFork\n ? kleur.yellow(\"fork\")\n : kleur.red(\"unverified\")\n\n console.log(`${kleur.bold(`@${item.owner}/${item.name}`)} ${kleur.dim(`v${version}`)} ${ownerState}`)\n console.log(` ${item.description}`)\n }\n}\n","import kleur from \"kleur\"\nimport { z } from \"zod\"\n\nimport { parseToolSpecifier } from \"../utils/tool-spec\"\n\nconst viewResponseSchema = z.object({\n tool: z.object({\n owner: z.string(),\n name: z.string(),\n description: z.string(),\n latestVersion: z.string().nullable(),\n isVerifiedOwner: z.boolean(),\n isFork: z.boolean(),\n upstreamOwner: z.string().nullable(),\n upstreamRepo: z.string().nullable(),\n upstreamUrl: z.string().nullable(),\n }),\n versions: z.array(\n z.object({\n version: z.string(),\n repoUrl: z.string(),\n commitSha: z.string(),\n aiSdkMajor: z.number(),\n aiSdkRange: z.string(),\n createdAt: z.string(),\n })\n ),\n installCommand: z.string(),\n})\n\nexport async function runView(specifier: string, apiBaseUrl: string) {\n const coordinate = parseToolSpecifier(specifier, { allowVersion: false })\n\n const response = await fetch(`${apiBaseUrl}/cli/view/${coordinate.owner}/${coordinate.name}`)\n if (!response.ok) {\n throw new Error(`View failed (${response.status})`)\n }\n\n const payload = viewResponseSchema.parse(await response.json())\n\n console.log(kleur.bold(`@${payload.tool.owner}/${payload.tool.name}`))\n console.log(payload.tool.description)\n console.log(`Latest version: ${payload.tool.latestVersion ?? \"n/a\"}`)\n console.log(`Owner status: ${payload.tool.isVerifiedOwner ? \"verified\" : \"unverified\"}`)\n const latest = payload.versions[0]\n if (latest) {\n console.log(`AI SDK: v${latest.aiSdkMajor} (${latest.aiSdkRange})`)\n }\n\n if (payload.tool.isFork && payload.tool.upstreamOwner && payload.tool.upstreamRepo) {\n console.log(\n kleur.yellow(\n `Forked from @${payload.tool.upstreamOwner}/${payload.tool.upstreamRepo}${\n payload.tool.upstreamUrl ? ` (${payload.tool.upstreamUrl})` : \"\"\n }`\n )\n )\n }\n\n console.log(\"\")\n console.log(kleur.dim(\"Install\"))\n console.log(payload.installCommand)\n\n if (payload.versions.length) {\n console.log(\"\")\n console.log(kleur.dim(\"Recent versions\"))\n for (const version of payload.versions.slice(0, 10)) {\n console.log(`- ${version.version} ${version.commitSha.slice(0, 8)} ${version.repoUrl}`)\n }\n }\n}\n"],"mappings":"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","names":["path","z","z","z","z","apiBaseUrl","kleur","z","apiBaseUrl","kleur","z","z","apiBaseUrl","kleur","path"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/add.ts","../../shared/src/index.ts","../../shared/src/tool-release-map.ts","../src/utils/tool-spec.ts","../src/commands/search.ts","../src/commands/view.ts"],"sourcesContent":["#!/usr/bin/env node\nimport path from \"node:path\"\n\nimport { Command } from \"commander\"\n\nimport { runAdd } from \"./commands/add\"\nimport { runSearch } from \"./commands/search\"\nimport { runView } from \"./commands/view\"\n\nconst program = new Command()\nconst apiBaseUrl = \"https://api.toolshed.tech\"\n\nprogram\n .name(\"toolshed\")\n .description(\"Add and discover toolshed tools\")\n .version(\"0.1.0\")\n\nprogram\n .command(\"add\")\n .description(\"add a published tool to your project\")\n .argument(\"<tool>\", \"tool coordinate in the form @owner/name[@version]\")\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .option(\"-o, --overwrite\", \"overwrite existing files.\", false)\n .option(\"--overwrite-files\", \"overwrite changed files without prompts.\", false)\n .option(\"--with-mcp\", \"install optional MCP adapter files when available.\", false)\n .action(\n async (\n tool: string,\n opts: { cwd: string; overwrite: boolean; overwriteFiles: boolean; withMcp: boolean }\n ) => {\n await runAdd(tool, apiBaseUrl, {\n cwd: path.resolve(opts.cwd),\n overwrite: opts.overwrite || opts.overwriteFiles,\n withMcp: opts.withMcp,\n })\n }\n )\n\nprogram\n .command(\"search\")\n .description(\"search published tools\")\n .argument(\"[query]\", \"tool search query\")\n .option(\"-l, --limit <limit>\", \"number of tools to return\", \"20\")\n .action(async (query: string | undefined, opts: { limit: string }) => {\n await runSearch(query ?? \"\", apiBaseUrl, {\n limit: Number.parseInt(opts.limit, 10),\n })\n })\n\nprogram\n .command(\"view\")\n .description(\"view details for a published tool\")\n .argument(\"<tool>\", \"tool coordinate in the form @owner/name\")\n .action(async (tool: string) => {\n await runView(tool, apiBaseUrl)\n })\n\nprogram.parseAsync().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error)\n console.error(message)\n process.exit(1)\n})\n","import { spawn } from \"node:child_process\"\nimport { createInterface } from \"node:readline/promises\"\nimport { stdin as input, stdout as output } from \"node:process\"\nimport { mkdir, mkdtemp, readdir, readFile, rm, stat, writeFile } from \"node:fs/promises\"\nimport os from \"node:os\"\nimport path from \"node:path\"\n\nimport kleur from \"kleur\"\nimport { z } from \"zod\"\n\nimport {\n AI_SDK_REQUIRED_MAJOR,\n MCP_MANIFEST_VARIANT,\n TOOLSHED_MANIFEST_FILENAME,\n isAiSdkRangeCompatible,\n toolManifestSchema,\n} from \"@toolshed/shared\"\n\nimport { parseToolSpecifier } from \"../utils/tool-spec\"\n\nconst resolveResponseSchema = z.object({\n tool: z.object({\n owner: z.string(),\n name: z.string(),\n slug: z.string(),\n description: z.string(),\n isVerifiedOwner: z.boolean(),\n isFork: z.boolean(),\n }),\n version: z.object({\n version: z.string(),\n manifestHash: z.string(),\n aiSdk: z.object({\n major: z.number(),\n range: z.string(),\n }),\n repo: z.object({\n owner: z.string(),\n name: z.string(),\n url: z.string(),\n commitSha: z.string(),\n }),\n }),\n installCommand: z.string(),\n})\n\ntype AddOptions = {\n cwd: string\n overwrite: boolean\n withMcp: boolean\n}\n\ntype PackageManager = \"pnpm\" | \"yarn\" | \"bun\" | \"npm\"\ntype FileAction = \"created\" | \"updated\" | \"skipped_identical\" | \"skipped_user\"\ntype WriteDecision = {\n path: string\n action: FileAction\n reason?: string\n}\n\nconst packageJsonSchema = z.object({\n packageManager: z.string().optional(),\n dependencies: z.record(z.string(), z.string()).optional(),\n devDependencies: z.record(z.string(), z.string()).optional(),\n peerDependencies: z.record(z.string(), z.string()).optional(),\n optionalDependencies: z.record(z.string(), z.string()).optional(),\n})\n\nexport function resolveWithin(root: string, relativePath: string, label: string) {\n const absoluteRoot = path.resolve(root)\n const candidate = path.resolve(absoluteRoot, relativePath)\n if (candidate !== absoluteRoot && !candidate.startsWith(`${absoluteRoot}${path.sep}`)) {\n throw new Error(`Invalid ${label} path in manifest: ${relativePath}`)\n }\n\n return candidate\n}\n\nconst ENV_FILE_REGEX = /^\\.env(\\.|$)/\n\nfunction isEnvLikeFile(filePath: string) {\n return ENV_FILE_REGEX.test(path.basename(filePath))\n}\n\nfunction normalizeText(content: string) {\n return content.replace(/\\r\\n/g, \"\\n\").trim()\n}\n\nfunction parseEnv(content: string) {\n const out = new Map<string, string>()\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith(\"#\")) continue\n const separatorIndex = trimmed.indexOf(\"=\")\n if (separatorIndex < 0) continue\n const key = trimmed.slice(0, separatorIndex).trim()\n const value = trimmed\n .slice(separatorIndex + 1)\n .trim()\n .replace(/^[\"']|[\"']$/g, \"\")\n if (key) out.set(key, value)\n }\n\n return out\n}\n\nfunction mergeEnv(existingContent: string, incomingContent: string) {\n const existing = parseEnv(existingContent)\n const incoming = parseEnv(incomingContent)\n const addedKeys: string[] = []\n\n let merged = existingContent.trimEnd()\n if (merged.length > 0 && !merged.endsWith(\"\\n\")) {\n merged += \"\\n\"\n }\n\n for (const [key, value] of incoming.entries()) {\n if (!existing.has(key)) {\n if (merged.length > 0 && !merged.endsWith(\"\\n\")) {\n merged += \"\\n\"\n }\n merged += `${key}=${value}\\n`\n addedKeys.push(key)\n }\n }\n\n if (merged.length > 0 && !merged.endsWith(\"\\n\")) {\n merged += \"\\n\"\n }\n\n return { merged, addedKeys }\n}\n\nasync function collectSourceFiles(sourcePath: string): Promise<string[]> {\n const sourceStats = await stat(sourcePath)\n if (!sourceStats.isDirectory()) {\n return [sourcePath]\n }\n\n const files: string[] = []\n const queue: string[] = [sourcePath]\n while (queue.length > 0) {\n const current = queue.pop()\n if (!current) break\n\n const entries = await readdir(current, { withFileTypes: true })\n for (const entry of entries) {\n const absoluteEntryPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n queue.push(absoluteEntryPath)\n } else if (entry.isFile()) {\n files.push(absoluteEntryPath)\n }\n }\n }\n\n return files.sort()\n}\n\nasync function promptForOverwrite(targetPath: string) {\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n return false\n }\n\n const rl = createInterface({ input, output })\n try {\n const answer = await rl.question(`Overwrite ${targetPath}? (y/N): `)\n const normalized = answer.trim().toLowerCase()\n return normalized === \"y\" || normalized === \"yes\"\n } finally {\n rl.close()\n }\n}\n\nasync function writeOneFile(\n targetPath: string,\n incomingContent: string,\n overwrite: boolean\n): Promise<WriteDecision> {\n const targetExists = await exists(targetPath)\n if (targetExists) {\n const targetStats = await stat(targetPath)\n if (targetStats.isDirectory()) {\n throw new Error(`Target path is a directory: ${targetPath}`)\n }\n }\n\n const envLikeFile = isEnvLikeFile(targetPath)\n if (targetExists && envLikeFile) {\n const current = await readFile(targetPath, \"utf8\")\n const { merged, addedKeys } = mergeEnv(current, incomingContent)\n if (addedKeys.length === 0) {\n return { path: targetPath, action: \"skipped_identical\", reason: \"no new env keys\" }\n }\n\n await mkdir(path.dirname(targetPath), { recursive: true })\n await writeFile(targetPath, merged, \"utf8\")\n return { path: targetPath, action: \"updated\", reason: `added env keys: ${addedKeys.join(\", \")}` }\n }\n\n if (targetExists && !envLikeFile) {\n const current = await readFile(targetPath, \"utf8\")\n if (normalizeText(current) === normalizeText(incomingContent)) {\n return { path: targetPath, action: \"skipped_identical\", reason: \"content identical\" }\n }\n\n if (!overwrite) {\n const confirmed = await promptForOverwrite(targetPath)\n if (!confirmed) {\n return { path: targetPath, action: \"skipped_user\", reason: \"user declined overwrite\" }\n }\n }\n\n await mkdir(path.dirname(targetPath), { recursive: true })\n await writeFile(targetPath, incomingContent, \"utf8\")\n return { path: targetPath, action: \"updated\" }\n }\n\n await mkdir(path.dirname(targetPath), { recursive: true })\n await writeFile(targetPath, incomingContent, \"utf8\")\n return { path: targetPath, action: \"created\" }\n}\n\nfunction printWriteSummary(decisions: WriteDecision[]) {\n const created = decisions.filter((decision) => decision.action === \"created\")\n const updated = decisions.filter((decision) => decision.action === \"updated\")\n const skippedIdentical = decisions.filter(\n (decision) => decision.action === \"skipped_identical\"\n )\n const skippedUser = decisions.filter((decision) => decision.action === \"skipped_user\")\n\n console.log(kleur.dim(\"Write summary:\"))\n console.log(` created: ${created.length}`)\n console.log(` updated: ${updated.length}`)\n console.log(` skipped_identical: ${skippedIdentical.length}`)\n console.log(` skipped_user: ${skippedUser.length}`)\n\n for (const skipped of [...skippedIdentical, ...skippedUser]) {\n const suffix = skipped.reason ? ` (${skipped.reason})` : \"\"\n console.log(kleur.dim(` - ${skipped.path}${suffix}`))\n }\n}\n\nfunction runCommand(command: string, args: string[], cwd?: string) {\n return new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n stdio: \"inherit\",\n env: process.env,\n })\n\n child.on(\"error\", reject)\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve()\n return\n }\n\n reject(new Error(`${command} ${args.join(\" \")} exited with code ${code ?? \"unknown\"}`))\n })\n })\n}\n\nasync function exists(filePath: string) {\n try {\n await stat(filePath)\n return true\n } catch {\n return false\n }\n}\n\nfunction parsePackageManager(value: string | undefined): PackageManager | null {\n if (!value) return null\n const normalized = value.trim().toLowerCase()\n if (!normalized) return null\n\n if (normalized === \"pnpm\" || normalized.startsWith(\"pnpm@\") || normalized.startsWith(\"pnpm/\")) {\n return \"pnpm\"\n }\n if (normalized === \"yarn\" || normalized.startsWith(\"yarn@\") || normalized.startsWith(\"yarn/\")) {\n return \"yarn\"\n }\n if (normalized === \"bun\" || normalized.startsWith(\"bun@\") || normalized.startsWith(\"bun/\")) {\n return \"bun\"\n }\n if (normalized === \"npm\" || normalized.startsWith(\"npm@\") || normalized.startsWith(\"npm/\")) {\n return \"npm\"\n }\n\n return null\n}\n\nasync function detectPackageManager(cwd: string) {\n const packageJsonPath = path.join(cwd, \"package.json\")\n if (await exists(packageJsonPath)) {\n try {\n const packageJsonRaw = await readFile(packageJsonPath, \"utf8\")\n const parsed = packageJsonSchema.parse(JSON.parse(packageJsonRaw))\n const packageManager = parsePackageManager(parsed.packageManager)\n if (packageManager) return packageManager\n } catch {\n // Ignore malformed package.json and continue to lockfile/user-agent detection.\n }\n }\n\n if (await exists(path.join(cwd, \"pnpm-workspace.yaml\"))) return \"pnpm\"\n if (await exists(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\"\n if (await exists(path.join(cwd, \"yarn.lock\"))) return \"yarn\"\n if (await exists(path.join(cwd, \"bun.lockb\"))) return \"bun\"\n if (await exists(path.join(cwd, \"bun.lock\"))) return \"bun\"\n\n const userAgentManager = parsePackageManager(process.env.npm_config_user_agent)\n if (userAgentManager) return userAgentManager\n\n if (await exists(path.join(cwd, \"package-lock.json\"))) return \"npm\"\n return \"npm\"\n}\n\nexport function normalizeProjectAiRange(value: string) {\n let normalized = value.trim()\n const prefixes = [\"workspace:\", \"catalog:\", \"npm:\", \"pnpm:\", \"yarn:\"]\n for (const prefix of prefixes) {\n if (normalized.startsWith(prefix)) {\n normalized = normalized.slice(prefix.length).trim()\n }\n }\n\n if (normalized.startsWith(\"ai@\")) {\n normalized = normalized.slice(\"ai@\".length)\n }\n\n return normalized\n}\n\nexport async function detectProjectAiRange(cwd: string) {\n const packageJsonPath = path.join(cwd, \"package.json\")\n if (!(await exists(packageJsonPath))) {\n return null\n }\n\n try {\n const packageJsonRaw = await readFile(packageJsonPath, \"utf8\")\n const parsed = packageJsonSchema.parse(JSON.parse(packageJsonRaw))\n const groups = [\n parsed.dependencies,\n parsed.devDependencies,\n parsed.peerDependencies,\n parsed.optionalDependencies,\n ]\n\n for (const group of groups) {\n const aiRange = group?.ai\n if (aiRange) return normalizeProjectAiRange(aiRange)\n }\n } catch {\n return null\n }\n\n return null\n}\n\nasync function installDependencies(\n cwd: string,\n dependencies: string[],\n devDependencies: string[]\n) {\n const deps = [...new Set(dependencies)]\n const devDeps = [...new Set(devDependencies)]\n if (!deps.length && !devDeps.length) return\n\n const packageManager = await detectPackageManager(cwd)\n console.log(kleur.dim(`Installing dependencies with ${packageManager}...`))\n\n if (packageManager === \"pnpm\") {\n if (deps.length) await runCommand(\"pnpm\", [\"add\", ...deps], cwd)\n if (devDeps.length) await runCommand(\"pnpm\", [\"add\", \"-D\", ...devDeps], cwd)\n return\n }\n\n if (packageManager === \"yarn\") {\n if (deps.length) await runCommand(\"yarn\", [\"add\", ...deps], cwd)\n if (devDeps.length) await runCommand(\"yarn\", [\"add\", \"-D\", ...devDeps], cwd)\n return\n }\n\n if (packageManager === \"bun\") {\n if (deps.length) await runCommand(\"bun\", [\"add\", ...deps], cwd)\n if (devDeps.length) await runCommand(\"bun\", [\"add\", \"-d\", ...devDeps], cwd)\n return\n }\n\n if (deps.length) await runCommand(\"npm\", [\"install\", ...deps], cwd)\n if (devDeps.length) await runCommand(\"npm\", [\"install\", \"-D\", ...devDeps], cwd)\n}\n\nexport async function runAdd(specifier: string, apiBaseUrl: string, options: AddOptions) {\n const coordinate = parseToolSpecifier(specifier, { allowVersion: true })\n const versionSuffix = coordinate.version ? `/${encodeURIComponent(coordinate.version)}` : \"\"\n const endpoint = `${apiBaseUrl}/cli/resolve/${coordinate.owner}/${coordinate.name}${versionSuffix}`\n\n console.log(kleur.dim(`Resolving @${coordinate.owner}/${coordinate.name}...`))\n const response = await fetch(endpoint)\n if (!response.ok) {\n const errorBody = await response.text()\n throw new Error(`Failed to resolve ${specifier} (${response.status}): ${errorBody}`)\n }\n\n const payload = resolveResponseSchema.parse(await response.json())\n if (!payload.tool.isVerifiedOwner) {\n console.log(\n kleur.yellow(\n `Warning: @${payload.tool.owner}/${payload.tool.name} is not from a verified owner.`\n )\n )\n }\n\n const tmpDir = await mkdtemp(path.join(os.tmpdir(), \"toolshed-\"))\n const repoDir = path.join(tmpDir, \"repo\")\n\n try {\n console.log(kleur.dim(`Cloning ${payload.version.repo.url}...`))\n await runCommand(\"git\", [\"clone\", \"--quiet\", payload.version.repo.url, repoDir])\n await runCommand(\"git\", [\"-C\", repoDir, \"checkout\", \"--quiet\", payload.version.repo.commitSha])\n\n const toolRootCandidates = [repoDir, path.join(repoDir, \"tools\", payload.tool.name)]\n const toolRoot = (\n await Promise.all(\n toolRootCandidates.map(async (candidate) => {\n const candidateManifestPath = path.join(candidate, TOOLSHED_MANIFEST_FILENAME)\n return (await exists(candidateManifestPath)) ? candidate : null\n })\n )\n ).find((value): value is string => value !== null)\n\n if (!toolRoot) {\n throw new Error(\n `Unable to locate ${TOOLSHED_MANIFEST_FILENAME} in repository root or tools/${payload.tool.name}`\n )\n }\n\n const manifestPath = path.join(toolRoot, TOOLSHED_MANIFEST_FILENAME)\n const manifestRaw = await readFile(manifestPath, \"utf8\")\n const manifest = toolManifestSchema.parse(JSON.parse(manifestRaw))\n\n if (\n payload.version.aiSdk.major !== manifest.aiSdk.major ||\n payload.version.aiSdk.range !== manifest.aiSdk.range\n ) {\n console.log(\n kleur.yellow(\n `Warning: registry metadata reports AI SDK ${payload.version.aiSdk.major} (${payload.version.aiSdk.range}), but manifest requires AI SDK ${manifest.aiSdk.major} (${manifest.aiSdk.range}).`\n )\n )\n }\n\n const projectAiRange = await detectProjectAiRange(options.cwd)\n if (!projectAiRange) {\n console.log(\n kleur.yellow(\n `Warning: no \"ai\" dependency found in ${path.join(\n options.cwd,\n \"package.json\"\n )}. This tool requires AI SDK ${manifest.aiSdk.major} (${manifest.aiSdk.range}).`\n )\n )\n } else if (!isAiSdkRangeCompatible(projectAiRange)) {\n console.log(\n kleur.yellow(\n `Warning: project declares ai@${projectAiRange}, but this tool requires AI SDK ${AI_SDK_REQUIRED_MAJOR} (${manifest.aiSdk.range}).`\n )\n )\n }\n\n const filesToInstall = manifest.files.filter((entry) => {\n if (entry.variant === MCP_MANIFEST_VARIANT && !options.withMcp) {\n return false\n }\n\n return true\n })\n\n const mcpFileCount = manifest.files.filter(\n (entry) => entry.variant === MCP_MANIFEST_VARIANT\n ).length\n const installedMcpFiles = filesToInstall.filter(\n (entry) => entry.variant === MCP_MANIFEST_VARIANT\n ).length\n\n const writeDecisions: WriteDecision[] = []\n for (const entry of filesToInstall) {\n const sourcePath = resolveWithin(toolRoot, entry.source, \"source\")\n const targetPath = resolveWithin(options.cwd, entry.target, \"target\")\n const sourceFiles = await collectSourceFiles(sourcePath)\n\n for (const sourceFilePath of sourceFiles) {\n const sourceRelativePath = path.relative(sourcePath, sourceFilePath)\n const resolvedTargetPath =\n sourceFiles.length === 1 && sourceRelativePath === \"\"\n ? targetPath\n : path.join(targetPath, sourceRelativePath)\n const incomingContent = await readFile(sourceFilePath, \"utf8\")\n const decision = await writeOneFile(\n resolvedTargetPath,\n incomingContent,\n options.overwrite\n )\n writeDecisions.push(decision)\n }\n }\n\n printWriteSummary(writeDecisions)\n\n await installDependencies(\n options.cwd,\n manifest.dependencies ?? [],\n manifest.devDependencies ?? []\n )\n\n console.log(\n kleur.green(\n `Installed @${payload.tool.owner}/${payload.tool.name}@${payload.version.version}`\n )\n )\n console.log(kleur.dim(`Source: ${payload.version.repo.url}#${payload.version.repo.commitSha}`))\n console.log(`Provider: ${manifest.provider}`)\n console.log(`Operation: ${manifest.operation}`)\n if (manifest.operation === \"write\") {\n console.log(`Write guardrail: ${manifest.guardrail}`)\n }\n\n const envKeys = Object.keys(manifest.envVars ?? {})\n if (envKeys.length) {\n console.log(kleur.yellow(\"Required environment variables:\"))\n for (const envKey of envKeys) {\n console.log(` - ${envKey}`)\n }\n }\n\n if (options.withMcp && installedMcpFiles === 0) {\n console.log(kleur.yellow(\"No MCP adapter files were found in this tool package.\"))\n } else if (options.withMcp && installedMcpFiles > 0) {\n console.log(kleur.dim(`Included ${installedMcpFiles} MCP adapter file(s).`))\n } else if (!options.withMcp && mcpFileCount > 0) {\n console.log(kleur.dim(\"Tip: re-run with --with-mcp to install optional MCP adapter files.\"))\n }\n } finally {\n await rm(tmpDir, { recursive: true, force: true })\n }\n}\n","import { z } from \"zod\"\nexport * from \"./tool-release-map\"\n\nexport const TOOLSHED_MANIFEST_FILENAME = \"toolshed.tool.json\"\nexport const AI_SDK_PACKAGE_NAME = \"ai\"\nexport const AI_SDK_REQUIRED_MAJOR = 6\nexport const AI_SDK_REQUIRED_RANGE = \">=6 <7\"\nexport const MCP_MANIFEST_VARIANT = \"mcp\"\n\nfunction stripVersionProtocol(value: string) {\n let normalized = value.trim()\n const protocols = [\"workspace:\", \"npm:\", \"pnpm:\", \"yarn:\", \"catalog:\"]\n for (const protocol of protocols) {\n if (normalized.startsWith(protocol)) {\n normalized = normalized.slice(protocol.length).trim()\n }\n }\n\n return normalized\n}\n\nfunction extractDependencyNameAndRange(specifier: string): { name: string; range: string | null } {\n const normalized = stripVersionProtocol(specifier)\n const scopedMatch = normalized.match(/^(@[^/@\\s]+\\/[^@\\s]+)(?:@(.+))?$/)\n if (scopedMatch) {\n return {\n name: scopedMatch[1] ?? normalized,\n range: scopedMatch[2]?.trim() || null,\n }\n }\n\n const plainMatch = normalized.match(/^([^@\\s]+)(?:@(.+))?$/)\n if (plainMatch) {\n return {\n name: plainMatch[1] ?? normalized,\n range: plainMatch[2]?.trim() || null,\n }\n }\n\n return {\n name: normalized,\n range: null,\n }\n}\n\nfunction isAiSdk6Range(range: string) {\n const normalized = stripVersionProtocol(range).replace(/\\s+/g, \"\")\n if (!normalized) return false\n\n const disjunctive = normalized.split(\"||\")\n return disjunctive.some((candidate) => {\n if (/^[~^]?6(?:\\.|$)/.test(candidate)) return true\n if (/^6(?:\\.x)?(?:\\.x)?$/.test(candidate)) return true\n if (/^>=6(?:\\.0\\.0)?<7(?:\\.0\\.0)?$/.test(candidate)) return true\n return false\n })\n}\n\nexport function parseDependencySpecifier(specifier: string) {\n return extractDependencyNameAndRange(specifier)\n}\n\nexport function findAiSdkDependencySpecifier(entries: string[]) {\n return entries.find((entry) => {\n const parsed = extractDependencyNameAndRange(entry)\n return parsed.name === AI_SDK_PACKAGE_NAME\n })\n}\n\nexport function isAiSdkSpecifierCompatible(specifier: string) {\n const parsed = extractDependencyNameAndRange(specifier)\n if (parsed.name !== AI_SDK_PACKAGE_NAME || !parsed.range) return false\n return isAiSdk6Range(parsed.range)\n}\n\nexport function isAiSdkRangeCompatible(range: string) {\n return isAiSdk6Range(range)\n}\n\nexport const aiSdkRequirementSchema = z.object({\n package: z.literal(AI_SDK_PACKAGE_NAME).default(AI_SDK_PACKAGE_NAME),\n major: z.literal(AI_SDK_REQUIRED_MAJOR).default(AI_SDK_REQUIRED_MAJOR),\n range: z.string().min(1).default(AI_SDK_REQUIRED_RANGE),\n})\n\nexport const toolProviderSchema = z.enum([\"github\", \"gmail\", \"spotify\", \"generic\"])\nexport const toolOperationSchema = z.enum([\"read\", \"write\", \"mixed\"])\nexport const toolGuardrailSchema = z.enum([\"confirm_true\", \"none\"])\nexport const manifestFileVariantSchema = z.enum([\"core\", MCP_MANIFEST_VARIANT])\n\nexport const toolManifestFileSchema = z.object({\n source: z.string().min(1),\n target: z.string().min(1),\n variant: manifestFileVariantSchema.default(\"core\"),\n})\n\nexport const toolManifestSchema = z.object({\n name: z.string().min(2),\n version: z.string().min(1),\n description: z.string().min(10),\n aiSdk: aiSdkRequirementSchema.default({\n package: AI_SDK_PACKAGE_NAME,\n major: AI_SDK_REQUIRED_MAJOR,\n range: AI_SDK_REQUIRED_RANGE,\n }),\n entry: z.string().min(1),\n files: z.array(toolManifestFileSchema),\n dependencies: z.array(z.string()).default([]),\n devDependencies: z.array(z.string()).default([]),\n envVars: z.record(z.string(), z.string()).optional(),\n provider: toolProviderSchema.default(\"generic\"),\n operation: toolOperationSchema.default(\"read\"),\n guardrail: toolGuardrailSchema.default(\"none\"),\n mcpAdapterAvailable: z.boolean().default(false),\n keywords: z.array(z.string()).default([]),\n}).superRefine((manifest, ctx) => {\n const dependencyEntries = [...manifest.dependencies, ...manifest.devDependencies]\n const aiSpecifier = findAiSdkDependencySpecifier(dependencyEntries)\n\n if (!aiSpecifier) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Manifest must include ${AI_SDK_PACKAGE_NAME} with an explicit ${AI_SDK_REQUIRED_RANGE} range in dependencies or devDependencies.`,\n path: [\"dependencies\"],\n })\n return\n }\n\n if (!isAiSdkSpecifierCompatible(aiSpecifier)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `${AI_SDK_PACKAGE_NAME} dependency must be compatible with ${AI_SDK_REQUIRED_RANGE}; received \"${aiSpecifier}\".`,\n path: [\"dependencies\"],\n })\n }\n\n const hasMcpFiles = manifest.files.some((entry) => entry.variant === MCP_MANIFEST_VARIANT)\n if (manifest.mcpAdapterAvailable && !hasMcpFiles) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"mcpAdapterAvailable=true requires at least one files entry with variant=\\\"mcp\\\".\",\n path: [\"files\"],\n })\n }\n\n if (!manifest.mcpAdapterAvailable && hasMcpFiles) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"files entries with variant=\\\"mcp\\\" require mcpAdapterAvailable=true.\",\n path: [\"mcpAdapterAvailable\"],\n })\n }\n\n if (\n (manifest.operation === \"write\" || manifest.operation === \"mixed\") &&\n manifest.guardrail !== \"confirm_true\"\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Write-capable tools must set guardrail to \\\"confirm_true\\\".\",\n path: [\"guardrail\"],\n })\n }\n})\n\nexport type ToolManifest = z.infer<typeof toolManifestSchema>\n\nexport const toolCoordinateSchema = z.object({\n owner: z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9-]{0,38}$/),\n tool: z.string().regex(/^[a-z0-9-]+$/),\n version: z.string().optional(),\n})\n\nexport type ToolCoordinate = z.infer<typeof toolCoordinateSchema>\n\nexport const releaseVersionSchema = z.string().regex(/^\\d+\\.\\d+\\.\\d+(?:[-+][0-9A-Za-z.-]+)?$/)\nexport const commitShaSchema = z.string().regex(/^[a-f0-9]{40}$/i)\nexport const manifestHashSchema = z.string().regex(/^[a-f0-9]{64}$/i)\n\nexport const publishReleaseSchema = z.object({\n owner: toolCoordinateSchema.shape.owner,\n name: toolCoordinateSchema.shape.tool,\n description: z.string().min(10),\n version: releaseVersionSchema,\n repoUrl: z.string().url(),\n commitSha: commitShaSchema,\n manifestHash: manifestHashSchema,\n isVerifiedOwner: z.boolean(),\n isFork: z.boolean().default(false),\n upstreamOwner: z.string().optional(),\n upstreamRepo: z.string().optional(),\n upstreamUrl: z.string().url().optional(),\n aiSdkMajor: z.literal(AI_SDK_REQUIRED_MAJOR).default(AI_SDK_REQUIRED_MAJOR),\n aiSdkRange: z.string().min(1).default(AI_SDK_REQUIRED_RANGE),\n})\n\nexport type PublishReleaseInput = z.infer<typeof publishReleaseSchema>\n\nexport const publishReleaseFromCiSchema = publishReleaseSchema\n\nexport type PublishReleaseFromCiInput = z.infer<typeof publishReleaseFromCiSchema>\n","import { z } from \"zod\"\n\nexport const toolReleaseMapEntrySchema = z.object({\n toolName: z.string().regex(/^[a-z0-9-]+$/),\n sourcePath: z.string().min(1),\n publicRepo: z.string().url().regex(/^https:\\/\\/github\\.com\\/[^/]+\\/[^/]+(?:\\.git)?$/),\n publicDefaultBranch: z.string().min(1).default(\"main\"),\n})\n\nexport type ToolReleaseMapEntry = z.infer<typeof toolReleaseMapEntrySchema>\n\nexport const toolReleaseMapSchema = z.object({\n tools: z.array(toolReleaseMapEntrySchema),\n})\n\nexport type ToolReleaseMap = z.infer<typeof toolReleaseMapSchema>\n\n","import { toolCoordinateSchema } from \"@toolshed/shared\"\n\ntype ParseOptions = {\n allowVersion?: boolean\n}\n\nexport function parseToolSpecifier(input: string, options: ParseOptions = {}) {\n const allowVersion = options.allowVersion ?? true\n const trimmed = input.trim()\n const withoutPrefix = trimmed.replace(/^@/, \"\")\n\n const slashIndex = withoutPrefix.indexOf(\"/\")\n if (slashIndex < 1) {\n throw new Error(\"Tool must be in the format @owner/name[@version]\")\n }\n\n const owner = withoutPrefix.slice(0, slashIndex)\n const remainder = withoutPrefix.slice(slashIndex + 1)\n if (!remainder || remainder.includes(\"/\")) {\n throw new Error(\"Tool must be in the format @owner/name[@version]\")\n }\n\n let name = remainder\n let version: string | undefined\n const atIndex = remainder.lastIndexOf(\"@\")\n if (atIndex > 0) {\n if (!allowVersion) {\n throw new Error(\"Tool must be in the format @owner/name\")\n }\n name = remainder.slice(0, atIndex)\n version = remainder.slice(atIndex + 1)\n }\n\n const parsed = toolCoordinateSchema.safeParse({\n owner,\n tool: name,\n version,\n })\n\n if (!parsed.success) {\n throw new Error(\"Tool must be in the format @owner/name[@version]\")\n }\n\n return {\n owner: parsed.data.owner.toLowerCase(),\n name: parsed.data.tool,\n version: parsed.data.version,\n }\n}\n","import kleur from \"kleur\"\nimport { z } from \"zod\"\n\nconst searchResponseSchema = z.object({\n items: z.array(\n z.object({\n owner: z.string(),\n name: z.string(),\n description: z.string(),\n latestVersion: z.string().nullable(),\n isVerifiedOwner: z.boolean(),\n isFork: z.boolean(),\n })\n ),\n})\n\ntype SearchOptions = {\n limit: number\n}\n\nfunction parseLimit(input: number) {\n if (!Number.isFinite(input) || input <= 0) return 20\n return Math.min(Math.floor(input), 100)\n}\n\nexport async function runSearch(query: string, apiBaseUrl: string, options: SearchOptions) {\n const url = new URL(\"/cli/search\", apiBaseUrl)\n if (query.trim()) {\n url.searchParams.set(\"q\", query.trim())\n }\n url.searchParams.set(\"limit\", String(parseLimit(options.limit)))\n\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`Search failed (${response.status})`)\n }\n\n const payload = searchResponseSchema.parse(await response.json())\n if (!payload.items.length) {\n console.log(\"No tools found.\")\n return\n }\n\n for (const item of payload.items) {\n const version = item.latestVersion ?? \"n/a\"\n const ownerState = item.isVerifiedOwner\n ? kleur.green(\"verified\")\n : item.isFork\n ? kleur.yellow(\"fork\")\n : kleur.red(\"unverified\")\n\n console.log(`${kleur.bold(`@${item.owner}/${item.name}`)} ${kleur.dim(`v${version}`)} ${ownerState}`)\n console.log(` ${item.description}`)\n }\n}\n","import kleur from \"kleur\"\nimport { z } from \"zod\"\n\nimport { parseToolSpecifier } from \"../utils/tool-spec\"\n\nconst viewResponseSchema = z.object({\n tool: z.object({\n owner: z.string(),\n name: z.string(),\n description: z.string(),\n latestVersion: z.string().nullable(),\n isVerifiedOwner: z.boolean(),\n isFork: z.boolean(),\n upstreamOwner: z.string().nullable(),\n upstreamRepo: z.string().nullable(),\n upstreamUrl: z.string().nullable(),\n }),\n versions: z.array(\n z.object({\n version: z.string(),\n repoUrl: z.string(),\n commitSha: z.string(),\n aiSdkMajor: z.number(),\n aiSdkRange: z.string(),\n createdAt: z.string(),\n })\n ),\n installCommand: z.string(),\n})\n\nexport async function runView(specifier: string, apiBaseUrl: string) {\n const coordinate = parseToolSpecifier(specifier, { allowVersion: false })\n\n const response = await fetch(`${apiBaseUrl}/cli/view/${coordinate.owner}/${coordinate.name}`)\n if (!response.ok) {\n throw new Error(`View failed (${response.status})`)\n }\n\n const payload = viewResponseSchema.parse(await response.json())\n\n console.log(kleur.bold(`@${payload.tool.owner}/${payload.tool.name}`))\n console.log(payload.tool.description)\n console.log(`Latest version: ${payload.tool.latestVersion ?? \"n/a\"}`)\n console.log(`Owner status: ${payload.tool.isVerifiedOwner ? \"verified\" : \"unverified\"}`)\n const latest = payload.versions[0]\n if (latest) {\n console.log(`AI SDK: v${latest.aiSdkMajor} (${latest.aiSdkRange})`)\n }\n\n if (payload.tool.isFork && payload.tool.upstreamOwner && payload.tool.upstreamRepo) {\n console.log(\n kleur.yellow(\n `Forked from @${payload.tool.upstreamOwner}/${payload.tool.upstreamRepo}${\n payload.tool.upstreamUrl ? ` (${payload.tool.upstreamUrl})` : \"\"\n }`\n )\n )\n }\n\n console.log(\"\")\n console.log(kleur.dim(\"Install\"))\n console.log(payload.installCommand)\n\n if (payload.versions.length) {\n console.log(\"\")\n console.log(kleur.dim(\"Recent versions\"))\n for (const version of payload.versions.slice(0, 10)) {\n console.log(`- ${version.version} ${version.commitSha.slice(0, 8)} ${version.repoUrl}`)\n }\n }\n}\n"],"mappings":"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","names":["path","z","z","z","input","z","apiBaseUrl","kleur","z","input","apiBaseUrl","kleur","z","z","apiBaseUrl","kleur","path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toolshedai/cli",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "description": "CLI for toolshed.tech - discover and install AI tools",
6
6
  "license": "MIT",