@toolshedai/cli 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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";
@@ -17,11 +19,18 @@ import { z as z2 } from "zod";
17
19
 
18
20
  // ../shared/src/tool-release-map.ts
19
21
  import { z } from "zod";
22
+ var publicToolPathSchema = z.string().min(1).default(".").refine((value) => {
23
+ if (value === ".") return true;
24
+ if (value.startsWith("/") || value.endsWith("/")) return false;
25
+ if (value.includes("..")) return false;
26
+ return /^[A-Za-z0-9._/-]+$/.test(value);
27
+ }, "publicToolPath must be '.' or a safe relative path without '..'");
20
28
  var toolReleaseMapEntrySchema = z.object({
21
29
  toolName: z.string().regex(/^[a-z0-9-]+$/),
22
30
  sourcePath: z.string().min(1),
23
31
  publicRepo: z.string().url().regex(/^https:\/\/github\.com\/[^/]+\/[^/]+(?:\.git)?$/),
24
- publicDefaultBranch: z.string().min(1).default("main")
32
+ publicDefaultBranch: z.string().min(1).default("main"),
33
+ publicToolPath: publicToolPathSchema
25
34
  });
26
35
  var toolReleaseMapSchema = z.object({
27
36
  tools: z.array(toolReleaseMapEntrySchema)
@@ -171,12 +180,19 @@ var toolCoordinateSchema = z2.object({
171
180
  var releaseVersionSchema = z2.string().regex(/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/);
172
181
  var commitShaSchema = z2.string().regex(/^[a-f0-9]{40}$/i);
173
182
  var manifestHashSchema = z2.string().regex(/^[a-f0-9]{64}$/i);
183
+ var repoPathSchema = z2.string().min(1).default(".").refine((value) => {
184
+ if (value === ".") return true;
185
+ if (value.startsWith("/") || value.endsWith("/")) return false;
186
+ if (value.includes("..")) return false;
187
+ return /^[A-Za-z0-9._/-]+$/.test(value);
188
+ }, "repoPath must be '.' or a safe relative path without '..'");
174
189
  var publishReleaseSchema = z2.object({
175
190
  owner: toolCoordinateSchema.shape.owner,
176
191
  name: toolCoordinateSchema.shape.tool,
177
192
  description: z2.string().min(10),
178
193
  version: releaseVersionSchema,
179
194
  repoUrl: z2.string().url(),
195
+ repoPath: repoPathSchema,
180
196
  commitSha: commitShaSchema,
181
197
  manifestHash: manifestHashSchema,
182
198
  isVerifiedOwner: z2.boolean(),
@@ -189,9 +205,9 @@ var publishReleaseSchema = z2.object({
189
205
  });
190
206
 
191
207
  // src/utils/tool-spec.ts
192
- function parseToolSpecifier(input, options = {}) {
208
+ function parseToolSpecifier(input2, options = {}) {
193
209
  const allowVersion = options.allowVersion ?? true;
194
- const trimmed = input.trim();
210
+ const trimmed = input2.trim();
195
211
  const withoutPrefix = trimmed.replace(/^@/, "");
196
212
  const slashIndex = withoutPrefix.indexOf("/");
197
213
  if (slashIndex < 1) {
@@ -268,6 +284,139 @@ function resolveWithin(root, relativePath, label) {
268
284
  }
269
285
  return candidate;
270
286
  }
287
+ var ENV_FILE_REGEX = /^\.env(\.|$)/;
288
+ function isEnvLikeFile(filePath) {
289
+ return ENV_FILE_REGEX.test(path.basename(filePath));
290
+ }
291
+ function normalizeText(content) {
292
+ return content.replace(/\r\n/g, "\n").trim();
293
+ }
294
+ function parseEnv(content) {
295
+ const out = /* @__PURE__ */ new Map();
296
+ for (const line of content.split("\n")) {
297
+ const trimmed = line.trim();
298
+ if (!trimmed || trimmed.startsWith("#")) continue;
299
+ const separatorIndex = trimmed.indexOf("=");
300
+ if (separatorIndex < 0) continue;
301
+ const key = trimmed.slice(0, separatorIndex).trim();
302
+ const value = trimmed.slice(separatorIndex + 1).trim().replace(/^["']|["']$/g, "");
303
+ if (key) out.set(key, value);
304
+ }
305
+ return out;
306
+ }
307
+ function mergeEnv(existingContent, incomingContent) {
308
+ const existing = parseEnv(existingContent);
309
+ const incoming = parseEnv(incomingContent);
310
+ const addedKeys = [];
311
+ let merged = existingContent.trimEnd();
312
+ if (merged.length > 0 && !merged.endsWith("\n")) {
313
+ merged += "\n";
314
+ }
315
+ for (const [key, value] of incoming.entries()) {
316
+ if (!existing.has(key)) {
317
+ if (merged.length > 0 && !merged.endsWith("\n")) {
318
+ merged += "\n";
319
+ }
320
+ merged += `${key}=${value}
321
+ `;
322
+ addedKeys.push(key);
323
+ }
324
+ }
325
+ if (merged.length > 0 && !merged.endsWith("\n")) {
326
+ merged += "\n";
327
+ }
328
+ return { merged, addedKeys };
329
+ }
330
+ async function collectSourceFiles(sourcePath) {
331
+ const sourceStats = await stat(sourcePath);
332
+ if (!sourceStats.isDirectory()) {
333
+ return [sourcePath];
334
+ }
335
+ const files = [];
336
+ const queue = [sourcePath];
337
+ while (queue.length > 0) {
338
+ const current = queue.pop();
339
+ if (!current) break;
340
+ const entries = await readdir(current, { withFileTypes: true });
341
+ for (const entry of entries) {
342
+ const absoluteEntryPath = path.join(current, entry.name);
343
+ if (entry.isDirectory()) {
344
+ queue.push(absoluteEntryPath);
345
+ } else if (entry.isFile()) {
346
+ files.push(absoluteEntryPath);
347
+ }
348
+ }
349
+ }
350
+ return files.sort();
351
+ }
352
+ async function promptForOverwrite(targetPath) {
353
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
354
+ return false;
355
+ }
356
+ const rl = createInterface({ input, output });
357
+ try {
358
+ const answer = await rl.question(`Overwrite ${targetPath}? (y/N): `);
359
+ const normalized = answer.trim().toLowerCase();
360
+ return normalized === "y" || normalized === "yes";
361
+ } finally {
362
+ rl.close();
363
+ }
364
+ }
365
+ async function writeOneFile(targetPath, incomingContent, overwrite) {
366
+ const targetExists = await exists(targetPath);
367
+ if (targetExists) {
368
+ const targetStats = await stat(targetPath);
369
+ if (targetStats.isDirectory()) {
370
+ throw new Error(`Target path is a directory: ${targetPath}`);
371
+ }
372
+ }
373
+ const envLikeFile = isEnvLikeFile(targetPath);
374
+ if (targetExists && envLikeFile) {
375
+ const current = await readFile(targetPath, "utf8");
376
+ const { merged, addedKeys } = mergeEnv(current, incomingContent);
377
+ if (addedKeys.length === 0) {
378
+ return { path: targetPath, action: "skipped_identical", reason: "no new env keys" };
379
+ }
380
+ await mkdir(path.dirname(targetPath), { recursive: true });
381
+ await writeFile(targetPath, merged, "utf8");
382
+ return { path: targetPath, action: "updated", reason: `added env keys: ${addedKeys.join(", ")}` };
383
+ }
384
+ if (targetExists && !envLikeFile) {
385
+ const current = await readFile(targetPath, "utf8");
386
+ if (normalizeText(current) === normalizeText(incomingContent)) {
387
+ return { path: targetPath, action: "skipped_identical", reason: "content identical" };
388
+ }
389
+ if (!overwrite) {
390
+ const confirmed = await promptForOverwrite(targetPath);
391
+ if (!confirmed) {
392
+ return { path: targetPath, action: "skipped_user", reason: "user declined overwrite" };
393
+ }
394
+ }
395
+ await mkdir(path.dirname(targetPath), { recursive: true });
396
+ await writeFile(targetPath, incomingContent, "utf8");
397
+ return { path: targetPath, action: "updated" };
398
+ }
399
+ await mkdir(path.dirname(targetPath), { recursive: true });
400
+ await writeFile(targetPath, incomingContent, "utf8");
401
+ return { path: targetPath, action: "created" };
402
+ }
403
+ function printWriteSummary(decisions) {
404
+ const created = decisions.filter((decision) => decision.action === "created");
405
+ const updated = decisions.filter((decision) => decision.action === "updated");
406
+ const skippedIdentical = decisions.filter(
407
+ (decision) => decision.action === "skipped_identical"
408
+ );
409
+ const skippedUser = decisions.filter((decision) => decision.action === "skipped_user");
410
+ console.log(kleur.dim("Write summary:"));
411
+ console.log(` created: ${created.length}`);
412
+ console.log(` updated: ${updated.length}`);
413
+ console.log(` skipped_identical: ${skippedIdentical.length}`);
414
+ console.log(` skipped_user: ${skippedUser.length}`);
415
+ for (const skipped of [...skippedIdentical, ...skippedUser]) {
416
+ const suffix = skipped.reason ? ` (${skipped.reason})` : "";
417
+ console.log(kleur.dim(` - ${skipped.path}${suffix}`));
418
+ }
419
+ }
271
420
  function runCommand(command, args, cwd) {
272
421
  return new Promise((resolve, reject) => {
273
422
  const child = spawn(command, args, {
@@ -416,7 +565,11 @@ async function runAdd(specifier, apiBaseUrl2, options) {
416
565
  console.log(kleur.dim(`Cloning ${payload.version.repo.url}...`));
417
566
  await runCommand("git", ["clone", "--quiet", payload.version.repo.url, repoDir]);
418
567
  await runCommand("git", ["-C", repoDir, "checkout", "--quiet", payload.version.repo.commitSha]);
419
- const toolRootCandidates = [repoDir, path.join(repoDir, "tools", payload.tool.name)];
568
+ const toolRootCandidates = [
569
+ repoDir,
570
+ path.join(repoDir, payload.tool.name),
571
+ path.join(repoDir, "tools", payload.tool.name)
572
+ ];
420
573
  const toolRoot = (await Promise.all(
421
574
  toolRootCandidates.map(async (candidate) => {
422
575
  const candidateManifestPath = path.join(candidate, TOOLSHED_MANIFEST_FILENAME);
@@ -425,7 +578,7 @@ async function runAdd(specifier, apiBaseUrl2, options) {
425
578
  )).find((value) => value !== null);
426
579
  if (!toolRoot) {
427
580
  throw new Error(
428
- `Unable to locate ${TOOLSHED_MANIFEST_FILENAME} in repository root or tools/${payload.tool.name}`
581
+ `Unable to locate ${TOOLSHED_MANIFEST_FILENAME} in repository root, ${payload.tool.name}/, or tools/${payload.tool.name}/`
429
582
  );
430
583
  }
431
584
  const manifestPath = path.join(toolRoot, TOOLSHED_MANIFEST_FILENAME);
@@ -467,16 +620,24 @@ async function runAdd(specifier, apiBaseUrl2, options) {
467
620
  const installedMcpFiles = filesToInstall.filter(
468
621
  (entry) => entry.variant === MCP_MANIFEST_VARIANT
469
622
  ).length;
623
+ const writeDecisions = [];
470
624
  for (const entry of filesToInstall) {
471
625
  const sourcePath = resolveWithin(toolRoot, entry.source, "source");
472
626
  const targetPath = resolveWithin(options.cwd, entry.target, "target");
473
- await mkdir(path.dirname(targetPath), { recursive: true });
474
- await cp(sourcePath, targetPath, {
475
- recursive: true,
476
- force: options.overwrite,
477
- errorOnExist: !options.overwrite
478
- });
627
+ const sourceFiles = await collectSourceFiles(sourcePath);
628
+ for (const sourceFilePath of sourceFiles) {
629
+ const sourceRelativePath = path.relative(sourcePath, sourceFilePath);
630
+ const resolvedTargetPath = sourceFiles.length === 1 && sourceRelativePath === "" ? targetPath : path.join(targetPath, sourceRelativePath);
631
+ const incomingContent = await readFile(sourceFilePath, "utf8");
632
+ const decision = await writeOneFile(
633
+ resolvedTargetPath,
634
+ incomingContent,
635
+ options.overwrite
636
+ );
637
+ writeDecisions.push(decision);
638
+ }
479
639
  }
640
+ printWriteSummary(writeDecisions);
480
641
  await installDependencies(
481
642
  options.cwd,
482
643
  manifest.dependencies ?? [],
@@ -527,9 +688,9 @@ var searchResponseSchema = z4.object({
527
688
  })
528
689
  )
529
690
  });
530
- function parseLimit(input) {
531
- if (!Number.isFinite(input) || input <= 0) return 20;
532
- return Math.min(Math.floor(input), 100);
691
+ function parseLimit(input2) {
692
+ if (!Number.isFinite(input2) || input2 <= 0) return 20;
693
+ return Math.min(Math.floor(input2), 100);
533
694
  }
534
695
  async function runSearch(query, apiBaseUrl2, options) {
535
696
  const url = new URL("/cli/search", apiBaseUrl2);
@@ -618,19 +779,21 @@ async function runView(specifier, apiBaseUrl2) {
618
779
  // src/index.ts
619
780
  var program = new Command();
620
781
  var apiBaseUrl = "https://api.toolshed.tech";
621
- program.name("toolshed").description("Add and discover toolshed tools").version("0.1.0");
782
+ program.name("toolshed").description("Add and discover toolshed tools").version("0.1.2");
622
783
  program.command("add").description("add a published tool to your project").argument("<tool>", "tool coordinate in the form @owner/name[@version]").option(
623
784
  "-c, --cwd <cwd>",
624
785
  "the working directory. defaults to the current directory.",
625
786
  process.cwd()
626
- ).option("-o, --overwrite", "overwrite existing files.", false).option("--with-mcp", "install optional MCP adapter files when available.", false).action(async (tool, opts) => {
627
- await runAdd(tool, apiBaseUrl, {
628
- cwd: path2.resolve(opts.cwd),
629
- overwrite: opts.overwrite,
630
- withMcp: opts.withMcp
631
- });
632
- });
633
- 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) => {
787
+ ).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(
788
+ async (tool, opts) => {
789
+ await runAdd(tool, apiBaseUrl, {
790
+ cwd: path2.resolve(opts.cwd),
791
+ overwrite: opts.overwrite || opts.overwriteFiles,
792
+ withMcp: opts.withMcp
793
+ });
794
+ }
795
+ );
796
+ program.command("search", { hidden: true }).description("search published tools").argument("[query]", "tool search query").option("-l, --limit <limit>", "number of tools to return", "20").action(async (query, opts) => {
634
797
  await runSearch(query ?? "", apiBaseUrl, {
635
798
  limit: Number.parseInt(opts.limit, 10)
636
799
  });
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\ntype PackageManager = \"pnpm\" | \"yarn\" | \"bun\" | \"npm\"\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\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 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.2\")\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\", { hidden: true })\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 = [\n repoDir,\n path.join(repoDir, payload.tool.name),\n path.join(repoDir, \"tools\", payload.tool.name),\n ]\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, ${payload.tool.name}/, 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)\nexport const repoPathSchema = z\n .string()\n .min(1)\n .default(\".\")\n .refine((value) => {\n if (value === \".\") return true\n if (value.startsWith(\"/\") || value.endsWith(\"/\")) return false\n if (value.includes(\"..\")) return false\n return /^[A-Za-z0-9._/-]+$/.test(value)\n }, \"repoPath must be '.' or a safe relative path without '..'\")\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 repoPath: repoPathSchema,\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\nconst publicToolPathSchema = z\n .string()\n .min(1)\n .default(\".\")\n .refine((value) => {\n if (value === \".\") return true\n if (value.startsWith(\"/\") || value.endsWith(\"/\")) return false\n if (value.includes(\"..\")) return false\n return /^[A-Za-z0-9._/-]+$/.test(value)\n }, \"publicToolPath must be '.' or a safe relative path without '..'\")\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 publicToolPath: publicToolPathSchema,\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","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.1",
3
+ "version": "0.1.3",
4
4
  "type": "module",
5
5
  "description": "CLI for toolshed.tech - discover and install AI tools",
6
6
  "license": "MIT",