agent-dir 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +223 -2
  3. package/dist/bin/agent-dir.d.ts +3 -0
  4. package/dist/bin/agent-dir.d.ts.map +1 -0
  5. package/dist/bin/agent-dir.js +201 -0
  6. package/dist/bin/agent-dir.js.map +1 -0
  7. package/dist/src/auth.d.ts +3 -0
  8. package/dist/src/auth.d.ts.map +1 -0
  9. package/dist/src/auth.js +18 -0
  10. package/dist/src/auth.js.map +1 -0
  11. package/dist/src/config.d.ts +6 -0
  12. package/dist/src/config.d.ts.map +1 -0
  13. package/dist/src/config.js +80 -0
  14. package/dist/src/config.js.map +1 -0
  15. package/dist/src/logging.d.ts +16 -0
  16. package/dist/src/logging.d.ts.map +1 -0
  17. package/dist/src/logging.js +199 -0
  18. package/dist/src/logging.js.map +1 -0
  19. package/dist/src/mcp.d.ts +9 -0
  20. package/dist/src/mcp.d.ts.map +1 -0
  21. package/dist/src/mcp.js +824 -0
  22. package/dist/src/mcp.js.map +1 -0
  23. package/dist/src/server.d.ts +7 -0
  24. package/dist/src/server.d.ts.map +1 -0
  25. package/dist/src/server.js +343 -0
  26. package/dist/src/server.js.map +1 -0
  27. package/dist/src/tools/code.d.ts +27 -0
  28. package/dist/src/tools/code.d.ts.map +1 -0
  29. package/dist/src/tools/code.js +147 -0
  30. package/dist/src/tools/code.js.map +1 -0
  31. package/dist/src/tools/commands.d.ts +8 -0
  32. package/dist/src/tools/commands.d.ts.map +1 -0
  33. package/dist/src/tools/commands.js +61 -0
  34. package/dist/src/tools/commands.js.map +1 -0
  35. package/dist/src/tools/diagnostics.d.ts +9 -0
  36. package/dist/src/tools/diagnostics.d.ts.map +1 -0
  37. package/dist/src/tools/diagnostics.js +83 -0
  38. package/dist/src/tools/diagnostics.js.map +1 -0
  39. package/dist/src/tools/files.d.ts +39 -0
  40. package/dist/src/tools/files.d.ts.map +1 -0
  41. package/dist/src/tools/files.js +142 -0
  42. package/dist/src/tools/files.js.map +1 -0
  43. package/dist/src/tools/git.d.ts +15 -0
  44. package/dist/src/tools/git.d.ts.map +1 -0
  45. package/dist/src/tools/git.js +104 -0
  46. package/dist/src/tools/git.js.map +1 -0
  47. package/dist/src/tools/metadata.d.ts +20 -0
  48. package/dist/src/tools/metadata.d.ts.map +1 -0
  49. package/dist/src/tools/metadata.js +101 -0
  50. package/dist/src/tools/metadata.js.map +1 -0
  51. package/dist/src/tools/npm.d.ts +3 -0
  52. package/dist/src/tools/npm.d.ts.map +1 -0
  53. package/dist/src/tools/npm.js +76 -0
  54. package/dist/src/tools/npm.js.map +1 -0
  55. package/dist/src/tools/skills.d.ts +33 -0
  56. package/dist/src/tools/skills.d.ts.map +1 -0
  57. package/dist/src/tools/skills.js +240 -0
  58. package/dist/src/tools/skills.js.map +1 -0
  59. package/dist/src/tunnel.d.ts +3 -0
  60. package/dist/src/tunnel.d.ts.map +1 -0
  61. package/dist/src/tunnel.js +114 -0
  62. package/dist/src/tunnel.js.map +1 -0
  63. package/dist/src/types.d.ts +45 -0
  64. package/dist/src/types.d.ts.map +1 -0
  65. package/dist/src/types.js +2 -0
  66. package/dist/src/types.js.map +1 -0
  67. package/package.json +51 -4
@@ -0,0 +1,101 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ import { listFiles } from "./files.js";
4
+ import { gitStatus } from "./git.js";
5
+ export async function fileInfo(root, relativePath) {
6
+ const resolvedRoot = await fs.realpath(root);
7
+ const target = path.resolve(resolvedRoot, relativePath);
8
+ if (target !== resolvedRoot && !target.startsWith(`${resolvedRoot}${path.sep}`))
9
+ throw new Error("Path escapes the exposed project directory.");
10
+ const stat = await fs.lstat(target);
11
+ return {
12
+ path: relativePath,
13
+ type: stat.isDirectory()
14
+ ? "directory"
15
+ : stat.isFile()
16
+ ? "file"
17
+ : stat.isSymbolicLink()
18
+ ? "symlink"
19
+ : "other",
20
+ size: stat.size,
21
+ mode: (stat.mode & 0o777).toString(8),
22
+ modifiedAt: stat.mtime.toISOString(),
23
+ createdAt: stat.birthtime.toISOString(),
24
+ };
25
+ }
26
+ export async function packageInfo(root) {
27
+ const packagePath = path.join(await fs.realpath(root), "package.json");
28
+ try {
29
+ const packageJson = JSON.parse(await fs.readFile(packagePath, "utf8"));
30
+ return {
31
+ path: "package.json",
32
+ name: packageJson.name ?? null,
33
+ version: packageJson.version ?? null,
34
+ description: packageJson.description ?? null,
35
+ packageManager: packageJson.packageManager ?? null,
36
+ engines: packageJson.engines ?? null,
37
+ scripts: packageJson.scripts ?? {},
38
+ dependencies: packageJson.dependencies ?? {},
39
+ devDependencies: packageJson.devDependencies ?? {},
40
+ };
41
+ }
42
+ catch (error) {
43
+ if (error.code === "ENOENT")
44
+ return { path: "package.json", exists: false };
45
+ throw new Error("package.json exists but is not valid JSON.");
46
+ }
47
+ }
48
+ export async function projectOverview(root) {
49
+ const entries = await listFiles(root);
50
+ const files = entries.filter((entry) => entry.type === "file");
51
+ const directories = entries.filter((entry) => entry.type === "directory");
52
+ const counts = new Map();
53
+ for (const file of files) {
54
+ const extension = path.extname(file.path).toLowerCase() || "[no extension]";
55
+ counts.set(extension, (counts.get(extension) ?? 0) + 1);
56
+ }
57
+ const rootEntries = await fs.readdir(await fs.realpath(root));
58
+ const packageManagerPairs = [
59
+ ["package-lock.json", "npm"],
60
+ ["pnpm-lock.yaml", "pnpm"],
61
+ ["yarn.lock", "yarn"],
62
+ ["bun.lock", "bun"],
63
+ ["bun.lockb", "bun"],
64
+ ["Cargo.lock", "cargo"],
65
+ ["go.sum", "go"],
66
+ ["poetry.lock", "poetry"],
67
+ ["uv.lock", "uv"],
68
+ ];
69
+ const packageManagers = packageManagerPairs
70
+ .filter(([file]) => rootEntries.includes(file))
71
+ .map(([, manager]) => manager);
72
+ const projectFiles = rootEntries.filter((name) => /^(README|LICENSE|CONTRIBUTING|CHANGELOG)(?:\.|$)|^(package|tsconfig|pyproject|Cargo|go\.mod)/i.test(name));
73
+ let git = { available: false };
74
+ try {
75
+ const status = await gitStatus(root);
76
+ if (status.exitCode === 0) {
77
+ const firstLine = status.stdout.split(/\r?\n/)[0] ?? "";
78
+ const branch = firstLine.match(/^##\s+(.+?)(?:\.\.\.|$)/)?.[1];
79
+ git = {
80
+ available: true,
81
+ ...(branch ? { branch } : {}),
82
+ clean: status.stdout.split(/\r?\n/).filter(Boolean).length <= 1,
83
+ };
84
+ }
85
+ }
86
+ catch {
87
+ git = { available: false };
88
+ }
89
+ return {
90
+ root,
91
+ files: files.length,
92
+ directories: directories.length,
93
+ languages: [...counts.entries()]
94
+ .sort((a, b) => b[1] - a[1])
95
+ .map(([extension, count]) => ({ extension, files: count })),
96
+ packageManagers,
97
+ projectFiles,
98
+ git,
99
+ };
100
+ }
101
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/tools/metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CommandResult } from "./commands.js";
2
+ export declare function runNpm(root: string, script: string, timeoutMs?: number, allowedScripts?: string[], signal?: AbortSignal): Promise<CommandResult>;
3
+ //# sourceMappingURL=npm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm.d.ts","sourceRoot":"","sources":["../../../src/tools/npm.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAMnD,wBAAgB,MAAM,CACpB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,SAAS,EAClB,cAAc,GAAE,MAAM,EAAO,EAC7B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC,CAqExB"}
@@ -0,0 +1,76 @@
1
+ import { spawn } from "node:child_process";
2
+ import { promises as fs } from "node:fs";
3
+ import path from "node:path";
4
+ export function runNpm(root, script, timeoutMs = 120000, allowedScripts = [], signal) {
5
+ if (!/^[A-Za-z0-9:_-]+$/.test(script))
6
+ throw new Error("Invalid npm script name.");
7
+ return (async () => {
8
+ let packageJson;
9
+ try {
10
+ packageJson = JSON.parse(await fs.readFile(path.join(root, "package.json"), "utf8"));
11
+ }
12
+ catch {
13
+ throw new Error("No valid package.json found.");
14
+ }
15
+ if (!packageJson.scripts?.[script])
16
+ throw new Error(`npm script '${script}' does not exist in package.json.`);
17
+ if (!allowedScripts.includes(script))
18
+ throw new Error(`npm script '${script}' is not allowed by this profile.`);
19
+ return new Promise((resolve, reject) => {
20
+ const executable = process.platform === "win32" ? "npm.cmd" : "npm";
21
+ const child = spawn(executable, ["run", script], {
22
+ cwd: root,
23
+ shell: false,
24
+ env: process.env,
25
+ });
26
+ let stdout = "";
27
+ let stderr = "";
28
+ let finished = false;
29
+ let timer;
30
+ const abort = () => {
31
+ if (finished)
32
+ return;
33
+ finished = true;
34
+ clearTimeout(timer);
35
+ child.kill("SIGTERM");
36
+ reject(new Error(`npm run ${script} was aborted.`));
37
+ };
38
+ timer = setTimeout(() => {
39
+ if (finished)
40
+ return;
41
+ finished = true;
42
+ child.kill("SIGTERM");
43
+ signal?.removeEventListener("abort", abort);
44
+ reject(new Error(`npm run ${script} timed out after ${timeoutMs}ms.`));
45
+ }, timeoutMs);
46
+ if (signal?.aborted) {
47
+ abort();
48
+ return;
49
+ }
50
+ signal?.addEventListener("abort", abort, { once: true });
51
+ child.stdout.on("data", (chunk) => {
52
+ stdout += chunk.toString();
53
+ });
54
+ child.stderr.on("data", (chunk) => {
55
+ stderr += chunk.toString();
56
+ });
57
+ child.on("error", (error) => {
58
+ if (!finished) {
59
+ finished = true;
60
+ clearTimeout(timer);
61
+ signal?.removeEventListener("abort", abort);
62
+ reject(error);
63
+ }
64
+ });
65
+ child.on("close", (code) => {
66
+ if (!finished) {
67
+ finished = true;
68
+ clearTimeout(timer);
69
+ signal?.removeEventListener("abort", abort);
70
+ resolve({ command: `npm run ${script}`, exitCode: code ?? 1, stdout, stderr });
71
+ }
72
+ });
73
+ });
74
+ })();
75
+ }
76
+ //# sourceMappingURL=npm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm.js","sourceRoot":"","sources":["../../../src/tools/npm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export interface SkillResource {
2
+ uri: string;
3
+ digest: string;
4
+ size: number;
5
+ }
6
+ export interface SkillEntry {
7
+ uri: string;
8
+ frontmatter: Record<string, unknown> & {
9
+ name: string;
10
+ description: string;
11
+ };
12
+ resources: SkillResource[] | "dynamic";
13
+ }
14
+ export declare function listSkills(root: string): Promise<SkillEntry[]>;
15
+ export declare function getSkill(root: string, uri: string): Promise<SkillEntry>;
16
+ export declare function readSkillResource(root: string, uri: string): Promise<{
17
+ uri: string;
18
+ mimeType: string;
19
+ text?: string;
20
+ blob?: string;
21
+ }>;
22
+ export declare function readSkillDirectory(root: string, uri: string): Promise<Array<{
23
+ uri: string;
24
+ name: string;
25
+ mimeType: string;
26
+ }>>;
27
+ export declare function listSkillResources(root: string): Promise<Array<{
28
+ uri: string;
29
+ name: string;
30
+ mimeType: string;
31
+ }>>;
32
+ export declare function skillResourceUrisForPath(root: string, relativePath: string): Promise<string[]>;
33
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/tools/skills.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AACD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7E,SAAS,EAAE,aAAa,EAAE,GAAG,SAAS,CAAC;CACxC;AAMD,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAEpE;AACD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAI7E;AACD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAY1E;AACD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAmCjE;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAQjE;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,EAAE,CAAC,CAUnB"}
@@ -0,0 +1,240 @@
1
+ import { createHash } from "node:crypto";
2
+ import { promises as fs } from "node:fs";
3
+ import path from "node:path";
4
+ import { listFiles } from "./files.js";
5
+ const SKILL_ROOTS = ["skills", ".agents/skills", ".claude/skills", ".github/skills"];
6
+ const MAX_RESOURCES = 512;
7
+ const MAX_TOTAL_BYTES = 16 * 1024 * 1024;
8
+ const SKILL_NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
9
+ const MAX_SKILL_NAME_LENGTH = 64;
10
+ const MAX_DESCRIPTION_LENGTH = 1024;
11
+ export async function listSkills(root) {
12
+ return (await discoverSkills(root)).map((skill) => skill.entry);
13
+ }
14
+ export async function getSkill(root, uri) {
15
+ const skill = (await discoverSkills(root)).find((item) => item.entry.uri === uri);
16
+ if (!skill)
17
+ throw new Error(`Unknown skill: ${uri}`);
18
+ return skill.entry;
19
+ }
20
+ export async function readSkillResource(root, uri) {
21
+ for (const skill of await discoverSkills(root)) {
22
+ const filePath = skill.resources.get(uri);
23
+ if (!filePath)
24
+ continue;
25
+ const bytes = await fs.readFile(filePath);
26
+ const text = bytes.toString("utf8");
27
+ if (Buffer.from(text, "utf8").equals(bytes)) {
28
+ return { uri, mimeType: mimeTypeFor(filePath), text };
29
+ }
30
+ return { uri, mimeType: mimeTypeFor(filePath), blob: bytes.toString("base64") };
31
+ }
32
+ throw new Error(`Unknown skill resource: ${uri}`);
33
+ }
34
+ export async function readSkillDirectory(root, uri) {
35
+ const prefix = "skill://";
36
+ if (!uri.startsWith(prefix) || uri.endsWith("/") || uri === prefix)
37
+ throw new Error(`Unknown skill directory: ${uri}`);
38
+ const relativeDirectory = uri.slice(prefix.length);
39
+ const resolvedRoot = await fs.realpath(root);
40
+ for (const skillRoot of SKILL_ROOTS) {
41
+ const directoryPath = path.join(resolvedRoot, skillRoot, ...relativeDirectory.split("/"));
42
+ const candidate = path.resolve(directoryPath);
43
+ if (candidate !== resolvedRoot && !candidate.startsWith(`${resolvedRoot}${path.sep}`))
44
+ continue;
45
+ try {
46
+ const resolvedDirectory = await fs.realpath(candidate);
47
+ if (resolvedDirectory !== resolvedRoot &&
48
+ !resolvedDirectory.startsWith(`${resolvedRoot}${path.sep}`))
49
+ continue;
50
+ const stats = await fs.stat(resolvedDirectory);
51
+ if (!stats.isDirectory())
52
+ continue;
53
+ const entries = await fs.readdir(resolvedDirectory, { withFileTypes: true });
54
+ return entries
55
+ .map((entry) => {
56
+ const childUri = `${uri}/${entry.name}`;
57
+ return {
58
+ uri: childUri,
59
+ name: entry.name,
60
+ mimeType: entry.isDirectory() ? "inode/directory" : mimeTypeFor(entry.name),
61
+ };
62
+ })
63
+ .sort((a, b) => a.uri.localeCompare(b.uri));
64
+ }
65
+ catch (error) {
66
+ if (error.code !== "ENOENT")
67
+ throw error;
68
+ }
69
+ }
70
+ throw new Error(`Unknown skill directory: ${uri}`);
71
+ }
72
+ export async function listSkillResources(root) {
73
+ return (await discoverSkills(root)).flatMap((skill) => [...skill.resources.entries()].map(([uri, filePath]) => ({
74
+ uri,
75
+ name: path.basename(filePath),
76
+ mimeType: mimeTypeFor(filePath),
77
+ })));
78
+ }
79
+ export async function skillResourceUrisForPath(root, relativePath) {
80
+ const resolvedRoot = await fs.realpath(root);
81
+ const target = path.resolve(resolvedRoot, relativePath);
82
+ const matches = new Set();
83
+ for (const skill of await discoverSkills(root)) {
84
+ for (const [uri, filePath] of skill.resources) {
85
+ if (path.resolve(filePath) === target)
86
+ matches.add(uri);
87
+ }
88
+ }
89
+ return [...matches].sort();
90
+ }
91
+ async function discoverSkills(root) {
92
+ const resolvedRoot = await fs.realpath(root);
93
+ const entries = await listFiles(root);
94
+ const skills = [];
95
+ for (const skillFile of entries.filter((entry) => entry.type === "file" && path.basename(entry.path) === "SKILL.md")) {
96
+ const normalizedSkillFile = skillFile.path.replaceAll(path.sep, "/");
97
+ const skillRoot = SKILL_ROOTS.find((rootName) => normalizedSkillFile === `${rootName}/SKILL.md` ||
98
+ normalizedSkillFile.startsWith(`${rootName}/`));
99
+ if (!skillRoot)
100
+ continue;
101
+ const skillPath = path.posix.dirname(normalizedSkillFile);
102
+ const relativeSkillPath = path.posix.relative(skillRoot, skillPath);
103
+ if (!relativeSkillPath ||
104
+ relativeSkillPath === "." ||
105
+ relativeSkillPath.startsWith("../") ||
106
+ path.posix.isAbsolute(relativeSkillPath))
107
+ continue;
108
+ const markdown = await fs.readFile(path.join(resolvedRoot, skillFile.path), "utf8");
109
+ const parsedFrontmatter = parseFrontmatter(markdown);
110
+ if (!parsedFrontmatter)
111
+ continue;
112
+ const nameValue = parsedFrontmatter.values.name;
113
+ const descriptionValue = parsedFrontmatter.values.description;
114
+ if (typeof nameValue !== "string" || typeof descriptionValue !== "string")
115
+ continue;
116
+ if (nameValue !== path.posix.basename(skillPath) ||
117
+ !SKILL_NAME_PATTERN.test(nameValue) ||
118
+ nameValue.length > MAX_SKILL_NAME_LENGTH ||
119
+ descriptionValue.length === 0 ||
120
+ descriptionValue.length > MAX_DESCRIPTION_LENGTH)
121
+ continue;
122
+ const skillUriPath = relativeSkillPath;
123
+ const skillUri = `skill://${skillUriPath}`;
124
+ const resources = [];
125
+ const resourceMap = new Map();
126
+ const descendants = entries.filter((entry) => entry.type === "file" &&
127
+ (entry.path === skillFile.path ||
128
+ entry.path.replaceAll(path.sep, "/").startsWith(`${skillPath}/`)));
129
+ if (descendants.length > MAX_RESOURCES)
130
+ continue;
131
+ let totalBytes = 0;
132
+ for (const resource of descendants) {
133
+ const normalizedResourcePath = resource.path.replaceAll(path.sep, "/");
134
+ const relative = path.posix.relative(skillPath, normalizedResourcePath);
135
+ const uri = `${skillUri}/${relative}`;
136
+ const filePath = path.join(resolvedRoot, resource.path);
137
+ const bytes = await fs.readFile(filePath);
138
+ totalBytes += bytes.length;
139
+ if (totalBytes > MAX_TOTAL_BYTES) {
140
+ totalBytes = -1;
141
+ break;
142
+ }
143
+ resources.push({
144
+ uri,
145
+ digest: `sha256:${createHash("sha256").update(bytes).digest("hex")}`,
146
+ size: bytes.length,
147
+ });
148
+ resourceMap.set(uri, filePath);
149
+ }
150
+ if (totalBytes < 0 || resources.length === 0)
151
+ continue;
152
+ resources.sort((a, b) => a.uri.localeCompare(b.uri));
153
+ skills.push({
154
+ entry: {
155
+ uri: `${skillUri}/SKILL.md`,
156
+ frontmatter: parsedFrontmatter.values,
157
+ resources,
158
+ },
159
+ resources: resourceMap,
160
+ });
161
+ }
162
+ return skills.sort((a, b) => a.entry.uri.localeCompare(b.entry.uri));
163
+ }
164
+ function parseFrontmatter(markdown) {
165
+ const lines = markdown.split(/\r?\n/);
166
+ if ((lines[0] ?? "").trim() !== "---")
167
+ return undefined;
168
+ const end = lines.findIndex((line, index) => index > 0 && line.trim() === "---");
169
+ if (end < 0)
170
+ return undefined;
171
+ const result = {};
172
+ for (let index = 1; index < end; index += 1) {
173
+ const line = lines[index] ?? "";
174
+ if (!line.trim())
175
+ continue;
176
+ const match = line.match(/^([A-Za-z0-9_.-]+):\s*(.*)$/);
177
+ if (!match)
178
+ return undefined;
179
+ const key = match[1] ?? "";
180
+ if (Object.hasOwn(result, key))
181
+ return undefined;
182
+ const raw = match[2] ?? "";
183
+ result[key] = parseScalar(raw);
184
+ }
185
+ return { raw: lines.slice(1, end).join("\n"), values: result };
186
+ }
187
+ function parseScalar(value) {
188
+ const trimmed = value.trim();
189
+ if (!trimmed)
190
+ return "";
191
+ if (trimmed === "true")
192
+ return true;
193
+ if (trimmed === "false")
194
+ return false;
195
+ if (trimmed === "null")
196
+ return null;
197
+ if (/^-?\d+(?:\.\d+)?$/.test(trimmed))
198
+ return Number(trimmed);
199
+ if ((trimmed.startsWith("[") && trimmed.endsWith("]")) ||
200
+ (trimmed.startsWith("{") && trimmed.endsWith("}"))) {
201
+ try {
202
+ return JSON.parse(trimmed);
203
+ }
204
+ catch {
205
+ return trimmed;
206
+ }
207
+ }
208
+ if ((trimmed.startsWith('"') && trimmed.endsWith('"')) ||
209
+ (trimmed.startsWith("'") && trimmed.endsWith("'"))) {
210
+ return trimmed.slice(1, -1);
211
+ }
212
+ return trimmed;
213
+ }
214
+ function mimeTypeFor(filePath) {
215
+ switch (path.extname(filePath).toLowerCase()) {
216
+ case ".md":
217
+ return "text/markdown";
218
+ case ".json":
219
+ return "application/json";
220
+ case ".yaml":
221
+ case ".yml":
222
+ return "text/yaml";
223
+ case ".js":
224
+ case ".mjs":
225
+ case ".cjs":
226
+ case ".ts":
227
+ case ".mts":
228
+ case ".cts":
229
+ return "text/javascript";
230
+ case ".css":
231
+ return "text/css";
232
+ case ".html":
233
+ return "text/html";
234
+ case ".py":
235
+ return "text/x-python";
236
+ default:
237
+ return "text/plain";
238
+ }
239
+ }
240
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/tools/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { TunnelOptions, TunnelResult } from "./types.js";
2
+ export declare function startTunnel({ provider, port, subdomain, random, }: TunnelOptions): Promise<TunnelResult>;
3
+ //# sourceMappingURL=tunnel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/tunnel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA+B9D,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,MAAM,GACP,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAoGvC"}
@@ -0,0 +1,114 @@
1
+ import { spawn } from "node:child_process";
2
+ const STARTUP_TIMEOUT_MS = 15_000;
3
+ const ANSI_ESCAPE = new RegExp(String.fromCharCode(0x1b) + String.raw `\[[0-?]*[ -/]*[@-~]`, "g");
4
+ function cleanOutput(value) {
5
+ return value.toString().replace(ANSI_ESCAPE, "");
6
+ }
7
+ function writeLine(line = "") {
8
+ process.stdout.write(`${line}\r\n`);
9
+ }
10
+ function publicUrl(subdomain) {
11
+ return `https://${subdomain}.wormhole.bar`;
12
+ }
13
+ function failureFromLine(line) {
14
+ if (/subdomain limit reached/i.test(line)) {
15
+ return "Wormhole rejected the tunnel: subdomain limit reached. Release an existing subdomain first.";
16
+ }
17
+ const registration = line.match(/registration failed:\s*(.+?)(?:\n|$)/i);
18
+ const reason = registration?.[1];
19
+ if (reason) {
20
+ return `Wormhole registration failed: ${reason.trim()}`;
21
+ }
22
+ return undefined;
23
+ }
24
+ export function startTunnel({ provider, port, subdomain, random, }) {
25
+ if (provider !== "wormhole")
26
+ throw new Error(`Unsupported tunnel provider: ${provider}. Use --tunnel wormhole or --no-tunnel.`);
27
+ return new Promise((resolve, reject) => {
28
+ const args = ["http", String(port)];
29
+ if (!random && subdomain)
30
+ args.push("--subdomain", subdomain);
31
+ const child = spawn("wormhole", args, {
32
+ stdio: ["ignore", "pipe", "pipe"],
33
+ });
34
+ let settled = false;
35
+ let buffer = "";
36
+ let timer;
37
+ const cleanup = () => {
38
+ if (timer)
39
+ clearTimeout(timer);
40
+ child.stdout?.removeListener("data", onData);
41
+ child.stderr?.removeListener("data", onData);
42
+ child.removeListener("error", onError);
43
+ child.removeListener("exit", onExit);
44
+ };
45
+ const fail = (message) => {
46
+ if (settled)
47
+ return;
48
+ settled = true;
49
+ cleanup();
50
+ if (!child.killed)
51
+ child.kill("SIGTERM");
52
+ reject(new Error(message));
53
+ };
54
+ const succeed = (url) => {
55
+ if (settled)
56
+ return;
57
+ settled = true;
58
+ cleanup();
59
+ writeLine();
60
+ writeLine(" ✓ TUNNEL ONLINE");
61
+ writeLine(` Public URL : ${url}`);
62
+ writeLine(` MCP endpoint : ${url}/mcp`);
63
+ writeLine(` Forwarding : ${url} → http://127.0.0.1:${port}`);
64
+ writeLine();
65
+ resolve({ child, url });
66
+ };
67
+ const processLine = (rawLine) => {
68
+ const line = cleanOutput(rawLine).trim();
69
+ if (!line)
70
+ return;
71
+ const failure = failureFromLine(line);
72
+ if (failure) {
73
+ fail(failure);
74
+ return;
75
+ }
76
+ const explicitUrl = line.match(/https:\/\/[^\s"'<>]+/)?.[0]?.replace(/[),.;]+$/, "");
77
+ if (explicitUrl) {
78
+ succeed(explicitUrl);
79
+ return;
80
+ }
81
+ if (/Status\s+.*connected/i.test(line)) {
82
+ if (subdomain)
83
+ succeed(publicUrl(subdomain));
84
+ }
85
+ };
86
+ const onData = (chunk) => {
87
+ buffer += cleanOutput(chunk);
88
+ const lines = buffer.split(/\r\n|\n|\r/);
89
+ buffer = lines.pop() ?? "";
90
+ for (const line of lines) {
91
+ processLine(line);
92
+ if (settled)
93
+ break;
94
+ }
95
+ };
96
+ const onError = (error) => {
97
+ fail(`Unable to start Wormhole: ${error.message}`);
98
+ };
99
+ const onExit = (code, signal) => {
100
+ if (settled)
101
+ return;
102
+ const detail = signal ? `signal ${signal}` : `code ${code}`;
103
+ fail(`Wormhole exited before the tunnel was established (${detail}).`);
104
+ };
105
+ child.stdout?.on("data", onData);
106
+ child.stderr?.on("data", onData);
107
+ child.once("error", onError);
108
+ child.once("exit", onExit);
109
+ timer = setTimeout(() => {
110
+ fail(`Timed out waiting for Wormhole to establish the tunnel after ${STARTUP_TIMEOUT_MS / 1000}s.`);
111
+ }, STARTUP_TIMEOUT_MS);
112
+ });
113
+ }
114
+ //# sourceMappingURL=tunnel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/tunnel.ts"],"names":[],"mappings":"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"}