@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 +187 -24
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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 {
|
|
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(
|
|
208
|
+
function parseToolSpecifier(input2, options = {}) {
|
|
193
209
|
const allowVersion = options.allowVersion ?? true;
|
|
194
|
-
const trimmed =
|
|
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 = [
|
|
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
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
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(
|
|
531
|
-
if (!Number.isFinite(
|
|
532
|
-
return Math.min(Math.floor(
|
|
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.
|
|
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(
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
});
|
|
633
|
-
|
|
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"]}
|