@intlayer/mcp 8.1.0 → 8.1.2
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/cjs/client/client.cjs +1 -1
- package/dist/cjs/server/server.cjs +1 -1
- package/dist/cjs/tools/cli.cjs +2 -2
- package/dist/cjs/tools/cli.cjs.map +1 -1
- package/dist/cjs/tools/installSkills.cjs +68 -8
- package/dist/cjs/tools/installSkills.cjs.map +1 -1
- package/dist/esm/tools/cli.mjs +1 -1
- package/dist/esm/tools/cli.mjs.map +1 -1
- package/dist/esm/tools/installSkills.mjs +64 -4
- package/dist/esm/tools/installSkills.mjs.map +1 -1
- package/dist/types/tools/installSkills.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
|
|
3
|
-
let node_path = require("node:path");
|
|
4
3
|
let node_fs = require("node:fs");
|
|
4
|
+
let node_path = require("node:path");
|
|
5
5
|
let node_url = require("node:url");
|
|
6
6
|
let _intlayer_config = require("@intlayer/config");
|
|
7
7
|
let _modelcontextprotocol_sdk_client_index_js = require("@modelcontextprotocol/sdk/client/index.js");
|
|
@@ -3,8 +3,8 @@ const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
|
|
|
3
3
|
const require_tools_cli = require('../tools/cli.cjs');
|
|
4
4
|
const require_tools_docs = require('../tools/docs.cjs');
|
|
5
5
|
const require_tools_installSkills = require('../tools/installSkills.cjs');
|
|
6
|
-
let node_path = require("node:path");
|
|
7
6
|
let node_fs = require("node:fs");
|
|
7
|
+
let node_path = require("node:path");
|
|
8
8
|
let node_url = require("node:url");
|
|
9
9
|
let _intlayer_config = require("@intlayer/config");
|
|
10
10
|
let _modelcontextprotocol_sdk_server_mcp_js = require("@modelcontextprotocol/sdk/server/mcp.js");
|
package/dist/cjs/tools/cli.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
|
|
3
3
|
let node_path = require("node:path");
|
|
4
|
-
let
|
|
4
|
+
let _intlayer_chokidar_cli = require("@intlayer/chokidar/cli");
|
|
5
5
|
let _intlayer_cli = require("@intlayer/cli");
|
|
6
6
|
let _intlayer_types = require("@intlayer/types");
|
|
7
7
|
let zod_v3 = require("zod/v3");
|
|
@@ -300,7 +300,7 @@ const loadCLITools = async (server) => {
|
|
|
300
300
|
annotations: { readOnlyHint: true }
|
|
301
301
|
}, async (props) => {
|
|
302
302
|
try {
|
|
303
|
-
const { searchDir, projectsPath } = await (0,
|
|
303
|
+
const { searchDir, projectsPath } = await (0, _intlayer_chokidar_cli.listProjects)({
|
|
304
304
|
baseDir: props.baseDir,
|
|
305
305
|
gitRoot: props.gitRoot
|
|
306
306
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.cjs","names":["z","Locales"],"sources":["../../../src/tools/cli.ts"],"sourcesContent":["import { relative } from 'node:path';\nimport { listProjects } from '@intlayer/chokidar';\nimport {\n build,\n extract,\n fill,\n init,\n listContentDeclarationRows,\n listMissingTranslations,\n pull,\n push,\n} from '@intlayer/cli';\nimport { Locales, type LogConfig } from '@intlayer/types';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport z from 'zod/v3';\n\ntype LoadCLITools = (server: McpServer) => Promise<void>;\n\nexport const loadCLITools: LoadCLITools = async (server) => {\n server.registerTool(\n 'intlayer-init',\n {\n title: 'Initialize Intlayer',\n description: 'Initialize Intlayer in the project',\n inputSchema: {\n projectRoot: z.string().describe('Project root directory'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async ({ projectRoot }) => {\n try {\n await init(projectRoot);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Initialization successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Initialization failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-build',\n {\n title: 'Build Dictionaries',\n description:\n 'Build the dictionaries. List all content declarations files `.content.{ts,tsx,js,json,...}` to update the content callable using the `useIntlayer` hook.',\n inputSchema: {\n watch: z.boolean().optional().describe('Watch for changes'),\n baseDir: z.string().optional().describe('Base directory'),\n env: z.string().optional().describe('Environment'),\n envFile: z.string().optional().describe('Environment file'),\n verbose: z.boolean().optional().describe('Verbose output'),\n prefix: z.string().optional().describe('Log prefix'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async ({ watch, baseDir, env, envFile, verbose, prefix }) => {\n try {\n const log: Partial<LogConfig> = {};\n if (verbose) {\n log.mode = 'verbose';\n }\n if (prefix) {\n log.prefix = prefix;\n }\n\n await build({\n watch,\n configOptions: {\n baseDir,\n env,\n envFile,\n override: {\n log,\n },\n },\n });\n\n return {\n content: [\n {\n type: 'text',\n text: 'Build successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Build failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-fill',\n {\n title: 'Fill Translations',\n description:\n 'Fill the dictionaries with missing translations / review translations using Intlayer servers',\n inputSchema: {\n sourceLocale: z\n .nativeEnum(Locales.ALL_LOCALES)\n .optional()\n .describe('Source locale'),\n outputLocales: z\n .union([\n z.nativeEnum(Locales.ALL_LOCALES),\n z.array(z.nativeEnum(Locales.ALL_LOCALES)),\n ])\n .optional()\n .describe('Output locales'),\n file: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('File path'),\n mode: z.enum(['complete', 'review']).optional().describe('Fill mode'),\n keys: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Keys to include'),\n excludedKeys: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Keys to exclude'),\n pathFilter: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Path filter'),\n gitOptions: z\n .object({\n gitDiff: z.boolean().optional(),\n gitDiffBase: z.string().optional(),\n gitDiffCurrent: z.string().optional(),\n uncommitted: z.boolean().optional(),\n unpushed: z.boolean().optional(),\n untracked: z.boolean().optional(),\n })\n .optional()\n .describe('Git options'),\n aiOptions: z\n .object({\n provider: z.string().optional(),\n temperature: z.number().optional(),\n model: z.string().optional(),\n apiKey: z.string().optional(),\n customPrompt: z.string().optional(),\n applicationContext: z.string().optional(),\n })\n .optional()\n .describe('AI options'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async (props) => {\n try {\n const { gitOptions, ...rest } = props;\n const fillOptions: any = { ...rest, gitOptions: undefined };\n\n if (gitOptions) {\n const { gitDiff, uncommitted, unpushed, untracked, ...restGit } =\n gitOptions;\n const mode = [];\n if (gitDiff) mode.push('gitDiff');\n if (uncommitted) mode.push('uncommitted');\n if (unpushed) mode.push('unpushed');\n if (untracked) mode.push('untracked');\n\n fillOptions.gitOptions = { ...restGit, mode };\n }\n\n await fill(fillOptions);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Fill successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Fill failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-push',\n {\n title: 'Push Dictionaries',\n description: 'Push local dictionaries to the server',\n inputSchema: {\n deleteLocaleDictionary: z\n .boolean()\n .optional()\n .describe('Delete local dictionary after push'),\n keepLocaleDictionary: z\n .boolean()\n .optional()\n .describe('Keep local dictionary after push'),\n dictionaries: z\n .array(z.string())\n .optional()\n .describe('List of dictionaries to push'),\n gitOptions: z\n .object({\n gitDiff: z.boolean().optional(),\n gitDiffBase: z.string().optional(),\n gitDiffCurrent: z.string().optional(),\n uncommitted: z.boolean().optional(),\n unpushed: z.boolean().optional(),\n untracked: z.boolean().optional(),\n })\n .optional()\n .describe('Git options'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async (props) => {\n try {\n const { gitOptions, ...rest } = props;\n const pushOptions: any = { ...rest, gitOptions: undefined };\n\n if (gitOptions) {\n const { gitDiff, uncommitted, unpushed, untracked, ...restGit } =\n gitOptions;\n const mode = [];\n if (gitDiff) mode.push('gitDiff');\n if (uncommitted) mode.push('uncommitted');\n if (unpushed) mode.push('unpushed');\n if (untracked) mode.push('untracked');\n\n pushOptions.gitOptions = { ...restGit, mode };\n }\n\n await push(pushOptions);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Push successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Push failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-pull',\n {\n title: 'Pull Dictionaries',\n description: 'Pull dictionaries from the CMS',\n inputSchema: {\n dictionaries: z\n .array(z.string())\n .optional()\n .describe('List of dictionaries to pull'),\n newDictionariesPath: z\n .string()\n .optional()\n .describe('Path to save new dictionaries'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async (props) => {\n try {\n await pull(props);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Pull successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Pull failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-content-list',\n {\n title: 'List Content Declarations',\n description:\n 'List the content declaration (.content.{ts,tsx,js,json,...}) files present in the project. That files contain the multilingual content of the application and are used to build the dictionaries.',\n inputSchema: {\n configOptions: z\n .object({\n baseDir: z.string().optional(),\n env: z.string().optional(),\n envFile: z.string().optional(),\n override: z\n .object({\n log: z\n .object({\n prefix: z.string().optional(),\n verbose: z.boolean().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional()\n .describe('Configuration options'),\n absolute: z\n .boolean()\n .optional()\n .describe(\n 'Output the results as absolute paths instead of relative paths'\n ),\n json: z\n .boolean()\n .optional()\n .describe('Output the results as JSON instead of formatted text'),\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async (props) => {\n try {\n const rows = listContentDeclarationRows(props);\n return {\n content: [\n {\n type: 'text',\n text: props.json\n ? JSON.stringify(rows)\n : JSON.stringify(rows, null, 2),\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Content list failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-content-test',\n {\n title: 'Test Translations',\n description:\n 'Test if there are missing translations in the content declaration files. That files contain the multilingual content of the application and are used to build the dictionaries.',\n inputSchema: {\n configOptions: z\n .object({\n baseDir: z.string().optional(),\n env: z.string().optional(),\n envFile: z.string().optional(),\n override: z\n .object({\n log: z\n .object({\n prefix: z.string().optional(),\n verbose: z.boolean().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional()\n .describe('Configuration options'),\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async (props) => {\n try {\n const missingTranslations = listMissingTranslations(\n props?.configOptions\n );\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(missingTranslations, null, 2),\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Content test failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-extract',\n {\n title: 'Extract strings from Component',\n description:\n 'Extract strings from an existing component to be placed in a .content file close to the component. Trigger this action to make an existing component multilingual. If the component does not exist, create a normal component including text in JSX, and then trigger this tool to extract it.',\n inputSchema: {\n file: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('List of files to extract'),\n outputContentDeclarations: z\n .string()\n .optional()\n .describe('Path to output content declaration files'),\n configOptions: z\n .object({\n baseDir: z.string().optional(),\n env: z.string().optional(),\n envFile: z.string().optional(),\n override: z\n .object({\n log: z\n .object({\n prefix: z.string().optional(),\n verbose: z.boolean().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional()\n .describe('Configuration options'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async (props) => {\n try {\n await extract({\n files: Array.isArray(props.file)\n ? props.file\n : props.file\n ? [props.file]\n : undefined,\n outputContentDeclarations: props.outputContentDeclarations,\n configOptions: props.configOptions,\n });\n\n return {\n content: [\n {\n type: 'text',\n text: 'Extract successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Extract failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-projects-list',\n {\n title: 'List Projects',\n description:\n 'List all Intlayer projects in the directory. Search for configuration files to find all Intlayer projects.',\n inputSchema: {\n baseDir: z\n .string()\n .optional()\n .describe('Base directory to search from'),\n gitRoot: z\n .boolean()\n .optional()\n .describe(\n 'Search from the git root directory instead of the base directory'\n ),\n absolute: z\n .boolean()\n .optional()\n .describe(\n 'Output the results as absolute paths instead of relative paths'\n ),\n json: z\n .boolean()\n .optional()\n .describe('Output the results as JSON instead of formatted text'),\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async (props) => {\n try {\n const { searchDir, projectsPath } = await listProjects({\n baseDir: props.baseDir,\n gitRoot: props.gitRoot,\n });\n\n // Handle absolute option similar to CLI command\n const projectsRelativePath = projectsPath\n .map((projectPath) =>\n props.absolute ? projectPath : relative(searchDir, projectPath)\n )\n .map((projectPath) => (projectPath === '' ? '.' : projectPath));\n\n const outputPaths = props.absolute\n ? projectsPath\n : projectsRelativePath;\n\n return {\n content: [\n {\n type: 'text',\n text: props.json\n ? JSON.stringify(outputPaths)\n : JSON.stringify(\n { searchDir, projectsPath: outputPaths },\n null,\n 2\n ),\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Projects list failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.cjs","names":["z","Locales"],"sources":["../../../src/tools/cli.ts"],"sourcesContent":["import { relative } from 'node:path';\nimport { listProjects } from '@intlayer/chokidar/cli';\nimport {\n build,\n extract,\n fill,\n init,\n listContentDeclarationRows,\n listMissingTranslations,\n pull,\n push,\n} from '@intlayer/cli';\nimport { Locales, type LogConfig } from '@intlayer/types';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport z from 'zod/v3';\n\ntype LoadCLITools = (server: McpServer) => Promise<void>;\n\nexport const loadCLITools: LoadCLITools = async (server) => {\n server.registerTool(\n 'intlayer-init',\n {\n title: 'Initialize Intlayer',\n description: 'Initialize Intlayer in the project',\n inputSchema: {\n projectRoot: z.string().describe('Project root directory'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async ({ projectRoot }) => {\n try {\n await init(projectRoot);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Initialization successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Initialization failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-build',\n {\n title: 'Build Dictionaries',\n description:\n 'Build the dictionaries. List all content declarations files `.content.{ts,tsx,js,json,...}` to update the content callable using the `useIntlayer` hook.',\n inputSchema: {\n watch: z.boolean().optional().describe('Watch for changes'),\n baseDir: z.string().optional().describe('Base directory'),\n env: z.string().optional().describe('Environment'),\n envFile: z.string().optional().describe('Environment file'),\n verbose: z.boolean().optional().describe('Verbose output'),\n prefix: z.string().optional().describe('Log prefix'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async ({ watch, baseDir, env, envFile, verbose, prefix }) => {\n try {\n const log: Partial<LogConfig> = {};\n if (verbose) {\n log.mode = 'verbose';\n }\n if (prefix) {\n log.prefix = prefix;\n }\n\n await build({\n watch,\n configOptions: {\n baseDir,\n env,\n envFile,\n override: {\n log,\n },\n },\n });\n\n return {\n content: [\n {\n type: 'text',\n text: 'Build successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Build failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-fill',\n {\n title: 'Fill Translations',\n description:\n 'Fill the dictionaries with missing translations / review translations using Intlayer servers',\n inputSchema: {\n sourceLocale: z\n .nativeEnum(Locales.ALL_LOCALES)\n .optional()\n .describe('Source locale'),\n outputLocales: z\n .union([\n z.nativeEnum(Locales.ALL_LOCALES),\n z.array(z.nativeEnum(Locales.ALL_LOCALES)),\n ])\n .optional()\n .describe('Output locales'),\n file: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('File path'),\n mode: z.enum(['complete', 'review']).optional().describe('Fill mode'),\n keys: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Keys to include'),\n excludedKeys: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Keys to exclude'),\n pathFilter: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Path filter'),\n gitOptions: z\n .object({\n gitDiff: z.boolean().optional(),\n gitDiffBase: z.string().optional(),\n gitDiffCurrent: z.string().optional(),\n uncommitted: z.boolean().optional(),\n unpushed: z.boolean().optional(),\n untracked: z.boolean().optional(),\n })\n .optional()\n .describe('Git options'),\n aiOptions: z\n .object({\n provider: z.string().optional(),\n temperature: z.number().optional(),\n model: z.string().optional(),\n apiKey: z.string().optional(),\n customPrompt: z.string().optional(),\n applicationContext: z.string().optional(),\n })\n .optional()\n .describe('AI options'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async (props) => {\n try {\n const { gitOptions, ...rest } = props;\n const fillOptions: any = { ...rest, gitOptions: undefined };\n\n if (gitOptions) {\n const { gitDiff, uncommitted, unpushed, untracked, ...restGit } =\n gitOptions;\n const mode = [];\n if (gitDiff) mode.push('gitDiff');\n if (uncommitted) mode.push('uncommitted');\n if (unpushed) mode.push('unpushed');\n if (untracked) mode.push('untracked');\n\n fillOptions.gitOptions = { ...restGit, mode };\n }\n\n await fill(fillOptions);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Fill successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Fill failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-push',\n {\n title: 'Push Dictionaries',\n description: 'Push local dictionaries to the server',\n inputSchema: {\n deleteLocaleDictionary: z\n .boolean()\n .optional()\n .describe('Delete local dictionary after push'),\n keepLocaleDictionary: z\n .boolean()\n .optional()\n .describe('Keep local dictionary after push'),\n dictionaries: z\n .array(z.string())\n .optional()\n .describe('List of dictionaries to push'),\n gitOptions: z\n .object({\n gitDiff: z.boolean().optional(),\n gitDiffBase: z.string().optional(),\n gitDiffCurrent: z.string().optional(),\n uncommitted: z.boolean().optional(),\n unpushed: z.boolean().optional(),\n untracked: z.boolean().optional(),\n })\n .optional()\n .describe('Git options'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async (props) => {\n try {\n const { gitOptions, ...rest } = props;\n const pushOptions: any = { ...rest, gitOptions: undefined };\n\n if (gitOptions) {\n const { gitDiff, uncommitted, unpushed, untracked, ...restGit } =\n gitOptions;\n const mode = [];\n if (gitDiff) mode.push('gitDiff');\n if (uncommitted) mode.push('uncommitted');\n if (unpushed) mode.push('unpushed');\n if (untracked) mode.push('untracked');\n\n pushOptions.gitOptions = { ...restGit, mode };\n }\n\n await push(pushOptions);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Push successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Push failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-pull',\n {\n title: 'Pull Dictionaries',\n description: 'Pull dictionaries from the CMS',\n inputSchema: {\n dictionaries: z\n .array(z.string())\n .optional()\n .describe('List of dictionaries to pull'),\n newDictionariesPath: z\n .string()\n .optional()\n .describe('Path to save new dictionaries'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async (props) => {\n try {\n await pull(props);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Pull successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Pull failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-content-list',\n {\n title: 'List Content Declarations',\n description:\n 'List the content declaration (.content.{ts,tsx,js,json,...}) files present in the project. That files contain the multilingual content of the application and are used to build the dictionaries.',\n inputSchema: {\n configOptions: z\n .object({\n baseDir: z.string().optional(),\n env: z.string().optional(),\n envFile: z.string().optional(),\n override: z\n .object({\n log: z\n .object({\n prefix: z.string().optional(),\n verbose: z.boolean().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional()\n .describe('Configuration options'),\n absolute: z\n .boolean()\n .optional()\n .describe(\n 'Output the results as absolute paths instead of relative paths'\n ),\n json: z\n .boolean()\n .optional()\n .describe('Output the results as JSON instead of formatted text'),\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async (props) => {\n try {\n const rows = listContentDeclarationRows(props);\n return {\n content: [\n {\n type: 'text',\n text: props.json\n ? JSON.stringify(rows)\n : JSON.stringify(rows, null, 2),\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Content list failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-content-test',\n {\n title: 'Test Translations',\n description:\n 'Test if there are missing translations in the content declaration files. That files contain the multilingual content of the application and are used to build the dictionaries.',\n inputSchema: {\n configOptions: z\n .object({\n baseDir: z.string().optional(),\n env: z.string().optional(),\n envFile: z.string().optional(),\n override: z\n .object({\n log: z\n .object({\n prefix: z.string().optional(),\n verbose: z.boolean().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional()\n .describe('Configuration options'),\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async (props) => {\n try {\n const missingTranslations = listMissingTranslations(\n props?.configOptions\n );\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(missingTranslations, null, 2),\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Content test failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-extract',\n {\n title: 'Extract strings from Component',\n description:\n 'Extract strings from an existing component to be placed in a .content file close to the component. Trigger this action to make an existing component multilingual. If the component does not exist, create a normal component including text in JSX, and then trigger this tool to extract it.',\n inputSchema: {\n file: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('List of files to extract'),\n outputContentDeclarations: z\n .string()\n .optional()\n .describe('Path to output content declaration files'),\n configOptions: z\n .object({\n baseDir: z.string().optional(),\n env: z.string().optional(),\n envFile: z.string().optional(),\n override: z\n .object({\n log: z\n .object({\n prefix: z.string().optional(),\n verbose: z.boolean().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional()\n .describe('Configuration options'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async (props) => {\n try {\n await extract({\n files: Array.isArray(props.file)\n ? props.file\n : props.file\n ? [props.file]\n : undefined,\n outputContentDeclarations: props.outputContentDeclarations,\n configOptions: props.configOptions,\n });\n\n return {\n content: [\n {\n type: 'text',\n text: 'Extract successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Extract failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-projects-list',\n {\n title: 'List Projects',\n description:\n 'List all Intlayer projects in the directory. Search for configuration files to find all Intlayer projects.',\n inputSchema: {\n baseDir: z\n .string()\n .optional()\n .describe('Base directory to search from'),\n gitRoot: z\n .boolean()\n .optional()\n .describe(\n 'Search from the git root directory instead of the base directory'\n ),\n absolute: z\n .boolean()\n .optional()\n .describe(\n 'Output the results as absolute paths instead of relative paths'\n ),\n json: z\n .boolean()\n .optional()\n .describe('Output the results as JSON instead of formatted text'),\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async (props) => {\n try {\n const { searchDir, projectsPath } = await listProjects({\n baseDir: props.baseDir,\n gitRoot: props.gitRoot,\n });\n\n // Handle absolute option similar to CLI command\n const projectsRelativePath = projectsPath\n .map((projectPath) =>\n props.absolute ? projectPath : relative(searchDir, projectPath)\n )\n .map((projectPath) => (projectPath === '' ? '.' : projectPath));\n\n const outputPaths = props.absolute\n ? projectsPath\n : projectsRelativePath;\n\n return {\n content: [\n {\n type: 'text',\n text: props.json\n ? JSON.stringify(outputPaths)\n : JSON.stringify(\n { searchDir, projectsPath: outputPaths },\n null,\n 2\n ),\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Projects list failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n};\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
|
|
3
|
-
let
|
|
3
|
+
let _intlayer_chokidar_cli = require("@intlayer/chokidar/cli");
|
|
4
4
|
let node_readline = require("node:readline");
|
|
5
5
|
node_readline = require_runtime.__toESM(node_readline);
|
|
6
6
|
let zod = require("zod");
|
|
@@ -14,19 +14,49 @@ const loadInstallSkillsTool = (server) => {
|
|
|
14
14
|
inputSchema: {
|
|
15
15
|
platform: zod.default.enum([
|
|
16
16
|
"Cursor",
|
|
17
|
-
"
|
|
17
|
+
"Windsurf",
|
|
18
|
+
"Trae",
|
|
18
19
|
"OpenCode",
|
|
20
|
+
"GitHub",
|
|
19
21
|
"Claude",
|
|
22
|
+
"VSCode",
|
|
23
|
+
"Antigravity",
|
|
24
|
+
"Augment",
|
|
25
|
+
"OpenClaw",
|
|
26
|
+
"Cline",
|
|
27
|
+
"CodeBuddy",
|
|
28
|
+
"CommandCode",
|
|
29
|
+
"Continue",
|
|
30
|
+
"Crush",
|
|
31
|
+
"Droid",
|
|
32
|
+
"Goose",
|
|
33
|
+
"Junie",
|
|
34
|
+
"IFlow",
|
|
35
|
+
"KiloCode",
|
|
36
|
+
"Kiro",
|
|
37
|
+
"Kode",
|
|
38
|
+
"MCPJam",
|
|
39
|
+
"MistralVibe",
|
|
40
|
+
"Mux",
|
|
41
|
+
"OpenHands",
|
|
42
|
+
"Pi",
|
|
43
|
+
"Qoder",
|
|
44
|
+
"Qwen",
|
|
45
|
+
"RooCode",
|
|
46
|
+
"TraeCN",
|
|
47
|
+
"Zencoder",
|
|
48
|
+
"Neovate",
|
|
49
|
+
"Pochi",
|
|
20
50
|
"Other"
|
|
21
51
|
]).describe("The platform to install skills for"),
|
|
22
|
-
skills: zod.default.array(zod.default.enum(
|
|
52
|
+
skills: zod.default.array(zod.default.enum(_intlayer_chokidar_cli.SKILLS)).describe("List of skills to install"),
|
|
23
53
|
projectRoot: zod.default.string().optional().describe("Root directory of the project. Defaults to current directory.")
|
|
24
54
|
}
|
|
25
55
|
}, async ({ platform, skills, projectRoot }) => {
|
|
26
56
|
try {
|
|
27
57
|
return { content: [{
|
|
28
58
|
type: "text",
|
|
29
|
-
text: await (0,
|
|
59
|
+
text: await (0, _intlayer_chokidar_cli.installSkills)(projectRoot || process.cwd(), platform, skills)
|
|
30
60
|
}] };
|
|
31
61
|
} catch (error) {
|
|
32
62
|
return {
|
|
@@ -48,16 +78,46 @@ const runInstallSkillsCLI = async () => {
|
|
|
48
78
|
try {
|
|
49
79
|
console.log("Install Intlayer Skills");
|
|
50
80
|
console.log("-----------------------");
|
|
51
|
-
const platformInput = await question("Which platform are you using? (Cursor,
|
|
81
|
+
const platformInput = await question("Which platform are you using? (Cursor, Windsurf, Trae, OpenCode, GitHub, Claude, VSCode, Cline, RooCode, etc. or \"Other\"): ");
|
|
52
82
|
const platform = [
|
|
53
83
|
"Cursor",
|
|
54
|
-
"
|
|
84
|
+
"Windsurf",
|
|
85
|
+
"Trae",
|
|
55
86
|
"OpenCode",
|
|
87
|
+
"GitHub",
|
|
56
88
|
"Claude",
|
|
89
|
+
"VSCode",
|
|
90
|
+
"Antigravity",
|
|
91
|
+
"Augment",
|
|
92
|
+
"OpenClaw",
|
|
93
|
+
"Cline",
|
|
94
|
+
"CodeBuddy",
|
|
95
|
+
"CommandCode",
|
|
96
|
+
"Continue",
|
|
97
|
+
"Crush",
|
|
98
|
+
"Droid",
|
|
99
|
+
"Goose",
|
|
100
|
+
"Junie",
|
|
101
|
+
"IFlow",
|
|
102
|
+
"KiloCode",
|
|
103
|
+
"Kiro",
|
|
104
|
+
"Kode",
|
|
105
|
+
"MCPJam",
|
|
106
|
+
"MistralVibe",
|
|
107
|
+
"Mux",
|
|
108
|
+
"OpenHands",
|
|
109
|
+
"Pi",
|
|
110
|
+
"Qoder",
|
|
111
|
+
"Qwen",
|
|
112
|
+
"RooCode",
|
|
113
|
+
"TraeCN",
|
|
114
|
+
"Zencoder",
|
|
115
|
+
"Neovate",
|
|
116
|
+
"Pochi",
|
|
57
117
|
"Other"
|
|
58
118
|
].find((p) => p.toLowerCase() === platformInput.trim().toLowerCase()) || "Other";
|
|
59
119
|
console.log(`Selected platform: ${platform}`);
|
|
60
|
-
const availableSkills =
|
|
120
|
+
const availableSkills = _intlayer_chokidar_cli.SKILLS;
|
|
61
121
|
console.log("\nAvailable skills:");
|
|
62
122
|
availableSkills.forEach((s, i) => {
|
|
63
123
|
console.log(`${i + 1}. ${s}`);
|
|
@@ -72,7 +132,7 @@ const runInstallSkillsCLI = async () => {
|
|
|
72
132
|
return;
|
|
73
133
|
}
|
|
74
134
|
console.log(`Installing skills: ${selectedSkills.join(", ")}...`);
|
|
75
|
-
const result = await (0,
|
|
135
|
+
const result = await (0, _intlayer_chokidar_cli.installSkills)(process.cwd(), platform, selectedSkills);
|
|
76
136
|
console.log(result);
|
|
77
137
|
} catch (error) {
|
|
78
138
|
console.error("Error:", error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installSkills.cjs","names":["z","SKILLS","readline"],"sources":["../../../src/tools/installSkills.ts"],"sourcesContent":["import * as readline from 'node:readline';\nimport { installSkills, SKILLS, type Skill } from '@intlayer/chokidar';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport z from 'zod';\n\nexport const loadInstallSkillsTool = (server: McpServer): void => {\n server.registerTool(\n 'intlayer-install-skills',\n {\n title: 'Install Intlayer Skills',\n description:\n 'Install Intlayer documentation and skills to the project to assist AI agents. Ask the user for the platform (Cursor, VSCode, OpenCode, Claude, etc.) and which skills they want to install before calling this tool.',\n inputSchema: {\n platform: z\n .enum(['Cursor'
|
|
1
|
+
{"version":3,"file":"installSkills.cjs","names":["z","SKILLS","readline"],"sources":["../../../src/tools/installSkills.ts"],"sourcesContent":["import * as readline from 'node:readline';\nimport { installSkills, SKILLS, type Skill } from '@intlayer/chokidar/cli';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport z from 'zod';\n\nexport const loadInstallSkillsTool = (server: McpServer): void => {\n server.registerTool(\n 'intlayer-install-skills',\n {\n title: 'Install Intlayer Skills',\n description:\n 'Install Intlayer documentation and skills to the project to assist AI agents. Ask the user for the platform (Cursor, VSCode, OpenCode, Claude, etc.) and which skills they want to install before calling this tool.',\n inputSchema: {\n platform: z\n .enum([\n 'Cursor',\n 'Windsurf',\n 'Trae',\n 'OpenCode',\n 'GitHub',\n 'Claude',\n 'VSCode',\n 'Antigravity',\n 'Augment',\n 'OpenClaw',\n 'Cline',\n 'CodeBuddy',\n 'CommandCode',\n 'Continue',\n 'Crush',\n 'Droid',\n 'Goose',\n 'Junie',\n 'IFlow',\n 'KiloCode',\n 'Kiro',\n 'Kode',\n 'MCPJam',\n 'MistralVibe',\n 'Mux',\n 'OpenHands',\n 'Pi',\n 'Qoder',\n 'Qwen',\n 'RooCode',\n 'TraeCN',\n 'Zencoder',\n 'Neovate',\n 'Pochi',\n 'Other',\n ])\n .describe('The platform to install skills for'),\n skills: z.array(z.enum(SKILLS)).describe('List of skills to install'),\n projectRoot: z\n .string()\n .optional()\n .describe(\n 'Root directory of the project. Defaults to current directory.'\n ),\n },\n },\n async ({ platform, skills, projectRoot }) => {\n try {\n const root = projectRoot || process.cwd();\n const message = await installSkills(\n root,\n platform as any,\n skills as any\n );\n\n return {\n content: [\n {\n type: 'text',\n text: message,\n },\n ],\n };\n } catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: `Failed to install skills: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n};\n\nexport const runInstallSkillsCLI = async (): Promise<void> => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const question = (query: string): Promise<string> =>\n new Promise((resolve) => rl.question(query, resolve));\n\n try {\n console.log('Install Intlayer Skills');\n console.log('-----------------------');\n\n const platformInput = await question(\n 'Which platform are you using? (Cursor, Windsurf, Trae, OpenCode, GitHub, Claude, VSCode, Cline, RooCode, etc. or \"Other\"): '\n );\n const platform = ([\n 'Cursor',\n 'Windsurf',\n 'Trae',\n 'OpenCode',\n 'GitHub',\n 'Claude',\n 'VSCode',\n 'Antigravity',\n 'Augment',\n 'OpenClaw',\n 'Cline',\n 'CodeBuddy',\n 'CommandCode',\n 'Continue',\n 'Crush',\n 'Droid',\n 'Goose',\n 'Junie',\n 'IFlow',\n 'KiloCode',\n 'Kiro',\n 'Kode',\n 'MCPJam',\n 'MistralVibe',\n 'Mux',\n 'OpenHands',\n 'Pi',\n 'Qoder',\n 'Qwen',\n 'RooCode',\n 'TraeCN',\n 'Zencoder',\n 'Neovate',\n 'Pochi',\n 'Other',\n ].find((p) => p.toLowerCase() === platformInput.trim().toLowerCase()) ||\n 'Other') as\n | 'Cursor'\n | 'Windsurf'\n | 'Trae'\n | 'OpenCode'\n | 'GitHub'\n | 'Claude'\n | 'VSCode'\n | 'Antigravity'\n | 'Augment'\n | 'OpenClaw'\n | 'Cline'\n | 'CodeBuddy'\n | 'CommandCode'\n | 'Continue'\n | 'Crush'\n | 'Droid'\n | 'Goose'\n | 'Junie'\n | 'IFlow'\n | 'KiloCode'\n | 'Kiro'\n | 'Kode'\n | 'MCPJam'\n | 'MistralVibe'\n | 'Mux'\n | 'OpenHands'\n | 'Pi'\n | 'Qoder'\n | 'Qwen'\n | 'RooCode'\n | 'TraeCN'\n | 'Zencoder'\n | 'Neovate'\n | 'Pochi'\n | 'Other';\n\n console.log(`Selected platform: ${platform}`);\n\n const availableSkills = SKILLS;\n console.log('\\nAvailable skills:');\n availableSkills.forEach((s, i) => {\n console.log(`${i + 1}. ${s}`);\n });\n\n const skillsInput = await question(\n '\\nWhich skills do you want to install? (comma separated numbers, e.g. 1,2,3 or \"all\"): '\n );\n\n let selectedSkills: Skill[] = [];\n if (skillsInput.trim().toLowerCase() === 'all') {\n selectedSkills = [...availableSkills];\n } else {\n const indices = skillsInput\n .split(',')\n .map((s) => parseInt(s.trim()) - 1)\n .filter((i) => !isNaN(i) && i >= 0 && i < availableSkills.length);\n selectedSkills = indices.map((i) => availableSkills[i] as any);\n }\n\n if (selectedSkills.length === 0) {\n console.log('No valid skills selected. Exiting.');\n rl.close();\n return;\n }\n\n console.log(`Installing skills: ${selectedSkills.join(', ')}...`);\n const result = await installSkills(process.cwd(), platform, selectedSkills);\n console.log(result);\n } catch (error) {\n console.error('Error:', error);\n } finally {\n rl.close();\n }\n};\n"],"mappings":";;;;;;;;;AAKA,MAAa,yBAAyB,WAA4B;AAChE,QAAO,aACL,2BACA;EACE,OAAO;EACP,aACE;EACF,aAAa;GACX,UAAUA,YACP,KAAK;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD,CAAC,CACD,SAAS,qCAAqC;GACjD,QAAQA,YAAE,MAAMA,YAAE,KAAKC,8BAAO,CAAC,CAAC,SAAS,4BAA4B;GACrE,aAAaD,YACV,QAAQ,CACR,UAAU,CACV,SACC,gEACD;GACJ;EACF,EACD,OAAO,EAAE,UAAU,QAAQ,kBAAkB;AAC3C,MAAI;AAQF,UAAO,EACL,SAAS,CACP;IACE,MAAM;IACN,MAVU,gDADH,eAAe,QAAQ,KAAK,EAGvC,UACA,OACD;IAOI,CACF,EACF;WACM,OAAO;AACd,UAAO;IACL,SAAS,CACP;KACE,MAAM;KACN,MAAM,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;KAC1F,CACF;IACD,SAAS;IACV;;GAGN;;AAGH,MAAa,sBAAsB,YAA2B;CAC5D,MAAM,KAAKE,cAAS,gBAAgB;EAClC,OAAO,QAAQ;EACf,QAAQ,QAAQ;EACjB,CAAC;CAEF,MAAM,YAAY,UAChB,IAAI,SAAS,YAAY,GAAG,SAAS,OAAO,QAAQ,CAAC;AAEvD,KAAI;AACF,UAAQ,IAAI,0BAA0B;AACtC,UAAQ,IAAI,0BAA0B;EAEtC,MAAM,gBAAgB,MAAM,SAC1B,gIACD;EACD,MAAM,WAAY;GAChB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC,MAAM,MAAM,EAAE,aAAa,KAAK,cAAc,MAAM,CAAC,aAAa,CAAC,IACnE;AAqCF,UAAQ,IAAI,sBAAsB,WAAW;EAE7C,MAAM,kBAAkBD;AACxB,UAAQ,IAAI,sBAAsB;AAClC,kBAAgB,SAAS,GAAG,MAAM;AAChC,WAAQ,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI;IAC7B;EAEF,MAAM,cAAc,MAAM,SACxB,4FACD;EAED,IAAI,iBAA0B,EAAE;AAChC,MAAI,YAAY,MAAM,CAAC,aAAa,KAAK,MACvC,kBAAiB,CAAC,GAAG,gBAAgB;MAMrC,kBAJgB,YACb,MAAM,IAAI,CACV,KAAK,MAAM,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,CAClC,QAAQ,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,KAAK,IAAI,gBAAgB,OAAO,CAC1C,KAAK,MAAM,gBAAgB,GAAU;AAGhE,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAQ,IAAI,qCAAqC;AACjD,MAAG,OAAO;AACV;;AAGF,UAAQ,IAAI,sBAAsB,eAAe,KAAK,KAAK,CAAC,KAAK;EACjE,MAAM,SAAS,gDAAoB,QAAQ,KAAK,EAAE,UAAU,eAAe;AAC3E,UAAQ,IAAI,OAAO;UACZ,OAAO;AACd,UAAQ,MAAM,UAAU,MAAM;WACtB;AACR,KAAG,OAAO"}
|
package/dist/esm/tools/cli.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { relative } from "node:path";
|
|
2
|
-
import { listProjects } from "@intlayer/chokidar";
|
|
2
|
+
import { listProjects } from "@intlayer/chokidar/cli";
|
|
3
3
|
import { build, extract, fill, init, listContentDeclarationRows, listMissingTranslations, pull, push } from "@intlayer/cli";
|
|
4
4
|
import { Locales } from "@intlayer/types";
|
|
5
5
|
import z from "zod/v3";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.mjs","names":[],"sources":["../../../src/tools/cli.ts"],"sourcesContent":["import { relative } from 'node:path';\nimport { listProjects } from '@intlayer/chokidar';\nimport {\n build,\n extract,\n fill,\n init,\n listContentDeclarationRows,\n listMissingTranslations,\n pull,\n push,\n} from '@intlayer/cli';\nimport { Locales, type LogConfig } from '@intlayer/types';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport z from 'zod/v3';\n\ntype LoadCLITools = (server: McpServer) => Promise<void>;\n\nexport const loadCLITools: LoadCLITools = async (server) => {\n server.registerTool(\n 'intlayer-init',\n {\n title: 'Initialize Intlayer',\n description: 'Initialize Intlayer in the project',\n inputSchema: {\n projectRoot: z.string().describe('Project root directory'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async ({ projectRoot }) => {\n try {\n await init(projectRoot);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Initialization successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Initialization failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-build',\n {\n title: 'Build Dictionaries',\n description:\n 'Build the dictionaries. List all content declarations files `.content.{ts,tsx,js,json,...}` to update the content callable using the `useIntlayer` hook.',\n inputSchema: {\n watch: z.boolean().optional().describe('Watch for changes'),\n baseDir: z.string().optional().describe('Base directory'),\n env: z.string().optional().describe('Environment'),\n envFile: z.string().optional().describe('Environment file'),\n verbose: z.boolean().optional().describe('Verbose output'),\n prefix: z.string().optional().describe('Log prefix'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async ({ watch, baseDir, env, envFile, verbose, prefix }) => {\n try {\n const log: Partial<LogConfig> = {};\n if (verbose) {\n log.mode = 'verbose';\n }\n if (prefix) {\n log.prefix = prefix;\n }\n\n await build({\n watch,\n configOptions: {\n baseDir,\n env,\n envFile,\n override: {\n log,\n },\n },\n });\n\n return {\n content: [\n {\n type: 'text',\n text: 'Build successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Build failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-fill',\n {\n title: 'Fill Translations',\n description:\n 'Fill the dictionaries with missing translations / review translations using Intlayer servers',\n inputSchema: {\n sourceLocale: z\n .nativeEnum(Locales.ALL_LOCALES)\n .optional()\n .describe('Source locale'),\n outputLocales: z\n .union([\n z.nativeEnum(Locales.ALL_LOCALES),\n z.array(z.nativeEnum(Locales.ALL_LOCALES)),\n ])\n .optional()\n .describe('Output locales'),\n file: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('File path'),\n mode: z.enum(['complete', 'review']).optional().describe('Fill mode'),\n keys: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Keys to include'),\n excludedKeys: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Keys to exclude'),\n pathFilter: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Path filter'),\n gitOptions: z\n .object({\n gitDiff: z.boolean().optional(),\n gitDiffBase: z.string().optional(),\n gitDiffCurrent: z.string().optional(),\n uncommitted: z.boolean().optional(),\n unpushed: z.boolean().optional(),\n untracked: z.boolean().optional(),\n })\n .optional()\n .describe('Git options'),\n aiOptions: z\n .object({\n provider: z.string().optional(),\n temperature: z.number().optional(),\n model: z.string().optional(),\n apiKey: z.string().optional(),\n customPrompt: z.string().optional(),\n applicationContext: z.string().optional(),\n })\n .optional()\n .describe('AI options'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async (props) => {\n try {\n const { gitOptions, ...rest } = props;\n const fillOptions: any = { ...rest, gitOptions: undefined };\n\n if (gitOptions) {\n const { gitDiff, uncommitted, unpushed, untracked, ...restGit } =\n gitOptions;\n const mode = [];\n if (gitDiff) mode.push('gitDiff');\n if (uncommitted) mode.push('uncommitted');\n if (unpushed) mode.push('unpushed');\n if (untracked) mode.push('untracked');\n\n fillOptions.gitOptions = { ...restGit, mode };\n }\n\n await fill(fillOptions);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Fill successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Fill failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-push',\n {\n title: 'Push Dictionaries',\n description: 'Push local dictionaries to the server',\n inputSchema: {\n deleteLocaleDictionary: z\n .boolean()\n .optional()\n .describe('Delete local dictionary after push'),\n keepLocaleDictionary: z\n .boolean()\n .optional()\n .describe('Keep local dictionary after push'),\n dictionaries: z\n .array(z.string())\n .optional()\n .describe('List of dictionaries to push'),\n gitOptions: z\n .object({\n gitDiff: z.boolean().optional(),\n gitDiffBase: z.string().optional(),\n gitDiffCurrent: z.string().optional(),\n uncommitted: z.boolean().optional(),\n unpushed: z.boolean().optional(),\n untracked: z.boolean().optional(),\n })\n .optional()\n .describe('Git options'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async (props) => {\n try {\n const { gitOptions, ...rest } = props;\n const pushOptions: any = { ...rest, gitOptions: undefined };\n\n if (gitOptions) {\n const { gitDiff, uncommitted, unpushed, untracked, ...restGit } =\n gitOptions;\n const mode = [];\n if (gitDiff) mode.push('gitDiff');\n if (uncommitted) mode.push('uncommitted');\n if (unpushed) mode.push('unpushed');\n if (untracked) mode.push('untracked');\n\n pushOptions.gitOptions = { ...restGit, mode };\n }\n\n await push(pushOptions);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Push successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Push failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-pull',\n {\n title: 'Pull Dictionaries',\n description: 'Pull dictionaries from the CMS',\n inputSchema: {\n dictionaries: z\n .array(z.string())\n .optional()\n .describe('List of dictionaries to pull'),\n newDictionariesPath: z\n .string()\n .optional()\n .describe('Path to save new dictionaries'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async (props) => {\n try {\n await pull(props);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Pull successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Pull failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-content-list',\n {\n title: 'List Content Declarations',\n description:\n 'List the content declaration (.content.{ts,tsx,js,json,...}) files present in the project. That files contain the multilingual content of the application and are used to build the dictionaries.',\n inputSchema: {\n configOptions: z\n .object({\n baseDir: z.string().optional(),\n env: z.string().optional(),\n envFile: z.string().optional(),\n override: z\n .object({\n log: z\n .object({\n prefix: z.string().optional(),\n verbose: z.boolean().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional()\n .describe('Configuration options'),\n absolute: z\n .boolean()\n .optional()\n .describe(\n 'Output the results as absolute paths instead of relative paths'\n ),\n json: z\n .boolean()\n .optional()\n .describe('Output the results as JSON instead of formatted text'),\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async (props) => {\n try {\n const rows = listContentDeclarationRows(props);\n return {\n content: [\n {\n type: 'text',\n text: props.json\n ? JSON.stringify(rows)\n : JSON.stringify(rows, null, 2),\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Content list failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-content-test',\n {\n title: 'Test Translations',\n description:\n 'Test if there are missing translations in the content declaration files. That files contain the multilingual content of the application and are used to build the dictionaries.',\n inputSchema: {\n configOptions: z\n .object({\n baseDir: z.string().optional(),\n env: z.string().optional(),\n envFile: z.string().optional(),\n override: z\n .object({\n log: z\n .object({\n prefix: z.string().optional(),\n verbose: z.boolean().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional()\n .describe('Configuration options'),\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async (props) => {\n try {\n const missingTranslations = listMissingTranslations(\n props?.configOptions\n );\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(missingTranslations, null, 2),\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Content test failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-extract',\n {\n title: 'Extract strings from Component',\n description:\n 'Extract strings from an existing component to be placed in a .content file close to the component. Trigger this action to make an existing component multilingual. If the component does not exist, create a normal component including text in JSX, and then trigger this tool to extract it.',\n inputSchema: {\n file: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('List of files to extract'),\n outputContentDeclarations: z\n .string()\n .optional()\n .describe('Path to output content declaration files'),\n configOptions: z\n .object({\n baseDir: z.string().optional(),\n env: z.string().optional(),\n envFile: z.string().optional(),\n override: z\n .object({\n log: z\n .object({\n prefix: z.string().optional(),\n verbose: z.boolean().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional()\n .describe('Configuration options'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async (props) => {\n try {\n await extract({\n files: Array.isArray(props.file)\n ? props.file\n : props.file\n ? [props.file]\n : undefined,\n outputContentDeclarations: props.outputContentDeclarations,\n configOptions: props.configOptions,\n });\n\n return {\n content: [\n {\n type: 'text',\n text: 'Extract successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Extract failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-projects-list',\n {\n title: 'List Projects',\n description:\n 'List all Intlayer projects in the directory. Search for configuration files to find all Intlayer projects.',\n inputSchema: {\n baseDir: z\n .string()\n .optional()\n .describe('Base directory to search from'),\n gitRoot: z\n .boolean()\n .optional()\n .describe(\n 'Search from the git root directory instead of the base directory'\n ),\n absolute: z\n .boolean()\n .optional()\n .describe(\n 'Output the results as absolute paths instead of relative paths'\n ),\n json: z\n .boolean()\n .optional()\n .describe('Output the results as JSON instead of formatted text'),\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async (props) => {\n try {\n const { searchDir, projectsPath } = await listProjects({\n baseDir: props.baseDir,\n gitRoot: props.gitRoot,\n });\n\n // Handle absolute option similar to CLI command\n const projectsRelativePath = projectsPath\n .map((projectPath) =>\n props.absolute ? projectPath : relative(searchDir, projectPath)\n )\n .map((projectPath) => (projectPath === '' ? '.' : projectPath));\n\n const outputPaths = props.absolute\n ? projectsPath\n : projectsRelativePath;\n\n return {\n content: [\n {\n type: 'text',\n text: props.json\n ? JSON.stringify(outputPaths)\n : JSON.stringify(\n { searchDir, projectsPath: outputPaths },\n null,\n 2\n ),\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Projects list failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.mjs","names":[],"sources":["../../../src/tools/cli.ts"],"sourcesContent":["import { relative } from 'node:path';\nimport { listProjects } from '@intlayer/chokidar/cli';\nimport {\n build,\n extract,\n fill,\n init,\n listContentDeclarationRows,\n listMissingTranslations,\n pull,\n push,\n} from '@intlayer/cli';\nimport { Locales, type LogConfig } from '@intlayer/types';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport z from 'zod/v3';\n\ntype LoadCLITools = (server: McpServer) => Promise<void>;\n\nexport const loadCLITools: LoadCLITools = async (server) => {\n server.registerTool(\n 'intlayer-init',\n {\n title: 'Initialize Intlayer',\n description: 'Initialize Intlayer in the project',\n inputSchema: {\n projectRoot: z.string().describe('Project root directory'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async ({ projectRoot }) => {\n try {\n await init(projectRoot);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Initialization successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Initialization failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-build',\n {\n title: 'Build Dictionaries',\n description:\n 'Build the dictionaries. List all content declarations files `.content.{ts,tsx,js,json,...}` to update the content callable using the `useIntlayer` hook.',\n inputSchema: {\n watch: z.boolean().optional().describe('Watch for changes'),\n baseDir: z.string().optional().describe('Base directory'),\n env: z.string().optional().describe('Environment'),\n envFile: z.string().optional().describe('Environment file'),\n verbose: z.boolean().optional().describe('Verbose output'),\n prefix: z.string().optional().describe('Log prefix'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async ({ watch, baseDir, env, envFile, verbose, prefix }) => {\n try {\n const log: Partial<LogConfig> = {};\n if (verbose) {\n log.mode = 'verbose';\n }\n if (prefix) {\n log.prefix = prefix;\n }\n\n await build({\n watch,\n configOptions: {\n baseDir,\n env,\n envFile,\n override: {\n log,\n },\n },\n });\n\n return {\n content: [\n {\n type: 'text',\n text: 'Build successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Build failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-fill',\n {\n title: 'Fill Translations',\n description:\n 'Fill the dictionaries with missing translations / review translations using Intlayer servers',\n inputSchema: {\n sourceLocale: z\n .nativeEnum(Locales.ALL_LOCALES)\n .optional()\n .describe('Source locale'),\n outputLocales: z\n .union([\n z.nativeEnum(Locales.ALL_LOCALES),\n z.array(z.nativeEnum(Locales.ALL_LOCALES)),\n ])\n .optional()\n .describe('Output locales'),\n file: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('File path'),\n mode: z.enum(['complete', 'review']).optional().describe('Fill mode'),\n keys: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Keys to include'),\n excludedKeys: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Keys to exclude'),\n pathFilter: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Path filter'),\n gitOptions: z\n .object({\n gitDiff: z.boolean().optional(),\n gitDiffBase: z.string().optional(),\n gitDiffCurrent: z.string().optional(),\n uncommitted: z.boolean().optional(),\n unpushed: z.boolean().optional(),\n untracked: z.boolean().optional(),\n })\n .optional()\n .describe('Git options'),\n aiOptions: z\n .object({\n provider: z.string().optional(),\n temperature: z.number().optional(),\n model: z.string().optional(),\n apiKey: z.string().optional(),\n customPrompt: z.string().optional(),\n applicationContext: z.string().optional(),\n })\n .optional()\n .describe('AI options'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async (props) => {\n try {\n const { gitOptions, ...rest } = props;\n const fillOptions: any = { ...rest, gitOptions: undefined };\n\n if (gitOptions) {\n const { gitDiff, uncommitted, unpushed, untracked, ...restGit } =\n gitOptions;\n const mode = [];\n if (gitDiff) mode.push('gitDiff');\n if (uncommitted) mode.push('uncommitted');\n if (unpushed) mode.push('unpushed');\n if (untracked) mode.push('untracked');\n\n fillOptions.gitOptions = { ...restGit, mode };\n }\n\n await fill(fillOptions);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Fill successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Fill failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-push',\n {\n title: 'Push Dictionaries',\n description: 'Push local dictionaries to the server',\n inputSchema: {\n deleteLocaleDictionary: z\n .boolean()\n .optional()\n .describe('Delete local dictionary after push'),\n keepLocaleDictionary: z\n .boolean()\n .optional()\n .describe('Keep local dictionary after push'),\n dictionaries: z\n .array(z.string())\n .optional()\n .describe('List of dictionaries to push'),\n gitOptions: z\n .object({\n gitDiff: z.boolean().optional(),\n gitDiffBase: z.string().optional(),\n gitDiffCurrent: z.string().optional(),\n uncommitted: z.boolean().optional(),\n unpushed: z.boolean().optional(),\n untracked: z.boolean().optional(),\n })\n .optional()\n .describe('Git options'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async (props) => {\n try {\n const { gitOptions, ...rest } = props;\n const pushOptions: any = { ...rest, gitOptions: undefined };\n\n if (gitOptions) {\n const { gitDiff, uncommitted, unpushed, untracked, ...restGit } =\n gitOptions;\n const mode = [];\n if (gitDiff) mode.push('gitDiff');\n if (uncommitted) mode.push('uncommitted');\n if (unpushed) mode.push('unpushed');\n if (untracked) mode.push('untracked');\n\n pushOptions.gitOptions = { ...restGit, mode };\n }\n\n await push(pushOptions);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Push successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Push failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-pull',\n {\n title: 'Pull Dictionaries',\n description: 'Pull dictionaries from the CMS',\n inputSchema: {\n dictionaries: z\n .array(z.string())\n .optional()\n .describe('List of dictionaries to pull'),\n newDictionariesPath: z\n .string()\n .optional()\n .describe('Path to save new dictionaries'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async (props) => {\n try {\n await pull(props);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Pull successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Pull failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-content-list',\n {\n title: 'List Content Declarations',\n description:\n 'List the content declaration (.content.{ts,tsx,js,json,...}) files present in the project. That files contain the multilingual content of the application and are used to build the dictionaries.',\n inputSchema: {\n configOptions: z\n .object({\n baseDir: z.string().optional(),\n env: z.string().optional(),\n envFile: z.string().optional(),\n override: z\n .object({\n log: z\n .object({\n prefix: z.string().optional(),\n verbose: z.boolean().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional()\n .describe('Configuration options'),\n absolute: z\n .boolean()\n .optional()\n .describe(\n 'Output the results as absolute paths instead of relative paths'\n ),\n json: z\n .boolean()\n .optional()\n .describe('Output the results as JSON instead of formatted text'),\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async (props) => {\n try {\n const rows = listContentDeclarationRows(props);\n return {\n content: [\n {\n type: 'text',\n text: props.json\n ? JSON.stringify(rows)\n : JSON.stringify(rows, null, 2),\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Content list failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-content-test',\n {\n title: 'Test Translations',\n description:\n 'Test if there are missing translations in the content declaration files. That files contain the multilingual content of the application and are used to build the dictionaries.',\n inputSchema: {\n configOptions: z\n .object({\n baseDir: z.string().optional(),\n env: z.string().optional(),\n envFile: z.string().optional(),\n override: z\n .object({\n log: z\n .object({\n prefix: z.string().optional(),\n verbose: z.boolean().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional()\n .describe('Configuration options'),\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async (props) => {\n try {\n const missingTranslations = listMissingTranslations(\n props?.configOptions\n );\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(missingTranslations, null, 2),\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Content test failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-extract',\n {\n title: 'Extract strings from Component',\n description:\n 'Extract strings from an existing component to be placed in a .content file close to the component. Trigger this action to make an existing component multilingual. If the component does not exist, create a normal component including text in JSX, and then trigger this tool to extract it.',\n inputSchema: {\n file: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('List of files to extract'),\n outputContentDeclarations: z\n .string()\n .optional()\n .describe('Path to output content declaration files'),\n configOptions: z\n .object({\n baseDir: z.string().optional(),\n env: z.string().optional(),\n envFile: z.string().optional(),\n override: z\n .object({\n log: z\n .object({\n prefix: z.string().optional(),\n verbose: z.boolean().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional()\n .describe('Configuration options'),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async (props) => {\n try {\n await extract({\n files: Array.isArray(props.file)\n ? props.file\n : props.file\n ? [props.file]\n : undefined,\n outputContentDeclarations: props.outputContentDeclarations,\n configOptions: props.configOptions,\n });\n\n return {\n content: [\n {\n type: 'text',\n text: 'Extract successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Extract failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.registerTool(\n 'intlayer-projects-list',\n {\n title: 'List Projects',\n description:\n 'List all Intlayer projects in the directory. Search for configuration files to find all Intlayer projects.',\n inputSchema: {\n baseDir: z\n .string()\n .optional()\n .describe('Base directory to search from'),\n gitRoot: z\n .boolean()\n .optional()\n .describe(\n 'Search from the git root directory instead of the base directory'\n ),\n absolute: z\n .boolean()\n .optional()\n .describe(\n 'Output the results as absolute paths instead of relative paths'\n ),\n json: z\n .boolean()\n .optional()\n .describe('Output the results as JSON instead of formatted text'),\n },\n annotations: {\n readOnlyHint: true,\n },\n },\n async (props) => {\n try {\n const { searchDir, projectsPath } = await listProjects({\n baseDir: props.baseDir,\n gitRoot: props.gitRoot,\n });\n\n // Handle absolute option similar to CLI command\n const projectsRelativePath = projectsPath\n .map((projectPath) =>\n props.absolute ? projectPath : relative(searchDir, projectPath)\n )\n .map((projectPath) => (projectPath === '' ? '.' : projectPath));\n\n const outputPaths = props.absolute\n ? projectsPath\n : projectsRelativePath;\n\n return {\n content: [\n {\n type: 'text',\n text: props.json\n ? JSON.stringify(outputPaths)\n : JSON.stringify(\n { searchDir, projectsPath: outputPaths },\n null,\n 2\n ),\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Projects list failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n};\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SKILLS, installSkills } from "@intlayer/chokidar";
|
|
1
|
+
import { SKILLS, installSkills } from "@intlayer/chokidar/cli";
|
|
2
2
|
import * as readline from "node:readline";
|
|
3
3
|
import z from "zod";
|
|
4
4
|
|
|
@@ -10,9 +10,39 @@ const loadInstallSkillsTool = (server) => {
|
|
|
10
10
|
inputSchema: {
|
|
11
11
|
platform: z.enum([
|
|
12
12
|
"Cursor",
|
|
13
|
-
"
|
|
13
|
+
"Windsurf",
|
|
14
|
+
"Trae",
|
|
14
15
|
"OpenCode",
|
|
16
|
+
"GitHub",
|
|
15
17
|
"Claude",
|
|
18
|
+
"VSCode",
|
|
19
|
+
"Antigravity",
|
|
20
|
+
"Augment",
|
|
21
|
+
"OpenClaw",
|
|
22
|
+
"Cline",
|
|
23
|
+
"CodeBuddy",
|
|
24
|
+
"CommandCode",
|
|
25
|
+
"Continue",
|
|
26
|
+
"Crush",
|
|
27
|
+
"Droid",
|
|
28
|
+
"Goose",
|
|
29
|
+
"Junie",
|
|
30
|
+
"IFlow",
|
|
31
|
+
"KiloCode",
|
|
32
|
+
"Kiro",
|
|
33
|
+
"Kode",
|
|
34
|
+
"MCPJam",
|
|
35
|
+
"MistralVibe",
|
|
36
|
+
"Mux",
|
|
37
|
+
"OpenHands",
|
|
38
|
+
"Pi",
|
|
39
|
+
"Qoder",
|
|
40
|
+
"Qwen",
|
|
41
|
+
"RooCode",
|
|
42
|
+
"TraeCN",
|
|
43
|
+
"Zencoder",
|
|
44
|
+
"Neovate",
|
|
45
|
+
"Pochi",
|
|
16
46
|
"Other"
|
|
17
47
|
]).describe("The platform to install skills for"),
|
|
18
48
|
skills: z.array(z.enum(SKILLS)).describe("List of skills to install"),
|
|
@@ -44,12 +74,42 @@ const runInstallSkillsCLI = async () => {
|
|
|
44
74
|
try {
|
|
45
75
|
console.log("Install Intlayer Skills");
|
|
46
76
|
console.log("-----------------------");
|
|
47
|
-
const platformInput = await question("Which platform are you using? (Cursor,
|
|
77
|
+
const platformInput = await question("Which platform are you using? (Cursor, Windsurf, Trae, OpenCode, GitHub, Claude, VSCode, Cline, RooCode, etc. or \"Other\"): ");
|
|
48
78
|
const platform = [
|
|
49
79
|
"Cursor",
|
|
50
|
-
"
|
|
80
|
+
"Windsurf",
|
|
81
|
+
"Trae",
|
|
51
82
|
"OpenCode",
|
|
83
|
+
"GitHub",
|
|
52
84
|
"Claude",
|
|
85
|
+
"VSCode",
|
|
86
|
+
"Antigravity",
|
|
87
|
+
"Augment",
|
|
88
|
+
"OpenClaw",
|
|
89
|
+
"Cline",
|
|
90
|
+
"CodeBuddy",
|
|
91
|
+
"CommandCode",
|
|
92
|
+
"Continue",
|
|
93
|
+
"Crush",
|
|
94
|
+
"Droid",
|
|
95
|
+
"Goose",
|
|
96
|
+
"Junie",
|
|
97
|
+
"IFlow",
|
|
98
|
+
"KiloCode",
|
|
99
|
+
"Kiro",
|
|
100
|
+
"Kode",
|
|
101
|
+
"MCPJam",
|
|
102
|
+
"MistralVibe",
|
|
103
|
+
"Mux",
|
|
104
|
+
"OpenHands",
|
|
105
|
+
"Pi",
|
|
106
|
+
"Qoder",
|
|
107
|
+
"Qwen",
|
|
108
|
+
"RooCode",
|
|
109
|
+
"TraeCN",
|
|
110
|
+
"Zencoder",
|
|
111
|
+
"Neovate",
|
|
112
|
+
"Pochi",
|
|
53
113
|
"Other"
|
|
54
114
|
].find((p) => p.toLowerCase() === platformInput.trim().toLowerCase()) || "Other";
|
|
55
115
|
console.log(`Selected platform: ${platform}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installSkills.mjs","names":[],"sources":["../../../src/tools/installSkills.ts"],"sourcesContent":["import * as readline from 'node:readline';\nimport { installSkills, SKILLS, type Skill } from '@intlayer/chokidar';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport z from 'zod';\n\nexport const loadInstallSkillsTool = (server: McpServer): void => {\n server.registerTool(\n 'intlayer-install-skills',\n {\n title: 'Install Intlayer Skills',\n description:\n 'Install Intlayer documentation and skills to the project to assist AI agents. Ask the user for the platform (Cursor, VSCode, OpenCode, Claude, etc.) and which skills they want to install before calling this tool.',\n inputSchema: {\n platform: z\n .enum(['Cursor'
|
|
1
|
+
{"version":3,"file":"installSkills.mjs","names":[],"sources":["../../../src/tools/installSkills.ts"],"sourcesContent":["import * as readline from 'node:readline';\nimport { installSkills, SKILLS, type Skill } from '@intlayer/chokidar/cli';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport z from 'zod';\n\nexport const loadInstallSkillsTool = (server: McpServer): void => {\n server.registerTool(\n 'intlayer-install-skills',\n {\n title: 'Install Intlayer Skills',\n description:\n 'Install Intlayer documentation and skills to the project to assist AI agents. Ask the user for the platform (Cursor, VSCode, OpenCode, Claude, etc.) and which skills they want to install before calling this tool.',\n inputSchema: {\n platform: z\n .enum([\n 'Cursor',\n 'Windsurf',\n 'Trae',\n 'OpenCode',\n 'GitHub',\n 'Claude',\n 'VSCode',\n 'Antigravity',\n 'Augment',\n 'OpenClaw',\n 'Cline',\n 'CodeBuddy',\n 'CommandCode',\n 'Continue',\n 'Crush',\n 'Droid',\n 'Goose',\n 'Junie',\n 'IFlow',\n 'KiloCode',\n 'Kiro',\n 'Kode',\n 'MCPJam',\n 'MistralVibe',\n 'Mux',\n 'OpenHands',\n 'Pi',\n 'Qoder',\n 'Qwen',\n 'RooCode',\n 'TraeCN',\n 'Zencoder',\n 'Neovate',\n 'Pochi',\n 'Other',\n ])\n .describe('The platform to install skills for'),\n skills: z.array(z.enum(SKILLS)).describe('List of skills to install'),\n projectRoot: z\n .string()\n .optional()\n .describe(\n 'Root directory of the project. Defaults to current directory.'\n ),\n },\n },\n async ({ platform, skills, projectRoot }) => {\n try {\n const root = projectRoot || process.cwd();\n const message = await installSkills(\n root,\n platform as any,\n skills as any\n );\n\n return {\n content: [\n {\n type: 'text',\n text: message,\n },\n ],\n };\n } catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: `Failed to install skills: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n};\n\nexport const runInstallSkillsCLI = async (): Promise<void> => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const question = (query: string): Promise<string> =>\n new Promise((resolve) => rl.question(query, resolve));\n\n try {\n console.log('Install Intlayer Skills');\n console.log('-----------------------');\n\n const platformInput = await question(\n 'Which platform are you using? (Cursor, Windsurf, Trae, OpenCode, GitHub, Claude, VSCode, Cline, RooCode, etc. or \"Other\"): '\n );\n const platform = ([\n 'Cursor',\n 'Windsurf',\n 'Trae',\n 'OpenCode',\n 'GitHub',\n 'Claude',\n 'VSCode',\n 'Antigravity',\n 'Augment',\n 'OpenClaw',\n 'Cline',\n 'CodeBuddy',\n 'CommandCode',\n 'Continue',\n 'Crush',\n 'Droid',\n 'Goose',\n 'Junie',\n 'IFlow',\n 'KiloCode',\n 'Kiro',\n 'Kode',\n 'MCPJam',\n 'MistralVibe',\n 'Mux',\n 'OpenHands',\n 'Pi',\n 'Qoder',\n 'Qwen',\n 'RooCode',\n 'TraeCN',\n 'Zencoder',\n 'Neovate',\n 'Pochi',\n 'Other',\n ].find((p) => p.toLowerCase() === platformInput.trim().toLowerCase()) ||\n 'Other') as\n | 'Cursor'\n | 'Windsurf'\n | 'Trae'\n | 'OpenCode'\n | 'GitHub'\n | 'Claude'\n | 'VSCode'\n | 'Antigravity'\n | 'Augment'\n | 'OpenClaw'\n | 'Cline'\n | 'CodeBuddy'\n | 'CommandCode'\n | 'Continue'\n | 'Crush'\n | 'Droid'\n | 'Goose'\n | 'Junie'\n | 'IFlow'\n | 'KiloCode'\n | 'Kiro'\n | 'Kode'\n | 'MCPJam'\n | 'MistralVibe'\n | 'Mux'\n | 'OpenHands'\n | 'Pi'\n | 'Qoder'\n | 'Qwen'\n | 'RooCode'\n | 'TraeCN'\n | 'Zencoder'\n | 'Neovate'\n | 'Pochi'\n | 'Other';\n\n console.log(`Selected platform: ${platform}`);\n\n const availableSkills = SKILLS;\n console.log('\\nAvailable skills:');\n availableSkills.forEach((s, i) => {\n console.log(`${i + 1}. ${s}`);\n });\n\n const skillsInput = await question(\n '\\nWhich skills do you want to install? (comma separated numbers, e.g. 1,2,3 or \"all\"): '\n );\n\n let selectedSkills: Skill[] = [];\n if (skillsInput.trim().toLowerCase() === 'all') {\n selectedSkills = [...availableSkills];\n } else {\n const indices = skillsInput\n .split(',')\n .map((s) => parseInt(s.trim()) - 1)\n .filter((i) => !isNaN(i) && i >= 0 && i < availableSkills.length);\n selectedSkills = indices.map((i) => availableSkills[i] as any);\n }\n\n if (selectedSkills.length === 0) {\n console.log('No valid skills selected. Exiting.');\n rl.close();\n return;\n }\n\n console.log(`Installing skills: ${selectedSkills.join(', ')}...`);\n const result = await installSkills(process.cwd(), platform, selectedSkills);\n console.log(result);\n } catch (error) {\n console.error('Error:', error);\n } finally {\n rl.close();\n }\n};\n"],"mappings":";;;;;AAKA,MAAa,yBAAyB,WAA4B;AAChE,QAAO,aACL,2BACA;EACE,OAAO;EACP,aACE;EACF,aAAa;GACX,UAAU,EACP,KAAK;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD,CAAC,CACD,SAAS,qCAAqC;GACjD,QAAQ,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,CAAC,SAAS,4BAA4B;GACrE,aAAa,EACV,QAAQ,CACR,UAAU,CACV,SACC,gEACD;GACJ;EACF,EACD,OAAO,EAAE,UAAU,QAAQ,kBAAkB;AAC3C,MAAI;AAQF,UAAO,EACL,SAAS,CACP;IACE,MAAM;IACN,MAVU,MAAM,cADT,eAAe,QAAQ,KAAK,EAGvC,UACA,OACD;IAOI,CACF,EACF;WACM,OAAO;AACd,UAAO;IACL,SAAS,CACP;KACE,MAAM;KACN,MAAM,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;KAC1F,CACF;IACD,SAAS;IACV;;GAGN;;AAGH,MAAa,sBAAsB,YAA2B;CAC5D,MAAM,KAAK,SAAS,gBAAgB;EAClC,OAAO,QAAQ;EACf,QAAQ,QAAQ;EACjB,CAAC;CAEF,MAAM,YAAY,UAChB,IAAI,SAAS,YAAY,GAAG,SAAS,OAAO,QAAQ,CAAC;AAEvD,KAAI;AACF,UAAQ,IAAI,0BAA0B;AACtC,UAAQ,IAAI,0BAA0B;EAEtC,MAAM,gBAAgB,MAAM,SAC1B,gIACD;EACD,MAAM,WAAY;GAChB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC,MAAM,MAAM,EAAE,aAAa,KAAK,cAAc,MAAM,CAAC,aAAa,CAAC,IACnE;AAqCF,UAAQ,IAAI,sBAAsB,WAAW;EAE7C,MAAM,kBAAkB;AACxB,UAAQ,IAAI,sBAAsB;AAClC,kBAAgB,SAAS,GAAG,MAAM;AAChC,WAAQ,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI;IAC7B;EAEF,MAAM,cAAc,MAAM,SACxB,4FACD;EAED,IAAI,iBAA0B,EAAE;AAChC,MAAI,YAAY,MAAM,CAAC,aAAa,KAAK,MACvC,kBAAiB,CAAC,GAAG,gBAAgB;MAMrC,kBAJgB,YACb,MAAM,IAAI,CACV,KAAK,MAAM,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,CAClC,QAAQ,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,KAAK,IAAI,gBAAgB,OAAO,CAC1C,KAAK,MAAM,gBAAgB,GAAU;AAGhE,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAQ,IAAI,qCAAqC;AACjD,MAAG,OAAO;AACV;;AAGF,UAAQ,IAAI,sBAAsB,eAAe,KAAK,KAAK,CAAC,KAAK;EACjE,MAAM,SAAS,MAAM,cAAc,QAAQ,KAAK,EAAE,UAAU,eAAe;AAC3E,UAAQ,IAAI,OAAO;UACZ,OAAO;AACd,UAAQ,MAAM,UAAU,MAAM;WACtB;AACR,KAAG,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installSkills.d.ts","names":[],"sources":["../../../src/tools/installSkills.ts"],"mappings":";;;cAKa,qBAAA,GAAyB,MAAA,EAAQ,SAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"installSkills.d.ts","names":[],"sources":["../../../src/tools/installSkills.ts"],"mappings":";;;cAKa,qBAAA,GAAyB,MAAA,EAAQ,SAAA;AAAA,cAwFjC,mBAAA,QAAgC,OAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@intlayer/mcp",
|
|
3
|
-
"version": "8.1.
|
|
3
|
+
"version": "8.1.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Intlayer MCP server. Handle MCP to help IDE to use Intlayer. It build, fill, pull, push, dictionaries",
|
|
6
6
|
"keywords": [
|
|
@@ -96,26 +96,26 @@
|
|
|
96
96
|
"typecheck": "tsc --noEmit --project tsconfig.types.json"
|
|
97
97
|
},
|
|
98
98
|
"dependencies": {
|
|
99
|
-
"@intlayer/api": "8.1.
|
|
100
|
-
"@intlayer/chokidar": "8.1.
|
|
101
|
-
"@intlayer/cli": "8.1.
|
|
102
|
-
"@intlayer/config": "8.1.
|
|
103
|
-
"@intlayer/docs": "8.1.
|
|
104
|
-
"@intlayer/types": "8.1.
|
|
99
|
+
"@intlayer/api": "8.1.2",
|
|
100
|
+
"@intlayer/chokidar": "8.1.2",
|
|
101
|
+
"@intlayer/cli": "8.1.2",
|
|
102
|
+
"@intlayer/config": "8.1.2",
|
|
103
|
+
"@intlayer/docs": "8.1.2",
|
|
104
|
+
"@intlayer/types": "8.1.2",
|
|
105
105
|
"@modelcontextprotocol/sdk": "1.25.3",
|
|
106
106
|
"dotenv": "17.3.1",
|
|
107
107
|
"express": "5.2.1",
|
|
108
108
|
"zod": "4.3.6"
|
|
109
109
|
},
|
|
110
110
|
"devDependencies": {
|
|
111
|
-
"@intlayer/types": "8.1.
|
|
111
|
+
"@intlayer/types": "8.1.2",
|
|
112
112
|
"@modelcontextprotocol/inspector": "0.19.0",
|
|
113
113
|
"@types/express": "5.0.6",
|
|
114
114
|
"@types/node": "25.2.3",
|
|
115
115
|
"@utils/ts-config": "1.0.4",
|
|
116
116
|
"@utils/ts-config-types": "1.0.4",
|
|
117
117
|
"@utils/tsdown-config": "1.0.4",
|
|
118
|
-
"rimraf": "6.1.
|
|
118
|
+
"rimraf": "6.1.3",
|
|
119
119
|
"tsdown": "0.20.3",
|
|
120
120
|
"typescript": "5.9.3",
|
|
121
121
|
"vitest": "4.0.18"
|