@paparats/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 (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +33 -0
  3. package/bin/paparats +2 -0
  4. package/dist/abort.d.ts +6 -0
  5. package/dist/abort.d.ts.map +1 -0
  6. package/dist/abort.js +13 -0
  7. package/dist/abort.js.map +1 -0
  8. package/dist/api-client.d.ts +69 -0
  9. package/dist/api-client.d.ts.map +1 -0
  10. package/dist/api-client.js +188 -0
  11. package/dist/api-client.js.map +1 -0
  12. package/dist/commands/doctor.d.ts +10 -0
  13. package/dist/commands/doctor.d.ts.map +1 -0
  14. package/dist/commands/doctor.js +239 -0
  15. package/dist/commands/doctor.js.map +1 -0
  16. package/dist/commands/groups.d.ts +47 -0
  17. package/dist/commands/groups.d.ts.map +1 -0
  18. package/dist/commands/groups.js +197 -0
  19. package/dist/commands/groups.js.map +1 -0
  20. package/dist/commands/index-cmd.d.ts +75 -0
  21. package/dist/commands/index-cmd.d.ts.map +1 -0
  22. package/dist/commands/index-cmd.js +240 -0
  23. package/dist/commands/index-cmd.js.map +1 -0
  24. package/dist/commands/init.d.ts +28 -0
  25. package/dist/commands/init.d.ts.map +1 -0
  26. package/dist/commands/init.js +437 -0
  27. package/dist/commands/init.js.map +1 -0
  28. package/dist/commands/install.d.ts +41 -0
  29. package/dist/commands/install.d.ts.map +1 -0
  30. package/dist/commands/install.js +324 -0
  31. package/dist/commands/install.js.map +1 -0
  32. package/dist/commands/search.d.ts +53 -0
  33. package/dist/commands/search.d.ts.map +1 -0
  34. package/dist/commands/search.js +216 -0
  35. package/dist/commands/search.js.map +1 -0
  36. package/dist/commands/status.d.ts +69 -0
  37. package/dist/commands/status.d.ts.map +1 -0
  38. package/dist/commands/status.js +309 -0
  39. package/dist/commands/status.js.map +1 -0
  40. package/dist/commands/update.d.ts +18 -0
  41. package/dist/commands/update.d.ts.map +1 -0
  42. package/dist/commands/update.js +95 -0
  43. package/dist/commands/update.js.map +1 -0
  44. package/dist/commands/watch.d.ts +31 -0
  45. package/dist/commands/watch.d.ts.map +1 -0
  46. package/dist/commands/watch.js +339 -0
  47. package/dist/commands/watch.js.map +1 -0
  48. package/dist/config.d.ts +46 -0
  49. package/dist/config.d.ts.map +1 -0
  50. package/dist/config.js +308 -0
  51. package/dist/config.js.map +1 -0
  52. package/dist/index.d.ts +2 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +23 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/lsp-installers.d.ts +28 -0
  57. package/dist/lsp-installers.d.ts.map +1 -0
  58. package/dist/lsp-installers.js +125 -0
  59. package/dist/lsp-installers.js.map +1 -0
  60. package/package.json +81 -0
@@ -0,0 +1,47 @@
1
+ import { Command } from 'commander';
2
+ import ora from 'ora';
3
+ export interface StatsResponse {
4
+ groups: Record<string, number>;
5
+ registeredProjects: Record<string, string[]>;
6
+ usage: {
7
+ searchCount: number;
8
+ totalTokensSaved: number;
9
+ avgTokensSavedPerSearch: number;
10
+ };
11
+ cache?: {
12
+ size: number;
13
+ hitCount: number;
14
+ maxSize: number;
15
+ hitRate: number;
16
+ };
17
+ watcher?: Record<string, {
18
+ eventsProcessed: number;
19
+ }>;
20
+ memory?: {
21
+ heapUsed: number;
22
+ heapTotal: number;
23
+ };
24
+ }
25
+ export declare function validateStatsResponse(data: unknown): data is StatsResponse;
26
+ interface GroupsOptions {
27
+ json?: boolean;
28
+ verbose?: boolean;
29
+ quiet?: boolean;
30
+ sort?: string;
31
+ timeout?: number;
32
+ groupName?: string;
33
+ }
34
+ interface StatsClient {
35
+ stats(options?: {
36
+ timeout?: number;
37
+ }): Promise<{
38
+ status: number;
39
+ data: unknown;
40
+ }>;
41
+ }
42
+ export declare function runGroups(client: StatsClient, opts: GroupsOptions, deps?: {
43
+ spinner?: ReturnType<typeof ora> | null;
44
+ }): Promise<void>;
45
+ export declare const groupsCommand: Command;
46
+ export {};
47
+ //# sourceMappingURL=groups.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../../src/commands/groups.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAE5C,OAAO,GAAG,MAAM,KAAK,CAAC;AAOtB,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;QACzB,uBAAuB,EAAE,MAAM,CAAC;KACjC,CAAC;IACF,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,MAAM,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAClD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,aAAa,CAc1E;AAED,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,WAAW;IACnB,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACnF;AAWD,wBAAsB,SAAS,CAC7B,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,aAAa,EACnB,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAA;CAAE,GACjD,OAAO,CAAC,IAAI,CAAC,CAgJf;AAED,eAAO,MAAM,aAAa,SA+DvB,CAAC"}
@@ -0,0 +1,197 @@
1
+ import { Command, Option } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { ApiClient } from '../api-client.js';
5
+ function formatNumber(n) {
6
+ return n.toLocaleString('en-US');
7
+ }
8
+ export function validateStatsResponse(data) {
9
+ if (!data || typeof data !== 'object')
10
+ return false;
11
+ const d = data;
12
+ return (typeof d.groups === 'object' &&
13
+ d.groups !== null &&
14
+ typeof d.registeredProjects === 'object' &&
15
+ d.registeredProjects !== null &&
16
+ typeof d.usage === 'object' &&
17
+ d.usage !== null &&
18
+ typeof d.usage.searchCount === 'number');
19
+ }
20
+ function outputError(message, json) {
21
+ if (json) {
22
+ console.log(JSON.stringify({ error: message }));
23
+ }
24
+ else {
25
+ console.error(chalk.red(message));
26
+ }
27
+ throw new Error('EXIT:1');
28
+ }
29
+ export async function runGroups(client, opts, deps) {
30
+ const spinner = deps?.spinner !== undefined ? deps.spinner : ora('Fetching stats from server...').start();
31
+ try {
32
+ const res = await client.stats({ timeout: opts.timeout ?? 10_000 });
33
+ spinner?.stop();
34
+ if (res.status !== 200) {
35
+ outputError('Failed to fetch stats from server', opts.json ?? false);
36
+ }
37
+ const rawData = res.data;
38
+ if (!validateStatsResponse(rawData)) {
39
+ outputError('Invalid stats response from server', opts.json ?? false);
40
+ }
41
+ const data = rawData;
42
+ if (opts.json) {
43
+ if (opts.groupName) {
44
+ const chunks = data.groups[opts.groupName];
45
+ if (chunks === undefined) {
46
+ outputError(`Group not found: ${opts.groupName}`, opts.json);
47
+ }
48
+ const projects = data.registeredProjects[opts.groupName] ?? [];
49
+ console.log(JSON.stringify({ group: opts.groupName, chunks, projects }, null, 2));
50
+ }
51
+ else {
52
+ console.log(JSON.stringify(data, null, 2));
53
+ }
54
+ return;
55
+ }
56
+ let groupEntries = Object.entries(data.groups);
57
+ if (opts.groupName) {
58
+ const chunks = data.groups[opts.groupName];
59
+ if (chunks === undefined) {
60
+ outputError(`Group not found: ${opts.groupName}`, opts.json ?? false);
61
+ }
62
+ const projects = data.registeredProjects[opts.groupName] ?? [];
63
+ console.log(chalk.bold(`\n${opts.groupName}\n`));
64
+ console.log(` ${chalk.dim('Chunks:')} ${chunks}`);
65
+ console.log(` ${chalk.dim('Projects:')}`);
66
+ for (const p of projects) {
67
+ console.log(` • ${p}`);
68
+ }
69
+ return;
70
+ }
71
+ if (groupEntries.length === 0) {
72
+ if (!opts.quiet) {
73
+ console.log(chalk.yellow('No groups indexed yet. Run `paparats index` first.'));
74
+ }
75
+ process.exit(0);
76
+ }
77
+ if (opts.sort === 'size') {
78
+ groupEntries = groupEntries.sort((a, b) => b[1] - a[1]);
79
+ }
80
+ else {
81
+ groupEntries = groupEntries.sort((a, b) => a[0].localeCompare(b[0]));
82
+ }
83
+ if (opts.quiet) {
84
+ for (const [groupName] of groupEntries) {
85
+ console.log(groupName);
86
+ }
87
+ return;
88
+ }
89
+ console.log(chalk.bold('\nIndexed Groups:\n'));
90
+ for (const [groupName, chunks] of groupEntries) {
91
+ const projects = data.registeredProjects[groupName] ?? [];
92
+ if (opts.verbose) {
93
+ console.log(` ${chalk.bold(groupName)}`);
94
+ console.log(` ${chalk.dim('Chunks:')} ${chunks}`);
95
+ console.log(` ${chalk.dim('Projects:')}`);
96
+ for (const p of projects) {
97
+ console.log(` • ${p}`);
98
+ }
99
+ }
100
+ else {
101
+ console.log(` ${chalk.bold(groupName)} ${chalk.dim(`(${chunks} chunks)`)}`);
102
+ for (const p of projects) {
103
+ console.log(` ${chalk.dim('•')} ${p}`);
104
+ }
105
+ }
106
+ console.log();
107
+ }
108
+ if (opts.verbose) {
109
+ console.log(chalk.bold('Statistics:\n'));
110
+ if (data.usage.searchCount > 0) {
111
+ console.log(` ${chalk.dim('Searches:')} ${data.usage.searchCount}`);
112
+ console.log(` ${chalk.dim('Tokens saved:')} ~${formatNumber(data.usage.totalTokensSaved)}`);
113
+ console.log(` ${chalk.dim('Avg per search:')} ~${data.usage.avgTokensSavedPerSearch}`);
114
+ }
115
+ if (data.cache) {
116
+ const cache = data.cache;
117
+ const hitRatePercent = (cache.hitRate * 100).toFixed(1);
118
+ console.log(` ${chalk.dim('Cache hit rate:')} ${hitRatePercent}%`);
119
+ }
120
+ if (data.watcher) {
121
+ const totalEvents = Object.values(data.watcher).reduce((sum, w) => sum + (w?.eventsProcessed ?? 0), 0);
122
+ if (totalEvents > 0) {
123
+ console.log(` ${chalk.dim('File changes processed:')} ${totalEvents}`);
124
+ }
125
+ }
126
+ if (data.memory) {
127
+ const heapMB = Math.round(data.memory.heapUsed / 1024 / 1024);
128
+ console.log(` ${chalk.dim('Memory usage:')} ${heapMB} MB`);
129
+ }
130
+ console.log();
131
+ }
132
+ else if (data.usage.searchCount > 0) {
133
+ console.log(chalk.dim(`Stats: ${data.usage.searchCount} searches, ~${formatNumber(data.usage.totalTokensSaved)} tokens saved`));
134
+ }
135
+ }
136
+ catch (err) {
137
+ spinner?.stop();
138
+ const message = err.message;
139
+ if (message.startsWith('EXIT:')) {
140
+ const code = parseInt(message.slice(5), 10);
141
+ process.exit(Number.isNaN(code) ? 1 : code);
142
+ }
143
+ if (opts.json) {
144
+ console.log(JSON.stringify({ error: message }));
145
+ }
146
+ else {
147
+ console.error(chalk.red(message));
148
+ }
149
+ process.exit(1);
150
+ }
151
+ }
152
+ export const groupsCommand = new Command('groups')
153
+ .description('List all indexed groups and projects')
154
+ .argument('[group]', 'Show details for specific group')
155
+ .option('--server <url>', 'MCP server URL', 'http://localhost:9876')
156
+ .option('--timeout <ms>', 'Request timeout in milliseconds', '10000')
157
+ .option('-v, --verbose', 'Show detailed information')
158
+ .option('-q, --quiet', 'Show only group names')
159
+ .option('--json', 'Output as JSON')
160
+ .addOption(new Option('--sort <field>', 'Sort by field').choices(['name', 'size']).default('name'))
161
+ .action(async (groupName, opts) => {
162
+ if (opts.verbose && opts.quiet) {
163
+ if (opts.json) {
164
+ console.log(JSON.stringify({ error: 'Cannot use --verbose and --quiet together' }));
165
+ }
166
+ else {
167
+ console.error(chalk.red('Cannot use --verbose and --quiet together'));
168
+ }
169
+ process.exit(1);
170
+ }
171
+ let timeout = 10_000;
172
+ if (opts.timeout) {
173
+ const parsed = parseInt(opts.timeout, 10);
174
+ if (Number.isNaN(parsed) || parsed <= 0) {
175
+ const msg = `Invalid timeout: ${opts.timeout}. Must be a positive number.`;
176
+ if (opts.json) {
177
+ console.log(JSON.stringify({ error: msg }));
178
+ }
179
+ else {
180
+ console.error(chalk.red(msg));
181
+ }
182
+ process.exit(1);
183
+ }
184
+ timeout = parsed;
185
+ }
186
+ const client = new ApiClient(opts.server);
187
+ const spinner = opts.json ? null : ora('Fetching stats from server...').start();
188
+ await runGroups(client, {
189
+ json: opts.json,
190
+ verbose: opts.verbose,
191
+ quiet: opts.quiet,
192
+ sort: opts.sort,
193
+ timeout,
194
+ groupName,
195
+ }, { spinner });
196
+ });
197
+ //# sourceMappingURL=groups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groups.js","sourceRoot":"","sources":["../../src/commands/groups.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { Command } from 'commander';
2
+ import ora from 'ora';
3
+ export interface IndexResponse {
4
+ group: string;
5
+ project: string;
6
+ chunks: number;
7
+ skipped?: number;
8
+ errors?: string[];
9
+ }
10
+ export declare function validateIndexResponse(data: unknown): data is IndexResponse;
11
+ interface IndexOptions {
12
+ server: string;
13
+ timeout?: number;
14
+ force?: boolean;
15
+ verbose?: boolean;
16
+ dryRun?: boolean;
17
+ json?: boolean;
18
+ }
19
+ interface IndexClient {
20
+ health(options?: {
21
+ timeout?: number;
22
+ }): Promise<{
23
+ status: number;
24
+ }>;
25
+ indexContent(group: string, project: string, files: Array<{
26
+ path: string;
27
+ content: string;
28
+ language?: string;
29
+ }>, options?: {
30
+ config?: {
31
+ chunkSize?: number;
32
+ overlap?: number;
33
+ batchSize?: number;
34
+ concurrency?: number;
35
+ languages?: string[];
36
+ };
37
+ force?: boolean;
38
+ timeout?: number;
39
+ signal?: AbortSignal;
40
+ }): Promise<{
41
+ status: number;
42
+ data: unknown;
43
+ }>;
44
+ }
45
+ interface RunIndexDeps {
46
+ spinner?: ReturnType<typeof ora> | null;
47
+ signal?: AbortSignal;
48
+ collectProjectFiles?: typeof import('../config.js').collectProjectFiles;
49
+ }
50
+ export declare function printDryRun(config: {
51
+ config: {
52
+ group: string;
53
+ language: string | string[];
54
+ indexing?: {
55
+ paths?: string[];
56
+ exclude?: string[];
57
+ };
58
+ };
59
+ projectDir: string;
60
+ }): void;
61
+ export declare function runIndex(client: IndexClient, projectDir: string, group: string, config: {
62
+ config: {
63
+ group: string;
64
+ language: string | string[];
65
+ indexing?: {
66
+ chunkSize?: number;
67
+ overlap?: number;
68
+ batchSize?: number;
69
+ concurrency?: number;
70
+ };
71
+ };
72
+ }, opts: IndexOptions, deps?: RunIndexDeps): Promise<void>;
73
+ export declare const indexCommand: Command;
74
+ export {};
75
+ //# sourceMappingURL=index-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/index-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,240 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { Command } from 'commander';
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import { readConfig, collectProjectFiles, getLanguageFromPath } from '../config.js';
7
+ import { ApiClient } from '../api-client.js';
8
+ const API_INDEX_BATCH_SIZE = 50;
9
+ export function validateIndexResponse(data) {
10
+ if (!data || typeof data !== 'object')
11
+ return false;
12
+ const d = data;
13
+ return (typeof d.group === 'string' && typeof d.project === 'string' && typeof d.chunks === 'number');
14
+ }
15
+ function outputError(message, json) {
16
+ if (json) {
17
+ console.log(JSON.stringify({ error: message }));
18
+ }
19
+ else {
20
+ console.error(chalk.red(message));
21
+ }
22
+ throw new Error('EXIT:1');
23
+ }
24
+ export function printDryRun(config) {
25
+ console.log(chalk.bold('\nDry run mode - no actual indexing\n'));
26
+ console.log(` ${chalk.dim('Group:')} ${config.config.group}`);
27
+ console.log(` ${chalk.dim('Project:')} ${config.projectDir}`);
28
+ const lang = config.config.language;
29
+ console.log(` ${chalk.dim('Language:')} ${Array.isArray(lang) ? lang.join(', ') : lang}`);
30
+ if (config.config.indexing?.paths?.length) {
31
+ console.log(` ${chalk.dim('Paths:')} ${config.config.indexing.paths.join(', ')}`);
32
+ }
33
+ if (config.config.indexing?.exclude?.length) {
34
+ console.log(` ${chalk.dim('Exclude:')} ${config.config.indexing.exclude.join(', ')}`);
35
+ }
36
+ }
37
+ export async function runIndex(client, projectDir, group, config, opts, deps) {
38
+ const projectName = path.basename(projectDir);
39
+ const spinner = deps?.spinner !== undefined ? deps.spinner : ora(`Indexing ${group}/${projectName}...`).start();
40
+ const start = Date.now();
41
+ const languages = Array.isArray(config.config.language)
42
+ ? config.config.language
43
+ : [config.config.language];
44
+ const indexConfig = {
45
+ chunkSize: config.config.indexing?.chunkSize,
46
+ overlap: config.config.indexing?.overlap,
47
+ batchSize: config.config.indexing?.batchSize,
48
+ concurrency: config.config.indexing?.concurrency,
49
+ languages,
50
+ };
51
+ const collectFiles = deps?.collectProjectFiles ?? collectProjectFiles;
52
+ const files = await collectFiles(projectDir, config.config);
53
+ const filesWithContent = [];
54
+ for (const filePath of files) {
55
+ try {
56
+ const buffer = await fs.promises.readFile(filePath);
57
+ if (buffer.includes(0))
58
+ continue; // Skip binary
59
+ const content = buffer.toString('utf8');
60
+ if (content.includes('\uFFFD'))
61
+ continue; // Invalid UTF-8
62
+ if (!content.trim())
63
+ continue;
64
+ const relPath = path.relative(projectDir, filePath);
65
+ const projectLangs = Array.isArray(config.config.language)
66
+ ? config.config.language
67
+ : [config.config.language];
68
+ const language = getLanguageFromPath(filePath, projectLangs);
69
+ filesWithContent.push({ path: relPath, content, language });
70
+ }
71
+ catch (err) {
72
+ spinner?.warn(` Skipped ${path.relative(projectDir, filePath)}: ${err.message}`);
73
+ }
74
+ }
75
+ let totalChunks = 0;
76
+ let lastBatchData = {};
77
+ try {
78
+ for (let i = 0; i < filesWithContent.length; i += API_INDEX_BATCH_SIZE) {
79
+ const batch = filesWithContent.slice(i, i + API_INDEX_BATCH_SIZE);
80
+ const res = await client.indexContent(group, projectName, batch, {
81
+ config: indexConfig,
82
+ force: opts.force && i === 0,
83
+ timeout: opts.timeout ?? 300_000,
84
+ signal: deps?.signal,
85
+ });
86
+ if (res.status !== 200) {
87
+ const data = res.data;
88
+ spinner?.fail(`Indexing failed: ${data.error ?? 'Unknown error'}`);
89
+ outputError(String(data.error ?? 'Unknown error'), opts.json ?? false);
90
+ }
91
+ const data = res.data;
92
+ lastBatchData = data;
93
+ totalChunks += data.chunks ?? 0;
94
+ if (i + API_INDEX_BATCH_SIZE < filesWithContent.length && spinner) {
95
+ spinner.text = `Indexed ${Math.min(i + API_INDEX_BATCH_SIZE, filesWithContent.length)}/${filesWithContent.length} files...`;
96
+ }
97
+ }
98
+ const data = {
99
+ group,
100
+ project: projectName,
101
+ chunks: totalChunks,
102
+ skipped: lastBatchData.skipped,
103
+ errors: lastBatchData.errors,
104
+ };
105
+ if (!validateIndexResponse(data)) {
106
+ spinner?.fail('Invalid response from server');
107
+ outputError('Expected: { group, project, chunks }', opts.json ?? false);
108
+ }
109
+ const elapsed = ((Date.now() - start) / 1000).toFixed(1);
110
+ if (opts.json) {
111
+ const result = {
112
+ group: data.group,
113
+ project: data.project,
114
+ chunks: data.chunks,
115
+ skipped: data.skipped,
116
+ errors: data.errors,
117
+ elapsed: parseFloat(elapsed),
118
+ timestamp: new Date().toISOString(),
119
+ };
120
+ console.log(JSON.stringify(result, null, 2));
121
+ return;
122
+ }
123
+ spinner?.succeed(`Indexed ${chalk.bold(data.project)} in group ${chalk.bold(data.group)}`);
124
+ console.log(chalk.dim(` ${data.chunks} chunks indexed in ${elapsed}s`));
125
+ if (opts.verbose && data.skipped !== undefined && data.skipped > 0) {
126
+ console.log(chalk.dim(` ${data.skipped} files skipped`));
127
+ }
128
+ if (data.errors && data.errors.length > 0) {
129
+ console.log(chalk.yellow(` ${data.errors.length} errors encountered`));
130
+ if (opts.verbose) {
131
+ data.errors.forEach((err) => console.log(chalk.yellow(` - ${err}`)));
132
+ }
133
+ }
134
+ }
135
+ catch (err) {
136
+ const message = err.message;
137
+ if (message.startsWith('EXIT:')) {
138
+ const code = parseInt(message.slice(5), 10);
139
+ process.exit(Number.isNaN(code) ? 1 : code);
140
+ }
141
+ if (message.includes('aborted') ||
142
+ message.includes('AbortError') ||
143
+ message.includes('Request aborted')) {
144
+ spinner?.fail('Indexing cancelled');
145
+ process.exit(130);
146
+ }
147
+ if (opts.json) {
148
+ console.log(JSON.stringify({ error: message }));
149
+ }
150
+ else {
151
+ spinner?.fail('Indexing failed');
152
+ console.error(chalk.red(message));
153
+ }
154
+ process.exit(1);
155
+ }
156
+ }
157
+ export const indexCommand = new Command('index')
158
+ .description('Index the current project')
159
+ .option('--server <url>', 'MCP server URL', 'http://localhost:9876')
160
+ .option('--timeout <ms>', 'Request timeout in milliseconds', '300000')
161
+ .option('-f, --force', 'Force reindex (clear existing data)')
162
+ .option('-v, --verbose', 'Show detailed output')
163
+ .option('--dry-run', 'Show what would be indexed without indexing')
164
+ .option('--json', 'Output as JSON')
165
+ .action(async (opts) => {
166
+ let config;
167
+ try {
168
+ config = readConfig();
169
+ }
170
+ catch (err) {
171
+ const msg = err.message;
172
+ if (opts.json) {
173
+ console.log(JSON.stringify({ error: msg }));
174
+ }
175
+ else {
176
+ console.error(chalk.red(msg));
177
+ }
178
+ process.exit(1);
179
+ }
180
+ const { config: projectConfig, projectDir } = config;
181
+ if (opts.dryRun) {
182
+ printDryRun(config);
183
+ return;
184
+ }
185
+ let timeout = 300_000;
186
+ if (opts.timeout) {
187
+ const parsed = parseInt(opts.timeout, 10);
188
+ if (Number.isNaN(parsed) || parsed <= 0) {
189
+ const msg = `Invalid timeout: ${opts.timeout}. Must be a positive number.`;
190
+ if (opts.json) {
191
+ console.log(JSON.stringify({ error: msg }));
192
+ }
193
+ else {
194
+ console.error(chalk.red(msg));
195
+ }
196
+ process.exit(1);
197
+ }
198
+ timeout = parsed;
199
+ }
200
+ const client = new ApiClient(opts.server);
201
+ try {
202
+ await client.health({ timeout: 3000 });
203
+ }
204
+ catch {
205
+ const msg = `Cannot connect to server at ${opts.server}\n` +
206
+ 'Make sure the server is running with: docker compose up -d';
207
+ if (opts.json) {
208
+ console.log(JSON.stringify({ error: msg }));
209
+ }
210
+ else {
211
+ console.error(chalk.red(msg));
212
+ }
213
+ process.exit(1);
214
+ }
215
+ const controller = new AbortController();
216
+ let spinner = null;
217
+ const sigintHandler = () => {
218
+ spinner?.stop();
219
+ if (!opts.json) {
220
+ console.log(chalk.yellow('\nIndexing cancelled by user'));
221
+ }
222
+ controller.abort();
223
+ process.exit(130);
224
+ };
225
+ process.on('SIGINT', sigintHandler);
226
+ spinner = opts.json ? null : ora(`Indexing ${projectConfig.group}/${projectDir}...`).start();
227
+ try {
228
+ await runIndex(client, projectDir, projectConfig.group, config, {
229
+ server: opts.server,
230
+ timeout,
231
+ force: opts.force,
232
+ verbose: opts.verbose,
233
+ json: opts.json,
234
+ }, { spinner, signal: controller.signal });
235
+ }
236
+ finally {
237
+ process.off('SIGINT', sigintHandler);
238
+ }
239
+ });
240
+ //# sourceMappingURL=index-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-cmd.js","sourceRoot":"","sources":["../../src/commands/index-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { Command } from 'commander';
2
+ import { type SupportedLanguage } from '../config.js';
3
+ import { type LspInstallerDeps } from '../lsp-installers.js';
4
+ export declare function validateGroupName(value: string): true | string;
5
+ export declare function appendToGitignore(gitignorePath: string): void;
6
+ export interface InitOptions {
7
+ force?: boolean;
8
+ group?: string;
9
+ language?: string;
10
+ nonInteractive?: boolean;
11
+ skipCclsp?: boolean;
12
+ }
13
+ export interface InitDeps {
14
+ promptGroup?: (defaultGroup: string) => Promise<string>;
15
+ promptLanguage?: (detected: SupportedLanguage | null) => Promise<string | string[]>;
16
+ promptAddPaths?: () => Promise<boolean>;
17
+ promptPaths?: (dirs: string[]) => Promise<string[] | undefined>;
18
+ promptAddExclude?: () => Promise<boolean>;
19
+ promptConfigureEmbeddings?: () => Promise<boolean>;
20
+ promptEmbeddingsProvider?: () => Promise<'ollama' | 'openai'>;
21
+ promptEmbeddingsModel?: (provider: string) => Promise<string>;
22
+ promptGitignore?: () => Promise<boolean>;
23
+ promptSetupCclsp?: () => Promise<boolean>;
24
+ lspDeps?: LspInstallerDeps;
25
+ }
26
+ export declare function runInit(projectDir: string, opts: InitOptions, deps?: InitDeps): Promise<void>;
27
+ export declare const initCommand: Command;
28
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,OAAO,EAML,KAAK,iBAAiB,EACvB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAOL,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAgI9B,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAO9D;AAED,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAK7D;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACxD,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,KAAK,OAAO,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IACpF,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IAChE,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,yBAAyB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,wBAAwB,CAAC,EAAE,MAAM,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;IAC9D,qBAAqB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9D,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B;AAED,wBAAsB,OAAO,CAC3B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,WAAW,EACjB,IAAI,CAAC,EAAE,QAAQ,GACd,OAAO,CAAC,IAAI,CAAC,CAoSf;AAED,eAAO,MAAM,WAAW,SAmBpB,CAAC"}