locadex 0.1.6 → 0.1.8
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/CHANGELOG.md +15 -0
- package/dist/commands/fixErrors.js +1 -1
- package/dist/commands/fixErrors.js.map +1 -1
- package/dist/commands/i18n.js +1 -1
- package/dist/commands/i18n.js.map +1 -1
- package/dist/commands/setup.js +1 -1
- package/dist/commands/setup.js.map +1 -1
- package/dist/mcp-stdio.d.ts +3 -0
- package/dist/mcp-stdio.d.ts.map +1 -0
- package/dist/mcp-stdio.js +36 -0
- package/dist/mcp-stdio.js.map +1 -0
- package/dist/tasks/fixErrors.js +1 -1
- package/dist/tasks/fixErrors.js.map +1 -1
- package/dist/utils/locadexManager.d.ts.map +1 -1
- package/dist/utils/locadexManager.js +53 -35
- package/dist/utils/locadexManager.js.map +1 -1
- package/package.json +4 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# locadex
|
|
2
2
|
|
|
3
|
+
## 0.1.8
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#394](https://github.com/generaltranslation/gt/pull/394) [`f5d2fd2`](https://github.com/generaltranslation/gt/commit/f5d2fd2d34359a05eb9ba45c9cf0fbdcc732eedc) Thanks [@brian-lou](https://github.com/brian-lou)! - Switch default mcp to stdio
|
|
8
|
+
|
|
9
|
+
## 0.1.7
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- [#392](https://github.com/generaltranslation/gt/pull/392) [`cebc905`](https://github.com/generaltranslation/gt/commit/cebc905cb5364bdcc218d4e93a6aee606d804419) Thanks [@brian-lou](https://github.com/brian-lou)! - Fix require not being present in ESM package
|
|
14
|
+
|
|
15
|
+
- Updated dependencies [[`cebc905`](https://github.com/generaltranslation/gt/commit/cebc905cb5364bdcc218d4e93a6aee606d804419)]:
|
|
16
|
+
- gtx-cli@1.2.27
|
|
17
|
+
|
|
3
18
|
## 0.1.6
|
|
4
19
|
|
|
5
20
|
### Patch Changes
|
|
@@ -14,7 +14,7 @@ export async function fixErrorsCommand(options, command) {
|
|
|
14
14
|
LocadexManager.initialize({
|
|
15
15
|
rootDirectory: process.cwd(),
|
|
16
16
|
appDirectory: path.resolve(process.cwd(), allOptions.appDir),
|
|
17
|
-
mcpTransport: '
|
|
17
|
+
mcpTransport: 'stdio',
|
|
18
18
|
apiKey: process.env.ANTHROPIC_API_KEY || '',
|
|
19
19
|
metadata: {},
|
|
20
20
|
cliOptions: allOptions,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixErrors.js","sourceRoot":"/","sources":["commands/fixErrors.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAmB,EAAE,OAAgB;IAC1E,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACnD,MAAM,UAAU,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpD,MAAM,gBAAgB,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;IACjD,aAAa,CACX,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,EAClD,KAAK,IAAI,EAAE;QACT,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;QAEjC,aAAa,CAAC,gBAAgB,CAAC,CAAC;QAChC,cAAc,CAAC,UAAU,CAAC;YACxB,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE;YAC5B,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC;YAC5D,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"fixErrors.js","sourceRoot":"/","sources":["commands/fixErrors.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAmB,EAAE,OAAgB;IAC1E,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACnD,MAAM,UAAU,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpD,MAAM,gBAAgB,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;IACjD,aAAa,CACX,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,EAClD,KAAK,IAAI,EAAE;QACT,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;QAEjC,aAAa,CAAC,gBAAgB,CAAC,CAAC;QAChC,cAAc,CAAC,UAAU,CAAC;YACxB,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE;YAC5B,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC;YAC5D,YAAY,EAAE,OAAO;YACrB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;YAC3C,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE;gBACP,GAAG,CAAC,UAAU,CAAC,aAAa,IAAI;oBAC9B,aAAa,EAAE,UAAU,CAAC,aAAa;yBACpC,KAAK,CAAC,GAAG,CAAC;yBACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBAC9B,CAAC;gBACF,GAAG,CAAC,UAAU,CAAC,WAAW,IAAI;oBAC5B,cAAc,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC;iBAC/C,CAAC;gBACF,GAAG,CAAC,UAAU,CAAC,SAAS,IAAI;oBAC1B,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;iBACxC,CAAC;gBACF,GAAG,CAAC,UAAU,CAAC,OAAO,IAAI;oBACxB,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;iBACpC,CAAC;aACH;SACF,CAAC,CAAC;QACH,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC,CACF,CAAC;AACJ,CAAC","sourcesContent":["import { Command } from 'commander';\nimport { CliOptions } from '../types/cli.js';\nimport { withTelemetry } from '../telemetry.js';\nimport { LocadexManager } from '../utils/locadexManager.js';\nimport { displayHeader } from '../logging/console.js';\nimport path from 'node:path';\nimport { validateConfig } from '../utils/config.js';\nimport { fixErrorsTask } from '../tasks/fixErrors.js';\n\nexport async function fixErrorsCommand(options: CliOptions, command: Command) {\n const parentOptions = command.parent?.opts() || {};\n const allOptions = { ...parentOptions, ...options };\n const telemetryEnabled = !allOptions.noTelemetry;\n withTelemetry(\n { enabled: telemetryEnabled, options: allOptions },\n async () => {\n await validateConfig(allOptions);\n\n displayHeader(telemetryEnabled);\n LocadexManager.initialize({\n rootDirectory: process.cwd(),\n appDirectory: path.resolve(process.cwd(), allOptions.appDir),\n mcpTransport: 'stdio',\n apiKey: process.env.ANTHROPIC_API_KEY || '',\n metadata: {},\n cliOptions: allOptions,\n options: {\n ...(allOptions.matchingFiles && {\n matchingFiles: allOptions.matchingFiles\n .split(',')\n .map((file) => file.trim()),\n }),\n ...(allOptions.concurrency && {\n maxConcurrency: Number(allOptions.concurrency),\n }),\n ...(allOptions.batchSize && {\n batchSize: Number(allOptions.batchSize),\n }),\n ...(allOptions.timeout && {\n timeout: Number(allOptions.timeout),\n }),\n },\n });\n await fixErrorsTask();\n }\n );\n}\n"]}
|
package/dist/commands/i18n.js
CHANGED
|
@@ -14,7 +14,7 @@ export async function i18nCommand(options, command) {
|
|
|
14
14
|
LocadexManager.initialize({
|
|
15
15
|
rootDirectory: process.cwd(),
|
|
16
16
|
appDirectory: path.resolve(process.cwd(), allOptions.appDir),
|
|
17
|
-
mcpTransport: '
|
|
17
|
+
mcpTransport: 'stdio',
|
|
18
18
|
apiKey: process.env.ANTHROPIC_API_KEY || '',
|
|
19
19
|
metadata: {},
|
|
20
20
|
cliOptions: allOptions,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.js","sourceRoot":"/","sources":["commands/i18n.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAmB,EAAE,OAAgB;IACrE,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACnD,MAAM,UAAU,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpD,MAAM,gBAAgB,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;IACjD,aAAa,CACX,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,EAClD,KAAK,IAAI,EAAE;QACT,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;QAEjC,aAAa,CAAC,gBAAgB,CAAC,CAAC;QAChC,cAAc,CAAC,UAAU,CAAC;YACxB,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE;YAC5B,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC;YAC5D,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"/","sources":["commands/i18n.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAmB,EAAE,OAAgB;IACrE,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACnD,MAAM,UAAU,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpD,MAAM,gBAAgB,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;IACjD,aAAa,CACX,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,EAClD,KAAK,IAAI,EAAE;QACT,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;QAEjC,aAAa,CAAC,gBAAgB,CAAC,CAAC;QAChC,cAAc,CAAC,UAAU,CAAC;YACxB,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE;YAC5B,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC;YAC5D,YAAY,EAAE,OAAO;YACrB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;YAC3C,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE;gBACP,GAAG,CAAC,UAAU,CAAC,aAAa,IAAI;oBAC9B,aAAa,EAAE,UAAU,CAAC,aAAa;yBACpC,KAAK,CAAC,GAAG,CAAC;yBACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBAC9B,CAAC;gBACF,GAAG,CAAC,UAAU,CAAC,WAAW,IAAI;oBAC5B,cAAc,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC;iBAC/C,CAAC;gBACF,GAAG,CAAC,UAAU,CAAC,SAAS,IAAI;oBAC1B,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;iBACxC,CAAC;gBACF,GAAG,CAAC,UAAU,CAAC,OAAO,IAAI;oBACxB,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;iBACpC,CAAC;aACH;SACF,CAAC,CAAC;QACH,MAAM,QAAQ,EAAE,CAAC;IACnB,CAAC,CACF,CAAC;AACJ,CAAC","sourcesContent":["import { Command } from 'commander';\nimport { i18nTask } from '../tasks/i18n.js';\nimport { CliOptions } from '../types/cli.js';\nimport { withTelemetry } from '../telemetry.js';\nimport { LocadexManager } from '../utils/locadexManager.js';\nimport { displayHeader } from '../logging/console.js';\nimport path from 'node:path';\nimport { validateConfig } from '../utils/config.js';\n\nexport async function i18nCommand(options: CliOptions, command: Command) {\n const parentOptions = command.parent?.opts() || {};\n const allOptions = { ...parentOptions, ...options };\n const telemetryEnabled = !allOptions.noTelemetry;\n withTelemetry(\n { enabled: telemetryEnabled, options: allOptions },\n async () => {\n await validateConfig(allOptions);\n\n displayHeader(telemetryEnabled);\n LocadexManager.initialize({\n rootDirectory: process.cwd(),\n appDirectory: path.resolve(process.cwd(), allOptions.appDir),\n mcpTransport: 'stdio',\n apiKey: process.env.ANTHROPIC_API_KEY || '',\n metadata: {},\n cliOptions: allOptions,\n options: {\n ...(allOptions.matchingFiles && {\n matchingFiles: allOptions.matchingFiles\n .split(',')\n .map((file) => file.trim()),\n }),\n ...(allOptions.concurrency && {\n maxConcurrency: Number(allOptions.concurrency),\n }),\n ...(allOptions.batchSize && {\n batchSize: Number(allOptions.batchSize),\n }),\n ...(allOptions.timeout && {\n timeout: Number(allOptions.timeout),\n }),\n },\n });\n await i18nTask();\n }\n );\n}\n"]}
|
package/dist/commands/setup.js
CHANGED
|
@@ -14,7 +14,7 @@ export async function setupCommand(options, command) {
|
|
|
14
14
|
LocadexManager.initialize({
|
|
15
15
|
rootDirectory: process.cwd(),
|
|
16
16
|
appDirectory: path.resolve(process.cwd(), allOptions.appDir),
|
|
17
|
-
mcpTransport: '
|
|
17
|
+
mcpTransport: 'stdio',
|
|
18
18
|
apiKey: process.env.ANTHROPIC_API_KEY || '',
|
|
19
19
|
metadata: {},
|
|
20
20
|
cliOptions: allOptions,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"/","sources":["commands/setup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAGC,EACD,OAAgB;IAEhB,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACnD,MAAM,UAAU,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpD,MAAM,gBAAgB,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;IACjD,aAAa,CACX,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,EAClD,KAAK,IAAI,EAAE;QACT,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;QAEjC,aAAa,CAAC,gBAAgB,CAAC,CAAC;QAChC,cAAc,CAAC,UAAU,CAAC;YACxB,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE;YAC5B,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC;YAC5D,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"/","sources":["commands/setup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAGC,EACD,OAAgB;IAEhB,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACnD,MAAM,UAAU,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpD,MAAM,gBAAgB,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;IACjD,aAAa,CACX,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,EAClD,KAAK,IAAI,EAAE;QACT,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;QAEjC,aAAa,CAAC,gBAAgB,CAAC,CAAC;QAChC,cAAc,CAAC,UAAU,CAAC;YACxB,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE;YAC5B,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC;YAC5D,YAAY,EAAE,OAAO;YACrB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;YAC3C,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE;gBACP,GAAG,CAAC,UAAU,CAAC,aAAa,IAAI;oBAC9B,aAAa,EAAE,UAAU,CAAC,aAAa;yBACpC,KAAK,CAAC,GAAG,CAAC;yBACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBAC9B,CAAC;gBACF,GAAG,CAAC,UAAU,CAAC,WAAW,IAAI;oBAC5B,cAAc,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC;iBAC/C,CAAC;gBACF,GAAG,CAAC,UAAU,CAAC,SAAS,IAAI;oBAC1B,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;iBACxC,CAAC;gBACF,GAAG,CAAC,UAAU,CAAC,OAAO,IAAI;oBACxB,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;iBACpC,CAAC;aACH;SACF,CAAC,CAAC;QACH,MAAM,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;IACzE,CAAC,CACF,CAAC;AACJ,CAAC","sourcesContent":["import { Command } from 'commander';\nimport { setupTask } from '../tasks/setup.js';\nimport { CliOptions } from '../types/cli.js';\nimport { withTelemetry } from '../telemetry.js';\nimport { LocadexManager } from '../utils/locadexManager.js';\nimport { displayHeader } from '../logging/console.js';\nimport path from 'node:path';\nimport { validateConfig } from '../utils/config.js';\n\nexport async function setupCommand(\n options: CliOptions & {\n packageManager?: string;\n bypassPrompts?: boolean;\n },\n command: Command\n) {\n const parentOptions = command.parent?.opts() || {};\n const allOptions = { ...parentOptions, ...options };\n const telemetryEnabled = !allOptions.noTelemetry;\n withTelemetry(\n { enabled: telemetryEnabled, options: allOptions },\n async () => {\n await validateConfig(allOptions);\n\n displayHeader(telemetryEnabled);\n LocadexManager.initialize({\n rootDirectory: process.cwd(),\n appDirectory: path.resolve(process.cwd(), allOptions.appDir),\n mcpTransport: 'stdio',\n apiKey: process.env.ANTHROPIC_API_KEY || '',\n metadata: {},\n cliOptions: allOptions,\n options: {\n ...(allOptions.matchingFiles && {\n matchingFiles: allOptions.matchingFiles\n .split(',')\n .map((file) => file.trim()),\n }),\n ...(allOptions.concurrency && {\n maxConcurrency: Number(allOptions.concurrency),\n }),\n ...(allOptions.batchSize && {\n batchSize: Number(allOptions.batchSize),\n }),\n ...(allOptions.timeout && {\n timeout: Number(allOptions.timeout),\n }),\n },\n });\n await setupTask(!!allOptions.bypassPrompts, allOptions.packageManager);\n }\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-stdio.d.ts","sourceRoot":"/","sources":["mcp-stdio.ts"],"names":[],"mappings":";AAEA,OAAO,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import './telemetry.js';
|
|
3
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
4
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
5
|
+
import { addDocsTools } from './mcp/tools/docs.js';
|
|
6
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
7
|
+
import { fromPackageRoot } from './utils/getPaths.js';
|
|
8
|
+
import { addGuidesTools } from './mcp/tools/guides.js';
|
|
9
|
+
import { logger } from './logging/logger.js';
|
|
10
|
+
async function main() {
|
|
11
|
+
const stateFile = process.env.LOCADEX_FILES_STATE_FILE_PATH;
|
|
12
|
+
const logFile = process.env.LOCADEX_LOG_FILE_PATH;
|
|
13
|
+
const verbose = process.env.LOCADEX_VERBOSE === 'true';
|
|
14
|
+
const debug = process.env.LOCADEX_DEBUG === 'true';
|
|
15
|
+
logger.initialize({ verbose, debug }, logFile);
|
|
16
|
+
if (stateFile && existsSync(stateFile)) {
|
|
17
|
+
const state = JSON.parse(readFileSync(stateFile, 'utf8'));
|
|
18
|
+
logger.log(`[locadex-mcp] state: ${JSON.stringify(state, null, 2)}`);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
throw new Error(`[locadex-mcp] state file not found: ${stateFile}`);
|
|
22
|
+
}
|
|
23
|
+
const server = new McpServer({
|
|
24
|
+
name: 'Locadex: AI Agent for Internationalization',
|
|
25
|
+
version: JSON.parse(readFileSync(fromPackageRoot('package.json'), 'utf8'))
|
|
26
|
+
.version,
|
|
27
|
+
});
|
|
28
|
+
addDocsTools(server);
|
|
29
|
+
addGuidesTools(server);
|
|
30
|
+
logger.log('[locadex-mcp] All tools registered');
|
|
31
|
+
const transport = new StdioServerTransport();
|
|
32
|
+
await server.connect(transport);
|
|
33
|
+
logger.log('[locadex-mcp] started on stdio');
|
|
34
|
+
}
|
|
35
|
+
main();
|
|
36
|
+
//# sourceMappingURL=mcp-stdio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-stdio.js","sourceRoot":"/","sources":["mcp-stdio.ts"],"names":[],"mappings":";AAEA,OAAO,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;IAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM,CAAC;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,MAAM,CAAC;IAEnD,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;IAE/C,IAAI,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,uCAAuC,SAAS,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,4CAA4C;QAClD,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;aACvE,OAAO;KACX,CAAC,CAAC;IAEH,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvB,MAAM,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;AAC/C,CAAC;AACD,IAAI,EAAE,CAAC","sourcesContent":["#!/usr/bin/env node\n\nimport './telemetry.js';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { addDocsTools } from './mcp/tools/docs.js';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { fromPackageRoot } from './utils/getPaths.js';\nimport { addGuidesTools } from './mcp/tools/guides.js';\nimport { logger } from './logging/logger.js';\n\nasync function main() {\n const stateFile = process.env.LOCADEX_FILES_STATE_FILE_PATH;\n const logFile = process.env.LOCADEX_LOG_FILE_PATH;\n const verbose = process.env.LOCADEX_VERBOSE === 'true';\n const debug = process.env.LOCADEX_DEBUG === 'true';\n\n logger.initialize({ verbose, debug }, logFile);\n\n if (stateFile && existsSync(stateFile)) {\n const state = JSON.parse(readFileSync(stateFile, 'utf8'));\n logger.log(`[locadex-mcp] state: ${JSON.stringify(state, null, 2)}`);\n } else {\n throw new Error(`[locadex-mcp] state file not found: ${stateFile}`);\n }\n\n const server = new McpServer({\n name: 'Locadex: AI Agent for Internationalization',\n version: JSON.parse(readFileSync(fromPackageRoot('package.json'), 'utf8'))\n .version,\n });\n\n addDocsTools(server);\n addGuidesTools(server);\n\n logger.log('[locadex-mcp] All tools registered');\n const transport = new StdioServerTransport();\n await server.connect(transport);\n logger.log('[locadex-mcp] started on stdio');\n}\nmain();\n"]}
|
package/dist/tasks/fixErrors.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixErrors.js","sourceRoot":"/","sources":["tasks/fixErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,OAAO,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,uCAAuC;IACvC,MAAM,oBAAoB,CAAC,2BAA2B,EAAE,mBAAmB,CAAC,CAAC;IAE7E,mCAAmC;IACnC,MAAM,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;IAE3E,MAAM,CAAC,iBAAiB,EAAE,CAAC;IAC3B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,GAAG,CACpB,SAAS,EACT;YACE,QAAQ,EAAE,GAAG;YACb,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,CAAC;SACd,EACD,EAAE,CACH,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,oBAAoB,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,YAAY,CAAC,cAAc,EAAE,CAAC;QAC9B,MAAM,CAAC,YAAY,CACjB,gDAAgD,KAAK,EAAE,CACxD,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACrC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,OAAO;IACT,CAAC;IACD,YAAY,CAAC,cAAc,EAAE,CAAC;IAC9B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACpC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,oDAAoD;AAEpD,SAAS,YAAY,CAAC,YAAoB;IACxC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;oBAyBG,YAAY;;;;EAI9B,YAAY;;;;;;;;;CASb,CAAC;IAEA,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { allMcpPrompt } from '../prompts/system.js';\nimport { exit } from '../utils/shutdown.js';\nimport { logger } from '../logging/logger.js';\nimport { LocadexManager } from '../utils/locadexManager.js';\nimport { outro } from '@clack/prompts';\nimport chalk from 'chalk';\nimport { CLAUDE_CODE_VERSION } from '../utils/shared.js';\nimport { installGlobalPackage } from '../utils/packages/installPackage.js';\n\nexport async function fixErrorsTask() {\n const manager = LocadexManager.getInstance();\n const reports: string[] = [];\n // Install claude-code if not installed\n await installGlobalPackage('@anthropic-ai/claude-code', CLAUDE_CODE_VERSION);\n\n // Create a clean agent for cleanup\n const cleanupAgent = manager.createSingleAgent('claude_cleanup_agent', {});\n\n logger.initializeSpinner();\n logger.spinner.start('Fixing errors...');\n const fixPrompt = getFixPrompt(manager.appDirectory);\n try {\n await cleanupAgent.run(\n fixPrompt,\n {\n maxTurns: 200,\n timeoutSec: 300,\n maxRetries:
|
|
1
|
+
{"version":3,"file":"fixErrors.js","sourceRoot":"/","sources":["tasks/fixErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,OAAO,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,uCAAuC;IACvC,MAAM,oBAAoB,CAAC,2BAA2B,EAAE,mBAAmB,CAAC,CAAC;IAE7E,mCAAmC;IACnC,MAAM,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;IAE3E,MAAM,CAAC,iBAAiB,EAAE,CAAC;IAC3B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,GAAG,CACpB,SAAS,EACT;YACE,QAAQ,EAAE,GAAG;YACb,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,CAAC;SACd,EACD,EAAE,CACH,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,oBAAoB,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,YAAY,CAAC,cAAc,EAAE,CAAC;QAC9B,MAAM,CAAC,YAAY,CACjB,gDAAgD,KAAK,EAAE,CACxD,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACrC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,OAAO;IACT,CAAC;IACD,YAAY,CAAC,cAAc,EAAE,CAAC;IAC9B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACpC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,oDAAoD;AAEpD,SAAS,YAAY,CAAC,YAAoB;IACxC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;oBAyBG,YAAY;;;;EAI9B,YAAY;;;;;;;;;CASb,CAAC;IAEA,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { allMcpPrompt } from '../prompts/system.js';\nimport { exit } from '../utils/shutdown.js';\nimport { logger } from '../logging/logger.js';\nimport { LocadexManager } from '../utils/locadexManager.js';\nimport { outro } from '@clack/prompts';\nimport chalk from 'chalk';\nimport { CLAUDE_CODE_VERSION } from '../utils/shared.js';\nimport { installGlobalPackage } from '../utils/packages/installPackage.js';\n\nexport async function fixErrorsTask() {\n const manager = LocadexManager.getInstance();\n const reports: string[] = [];\n // Install claude-code if not installed\n await installGlobalPackage('@anthropic-ai/claude-code', CLAUDE_CODE_VERSION);\n\n // Create a clean agent for cleanup\n const cleanupAgent = manager.createSingleAgent('claude_cleanup_agent', {});\n\n logger.initializeSpinner();\n logger.spinner.start('Fixing errors...');\n const fixPrompt = getFixPrompt(manager.appDirectory);\n try {\n await cleanupAgent.run(\n fixPrompt,\n {\n maxTurns: 200,\n timeoutSec: 300,\n maxRetries: 2,\n },\n {}\n );\n reports.push(`## Fixed errors\\n${cleanupAgent.generateReport()}`);\n } catch (error) {\n cleanupAgent.aggregateStats();\n logger.debugMessage(\n `[claude_cleanup_agent] Fixing errors failed: ${error}`\n );\n manager.stats.recordTelemetry(false);\n outro(chalk.red('❌ Locadex i18n failed!'));\n await exit(1);\n return;\n }\n cleanupAgent.aggregateStats();\n logger.spinner.stop('Fixed errors');\n return reports;\n}\n\n// check (dry run and ts check) should be at the end\n\nfunction getFixPrompt(appDirectory: string) {\n const prompt = `# Task: Fix internationalization errors in the project.\n\n## INSTRUCTIONS\n\nPreviously, you helped me internationalize a set of files in this project.\nYour new task is to fix any errors that were introduced by your previous implementation.\n\n## Steps:\n1. Run the gt-next validator.\n2. Fix all errors output by the gt-next validator.\n3. Repeat steps 1-2 until there are no more errors, or until you believe that you have fixed all errors.\n\n## RULES:\n- ONLY modify files that are relevant to the internationalization of the project.\n- ONLY fix errors that result from your current or previous implementation.\n- Resolve unused imports from 'gt-next'. \n - In particular, if a file contains user-facing content that should be internationalized and is not, you should internationalize it.\n- Resolve missing imports from 'gt-next'. If a file is missing an import from 'gt-next', add it.\n- ALWAYS adhere to the guides provided via the 'mcp__locadex__' tools.\n - These guides provide additional knowledge about how to internationalize the content.\n- NEVER move content to a different file. All content MUST remain in the same file where it came from.\n- NEVER CREATE OR DELETE ANY FILES (especially .bak files)\n\nTo run the gt-next validator, run the following command from the app root:\n'locadex validate' (global command)\nThe app root is: \"${appDirectory}\"\n\n## MCP TOOLS\n\n${allMcpPrompt}\n\n## Final output\n- When you are done, please return a brief summary of the files you modified, following this format.\n- **DO NOT** include any other text in your response. \n- If there were issues with some files, please include the issues in the list of changes for that file.\n\n[file 1 path]\n- List of changes to file 1\n`;\n\n return prompt;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locadexManager.d.ts","sourceRoot":"/","sources":["utils/locadexManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAUxE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAM5D,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"locadexManager.d.ts","sourceRoot":"/","sources":["utils/locadexManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,15 @@ const mcpSseConfig = {
|
|
|
19
19
|
},
|
|
20
20
|
},
|
|
21
21
|
};
|
|
22
|
+
const mcpStdioConfig = {
|
|
23
|
+
mcpServers: {
|
|
24
|
+
locadex: {
|
|
25
|
+
command: 'locadex-mcp',
|
|
26
|
+
args: [],
|
|
27
|
+
env: {},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
};
|
|
22
31
|
export class LocadexManager {
|
|
23
32
|
static instance;
|
|
24
33
|
mcpProcess;
|
|
@@ -108,44 +117,53 @@ export class LocadexManager {
|
|
|
108
117
|
}
|
|
109
118
|
async startMcpServer() {
|
|
110
119
|
if (this.mcpTransport === 'stdio') {
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
// First, search for an available port
|
|
114
|
-
const port = await findAvailablePort(8888);
|
|
115
|
-
mcpSseConfig.mcpServers.locadex.url = `http://localhost:${port}/sse`;
|
|
116
|
-
fs.writeFileSync(this.mcpConfigPath, JSON.stringify(mcpSseConfig, null, 2));
|
|
117
|
-
logger.debugMessage(`Starting MCP server on port ${port} with config: ${JSON.stringify(mcpSseConfig, null, 2)}`);
|
|
118
|
-
this.mcpProcess = spawn('node', [fromPackageRoot('dist/mcp.js')], {
|
|
119
|
-
env: {
|
|
120
|
-
...process.env,
|
|
120
|
+
mcpStdioConfig.mcpServers.locadex.env = {
|
|
121
121
|
LOCADEX_FILES_STATE_FILE_PATH: this.filesStateFilePath,
|
|
122
|
+
LOCADEX_LOG_FILE_PATH: this.logFile,
|
|
122
123
|
LOCADEX_VERBOSE: logger.verbose ? 'true' : 'false',
|
|
123
124
|
LOCADEX_DEBUG: logger.debug ? 'true' : 'false',
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
125
|
+
};
|
|
126
|
+
fs.writeFileSync(this.mcpConfigPath, JSON.stringify(mcpStdioConfig, null, 2));
|
|
127
|
+
logger.debugMessage(`Starting MCP server on stdio with config: ${JSON.stringify(mcpStdioConfig, null, 2)}`);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
// First, search for an available port
|
|
131
|
+
const port = await findAvailablePort(8888);
|
|
132
|
+
mcpSseConfig.mcpServers.locadex.url = `http://localhost:${port}/sse`;
|
|
133
|
+
fs.writeFileSync(this.mcpConfigPath, JSON.stringify(mcpSseConfig, null, 2));
|
|
134
|
+
logger.debugMessage(`Starting MCP server on port ${port} with config: ${JSON.stringify(mcpSseConfig, null, 2)}`);
|
|
135
|
+
this.mcpProcess = spawn('node', [fromPackageRoot('dist/mcp.js')], {
|
|
136
|
+
env: {
|
|
137
|
+
...process.env,
|
|
138
|
+
LOCADEX_FILES_STATE_FILE_PATH: this.filesStateFilePath,
|
|
139
|
+
LOCADEX_VERBOSE: logger.verbose ? 'true' : 'false',
|
|
140
|
+
LOCADEX_DEBUG: logger.debug ? 'true' : 'false',
|
|
141
|
+
LOCADEX_LOG_FILE_PATH: this.logFile,
|
|
142
|
+
PORT: port.toString(),
|
|
143
|
+
},
|
|
144
|
+
stdio: ['ignore', 'inherit', 'inherit'],
|
|
145
|
+
signal: this.mcpAbortController.signal,
|
|
146
|
+
});
|
|
147
|
+
this.mcpProcess.on('error', async (error) => {
|
|
148
|
+
if (error.name === 'AbortError') {
|
|
149
|
+
logger.debugMessage('MCP server was closed');
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
logger.error(`MCP server failed to start: ${error.message}`);
|
|
153
|
+
await exit(1);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
this.mcpProcess.on('exit', async (code, signal) => {
|
|
157
|
+
if (code !== 0 && code !== null) {
|
|
158
|
+
logger.error(`MCP server exited with code ${code}`);
|
|
159
|
+
await exit(code);
|
|
160
|
+
}
|
|
161
|
+
if (signal) {
|
|
162
|
+
logger.error(`MCP server was killed with signal ${signal}`);
|
|
163
|
+
await exit(0);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
}
|
|
149
167
|
}
|
|
150
168
|
static getInstance() {
|
|
151
169
|
if (!LocadexManager.instance) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locadexManager.js","sourceRoot":"/","sources":["utils/locadexManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { ClaudeCodeRunner, ClaudeRunnerOptions } from './claudeCode.js';\nimport { fromPackageRoot } from './getPaths.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { FileEntry } from './dag/getFiles.js';\nimport { logger } from '../logging/logger.js';\nimport { addToGitIgnore } from './fs/writeFiles.js';\nimport { spawn } from 'node:child_process';\nimport type { ChildProcess } from 'node:child_process';\nimport { setTimeout } from 'node:timers';\nimport { AgentStats } from './stats.js';\nimport { CliOptions, LocadexConfig } from '../types/cli.js';\nimport { findAvailablePort } from '../mcp/getPort.js';\nimport { createConfig, getConfig } from './config.js';\nimport { gracefulShutdown, exit } from './shutdown.js';\nimport { LOCKFILE_NAME } from './lockfile.js';\n\nexport interface LocadexRunMetadata {\n createdAt: string;\n locadexVersion: string;\n workingDirectory: string;\n projectName: string;\n transport: 'sse' | 'stdio';\n tempDirectory: string;\n nodeVersion: string;\n platform: string;\n arch: string;\n logFile: string;\n batchSize: number;\n maxConcurrency: number;\n [key: string]: any;\n}\n\nconst mcpSseConfig = {\n mcpServers: {\n locadex: {\n type: 'sse',\n url: 'http://localhost:8888/sse',\n },\n },\n};\n\nexport class LocadexManager {\n private static instance: LocadexManager | undefined;\n private mcpProcess: ChildProcess | undefined;\n private mcpTransport: 'sse' | 'stdio';\n\n // Paths\n private mcpConfigPath: string;\n private filesStateFilePath: string;\n private metadataFilePath: string;\n private lockFilePath: string;\n private currentRunDir: string;\n public locadexDirectory: string;\n public appDirectory: string;\n public rootDirectory: string;\n\n // Config\n private apiKey: string;\n private maxConcurrency: number;\n private batchSize: number;\n private timeout: number;\n private defaultSoftTurnLimit: number = 100;\n\n // Agent pool\n private agentPool: Map<string, { agent: ClaudeCodeRunner; busy: boolean }>;\n\n // Abort controllers\n private agentAbortController: AbortController;\n private mcpAbortController: AbortController;\n private aborted: boolean = false;\n\n // State\n private agentMutex = Promise.resolve();\n private config: LocadexConfig;\n public stats: AgentStats;\n public logFile: string;\n\n private constructor(params: {\n rootDirectory: string;\n appDirectory: string;\n mcpTransport: 'sse' | 'stdio';\n apiKey: string;\n metadata: Partial<LocadexRunMetadata>;\n options: Partial<LocadexConfig>;\n }) {\n this.apiKey = params.apiKey;\n this.agentPool = new Map();\n this.stats = new AgentStats();\n this.mcpTransport = params.mcpTransport;\n this.agentAbortController = new AbortController();\n this.mcpAbortController = new AbortController();\n\n // appDirectory is the absolute path to the app directory\n this.appDirectory = params.appDirectory;\n this.rootDirectory = params.rootDirectory;\n\n this.locadexDirectory = path.resolve(this.rootDirectory, '.locadex');\n this.currentRunDir = path.resolve(\n this.locadexDirectory,\n 'runs',\n Date.now().toString()\n );\n fs.mkdirSync(this.currentRunDir, { recursive: true });\n\n this.config = getConfig(\n this.locadexDirectory,\n this.rootDirectory,\n this.appDirectory,\n params.options\n );\n logger.debugMessage(\n `Locadex loaded with config: ${JSON.stringify(this.config, null, 2)}`\n );\n\n createConfig(this.locadexDirectory, {\n batchSize: this.config.batchSize,\n maxConcurrency: this.config.maxConcurrency,\n matchingFiles: this.config.matchingFiles,\n timeout: this.config.timeout,\n });\n\n addToGitIgnore(this.rootDirectory, '.locadex/runs');\n\n this.maxConcurrency = this.config.maxConcurrency;\n this.batchSize = this.config.batchSize;\n this.timeout = this.config.timeout;\n this.mcpConfigPath = path.resolve(this.currentRunDir, 'mcp.json');\n this.filesStateFilePath = path.resolve(\n this.currentRunDir,\n 'files-state.json'\n );\n this.metadataFilePath = path.resolve(this.currentRunDir, 'metadata.json');\n this.logFile = path.resolve(this.currentRunDir, 'log.txt');\n this.lockFilePath = path.resolve(this.locadexDirectory, LOCKFILE_NAME);\n\n // Create files-state.json\n const filesState: FileEntry[] = [];\n fs.writeFileSync(\n this.filesStateFilePath,\n JSON.stringify(filesState, null, 2)\n );\n\n // Create metadata.json\n const metadata: LocadexRunMetadata = {\n createdAt: new Date().toISOString(),\n locadexVersion: JSON.parse(\n fs.readFileSync(fromPackageRoot('package.json'), 'utf8')\n ).version,\n workingDirectory: this.appDirectory,\n projectName: path.basename(this.appDirectory),\n transport: params.mcpTransport,\n tempDirectory: this.currentRunDir,\n nodeVersion: process.version,\n platform: process.platform,\n arch: process.arch,\n logFile: this.logFile,\n batchSize: this.config.batchSize,\n maxConcurrency: this.config.maxConcurrency,\n ...params.metadata,\n };\n fs.writeFileSync(this.metadataFilePath, JSON.stringify(metadata, null, 2));\n\n // Register cleanup with graceful shutdown\n gracefulShutdown.addHandler({\n name: 'locadex-manager-cleanup',\n handler: () => this.cleanup(),\n timeout: 3000,\n });\n }\n\n async startMcpServer() {\n if (this.mcpTransport === 'stdio') {\n return;\n }\n\n // First, search for an available port\n const port = await findAvailablePort(8888);\n mcpSseConfig.mcpServers.locadex.url = `http://localhost:${port}/sse`;\n fs.writeFileSync(this.mcpConfigPath, JSON.stringify(mcpSseConfig, null, 2));\n\n logger.debugMessage(\n `Starting MCP server on port ${port} with config: ${JSON.stringify(\n mcpSseConfig,\n null,\n 2\n )}`\n );\n\n this.mcpProcess = spawn('node', [fromPackageRoot('dist/mcp.js')], {\n env: {\n ...process.env,\n LOCADEX_FILES_STATE_FILE_PATH: this.filesStateFilePath,\n LOCADEX_VERBOSE: logger.verbose ? 'true' : 'false',\n LOCADEX_DEBUG: logger.debug ? 'true' : 'false',\n LOCADEX_LOG_FILE_PATH: this.logFile,\n PORT: port.toString(),\n },\n stdio: ['ignore', 'inherit', 'inherit'],\n signal: this.mcpAbortController.signal,\n });\n\n this.mcpProcess.on('error', async (error) => {\n if (error.name === 'AbortError') {\n logger.debugMessage('MCP server was closed');\n } else {\n logger.error(`MCP server failed to start: ${error.message}`);\n await exit(1);\n }\n });\n\n this.mcpProcess.on('exit', async (code, signal) => {\n if (code !== 0 && code !== null) {\n logger.error(`MCP server exited with code ${code}`);\n await exit(code as 0 | 1);\n }\n if (signal) {\n logger.error(`MCP server was killed with signal ${signal}`);\n await exit(0);\n }\n });\n }\n\n static getInstance(): LocadexManager {\n if (!LocadexManager.instance) {\n throw new Error('LocadexManager not initialized');\n }\n return LocadexManager.instance;\n }\n\n static initialize(params: {\n rootDirectory: string;\n appDirectory: string;\n mcpTransport: 'sse' | 'stdio';\n apiKey: string;\n metadata: Partial<LocadexRunMetadata>;\n cliOptions: CliOptions;\n options: Partial<LocadexConfig>;\n }): void {\n if (!LocadexManager.instance) {\n LocadexManager.instance = new LocadexManager(params);\n logger.initialize(params.cliOptions, LocadexManager.instance.logFile);\n\n logger.debugMessage(\n `Locadex loaded with config: ${JSON.stringify(\n LocadexManager.instance.config,\n null,\n 2\n )}`\n );\n LocadexManager.instance.startMcpServer();\n }\n }\n\n static reset(): void {\n if (LocadexManager.instance) {\n LocadexManager.instance.cleanup();\n LocadexManager.instance = undefined;\n }\n }\n\n createSingleAgent(\n id: string,\n options: ClaudeRunnerOptions\n ): ClaudeCodeRunner {\n return new ClaudeCodeRunner(this, this.agentAbortController, {\n apiKey: this.apiKey,\n mcpConfig: this.mcpConfigPath,\n softTurnLimit: options.softTurnLimit ?? this.defaultSoftTurnLimit,\n id,\n });\n }\n\n createAgentPool(options: ClaudeRunnerOptions): void {\n if (this.agentPool.size === 0) {\n for (let i = 0; i < this.maxConcurrency; i++) {\n const agentId = `claude_task_agent_${i + 1}`;\n this.agentPool.set(agentId, {\n agent: this.createSingleAgent(agentId, options),\n busy: false,\n });\n }\n }\n }\n\n async getAvailableAgent(): Promise<{\n id: string;\n agent: ClaudeCodeRunner;\n } | null> {\n return new Promise((resolve) => {\n this.agentMutex = this.agentMutex.then(() => {\n for (const [id, agentData] of this.agentPool) {\n if (!agentData.busy) {\n agentData.busy = true;\n resolve({\n id,\n agent: agentData.agent,\n });\n return;\n }\n }\n resolve(null);\n });\n });\n }\n\n markAgentFree(agentId: string): void {\n const agentData = this.agentPool.get(agentId);\n if (agentData) {\n agentData.busy = false;\n }\n }\n\n getAgentPool(): Map<\n string,\n { agent: ClaudeCodeRunner; sessionId?: string; busy: boolean }\n > {\n return this.agentPool;\n }\n\n cleanupAgents(): void {\n logger.debugMessage('Cleaning up all Claude Code agents and processes');\n\n // Abort all active processes\n this.agentAbortController.abort();\n\n // Mark agents as free\n for (const agentData of this.agentPool.values()) {\n agentData.busy = false;\n }\n\n // Clear the agent pool\n this.agentPool.clear();\n }\n\n getFilesStateFilePath(): string {\n return this.filesStateFilePath;\n }\n getMetadataFilePath(): string {\n return this.metadataFilePath;\n }\n getMaxConcurrency(): number {\n return this.maxConcurrency;\n }\n getBatchSize(): number {\n return this.batchSize;\n }\n getTimeoutFactor(): number {\n return this.timeout;\n }\n getConfig(): LocadexConfig {\n return this.config;\n }\n\n getLockFilePath(): string {\n return this.lockFilePath;\n }\n\n cleanup(): void {\n if (this.aborted) {\n return;\n }\n this.aborted = true;\n // Clean up agents first (if not already done)\n this.cleanupAgents();\n\n // Clean up MCP process using abort controller\n if (this.mcpProcess && !this.mcpProcess.killed) {\n logger.debugMessage('Terminating MCP process via abort controller');\n this.mcpAbortController.abort();\n\n // Give the process a moment to handle the abort signal gracefully\n setTimeout(() => {\n if (this.mcpProcess && !this.mcpProcess.killed) {\n logger.debugMessage('Force killing MCP process as fallback');\n this.mcpProcess.kill('SIGTERM');\n }\n }, 1000);\n }\n }\n\n getLogDirectory(): string {\n return this.currentRunDir;\n }\n\n getAgentAbortController(): AbortController {\n return this.agentAbortController;\n }\n\n isAborted(): boolean {\n return this.aborted;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"locadexManager.js","sourceRoot":"/","sources":["utils/locadexManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { ClaudeCodeRunner, ClaudeRunnerOptions } from './claudeCode.js';\nimport { fromPackageRoot } from './getPaths.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { FileEntry } from './dag/getFiles.js';\nimport { logger } from '../logging/logger.js';\nimport { addToGitIgnore } from './fs/writeFiles.js';\nimport { spawn } from 'node:child_process';\nimport type { ChildProcess } from 'node:child_process';\nimport { setTimeout } from 'node:timers';\nimport { AgentStats } from './stats.js';\nimport { CliOptions, LocadexConfig } from '../types/cli.js';\nimport { findAvailablePort } from '../mcp/getPort.js';\nimport { createConfig, getConfig } from './config.js';\nimport { gracefulShutdown, exit } from './shutdown.js';\nimport { LOCKFILE_NAME } from './lockfile.js';\n\nexport interface LocadexRunMetadata {\n createdAt: string;\n locadexVersion: string;\n workingDirectory: string;\n projectName: string;\n transport: 'sse' | 'stdio';\n tempDirectory: string;\n nodeVersion: string;\n platform: string;\n arch: string;\n logFile: string;\n batchSize: number;\n maxConcurrency: number;\n [key: string]: any;\n}\n\nconst mcpSseConfig = {\n mcpServers: {\n locadex: {\n type: 'sse',\n url: 'http://localhost:8888/sse',\n },\n },\n};\nconst mcpStdioConfig = {\n mcpServers: {\n locadex: {\n command: 'locadex-mcp',\n args: [],\n env: {},\n },\n },\n};\n\nexport class LocadexManager {\n private static instance: LocadexManager | undefined;\n private mcpProcess: ChildProcess | undefined;\n private mcpTransport: 'sse' | 'stdio';\n\n // Paths\n private mcpConfigPath: string;\n private filesStateFilePath: string;\n private metadataFilePath: string;\n private lockFilePath: string;\n private currentRunDir: string;\n public locadexDirectory: string;\n public appDirectory: string;\n public rootDirectory: string;\n\n // Config\n private apiKey: string;\n private maxConcurrency: number;\n private batchSize: number;\n private timeout: number;\n private defaultSoftTurnLimit: number = 100;\n\n // Agent pool\n private agentPool: Map<string, { agent: ClaudeCodeRunner; busy: boolean }>;\n\n // Abort controllers\n private agentAbortController: AbortController;\n private mcpAbortController: AbortController;\n private aborted: boolean = false;\n\n // State\n private agentMutex = Promise.resolve();\n private config: LocadexConfig;\n public stats: AgentStats;\n public logFile: string;\n\n private constructor(params: {\n rootDirectory: string;\n appDirectory: string;\n mcpTransport: 'sse' | 'stdio';\n apiKey: string;\n metadata: Partial<LocadexRunMetadata>;\n options: Partial<LocadexConfig>;\n }) {\n this.apiKey = params.apiKey;\n this.agentPool = new Map();\n this.stats = new AgentStats();\n this.mcpTransport = params.mcpTransport;\n this.agentAbortController = new AbortController();\n this.mcpAbortController = new AbortController();\n\n // appDirectory is the absolute path to the app directory\n this.appDirectory = params.appDirectory;\n this.rootDirectory = params.rootDirectory;\n\n this.locadexDirectory = path.resolve(this.rootDirectory, '.locadex');\n this.currentRunDir = path.resolve(\n this.locadexDirectory,\n 'runs',\n Date.now().toString()\n );\n fs.mkdirSync(this.currentRunDir, { recursive: true });\n\n this.config = getConfig(\n this.locadexDirectory,\n this.rootDirectory,\n this.appDirectory,\n params.options\n );\n logger.debugMessage(\n `Locadex loaded with config: ${JSON.stringify(this.config, null, 2)}`\n );\n\n createConfig(this.locadexDirectory, {\n batchSize: this.config.batchSize,\n maxConcurrency: this.config.maxConcurrency,\n matchingFiles: this.config.matchingFiles,\n timeout: this.config.timeout,\n });\n\n addToGitIgnore(this.rootDirectory, '.locadex/runs');\n\n this.maxConcurrency = this.config.maxConcurrency;\n this.batchSize = this.config.batchSize;\n this.timeout = this.config.timeout;\n this.mcpConfigPath = path.resolve(this.currentRunDir, 'mcp.json');\n this.filesStateFilePath = path.resolve(\n this.currentRunDir,\n 'files-state.json'\n );\n this.metadataFilePath = path.resolve(this.currentRunDir, 'metadata.json');\n this.logFile = path.resolve(this.currentRunDir, 'log.txt');\n this.lockFilePath = path.resolve(this.locadexDirectory, LOCKFILE_NAME);\n\n // Create files-state.json\n const filesState: FileEntry[] = [];\n fs.writeFileSync(\n this.filesStateFilePath,\n JSON.stringify(filesState, null, 2)\n );\n\n // Create metadata.json\n const metadata: LocadexRunMetadata = {\n createdAt: new Date().toISOString(),\n locadexVersion: JSON.parse(\n fs.readFileSync(fromPackageRoot('package.json'), 'utf8')\n ).version,\n workingDirectory: this.appDirectory,\n projectName: path.basename(this.appDirectory),\n transport: params.mcpTransport,\n tempDirectory: this.currentRunDir,\n nodeVersion: process.version,\n platform: process.platform,\n arch: process.arch,\n logFile: this.logFile,\n batchSize: this.config.batchSize,\n maxConcurrency: this.config.maxConcurrency,\n ...params.metadata,\n };\n fs.writeFileSync(this.metadataFilePath, JSON.stringify(metadata, null, 2));\n\n // Register cleanup with graceful shutdown\n gracefulShutdown.addHandler({\n name: 'locadex-manager-cleanup',\n handler: () => this.cleanup(),\n timeout: 3000,\n });\n }\n\n async startMcpServer() {\n if (this.mcpTransport === 'stdio') {\n mcpStdioConfig.mcpServers.locadex.env = {\n LOCADEX_FILES_STATE_FILE_PATH: this.filesStateFilePath,\n LOCADEX_LOG_FILE_PATH: this.logFile,\n LOCADEX_VERBOSE: logger.verbose ? 'true' : 'false',\n LOCADEX_DEBUG: logger.debug ? 'true' : 'false',\n };\n fs.writeFileSync(\n this.mcpConfigPath,\n JSON.stringify(mcpStdioConfig, null, 2)\n );\n logger.debugMessage(\n `Starting MCP server on stdio with config: ${JSON.stringify(\n mcpStdioConfig,\n null,\n 2\n )}`\n );\n } else {\n // First, search for an available port\n const port = await findAvailablePort(8888);\n mcpSseConfig.mcpServers.locadex.url = `http://localhost:${port}/sse`;\n fs.writeFileSync(\n this.mcpConfigPath,\n JSON.stringify(mcpSseConfig, null, 2)\n );\n\n logger.debugMessage(\n `Starting MCP server on port ${port} with config: ${JSON.stringify(\n mcpSseConfig,\n null,\n 2\n )}`\n );\n\n this.mcpProcess = spawn('node', [fromPackageRoot('dist/mcp.js')], {\n env: {\n ...process.env,\n LOCADEX_FILES_STATE_FILE_PATH: this.filesStateFilePath,\n LOCADEX_VERBOSE: logger.verbose ? 'true' : 'false',\n LOCADEX_DEBUG: logger.debug ? 'true' : 'false',\n LOCADEX_LOG_FILE_PATH: this.logFile,\n PORT: port.toString(),\n },\n stdio: ['ignore', 'inherit', 'inherit'],\n signal: this.mcpAbortController.signal,\n });\n\n this.mcpProcess.on('error', async (error) => {\n if (error.name === 'AbortError') {\n logger.debugMessage('MCP server was closed');\n } else {\n logger.error(`MCP server failed to start: ${error.message}`);\n await exit(1);\n }\n });\n\n this.mcpProcess.on('exit', async (code, signal) => {\n if (code !== 0 && code !== null) {\n logger.error(`MCP server exited with code ${code}`);\n await exit(code as 0 | 1);\n }\n if (signal) {\n logger.error(`MCP server was killed with signal ${signal}`);\n await exit(0);\n }\n });\n }\n }\n\n static getInstance(): LocadexManager {\n if (!LocadexManager.instance) {\n throw new Error('LocadexManager not initialized');\n }\n return LocadexManager.instance;\n }\n\n static initialize(params: {\n rootDirectory: string;\n appDirectory: string;\n mcpTransport: 'sse' | 'stdio';\n apiKey: string;\n metadata: Partial<LocadexRunMetadata>;\n cliOptions: CliOptions;\n options: Partial<LocadexConfig>;\n }): void {\n if (!LocadexManager.instance) {\n LocadexManager.instance = new LocadexManager(params);\n logger.initialize(params.cliOptions, LocadexManager.instance.logFile);\n\n logger.debugMessage(\n `Locadex loaded with config: ${JSON.stringify(\n LocadexManager.instance.config,\n null,\n 2\n )}`\n );\n LocadexManager.instance.startMcpServer();\n }\n }\n\n static reset(): void {\n if (LocadexManager.instance) {\n LocadexManager.instance.cleanup();\n LocadexManager.instance = undefined;\n }\n }\n\n createSingleAgent(\n id: string,\n options: ClaudeRunnerOptions\n ): ClaudeCodeRunner {\n return new ClaudeCodeRunner(this, this.agentAbortController, {\n apiKey: this.apiKey,\n mcpConfig: this.mcpConfigPath,\n softTurnLimit: options.softTurnLimit ?? this.defaultSoftTurnLimit,\n id,\n });\n }\n\n createAgentPool(options: ClaudeRunnerOptions): void {\n if (this.agentPool.size === 0) {\n for (let i = 0; i < this.maxConcurrency; i++) {\n const agentId = `claude_task_agent_${i + 1}`;\n this.agentPool.set(agentId, {\n agent: this.createSingleAgent(agentId, options),\n busy: false,\n });\n }\n }\n }\n\n async getAvailableAgent(): Promise<{\n id: string;\n agent: ClaudeCodeRunner;\n } | null> {\n return new Promise((resolve) => {\n this.agentMutex = this.agentMutex.then(() => {\n for (const [id, agentData] of this.agentPool) {\n if (!agentData.busy) {\n agentData.busy = true;\n resolve({\n id,\n agent: agentData.agent,\n });\n return;\n }\n }\n resolve(null);\n });\n });\n }\n\n markAgentFree(agentId: string): void {\n const agentData = this.agentPool.get(agentId);\n if (agentData) {\n agentData.busy = false;\n }\n }\n\n getAgentPool(): Map<\n string,\n { agent: ClaudeCodeRunner; sessionId?: string; busy: boolean }\n > {\n return this.agentPool;\n }\n\n cleanupAgents(): void {\n logger.debugMessage('Cleaning up all Claude Code agents and processes');\n\n // Abort all active processes\n this.agentAbortController.abort();\n\n // Mark agents as free\n for (const agentData of this.agentPool.values()) {\n agentData.busy = false;\n }\n\n // Clear the agent pool\n this.agentPool.clear();\n }\n\n getFilesStateFilePath(): string {\n return this.filesStateFilePath;\n }\n getMetadataFilePath(): string {\n return this.metadataFilePath;\n }\n getMaxConcurrency(): number {\n return this.maxConcurrency;\n }\n getBatchSize(): number {\n return this.batchSize;\n }\n getTimeoutFactor(): number {\n return this.timeout;\n }\n getConfig(): LocadexConfig {\n return this.config;\n }\n\n getLockFilePath(): string {\n return this.lockFilePath;\n }\n\n cleanup(): void {\n if (this.aborted) {\n return;\n }\n this.aborted = true;\n // Clean up agents first (if not already done)\n this.cleanupAgents();\n\n // Clean up MCP process using abort controller\n if (this.mcpProcess && !this.mcpProcess.killed) {\n logger.debugMessage('Terminating MCP process via abort controller');\n this.mcpAbortController.abort();\n\n // Give the process a moment to handle the abort signal gracefully\n setTimeout(() => {\n if (this.mcpProcess && !this.mcpProcess.killed) {\n logger.debugMessage('Force killing MCP process as fallback');\n this.mcpProcess.kill('SIGTERM');\n }\n }, 1000);\n }\n }\n\n getLogDirectory(): string {\n return this.currentRunDir;\n }\n\n getAgentAbortController(): AbortController {\n return this.agentAbortController;\n }\n\n isAborted(): boolean {\n return this.aborted;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "locadex",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "An AI agent for internationalization",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
|
-
"locadex": "dist/cli.js"
|
|
8
|
+
"locadex": "dist/cli.js",
|
|
9
|
+
"locadex-mcp": "dist/mcp-stdio.js"
|
|
9
10
|
},
|
|
10
11
|
"files": [
|
|
11
12
|
"dist",
|
|
@@ -23,7 +24,7 @@
|
|
|
23
24
|
"dependency-tree": "^11.1.1",
|
|
24
25
|
"dotenv": "^16.4.5",
|
|
25
26
|
"express": "^5.1.0",
|
|
26
|
-
"gtx-cli": "^1.2.
|
|
27
|
+
"gtx-cli": "^1.2.27",
|
|
27
28
|
"micromatch": "^4.0.8",
|
|
28
29
|
"posthog-node": "^4.18.0"
|
|
29
30
|
},
|