codemerge-cli 1.3.0 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +57 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/help.d.ts +10 -0
  6. package/dist/commands/help.d.ts.map +1 -0
  7. package/dist/commands/help.js +44 -0
  8. package/dist/commands/help.js.map +1 -0
  9. package/dist/commands/init.d.ts +9 -0
  10. package/dist/commands/init.d.ts.map +1 -0
  11. package/dist/commands/init.js +89 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/use.d.ts +6 -0
  14. package/dist/commands/use.d.ts.map +1 -0
  15. package/dist/commands/use.js +54 -0
  16. package/dist/commands/use.js.map +1 -0
  17. package/dist/commands/version.d.ts +9 -0
  18. package/dist/commands/version.d.ts.map +1 -0
  19. package/dist/commands/version.js +32 -0
  20. package/dist/commands/version.js.map +1 -0
  21. package/dist/commands/watch.d.ts +9 -0
  22. package/dist/commands/watch.d.ts.map +1 -0
  23. package/dist/commands/watch.js +83 -0
  24. package/dist/commands/watch.js.map +1 -0
  25. package/dist/core/codeMerger.d.ts +18 -0
  26. package/dist/core/codeMerger.d.ts.map +1 -0
  27. package/dist/core/codeMerger.js +281 -0
  28. package/dist/core/codeMerger.js.map +1 -0
  29. package/dist/core/config.d.ts +14 -0
  30. package/dist/core/config.d.ts.map +1 -0
  31. package/dist/core/config.js +78 -0
  32. package/dist/core/config.js.map +1 -0
  33. package/dist/core/fileWatcher.d.ts +13 -0
  34. package/dist/core/fileWatcher.d.ts.map +1 -0
  35. package/dist/core/fileWatcher.js +65 -0
  36. package/dist/core/fileWatcher.js.map +1 -0
  37. package/dist/core/httpServer.d.ts +31 -0
  38. package/dist/core/httpServer.d.ts.map +1 -0
  39. package/dist/core/httpServer.js +298 -0
  40. package/dist/core/httpServer.js.map +1 -0
  41. package/dist/core/mergeCache.d.ts +10 -0
  42. package/dist/core/mergeCache.d.ts.map +1 -0
  43. package/dist/core/mergeCache.js +22 -0
  44. package/dist/core/mergeCache.js.map +1 -0
  45. package/dist/types/config.d.ts +19 -0
  46. package/dist/types/config.d.ts.map +1 -0
  47. package/dist/types/config.js +2 -0
  48. package/dist/types/config.js.map +1 -0
  49. package/dist/types/merge.d.ts +95 -0
  50. package/dist/types/merge.d.ts.map +1 -0
  51. package/dist/types/merge.js +2 -0
  52. package/dist/types/merge.js.map +1 -0
  53. package/dist/utils/fileUtils.d.ts +12 -0
  54. package/dist/utils/fileUtils.d.ts.map +1 -0
  55. package/dist/utils/fileUtils.js +47 -0
  56. package/dist/utils/fileUtils.js.map +1 -0
  57. package/dist/utils/logger.d.ts +13 -0
  58. package/dist/utils/logger.d.ts.map +1 -0
  59. package/dist/utils/logger.js +34 -0
  60. package/dist/utils/logger.js.map +1 -0
  61. package/dist/utils/pathUtils.d.ts +10 -0
  62. package/dist/utils/pathUtils.d.ts.map +1 -0
  63. package/dist/utils/pathUtils.js +29 -0
  64. package/dist/utils/pathUtils.js.map +1 -0
  65. package/dist/utils/pattern.d.ts +8 -0
  66. package/dist/utils/pattern.d.ts.map +1 -0
  67. package/dist/utils/pattern.js +90 -0
  68. package/dist/utils/pattern.js.map +1 -0
  69. package/dist/utils/patternUtils.d.ts +8 -0
  70. package/dist/utils/patternUtils.d.ts.map +1 -0
  71. package/dist/utils/patternUtils.js +90 -0
  72. package/dist/utils/patternUtils.js.map +1 -0
  73. package/dist/utils/proccessCmd.d.ts +4 -0
  74. package/dist/utils/proccessCmd.d.ts.map +1 -0
  75. package/dist/utils/proccessCmd.js +29 -0
  76. package/dist/utils/proccessCmd.js.map +1 -0
  77. package/dist/utils/processUtils.d.ts +4 -0
  78. package/dist/utils/processUtils.d.ts.map +1 -0
  79. package/dist/utils/processUtils.js +29 -0
  80. package/dist/utils/processUtils.js.map +1 -0
  81. package/dist/utils/translate.d.ts +2 -0
  82. package/dist/utils/translate.d.ts.map +1 -0
  83. package/dist/utils/translate.js +29 -0
  84. package/dist/utils/translate.js.map +1 -0
  85. package/dist/utils/translateUtils.d.ts +2 -0
  86. package/dist/utils/translateUtils.d.ts.map +1 -0
  87. package/dist/utils/translateUtils.js +29 -0
  88. package/dist/utils/translateUtils.js.map +1 -0
  89. package/package.json +5 -5
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../lib/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { readFileSync, readdirSync } from 'fs';
4
+ import { dirname, join, extname } from 'path';
5
+ import { fileURLToPath, pathToFileURL } from 'url';
6
+ import { Logger } from './utils/logger.js';
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = dirname(__filename);
9
+ class CLI {
10
+ program;
11
+ constructor() {
12
+ this.program = new Command();
13
+ this.setupProgram();
14
+ }
15
+ setupProgram() {
16
+ const packagePath = join(__dirname, '../package.json');
17
+ const packageJson = JSON.parse(readFileSync(packagePath, 'utf-8'));
18
+ this.program.name('codemerge').description(packageJson.description).version(packageJson.version);
19
+ }
20
+ async registerCommands() {
21
+ const commandsPath = join(__dirname, 'commands');
22
+ const files = readdirSync(commandsPath).filter(file => extname(file) === '.js');
23
+ for (const file of files) {
24
+ await this.registerCommand(commandsPath, file);
25
+ }
26
+ }
27
+ async registerCommand(commandsPath, fileName) {
28
+ try {
29
+ const filePath = join(commandsPath, fileName);
30
+ const fileUrl = pathToFileURL(filePath).href;
31
+ const module = await import(fileUrl);
32
+ const CommandClass = module[Object.keys(module).find(key => key.includes('Command')) || ''];
33
+ if (!CommandClass) {
34
+ Logger.warning(`Skipping ${fileName}: No command class found`);
35
+ return;
36
+ }
37
+ const commandInstance = new CommandClass();
38
+ if (typeof commandInstance.register !== 'function') {
39
+ Logger.warning(`Skipping ${fileName}: Missing register method`);
40
+ return;
41
+ }
42
+ commandInstance.register(this.program);
43
+ }
44
+ catch (error) {
45
+ Logger.error(`Failed to load ${fileName}: ${error instanceof Error ? error.message : 'Unknown error'}`);
46
+ }
47
+ }
48
+ async run() {
49
+ await this.registerCommands();
50
+ this.program.parse(process.argv);
51
+ }
52
+ }
53
+ (async () => {
54
+ const cli = new CLI();
55
+ await cli.run();
56
+ })();
57
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../lib/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Command } from 'commander';
2
+ export declare class HelpCommand {
3
+ register(program: Command): void;
4
+ private execute;
5
+ private displayBanner;
6
+ private displayHelp;
7
+ private displayCommandHelp;
8
+ private getPackageJson;
9
+ }
10
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../lib/commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,qBAAa,WAAW;IACf,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;YAIzB,OAAO;IAUrB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,cAAc;CAIvB"}
@@ -0,0 +1,44 @@
1
+ import { FileUtils } from '../utils/fileUtils.js';
2
+ import { PathUtils } from '../utils/pathUtils.js';
3
+ import { Logger } from '../utils/logger.js';
4
+ export class HelpCommand {
5
+ register(program) {
6
+ program.command('help').description('Display help information').argument('[command]', 'Command to get help for').action((command) => this.execute(program, command));
7
+ }
8
+ async execute(program, command) {
9
+ try {
10
+ this.displayBanner();
11
+ this.displayHelp(program, command);
12
+ }
13
+ catch (error) {
14
+ Logger.error(error instanceof Error ? error.message : 'Unexpected error occurred');
15
+ process.exit(1);
16
+ }
17
+ }
18
+ displayBanner() {
19
+ const packageJson = this.getPackageJson();
20
+ const name = packageJson.name.replace('-', ' ').toUpperCase();
21
+ Logger.figlet(name);
22
+ }
23
+ displayHelp(program, command) {
24
+ if (command) {
25
+ this.displayCommandHelp(program, command);
26
+ return;
27
+ }
28
+ program.help();
29
+ }
30
+ displayCommandHelp(program, commandName) {
31
+ const cmd = program.commands.find(c => c.name() === commandName);
32
+ if (cmd) {
33
+ cmd.help();
34
+ return;
35
+ }
36
+ Logger.error(`Command '${commandName}' not found`);
37
+ program.help();
38
+ }
39
+ getPackageJson() {
40
+ const packagePath = PathUtils.getPackagePath(import.meta.url, 'package.json');
41
+ return FileUtils.readJson(packagePath);
42
+ }
43
+ }
44
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../lib/commands/help.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAI5C,MAAM,OAAO,WAAW;IACf,QAAQ,CAAC,OAAgB;QAC9B,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC,OAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAChL,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,OAAgB,EAAE,OAAgB;QACtD,IAAI,CAAC;YACH,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC;YACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAEO,WAAW,CAAC,OAAgB,EAAE,OAAgB;QACpD,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QACD,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;IAEO,kBAAkB,CAAC,OAAgB,EAAE,WAAmB;QAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,WAAW,CAAC,CAAC;QACjE,IAAI,GAAG,EAAE,CAAC;YACR,GAAG,CAAC,IAAI,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,YAAY,WAAW,aAAa,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;IAEO,cAAc;QACpB,MAAM,WAAW,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC9E,OAAO,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { Command } from 'commander';
2
+ export declare class InitCommand {
3
+ register: (program: Command) => void;
4
+ private execute;
5
+ private getProjectName;
6
+ private createConfigFile;
7
+ private updateGitignore;
8
+ }
9
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../lib/commands/init.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,qBAAa,WAAW;IACf,QAAQ,GAAI,SAAS,OAAO,KAAG,IAAI,CAExC;IAEF,OAAO,CAAC,OAAO,CAuBb;IAEF,OAAO,CAAC,cAAc,CAUpB;IAEF,OAAO,CAAC,gBAAgB,CAyBtB;IAEF,OAAO,CAAC,eAAe,CAWrB;CACH"}
@@ -0,0 +1,89 @@
1
+ import { readFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { PathUtils } from '../utils/pathUtils.js';
4
+ import { FileUtils } from '../utils/fileUtils.js';
5
+ import { Logger } from '../utils/logger.js';
6
+ export class InitCommand {
7
+ register = (program) => {
8
+ program.command('init').description('Initialize CodeMerge project structure').argument('[path]', 'Target directory', '.').option('-f, --force', 'Overwrite existing files').action(this.execute);
9
+ };
10
+ execute = async (targetPath, options) => {
11
+ try {
12
+ Logger.info('Initializing CodeMerge project...');
13
+ const resolvedPath = PathUtils.resolve(targetPath);
14
+ const configPath = join(resolvedPath, 'codemerge.json');
15
+ if (!options.force && FileUtils.exists(configPath)) {
16
+ Logger.error('codemerge.json already exists. Use --force to overwrite.');
17
+ process.exit(1);
18
+ }
19
+ const projectName = this.getProjectName(resolvedPath);
20
+ const outputPath = projectName ? `${projectName}-merged.txt` : 'merged-output.txt';
21
+ this.createConfigFile(configPath, outputPath, projectName);
22
+ this.updateGitignore(resolvedPath, outputPath);
23
+ Logger.success('Configuration file created: codemerge.json');
24
+ Logger.plain('Output file added to .gitignore: ' + outputPath);
25
+ Logger.plain('');
26
+ Logger.plain('Next steps:');
27
+ Logger.plain(' 1. Review codemerge.json settings');
28
+ Logger.plain(' 2. Run: codemerge use');
29
+ }
30
+ catch (error) {
31
+ Logger.error(error instanceof Error ? error.message : 'Unexpected error occurred');
32
+ process.exit(1);
33
+ }
34
+ };
35
+ getProjectName = (basePath) => {
36
+ const packagePath = join(basePath, 'package.json');
37
+ if (!FileUtils.exists(packagePath))
38
+ return null;
39
+ try {
40
+ const pkg = FileUtils.readJson(packagePath);
41
+ if (!pkg.name)
42
+ return null;
43
+ return pkg.name.replace(/^@.*?\//, '').replace(/[^a-zA-Z0-9-_]/g, '-').toLowerCase();
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ };
49
+ createConfigFile = (configPath, outputPath, projectName) => {
50
+ const config = {
51
+ projectName: projectName ?? 'codemerge-project',
52
+ outputPath,
53
+ port: 9876,
54
+ useGitignore: true,
55
+ onStartCommand: '',
56
+ onStartCommandLogs: false,
57
+ onUpsertCommand: '',
58
+ includePatterns: [
59
+ '***.tsx',
60
+ '***.jsx',
61
+ '***.log',
62
+ 'package-lock.json',
63
+ 'yarn.lock',
64
+ 'pnpm-lock.yaml',
65
+ 'codemerge.json',
66
+ 'merged-output.txt',
67
+ '.env',
68
+ '.env.*',
69
+ '**/.DS_Store',
70
+ 'coverage'
71
+ ]
72
+ };
73
+ FileUtils.write(configPath, JSON.stringify(config, null, 2) + '\n');
74
+ };
75
+ updateGitignore = (basePath, outputFileName) => {
76
+ const gitignorePath = join(basePath, '.gitignore');
77
+ if (!FileUtils.exists(gitignorePath)) {
78
+ FileUtils.write(gitignorePath, outputFileName + '\n');
79
+ return;
80
+ }
81
+ const content = readFileSync(gitignorePath, 'utf-8');
82
+ const lines = content.split('\n');
83
+ if (lines.some(line => line.trim() === outputFileName))
84
+ return;
85
+ const newContent = content.endsWith('\n') ? content + outputFileName + '\n' : content + '\n' + outputFileName + '\n';
86
+ FileUtils.write(gitignorePath, newContent);
87
+ };
88
+ }
89
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../lib/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ export declare class UseCommand {
3
+ register(program: Command): void;
4
+ private execute;
5
+ }
6
+ //# sourceMappingURL=use.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.d.ts","sourceRoot":"","sources":["../../lib/commands/use.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,qBAAa,UAAU;IACd,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;YAIzB,OAAO;CAkDtB"}
@@ -0,0 +1,54 @@
1
+ import { ProcessUtils } from '../utils/processUtils.js';
2
+ import { CodeMerger } from '../core/codeMerger.js';
3
+ import { Config } from '../core/config.js';
4
+ import { FileWatcher } from '../core/fileWatcher.js';
5
+ import { Logger } from '../utils/logger.js';
6
+ export class UseCommand {
7
+ register(program) {
8
+ program.command('use').description('Merge code files into a single output file').argument('[path]', 'Input path to scan', '.').option('-o, --output <path>', 'Output file path').option('-w, --watch', 'Watch for file changes').option('--ignore <patterns>', 'Additional ignore patterns (comma-separated)').option('--include <patterns>', 'Include patterns (comma-separated)').action(this.execute.bind(this));
9
+ }
10
+ async execute(inputPath, options) {
11
+ try {
12
+ Logger.info('Starting code merge...');
13
+ const config = Config.load(inputPath);
14
+ const mergeOptions = Config.merge(config, {
15
+ inputPath,
16
+ outputPath: options.output,
17
+ watch: options.watch,
18
+ ignorePatterns: options.ignore ? options.ignore.split(',') : undefined,
19
+ includePatterns: options.include ? options.include.split(',') : undefined
20
+ });
21
+ if (mergeOptions.onStartCommand) {
22
+ ProcessUtils.runCommand(mergeOptions.onStartCommand, mergeOptions.onStartCommandLogs);
23
+ }
24
+ const merger = new CodeMerger(mergeOptions);
25
+ const result = await merger.execute();
26
+ if (!result.success) {
27
+ Logger.error('Merge failed:');
28
+ result.errors.forEach(error => Logger.error(' ' + error));
29
+ process.exit(1);
30
+ }
31
+ Logger.success('Merged ' + result.filesProcessed + ' files into ' + result.outputPath);
32
+ if (mergeOptions.watch) {
33
+ const watcher = new FileWatcher(mergeOptions, async () => {
34
+ const result = await merger.execute();
35
+ if (result.success) {
36
+ Logger.success('Merged ' + result.filesProcessed + ' files into ' + result.outputPath);
37
+ }
38
+ });
39
+ watcher.start();
40
+ process.on('SIGINT', () => {
41
+ Logger.plain('\nStopping watcher...');
42
+ watcher.stop();
43
+ process.exit(0);
44
+ });
45
+ Logger.plain('Press Ctrl+C to stop watching');
46
+ }
47
+ }
48
+ catch (error) {
49
+ Logger.error(error instanceof Error ? error.message : 'Unexpected error occurred');
50
+ process.exit(1);
51
+ }
52
+ }
53
+ }
54
+ //# sourceMappingURL=use.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.js","sourceRoot":"","sources":["../../lib/commands/use.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAI5C,MAAM,OAAO,UAAU;IACd,QAAQ,CAAC,OAAgB;QAC9B,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,4CAA4C,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,wBAAwB,CAAC,CAAC,MAAM,CAAC,qBAAqB,EAAE,8CAA8C,CAAC,CAAC,MAAM,CAAC,sBAAsB,EAAE,oCAAoC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtZ,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,OAAuB;QAC9D,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAEtC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE;gBACxC,SAAS;gBACT,UAAU,EAAE,OAAO,CAAC,MAAM;gBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;gBACtE,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;aAC1E,CAAC,CAAC;YAEH,IAAI,YAAY,CAAC,cAAc,EAAE,CAAC;gBAChC,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,cAAc,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC;YACxF,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YAEtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;gBAC9B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,cAAc,GAAG,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;YAEvF,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;gBACvB,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;oBACvD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;oBACtC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACnB,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,cAAc,GAAG,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;oBACzF,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,OAAO,CAAC,KAAK,EAAE,CAAC;gBAEhB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;oBACxB,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;oBACtC,OAAO,CAAC,IAAI,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC;YACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { Command } from 'commander';
2
+ export declare class VersionCommand {
3
+ register(program: Command): void;
4
+ private execute;
5
+ private displayBanner;
6
+ private displayVersion;
7
+ private getPackageJson;
8
+ }
9
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../lib/commands/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,qBAAa,cAAc;IAClB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;YAIzB,OAAO;IAUrB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,cAAc;CAIvB"}
@@ -0,0 +1,32 @@
1
+ import { FileUtils } from '../utils/fileUtils.js';
2
+ import { PathUtils } from '../utils/pathUtils.js';
3
+ import { Logger } from '../utils/logger.js';
4
+ export class VersionCommand {
5
+ register(program) {
6
+ program.command('version').description('Display version information').action(() => this.execute());
7
+ }
8
+ async execute() {
9
+ try {
10
+ this.displayBanner();
11
+ this.displayVersion();
12
+ }
13
+ catch (error) {
14
+ Logger.error(error instanceof Error ? error.message : 'Unexpected error occurred');
15
+ process.exit(1);
16
+ }
17
+ }
18
+ displayBanner() {
19
+ const packageJson = this.getPackageJson();
20
+ const name = packageJson.name.replace('-', ' ').toUpperCase();
21
+ Logger.figlet(name);
22
+ }
23
+ displayVersion() {
24
+ const packageJson = this.getPackageJson();
25
+ Logger.info(`Version: ${packageJson.version}`);
26
+ }
27
+ getPackageJson() {
28
+ const packagePath = PathUtils.getPackagePath(import.meta.url, 'package.json');
29
+ return FileUtils.readJson(packagePath);
30
+ }
31
+ }
32
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../lib/commands/version.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,OAAO,cAAc;IAClB,QAAQ,CAAC,OAAgB;QAC9B,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,6BAA6B,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACrG,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC;YACH,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC;YACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAEO,cAAc;QACpB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,YAAY,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC;IAEO,cAAc;QACpB,MAAM,WAAW,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC9E,OAAO,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { Command } from 'commander';
2
+ export declare class WatchCommand {
3
+ register(program: Command): void;
4
+ private execute;
5
+ private performInitialMerge;
6
+ private getProjectName;
7
+ private setupGracefulShutdown;
8
+ }
9
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../lib/commands/watch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,qBAAa,YAAY;IAChB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;YAIzB,OAAO;YAmDP,mBAAmB;IAajC,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,qBAAqB;CAW9B"}
@@ -0,0 +1,83 @@
1
+ import { basename, resolve } from 'path';
2
+ import { ProcessUtils } from '../utils/processUtils.js';
3
+ import { FileWatcher } from '../core/fileWatcher.js';
4
+ import { HttpServer } from '../core/httpServer.js';
5
+ import { CodeMerger } from '../core/codeMerger.js';
6
+ import { MergeCache } from '../core/mergeCache.js';
7
+ import { Logger } from '../utils/logger.js';
8
+ import { Config } from '../core/config.js';
9
+ export class WatchCommand {
10
+ register(program) {
11
+ program.command('watch').description('Start HTTP server and watch for file changes').argument('[path]', 'Input path to scan', '.').option('-o, --output <path>', 'Output file path').option('-p, --port <number>', 'Server port', '9876').option('--ignore <patterns>', 'Additional ignore patterns (comma-separated)').option('--include <patterns>', 'Include patterns (comma-separated)').action(this.execute.bind(this));
12
+ }
13
+ async execute(inputPath, options) {
14
+ try {
15
+ Logger.info('Starting watch mode...');
16
+ const config = Config.load(inputPath);
17
+ const mergeOptions = Config.merge(config, {
18
+ inputPath,
19
+ outputPath: options.output,
20
+ watch: true,
21
+ writeOutput: false,
22
+ ignorePatterns: options.ignore ? options.ignore.split(',') : undefined,
23
+ includePatterns: options.include ? options.include.split(',') : undefined
24
+ });
25
+ if (mergeOptions.onStartCommand)
26
+ ProcessUtils.runCommand(mergeOptions.onStartCommand, mergeOptions.onStartCommandLogs);
27
+ const projectName = this.getProjectName(mergeOptions.outputPath);
28
+ const port = parseInt(options.port || '9876', 10);
29
+ const cache = new MergeCache();
30
+ const basePath = resolve(mergeOptions.inputPath);
31
+ const merger = new CodeMerger(mergeOptions);
32
+ await this.performInitialMerge(merger, cache);
33
+ const server = new HttpServer(port, projectName, cache, basePath);
34
+ server.setMerger(merger, mergeOptions);
35
+ await server.start();
36
+ const watcher = new FileWatcher(mergeOptions, async () => {
37
+ await this.performInitialMerge(merger, cache);
38
+ });
39
+ watcher.start();
40
+ this.setupGracefulShutdown(server, watcher);
41
+ Logger.success(`Server running at http://localhost:${port}`);
42
+ Logger.plain(` Merge endpoint: http://localhost:${port}/content`);
43
+ Logger.plain(` Structure endpoint: http://localhost:${port}/structure`);
44
+ Logger.plain(` Selective content: http://localhost:${port}/selective-content`);
45
+ Logger.plain(` Upsert endpoint: http://localhost:${port}/upsert`);
46
+ Logger.plain(` Delete files endpoint: http://localhost:${port}/delete-files`);
47
+ Logger.plain(` Commit endpoint: http://localhost:${port}/commit`);
48
+ Logger.plain(` Command output endpoint: http://localhost:${port}/command-output`);
49
+ Logger.plain(` Health endpoint: http://localhost:${port}/health`);
50
+ Logger.plain('Press Ctrl+C to stop');
51
+ }
52
+ catch (error) {
53
+ Logger.error(error instanceof Error ? error.message : 'Unexpected error occurred');
54
+ process.exit(1);
55
+ }
56
+ }
57
+ async performInitialMerge(merger, cache) {
58
+ const result = await merger.execute();
59
+ if (!result.success) {
60
+ Logger.error('Initial merge failed');
61
+ result.errors.forEach(error => Logger.error(' ' + error));
62
+ return;
63
+ }
64
+ if (result.content)
65
+ cache.set(result.content);
66
+ Logger.success(`Merged ${result.filesProcessed} files`);
67
+ }
68
+ getProjectName(outputPath) {
69
+ const fileName = basename(outputPath);
70
+ return fileName.replace(/\.[^/.]+$/, '').replace(/[^a-zA-Z0-9-_]/g, '-').toLowerCase();
71
+ }
72
+ setupGracefulShutdown(server, watcher) {
73
+ const shutdown = () => {
74
+ Logger.plain('\nStopping server and watcher...');
75
+ server.stop();
76
+ watcher.stop();
77
+ process.exit(0);
78
+ };
79
+ process.on('SIGINT', shutdown);
80
+ process.on('SIGTERM', shutdown);
81
+ }
82
+ }
83
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../lib/commands/watch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { ProjectStructure, MergeOptions, MergeResult } from '../types/merge.js';
2
+ export declare class CodeMerger {
3
+ private options;
4
+ constructor(options: MergeOptions);
5
+ execute(): Promise<MergeResult>;
6
+ getProjectStructure(): Promise<ProjectStructure>;
7
+ getSelectiveContent(selectedPaths: string[]): Promise<MergeResult>;
8
+ private buildTreeStructure;
9
+ private collectFiles;
10
+ private shouldProcessFile;
11
+ private getIgnorePatterns;
12
+ private mergeFiles;
13
+ private generateHeader;
14
+ private generateBreakdown;
15
+ private generateStructure;
16
+ private writeOutput;
17
+ }
18
+ //# sourceMappingURL=codeMerger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeMerger.d.ts","sourceRoot":"","sources":["../../lib/core/codeMerger.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAe,YAAY,EAAE,WAAW,EAAY,MAAM,mBAAmB,CAAC;AAE5G,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAe;gBAElB,OAAO,EAAE,YAAY;IAIpB,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC;IAwB/B,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA2BhD,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IA8B/E,OAAO,CAAC,kBAAkB;YAwDZ,YAAY;IAgC1B,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,iBAAiB;IA+CzB,OAAO,CAAC,WAAW;CAGpB"}