@code-rag/cli 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 (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -0
  3. package/dist/cli.test.d.ts +1 -0
  4. package/dist/cli.test.js +369 -0
  5. package/dist/cli.test.js.map +1 -0
  6. package/dist/commands/hooks-cmd.d.ts +53 -0
  7. package/dist/commands/hooks-cmd.js +279 -0
  8. package/dist/commands/index-cmd.d.ts +4 -0
  9. package/dist/commands/index-cmd.js +1037 -0
  10. package/dist/commands/index-cmd.js.map +1 -0
  11. package/dist/commands/index-cmd.test.d.ts +1 -0
  12. package/dist/commands/index-cmd.test.js +74 -0
  13. package/dist/commands/index-cmd.test.js.map +1 -0
  14. package/dist/commands/init-wizard.d.ts +95 -0
  15. package/dist/commands/init-wizard.js +526 -0
  16. package/dist/commands/init.d.ts +7 -0
  17. package/dist/commands/init.js +125 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/search.d.ts +7 -0
  20. package/dist/commands/search.js +124 -0
  21. package/dist/commands/search.js.map +1 -0
  22. package/dist/commands/serve.d.ts +2 -0
  23. package/dist/commands/serve.js +56 -0
  24. package/dist/commands/serve.js.map +1 -0
  25. package/dist/commands/status.d.ts +21 -0
  26. package/dist/commands/status.js +117 -0
  27. package/dist/commands/status.js.map +1 -0
  28. package/dist/commands/viewer.d.ts +20 -0
  29. package/dist/commands/viewer.js +197 -0
  30. package/dist/commands/viewer.js.map +1 -0
  31. package/dist/commands/viewer.test.d.ts +1 -0
  32. package/dist/commands/viewer.test.js +69 -0
  33. package/dist/commands/viewer.test.js.map +1 -0
  34. package/dist/commands/watch-cmd.d.ts +8 -0
  35. package/dist/commands/watch-cmd.js +152 -0
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.js +24 -0
  38. package/dist/index.js.map +1 -0
  39. package/package.json +66 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewer.test.js","sourceRoot":"","sources":["../../src/commands/viewer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * Register the `coderag watch` CLI command.
4
+ *
5
+ * Starts a file watcher that monitors the project directory for changes
6
+ * and triggers incremental re-indexing on each debounced batch.
7
+ */
8
+ export declare function registerWatchCommand(program: Command): void;
@@ -0,0 +1,152 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { resolve, sep } from 'node:path';
4
+ import { spawn } from 'node:child_process';
5
+ import { loadConfig, createIgnoreFilter, FileWatcher, } from '@code-rag/core';
6
+ /**
7
+ * Register the `coderag watch` CLI command.
8
+ *
9
+ * Starts a file watcher that monitors the project directory for changes
10
+ * and triggers incremental re-indexing on each debounced batch.
11
+ */
12
+ export function registerWatchCommand(program) {
13
+ program
14
+ .command('watch')
15
+ .description('Watch the codebase for changes and trigger incremental re-indexing')
16
+ .option('--debounce <ms>', 'Debounce window in milliseconds', '2000')
17
+ .action(async (options) => {
18
+ const debounceMs = parseInt(options.debounce, 10);
19
+ if (isNaN(debounceMs) || debounceMs < 0) {
20
+ // eslint-disable-next-line no-console
21
+ console.error(chalk.red('Invalid debounce value. Must be a non-negative integer.'));
22
+ process.exit(1);
23
+ }
24
+ const spinner = ora('Loading configuration...').start();
25
+ try {
26
+ const rootDir = process.cwd();
27
+ // Load config
28
+ const configResult = await loadConfig(rootDir);
29
+ if (configResult.isErr()) {
30
+ spinner.fail(configResult.error.message);
31
+ // eslint-disable-next-line no-console
32
+ console.error(chalk.red('Run "coderag init" first to create a configuration file.'));
33
+ process.exit(1);
34
+ }
35
+ const config = configResult.value;
36
+ const storagePath = resolve(rootDir, config.storage.path);
37
+ // Prevent path traversal outside project root
38
+ if (!storagePath.startsWith(resolve(rootDir) + sep) && storagePath !== resolve(rootDir)) {
39
+ spinner.fail('Storage path escapes project root');
40
+ process.exit(1);
41
+ }
42
+ // Create ignore filter
43
+ const ignoreFilter = createIgnoreFilter(rootDir);
44
+ // Create and start file watcher
45
+ const watcher = new FileWatcher({
46
+ rootDir,
47
+ ignoreFilter,
48
+ debounceMs,
49
+ });
50
+ let isIndexing = false;
51
+ let indexCount = 0;
52
+ watcher.on('change', (changedPaths) => {
53
+ if (isIndexing) {
54
+ // eslint-disable-next-line no-console
55
+ console.log(chalk.yellow(` Skipping batch (${changedPaths.length} files) — indexing already in progress`));
56
+ return;
57
+ }
58
+ isIndexing = true;
59
+ indexCount++;
60
+ const batchNum = indexCount;
61
+ // eslint-disable-next-line no-console
62
+ console.log('');
63
+ // eslint-disable-next-line no-console
64
+ console.log(chalk.bold(`[Batch ${batchNum}] ${changedPaths.length} file(s) changed:`));
65
+ for (const filePath of changedPaths.slice(0, 10)) {
66
+ // eslint-disable-next-line no-console
67
+ console.log(` ${chalk.gray('→')} ${filePath}`);
68
+ }
69
+ if (changedPaths.length > 10) {
70
+ // eslint-disable-next-line no-console
71
+ console.log(` ${chalk.gray(`… and ${changedPaths.length - 10} more`)}`);
72
+ }
73
+ // eslint-disable-next-line no-console
74
+ console.log(chalk.cyan(' Running incremental index...'));
75
+ const startTime = Date.now();
76
+ const child = spawn(process.execPath, [process.argv[1], 'index'], {
77
+ cwd: rootDir,
78
+ stdio: ['ignore', 'pipe', 'pipe'],
79
+ });
80
+ child.stdout.on('data', (data) => {
81
+ const lines = data.toString().trimEnd().split('\n');
82
+ for (const line of lines) {
83
+ // eslint-disable-next-line no-console
84
+ console.log(` ${chalk.gray('│')} ${line}`);
85
+ }
86
+ });
87
+ child.stderr.on('data', (data) => {
88
+ const lines = data.toString().trimEnd().split('\n');
89
+ for (const line of lines) {
90
+ // eslint-disable-next-line no-console
91
+ console.log(` ${chalk.gray('│')} ${chalk.yellow(line)}`);
92
+ }
93
+ });
94
+ child.on('close', (code) => {
95
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
96
+ if (code === 0) {
97
+ // eslint-disable-next-line no-console
98
+ console.log(chalk.green(` Batch ${batchNum} complete (${elapsed}s)`));
99
+ }
100
+ else {
101
+ // eslint-disable-next-line no-console
102
+ console.log(chalk.red(` Batch ${batchNum} failed with exit code ${code ?? 'unknown'} (${elapsed}s)`));
103
+ }
104
+ isIndexing = false;
105
+ });
106
+ child.on('error', (err) => {
107
+ // eslint-disable-next-line no-console
108
+ console.log(chalk.red(` Batch ${batchNum} spawn error: ${err.message}`));
109
+ isIndexing = false;
110
+ });
111
+ });
112
+ watcher.on('error', (error) => {
113
+ // eslint-disable-next-line no-console
114
+ console.error(chalk.red(`Watcher error: ${error.message}`));
115
+ });
116
+ spinner.succeed('Configuration loaded');
117
+ // eslint-disable-next-line no-console
118
+ console.log('');
119
+ // eslint-disable-next-line no-console
120
+ console.log(chalk.bold('CodeRAG File Watcher'));
121
+ // eslint-disable-next-line no-console
122
+ console.log(` Root: ${chalk.cyan(rootDir)}`);
123
+ // eslint-disable-next-line no-console
124
+ console.log(` Debounce: ${chalk.cyan(debounceMs + 'ms')}`);
125
+ // eslint-disable-next-line no-console
126
+ console.log(` Storage: ${chalk.cyan(storagePath)}`);
127
+ // eslint-disable-next-line no-console
128
+ console.log('');
129
+ // eslint-disable-next-line no-console
130
+ console.log(chalk.gray('Watching for file changes... (press Ctrl+C to stop)'));
131
+ await watcher.start();
132
+ // Handle graceful shutdown
133
+ const shutdown = async () => {
134
+ // eslint-disable-next-line no-console
135
+ console.log('');
136
+ // eslint-disable-next-line no-console
137
+ console.log(chalk.yellow('Stopping watcher...'));
138
+ await watcher.stop();
139
+ // eslint-disable-next-line no-console
140
+ console.log(chalk.green(`Watcher stopped. Processed ${indexCount} batch(es).`));
141
+ process.exit(0);
142
+ };
143
+ process.on('SIGINT', () => void shutdown());
144
+ process.on('SIGTERM', () => void shutdown());
145
+ }
146
+ catch (error) {
147
+ const message = error instanceof Error ? error.message : String(error);
148
+ spinner.fail(`Watch failed: ${message}`);
149
+ process.exit(1);
150
+ }
151
+ });
152
+ }
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { registerInitCommand } from './commands/init.js';
4
+ import { registerIndexCommand } from './commands/index-cmd.js';
5
+ import { registerSearchCommand } from './commands/search.js';
6
+ import { registerServeCommand } from './commands/serve.js';
7
+ import { registerStatusCommand } from './commands/status.js';
8
+ import { registerViewerCommand } from './commands/viewer.js';
9
+ import { registerWatchCommand } from './commands/watch-cmd.js';
10
+ import { registerHooksCommand } from './commands/hooks-cmd.js';
11
+ const program = new Command();
12
+ program
13
+ .name('coderag')
14
+ .description('CodeRAG — intelligent codebase context engine for AI coding agents')
15
+ .version('0.1.0');
16
+ registerInitCommand(program);
17
+ registerIndexCommand(program);
18
+ registerSearchCommand(program);
19
+ registerServeCommand(program);
20
+ registerStatusCommand(program);
21
+ registerViewerCommand(program);
22
+ registerWatchCommand(program);
23
+ registerHooksCommand(program);
24
+ program.parse();
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,oEAAoE,CAAC;KACjF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAE/B,OAAO,CAAC,KAAK,EAAE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@code-rag/cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI tool for CodeRAG — init, index, search, serve, and status commands for codebase context engine",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "CodeRAG Contributors",
8
+ "homepage": "https://dev.azure.com/momc-pl/CodeRAG/_git/CodeRAG",
9
+ "bugs": {
10
+ "url": "https://dev.azure.com/momc-pl/CodeRAG/_git/CodeRAG/issues"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://dev.azure.com/momc-pl/CodeRAG/_git/CodeRAG",
15
+ "directory": "packages/cli"
16
+ },
17
+ "engines": {
18
+ "node": ">=20"
19
+ },
20
+ "keywords": [
21
+ "coderag",
22
+ "cli",
23
+ "code-search",
24
+ "ai-coding",
25
+ "rag",
26
+ "embeddings",
27
+ "developer-tools"
28
+ ],
29
+ "files": [
30
+ "dist",
31
+ "LICENSE",
32
+ "README.md"
33
+ ],
34
+ "bin": {
35
+ "coderag": "./dist/index.js"
36
+ },
37
+ "main": "./dist/index.js",
38
+ "types": "./dist/index.d.ts",
39
+ "exports": {
40
+ ".": {
41
+ "import": "./dist/index.js",
42
+ "types": "./dist/index.d.ts"
43
+ }
44
+ },
45
+ "scripts": {
46
+ "build": "tsc",
47
+ "clean": "rm -rf dist",
48
+ "test": "vitest run"
49
+ },
50
+ "dependencies": {
51
+ "@code-rag/api-server": "workspace:*",
52
+ "@code-rag/core": "workspace:*",
53
+ "@code-rag/mcp-server": "workspace:*",
54
+ "@inquirer/prompts": "^8.3.0",
55
+ "chalk": "^5.4.1",
56
+ "commander": "^13.1.0",
57
+ "ora": "^8.2.0",
58
+ "yaml": "^2.7.0"
59
+ },
60
+ "devDependencies": {
61
+ "@types/node": "^22.13.4",
62
+ "@vitest/coverage-v8": "^3.0.5",
63
+ "typescript": "^5.7.3",
64
+ "vitest": "^3.0.5"
65
+ }
66
+ }