@toolshedai/cli 0.1.2 → 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 +23 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -19,11 +19,18 @@ import { z as z2 } from "zod";
|
|
|
19
19
|
|
|
20
20
|
// ../shared/src/tool-release-map.ts
|
|
21
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 '..'");
|
|
22
28
|
var toolReleaseMapEntrySchema = z.object({
|
|
23
29
|
toolName: z.string().regex(/^[a-z0-9-]+$/),
|
|
24
30
|
sourcePath: z.string().min(1),
|
|
25
31
|
publicRepo: z.string().url().regex(/^https:\/\/github\.com\/[^/]+\/[^/]+(?:\.git)?$/),
|
|
26
|
-
publicDefaultBranch: z.string().min(1).default("main")
|
|
32
|
+
publicDefaultBranch: z.string().min(1).default("main"),
|
|
33
|
+
publicToolPath: publicToolPathSchema
|
|
27
34
|
});
|
|
28
35
|
var toolReleaseMapSchema = z.object({
|
|
29
36
|
tools: z.array(toolReleaseMapEntrySchema)
|
|
@@ -173,12 +180,19 @@ var toolCoordinateSchema = z2.object({
|
|
|
173
180
|
var releaseVersionSchema = z2.string().regex(/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/);
|
|
174
181
|
var commitShaSchema = z2.string().regex(/^[a-f0-9]{40}$/i);
|
|
175
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 '..'");
|
|
176
189
|
var publishReleaseSchema = z2.object({
|
|
177
190
|
owner: toolCoordinateSchema.shape.owner,
|
|
178
191
|
name: toolCoordinateSchema.shape.tool,
|
|
179
192
|
description: z2.string().min(10),
|
|
180
193
|
version: releaseVersionSchema,
|
|
181
194
|
repoUrl: z2.string().url(),
|
|
195
|
+
repoPath: repoPathSchema,
|
|
182
196
|
commitSha: commitShaSchema,
|
|
183
197
|
manifestHash: manifestHashSchema,
|
|
184
198
|
isVerifiedOwner: z2.boolean(),
|
|
@@ -551,7 +565,11 @@ async function runAdd(specifier, apiBaseUrl2, options) {
|
|
|
551
565
|
console.log(kleur.dim(`Cloning ${payload.version.repo.url}...`));
|
|
552
566
|
await runCommand("git", ["clone", "--quiet", payload.version.repo.url, repoDir]);
|
|
553
567
|
await runCommand("git", ["-C", repoDir, "checkout", "--quiet", payload.version.repo.commitSha]);
|
|
554
|
-
const toolRootCandidates = [
|
|
568
|
+
const toolRootCandidates = [
|
|
569
|
+
repoDir,
|
|
570
|
+
path.join(repoDir, payload.tool.name),
|
|
571
|
+
path.join(repoDir, "tools", payload.tool.name)
|
|
572
|
+
];
|
|
555
573
|
const toolRoot = (await Promise.all(
|
|
556
574
|
toolRootCandidates.map(async (candidate) => {
|
|
557
575
|
const candidateManifestPath = path.join(candidate, TOOLSHED_MANIFEST_FILENAME);
|
|
@@ -560,7 +578,7 @@ async function runAdd(specifier, apiBaseUrl2, options) {
|
|
|
560
578
|
)).find((value) => value !== null);
|
|
561
579
|
if (!toolRoot) {
|
|
562
580
|
throw new Error(
|
|
563
|
-
`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}/`
|
|
564
582
|
);
|
|
565
583
|
}
|
|
566
584
|
const manifestPath = path.join(toolRoot, TOOLSHED_MANIFEST_FILENAME);
|
|
@@ -761,7 +779,7 @@ async function runView(specifier, apiBaseUrl2) {
|
|
|
761
779
|
// src/index.ts
|
|
762
780
|
var program = new Command();
|
|
763
781
|
var apiBaseUrl = "https://api.toolshed.tech";
|
|
764
|
-
program.name("toolshed").description("Add and discover toolshed tools").version("0.1.
|
|
782
|
+
program.name("toolshed").description("Add and discover toolshed tools").version("0.1.2");
|
|
765
783
|
program.command("add").description("add a published tool to your project").argument("<tool>", "tool coordinate in the form @owner/name[@version]").option(
|
|
766
784
|
"-c, --cwd <cwd>",
|
|
767
785
|
"the working directory. defaults to the current directory.",
|
|
@@ -775,7 +793,7 @@ program.command("add").description("add a published tool to your project").argum
|
|
|
775
793
|
});
|
|
776
794
|
}
|
|
777
795
|
);
|
|
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) => {
|
|
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) => {
|
|
779
797
|
await runSearch(query ?? "", apiBaseUrl, {
|
|
780
798
|
limit: Number.parseInt(opts.limit, 10)
|
|
781
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(\"--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"]}
|
|
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"]}
|