@intlayer/mcp 8.4.4 → 8.4.5
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/esm/client/client.mjs +16 -1
- package/dist/esm/client/client.mjs.map +1 -1
- package/dist/esm/client/sse.mjs +61 -1
- package/dist/esm/client/sse.mjs.map +1 -1
- package/dist/esm/packages/@intlayer/chokidar/dist/esm/_virtual/_utils_asset.mjs +98 -0
- package/dist/esm/packages/@intlayer/chokidar/dist/esm/_virtual/_utils_asset.mjs.map +1 -0
- package/dist/esm/packages/@intlayer/chokidar/dist/esm/installSkills/index.mjs +279 -0
- package/dist/esm/packages/@intlayer/chokidar/dist/esm/installSkills/index.mjs.map +1 -0
- package/dist/esm/packages/@intlayer/chokidar/dist/esm/listProjects.mjs +44 -0
- package/dist/esm/packages/@intlayer/chokidar/dist/esm/listProjects.mjs.map +1 -0
- package/dist/esm/packages/@intlayer/core/dist/esm/transpiler/markdown/getMarkdownMetadata.mjs +23 -0
- package/dist/esm/packages/@intlayer/core/dist/esm/transpiler/markdown/getMarkdownMetadata.mjs.map +1 -0
- package/dist/esm/packages/@intlayer/core/dist/esm/utils/parseYaml.mjs +321 -0
- package/dist/esm/packages/@intlayer/core/dist/esm/utils/parseYaml.mjs.map +1 -0
- package/dist/esm/server/server.mjs +33 -1
- package/dist/esm/server/server.mjs.map +1 -1
- package/dist/esm/server/sse.mjs +75 -1
- package/dist/esm/server/sse.mjs.map +1 -1
- package/dist/esm/server/stdio.mjs +16 -1
- package/dist/esm/server/stdio.mjs.map +1 -1
- package/dist/esm/tools/cli.mjs +323 -1
- package/dist/esm/tools/cli.mjs.map +1 -0
- package/dist/esm/tools/docs.mjs +107 -2
- package/dist/esm/tools/docs.mjs.map +1 -1
- package/dist/esm/tools/installSkills.mjs +69 -1
- package/dist/esm/tools/installSkills.mjs.map +1 -0
- package/package.json +7 -7
- package/dist/esm/cli-C5nRaDjk.mjs +0 -2
- package/dist/esm/cli-C5nRaDjk.mjs.map +0 -1
- package/dist/esm/installSkills-Bzx_k5dj.mjs +0 -21
- package/dist/esm/installSkills-Bzx_k5dj.mjs.map +0 -1
|
@@ -1,2 +1,17 @@
|
|
|
1
|
-
import{readFileSync
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname as dirname$1, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { isESModule } from "@intlayer/config/utils";
|
|
5
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
6
|
+
|
|
7
|
+
//#region src/client/client.ts
|
|
8
|
+
const dirname = isESModule ? dirname$1(fileURLToPath(import.meta.url)) : __dirname;
|
|
9
|
+
const packageJson = JSON.parse(readFileSync(resolve(dirname, "../../../package.json"), "utf8"));
|
|
10
|
+
const loadClient = () => new Client({
|
|
11
|
+
name: `mcp-client-for-intlayer-mcp-server`,
|
|
12
|
+
version: packageJson.version
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
//#endregion
|
|
16
|
+
export { dirname, loadClient };
|
|
2
17
|
//# sourceMappingURL=client.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.mjs","names":["pathDirname"],"sources":["../../../src/client/client.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { dirname as pathDirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { isESModule } from '@intlayer/config/utils';\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\n\nexport const dirname: string = isESModule\n ? pathDirname(fileURLToPath(import.meta.url))\n : __dirname;\n\nconst packageJson: Record<string, any> = JSON.parse(\n readFileSync(resolve(dirname, '../../../package.json'), 'utf8')\n);\n\ntype LoadClient = () => Client;\n\nexport const loadClient: LoadClient = () =>\n new Client({\n name: `mcp-client-for-intlayer-mcp-server`,\n version: packageJson.version,\n });\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.mjs","names":["pathDirname"],"sources":["../../../src/client/client.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { dirname as pathDirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { isESModule } from '@intlayer/config/utils';\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\n\nexport const dirname: string = isESModule\n ? pathDirname(fileURLToPath(import.meta.url))\n : __dirname;\n\nconst packageJson: Record<string, any> = JSON.parse(\n readFileSync(resolve(dirname, '../../../package.json'), 'utf8')\n);\n\ntype LoadClient = () => Client;\n\nexport const loadClient: LoadClient = () =>\n new Client({\n name: `mcp-client-for-intlayer-mcp-server`,\n version: packageJson.version,\n });\n"],"mappings":";;;;;;;AAMA,MAAa,UAAkB,aAC3BA,UAAY,cAAc,OAAO,KAAK,IAAI,CAAC,GAC3C;AAEJ,MAAM,cAAmC,KAAK,MAC5C,aAAa,QAAQ,SAAS,wBAAwB,EAAE,OAAO,CAChE;AAID,MAAa,mBACX,IAAI,OAAO;CACT,MAAM;CACN,SAAS,YAAY;CACtB,CAAC"}
|
package/dist/esm/client/sse.mjs
CHANGED
|
@@ -1,2 +1,62 @@
|
|
|
1
|
-
import{loadClient
|
|
1
|
+
import { loadClient } from "./client.mjs";
|
|
2
|
+
import { URL } from "node:url";
|
|
3
|
+
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
4
|
+
|
|
5
|
+
//#region src/client/sse.ts
|
|
6
|
+
var SSEClient = class {
|
|
7
|
+
client;
|
|
8
|
+
transport = null;
|
|
9
|
+
isCompleted = false;
|
|
10
|
+
constructor() {
|
|
11
|
+
this.client = loadClient();
|
|
12
|
+
}
|
|
13
|
+
async connectToServer() {
|
|
14
|
+
const mcpServerURL = process.env.MCP_SERVER_URL ?? "http://localhost:3000/";
|
|
15
|
+
const url = new URL(mcpServerURL);
|
|
16
|
+
try {
|
|
17
|
+
console.info(`Connecting to server - ${mcpServerURL}`);
|
|
18
|
+
this.transport = new StreamableHTTPClientTransport(url);
|
|
19
|
+
await this.client.connect(this.transport);
|
|
20
|
+
console.info("Connected to MCP server");
|
|
21
|
+
this.setUpTransport();
|
|
22
|
+
} catch (e) {
|
|
23
|
+
console.error("Failed to connect to MCP server: ", e);
|
|
24
|
+
throw e;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
setUpTransport() {
|
|
28
|
+
if (this.transport === null) return;
|
|
29
|
+
this.transport.onclose = () => {
|
|
30
|
+
console.info("Transport closed.");
|
|
31
|
+
this.isCompleted = true;
|
|
32
|
+
};
|
|
33
|
+
this.transport.onerror = async (error) => {
|
|
34
|
+
console.error("Transport error: ", error);
|
|
35
|
+
await this.cleanup();
|
|
36
|
+
};
|
|
37
|
+
this.transport.onmessage = (message) => {
|
|
38
|
+
console.info("Message received: ", message);
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
async waitForCompletion() {
|
|
42
|
+
while (!this.isCompleted) await new Promise((resolve) => setTimeout(resolve, 100));
|
|
43
|
+
}
|
|
44
|
+
async cleanup() {
|
|
45
|
+
if (this.transport) await this.client.close();
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const main = async () => {
|
|
49
|
+
const client = new SSEClient();
|
|
50
|
+
try {
|
|
51
|
+
await client.connectToServer();
|
|
52
|
+
await client.waitForCompletion();
|
|
53
|
+
} catch (error) {
|
|
54
|
+
console.error(error);
|
|
55
|
+
} finally {
|
|
56
|
+
await client.cleanup();
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
main();
|
|
60
|
+
|
|
61
|
+
//#endregion
|
|
2
62
|
//# sourceMappingURL=sse.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.mjs","names":[],"sources":["../../../src/client/sse.ts"],"sourcesContent":["import { URL } from 'node:url';\nimport type { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport { loadClient } from './client';\n\nclass SSEClient {\n private client: Client;\n private transport: Transport | null = null;\n private isCompleted = false;\n\n constructor() {\n this.client = loadClient();\n }\n\n async connectToServer() {\n const mcpServerURL = process.env.MCP_SERVER_URL ?? 'http://localhost:3000/';\n\n const url = new URL(mcpServerURL);\n try {\n console.info(`Connecting to server - ${mcpServerURL}`);\n this.transport = new StreamableHTTPClientTransport(url);\n await this.client.connect(this.transport);\n console.info('Connected to MCP server');\n\n this.setUpTransport();\n } catch (e) {\n console.error('Failed to connect to MCP server: ', e);\n throw e;\n }\n }\n\n private setUpTransport() {\n if (this.transport === null) return;\n\n this.transport.onclose = () => {\n console.info('Transport closed.');\n this.isCompleted = true;\n };\n\n this.transport.onerror = async (error) => {\n console.error('Transport error: ', error);\n await this.cleanup();\n };\n\n this.transport.onmessage = (message) => {\n console.info('Message received: ', message);\n };\n }\n\n async waitForCompletion() {\n while (!this.isCompleted) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n\n async cleanup() {\n if (this.transport) {\n await this.client.close();\n }\n }\n}\n\nconst main = async () => {\n const client = new SSEClient();\n try {\n await client.connectToServer();\n await client.waitForCompletion();\n } catch (error) {\n console.error(error);\n } finally {\n await client.cleanup();\n }\n};\n\nmain();\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"sse.mjs","names":[],"sources":["../../../src/client/sse.ts"],"sourcesContent":["import { URL } from 'node:url';\nimport type { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport { loadClient } from './client';\n\nclass SSEClient {\n private client: Client;\n private transport: Transport | null = null;\n private isCompleted = false;\n\n constructor() {\n this.client = loadClient();\n }\n\n async connectToServer() {\n const mcpServerURL = process.env.MCP_SERVER_URL ?? 'http://localhost:3000/';\n\n const url = new URL(mcpServerURL);\n try {\n console.info(`Connecting to server - ${mcpServerURL}`);\n this.transport = new StreamableHTTPClientTransport(url);\n await this.client.connect(this.transport);\n console.info('Connected to MCP server');\n\n this.setUpTransport();\n } catch (e) {\n console.error('Failed to connect to MCP server: ', e);\n throw e;\n }\n }\n\n private setUpTransport() {\n if (this.transport === null) return;\n\n this.transport.onclose = () => {\n console.info('Transport closed.');\n this.isCompleted = true;\n };\n\n this.transport.onerror = async (error) => {\n console.error('Transport error: ', error);\n await this.cleanup();\n };\n\n this.transport.onmessage = (message) => {\n console.info('Message received: ', message);\n };\n }\n\n async waitForCompletion() {\n while (!this.isCompleted) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n\n async cleanup() {\n if (this.transport) {\n await this.client.close();\n }\n }\n}\n\nconst main = async () => {\n const client = new SSEClient();\n try {\n await client.connectToServer();\n await client.waitForCompletion();\n } catch (error) {\n console.error(error);\n } finally {\n await client.cleanup();\n }\n};\n\nmain();\n"],"mappings":";;;;;AAMA,IAAM,YAAN,MAAgB;CACd,AAAQ;CACR,AAAQ,YAA8B;CACtC,AAAQ,cAAc;CAEtB,cAAc;AACZ,OAAK,SAAS,YAAY;;CAG5B,MAAM,kBAAkB;EACtB,MAAM,eAAe,QAAQ,IAAI,kBAAkB;EAEnD,MAAM,MAAM,IAAI,IAAI,aAAa;AACjC,MAAI;AACF,WAAQ,KAAK,0BAA0B,eAAe;AACtD,QAAK,YAAY,IAAI,8BAA8B,IAAI;AACvD,SAAM,KAAK,OAAO,QAAQ,KAAK,UAAU;AACzC,WAAQ,KAAK,0BAA0B;AAEvC,QAAK,gBAAgB;WACd,GAAG;AACV,WAAQ,MAAM,qCAAqC,EAAE;AACrD,SAAM;;;CAIV,AAAQ,iBAAiB;AACvB,MAAI,KAAK,cAAc,KAAM;AAE7B,OAAK,UAAU,gBAAgB;AAC7B,WAAQ,KAAK,oBAAoB;AACjC,QAAK,cAAc;;AAGrB,OAAK,UAAU,UAAU,OAAO,UAAU;AACxC,WAAQ,MAAM,qBAAqB,MAAM;AACzC,SAAM,KAAK,SAAS;;AAGtB,OAAK,UAAU,aAAa,YAAY;AACtC,WAAQ,KAAK,sBAAsB,QAAQ;;;CAI/C,MAAM,oBAAoB;AACxB,SAAO,CAAC,KAAK,YACX,OAAM,IAAI,SAAS,YAAY,WAAW,SAAS,IAAI,CAAC;;CAI5D,MAAM,UAAU;AACd,MAAI,KAAK,UACP,OAAM,KAAK,OAAO,OAAO;;;AAK/B,MAAM,OAAO,YAAY;CACvB,MAAM,SAAS,IAAI,WAAW;AAC9B,KAAI;AACF,QAAM,OAAO,iBAAiB;AAC9B,QAAM,OAAO,mBAAmB;UACzB,OAAO;AACd,UAAQ,MAAM,MAAM;WACZ;AACR,QAAM,OAAO,SAAS;;;AAI1B,MAAM"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { basename, dirname, join, relative, resolve, sep } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
|
|
5
|
+
//#region ../chokidar/dist/esm/_virtual/_utils_asset.mjs
|
|
6
|
+
const hereDirname = () => {
|
|
7
|
+
try {
|
|
8
|
+
return dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
} catch {
|
|
10
|
+
return typeof __dirname !== "undefined" ? __dirname : process.cwd();
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
const findDistRoot = (startDir) => {
|
|
14
|
+
let dir = startDir;
|
|
15
|
+
for (let i = 0; i < 12; i++) {
|
|
16
|
+
if (basename(dir) === "dist") return dir;
|
|
17
|
+
const parent = resolve(dir, "..");
|
|
18
|
+
if (parent === dir) break;
|
|
19
|
+
dir = parent;
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
};
|
|
23
|
+
const normalizeFrameFile = (file) => {
|
|
24
|
+
if (!file) return null;
|
|
25
|
+
try {
|
|
26
|
+
if (file.startsWith("file://")) return fileURLToPath(file);
|
|
27
|
+
} catch {}
|
|
28
|
+
return file;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Returns the directory of the *caller* module that invoked readAsset.
|
|
32
|
+
* Prefers non-virtual frames; falls back to the first real frame.
|
|
33
|
+
*/
|
|
34
|
+
const getCallerDir = () => {
|
|
35
|
+
const prev = Error.prepareStackTrace;
|
|
36
|
+
try {
|
|
37
|
+
Error.prepareStackTrace = (_, structured) => structured;
|
|
38
|
+
const err = /* @__PURE__ */ new Error();
|
|
39
|
+
Error.captureStackTrace(err, getCallerDir);
|
|
40
|
+
/** @type {import('node:vm').CallSite[]} */
|
|
41
|
+
const frames = err.stack || [];
|
|
42
|
+
const isVirtualPath = (p) => p.includes(`${sep}_virtual${sep}`) || p.includes("/_virtual/");
|
|
43
|
+
for (const frame of frames) {
|
|
44
|
+
const file = normalizeFrameFile(typeof frame.getFileName === "function" ? frame.getFileName() : null);
|
|
45
|
+
if (!file) continue;
|
|
46
|
+
if (file.includes("node:internal") || file.includes(`${sep}internal${sep}modules${sep}`)) continue;
|
|
47
|
+
if (!isVirtualPath(file)) return dirname(file);
|
|
48
|
+
}
|
|
49
|
+
for (const frame of frames) {
|
|
50
|
+
const file = normalizeFrameFile(typeof frame.getFileName === "function" ? frame.getFileName() : null);
|
|
51
|
+
if (file) return dirname(file);
|
|
52
|
+
}
|
|
53
|
+
} catch {} finally {
|
|
54
|
+
Error.prepareStackTrace = prev;
|
|
55
|
+
}
|
|
56
|
+
return hereDirname();
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Read an asset copied from src/** to dist/assets/**.
|
|
60
|
+
* - './' or '../' is resolved relative to the *caller module's* emitted directory.
|
|
61
|
+
* - otherwise, treat as src-relative.
|
|
62
|
+
*
|
|
63
|
+
* @param {string} relPath - e.g. './PROMPT.md' or 'utils/AI/askDocQuestion/embeddings/<fileKey>.json'
|
|
64
|
+
* @param {BufferEncoding} [encoding='utf8']
|
|
65
|
+
*/
|
|
66
|
+
const readAsset = (relPath, encoding = "utf8") => {
|
|
67
|
+
const here = hereDirname();
|
|
68
|
+
const distRoot = findDistRoot(here) ?? resolve(here, "..", "..", "dist");
|
|
69
|
+
const assetsRoot = join(distRoot, "assets");
|
|
70
|
+
const tried = [];
|
|
71
|
+
/**
|
|
72
|
+
* Transform dist/(esm|cjs)/... and _virtual/ prefix to clean subpath (Windows-safe)
|
|
73
|
+
*/
|
|
74
|
+
const callerSubpath = relative(distRoot, getCallerDir()).split("\\").join("/").replace(/^(?:dist\/)?(?:esm|cjs)\//, "").replace(/^_virtual\//, "");
|
|
75
|
+
if (relPath.startsWith("./") || relPath.startsWith("../")) {
|
|
76
|
+
const fromCallerAbs = resolve(assetsRoot, callerSubpath, relPath);
|
|
77
|
+
tried.push(fromCallerAbs);
|
|
78
|
+
if (existsSync(fromCallerAbs)) return readFileSync(fromCallerAbs, encoding);
|
|
79
|
+
}
|
|
80
|
+
const directPath = join(assetsRoot, relPath);
|
|
81
|
+
tried.push(directPath);
|
|
82
|
+
if (existsSync(directPath)) return readFileSync(directPath, encoding);
|
|
83
|
+
if (callerSubpath) {
|
|
84
|
+
const nested = join(assetsRoot, callerSubpath, relPath);
|
|
85
|
+
tried.push(nested);
|
|
86
|
+
if (existsSync(nested)) return readFileSync(nested, encoding);
|
|
87
|
+
}
|
|
88
|
+
const msg = [
|
|
89
|
+
"readAsset: file not found.",
|
|
90
|
+
"Searched:",
|
|
91
|
+
...tried.map((p) => `- ${p}`)
|
|
92
|
+
].join("\n");
|
|
93
|
+
throw new Error(msg);
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
//#endregion
|
|
97
|
+
export { readAsset };
|
|
98
|
+
//# sourceMappingURL=_utils_asset.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_utils_asset.mjs","names":[],"sources":["../../../../../../../../../chokidar/dist/esm/_virtual/_utils_asset.mjs"],"sourcesContent":["import { basename, dirname, join, relative, resolve, sep } from \"node:path\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\n//#region \\0utils:asset\nconst hereDirname = () => {\n\ttry {\n\t\treturn dirname(fileURLToPath(import.meta.url));\n\t} catch {\n\t\treturn typeof __dirname !== \"undefined\" ? __dirname : process.cwd();\n\t}\n};\nconst findDistRoot = (startDir) => {\n\tlet dir = startDir;\n\tfor (let i = 0; i < 12; i++) {\n\t\tif (basename(dir) === \"dist\") return dir;\n\t\tconst parent = resolve(dir, \"..\");\n\t\tif (parent === dir) break;\n\t\tdir = parent;\n\t}\n\treturn null;\n};\nconst normalizeFrameFile = (file) => {\n\tif (!file) return null;\n\ttry {\n\t\tif (file.startsWith(\"file://\")) return fileURLToPath(file);\n\t} catch {}\n\treturn file;\n};\n/**\n* Returns the directory of the *caller* module that invoked readAsset.\n* Prefers non-virtual frames; falls back to the first real frame.\n*/\nconst getCallerDir = () => {\n\tconst prev = Error.prepareStackTrace;\n\ttry {\n\t\tError.prepareStackTrace = (_, structured) => structured;\n\t\tconst err = /* @__PURE__ */ new Error();\n\t\tError.captureStackTrace(err, getCallerDir);\n\t\t/** @type {import('node:vm').CallSite[]} */\n\t\tconst frames = err.stack || [];\n\t\tconst isVirtualPath = (p) => p.includes(`${sep}_virtual${sep}`) || p.includes(\"/_virtual/\");\n\t\tfor (const frame of frames) {\n\t\t\tconst file = normalizeFrameFile(typeof frame.getFileName === \"function\" ? frame.getFileName() : null);\n\t\t\tif (!file) continue;\n\t\t\tif (file.includes(\"node:internal\") || file.includes(`${sep}internal${sep}modules${sep}`)) continue;\n\t\t\tif (!isVirtualPath(file)) return dirname(file);\n\t\t}\n\t\tfor (const frame of frames) {\n\t\t\tconst file = normalizeFrameFile(typeof frame.getFileName === \"function\" ? frame.getFileName() : null);\n\t\t\tif (file) return dirname(file);\n\t\t}\n\t} catch {} finally {\n\t\tError.prepareStackTrace = prev;\n\t}\n\treturn hereDirname();\n};\n/**\n* Read an asset copied from src/** to dist/assets/**.\n* - './' or '../' is resolved relative to the *caller module's* emitted directory.\n* - otherwise, treat as src-relative.\n*\n* @param {string} relPath - e.g. './PROMPT.md' or 'utils/AI/askDocQuestion/embeddings/<fileKey>.json'\n* @param {BufferEncoding} [encoding='utf8']\n*/\nconst readAsset = (relPath, encoding = \"utf8\") => {\n\tconst here = hereDirname();\n\tconst distRoot = findDistRoot(here) ?? resolve(here, \"..\", \"..\", \"dist\");\n\tconst assetsRoot = join(distRoot, \"assets\");\n\tconst tried = [];\n\t/**\n\t* Transform dist/(esm|cjs)/... and _virtual/ prefix to clean subpath (Windows-safe)\n\t*/\n\tconst callerSubpath = relative(distRoot, getCallerDir()).split(\"\\\\\").join(\"/\").replace(/^(?:dist\\/)?(?:esm|cjs)\\//, \"\").replace(/^_virtual\\//, \"\");\n\tif (relPath.startsWith(\"./\") || relPath.startsWith(\"../\")) {\n\t\tconst fromCallerAbs = resolve(assetsRoot, callerSubpath, relPath);\n\t\ttried.push(fromCallerAbs);\n\t\tif (existsSync(fromCallerAbs)) return readFileSync(fromCallerAbs, encoding);\n\t}\n\tconst directPath = join(assetsRoot, relPath);\n\ttried.push(directPath);\n\tif (existsSync(directPath)) return readFileSync(directPath, encoding);\n\tif (callerSubpath) {\n\t\tconst nested = join(assetsRoot, callerSubpath, relPath);\n\t\ttried.push(nested);\n\t\tif (existsSync(nested)) return readFileSync(nested, encoding);\n\t}\n\tconst msg = [\n\t\t\"readAsset: file not found.\",\n\t\t\"Searched:\",\n\t\t...tried.map((p) => `- ${p}`)\n\t].join(\"\\n\");\n\tthrow new Error(msg);\n};\n\n//#endregion\nexport { readAsset };"],"mappings":";;;;;AAKA,MAAM,oBAAoB;AACzB,KAAI;AACH,SAAO,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;SACvC;AACP,SAAO,OAAO,cAAc,cAAc,YAAY,QAAQ,KAAK;;;AAGrE,MAAM,gBAAgB,aAAa;CAClC,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;AAC5B,MAAI,SAAS,IAAI,KAAK,OAAQ,QAAO;EACrC,MAAM,SAAS,QAAQ,KAAK,KAAK;AACjC,MAAI,WAAW,IAAK;AACpB,QAAM;;AAEP,QAAO;;AAER,MAAM,sBAAsB,SAAS;AACpC,KAAI,CAAC,KAAM,QAAO;AAClB,KAAI;AACH,MAAI,KAAK,WAAW,UAAU,CAAE,QAAO,cAAc,KAAK;SACnD;AACR,QAAO;;;;;;AAMR,MAAM,qBAAqB;CAC1B,MAAM,OAAO,MAAM;AACnB,KAAI;AACH,QAAM,qBAAqB,GAAG,eAAe;EAC7C,MAAM,sBAAsB,IAAI,OAAO;AACvC,QAAM,kBAAkB,KAAK,aAAa;;EAE1C,MAAM,SAAS,IAAI,SAAS,EAAE;EAC9B,MAAM,iBAAiB,MAAM,EAAE,SAAS,GAAG,IAAI,UAAU,MAAM,IAAI,EAAE,SAAS,aAAa;AAC3F,OAAK,MAAM,SAAS,QAAQ;GAC3B,MAAM,OAAO,mBAAmB,OAAO,MAAM,gBAAgB,aAAa,MAAM,aAAa,GAAG,KAAK;AACrG,OAAI,CAAC,KAAM;AACX,OAAI,KAAK,SAAS,gBAAgB,IAAI,KAAK,SAAS,GAAG,IAAI,UAAU,IAAI,SAAS,MAAM,CAAE;AAC1F,OAAI,CAAC,cAAc,KAAK,CAAE,QAAO,QAAQ,KAAK;;AAE/C,OAAK,MAAM,SAAS,QAAQ;GAC3B,MAAM,OAAO,mBAAmB,OAAO,MAAM,gBAAgB,aAAa,MAAM,aAAa,GAAG,KAAK;AACrG,OAAI,KAAM,QAAO,QAAQ,KAAK;;SAExB,WAAW;AAClB,QAAM,oBAAoB;;AAE3B,QAAO,aAAa;;;;;;;;;;AAUrB,MAAM,aAAa,SAAS,WAAW,WAAW;CACjD,MAAM,OAAO,aAAa;CAC1B,MAAM,WAAW,aAAa,KAAK,IAAI,QAAQ,MAAM,MAAM,MAAM,OAAO;CACxE,MAAM,aAAa,KAAK,UAAU,SAAS;CAC3C,MAAM,QAAQ,EAAE;;;;CAIhB,MAAM,gBAAgB,SAAS,UAAU,cAAc,CAAC,CAAC,MAAM,KAAK,CAAC,KAAK,IAAI,CAAC,QAAQ,6BAA6B,GAAG,CAAC,QAAQ,eAAe,GAAG;AAClJ,KAAI,QAAQ,WAAW,KAAK,IAAI,QAAQ,WAAW,MAAM,EAAE;EAC1D,MAAM,gBAAgB,QAAQ,YAAY,eAAe,QAAQ;AACjE,QAAM,KAAK,cAAc;AACzB,MAAI,WAAW,cAAc,CAAE,QAAO,aAAa,eAAe,SAAS;;CAE5E,MAAM,aAAa,KAAK,YAAY,QAAQ;AAC5C,OAAM,KAAK,WAAW;AACtB,KAAI,WAAW,WAAW,CAAE,QAAO,aAAa,YAAY,SAAS;AACrE,KAAI,eAAe;EAClB,MAAM,SAAS,KAAK,YAAY,eAAe,QAAQ;AACvD,QAAM,KAAK,OAAO;AAClB,MAAI,WAAW,OAAO,CAAE,QAAO,aAAa,QAAQ,SAAS;;CAE9D,MAAM,MAAM;EACX;EACA;EACA,GAAG,MAAM,KAAK,MAAM,KAAK,IAAI;EAC7B,CAAC,KAAK,KAAK;AACZ,OAAM,IAAI,MAAM,IAAI"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { readAsset } from "../_virtual/_utils_asset.mjs";
|
|
2
|
+
import { getMarkdownMetadata } from "../../../../core/dist/esm/transpiler/markdown/getMarkdownMetadata.mjs";
|
|
3
|
+
import { promises } from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { v } from "@intlayer/config/logger";
|
|
6
|
+
|
|
7
|
+
//#region ../chokidar/dist/esm/installSkills/index.mjs
|
|
8
|
+
/**
|
|
9
|
+
* Metadata for each available documentation skill.
|
|
10
|
+
*/
|
|
11
|
+
const SKILLS_METADATA = {
|
|
12
|
+
Config: "Intlayer configuration documentation",
|
|
13
|
+
Content: "Reference for all Intlayer content node types (t, enu, etc.)",
|
|
14
|
+
Usage: "How to use Intlayer in your project",
|
|
15
|
+
CLI: "Intlayer CLI commands and usage",
|
|
16
|
+
Compiler: "Intlayer Compiler setup and usage for automatic content extraction without .content files",
|
|
17
|
+
RemoteContent: "How to use Intlayer with Remote/CMS/Server-side content",
|
|
18
|
+
NextJS: "Next.js-specific usage (Server & Client components)",
|
|
19
|
+
React: "React-specific syntax and hooks usage",
|
|
20
|
+
Vue: "Vue-specific composables and syntax",
|
|
21
|
+
Svelte: "Svelte-specific stores and syntax",
|
|
22
|
+
Angular: "Angular-specific syntax and Injectable Function usage",
|
|
23
|
+
Preact: "Preact-specific syntax and hooks usage",
|
|
24
|
+
Solid: "Integrates Intlayer internationalization with SolidJS components. Use when the user asks to \"setup SolidJS i18n\", use the \"useIntlayer\" hook in Solid, or manage locales in a SolidJS application.",
|
|
25
|
+
Astro: "Astro-specific usage and getIntlayer"
|
|
26
|
+
};
|
|
27
|
+
const SKILLS = Object.keys(SKILLS_METADATA);
|
|
28
|
+
/**
|
|
29
|
+
* Metadata and configuration for each supported platform.
|
|
30
|
+
*/
|
|
31
|
+
const PLATFORMS_METADATA = {
|
|
32
|
+
Cursor: {
|
|
33
|
+
label: "Cursor",
|
|
34
|
+
dir: ".cursor/skills",
|
|
35
|
+
check: () => process.env.CURSOR === "true" || process.env.TERM_PROGRAM === "cursor"
|
|
36
|
+
},
|
|
37
|
+
Windsurf: {
|
|
38
|
+
label: "Windsurf",
|
|
39
|
+
dir: ".windsurf/skills",
|
|
40
|
+
check: () => process.env.WINDSURF === "true" || process.env.TERM_PROGRAM === "windsurf"
|
|
41
|
+
},
|
|
42
|
+
Trae: {
|
|
43
|
+
label: "Trae",
|
|
44
|
+
dir: ".trae/skills",
|
|
45
|
+
check: () => process.env.TRAE === "true" || process.env.TERM_PROGRAM === "trae"
|
|
46
|
+
},
|
|
47
|
+
TraeCN: {
|
|
48
|
+
label: "Trae CN",
|
|
49
|
+
dir: ".trae/skills",
|
|
50
|
+
check: () => process.env.TRAE_CN === "true"
|
|
51
|
+
},
|
|
52
|
+
VSCode: {
|
|
53
|
+
label: "VS Code",
|
|
54
|
+
dir: ".vscode/skills",
|
|
55
|
+
check: () => process.env.VSCODE === "true" || process.env.TERM_PROGRAM === "vscode"
|
|
56
|
+
},
|
|
57
|
+
OpenCode: {
|
|
58
|
+
label: "OpenCode",
|
|
59
|
+
dir: ".opencode/skills",
|
|
60
|
+
check: () => process.env.OPENCODE === "true"
|
|
61
|
+
},
|
|
62
|
+
Claude: {
|
|
63
|
+
label: "Claude Code",
|
|
64
|
+
dir: ".claude/skills",
|
|
65
|
+
check: () => process.env.CLAUDE === "true"
|
|
66
|
+
},
|
|
67
|
+
GitHub: {
|
|
68
|
+
label: "GitHub Copilot Workspace",
|
|
69
|
+
dir: ".github/skills",
|
|
70
|
+
check: () => process.env.GITHUB_ACTIONS === "true" || !!process.env.GITHUB_WORKSPACE
|
|
71
|
+
},
|
|
72
|
+
Antigravity: {
|
|
73
|
+
label: "Antigravity",
|
|
74
|
+
dir: ".agent/skills"
|
|
75
|
+
},
|
|
76
|
+
Augment: {
|
|
77
|
+
label: "Augment",
|
|
78
|
+
dir: ".augment/skills"
|
|
79
|
+
},
|
|
80
|
+
OpenClaw: {
|
|
81
|
+
label: "OpenClaw",
|
|
82
|
+
dir: "skills"
|
|
83
|
+
},
|
|
84
|
+
Cline: {
|
|
85
|
+
label: "Cline",
|
|
86
|
+
dir: ".cline/skills"
|
|
87
|
+
},
|
|
88
|
+
CodeBuddy: {
|
|
89
|
+
label: "CodeBuddy",
|
|
90
|
+
dir: ".codebuddy/skills"
|
|
91
|
+
},
|
|
92
|
+
CommandCode: {
|
|
93
|
+
label: "Command Code",
|
|
94
|
+
dir: ".commandcode/skills"
|
|
95
|
+
},
|
|
96
|
+
Continue: {
|
|
97
|
+
label: "Continue",
|
|
98
|
+
dir: ".continue/skills"
|
|
99
|
+
},
|
|
100
|
+
Crush: {
|
|
101
|
+
label: "Crush",
|
|
102
|
+
dir: ".crush/skills"
|
|
103
|
+
},
|
|
104
|
+
Droid: {
|
|
105
|
+
label: "Droid",
|
|
106
|
+
dir: ".factory/skills"
|
|
107
|
+
},
|
|
108
|
+
Goose: {
|
|
109
|
+
label: "Goose",
|
|
110
|
+
dir: ".goose/skills"
|
|
111
|
+
},
|
|
112
|
+
IFlow: {
|
|
113
|
+
label: "iFlow CLI",
|
|
114
|
+
dir: ".iflow/skills"
|
|
115
|
+
},
|
|
116
|
+
Junie: {
|
|
117
|
+
label: "Junie",
|
|
118
|
+
dir: ".junie/skills"
|
|
119
|
+
},
|
|
120
|
+
KiloCode: {
|
|
121
|
+
label: "Kilo Code",
|
|
122
|
+
dir: ".kilocode/skills"
|
|
123
|
+
},
|
|
124
|
+
Kiro: {
|
|
125
|
+
label: "Kiro CLI",
|
|
126
|
+
dir: ".kiro/skills"
|
|
127
|
+
},
|
|
128
|
+
Kode: {
|
|
129
|
+
label: "Kode",
|
|
130
|
+
dir: ".kode/skills"
|
|
131
|
+
},
|
|
132
|
+
MCPJam: {
|
|
133
|
+
label: "MCPJam",
|
|
134
|
+
dir: ".mcpjam/skills"
|
|
135
|
+
},
|
|
136
|
+
MistralVibe: {
|
|
137
|
+
label: "Mistral Vibe",
|
|
138
|
+
dir: ".vibe/skills"
|
|
139
|
+
},
|
|
140
|
+
Mux: {
|
|
141
|
+
label: "Mux",
|
|
142
|
+
dir: ".mux/skills"
|
|
143
|
+
},
|
|
144
|
+
OpenHands: {
|
|
145
|
+
label: "OpenHands",
|
|
146
|
+
dir: ".openhands/skills"
|
|
147
|
+
},
|
|
148
|
+
Pi: {
|
|
149
|
+
label: "Pi",
|
|
150
|
+
dir: ".pi/skills"
|
|
151
|
+
},
|
|
152
|
+
Qoder: {
|
|
153
|
+
label: "Qoder",
|
|
154
|
+
dir: ".qoder/skills"
|
|
155
|
+
},
|
|
156
|
+
Qwen: {
|
|
157
|
+
label: "Qwen Code",
|
|
158
|
+
dir: ".qwen/skills"
|
|
159
|
+
},
|
|
160
|
+
RooCode: {
|
|
161
|
+
label: "Roo Code",
|
|
162
|
+
dir: ".roo/skills"
|
|
163
|
+
},
|
|
164
|
+
Zencoder: {
|
|
165
|
+
label: "Zencoder",
|
|
166
|
+
dir: ".zencoder/skills"
|
|
167
|
+
},
|
|
168
|
+
Neovate: {
|
|
169
|
+
label: "Neovate",
|
|
170
|
+
dir: ".neovate/skills"
|
|
171
|
+
},
|
|
172
|
+
Pochi: {
|
|
173
|
+
label: "Pochi",
|
|
174
|
+
dir: ".pochi/skills"
|
|
175
|
+
},
|
|
176
|
+
Other: {
|
|
177
|
+
label: "Other",
|
|
178
|
+
dir: "skills"
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
const PLATFORMS = Object.keys(PLATFORMS_METADATA);
|
|
182
|
+
/**
|
|
183
|
+
* Maps specific skill keys to special filenames if they differ from standard snake_case.
|
|
184
|
+
*/
|
|
185
|
+
const SKILL_FILENAME_MAP = {};
|
|
186
|
+
/**
|
|
187
|
+
* Helper to convert CamelCase to kebab-case for directory naming
|
|
188
|
+
*/
|
|
189
|
+
const camelToKebabCase = (str) => str.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
|
|
190
|
+
/**
|
|
191
|
+
* Reads the raw markdown content for a specific skill from the assets folder.
|
|
192
|
+
*/
|
|
193
|
+
const getSkillContent = (skill) => {
|
|
194
|
+
const fileName = `./skills/${SKILL_FILENAME_MAP[skill] ?? camelToKebabCase(skill)}.md`;
|
|
195
|
+
try {
|
|
196
|
+
return readAsset(fileName);
|
|
197
|
+
} catch {
|
|
198
|
+
console.warn(`Warning: Could not read asset for skill: ${skill} at ${fileName}`);
|
|
199
|
+
return "";
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* Reads the licence content from the assets folder.
|
|
204
|
+
*/
|
|
205
|
+
const getLicenceContent = () => {
|
|
206
|
+
try {
|
|
207
|
+
return readAsset("./LICENCE.md");
|
|
208
|
+
} catch {
|
|
209
|
+
console.warn("Warning: Could not read LICENCE.md asset");
|
|
210
|
+
return "";
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
/**
|
|
214
|
+
* Fetches the content of a URL using native fetch.
|
|
215
|
+
*/
|
|
216
|
+
const fetchUrlContent = async (url) => {
|
|
217
|
+
const response = await fetch(url);
|
|
218
|
+
if (!response.ok) throw new Error(`Failed to fetch ${url}: ${response.statusText}`);
|
|
219
|
+
return response.text();
|
|
220
|
+
};
|
|
221
|
+
/**
|
|
222
|
+
* Installs skills using the "Agent Skills" directory standard.
|
|
223
|
+
* Standard: <PROJECT_ROOT>/<CONFIG_DIR>/skills/<SKILL_NAME>/SKILL.md
|
|
224
|
+
*/
|
|
225
|
+
const installSkills = async (projectRoot, platform, skills) => {
|
|
226
|
+
const relativeDir = PLATFORMS_METADATA[platform].dir ?? "skills";
|
|
227
|
+
const skillsBaseDir = path.join(projectRoot, relativeDir);
|
|
228
|
+
await promises.mkdir(skillsBaseDir, { recursive: true });
|
|
229
|
+
const createdSkills = [];
|
|
230
|
+
const licenceContent = getLicenceContent();
|
|
231
|
+
for (const skill of skills) {
|
|
232
|
+
const skillName = `intlayer-${SKILL_FILENAME_MAP[skill] ?? camelToKebabCase(skill)}`;
|
|
233
|
+
const skillContent = getSkillContent(skill);
|
|
234
|
+
if (!skillContent) continue;
|
|
235
|
+
const urls = Array.from(new Set(skillContent.match(/https:\/\/intlayer\.org\/doc\/[^\s)]+\.md/g) || []));
|
|
236
|
+
const skillDir = path.join(skillsBaseDir, skillName);
|
|
237
|
+
const referenceDir = path.join(skillDir, "references");
|
|
238
|
+
await promises.mkdir(referenceDir, { recursive: true });
|
|
239
|
+
if (licenceContent) await promises.writeFile(path.join(skillDir, "LICENCE.md"), licenceContent, "utf-8");
|
|
240
|
+
let updatedSkillContent = skillContent;
|
|
241
|
+
const downloadPromises = urls.map(async (url) => {
|
|
242
|
+
try {
|
|
243
|
+
const content = await fetchUrlContent(url);
|
|
244
|
+
const metadata = getMarkdownMetadata(content);
|
|
245
|
+
let fileName = "";
|
|
246
|
+
if (Array.isArray(metadata.slugs)) fileName = metadata.slugs.filter((slug) => slug !== "doc").join("_");
|
|
247
|
+
else fileName = new URL(url).pathname.split("/").filter((part) => part && part !== "doc").map((part) => part.replace(".md", "")).join("_");
|
|
248
|
+
fileName = fileName ? `${fileName}.md` : "index.md";
|
|
249
|
+
return {
|
|
250
|
+
url,
|
|
251
|
+
localRefPath: `references/${fileName}`,
|
|
252
|
+
fileName,
|
|
253
|
+
content,
|
|
254
|
+
success: true
|
|
255
|
+
};
|
|
256
|
+
} catch (error) {
|
|
257
|
+
console.warn(`Warning: Failed to download ref ${url} for skill ${skill}`, error);
|
|
258
|
+
return {
|
|
259
|
+
url,
|
|
260
|
+
success: false
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
const results = await Promise.all(downloadPromises);
|
|
265
|
+
for (const res of results) if (res.success && res.fileName && res.content && res.localRefPath) {
|
|
266
|
+
await promises.writeFile(path.join(referenceDir, res.fileName), res.content, "utf-8");
|
|
267
|
+
updatedSkillContent = updatedSkillContent.replaceAll(res.url, res.localRefPath);
|
|
268
|
+
}
|
|
269
|
+
const filePath = path.join(skillDir, "SKILL.md");
|
|
270
|
+
await promises.writeFile(filePath, updatedSkillContent, "utf-8");
|
|
271
|
+
createdSkills.push(`${skillName}/SKILL.md`);
|
|
272
|
+
}
|
|
273
|
+
if (createdSkills.length === 0) return `No skill files were created. Check your asset paths.`;
|
|
274
|
+
return `${v} Created ${createdSkills.length} skills in ${skillsBaseDir}`;
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
//#endregion
|
|
278
|
+
export { PLATFORMS, SKILLS, installSkills };
|
|
279
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../../../../../../chokidar/dist/esm/installSkills/index.mjs"],"sourcesContent":["import { readAsset } from \"../_virtual/_utils_asset.mjs\";\nimport path from \"node:path\";\nimport { v } from \"@intlayer/config/logger\";\nimport { promises } from \"node:fs\";\nimport { getMarkdownMetadata } from \"@intlayer/core/markdown\";\n\n//#region src/installSkills/index.ts\n/**\n* Metadata for each available documentation skill.\n*/\nconst SKILLS_METADATA = {\n\tConfig: \"Intlayer configuration documentation\",\n\tContent: \"Reference for all Intlayer content node types (t, enu, etc.)\",\n\tUsage: \"How to use Intlayer in your project\",\n\tCLI: \"Intlayer CLI commands and usage\",\n\tCompiler: \"Intlayer Compiler setup and usage for automatic content extraction without .content files\",\n\tRemoteContent: \"How to use Intlayer with Remote/CMS/Server-side content\",\n\tNextJS: \"Next.js-specific usage (Server & Client components)\",\n\tReact: \"React-specific syntax and hooks usage\",\n\tVue: \"Vue-specific composables and syntax\",\n\tSvelte: \"Svelte-specific stores and syntax\",\n\tAngular: \"Angular-specific syntax and Injectable Function usage\",\n\tPreact: \"Preact-specific syntax and hooks usage\",\n\tSolid: \"Integrates Intlayer internationalization with SolidJS components. Use when the user asks to \\\"setup SolidJS i18n\\\", use the \\\"useIntlayer\\\" hook in Solid, or manage locales in a SolidJS application.\",\n\tAstro: \"Astro-specific usage and getIntlayer\"\n};\nconst SKILLS = Object.keys(SKILLS_METADATA);\nconst getInitialSkills = (deps) => {\n\tconst skills = [\n\t\t\"Usage\",\n\t\t\"Content\",\n\t\t\"Config\",\n\t\t\"CLI\",\n\t\t\"Compiler\"\n\t];\n\tif (deps.next) skills.push(\"NextJS\");\n\tif (deps.react || !deps.next) skills.push(\"React\");\n\tif (deps.preact) skills.push(\"Preact\");\n\tif (deps[\"solid-js\"]) skills.push(\"Solid\");\n\tif (deps.vue || deps.nuxt) skills.push(\"Vue\");\n\tif (deps.svelte || deps[\"@sveltejs/kit\"]) skills.push(\"Svelte\");\n\tif (deps.astro) skills.push(\"Astro\");\n\treturn skills;\n};\n/**\n* Metadata and configuration for each supported platform.\n*/\nconst PLATFORMS_METADATA = {\n\tCursor: {\n\t\tlabel: \"Cursor\",\n\t\tdir: \".cursor/skills\",\n\t\tcheck: () => process.env.CURSOR === \"true\" || process.env.TERM_PROGRAM === \"cursor\"\n\t},\n\tWindsurf: {\n\t\tlabel: \"Windsurf\",\n\t\tdir: \".windsurf/skills\",\n\t\tcheck: () => process.env.WINDSURF === \"true\" || process.env.TERM_PROGRAM === \"windsurf\"\n\t},\n\tTrae: {\n\t\tlabel: \"Trae\",\n\t\tdir: \".trae/skills\",\n\t\tcheck: () => process.env.TRAE === \"true\" || process.env.TERM_PROGRAM === \"trae\"\n\t},\n\tTraeCN: {\n\t\tlabel: \"Trae CN\",\n\t\tdir: \".trae/skills\",\n\t\tcheck: () => process.env.TRAE_CN === \"true\"\n\t},\n\tVSCode: {\n\t\tlabel: \"VS Code\",\n\t\tdir: \".vscode/skills\",\n\t\tcheck: () => process.env.VSCODE === \"true\" || process.env.TERM_PROGRAM === \"vscode\"\n\t},\n\tOpenCode: {\n\t\tlabel: \"OpenCode\",\n\t\tdir: \".opencode/skills\",\n\t\tcheck: () => process.env.OPENCODE === \"true\"\n\t},\n\tClaude: {\n\t\tlabel: \"Claude Code\",\n\t\tdir: \".claude/skills\",\n\t\tcheck: () => process.env.CLAUDE === \"true\"\n\t},\n\tGitHub: {\n\t\tlabel: \"GitHub Copilot Workspace\",\n\t\tdir: \".github/skills\",\n\t\tcheck: () => process.env.GITHUB_ACTIONS === \"true\" || !!process.env.GITHUB_WORKSPACE\n\t},\n\tAntigravity: {\n\t\tlabel: \"Antigravity\",\n\t\tdir: \".agent/skills\"\n\t},\n\tAugment: {\n\t\tlabel: \"Augment\",\n\t\tdir: \".augment/skills\"\n\t},\n\tOpenClaw: {\n\t\tlabel: \"OpenClaw\",\n\t\tdir: \"skills\"\n\t},\n\tCline: {\n\t\tlabel: \"Cline\",\n\t\tdir: \".cline/skills\"\n\t},\n\tCodeBuddy: {\n\t\tlabel: \"CodeBuddy\",\n\t\tdir: \".codebuddy/skills\"\n\t},\n\tCommandCode: {\n\t\tlabel: \"Command Code\",\n\t\tdir: \".commandcode/skills\"\n\t},\n\tContinue: {\n\t\tlabel: \"Continue\",\n\t\tdir: \".continue/skills\"\n\t},\n\tCrush: {\n\t\tlabel: \"Crush\",\n\t\tdir: \".crush/skills\"\n\t},\n\tDroid: {\n\t\tlabel: \"Droid\",\n\t\tdir: \".factory/skills\"\n\t},\n\tGoose: {\n\t\tlabel: \"Goose\",\n\t\tdir: \".goose/skills\"\n\t},\n\tIFlow: {\n\t\tlabel: \"iFlow CLI\",\n\t\tdir: \".iflow/skills\"\n\t},\n\tJunie: {\n\t\tlabel: \"Junie\",\n\t\tdir: \".junie/skills\"\n\t},\n\tKiloCode: {\n\t\tlabel: \"Kilo Code\",\n\t\tdir: \".kilocode/skills\"\n\t},\n\tKiro: {\n\t\tlabel: \"Kiro CLI\",\n\t\tdir: \".kiro/skills\"\n\t},\n\tKode: {\n\t\tlabel: \"Kode\",\n\t\tdir: \".kode/skills\"\n\t},\n\tMCPJam: {\n\t\tlabel: \"MCPJam\",\n\t\tdir: \".mcpjam/skills\"\n\t},\n\tMistralVibe: {\n\t\tlabel: \"Mistral Vibe\",\n\t\tdir: \".vibe/skills\"\n\t},\n\tMux: {\n\t\tlabel: \"Mux\",\n\t\tdir: \".mux/skills\"\n\t},\n\tOpenHands: {\n\t\tlabel: \"OpenHands\",\n\t\tdir: \".openhands/skills\"\n\t},\n\tPi: {\n\t\tlabel: \"Pi\",\n\t\tdir: \".pi/skills\"\n\t},\n\tQoder: {\n\t\tlabel: \"Qoder\",\n\t\tdir: \".qoder/skills\"\n\t},\n\tQwen: {\n\t\tlabel: \"Qwen Code\",\n\t\tdir: \".qwen/skills\"\n\t},\n\tRooCode: {\n\t\tlabel: \"Roo Code\",\n\t\tdir: \".roo/skills\"\n\t},\n\tZencoder: {\n\t\tlabel: \"Zencoder\",\n\t\tdir: \".zencoder/skills\"\n\t},\n\tNeovate: {\n\t\tlabel: \"Neovate\",\n\t\tdir: \".neovate/skills\"\n\t},\n\tPochi: {\n\t\tlabel: \"Pochi\",\n\t\tdir: \".pochi/skills\"\n\t},\n\tOther: {\n\t\tlabel: \"Other\",\n\t\tdir: \"skills\"\n\t}\n};\nconst PLATFORMS = Object.keys(PLATFORMS_METADATA);\n/**\n* Maps specific skill keys to special filenames if they differ from standard snake_case.\n*/\nconst SKILL_FILENAME_MAP = {};\n/**\n* Helper to convert CamelCase to kebab-case for directory naming\n*/\nconst camelToKebabCase = (str) => str.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n/**\n* Reads the raw markdown content for a specific skill from the assets folder.\n*/\nconst getSkillContent = (skill) => {\n\tconst fileName = `./skills/${SKILL_FILENAME_MAP[skill] ?? camelToKebabCase(skill)}.md`;\n\ttry {\n\t\treturn readAsset(fileName);\n\t} catch {\n\t\tconsole.warn(`Warning: Could not read asset for skill: ${skill} at ${fileName}`);\n\t\treturn \"\";\n\t}\n};\n/**\n* Reads the licence content from the assets folder.\n*/\nconst getLicenceContent = () => {\n\ttry {\n\t\treturn readAsset(\"./LICENCE.md\");\n\t} catch {\n\t\tconsole.warn(\"Warning: Could not read LICENCE.md asset\");\n\t\treturn \"\";\n\t}\n};\n/**\n* Fetches the content of a URL using native fetch.\n*/\nconst fetchUrlContent = async (url) => {\n\tconst response = await fetch(url);\n\tif (!response.ok) throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\n\treturn response.text();\n};\n/**\n* Installs skills using the \"Agent Skills\" directory standard.\n* Standard: <PROJECT_ROOT>/<CONFIG_DIR>/skills/<SKILL_NAME>/SKILL.md\n*/\nconst installSkills = async (projectRoot, platform, skills) => {\n\tconst relativeDir = PLATFORMS_METADATA[platform].dir ?? \"skills\";\n\tconst skillsBaseDir = path.join(projectRoot, relativeDir);\n\tawait promises.mkdir(skillsBaseDir, { recursive: true });\n\tconst createdSkills = [];\n\tconst licenceContent = getLicenceContent();\n\tfor (const skill of skills) {\n\t\tconst skillName = `intlayer-${SKILL_FILENAME_MAP[skill] ?? camelToKebabCase(skill)}`;\n\t\tconst skillContent = getSkillContent(skill);\n\t\tif (!skillContent) continue;\n\t\tconst urls = Array.from(new Set(skillContent.match(/https:\\/\\/intlayer\\.org\\/doc\\/[^\\s)]+\\.md/g) || []));\n\t\tconst skillDir = path.join(skillsBaseDir, skillName);\n\t\tconst referenceDir = path.join(skillDir, \"references\");\n\t\tawait promises.mkdir(referenceDir, { recursive: true });\n\t\tif (licenceContent) await promises.writeFile(path.join(skillDir, \"LICENCE.md\"), licenceContent, \"utf-8\");\n\t\tlet updatedSkillContent = skillContent;\n\t\tconst downloadPromises = urls.map(async (url) => {\n\t\t\ttry {\n\t\t\t\tconst content = await fetchUrlContent(url);\n\t\t\t\tconst metadata = getMarkdownMetadata(content);\n\t\t\t\tlet fileName = \"\";\n\t\t\t\tif (Array.isArray(metadata.slugs)) fileName = metadata.slugs.filter((slug) => slug !== \"doc\").join(\"_\");\n\t\t\t\telse fileName = new URL(url).pathname.split(\"/\").filter((part) => part && part !== \"doc\").map((part) => part.replace(\".md\", \"\")).join(\"_\");\n\t\t\t\tfileName = fileName ? `${fileName}.md` : \"index.md\";\n\t\t\t\treturn {\n\t\t\t\t\turl,\n\t\t\t\t\tlocalRefPath: `references/${fileName}`,\n\t\t\t\t\tfileName,\n\t\t\t\t\tcontent,\n\t\t\t\t\tsuccess: true\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(`Warning: Failed to download ref ${url} for skill ${skill}`, error);\n\t\t\t\treturn {\n\t\t\t\t\turl,\n\t\t\t\t\tsuccess: false\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\t\tconst results = await Promise.all(downloadPromises);\n\t\tfor (const res of results) if (res.success && res.fileName && res.content && res.localRefPath) {\n\t\t\tawait promises.writeFile(path.join(referenceDir, res.fileName), res.content, \"utf-8\");\n\t\t\tupdatedSkillContent = updatedSkillContent.replaceAll(res.url, res.localRefPath);\n\t\t}\n\t\tconst filePath = path.join(skillDir, \"SKILL.md\");\n\t\tawait promises.writeFile(filePath, updatedSkillContent, \"utf-8\");\n\t\tcreatedSkills.push(`${skillName}/SKILL.md`);\n\t}\n\tif (createdSkills.length === 0) return `No skill files were created. Check your asset paths.`;\n\treturn `${v} Created ${createdSkills.length} skills in ${skillsBaseDir}`;\n};\n\n//#endregion\nexport { PLATFORMS, PLATFORMS_METADATA, SKILLS, SKILLS_METADATA, getInitialSkills, installSkills };\n//# sourceMappingURL=index.mjs.map"],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { dirname } from "node:path";
|
|
2
|
+
import fg from "/Users/aymericpineau/Documents/intlayer_/node_modules/.bun/fast-glob@3.3.3/node_modules/fast-glob/out/index.js";
|
|
3
|
+
import { configurationFilesCandidates } from "@intlayer/config/node";
|
|
4
|
+
import simpleGit from "/Users/aymericpineau/Documents/intlayer_/node_modules/.bun/simple-git@3.32.3/node_modules/simple-git/dist/esm/index.js";
|
|
5
|
+
|
|
6
|
+
//#region ../chokidar/dist/esm/listProjects.mjs
|
|
7
|
+
/**
|
|
8
|
+
* Get the git root directory
|
|
9
|
+
*/
|
|
10
|
+
const getGitRootDir = async (cwd) => {
|
|
11
|
+
try {
|
|
12
|
+
return (await (cwd ? simpleGit(cwd) : simpleGit()).revparse(["--show-toplevel"])).trim();
|
|
13
|
+
} catch (_error) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* List all Intlayer projects by searching for configuration files
|
|
19
|
+
*
|
|
20
|
+
* @param options - Options for listing projects
|
|
21
|
+
* @returns Array of absolute paths to project directories containing Intlayer config
|
|
22
|
+
*/
|
|
23
|
+
const listProjects = async (options) => {
|
|
24
|
+
let searchDir = options?.baseDir ?? process.cwd();
|
|
25
|
+
if (options?.gitRoot) {
|
|
26
|
+
const gitRootDir = await getGitRootDir(searchDir);
|
|
27
|
+
if (gitRootDir) searchDir = gitRootDir;
|
|
28
|
+
}
|
|
29
|
+
const configFiles = await fg(configurationFilesCandidates.map((fileName) => `**/${fileName}`), {
|
|
30
|
+
cwd: searchDir,
|
|
31
|
+
absolute: true,
|
|
32
|
+
ignore: ["**/node_modules/**", "**/.git/**"],
|
|
33
|
+
dot: true
|
|
34
|
+
});
|
|
35
|
+
const projectDirs = [...new Set(configFiles.map((file) => dirname(file)))];
|
|
36
|
+
return {
|
|
37
|
+
searchDir,
|
|
38
|
+
projectsPath: projectDirs.sort()
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
//#endregion
|
|
43
|
+
export { listProjects };
|
|
44
|
+
//# sourceMappingURL=listProjects.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listProjects.mjs","names":[],"sources":["../../../../../../../../chokidar/dist/esm/listProjects.mjs"],"sourcesContent":["import { dirname } from \"node:path\";\nimport fg from \"fast-glob\";\nimport { configurationFilesCandidates } from \"@intlayer/config/node\";\nimport simpleGit from \"simple-git\";\n\n//#region src/listProjects.ts\n/**\n* Get the git root directory\n*/\nconst getGitRootDir = async (cwd) => {\n\ttry {\n\t\treturn (await (cwd ? simpleGit(cwd) : simpleGit()).revparse([\"--show-toplevel\"])).trim();\n\t} catch (_error) {\n\t\treturn null;\n\t}\n};\n/**\n* List all Intlayer projects by searching for configuration files\n*\n* @param options - Options for listing projects\n* @returns Array of absolute paths to project directories containing Intlayer config\n*/\nconst listProjects = async (options) => {\n\tlet searchDir = options?.baseDir ?? process.cwd();\n\tif (options?.gitRoot) {\n\t\tconst gitRootDir = await getGitRootDir(searchDir);\n\t\tif (gitRootDir) searchDir = gitRootDir;\n\t}\n\tconst configFiles = await fg(configurationFilesCandidates.map((fileName) => `**/${fileName}`), {\n\t\tcwd: searchDir,\n\t\tabsolute: true,\n\t\tignore: [\"**/node_modules/**\", \"**/.git/**\"],\n\t\tdot: true\n\t});\n\tconst projectDirs = [...new Set(configFiles.map((file) => dirname(file)))];\n\treturn {\n\t\tsearchDir,\n\t\tprojectsPath: projectDirs.sort()\n\t};\n};\n\n//#endregion\nexport { listProjects };\n//# sourceMappingURL=listProjects.mjs.map"],"mappings":";;;;;;;;;AASA,MAAM,gBAAgB,OAAO,QAAQ;AACpC,KAAI;AACH,UAAQ,OAAO,MAAM,UAAU,IAAI,GAAG,WAAW,EAAE,SAAS,CAAC,kBAAkB,CAAC,EAAE,MAAM;UAChF,QAAQ;AAChB,SAAO;;;;;;;;;AAST,MAAM,eAAe,OAAO,YAAY;CACvC,IAAI,YAAY,SAAS,WAAW,QAAQ,KAAK;AACjD,KAAI,SAAS,SAAS;EACrB,MAAM,aAAa,MAAM,cAAc,UAAU;AACjD,MAAI,WAAY,aAAY;;CAE7B,MAAM,cAAc,MAAM,GAAG,6BAA6B,KAAK,aAAa,MAAM,WAAW,EAAE;EAC9F,KAAK;EACL,UAAU;EACV,QAAQ,CAAC,sBAAsB,aAAa;EAC5C,KAAK;EACL,CAAC;CACF,MAAM,cAAc,CAAC,GAAG,IAAI,IAAI,YAAY,KAAK,SAAS,QAAQ,KAAK,CAAC,CAAC,CAAC;AAC1E,QAAO;EACN;EACA,cAAc,YAAY,MAAM;EAChC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { parseYaml } from "../../utils/parseYaml.mjs";
|
|
2
|
+
|
|
3
|
+
//#region ../core/dist/esm/transpiler/markdown/getMarkdownMetadata.mjs
|
|
4
|
+
const getMarkdownMetadata = (markdown) => {
|
|
5
|
+
try {
|
|
6
|
+
const lines = markdown.split(/\r?\n/);
|
|
7
|
+
const firstNonEmptyLine = lines.find((line) => line.trim() !== "");
|
|
8
|
+
if (!firstNonEmptyLine || firstNonEmptyLine.trim() !== "---") return {};
|
|
9
|
+
let metadataEndIndex = -1;
|
|
10
|
+
for (let i = 1; i < lines.length; i++) if (lines[i].trim() === "---") {
|
|
11
|
+
metadataEndIndex = i;
|
|
12
|
+
break;
|
|
13
|
+
}
|
|
14
|
+
if (metadataEndIndex === -1) return {};
|
|
15
|
+
return parseYaml(lines.slice(1, metadataEndIndex).join("\n")) ?? {};
|
|
16
|
+
} catch (_e) {
|
|
17
|
+
return {};
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
22
|
+
export { getMarkdownMetadata };
|
|
23
|
+
//# sourceMappingURL=getMarkdownMetadata.mjs.map
|
package/dist/esm/packages/@intlayer/core/dist/esm/transpiler/markdown/getMarkdownMetadata.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getMarkdownMetadata.mjs","names":[],"sources":["../../../../../../../../../../core/dist/esm/transpiler/markdown/getMarkdownMetadata.mjs"],"sourcesContent":["import { parseYaml } from \"../../utils/parseYaml.mjs\";\n\n//#region src/transpiler/markdown/getMarkdownMetadata.ts\nconst getMarkdownMetadata = (markdown) => {\n\ttry {\n\t\tconst lines = markdown.split(/\\r?\\n/);\n\t\tconst firstNonEmptyLine = lines.find((line) => line.trim() !== \"\");\n\t\tif (!firstNonEmptyLine || firstNonEmptyLine.trim() !== \"---\") return {};\n\t\tlet metadataEndIndex = -1;\n\t\tfor (let i = 1; i < lines.length; i++) if (lines[i].trim() === \"---\") {\n\t\t\tmetadataEndIndex = i;\n\t\t\tbreak;\n\t\t}\n\t\tif (metadataEndIndex === -1) return {};\n\t\treturn parseYaml(lines.slice(1, metadataEndIndex).join(\"\\n\")) ?? {};\n\t} catch (_e) {\n\t\treturn {};\n\t}\n};\n\n//#endregion\nexport { getMarkdownMetadata };\n//# sourceMappingURL=getMarkdownMetadata.mjs.map"],"mappings":";;;AAGA,MAAM,uBAAuB,aAAa;AACzC,KAAI;EACH,MAAM,QAAQ,SAAS,MAAM,QAAQ;EACrC,MAAM,oBAAoB,MAAM,MAAM,SAAS,KAAK,MAAM,KAAK,GAAG;AAClE,MAAI,CAAC,qBAAqB,kBAAkB,MAAM,KAAK,MAAO,QAAO,EAAE;EACvE,IAAI,mBAAmB;AACvB,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAK,KAAI,MAAM,GAAG,MAAM,KAAK,OAAO;AACrE,sBAAmB;AACnB;;AAED,MAAI,qBAAqB,GAAI,QAAO,EAAE;AACtC,SAAO,UAAU,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,KAAK,CAAC,IAAI,EAAE;UAC3D,IAAI;AACZ,SAAO,EAAE"}
|