locadex 0.1.0-alpha.9 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +3 -5
  3. package/dist/cli.js +11 -10
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/i18n.d.ts.map +1 -1
  6. package/dist/commands/i18n.js +15 -14
  7. package/dist/commands/i18n.js.map +1 -1
  8. package/dist/commands/setup.d.ts.map +1 -1
  9. package/dist/commands/setup.js +15 -14
  10. package/dist/commands/setup.js.map +1 -1
  11. package/dist/index.js +1 -4
  12. package/dist/index.js.map +1 -1
  13. package/dist/logging/console.js +2 -5
  14. package/dist/logging/console.js.map +1 -1
  15. package/dist/logging/logger.d.ts +4 -2
  16. package/dist/logging/logger.d.ts.map +1 -1
  17. package/dist/logging/logger.js +1 -4
  18. package/dist/logging/logger.js.map +1 -1
  19. package/dist/mcp/getDocs.js +1 -4
  20. package/dist/mcp/getDocs.js.map +1 -1
  21. package/dist/mcp/getGuide.js +1 -4
  22. package/dist/mcp/getGuide.js.map +1 -1
  23. package/dist/mcp/getPort.js +1 -4
  24. package/dist/mcp/getPort.js.map +1 -1
  25. package/dist/mcp/tools/docs.js +1 -4
  26. package/dist/mcp/tools/docs.js.map +1 -1
  27. package/dist/mcp/tools/guides.js +1 -4
  28. package/dist/mcp/tools/guides.js.map +1 -1
  29. package/dist/mcp.d.ts +1 -1
  30. package/dist/mcp.d.ts.map +1 -1
  31. package/dist/mcp.js +56 -16
  32. package/dist/mcp.js.map +1 -1
  33. package/dist/prompts/system.js +1 -4
  34. package/dist/prompts/system.js.map +1 -1
  35. package/dist/tasks/concurrency.d.ts +72 -0
  36. package/dist/tasks/concurrency.d.ts.map +1 -0
  37. package/dist/tasks/concurrency.js +132 -0
  38. package/dist/tasks/concurrency.js.map +1 -0
  39. package/dist/tasks/i18n.d.ts.map +1 -1
  40. package/dist/tasks/i18n.js +60 -127
  41. package/dist/tasks/i18n.js.map +1 -1
  42. package/dist/tasks/setup.d.ts.map +1 -1
  43. package/dist/tasks/setup.js +40 -44
  44. package/dist/tasks/setup.js.map +1 -1
  45. package/dist/telemetry.js +1 -4
  46. package/dist/telemetry.js.map +1 -1
  47. package/dist/types/claude-sdk.d.ts +1 -1
  48. package/dist/types/claude-sdk.d.ts.map +1 -1
  49. package/dist/types/claude-sdk.js +1 -4
  50. package/dist/types/claude-sdk.js.map +1 -1
  51. package/dist/types/cli.d.ts +3 -0
  52. package/dist/types/cli.d.ts.map +1 -1
  53. package/dist/types/cli.js +1 -4
  54. package/dist/types/cli.js.map +1 -1
  55. package/dist/utils/claudeCode.d.ts +6 -5
  56. package/dist/utils/claudeCode.d.ts.map +1 -1
  57. package/dist/utils/claudeCode.js +50 -17
  58. package/dist/utils/claudeCode.js.map +1 -1
  59. package/dist/utils/config.d.ts +4 -3
  60. package/dist/utils/config.d.ts.map +1 -1
  61. package/dist/utils/config.js +33 -20
  62. package/dist/utils/config.js.map +1 -1
  63. package/dist/utils/dag/createDag.d.ts.map +1 -1
  64. package/dist/utils/dag/createDag.js +10 -11
  65. package/dist/utils/dag/createDag.js.map +1 -1
  66. package/dist/utils/dag/extractFiles.d.ts.map +1 -1
  67. package/dist/utils/dag/extractFiles.js +6 -9
  68. package/dist/utils/dag/extractFiles.js.map +1 -1
  69. package/dist/utils/dag/getFiles.d.ts +1 -12
  70. package/dist/utils/dag/getFiles.d.ts.map +1 -1
  71. package/dist/utils/dag/getFiles.js +5 -53
  72. package/dist/utils/dag/getFiles.js.map +1 -1
  73. package/dist/utils/dag/matchFiles.d.ts +2 -2
  74. package/dist/utils/dag/matchFiles.d.ts.map +1 -1
  75. package/dist/utils/dag/matchFiles.js +3 -6
  76. package/dist/utils/dag/matchFiles.js.map +1 -1
  77. package/dist/utils/fs/findConfigs.d.ts +4 -4
  78. package/dist/utils/fs/findConfigs.d.ts.map +1 -1
  79. package/dist/utils/fs/findConfigs.js +7 -13
  80. package/dist/utils/fs/findConfigs.js.map +1 -1
  81. package/dist/utils/fs/getFiles.d.ts +1 -1
  82. package/dist/utils/fs/getFiles.d.ts.map +1 -1
  83. package/dist/utils/fs/getFiles.js +3 -6
  84. package/dist/utils/fs/getFiles.js.map +1 -1
  85. package/dist/utils/fs/git.d.ts +6 -0
  86. package/dist/utils/fs/git.d.ts.map +1 -0
  87. package/dist/utils/fs/git.js +32 -0
  88. package/dist/utils/fs/git.js.map +1 -0
  89. package/dist/utils/fs/writeFiles.js +1 -4
  90. package/dist/utils/fs/writeFiles.js.map +1 -1
  91. package/dist/utils/getPaths.js +1 -4
  92. package/dist/utils/getPaths.js.map +1 -1
  93. package/dist/utils/locadexManager.d.ts +15 -5
  94. package/dist/utils/locadexManager.d.ts.map +1 -1
  95. package/dist/utils/locadexManager.js +80 -73
  96. package/dist/utils/locadexManager.js.map +1 -1
  97. package/dist/utils/lockfile.d.ts +2 -2
  98. package/dist/utils/lockfile.d.ts.map +1 -1
  99. package/dist/utils/lockfile.js +8 -17
  100. package/dist/utils/lockfile.js.map +1 -1
  101. package/dist/utils/packages/installPackage.d.ts +4 -0
  102. package/dist/utils/packages/installPackage.d.ts.map +1 -1
  103. package/dist/utils/packages/installPackage.js +41 -5
  104. package/dist/utils/packages/installPackage.js.map +1 -1
  105. package/dist/utils/session.js +1 -4
  106. package/dist/utils/session.js.map +1 -1
  107. package/dist/utils/shared.js +1 -4
  108. package/dist/utils/shared.js.map +1 -1
  109. package/dist/utils/shutdown.d.ts.map +1 -1
  110. package/dist/utils/shutdown.js +1 -9
  111. package/dist/utils/shutdown.js.map +1 -1
  112. package/dist/utils/stats.js +1 -4
  113. package/dist/utils/stats.js.map +1 -1
  114. package/guides/next/advanced/var-outside-client-server-component.md +1 -1
  115. package/package.json +4 -6
  116. package/dist/mcp/debugger.d.ts +0 -3
  117. package/dist/mcp/debugger.d.ts.map +0 -1
  118. package/dist/mcp/debugger.js +0 -37
  119. package/dist/mcp/debugger.js.map +0 -1
  120. package/dist/mcp-sse.d.ts +0 -3
  121. package/dist/mcp-sse.d.ts.map +0 -1
  122. package/dist/mcp-sse.js +0 -77
  123. package/dist/mcp-sse.js.map +0 -1
@@ -1,5 +1,3 @@
1
-
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="753d767d-b755-5567-ae1a-f45989169bc4")}catch(e){}}();
3
1
  import path, { dirname } from 'node:path';
4
2
  import { fileURLToPath } from 'node:url';
5
3
  import fs from 'node:fs';
@@ -19,5 +17,4 @@ export function getLocadexVersion() {
19
17
  return 'unknown';
20
18
  }
21
19
  }
22
- //# sourceMappingURL=getPaths.js.map
23
- //# debugId=753d767d-b755-5567-ae1a-f45989169bc4
20
+ //# sourceMappingURL=getPaths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getPaths.js","sources":["utils/getPaths.ts"],"sourceRoot":"/","sourcesContent":["import path, { dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport fs from 'node:fs';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nexport function fromPackageRoot(relative: string) {\n return path.resolve(__dirname, `../../`, relative);\n}\n\nexport function getLocadexVersion(): string {\n const packageJsonPath = fromPackageRoot('package.json');\n\n if (!fs.existsSync(packageJsonPath)) {\n return 'unknown';\n }\n try {\n return JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')).version;\n } catch (error) {\n return 'unknown';\n }\n}\n"],"names":[],"mappings":";;AAAA,OAAO,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,eAAe,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;IAExD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACtE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC","debug_id":"753d767d-b755-5567-ae1a-f45989169bc4"}
1
+ {"version":3,"file":"getPaths.js","sourceRoot":"/","sources":["utils/getPaths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,eAAe,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;IAExD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACtE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC","sourcesContent":["import path, { dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport fs from 'node:fs';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nexport function fromPackageRoot(relative: string) {\n return path.resolve(__dirname, `../../`, relative);\n}\n\nexport function getLocadexVersion(): string {\n const packageJsonPath = fromPackageRoot('package.json');\n\n if (!fs.existsSync(packageJsonPath)) {\n return 'unknown';\n }\n try {\n return JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')).version;\n } catch (error) {\n return 'unknown';\n }\n}\n"]}
@@ -24,14 +24,19 @@ export declare class LocadexManager {
24
24
  private filesStateFilePath;
25
25
  private metadataFilePath;
26
26
  private lockFilePath;
27
- private workingDir;
28
- private locadexDirectory;
27
+ private currentRunDir;
28
+ locadexDirectory: string;
29
+ appDirectory: string;
30
+ rootDirectory: string;
29
31
  private apiKey;
30
32
  private maxConcurrency;
31
33
  private batchSize;
34
+ private timeout;
35
+ private maxTurns;
32
36
  private agentPool;
33
37
  private agentAbortController;
34
38
  private mcpAbortController;
39
+ private aborted;
35
40
  private agentMutex;
36
41
  private config;
37
42
  stats: AgentStats;
@@ -40,6 +45,8 @@ export declare class LocadexManager {
40
45
  startMcpServer(): Promise<void>;
41
46
  static getInstance(): LocadexManager;
42
47
  static initialize(params: {
48
+ rootDirectory: string;
49
+ appDirectory: string;
43
50
  mcpTransport: 'sse' | 'stdio';
44
51
  apiKey: string;
45
52
  metadata: Partial<LocadexRunMetadata>;
@@ -47,12 +54,13 @@ export declare class LocadexManager {
47
54
  options: Partial<LocadexConfig>;
48
55
  }): void;
49
56
  static reset(): void;
50
- createSingleAgent(id: string): ClaudeCodeRunner;
57
+ createSingleAgent(id: string, options?: {
58
+ maxTurns?: number;
59
+ }): ClaudeCodeRunner;
51
60
  createAgentPool(): void;
52
61
  getAvailableAgent(): Promise<{
53
62
  id: string;
54
63
  agent: ClaudeCodeRunner;
55
- sessionId?: string;
56
64
  } | null>;
57
65
  markAgentFree(agentId: string): void;
58
66
  getAgentPool(): Map<string, {
@@ -65,10 +73,12 @@ export declare class LocadexManager {
65
73
  getMetadataFilePath(): string;
66
74
  getMaxConcurrency(): number;
67
75
  getBatchSize(): number;
76
+ getTimeoutFactor(): number;
68
77
  getConfig(): LocadexConfig;
69
78
  getLockFilePath(): string;
70
79
  cleanup(): void;
71
- getWorkingDir(): string;
80
+ getLogDirectory(): string;
72
81
  getAgentAbortController(): AbortController;
82
+ isAborted(): boolean;
73
83
  }
74
84
  //# sourceMappingURL=locadexManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"locadexManager.d.ts","sourceRoot":"/","sources":["utils/locadexManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAUnD,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;AAoBD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6B;IACpD,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAGf;IACF,OAAO,CAAC,oBAAoB,CAAkB;IAC9C,OAAO,CAAC,kBAAkB,CAAkB;IAC5C,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,MAAM,CAAgB;IAC9B,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAEhB,OAAO;IA2ED,cAAc;IAsDpB,MAAM,CAAC,WAAW,IAAI,cAAc;IAOpC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE;QACxB,YAAY,EAAE,KAAK,GAAG,OAAO,CAAC;QAC9B,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACtC,UAAU,EAAE,UAAU,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;KACjC,GAAG,IAAI;IAgBR,MAAM,CAAC,KAAK,IAAI,IAAI;IAOpB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB;IAQ/C,eAAe,IAAI,IAAI;IAajB,iBAAiB,IAAI,OAAO,CAAC;QACjC,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,gBAAgB,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;IAmBT,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOpC,YAAY,IAAI,GAAG,CACjB,MAAM,EACN;QAAE,KAAK,EAAE,gBAAgB,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAC/D;IAID,aAAa,IAAI,IAAI;IAerB,qBAAqB,IAAI,MAAM;IAG/B,mBAAmB,IAAI,MAAM;IAG7B,iBAAiB,IAAI,MAAM;IAG3B,YAAY,IAAI,MAAM;IAGtB,SAAS,IAAI,aAAa;IAI1B,eAAe,IAAI,MAAM;IAIzB,OAAO,IAAI,IAAI;IAmBf,aAAa,IAAI,MAAM;IAIvB,uBAAuB,IAAI,eAAe;CAG3C"}
1
+ {"version":3,"file":"locadexManager.d.ts","sourceRoot":"/","sources":["utils/locadexManager.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,3 @@
1
-
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="0f14c435-6150-5211-9dbd-d86fc0f35244")}catch(e){}}();
3
1
  import { ClaudeCodeRunner } from './claudeCode.js';
4
2
  import { fromPackageRoot } from './getPaths.js';
5
3
  import fs from 'node:fs';
@@ -13,15 +11,6 @@ import { findAvailablePort } from '../mcp/getPort.js';
13
11
  import { createConfig, getConfig } from './config.js';
14
12
  import { gracefulShutdown, exit } from './shutdown.js';
15
13
  import { LOCKFILE_NAME } from './lockfile.js';
16
- const mcpStdioConfig = {
17
- mcpServers: {
18
- locadex: {
19
- command: 'npx',
20
- args: ['locadex-mcp'],
21
- env: {},
22
- },
23
- },
24
- };
25
14
  const mcpSseConfig = {
26
15
  mcpServers: {
27
16
  locadex: {
@@ -34,18 +23,28 @@ export class LocadexManager {
34
23
  static instance;
35
24
  mcpProcess;
36
25
  mcpTransport;
26
+ // Paths
37
27
  mcpConfigPath;
38
28
  filesStateFilePath;
39
29
  metadataFilePath;
40
30
  lockFilePath;
41
- workingDir;
31
+ currentRunDir;
42
32
  locadexDirectory;
33
+ appDirectory;
34
+ rootDirectory;
35
+ // Config
43
36
  apiKey;
44
37
  maxConcurrency;
45
38
  batchSize;
39
+ timeout;
40
+ maxTurns = 100;
41
+ // Agent pool
46
42
  agentPool;
43
+ // Abort controllers
47
44
  agentAbortController;
48
45
  mcpAbortController;
46
+ aborted = false;
47
+ // State
49
48
  agentMutex = Promise.resolve();
50
49
  config;
51
50
  stats;
@@ -57,23 +56,28 @@ export class LocadexManager {
57
56
  this.mcpTransport = params.mcpTransport;
58
57
  this.agentAbortController = new AbortController();
59
58
  this.mcpAbortController = new AbortController();
60
- const cwd = process.cwd();
61
- this.locadexDirectory = path.resolve(cwd, '.locadex');
62
- this.workingDir = path.resolve(this.locadexDirectory, 'runs', Date.now().toString());
63
- fs.mkdirSync(this.workingDir, { recursive: true });
64
- this.config = getConfig(this.locadexDirectory, params.options);
59
+ // appDirectory is the absolute path to the app directory
60
+ this.appDirectory = params.appDirectory;
61
+ this.rootDirectory = params.rootDirectory;
62
+ this.locadexDirectory = path.resolve(this.rootDirectory, '.locadex');
63
+ this.currentRunDir = path.resolve(this.locadexDirectory, 'runs', Date.now().toString());
64
+ fs.mkdirSync(this.currentRunDir, { recursive: true });
65
+ this.config = getConfig(this.locadexDirectory, this.rootDirectory, this.appDirectory, params.options);
66
+ logger.debugMessage(`Locadex loaded with config: ${JSON.stringify(this.config, null, 2)}`);
65
67
  createConfig(this.locadexDirectory, {
66
68
  batchSize: this.config.batchSize,
67
69
  maxConcurrency: this.config.maxConcurrency,
68
70
  matchingFiles: this.config.matchingFiles,
71
+ timeout: this.config.timeout,
69
72
  });
70
- addToGitIgnore(cwd, '.locadex/runs');
73
+ addToGitIgnore(this.rootDirectory, '.locadex/runs');
71
74
  this.maxConcurrency = this.config.maxConcurrency;
72
75
  this.batchSize = this.config.batchSize;
73
- this.mcpConfigPath = path.resolve(this.workingDir, 'mcp.json');
74
- this.filesStateFilePath = path.resolve(this.workingDir, 'files-state.json');
75
- this.metadataFilePath = path.resolve(this.workingDir, 'metadata.json');
76
- this.logFile = path.resolve(this.workingDir, 'log.txt');
76
+ this.timeout = this.config.timeout;
77
+ this.mcpConfigPath = path.resolve(this.currentRunDir, 'mcp.json');
78
+ this.filesStateFilePath = path.resolve(this.currentRunDir, 'files-state.json');
79
+ this.metadataFilePath = path.resolve(this.currentRunDir, 'metadata.json');
80
+ this.logFile = path.resolve(this.currentRunDir, 'log.txt');
77
81
  this.lockFilePath = path.resolve(this.locadexDirectory, LOCKFILE_NAME);
78
82
  // Create files-state.json
79
83
  const filesState = [];
@@ -82,10 +86,10 @@ export class LocadexManager {
82
86
  const metadata = {
83
87
  createdAt: new Date().toISOString(),
84
88
  locadexVersion: JSON.parse(fs.readFileSync(fromPackageRoot('package.json'), 'utf8')).version,
85
- workingDirectory: cwd,
86
- projectName: path.basename(cwd),
89
+ workingDirectory: this.appDirectory,
90
+ projectName: path.basename(this.appDirectory),
87
91
  transport: params.mcpTransport,
88
- tempDirectory: this.workingDir,
92
+ tempDirectory: this.currentRunDir,
89
93
  nodeVersion: process.version,
90
94
  platform: process.platform,
91
95
  arch: process.arch,
@@ -104,49 +108,44 @@ export class LocadexManager {
104
108
  }
105
109
  async startMcpServer() {
106
110
  if (this.mcpTransport === 'stdio') {
107
- mcpStdioConfig.mcpServers.locadex.env = {
111
+ return;
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,
108
121
  LOCADEX_FILES_STATE_FILE_PATH: this.filesStateFilePath,
122
+ LOCADEX_VERBOSE: logger.verbose ? 'true' : 'false',
123
+ LOCADEX_DEBUG: logger.debug ? 'true' : 'false',
109
124
  LOCADEX_LOG_FILE_PATH: this.logFile,
110
- };
111
- fs.writeFileSync(this.mcpConfigPath, JSON.stringify(mcpStdioConfig, null, 2));
112
- }
113
- else {
114
- // First, search for an available port
115
- const port = await findAvailablePort(8888);
116
- mcpSseConfig.mcpServers.locadex.url = `http://localhost:${port}/sse`;
117
- fs.writeFileSync(this.mcpConfigPath, JSON.stringify(mcpSseConfig, null, 2));
118
- this.mcpProcess = spawn('node', [fromPackageRoot('dist/mcp-sse.js')], {
119
- env: {
120
- ...process.env,
121
- LOCADEX_FILES_STATE_FILE_PATH: this.filesStateFilePath,
122
- LOCADEX_VERBOSE: logger.verbose ? 'true' : 'false',
123
- LOCADEX_DEBUG: logger.debug ? 'true' : 'false',
124
- LOCADEX_LOG_FILE_PATH: this.logFile,
125
- PORT: port.toString(),
126
- },
127
- stdio: ['ignore', 'inherit', 'inherit'],
128
- signal: this.mcpAbortController.signal,
129
- });
130
- this.mcpProcess.on('error', async (error) => {
131
- if (error.name === 'AbortError') {
132
- logger.debugMessage('MCP server was closed');
133
- }
134
- else {
135
- logger.error(`MCP server failed to start: ${error.message}`);
136
- await exit(1);
137
- }
138
- });
139
- this.mcpProcess.on('exit', async (code, signal) => {
140
- if (code !== 0 && code !== null) {
141
- logger.error(`MCP server exited with code ${code}`);
142
- await exit(code);
143
- }
144
- if (signal) {
145
- logger.error(`MCP server was killed with signal ${signal}`);
146
- await exit(0);
147
- }
148
- });
149
- }
125
+ PORT: port.toString(),
126
+ },
127
+ stdio: ['ignore', 'inherit', 'inherit'],
128
+ signal: this.mcpAbortController.signal,
129
+ });
130
+ this.mcpProcess.on('error', async (error) => {
131
+ if (error.name === 'AbortError') {
132
+ logger.debugMessage('MCP server was closed');
133
+ }
134
+ else {
135
+ logger.error(`MCP server failed to start: ${error.message}`);
136
+ await exit(1);
137
+ }
138
+ });
139
+ this.mcpProcess.on('exit', async (code, signal) => {
140
+ if (code !== 0 && code !== null) {
141
+ logger.error(`MCP server exited with code ${code}`);
142
+ await exit(code);
143
+ }
144
+ if (signal) {
145
+ logger.error(`MCP server was killed with signal ${signal}`);
146
+ await exit(0);
147
+ }
148
+ });
150
149
  }
151
150
  static getInstance() {
152
151
  if (!LocadexManager.instance) {
@@ -168,10 +167,11 @@ export class LocadexManager {
168
167
  LocadexManager.instance = undefined;
169
168
  }
170
169
  }
171
- createSingleAgent(id) {
170
+ createSingleAgent(id, options = {}) {
172
171
  return new ClaudeCodeRunner(this, this.agentAbortController, {
173
172
  apiKey: this.apiKey,
174
173
  mcpConfig: this.mcpConfigPath,
174
+ maxTurns: this.maxTurns,
175
175
  id,
176
176
  });
177
177
  }
@@ -181,7 +181,6 @@ export class LocadexManager {
181
181
  const agentId = `claude_task_agent_${i + 1}`;
182
182
  this.agentPool.set(agentId, {
183
183
  agent: this.createSingleAgent(agentId),
184
- sessionId: undefined,
185
184
  busy: false,
186
185
  });
187
186
  }
@@ -196,7 +195,6 @@ export class LocadexManager {
196
195
  resolve({
197
196
  id,
198
197
  agent: agentData.agent,
199
- sessionId: agentData.sessionId,
200
198
  });
201
199
  return;
202
200
  }
@@ -237,6 +235,9 @@ export class LocadexManager {
237
235
  getBatchSize() {
238
236
  return this.batchSize;
239
237
  }
238
+ getTimeoutFactor() {
239
+ return this.timeout;
240
+ }
240
241
  getConfig() {
241
242
  return this.config;
242
243
  }
@@ -244,6 +245,10 @@ export class LocadexManager {
244
245
  return this.lockFilePath;
245
246
  }
246
247
  cleanup() {
248
+ if (this.aborted) {
249
+ return;
250
+ }
251
+ this.aborted = true;
247
252
  // Clean up agents first (if not already done)
248
253
  this.cleanupAgents();
249
254
  // Clean up MCP process using abort controller
@@ -259,12 +264,14 @@ export class LocadexManager {
259
264
  }, 1000);
260
265
  }
261
266
  }
262
- getWorkingDir() {
263
- return this.workingDir;
267
+ getLogDirectory() {
268
+ return this.currentRunDir;
264
269
  }
265
270
  getAgentAbortController() {
266
271
  return this.agentAbortController;
267
272
  }
273
+ isAborted() {
274
+ return this.aborted;
275
+ }
268
276
  }
269
- //# sourceMappingURL=locadexManager.js.map
270
- //# debugId=0f14c435-6150-5211-9dbd-d86fc0f35244
277
+ //# sourceMappingURL=locadexManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"locadexManager.js","sources":["utils/locadexManager.ts"],"sourceRoot":"/","sourcesContent":["import { ClaudeCodeRunner } 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 mcpStdioConfig = {\n mcpServers: {\n locadex: {\n command: 'npx',\n args: ['locadex-mcp'],\n env: {},\n },\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 private mcpConfigPath: string;\n private filesStateFilePath: string;\n private metadataFilePath: string;\n private lockFilePath: string;\n private workingDir: string;\n private locadexDirectory: string;\n private apiKey: string;\n private maxConcurrency: number;\n private batchSize: number;\n private agentPool: Map<\n string,\n { agent: ClaudeCodeRunner; sessionId?: string; busy: boolean }\n >;\n private agentAbortController: AbortController;\n private mcpAbortController: AbortController;\n private agentMutex = Promise.resolve();\n private config: LocadexConfig;\n stats: AgentStats;\n logFile: string;\n\n private constructor(params: {\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 const cwd = process.cwd();\n this.locadexDirectory = path.resolve(cwd, '.locadex');\n this.workingDir = path.resolve(\n this.locadexDirectory,\n 'runs',\n Date.now().toString()\n );\n fs.mkdirSync(this.workingDir, { recursive: true });\n\n this.config = getConfig(this.locadexDirectory, params.options);\n\n createConfig(this.locadexDirectory, {\n batchSize: this.config.batchSize,\n maxConcurrency: this.config.maxConcurrency,\n matchingFiles: this.config.matchingFiles,\n });\n\n addToGitIgnore(cwd, '.locadex/runs');\n\n this.maxConcurrency = this.config.maxConcurrency;\n this.batchSize = this.config.batchSize;\n this.mcpConfigPath = path.resolve(this.workingDir, 'mcp.json');\n this.filesStateFilePath = path.resolve(this.workingDir, 'files-state.json');\n this.metadataFilePath = path.resolve(this.workingDir, 'metadata.json');\n this.logFile = path.resolve(this.workingDir, '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: cwd,\n projectName: path.basename(cwd),\n transport: params.mcpTransport,\n tempDirectory: this.workingDir,\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 };\n fs.writeFileSync(\n this.mcpConfigPath,\n JSON.stringify(mcpStdioConfig, null, 2)\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 this.mcpProcess = spawn('node', [fromPackageRoot('dist/mcp-sse.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 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(id: string): ClaudeCodeRunner {\n return new ClaudeCodeRunner(this, this.agentAbortController, {\n apiKey: this.apiKey,\n mcpConfig: this.mcpConfigPath,\n id,\n });\n }\n\n createAgentPool(): 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),\n sessionId: undefined,\n busy: false,\n });\n }\n }\n }\n\n async getAvailableAgent(): Promise<{\n id: string;\n agent: ClaudeCodeRunner;\n sessionId?: string;\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 sessionId: agentData.sessionId,\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 getConfig(): LocadexConfig {\n return this.config;\n }\n\n getLockFilePath(): string {\n return this.lockFilePath;\n }\n\n cleanup(): void {\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 getWorkingDir(): string {\n return this.workingDir;\n }\n\n getAgentAbortController(): AbortController {\n return this.agentAbortController;\n }\n}\n"],"names":[],"mappings":"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","debug_id":"0f14c435-6150-5211-9dbd-d86fc0f35244"}
1
+ {"version":3,"file":"locadexManager.js","sourceRoot":"/","sources":["utils/locadexManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { ClaudeCodeRunner } 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 maxTurns: 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: { maxTurns?: number } = {}\n ): ClaudeCodeRunner {\n return new ClaudeCodeRunner(this, this.agentAbortController, {\n apiKey: this.apiKey,\n mcpConfig: this.mcpConfigPath,\n maxTurns: this.maxTurns,\n id,\n });\n }\n\n createAgentPool(): 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),\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"]}
@@ -13,6 +13,6 @@ export declare function calculateFileHash(filePath: string): string;
13
13
  export declare function loadLockfile(lockfilePath: string): Lockfile;
14
14
  export declare function saveLockfile(lockfilePath: string, lockfile: Lockfile): void;
15
15
  export declare function getChangedFiles(files: string[], lockfilePath: string): string[];
16
- export declare function updateLockfile(files: string[], lockfilePath: string): void;
17
- export declare function cleanupLockfile(allCurrentFiles: string[], lockfilePath: string): void;
16
+ export declare function updateLockfile(files: string[], lockfilePath: string, rootDirectory: string): void;
17
+ export declare function cleanupLockfile(lockfilePath: string, rootDirectory: string): void;
18
18
  //# sourceMappingURL=lockfile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lockfile.d.ts","sourceRoot":"/","sources":["utils/lockfile.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,gBAAgB,UAAU,CAAC;AACxC,eAAO,MAAM,aAAa,sBAAsB,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQ1D;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,QAAQ,CAoB3D;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAO3E;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EAAE,EACf,YAAY,EAAE,MAAM,GACnB,MAAM,EAAE,CA2BV;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAqB1E;AAED,wBAAgB,eAAe,CAC7B,eAAe,EAAE,MAAM,EAAE,EACzB,YAAY,EAAE,MAAM,GACnB,IAAI,CA2BN"}
1
+ {"version":3,"file":"lockfile.d.ts","sourceRoot":"/","sources":["utils/lockfile.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,gBAAgB,UAAU,CAAC;AACxC,eAAO,MAAM,aAAa,sBAAsB,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQ1D;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,QAAQ,CAoB3D;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAO3E;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EAAE,EACf,YAAY,EAAE,MAAM,GACnB,MAAM,EAAE,CA2BV;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EAAE,EACf,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,IAAI,CAqBN;AAED,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,IAAI,CAqBN"}
@@ -1,5 +1,3 @@
1
-
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="7233a21e-332f-5d17-8e64-dc2f3e253ed1")}catch(e){}}();
3
1
  import crypto from 'node:crypto';
4
2
  import fs from 'node:fs';
5
3
  import path from 'node:path';
@@ -66,10 +64,10 @@ export function getChangedFiles(files, lockfilePath) {
66
64
  logger.debugMessage(`Found ${changedFiles.length} changed files out of ${files.length} total files`);
67
65
  return changedFiles;
68
66
  }
69
- export function updateLockfile(files, lockfilePath) {
67
+ export function updateLockfile(files, lockfilePath, rootDirectory) {
70
68
  const lockfile = loadLockfile(lockfilePath);
71
69
  for (const filePath of files) {
72
- const relativePath = path.relative(process.cwd(), filePath);
70
+ const relativePath = path.relative(rootDirectory, filePath);
73
71
  const currentHash = calculateFileHash(filePath);
74
72
  if (!currentHash) {
75
73
  continue;
@@ -84,20 +82,14 @@ export function updateLockfile(files, lockfilePath) {
84
82
  saveLockfile(lockfilePath, lockfile);
85
83
  logger.debugMessage(`Updated lockfile with ${files.length} files`);
86
84
  }
87
- export function cleanupLockfile(allCurrentFiles, lockfilePath) {
85
+ export function cleanupLockfile(lockfilePath, rootDirectory) {
88
86
  const lockfile = loadLockfile(lockfilePath);
89
- const currentHashes = new Set();
90
- // Calculate hashes for all current files
91
- for (const filePath of allCurrentFiles) {
92
- const hash = calculateFileHash(filePath);
93
- if (hash) {
94
- currentHashes.add(hash);
95
- }
96
- }
97
- // Remove entries for content that no longer exists
87
+ // Remove entries for files that no longer exist
98
88
  let removedCount = 0;
99
89
  for (const hash in lockfile.checksums) {
100
- if (!currentHashes.has(hash)) {
90
+ const entry = lockfile.checksums[hash];
91
+ const absolutePath = path.resolve(rootDirectory, entry.path);
92
+ if (!fs.existsSync(absolutePath)) {
101
93
  delete lockfile.checksums[hash];
102
94
  removedCount++;
103
95
  }
@@ -107,5 +99,4 @@ export function cleanupLockfile(allCurrentFiles, lockfilePath) {
107
99
  logger.debugMessage(`Cleaned up ${removedCount} stale entries from lockfile`);
108
100
  }
109
101
  }
110
- //# sourceMappingURL=lockfile.js.map
111
- //# debugId=7233a21e-332f-5d17-8e64-dc2f3e253ed1
102
+ //# sourceMappingURL=lockfile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lockfile.js","sources":["utils/lockfile.ts"],"sourceRoot":"/","sourcesContent":["import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { logger } from '../logging/logger.js';\n\nexport const LOCKFILE_VERSION = '1.0.0';\nexport const LOCKFILE_NAME = 'locadex-lock.json';\n\nexport interface LockfileEntry {\n path: string;\n lastModified: number;\n}\n\nexport interface Lockfile {\n checksums: Record<string, LockfileEntry>; // checksum -> entry mapping\n version: string;\n updatedAt: string;\n}\n\nexport function calculateFileHash(filePath: string): string {\n try {\n const content = fs.readFileSync(filePath, 'utf8');\n return crypto.createHash('md5').update(content).digest('hex');\n } catch (error) {\n logger.debugMessage(`Failed to calculate hash for ${filePath}: ${error}`);\n return '';\n }\n}\n\nexport function loadLockfile(lockfilePath: string): Lockfile {\n try {\n if (!fs.existsSync(lockfilePath)) {\n return {\n checksums: {},\n version: '1.0.0',\n updatedAt: new Date().toISOString(),\n };\n }\n\n const content = fs.readFileSync(lockfilePath, 'utf8');\n return JSON.parse(content);\n } catch (error) {\n logger.debugMessage(`Failed to load lockfile ${lockfilePath}: ${error}`);\n return {\n checksums: {},\n version: '1.0.0',\n updatedAt: new Date().toISOString(),\n };\n }\n}\n\nexport function saveLockfile(lockfilePath: string, lockfile: Lockfile): void {\n try {\n lockfile.updatedAt = new Date().toISOString();\n fs.writeFileSync(lockfilePath, JSON.stringify(lockfile, null, 2));\n } catch (error) {\n logger.debugMessage(`Failed to save lockfile ${lockfilePath}: ${error}`);\n }\n}\n\nexport function getChangedFiles(\n files: string[],\n lockfilePath: string\n): string[] {\n const lockfile = loadLockfile(lockfilePath);\n const changedFiles: string[] = [];\n\n for (const filePath of files) {\n const currentHash = calculateFileHash(filePath);\n\n if (!currentHash) {\n // Skip files that can't be hashed (likely don't exist or can't be read)\n continue;\n }\n\n // Check if this content hash exists in the lockfile\n const lockfileEntry = lockfile.checksums[currentHash];\n\n if (!lockfileEntry) {\n // Content hash not found, this is new or changed content\n changedFiles.push(filePath);\n }\n // If hash exists, content hasn't changed regardless of file path\n }\n\n logger.debugMessage(\n `Found ${changedFiles.length} changed files out of ${files.length} total files`\n );\n\n return changedFiles;\n}\n\nexport function updateLockfile(files: string[], lockfilePath: string): void {\n const lockfile = loadLockfile(lockfilePath);\n\n for (const filePath of files) {\n const relativePath = path.relative(process.cwd(), filePath);\n const currentHash = calculateFileHash(filePath);\n\n if (!currentHash) {\n continue;\n }\n\n const stats = fs.statSync(filePath);\n // Use hash as key, store current path and metadata\n lockfile.checksums[currentHash] = {\n path: relativePath,\n lastModified: stats.mtime.getTime(),\n };\n }\n\n saveLockfile(lockfilePath, lockfile);\n logger.debugMessage(`Updated lockfile with ${files.length} files`);\n}\n\nexport function cleanupLockfile(\n allCurrentFiles: string[],\n lockfilePath: string\n): void {\n const lockfile = loadLockfile(lockfilePath);\n const currentHashes = new Set<string>();\n\n // Calculate hashes for all current files\n for (const filePath of allCurrentFiles) {\n const hash = calculateFileHash(filePath);\n if (hash) {\n currentHashes.add(hash);\n }\n }\n\n // Remove entries for content that no longer exists\n let removedCount = 0;\n for (const hash in lockfile.checksums) {\n if (!currentHashes.has(hash)) {\n delete lockfile.checksums[hash];\n removedCount++;\n }\n }\n\n if (removedCount > 0) {\n saveLockfile(lockfilePath, lockfile);\n logger.debugMessage(\n `Cleaned up ${removedCount} stale entries from lockfile`\n );\n }\n}\n"],"names":[],"mappings":";;AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACxC,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAajD,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClD,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,YAAY,CAAC,gCAAgC,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;QAC1E,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,YAAoB;IAC/C,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,OAAO;gBACL,SAAS,EAAE,EAAE;gBACb,OAAO,EAAE,OAAO;gBAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,YAAY,CAAC,2BAA2B,YAAY,KAAK,KAAK,EAAE,CAAC,CAAC;QACzE,OAAO;YACL,SAAS,EAAE,EAAE;YACb,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,YAAoB,EAAE,QAAkB;IACnE,IAAI,CAAC;QACH,QAAQ,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC9C,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,YAAY,CAAC,2BAA2B,YAAY,KAAK,KAAK,EAAE,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAe,EACf,YAAoB;IAEpB,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,wEAAwE;YACxE,SAAS;QACX,CAAC;QAED,oDAAoD;QACpD,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAEtD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,yDAAyD;YACzD,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QACD,iEAAiE;IACnE,CAAC;IAED,MAAM,CAAC,YAAY,CACjB,SAAS,YAAY,CAAC,MAAM,yBAAyB,KAAK,CAAC,MAAM,cAAc,CAChF,CAAC;IAEF,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAe,EAAE,YAAoB;IAClE,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAE5C,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACpC,mDAAmD;QACnD,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG;YAChC,IAAI,EAAE,YAAY;YAClB,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE;SACpC,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACrC,MAAM,CAAC,YAAY,CAAC,yBAAyB,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,eAAyB,EACzB,YAAoB;IAEpB,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,yCAAyC;IACzC,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,IAAI,EAAE,CAAC;YACT,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACtC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAChC,YAAY,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,YAAY,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACrC,MAAM,CAAC,YAAY,CACjB,cAAc,YAAY,8BAA8B,CACzD,CAAC;IACJ,CAAC;AACH,CAAC","debug_id":"7233a21e-332f-5d17-8e64-dc2f3e253ed1"}
1
+ {"version":3,"file":"lockfile.js","sourceRoot":"/","sources":["utils/lockfile.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { logger } from '../logging/logger.js';\n\nexport const LOCKFILE_VERSION = '1.0.0';\nexport const LOCKFILE_NAME = 'locadex-lock.json';\n\nexport interface LockfileEntry {\n path: string;\n lastModified: number;\n}\n\nexport interface Lockfile {\n checksums: Record<string, LockfileEntry>; // checksum -> entry mapping\n version: string;\n updatedAt: string;\n}\n\nexport function calculateFileHash(filePath: string): string {\n try {\n const content = fs.readFileSync(filePath, 'utf8');\n return crypto.createHash('md5').update(content).digest('hex');\n } catch (error) {\n logger.debugMessage(`Failed to calculate hash for ${filePath}: ${error}`);\n return '';\n }\n}\n\nexport function loadLockfile(lockfilePath: string): Lockfile {\n try {\n if (!fs.existsSync(lockfilePath)) {\n return {\n checksums: {},\n version: '1.0.0',\n updatedAt: new Date().toISOString(),\n };\n }\n\n const content = fs.readFileSync(lockfilePath, 'utf8');\n return JSON.parse(content);\n } catch (error) {\n logger.debugMessage(`Failed to load lockfile ${lockfilePath}: ${error}`);\n return {\n checksums: {},\n version: '1.0.0',\n updatedAt: new Date().toISOString(),\n };\n }\n}\n\nexport function saveLockfile(lockfilePath: string, lockfile: Lockfile): void {\n try {\n lockfile.updatedAt = new Date().toISOString();\n fs.writeFileSync(lockfilePath, JSON.stringify(lockfile, null, 2));\n } catch (error) {\n logger.debugMessage(`Failed to save lockfile ${lockfilePath}: ${error}`);\n }\n}\n\nexport function getChangedFiles(\n files: string[],\n lockfilePath: string\n): string[] {\n const lockfile = loadLockfile(lockfilePath);\n const changedFiles: string[] = [];\n\n for (const filePath of files) {\n const currentHash = calculateFileHash(filePath);\n\n if (!currentHash) {\n // Skip files that can't be hashed (likely don't exist or can't be read)\n continue;\n }\n\n // Check if this content hash exists in the lockfile\n const lockfileEntry = lockfile.checksums[currentHash];\n\n if (!lockfileEntry) {\n // Content hash not found, this is new or changed content\n changedFiles.push(filePath);\n }\n // If hash exists, content hasn't changed regardless of file path\n }\n\n logger.debugMessage(\n `Found ${changedFiles.length} changed files out of ${files.length} total files`\n );\n\n return changedFiles;\n}\n\nexport function updateLockfile(\n files: string[],\n lockfilePath: string,\n rootDirectory: string\n): void {\n const lockfile = loadLockfile(lockfilePath);\n\n for (const filePath of files) {\n const relativePath = path.relative(rootDirectory, filePath);\n const currentHash = calculateFileHash(filePath);\n\n if (!currentHash) {\n continue;\n }\n\n const stats = fs.statSync(filePath);\n // Use hash as key, store current path and metadata\n lockfile.checksums[currentHash] = {\n path: relativePath,\n lastModified: stats.mtime.getTime(),\n };\n }\n\n saveLockfile(lockfilePath, lockfile);\n logger.debugMessage(`Updated lockfile with ${files.length} files`);\n}\n\nexport function cleanupLockfile(\n lockfilePath: string,\n rootDirectory: string\n): void {\n const lockfile = loadLockfile(lockfilePath);\n\n // Remove entries for files that no longer exist\n let removedCount = 0;\n for (const hash in lockfile.checksums) {\n const entry = lockfile.checksums[hash];\n const absolutePath = path.resolve(rootDirectory, entry.path);\n\n if (!fs.existsSync(absolutePath)) {\n delete lockfile.checksums[hash];\n removedCount++;\n }\n }\n\n if (removedCount > 0) {\n saveLockfile(lockfilePath, lockfile);\n logger.debugMessage(\n `Cleaned up ${removedCount} stale entries from lockfile`\n );\n }\n}\n"]}
@@ -1,2 +1,6 @@
1
+ import { PackageManager } from 'gtx-cli/utils/packageManager';
2
+ import { LocadexManager } from '../locadexManager.js';
1
3
  export declare function installClaudeCode(): Promise<void>;
4
+ export declare function addTranslateScript(manager: LocadexManager, packageJson: Record<string, any>, packageManager: PackageManager): Promise<void>;
5
+ export declare function installLocadex(manager: LocadexManager): Promise<void>;
2
6
  //# sourceMappingURL=installPackage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"installPackage.d.ts","sourceRoot":"/","sources":["utils/packages/installPackage.ts"],"names":[],"mappings":"AAQA,wBAAsB,iBAAiB,kBAqBtC"}
1
+ {"version":3,"file":"installPackage.d.ts","sourceRoot":"/","sources":["utils/packages/installPackage.ts"],"names":[],"mappings":"AAUA,OAAO,EAEL,cAAc,EACf,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,wBAAsB,iBAAiB,kBAqBtC;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAChC,cAAc,EAAE,cAAc,iBAsC/B;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,iBAQ3D"}