locadex 0.1.0-alpha.9 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/CHANGELOG.md +12 -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 +57 -17
  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 +38 -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 +1 @@
1
- {"version":3,"file":"setup.js","sources":["tasks/setup.ts"],"sourceRoot":"/","sourcesContent":["import { createSpinner, promptConfirm } from '../logging/console.js';\nimport { getPackageJson, isPackageInstalled } from 'gtx-cli/utils/packageJson';\nimport { getPackageManager } from 'gtx-cli/utils/packageManager';\nimport { installPackage } from 'gtx-cli/utils/installPackage';\nimport chalk from 'chalk';\nimport { logger } from '../logging/logger.js';\nimport { findFilepaths } from '../utils/fs/findConfigs.js';\nimport { wrapContentNext } from 'gtx-cli/next/parse/wrapContent';\nimport { handleInitGT } from 'gtx-cli/next/parse/handleInitGT';\nimport { detectFormatter, formatFiles } from 'gtx-cli/hooks/postProcess';\nimport { createOrUpdateConfig } from 'gtx-cli/fs/config/setupConfig';\nimport { i18nTask } from '../tasks/i18n.js';\nimport { validateInitialConfig } from '../utils/config.js';\nimport { getNextDirectories } from '../utils/fs/getFiles.js';\nimport { LocadexManager } from '../utils/locadexManager.js';\nimport { outro } from '@clack/prompts';\nimport { appendFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { exit } from '../utils/shutdown.js';\nimport { installClaudeCode } from '../utils/packages/installPackage.js';\n\nexport async function setupTask(\n bypassPrompts: boolean,\n specifiedPackageManager?: string\n) {\n await validateInitialConfig();\n\n if (!bypassPrompts) {\n const answer = await promptConfirm({\n message: chalk.yellow(\n `Locadex will modify files! Make sure you have committed or stashed any changes. Do you want to continue?`\n ),\n defaultValue: true,\n cancelMessage: 'Operation cancelled.',\n });\n if (!answer) {\n logger.info('Operation cancelled.');\n await exit(0);\n }\n }\n\n const packageJson = await getPackageJson();\n const packageManager = await getPackageManager(specifiedPackageManager);\n\n const spinner = createSpinner('timer');\n\n spinner.start(`Installing gt-next with ${packageManager.name}...`);\n\n await installPackage('gt-next', packageManager);\n\n spinner.stop('Automatically installed gt-next.');\n\n const nextConfigPath = findFilepaths([\n './next.config.js',\n './next.config.ts',\n './next.config.mjs',\n './next.config.mts',\n ])[0];\n\n if (!nextConfigPath) {\n logger.error('No next.config.[js|ts|mjs|mts] file found.');\n await exit(1);\n }\n\n const errors: string[] = [];\n const warnings: string[] = [];\n let filesUpdated: string[] = [];\n\n const babel = createSpinner();\n\n babel.start('Wrapping <GTProvider> tags...');\n\n // Wrap all JSX elements in the src directory with a <T> tag, with unique ids\n const { filesUpdated: filesUpdatedNext } = await wrapContentNext(\n {\n src: getNextDirectories(),\n config: nextConfigPath,\n disableIds: true,\n disableFormatting: true,\n skipTs: true,\n addGTProvider: true,\n },\n 'gt-next',\n errors,\n warnings\n );\n filesUpdated = [...filesUpdated, ...filesUpdatedNext];\n\n babel.stop(`Modified ${filesUpdated.length} files.`);\n\n // Add the withGTConfig() function to the next.config.js file\n await handleInitGT(nextConfigPath, errors, warnings, filesUpdated);\n logger.step(`Added withGTConfig() to your ${nextConfigPath} file.`);\n\n // Create gt.config.json\n await createOrUpdateConfig('gt.config.json', {\n defaultLocale: 'en',\n locales: ['es', 'fr', 'de', 'ja', 'zh'],\n framework: 'next-app',\n });\n\n logger.success(\n `Feel free to edit ${chalk.cyan(\n 'gt.config.json'\n )} to customize your translation setup. Docs: https://generaltranslation.com/docs/cli/reference/config`\n );\n\n // Install claude-code if not installed\n await installClaudeCode();\n\n // Install locadex if not installed\n const isLocadexInstalled = packageJson\n ? isPackageInstalled('locadex', packageJson, true, true)\n : true; // if no package.json, we can't install it\n\n if (!isLocadexInstalled) {\n const packageManager = await getPackageManager();\n const spinner = createSpinner();\n spinner.start(\n `Installing locadex as a dev dependency with ${packageManager.name}...`\n );\n await installPackage('locadex', packageManager, true);\n spinner.stop(chalk.green('Installed locadex.'));\n }\n\n // Set up locale selector\n await setupLocaleSelector();\n\n const formatter = await detectFormatter();\n if (formatter && filesUpdated.length > 0) {\n await formatFiles(filesUpdated, formatter);\n }\n\n // Run i18n command\n await i18nTask();\n}\n\nasync function setupLocaleSelector() {\n logger.initializeSpinner();\n logger.spinner.start('Creating locale selector...');\n\n // Create agent\n const manager = LocadexManager.getInstance();\n\n const agent = manager.createSingleAgent('claude_setup_agent');\n\n // Fix prompt\n const localeSelectorPrompt = getLocaleSelectorPrompt();\n try {\n await agent.run({ prompt: localeSelectorPrompt }, {});\n\n // Generate report\n const report = agent.generateReport();\n const reportSummary = `# Summary of locadex setup changes\n${report}`;\n const summaryFilePath = path.join(\n manager.getWorkingDir(),\n 'locadex-report.md'\n );\n appendFileSync(summaryFilePath, reportSummary);\n } catch (error) {\n // Check if this is an abort\n if (manager.getAgentAbortController().signal.aborted) {\n return;\n }\n logger.debugMessage(`[setup] Adding locale selector failed: ${error}`);\n outro(chalk.red('❌ Locadex setup failed!'));\n await exit(1);\n }\n\n logger.spinner.stop('Locale selector setup complete');\n}\n\nfunction getLocaleSelectorPrompt() {\n const prompt = `# Task: Add a locale selector to the project\n\n## Instructions\n- The locale selector should be a dropdown that allows the user to select the locale.\n\n## LOCALE SELECTOR USAGE\n(1) Import the locale selector component from 'gt-next/client'\n(2) Add the locale selector to the project\n\nFor example:\nimport { LocaleSelector } from 'gt-next/client';\n\nfunction MyComponent() {\n return (\n <div>\n <LocaleSelector />\n <p>Hello, world!</p>\n </div>\n );\n}\n\n## ADVICE\n- The locale selector should be added to a header or footer or some other very obvious place in the project.\n- Scan across files to find the best place to add the locale selector.\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 return prompt;\n}\n"],"names":[],"mappings":"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","debug_id":"31f685b0-cf93-5fcd-8a58-4c52de0fdfc1"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"/","sources":["tasks/setup.ts"],"names":[],"mappings":"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","sourcesContent":["import { createSpinner, promptConfirm } from '../logging/console.js';\nimport {\n getPackageJson,\n isPackageInstalled,\n updatePackageJson,\n} from 'gtx-cli/utils/packageJson';\nimport { getPackageManager } from 'gtx-cli/utils/packageManager';\nimport { installPackage } from 'gtx-cli/utils/installPackage';\nimport chalk from 'chalk';\nimport { logger } from '../logging/logger.js';\nimport { findFilepaths } from '../utils/fs/findConfigs.js';\nimport { wrapContentNext } from 'gtx-cli/next/parse/wrapContent';\nimport { handleInitGT } from 'gtx-cli/next/parse/handleInitGT';\nimport { detectFormatter, formatFiles } from 'gtx-cli/hooks/postProcess';\nimport { createOrUpdateConfig } from 'gtx-cli/fs/config/setupConfig';\nimport { i18nTask } from '../tasks/i18n.js';\nimport { getNextDirectories } from '../utils/fs/getFiles.js';\nimport { LocadexManager } from '../utils/locadexManager.js';\nimport { outro } from '@clack/prompts';\nimport { appendFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { exit } from '../utils/shutdown.js';\nimport {\n addTranslateScript,\n installClaudeCode,\n installLocadex,\n} from '../utils/packages/installPackage.js';\n\nexport async function setupTask(\n bypassPrompts: boolean,\n specifiedPackageManager?: string\n) {\n if (!bypassPrompts) {\n await promptConfirm({\n message: chalk.yellow(\n `Locadex will modify files! Make sure you have committed or stashed any changes. Do you want to continue?`\n ),\n defaultValue: true,\n cancelMessage: 'Operation cancelled.',\n });\n }\n\n const manager = LocadexManager.getInstance();\n\n const packageManager = await getPackageManager(\n manager.rootDirectory,\n specifiedPackageManager\n );\n const appPackageJson = await getPackageJson(manager.appDirectory);\n\n if (appPackageJson) {\n if (!isPackageInstalled('gt-next', appPackageJson)) {\n const spinner = createSpinner('timer');\n spinner.start(`Installing gt-next with ${packageManager.name}...`);\n await installPackage(\n 'gt-next',\n packageManager,\n false,\n manager.appDirectory\n );\n spinner.stop('Automatically installed gt-next.');\n }\n }\n\n const nextConfigPath = findFilepaths(\n [\n './next.config.js',\n './next.config.ts',\n './next.config.mjs',\n './next.config.mts',\n ],\n manager.appDirectory\n )[0];\n\n if (!nextConfigPath) {\n logger.error('No next.config.[js|ts|mjs|mts] file found.');\n await exit(1);\n }\n\n const errors: string[] = [];\n const warnings: string[] = [];\n let filesUpdated: string[] = [];\n\n const babel = createSpinner();\n\n babel.start('Wrapping <GTProvider> tags...');\n\n // Wrap all JSX elements in the src directory with a <T> tag, with unique ids\n const { filesUpdated: filesUpdatedNext } = await wrapContentNext(\n {\n src: getNextDirectories(manager.appDirectory),\n config: nextConfigPath,\n disableIds: true,\n disableFormatting: true,\n skipTs: true,\n addGTProvider: true,\n },\n 'gt-next',\n errors,\n warnings\n );\n filesUpdated = [...filesUpdated, ...filesUpdatedNext];\n\n babel.stop(`Modified ${filesUpdated.length} files.`);\n\n // Add the withGTConfig() function to the next.config.js file\n await handleInitGT(nextConfigPath, errors, warnings, filesUpdated);\n logger.step(`Added withGTConfig() to your ${nextConfigPath} file.`);\n\n // Create gt.config.json\n await createOrUpdateConfig(\n path.resolve(manager.appDirectory, 'gt.config.json'),\n {\n defaultLocale: 'en',\n locales: ['es', 'fr', 'de', 'ja', 'zh'],\n framework: 'next-app',\n }\n );\n\n logger.success(\n `Feel free to edit ${chalk.cyan(\n 'gt.config.json'\n )} to customize your translation setup. Docs: https://generaltranslation.com/docs/cli/reference/config`\n );\n\n // Add translate to scripts\n if (appPackageJson) {\n await addTranslateScript(manager, appPackageJson, packageManager);\n }\n\n // Install claude-code if not installed\n await installClaudeCode();\n\n // Install locadex if not installed\n const rootPackageJson = await getPackageJson(manager.rootDirectory);\n if (\n rootPackageJson &&\n !isPackageInstalled('locadex', rootPackageJson, true, true)\n ) {\n await installLocadex(manager);\n }\n\n // Set up locale selector\n await setupLocaleSelector();\n\n const formatter = await detectFormatter();\n if (formatter && filesUpdated.length > 0) {\n await formatFiles(filesUpdated, formatter);\n }\n\n // Run i18n command\n await i18nTask();\n}\n\nasync function setupLocaleSelector() {\n logger.initializeSpinner();\n logger.spinner.start('Creating locale selector...');\n\n // Create agent\n const manager = LocadexManager.getInstance();\n\n const agent = manager.createSingleAgent('claude_setup_agent');\n\n // Fix prompt\n const localeSelectorPrompt = getLocaleSelectorPrompt(manager.appDirectory);\n try {\n await agent.run(localeSelectorPrompt, { maxTurns: 50 }, 1000, 3);\n\n // Generate report\n const report = agent.generateReport();\n const reportSummary = `# Summary of locadex setup changes\n${report}`;\n const summaryFilePath = path.join(\n manager.getLogDirectory(),\n 'locadex-report.md'\n );\n appendFileSync(summaryFilePath, reportSummary);\n } catch (error) {\n // Check if this is an abort\n if (manager.getAgentAbortController().signal.aborted) {\n return;\n }\n logger.debugMessage(`[setup] Adding locale selector failed: ${error}`);\n outro(chalk.red('❌ Locadex setup failed!'));\n await exit(1);\n }\n\n logger.spinner.stop('Locale selector setup complete');\n}\n\nfunction getLocaleSelectorPrompt(appDirectory: string) {\n const prompt = `# Task: Add a locale selector to the app\n\n## Instructions\n- The locale selector should be a dropdown that allows the user to select the locale.\n- The app root is: \"${appDirectory}\"\n\n## LOCALE SELECTOR USAGE\n(1) Import the locale selector component from 'gt-next/client'\n(2) Add the locale selector to the app\n\nFor example:\nimport { LocaleSelector } from 'gt-next/client';\n\nfunction MyComponent() {\n return (\n <div>\n <LocaleSelector />\n <p>Hello, world!</p>\n </div>\n );\n}\n\n## RULES\n- The locale selector should be added to a header or footer or some other very obvious place in the app.\n- Scan across files to find the best place to add the locale selector.\n- **DO NOT** create new files. You may only modify existing files.\n- You do not need to mark the component containing the LocaleSelector with 'use client'. The LocaleSelector component is already internally marked with 'use client'.\n\n## Final output\n- When you are done, please return a **brief summary** of the files you modified.\n- **DO NOT** include any other text in your response.\n`;\n return prompt;\n}\n"]}
package/dist/telemetry.js CHANGED
@@ -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]="bf55c1ef-1335-56c7-8592-1fca656dd8bc")}catch(e){}}();
3
1
  import { exit, gracefulShutdown } from './utils/shutdown.js';
4
2
  import * as Sentry from '@sentry/node';
5
3
  import { PostHog } from 'posthog-node';
@@ -101,5 +99,4 @@ gracefulShutdown.addHandler({
101
99
  timeout: 3000,
102
100
  });
103
101
  export { posthog };
104
- //# sourceMappingURL=telemetry.js.map
105
- //# debugId=bf55c1ef-1335-56c7-8592-1fca656dd8bc
102
+ //# sourceMappingURL=telemetry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.js","sources":["telemetry.ts"],"sourceRoot":"/","sourcesContent":["import { exit, gracefulShutdown } from './utils/shutdown.js';\nimport * as Sentry from '@sentry/node';\nimport { PostHog } from 'posthog-node';\nimport { getLocadexVersion } from './utils/getPaths.js';\nimport { CliOptions } from './types/cli.js';\nimport { getSessionId } from './utils/session.js';\n\nlet _posthog: PostHog | null = null;\nlet sentryInitialized = false;\nlet telemetryEnabled = false;\n\n// Create a PostHog proxy that behaves like PostHog but does nothing when disabled\nconst posthog = new Proxy({} as PostHog, {\n get(target, prop) {\n if (!telemetryEnabled || !_posthog) {\n // Return no-op functions for all PostHog methods\n if (\n typeof prop === 'string' &&\n ['capture', 'identify', 'alias', 'shutdown'].includes(prop)\n ) {\n return () => {};\n }\n return undefined;\n }\n return _posthog[prop as keyof PostHog];\n },\n});\n\nfunction initializeTelemetry(enabled: boolean) {\n telemetryEnabled = enabled;\n\n if (!sentryInitialized) {\n Sentry.init({\n dsn: 'https://f542d2155ab069c9de0fcd913ed3ce3b@o4508407294853120.ingest.us.sentry.io/4509441836843008',\n release: getLocadexVersion(),\n enabled,\n tracesSampleRate: 1.0,\n beforeSend: (event) => {\n event.exception?.values?.forEach((exception) => {\n delete exception.stacktrace;\n });\n delete event.server_name;\n return event;\n },\n beforeSendTransaction: (event) => {\n delete event.server_name;\n return event;\n },\n });\n sentryInitialized = true;\n }\n\n if (!_posthog && enabled) {\n _posthog = new PostHog('phc_LJRRBlhH8kgjiydp2bKjC7QPMguDoNd1b4QHQArxtha', {\n host: 'https://us.i.posthog.com',\n disableGeoip: true,\n });\n }\n}\n\nfunction updateProgress(status: string) {\n posthog.capture({\n distinctId: getSessionId(),\n event: 'locadex_progress',\n properties: { status },\n });\n}\n\nexport async function withTelemetry<F>(\n params: {\n enabled: boolean;\n options: CliOptions;\n },\n callback: () => F | Promise<F>\n): Promise<F> {\n const { enabled, options } = params;\n initializeTelemetry(enabled);\n\n if (!enabled) {\n return await callback();\n }\n\n Sentry.setTag('args.verbose', !!options.verbose);\n Sentry.setTag('args.debug', !!options.debug);\n Sentry.setTag('args.noTelemetry', !!options.noTelemetry);\n Sentry.setTag('args.batchSize', options.batchSize);\n Sentry.setTag('args.concurrency', options.concurrency);\n Sentry.setTag('args.matchingFiles', options.matchingFiles);\n\n try {\n return await Sentry.startSpan(\n {\n name: 'locadex-execution',\n op: 'locadex.exec',\n },\n async () => {\n updateProgress('start');\n const res = await callback();\n updateProgress('finished');\n return res;\n }\n );\n } catch (e) {\n Sentry.captureException(e);\n throw e;\n } finally {\n await exit(0);\n }\n}\n\n// Register telemetry cleanup with graceful shutdown\ngracefulShutdown.addHandler({\n name: 'telemetry-cleanup',\n handler: async () => {\n if (_posthog) {\n await _posthog.shutdown();\n }\n await Sentry.flush(3000).then(null, () => {});\n },\n timeout: 3000,\n});\n\nexport { posthog };\n"],"names":[],"mappings":"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","debug_id":"bf55c1ef-1335-56c7-8592-1fca656dd8bc"}
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"/","sources":["telemetry.ts"],"names":[],"mappings":"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","sourcesContent":["import { exit, gracefulShutdown } from './utils/shutdown.js';\nimport * as Sentry from '@sentry/node';\nimport { PostHog } from 'posthog-node';\nimport { getLocadexVersion } from './utils/getPaths.js';\nimport { CliOptions } from './types/cli.js';\nimport { getSessionId } from './utils/session.js';\n\nlet _posthog: PostHog | null = null;\nlet sentryInitialized = false;\nlet telemetryEnabled = false;\n\n// Create a PostHog proxy that behaves like PostHog but does nothing when disabled\nconst posthog = new Proxy({} as PostHog, {\n get(target, prop) {\n if (!telemetryEnabled || !_posthog) {\n // Return no-op functions for all PostHog methods\n if (\n typeof prop === 'string' &&\n ['capture', 'identify', 'alias', 'shutdown'].includes(prop)\n ) {\n return () => {};\n }\n return undefined;\n }\n return _posthog[prop as keyof PostHog];\n },\n});\n\nfunction initializeTelemetry(enabled: boolean) {\n telemetryEnabled = enabled;\n\n if (!sentryInitialized) {\n Sentry.init({\n dsn: 'https://f542d2155ab069c9de0fcd913ed3ce3b@o4508407294853120.ingest.us.sentry.io/4509441836843008',\n release: getLocadexVersion(),\n enabled,\n tracesSampleRate: 1.0,\n beforeSend: (event) => {\n event.exception?.values?.forEach((exception) => {\n delete exception.stacktrace;\n });\n delete event.server_name;\n return event;\n },\n beforeSendTransaction: (event) => {\n delete event.server_name;\n return event;\n },\n });\n sentryInitialized = true;\n }\n\n if (!_posthog && enabled) {\n _posthog = new PostHog('phc_LJRRBlhH8kgjiydp2bKjC7QPMguDoNd1b4QHQArxtha', {\n host: 'https://us.i.posthog.com',\n disableGeoip: true,\n });\n }\n}\n\nfunction updateProgress(status: string) {\n posthog.capture({\n distinctId: getSessionId(),\n event: 'locadex_progress',\n properties: { status },\n });\n}\n\nexport async function withTelemetry<F>(\n params: {\n enabled: boolean;\n options: CliOptions;\n },\n callback: () => F | Promise<F>\n): Promise<F> {\n const { enabled, options } = params;\n initializeTelemetry(enabled);\n\n if (!enabled) {\n return await callback();\n }\n\n Sentry.setTag('args.verbose', !!options.verbose);\n Sentry.setTag('args.debug', !!options.debug);\n Sentry.setTag('args.noTelemetry', !!options.noTelemetry);\n Sentry.setTag('args.batchSize', options.batchSize);\n Sentry.setTag('args.concurrency', options.concurrency);\n Sentry.setTag('args.matchingFiles', options.matchingFiles);\n\n try {\n return await Sentry.startSpan(\n {\n name: 'locadex-execution',\n op: 'locadex.exec',\n },\n async () => {\n updateProgress('start');\n const res = await callback();\n updateProgress('finished');\n return res;\n }\n );\n } catch (e) {\n Sentry.captureException(e);\n throw e;\n } finally {\n await exit(0);\n }\n}\n\n// Register telemetry cleanup with graceful shutdown\ngracefulShutdown.addHandler({\n name: 'telemetry-cleanup',\n handler: async () => {\n if (_posthog) {\n await _posthog.shutdown();\n }\n await Sentry.flush(3000).then(null, () => {});\n },\n timeout: 3000,\n});\n\nexport { posthog };\n"]}
@@ -1,4 +1,4 @@
1
- import { Message, MessageParam } from '@anthropic-ai/sdk/resources';
1
+ import { type Message, type MessageParam } from '@anthropic-ai/sdk/resources';
2
2
  export type ClaudeSDKMessage = {
3
3
  type: 'assistant';
4
4
  message: Message;
@@ -1 +1 @@
1
- {"version":3,"file":"claude-sdk.d.ts","sourceRoot":"/","sources":["types/claude-sdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEpE,MAAM,MAAM,gBAAgB,GAExB;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,GAGD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,GAGD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,GAGD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,GAGD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAChB,EAAE,CAAC;CACL,CAAC"}
1
+ {"version":3,"file":"claude-sdk.d.ts","sourceRoot":"/","sources":["types/claude-sdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE9E,MAAM,MAAM,gBAAgB,GAExB;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,GAGD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,GAGD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,GAGD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,GAGD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAChB,EAAE,CAAC;CACL,CAAC"}
@@ -1,5 +1,2 @@
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]="0c2e0fbb-3b18-500a-8d12-ba9e398d3b39")}catch(e){}}();
3
1
  export {};
4
- //# sourceMappingURL=claude-sdk.js.map
5
- //# debugId=0c2e0fbb-3b18-500a-8d12-ba9e398d3b39
2
+ //# sourceMappingURL=claude-sdk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-sdk.js","sources":["types/claude-sdk.ts"],"sourceRoot":"/","sourcesContent":["import { Message, MessageParam } from '@anthropic-ai/sdk/resources';\n\nexport type ClaudeSDKMessage =\n // An assistant message\n | {\n type: 'assistant';\n message: Message; // from Anthropic SDK\n session_id: string;\n }\n\n // A user message\n | {\n type: 'user';\n message: MessageParam; // from Anthropic SDK\n session_id: string;\n }\n\n // Emitted as the last message\n | {\n type: 'result';\n subtype: 'success';\n cost_usd: Number;\n duration_ms: Number;\n duration_api_ms: Number;\n is_error: boolean;\n num_turns: Number;\n result: string;\n session_id: string;\n }\n\n // Emitted as the last message, when we've reached the maximum number of turns\n | {\n type: 'result';\n subtype: 'error_max_turns';\n cost_usd: Number;\n duration_ms: Number;\n duration_api_ms: Number;\n is_error: boolean;\n num_turns: Number;\n session_id: string;\n }\n\n // Emitted as the first message at the start of a conversation\n | {\n type: 'system';\n subtype: 'init';\n session_id: string;\n tools: string[];\n mcp_servers: {\n name: string;\n status: string;\n }[];\n };\n"],"names":[],"mappings":"","debug_id":"0c2e0fbb-3b18-500a-8d12-ba9e398d3b39"}
1
+ {"version":3,"file":"claude-sdk.js","sourceRoot":"/","sources":["types/claude-sdk.ts"],"names":[],"mappings":"","sourcesContent":["import { type Message, type MessageParam } from '@anthropic-ai/sdk/resources';\n\nexport type ClaudeSDKMessage =\n // An assistant message\n | {\n type: 'assistant';\n message: Message; // from Anthropic SDK\n session_id: string;\n }\n\n // A user message\n | {\n type: 'user';\n message: MessageParam; // from Anthropic SDK\n session_id: string;\n }\n\n // Emitted as the last message\n | {\n type: 'result';\n subtype: 'success';\n cost_usd: Number;\n duration_ms: Number;\n duration_api_ms: Number;\n is_error: boolean;\n num_turns: Number;\n result: string;\n session_id: string;\n }\n\n // Emitted as the last message, when we've reached the maximum number of turns\n | {\n type: 'result';\n subtype: 'error_max_turns';\n cost_usd: Number;\n duration_ms: Number;\n duration_api_ms: Number;\n is_error: boolean;\n num_turns: Number;\n session_id: string;\n }\n\n // Emitted as the first message at the start of a conversation\n | {\n type: 'system';\n subtype: 'init';\n session_id: string;\n tools: string[];\n mcp_servers: {\n name: string;\n status: string;\n }[];\n };\n"]}
@@ -5,10 +5,13 @@ export type CliOptions = {
5
5
  batchSize?: string;
6
6
  concurrency?: string;
7
7
  matchingFiles?: string;
8
+ appDir: string;
9
+ timeout?: string;
8
10
  };
9
11
  export type LocadexConfig = {
10
12
  batchSize: number;
11
13
  maxConcurrency: number;
12
14
  matchingFiles: string[];
15
+ timeout: number;
13
16
  };
14
17
  //# sourceMappingURL=cli.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"/","sources":["types/cli.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB,CAAC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"/","sources":["types/cli.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC"}
package/dist/types/cli.js CHANGED
@@ -1,5 +1,2 @@
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]="38b8ca8b-456e-5e7f-9dfa-68211d455f1f")}catch(e){}}();
3
1
  export {};
4
- //# sourceMappingURL=cli.js.map
5
- //# debugId=38b8ca8b-456e-5e7f-9dfa-68211d455f1f
2
+ //# sourceMappingURL=cli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sources":["types/cli.ts"],"sourceRoot":"/","sourcesContent":["export type CliOptions = {\n verbose?: boolean;\n debug?: boolean;\n noTelemetry?: boolean;\n batchSize?: string;\n concurrency?: string;\n matchingFiles?: string;\n};\n\nexport type LocadexConfig = {\n batchSize: number;\n maxConcurrency: number;\n matchingFiles: string[];\n};\n"],"names":[],"mappings":"","debug_id":"38b8ca8b-456e-5e7f-9dfa-68211d455f1f"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"/","sources":["types/cli.ts"],"names":[],"mappings":"","sourcesContent":["export type CliOptions = {\n verbose?: boolean;\n debug?: boolean;\n noTelemetry?: boolean;\n batchSize?: string;\n concurrency?: string;\n matchingFiles?: string;\n appDir: string;\n timeout?: string;\n};\n\nexport type LocadexConfig = {\n batchSize: number;\n maxConcurrency: number;\n matchingFiles: string[];\n timeout: number;\n};\n"]}
@@ -1,14 +1,11 @@
1
1
  import { LocadexManager } from './locadexManager.js';
2
2
  export interface ClaudeCodeOptions {
3
3
  additionalSystemPrompt?: string;
4
- prompt: string;
5
4
  additionalAllowedTools?: string[];
6
5
  maxTurns?: number;
7
- sessionId?: string;
8
6
  }
9
7
  export interface ClaudeCodeObservation {
10
8
  }
11
- export declare const killAllClaudeProcesses: () => void;
12
9
  export declare class ClaudeCodeRunner {
13
10
  private options;
14
11
  private id;
@@ -17,13 +14,17 @@ export declare class ClaudeCodeRunner {
17
14
  private manager;
18
15
  private changes;
19
16
  private controller;
17
+ private maxTurns;
18
+ private turns;
20
19
  constructor(manager: LocadexManager, controller: AbortController, options: {
21
20
  id: string;
22
21
  apiKey: string;
23
22
  mcpConfig: string;
23
+ maxTurns: number;
24
24
  });
25
- getSessionId(): string;
26
- run(options: ClaudeCodeOptions, obs: ClaudeCodeObservation): Promise<string>;
25
+ getSessionId(): string | undefined;
26
+ reset(): void;
27
+ run(prompt: string, options: ClaudeCodeOptions, obs: ClaudeCodeObservation, timeoutSec?: number, maxRetries?: number): Promise<string>;
27
28
  private handleSDKOutput;
28
29
  generateReport(): string;
29
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"claudeCode.d.ts","sourceRoot":"/","sources":["utils/claudeCode.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD,MAAM,WAAW,iBAAiB;IAChC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;CAAG;AAczC,eAAO,MAAM,sBAAsB,YAElC,CAAC;AAEF,qBAAa,gBAAgB;IAWzB,OAAO,CAAC,OAAO;IAVjB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAkB;gBAGlC,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,eAAe,EACnB,OAAO,EAAE;QACf,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB;IAeH,YAAY,IAAI,MAAM;IAIhB,GAAG,CACP,OAAO,EAAE,iBAAiB,EAC1B,GAAG,EAAE,qBAAqB,GACzB,OAAO,CAAC,MAAM,CAAC;IAoIlB,OAAO,CAAC,eAAe;IAmEvB,cAAc,IAAI,MAAM;CAGzB"}
1
+ {"version":3,"file":"claudeCode.d.ts","sourceRoot":"/","sources":["utils/claudeCode.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD,MAAM,WAAW,iBAAiB;IAChC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;CAAG;AA+DzC,qBAAa,gBAAgB;IAazB,OAAO,CAAC,OAAO;IAZjB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAa;gBAGxB,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,eAAe,EACnB,OAAO,EAAE;QACf,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB;IAgBH,YAAY,IAAI,MAAM,GAAG,SAAS;IAGlC,KAAK;IAKC,GAAG,CACP,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,iBAAiB,EAC1B,GAAG,EAAE,qBAAqB,EAC1B,UAAU,GAAE,MAAY,EACxB,UAAU,GAAE,MAAU,GACrB,OAAO,CAAC,MAAM,CAAC;IAkJlB,OAAO,CAAC,eAAe;IAoEvB,cAAc,IAAI,MAAM;CAGzB"}
@@ -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]="3462e977-07c6-543f-94a5-feae01f1c2b2")}catch(e){}}();
3
1
  import { spawn } from 'node:child_process';
4
2
  import { guides } from '../mcp/tools/guides.js';
5
3
  import { logger } from '../logging/logger.js';
@@ -15,24 +13,55 @@ const DEFAULT_ALLOWED_TOOLS = [
15
13
  'Write',
16
14
  ].concat(guides.map((guide) => `mcp__locadex__${guide.id}`));
17
15
  const DISALLOWED_TOOLS = ['NotebookEdit', 'WebFetch', 'WebSearch'];
18
- // Legacy function for backward compatibility
19
- export const killAllClaudeProcesses = () => {
20
- // No-op since we now use AbortController
21
- };
16
+ /**
17
+ * Wraps a promise with a timeout mechanism
18
+ */
19
+ async function withTimeout(promise, timeoutSec, timeoutMessage) {
20
+ const timeoutPromise = new Promise((_, reject) => {
21
+ global.setTimeout(() => {
22
+ reject(new Error(timeoutMessage || `Operation timed out after ${timeoutSec}s`));
23
+ }, timeoutSec * 1000);
24
+ });
25
+ return Promise.race([promise, timeoutPromise]);
26
+ }
27
+ /**
28
+ * Retries an async operation with exponential backoff
29
+ */
30
+ async function withRetry(operation, maxRetries = 1, baseDelayMs = 1000) {
31
+ let lastError;
32
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
33
+ try {
34
+ return await operation();
35
+ }
36
+ catch (error) {
37
+ lastError = error;
38
+ if (attempt === maxRetries) {
39
+ throw lastError;
40
+ }
41
+ const delay = baseDelayMs * Math.pow(2, attempt);
42
+ logger.debugMessage(`Agent operation failed (attempt ${attempt + 1}/${maxRetries + 1}), retrying in ${delay}ms: ${error}`);
43
+ await new Promise((resolve) => global.setTimeout(resolve, delay));
44
+ }
45
+ }
46
+ throw lastError;
47
+ }
22
48
  export class ClaudeCodeRunner {
23
49
  options;
24
50
  id;
25
- sessionId = '';
51
+ sessionId;
26
52
  mcpConfig;
27
53
  manager;
28
54
  changes = [];
29
55
  controller;
56
+ maxTurns;
57
+ turns = 0;
30
58
  constructor(manager, controller, options) {
31
59
  this.options = options;
32
60
  this.manager = manager;
33
61
  this.id = options.id;
34
62
  this.mcpConfig = options.mcpConfig;
35
63
  this.controller = controller;
64
+ this.maxTurns = options.maxTurns;
36
65
  // Ensure API key is set
37
66
  if (!process.env.ANTHROPIC_API_KEY && !this.options.apiKey) {
38
67
  throw new Error('ANTHROPIC_API_KEY environment variable or apiKey option is required');
@@ -41,23 +70,27 @@ export class ClaudeCodeRunner {
41
70
  getSessionId() {
42
71
  return this.sessionId;
43
72
  }
44
- async run(options, obs) {
73
+ reset() {
74
+ this.sessionId = undefined;
75
+ this.turns = 0;
76
+ }
77
+ async run(prompt, options, obs, timeoutSec = 300, maxRetries = 1) {
45
78
  this.changes = [];
46
- return Sentry.startSpan({
79
+ return withRetry(() => Sentry.startSpan({
47
80
  name: 'claude-code-exec',
48
81
  op: 'claude-code.exec',
49
82
  attributes: {
50
83
  'process.command': 'claude',
51
84
  },
52
- }, () => new Promise((resolve, reject) => {
53
- const args = ['-p', options.prompt];
85
+ }, () => withTimeout(new Promise((resolve, reject) => {
86
+ const args = ['-p', prompt];
54
87
  if (options.additionalSystemPrompt) {
55
88
  args.push('--append-system-prompt', options.additionalSystemPrompt);
56
89
  }
57
90
  args.push('--output-format', 'stream-json');
58
91
  args.push('--verbose');
59
- if (options.sessionId) {
60
- args.push('--resume', options.sessionId);
92
+ if (this.sessionId && this.turns < this.maxTurns) {
93
+ args.push('--resume', this.sessionId);
61
94
  }
62
95
  if (this.mcpConfig) {
63
96
  args.push('--mcp-config', this.mcpConfig);
@@ -74,7 +107,7 @@ export class ClaudeCodeRunner {
74
107
  env.ANTHROPIC_API_KEY = this.options.apiKey;
75
108
  logger.debugMessage(`[${this.id}] Spawning Claude Code with additional args: ${JSON.stringify({
76
109
  maxTurns: options.maxTurns,
77
- sessionId: options.sessionId,
110
+ sessionId: this.sessionId,
78
111
  mcpConfig: this.mcpConfig,
79
112
  additionalAllowedTools: options.additionalAllowedTools,
80
113
  }, null, 2)}. API key is ${this.options.apiKey ? 'set' : 'not set'}`);
@@ -128,7 +161,7 @@ export class ClaudeCodeRunner {
128
161
  reject(new Error(`[${this.id}] failed to run Claude Code: ${error.message}`));
129
162
  }
130
163
  });
131
- }));
164
+ }), timeoutSec, `Claude Code operation timed out after ${timeoutSec}s`)), maxRetries);
132
165
  }
133
166
  handleSDKOutput(outputData, obs) {
134
167
  if (outputData.type === 'assistant') {
@@ -180,6 +213,7 @@ export class ClaudeCodeRunner {
180
213
  newApiDuration: Number(outputData.duration_api_ms),
181
214
  newTurns: Number(outputData.num_turns),
182
215
  });
216
+ this.turns = Number(outputData.num_turns);
183
217
  }
184
218
  else if (outputData.type === 'system') {
185
219
  if (outputData.subtype === 'init') {
@@ -191,5 +225,4 @@ export class ClaudeCodeRunner {
191
225
  return this.changes.join('\n');
192
226
  }
193
227
  }
194
- //# sourceMappingURL=claudeCode.js.map
195
- //# debugId=3462e977-07c6-543f-94a5-feae01f1c2b2
228
+ //# sourceMappingURL=claudeCode.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claudeCode.js","sources":["utils/claudeCode.ts"],"sourceRoot":"/","sourcesContent":["import { spawn } from 'node:child_process';\nimport { ClaudeSDKMessage } from '../types/claude-sdk.js';\nimport { guides } from '../mcp/tools/guides.js';\nimport { logger } from '../logging/logger.js';\nimport { posthog } from '../telemetry.js';\nimport { LocadexManager } from './locadexManager.js';\nimport { getSessionId } from './session.js';\nimport * as Sentry from '@sentry/node';\n\nexport interface ClaudeCodeOptions {\n additionalSystemPrompt?: string;\n prompt: string;\n additionalAllowedTools?: string[];\n maxTurns?: number;\n sessionId?: string;\n}\n\nexport interface ClaudeCodeObservation {}\n\nconst DEFAULT_ALLOWED_TOOLS = [\n 'mcp__locadex__fetch-docs',\n 'mcp__locadex__list-docs',\n 'Bash',\n 'Edit',\n 'MultiEdit',\n 'Write',\n].concat(guides.map((guide) => `mcp__locadex__${guide.id}`));\n\nconst DISALLOWED_TOOLS = ['NotebookEdit', 'WebFetch', 'WebSearch'];\n\n// Legacy function for backward compatibility\nexport const killAllClaudeProcesses = () => {\n // No-op since we now use AbortController\n};\n\nexport class ClaudeCodeRunner {\n private id: string;\n private sessionId: string = '';\n private mcpConfig: string | undefined;\n private manager: LocadexManager;\n private changes: string[] = [];\n private controller: AbortController;\n\n constructor(\n manager: LocadexManager,\n controller: AbortController,\n private options: {\n id: string;\n apiKey: string;\n mcpConfig: string;\n }\n ) {\n this.manager = manager;\n this.id = options.id;\n this.mcpConfig = options.mcpConfig;\n this.controller = controller;\n\n // Ensure API key is set\n if (!process.env.ANTHROPIC_API_KEY && !this.options.apiKey) {\n throw new Error(\n 'ANTHROPIC_API_KEY environment variable or apiKey option is required'\n );\n }\n }\n\n getSessionId(): string {\n return this.sessionId;\n }\n\n async run(\n options: ClaudeCodeOptions,\n obs: ClaudeCodeObservation\n ): Promise<string> {\n this.changes = [];\n return Sentry.startSpan(\n {\n name: 'claude-code-exec',\n op: 'claude-code.exec',\n attributes: {\n 'process.command': 'claude',\n },\n },\n () =>\n new Promise((resolve, reject) => {\n const args = ['-p', options.prompt];\n\n if (options.additionalSystemPrompt) {\n args.push('--append-system-prompt', options.additionalSystemPrompt);\n }\n\n args.push('--output-format', 'stream-json');\n args.push('--verbose');\n if (options.sessionId) {\n args.push('--resume', options.sessionId);\n }\n\n if (this.mcpConfig) {\n args.push('--mcp-config', this.mcpConfig);\n }\n\n args.push(\n '--allowedTools',\n [\n ...DEFAULT_ALLOWED_TOOLS,\n ...(options?.additionalAllowedTools || []),\n ].join(',')\n );\n\n args.push('--disallowedTools', DISALLOWED_TOOLS.join(','));\n\n if (options.maxTurns) {\n args.push('--max-turns', options.maxTurns.toString());\n }\n\n const env = { ...process.env };\n env.ANTHROPIC_API_KEY = this.options.apiKey;\n logger.debugMessage(\n `[${this.id}] Spawning Claude Code with additional args: ${JSON.stringify(\n {\n maxTurns: options.maxTurns,\n sessionId: options.sessionId,\n mcpConfig: this.mcpConfig,\n additionalAllowedTools: options.additionalAllowedTools,\n },\n null,\n 2\n )}. API key is ${this.options.apiKey ? 'set' : 'not set'}`\n );\n\n const claude = spawn('claude', args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n env,\n signal: this.controller.signal,\n });\n\n logger.debugMessage(`[${this.id}] Spawned claude code process`);\n\n const output = '';\n const errorOutput = '';\n\n let buffer = '';\n claude.stdout?.on('data', (data) => {\n buffer += data.toString();\n const lines = buffer.split('\\n');\n\n // Keep the last incomplete line in buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim()) {\n try {\n logger.debugMessage(`[${this.id}] ${line}`);\n const outputData: ClaudeSDKMessage = JSON.parse(line);\n this.handleSDKOutput(outputData, obs);\n } catch (error) {\n logger.debugMessage(\n `[${this.id}] Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n });\n\n claude.stderr?.on('data', (data) => {\n logger.debugMessage(`[${this.id}] ${data.toString().trim()}`);\n });\n\n claude.on('close', (code) => {\n if (code === 0) {\n resolve(output.trim());\n } else {\n logger.debugMessage(\n `[${this.id}] Claude Code exited with code ${code}: ${errorOutput}`\n );\n reject(\n new Error(\n `[${this.id}] Claude Code exited with code ${code}: ${errorOutput}`\n )\n );\n }\n });\n\n claude.on('error', (error) => {\n // Check if this is an AbortError\n if (error.name === 'AbortError') {\n logger.debugMessage(\n `[${this.id}] Claude Code process was aborted`\n );\n reject(new Error(`[${this.id}] Claude Code process was aborted`));\n } else {\n logger.debugMessage(\n `[${this.id}] failed to run Claude Code: ${error.message}`\n );\n reject(\n new Error(\n `[${this.id}] failed to run Claude Code: ${error.message}`\n )\n );\n }\n });\n })\n );\n }\n\n private handleSDKOutput(\n outputData: ClaudeSDKMessage,\n obs: ClaudeCodeObservation\n ) {\n if (outputData.type === 'assistant') {\n const text: string[] = [];\n const toolUses: string[] = [];\n outputData.message.content.forEach((c) => {\n if (c.type === 'text') {\n text.push(c.text);\n }\n if (c.type === 'tool_use') {\n toolUses.push(c.name);\n if (c.name.startsWith('mcp__locadex__')) {\n posthog.capture({\n distinctId: getSessionId(),\n event: 'tool_used',\n properties: {\n tool: c.name,\n },\n });\n }\n }\n });\n if (text.length > 0) {\n logger.verboseMessage(`[${this.id}] ${text.join('').trim()}`);\n }\n if (toolUses.length > 0) {\n logger.debugMessage(`[${this.id}] used tools: ${toolUses.join(', ')}`);\n }\n this.manager.stats.updateStats({\n newToolCalls: toolUses.length,\n newInputTokens: outputData.message.usage.input_tokens,\n newOutputTokens: outputData.message.usage.output_tokens,\n newCachedInputTokens:\n outputData.message.usage.cache_read_input_tokens ?? 0,\n });\n } else if (outputData.type === 'result') {\n if (!outputData.is_error) {\n logger.verboseMessage(\n `[${this.id}] finished task.\\nCost: $${Number(outputData.cost_usd).toFixed(2)}\\nDuration: ${\n Number(outputData.duration_ms) / 1000\n }s`\n );\n } else {\n logger.verboseMessage(\n `[${this.id}] finished task with error: ${outputData.subtype}\\nCost: $${outputData.cost_usd}\\nDuration: ${\n Number(outputData.duration_ms) / 1000\n }s`\n );\n }\n if (outputData.subtype === 'success') {\n this.changes.push(outputData.result);\n }\n this.manager.stats.updateStats({\n newCost: Number(outputData.cost_usd),\n newWallDuration: Number(outputData.duration_ms),\n newApiDuration: Number(outputData.duration_api_ms),\n newTurns: Number(outputData.num_turns),\n });\n } else if (outputData.type === 'system') {\n if (outputData.subtype === 'init') {\n this.sessionId = outputData.session_id;\n }\n }\n }\n\n generateReport(): string {\n return this.changes.join('\\n');\n }\n}\n"],"names":[],"mappings":"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","debug_id":"3462e977-07c6-543f-94a5-feae01f1c2b2"}
1
+ {"version":3,"file":"claudeCode.js","sourceRoot":"/","sources":["utils/claudeCode.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from 'node:child_process';\nimport { ClaudeSDKMessage } from '../types/claude-sdk.js';\nimport { guides } from '../mcp/tools/guides.js';\nimport { logger } from '../logging/logger.js';\nimport { posthog } from '../telemetry.js';\nimport { LocadexManager } from './locadexManager.js';\nimport { getSessionId } from './session.js';\nimport * as Sentry from '@sentry/node';\n\nexport interface ClaudeCodeOptions {\n additionalSystemPrompt?: string;\n additionalAllowedTools?: string[];\n maxTurns?: number;\n}\n\nexport interface ClaudeCodeObservation {}\n\nconst DEFAULT_ALLOWED_TOOLS = [\n 'mcp__locadex__fetch-docs',\n 'mcp__locadex__list-docs',\n 'Bash',\n 'Edit',\n 'MultiEdit',\n 'Write',\n].concat(guides.map((guide) => `mcp__locadex__${guide.id}`));\n\nconst DISALLOWED_TOOLS = ['NotebookEdit', 'WebFetch', 'WebSearch'];\n\n/**\n * Wraps a promise with a timeout mechanism\n */\nasync function withTimeout<T>(\n promise: Promise<T>,\n timeoutSec: number,\n timeoutMessage?: string\n): Promise<T> {\n const timeoutPromise = new Promise<never>((_, reject) => {\n global.setTimeout(() => {\n reject(\n new Error(timeoutMessage || `Operation timed out after ${timeoutSec}s`)\n );\n }, timeoutSec * 1000);\n });\n\n return Promise.race([promise, timeoutPromise]);\n}\n\n/**\n * Retries an async operation with exponential backoff\n */\nasync function withRetry<T>(\n operation: () => Promise<T>,\n maxRetries: number = 1,\n baseDelayMs: number = 1000\n): Promise<T> {\n let lastError: Error;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n\n if (attempt === maxRetries) {\n throw lastError;\n }\n\n const delay = baseDelayMs * Math.pow(2, attempt);\n logger.debugMessage(\n `Agent operation failed (attempt ${attempt + 1}/${maxRetries + 1}), retrying in ${delay}ms: ${error}`\n );\n await new Promise((resolve) => global.setTimeout(resolve, delay));\n }\n }\n\n throw lastError!;\n}\n\nexport class ClaudeCodeRunner {\n private id: string;\n private sessionId: string | undefined;\n private mcpConfig: string | undefined;\n private manager: LocadexManager;\n private changes: string[] = [];\n private controller: AbortController;\n private maxTurns: number;\n private turns: number = 0;\n\n constructor(\n manager: LocadexManager,\n controller: AbortController,\n private options: {\n id: string;\n apiKey: string;\n mcpConfig: string;\n maxTurns: number;\n }\n ) {\n this.manager = manager;\n this.id = options.id;\n this.mcpConfig = options.mcpConfig;\n this.controller = controller;\n this.maxTurns = options.maxTurns;\n\n // Ensure API key is set\n if (!process.env.ANTHROPIC_API_KEY && !this.options.apiKey) {\n throw new Error(\n 'ANTHROPIC_API_KEY environment variable or apiKey option is required'\n );\n }\n }\n\n getSessionId(): string | undefined {\n return this.sessionId;\n }\n reset() {\n this.sessionId = undefined;\n this.turns = 0;\n }\n\n async run(\n prompt: string,\n options: ClaudeCodeOptions,\n obs: ClaudeCodeObservation,\n timeoutSec: number = 300,\n maxRetries: number = 1\n ): Promise<string> {\n this.changes = [];\n return withRetry(\n () =>\n Sentry.startSpan(\n {\n name: 'claude-code-exec',\n op: 'claude-code.exec',\n attributes: {\n 'process.command': 'claude',\n },\n },\n () =>\n withTimeout(\n new Promise((resolve, reject) => {\n const args = ['-p', prompt];\n\n if (options.additionalSystemPrompt) {\n args.push(\n '--append-system-prompt',\n options.additionalSystemPrompt\n );\n }\n\n args.push('--output-format', 'stream-json');\n args.push('--verbose');\n\n if (this.sessionId && this.turns < this.maxTurns) {\n args.push('--resume', this.sessionId);\n }\n\n if (this.mcpConfig) {\n args.push('--mcp-config', this.mcpConfig);\n }\n\n args.push(\n '--allowedTools',\n [\n ...DEFAULT_ALLOWED_TOOLS,\n ...(options?.additionalAllowedTools || []),\n ].join(',')\n );\n\n args.push('--disallowedTools', DISALLOWED_TOOLS.join(','));\n\n if (options.maxTurns) {\n args.push('--max-turns', options.maxTurns.toString());\n }\n\n const env = { ...process.env };\n env.ANTHROPIC_API_KEY = this.options.apiKey;\n logger.debugMessage(\n `[${this.id}] Spawning Claude Code with additional args: ${JSON.stringify(\n {\n maxTurns: options.maxTurns,\n sessionId: this.sessionId,\n mcpConfig: this.mcpConfig,\n additionalAllowedTools: options.additionalAllowedTools,\n },\n null,\n 2\n )}. API key is ${this.options.apiKey ? 'set' : 'not set'}`\n );\n\n const claude = spawn('claude', args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n env,\n signal: this.controller.signal,\n });\n\n logger.debugMessage(`[${this.id}] Spawned claude code process`);\n\n const output = '';\n const errorOutput = '';\n\n let buffer = '';\n claude.stdout?.on('data', (data) => {\n buffer += data.toString();\n const lines = buffer.split('\\n');\n\n // Keep the last incomplete line in buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim()) {\n try {\n logger.debugMessage(`[${this.id}] ${line}`);\n const outputData: ClaudeSDKMessage = JSON.parse(line);\n this.handleSDKOutput(outputData, obs);\n } catch (error) {\n logger.debugMessage(\n `[${this.id}] Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n });\n\n claude.stderr?.on('data', (data) => {\n logger.debugMessage(`[${this.id}] ${data.toString().trim()}`);\n });\n\n claude.on('close', (code) => {\n if (code === 0) {\n resolve(output.trim());\n } else {\n logger.debugMessage(\n `[${this.id}] Claude Code exited with code ${code}: ${errorOutput}`\n );\n reject(\n new Error(\n `[${this.id}] Claude Code exited with code ${code}: ${errorOutput}`\n )\n );\n }\n });\n\n claude.on('error', (error) => {\n // Check if this is an AbortError\n if (error.name === 'AbortError') {\n logger.debugMessage(\n `[${this.id}] Claude Code process was aborted`\n );\n reject(\n new Error(`[${this.id}] Claude Code process was aborted`)\n );\n } else {\n logger.debugMessage(\n `[${this.id}] failed to run Claude Code: ${error.message}`\n );\n reject(\n new Error(\n `[${this.id}] failed to run Claude Code: ${error.message}`\n )\n );\n }\n });\n }),\n timeoutSec,\n `Claude Code operation timed out after ${timeoutSec}s`\n )\n ),\n maxRetries\n );\n }\n\n private handleSDKOutput(\n outputData: ClaudeSDKMessage,\n obs: ClaudeCodeObservation\n ) {\n if (outputData.type === 'assistant') {\n const text: string[] = [];\n const toolUses: string[] = [];\n outputData.message.content.forEach((c) => {\n if (c.type === 'text') {\n text.push(c.text);\n }\n if (c.type === 'tool_use') {\n toolUses.push(c.name);\n if (c.name.startsWith('mcp__locadex__')) {\n posthog.capture({\n distinctId: getSessionId(),\n event: 'tool_used',\n properties: {\n tool: c.name,\n },\n });\n }\n }\n });\n if (text.length > 0) {\n logger.verboseMessage(`[${this.id}] ${text.join('').trim()}`);\n }\n if (toolUses.length > 0) {\n logger.debugMessage(`[${this.id}] used tools: ${toolUses.join(', ')}`);\n }\n this.manager.stats.updateStats({\n newToolCalls: toolUses.length,\n newInputTokens: outputData.message.usage.input_tokens,\n newOutputTokens: outputData.message.usage.output_tokens,\n newCachedInputTokens:\n outputData.message.usage.cache_read_input_tokens ?? 0,\n });\n } else if (outputData.type === 'result') {\n if (!outputData.is_error) {\n logger.verboseMessage(\n `[${this.id}] finished task.\\nCost: $${Number(outputData.cost_usd).toFixed(2)}\\nDuration: ${\n Number(outputData.duration_ms) / 1000\n }s`\n );\n } else {\n logger.verboseMessage(\n `[${this.id}] finished task with error: ${outputData.subtype}\\nCost: $${outputData.cost_usd}\\nDuration: ${\n Number(outputData.duration_ms) / 1000\n }s`\n );\n }\n if (outputData.subtype === 'success') {\n this.changes.push(outputData.result);\n }\n this.manager.stats.updateStats({\n newCost: Number(outputData.cost_usd),\n newWallDuration: Number(outputData.duration_ms),\n newApiDuration: Number(outputData.duration_api_ms),\n newTurns: Number(outputData.num_turns),\n });\n this.turns = Number(outputData.num_turns);\n } else if (outputData.type === 'system') {\n if (outputData.subtype === 'init') {\n this.sessionId = outputData.session_id;\n }\n }\n }\n\n generateReport(): string {\n return this.changes.join('\\n');\n }\n}\n"]}
@@ -1,9 +1,10 @@
1
- import { LocadexConfig } from '../types/cli.js';
2
- export declare function validateInitialConfig(): Promise<void>;
1
+ import { CliOptions, LocadexConfig } from '../types/cli.js';
2
+ export declare function validateConfig(options: CliOptions): Promise<void>;
3
3
  export declare function createConfig(directory: string, options: {
4
4
  batchSize: number;
5
5
  maxConcurrency: number;
6
6
  matchingFiles: string[];
7
+ timeout: number;
7
8
  }): void;
8
- export declare function getConfig(directory: string, options?: Partial<LocadexConfig>): LocadexConfig;
9
+ export declare function getConfig(locadexDir: string, rootDir: string, appDir: string, options?: Partial<LocadexConfig>): LocadexConfig;
9
10
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"/","sources":["utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,wBAAsB,qBAAqB,kBAQ1C;AAID,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB,QAcF;AAQD,wBAAgB,SAAS,CACvB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,OAAO,CAAC,aAAa,CAAM,GACnC,aAAa,CA4Bf"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"/","sources":["utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG5D,wBAAsB,cAAc,CAAC,OAAO,EAAE,UAAU,iBA8BvD;AAID,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB,QAeF;AAED,wBAAgB,SAAS,CACvB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,OAAO,CAAC,aAAa,CAAM,GACnC,aAAa,CA0Bf"}
@@ -1,15 +1,34 @@
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]="25044f10-3084-5717-91fe-cee3aa030acd")}catch(e){}}();
3
1
  import { existsSync, readFileSync, writeFileSync } from 'node:fs';
4
2
  import { logger } from '../logging/logger.js';
5
3
  import path from 'node:path';
6
4
  import { exit } from './shutdown.js';
7
- export async function validateInitialConfig() {
5
+ export async function validateConfig(options) {
8
6
  // Validate ANTHROPIC_API_KEY
9
7
  if (!process.env.ANTHROPIC_API_KEY) {
10
- logger.error('ANTHROPIC_API_KEY is not set! Please set it as an environment variable or in a .env | .env.local file.');
8
+ console.error('ANTHROPIC_API_KEY is not set! Please set it as an environment variable or in a .env | .env.local file.');
11
9
  await exit(1);
12
10
  }
11
+ if (options.timeout) {
12
+ const timeout = Number(options.timeout);
13
+ if (isNaN(timeout) || timeout <= 0) {
14
+ console.error('Invalid timeout value. Please provide a positive number.');
15
+ await exit(1);
16
+ }
17
+ }
18
+ if (options.batchSize) {
19
+ const batchSize = Number(options.batchSize);
20
+ if (isNaN(batchSize) || batchSize < 1) {
21
+ console.error('Invalid batch size. Please provide a positive number.');
22
+ await exit(1);
23
+ }
24
+ }
25
+ if (options.concurrency) {
26
+ const concurrency = Number(options.concurrency);
27
+ if (isNaN(concurrency) || concurrency < 1) {
28
+ console.error('Invalid concurrency. Please provide a positive number.');
29
+ await exit(1);
30
+ }
31
+ }
13
32
  }
14
33
  const CONFIG_FILE_NAME = 'locadex.config.json';
15
34
  export function createConfig(directory, options) {
@@ -21,16 +40,18 @@ export function createConfig(directory, options) {
21
40
  batchSize: options.batchSize,
22
41
  maxConcurrency: options.maxConcurrency,
23
42
  matchingFiles: options.matchingFiles,
43
+ timeout: options.timeout,
24
44
  };
25
45
  writeFileSync(configPath, JSON.stringify(config, null, 2));
26
46
  }
27
- const DEFAULT_CONFIG = {
28
- batchSize: 10,
29
- maxConcurrency: 1,
30
- matchingFiles: ['**/*.{ts,tsx,js,jsx}'],
31
- };
32
- export function getConfig(directory, options = {}) {
33
- const configPath = path.resolve(directory, CONFIG_FILE_NAME);
47
+ export function getConfig(locadexDir, rootDir, appDir, options = {}) {
48
+ const DEFAULT_CONFIG = {
49
+ batchSize: 10,
50
+ maxConcurrency: 1,
51
+ matchingFiles: [`${path.relative(rootDir, appDir)}/**/*.{ts,tsx,js,jsx}`],
52
+ timeout: 60,
53
+ };
54
+ const configPath = path.resolve(locadexDir, CONFIG_FILE_NAME);
34
55
  let fileConfig = {};
35
56
  // Load config file if it exists
36
57
  if (existsSync(configPath)) {
@@ -44,14 +65,6 @@ export function getConfig(directory, options = {}) {
44
65
  }
45
66
  // Merge configurations: defaults < file config < passed options
46
67
  const mergedConfig = { ...DEFAULT_CONFIG, ...fileConfig, ...options };
47
- // Use hierarchy for arrays: options > file config > defaults
48
- mergedConfig.matchingFiles =
49
- options.matchingFiles && options.matchingFiles.length > 0
50
- ? options.matchingFiles
51
- : fileConfig.matchingFiles && fileConfig.matchingFiles.length > 0
52
- ? fileConfig.matchingFiles
53
- : DEFAULT_CONFIG.matchingFiles;
54
68
  return mergedConfig;
55
69
  }
56
- //# sourceMappingURL=config.js.map
57
- //# debugId=25044f10-3084-5717-91fe-cee3aa030acd
70
+ //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sources":["utils/config.ts"],"sourceRoot":"/","sourcesContent":["import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { logger } from '../logging/logger.js';\nimport path from 'node:path';\nimport { LocadexConfig } from '../types/cli.js';\nimport { exit } from './shutdown.js';\n\nexport async function validateInitialConfig() {\n // Validate ANTHROPIC_API_KEY\n if (!process.env.ANTHROPIC_API_KEY) {\n logger.error(\n 'ANTHROPIC_API_KEY is not set! Please set it as an environment variable or in a .env | .env.local file.'\n );\n await exit(1);\n }\n}\n\nconst CONFIG_FILE_NAME = 'locadex.config.json';\n\nexport function createConfig(\n directory: string,\n options: {\n batchSize: number;\n maxConcurrency: number;\n matchingFiles: string[];\n }\n) {\n const configPath = path.resolve(directory, CONFIG_FILE_NAME);\n if (existsSync(configPath)) {\n return;\n }\n\n const config = {\n batchSize: options.batchSize,\n maxConcurrency: options.maxConcurrency,\n matchingFiles: options.matchingFiles,\n };\n\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n}\n\nconst DEFAULT_CONFIG: LocadexConfig = {\n batchSize: 10,\n maxConcurrency: 1,\n matchingFiles: ['**/*.{ts,tsx,js,jsx}'],\n};\n\nexport function getConfig(\n directory: string,\n options: Partial<LocadexConfig> = {}\n): LocadexConfig {\n const configPath = path.resolve(directory, CONFIG_FILE_NAME);\n let fileConfig: Partial<LocadexConfig> = {};\n\n // Load config file if it exists\n if (existsSync(configPath)) {\n try {\n fileConfig = JSON.parse(readFileSync(configPath, 'utf8'));\n } catch (error) {\n logger.error(\n `Error parsing config file ${configPath}: ${error instanceof Error ? error.message : String(error)}`\n );\n // Continue with empty file config on parse error\n }\n }\n\n // Merge configurations: defaults < file config < passed options\n const mergedConfig = { ...DEFAULT_CONFIG, ...fileConfig, ...options };\n\n // Use hierarchy for arrays: options > file config > defaults\n mergedConfig.matchingFiles =\n options.matchingFiles && options.matchingFiles.length > 0\n ? options.matchingFiles\n : fileConfig.matchingFiles && fileConfig.matchingFiles.length > 0\n ? fileConfig.matchingFiles\n : DEFAULT_CONFIG.matchingFiles;\n\n return mergedConfig;\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,6BAA6B;IAC7B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QACnC,MAAM,CAAC,KAAK,CACV,wGAAwG,CACzG,CAAC;QACF,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AAE/C,MAAM,UAAU,YAAY,CAC1B,SAAiB,EACjB,OAIC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAC7D,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG;QACb,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC;IAEF,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,cAAc,GAAkB;IACpC,SAAS,EAAE,EAAE;IACb,cAAc,EAAE,CAAC;IACjB,aAAa,EAAE,CAAC,sBAAsB,CAAC;CACxC,CAAC;AAEF,MAAM,UAAU,SAAS,CACvB,SAAiB,EACjB,UAAkC,EAAE;IAEpC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAC7D,IAAI,UAAU,GAA2B,EAAE,CAAC;IAE5C,gCAAgC;IAChC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CACV,6BAA6B,UAAU,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACrG,CAAC;YACF,iDAAiD;QACnD,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,MAAM,YAAY,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,EAAE,CAAC;IAEtE,6DAA6D;IAC7D,YAAY,CAAC,aAAa;QACxB,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;YACvD,CAAC,CAAC,OAAO,CAAC,aAAa;YACvB,CAAC,CAAC,UAAU,CAAC,aAAa,IAAI,UAAU,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;gBAC/D,CAAC,CAAC,UAAU,CAAC,aAAa;gBAC1B,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC;IAErC,OAAO,YAAY,CAAC;AACtB,CAAC","debug_id":"25044f10-3084-5717-91fe-cee3aa030acd"}
1
+ {"version":3,"file":"config.js","sourceRoot":"/","sources":["utils/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { logger } from '../logging/logger.js';\nimport path from 'node:path';\nimport { CliOptions, LocadexConfig } from '../types/cli.js';\nimport { exit } from './shutdown.js';\n\nexport async function validateConfig(options: CliOptions) {\n // Validate ANTHROPIC_API_KEY\n if (!process.env.ANTHROPIC_API_KEY) {\n console.error(\n 'ANTHROPIC_API_KEY is not set! Please set it as an environment variable or in a .env | .env.local file.'\n );\n await exit(1);\n }\n\n if (options.timeout) {\n const timeout = Number(options.timeout);\n if (isNaN(timeout) || timeout <= 0) {\n console.error('Invalid timeout value. Please provide a positive number.');\n await exit(1);\n }\n }\n if (options.batchSize) {\n const batchSize = Number(options.batchSize);\n if (isNaN(batchSize) || batchSize < 1) {\n console.error('Invalid batch size. Please provide a positive number.');\n await exit(1);\n }\n }\n if (options.concurrency) {\n const concurrency = Number(options.concurrency);\n if (isNaN(concurrency) || concurrency < 1) {\n console.error('Invalid concurrency. Please provide a positive number.');\n await exit(1);\n }\n }\n}\n\nconst CONFIG_FILE_NAME = 'locadex.config.json';\n\nexport function createConfig(\n directory: string,\n options: {\n batchSize: number;\n maxConcurrency: number;\n matchingFiles: string[];\n timeout: number;\n }\n) {\n const configPath = path.resolve(directory, CONFIG_FILE_NAME);\n if (existsSync(configPath)) {\n return;\n }\n\n const config = {\n batchSize: options.batchSize,\n maxConcurrency: options.maxConcurrency,\n matchingFiles: options.matchingFiles,\n timeout: options.timeout,\n };\n\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n}\n\nexport function getConfig(\n locadexDir: string,\n rootDir: string,\n appDir: string,\n options: Partial<LocadexConfig> = {}\n): LocadexConfig {\n const DEFAULT_CONFIG: LocadexConfig = {\n batchSize: 10,\n maxConcurrency: 1,\n matchingFiles: [`${path.relative(rootDir, appDir)}/**/*.{ts,tsx,js,jsx}`],\n timeout: 60,\n };\n const configPath = path.resolve(locadexDir, CONFIG_FILE_NAME);\n let fileConfig: Partial<LocadexConfig> = {};\n\n // Load config file if it exists\n if (existsSync(configPath)) {\n try {\n fileConfig = JSON.parse(readFileSync(configPath, 'utf8'));\n } catch (error) {\n logger.error(\n `Error parsing config file ${configPath}: ${error instanceof Error ? error.message : String(error)}`\n );\n // Continue with empty file config on parse error\n }\n }\n\n // Merge configurations: defaults < file config < passed options\n const mergedConfig = { ...DEFAULT_CONFIG, ...fileConfig, ...options };\n\n return mergedConfig;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"createDag.d.ts","sourceRoot":"/","sources":["utils/dag/createDag.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7B,CAAC;AAEF,qBAAa,GAAG;IACd,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,gBAAgB,CAAW;gBAEvB,GAAG,EAAE,OAAO;IAQxB,OAAO,CAAC,SAAS;IAsCjB,OAAO,CAAC,qBAAqB;IAwB7B,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAK3C,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAKzC,MAAM,IAAI,OAAO;IAIjB,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAIzC,mBAAmB,IAAI,MAAM,EAAE;CAGhC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,GAAG,GAAG,CAgCnE"}
1
+ {"version":3,"file":"createDag.d.ts","sourceRoot":"/","sources":["utils/dag/createDag.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7B,CAAC;AAEF,qBAAa,GAAG;IACd,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,gBAAgB,CAAW;gBAEvB,GAAG,EAAE,OAAO;IAQxB,OAAO,CAAC,SAAS;IAyCjB,OAAO,CAAC,qBAAqB;IAwB7B,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAK3C,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAKzC,MAAM,IAAI,OAAO;IAIjB,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAIzC,mBAAmB,IAAI,MAAM,EAAE;CAGhC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,GAAG,GAAG,CAkCnE"}