@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,339 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { Command } from 'commander';
4
+ import chalk from 'chalk';
5
+ import pLimit from 'p-limit';
6
+ import { watch } from 'chokidar';
7
+ import { minimatch } from 'minimatch';
8
+ import { globSync } from 'glob';
9
+ import { readConfig, CONFIG_FILE, getLanguageFromPath, normalizeExcludePatterns, } from '../config.js';
10
+ import { createGitignoreFilter } from '@paparats/shared';
11
+ import { ApiClient } from '../api-client.js';
12
+ const CONCURRENT_REINDEX_LIMIT = 5;
13
+ const DEFAULT_EXCLUDE = ['**/node_modules/**', '**/dist/**', '**/.git/**', '**/build/**'];
14
+ const MAX_RETRIES = 3;
15
+ function formatUptime(seconds) {
16
+ const h = Math.floor(seconds / 3600);
17
+ const m = Math.floor((seconds % 3600) / 60);
18
+ if (h > 0)
19
+ return `${h}h ${m}m`;
20
+ if (m > 0)
21
+ return `${m}m`;
22
+ return `${Math.round(seconds)}s`;
23
+ }
24
+ /** Run watch command. Returns async cleanup function to stop watcher and drain pending. */
25
+ export async function runWatch(opts, deps) {
26
+ const readCfg = deps?.readConfigFn ?? readConfig;
27
+ const createWatch = deps?.createWatcher ?? watch;
28
+ let config;
29
+ try {
30
+ config = readCfg();
31
+ }
32
+ catch (err) {
33
+ throw new Error(err.message, { cause: err });
34
+ }
35
+ const { config: cfg, projectDir } = config;
36
+ const projectName = path.basename(projectDir);
37
+ const group = cfg.group;
38
+ const client = deps?.apiClient ?? new ApiClient(opts.server ?? 'http://localhost:9876');
39
+ const exclude = normalizeExcludePatterns(cfg.indexing?.exclude ?? DEFAULT_EXCLUDE);
40
+ const respectGitignore = cfg.indexing?.respectGitignore ?? true;
41
+ const gitignoreFilter = respectGitignore ? createGitignoreFilter(projectDir) : null;
42
+ const indexPaths = cfg.indexing?.paths ?? ['./'];
43
+ const watchPaths = indexPaths.map((p) => path.resolve(projectDir, p));
44
+ const debounceMs = cfg.watcher?.debounce ?? 1000;
45
+ const pending = new Map();
46
+ const limit = pLimit(CONCURRENT_REINDEX_LIMIT);
47
+ const stats = {
48
+ filesWatched: 0,
49
+ changesProcessed: 0,
50
+ errors: 0,
51
+ startTime: Date.now(),
52
+ };
53
+ function shouldIgnore(filePath) {
54
+ const rel = path.relative(projectDir, filePath);
55
+ if (exclude.some((pattern) => minimatch(rel, pattern, { dot: true })))
56
+ return true;
57
+ if (gitignoreFilter?.(filePath))
58
+ return true;
59
+ return false;
60
+ }
61
+ if (opts.dryRun) {
62
+ console.log(chalk.bold('\nDry run - showing what would be watched:\n'));
63
+ console.log(chalk.dim(` Project: ${projectName}`));
64
+ console.log(chalk.dim(` Group: ${group}`));
65
+ console.log(chalk.dim(` Paths: ${watchPaths.join(', ')}`));
66
+ console.log(chalk.dim(` Exclude patterns:`));
67
+ exclude.forEach((pattern) => {
68
+ console.log(chalk.dim(` - ${pattern}`));
69
+ });
70
+ let totalFiles = 0;
71
+ for (const watchPath of watchPaths) {
72
+ const files = globSync('**/*', {
73
+ cwd: watchPath,
74
+ ignore: exclude,
75
+ nodir: true,
76
+ });
77
+ const filtered = gitignoreFilter
78
+ ? files.filter((f) => !gitignoreFilter(path.join(watchPath, f)))
79
+ : files;
80
+ totalFiles += filtered.length;
81
+ }
82
+ console.log(chalk.dim(`\n Total files: ${totalFiles}`));
83
+ return async () => { };
84
+ }
85
+ // Validate server before starting
86
+ if (!opts.json) {
87
+ console.log(chalk.dim('Checking server connection...'));
88
+ }
89
+ try {
90
+ const res = await client.health({ timeout: 5000 });
91
+ if (res.status !== 200) {
92
+ throw new Error('Server not healthy');
93
+ }
94
+ if (!opts.json) {
95
+ console.log(chalk.green('✓ Server connected'));
96
+ }
97
+ }
98
+ catch (err) {
99
+ throw new Error(`Cannot connect to server at ${opts.server ?? 'http://localhost:9876'}\n` +
100
+ `Make sure the server is running: docker compose up -d`, { cause: err });
101
+ }
102
+ function emitEvent(type, file, extra) {
103
+ if (opts.json) {
104
+ console.log(JSON.stringify({
105
+ type,
106
+ file: path.relative(projectDir, file),
107
+ timestamp: new Date().toISOString(),
108
+ ...extra,
109
+ }));
110
+ }
111
+ }
112
+ async function reindexWithRetry(filePath) {
113
+ const rel = path.relative(projectDir, filePath);
114
+ const start = opts.verbose ? Date.now() : 0;
115
+ let content;
116
+ try {
117
+ const buffer = await fs.promises.readFile(filePath);
118
+ if (buffer.includes(0))
119
+ return; // Skip binary
120
+ content = buffer.toString('utf8');
121
+ if (content.includes('\uFFFD'))
122
+ return; // Invalid UTF-8
123
+ if (!content.trim())
124
+ return; // Skip empty/whitespace-only files
125
+ }
126
+ catch (err) {
127
+ if (opts.json) {
128
+ emitEvent('error', filePath, { error: err.message });
129
+ }
130
+ else {
131
+ console.error(chalk.red(` failed to read ${rel}: ${err.message}`));
132
+ }
133
+ stats.errors++;
134
+ return;
135
+ }
136
+ const projectLangs = Array.isArray(cfg.language) ? cfg.language : [cfg.language];
137
+ const language = getLanguageFromPath(filePath, projectLangs);
138
+ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
139
+ try {
140
+ await client.fileChanged(group, projectName, rel, content, { language });
141
+ stats.changesProcessed++;
142
+ const elapsed = opts.verbose ? Date.now() - start : 0;
143
+ if (opts.json) {
144
+ emitEvent('reindexed', filePath, { elapsed, attempt });
145
+ }
146
+ else {
147
+ console.log(chalk.dim(opts.verbose ? ` reindexed: ${rel} (${elapsed}ms)` : ` reindexed: ${rel}`));
148
+ }
149
+ return;
150
+ }
151
+ catch (err) {
152
+ if (attempt === MAX_RETRIES) {
153
+ stats.errors++;
154
+ if (opts.json) {
155
+ emitEvent('error', filePath, { error: err.message, attempt });
156
+ }
157
+ else {
158
+ console.error(chalk.red(` failed after ${MAX_RETRIES} attempts: ${rel}`));
159
+ }
160
+ }
161
+ else if (opts.verbose && !opts.json) {
162
+ console.log(chalk.yellow(` retry ${attempt}/${MAX_RETRIES}: ${rel}`));
163
+ }
164
+ await new Promise((r) => setTimeout(r, 1000 * attempt));
165
+ }
166
+ }
167
+ }
168
+ async function onFileDeleted(filePath) {
169
+ if (shouldIgnore(filePath))
170
+ return;
171
+ const rel = path.relative(projectDir, filePath);
172
+ try {
173
+ await client.fileDeleted(group, projectName, rel);
174
+ stats.changesProcessed++;
175
+ if (opts.json) {
176
+ emitEvent('removed', filePath);
177
+ }
178
+ else {
179
+ console.log(chalk.dim(` removed: ${rel}`));
180
+ }
181
+ }
182
+ catch (err) {
183
+ stats.errors++;
184
+ if (opts.json) {
185
+ emitEvent('error', filePath, { error: err.message, action: 'remove' });
186
+ }
187
+ else {
188
+ console.error(chalk.red(` failed to remove: ${rel} — ${err.message}`));
189
+ }
190
+ }
191
+ }
192
+ function onFileChange(filePath) {
193
+ if (shouldIgnore(filePath))
194
+ return;
195
+ const existing = pending.get(filePath);
196
+ if (existing)
197
+ clearTimeout(existing);
198
+ pending.set(filePath, setTimeout(async () => {
199
+ pending.delete(filePath);
200
+ await limit(async () => reindexWithRetry(filePath));
201
+ }, debounceMs));
202
+ }
203
+ if (!opts.json) {
204
+ console.log(chalk.bold(`\nWatching ${projectName} (group: ${group})\n`));
205
+ console.log(chalk.dim(` Paths: ${watchPaths.join(', ')}`));
206
+ console.log(chalk.dim(` Debounce: ${debounceMs}ms`));
207
+ console.log(chalk.dim(` Press Ctrl+C to stop\n`));
208
+ }
209
+ const watcher = createWatch(watchPaths, {
210
+ ignoreInitial: true,
211
+ awaitWriteFinish: {
212
+ stabilityThreshold: cfg.watcher?.stabilityThreshold ?? 1000,
213
+ },
214
+ });
215
+ watcher.on('error', (err) => {
216
+ stats.errors++;
217
+ const e = err;
218
+ if (opts.json) {
219
+ console.log(JSON.stringify({
220
+ type: 'watcher_error',
221
+ error: e.message,
222
+ timestamp: new Date().toISOString(),
223
+ }));
224
+ }
225
+ else {
226
+ console.error(chalk.red(`Watcher error: ${e.message}`));
227
+ if (opts.verbose && e.stack) {
228
+ console.error(chalk.dim(e.stack));
229
+ }
230
+ }
231
+ });
232
+ watcher.on('ready', () => {
233
+ const watched = watcher.getWatched();
234
+ stats.filesWatched = Object.values(watched).reduce((sum, files) => sum + files.length, 0);
235
+ if (!opts.json) {
236
+ console.log(chalk.green(`✓ Watcher ready (${stats.filesWatched} paths)`));
237
+ }
238
+ });
239
+ const configPath = path.join(projectDir, CONFIG_FILE);
240
+ watcher.on('change', (p) => {
241
+ if (p === configPath) {
242
+ if (opts.json) {
243
+ emitEvent('config_changed', configPath, { message: 'Restart watcher to apply' });
244
+ }
245
+ else {
246
+ console.log(chalk.yellow('\nConfig file changed. Please restart watcher.'));
247
+ }
248
+ return;
249
+ }
250
+ onFileChange(p);
251
+ });
252
+ watcher.on('add', (p) => onFileChange(p));
253
+ watcher.on('unlink', (p) => void limit(() => onFileDeleted(p)));
254
+ watcher.on('addDir', (dirPath) => {
255
+ if (shouldIgnore(dirPath))
256
+ return;
257
+ const rel = path.relative(projectDir, dirPath);
258
+ if (opts.json) {
259
+ emitEvent('addDir', dirPath);
260
+ }
261
+ else if (opts.verbose) {
262
+ console.log(chalk.dim(` directory added: ${rel}`));
263
+ }
264
+ });
265
+ watcher.on('unlinkDir', (dirPath) => {
266
+ if (shouldIgnore(dirPath))
267
+ return;
268
+ const rel = path.relative(projectDir, dirPath);
269
+ if (opts.json) {
270
+ emitEvent('unlinkDir', dirPath);
271
+ }
272
+ else if (opts.verbose) {
273
+ console.log(chalk.dim(` directory removed: ${rel}`));
274
+ }
275
+ });
276
+ return async () => {
277
+ watcher.close();
278
+ if (pending.size > 0 && !opts.json) {
279
+ console.log(chalk.dim(`Waiting for ${pending.size} pending changes...`));
280
+ }
281
+ if (pending.size > 0) {
282
+ await new Promise((resolve) => {
283
+ const check = setInterval(() => {
284
+ if (pending.size === 0) {
285
+ clearInterval(check);
286
+ resolve();
287
+ }
288
+ }, 100);
289
+ setTimeout(() => {
290
+ clearInterval(check);
291
+ resolve();
292
+ }, 10_000);
293
+ });
294
+ }
295
+ for (const timeout of pending.values()) {
296
+ clearTimeout(timeout);
297
+ }
298
+ pending.clear();
299
+ if (opts.json) {
300
+ const uptime = Math.floor((Date.now() - stats.startTime) / 1000);
301
+ console.log(JSON.stringify({
302
+ type: 'stopped',
303
+ changesProcessed: stats.changesProcessed,
304
+ errors: stats.errors,
305
+ uptimeSeconds: uptime,
306
+ timestamp: new Date().toISOString(),
307
+ }));
308
+ }
309
+ else if (stats.changesProcessed > 0 || stats.errors > 0) {
310
+ const uptime = Math.floor((Date.now() - stats.startTime) / 1000);
311
+ console.log(chalk.dim('\nStats:'));
312
+ console.log(chalk.dim(` Changes processed: ${stats.changesProcessed}`));
313
+ console.log(chalk.dim(` Errors: ${stats.errors}`));
314
+ console.log(chalk.dim(` Uptime: ${formatUptime(uptime)}`));
315
+ }
316
+ };
317
+ }
318
+ export const watchCommand = new Command('watch')
319
+ .description('Watch for file changes and reindex automatically')
320
+ .option('--server <url>', 'MCP server URL', 'http://localhost:9876')
321
+ .option('-v, --verbose', 'Show detailed output')
322
+ .option('--dry-run', 'Show what would be watched without actually watching')
323
+ .option('--json', 'Output events as JSON lines for piping')
324
+ .action(async (opts) => {
325
+ try {
326
+ const cleanup = await runWatch(opts);
327
+ process.on('SIGINT', async () => {
328
+ console.log(chalk.dim('\nStopping watcher...'));
329
+ await cleanup();
330
+ console.log(chalk.green('✓ Watcher stopped'));
331
+ process.exit(0);
332
+ });
333
+ }
334
+ catch (err) {
335
+ console.error(chalk.red(err.message));
336
+ process.exit(1);
337
+ }
338
+ });
339
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { normalizeExcludePatterns as normalizeExcludeFromShared } from '@paparats/shared';
2
+ export declare const CONFIG_FILE = ".paparats.yml";
3
+ export declare const normalizeExcludePatterns: typeof normalizeExcludeFromShared;
4
+ export interface PaparatsConfig {
5
+ group: string;
6
+ language: string | string[];
7
+ indexing?: {
8
+ paths?: string[];
9
+ exclude?: string[];
10
+ respectGitignore?: boolean;
11
+ extensions?: string[];
12
+ chunkSize?: number;
13
+ overlap?: number;
14
+ concurrency?: number;
15
+ batchSize?: number;
16
+ };
17
+ watcher?: {
18
+ enabled?: boolean;
19
+ debounce?: number;
20
+ stabilityThreshold?: number;
21
+ };
22
+ embeddings?: {
23
+ provider?: 'ollama' | 'openai';
24
+ model?: string;
25
+ dimensions?: number;
26
+ };
27
+ }
28
+ export declare const SUPPORTED_LANGUAGES: readonly ["ruby", "typescript", "javascript", "python", "go", "rust", "java", "terraform", "c", "cpp", "csharp"];
29
+ export type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number];
30
+ export declare function findConfigDir(startDir?: string): string | null;
31
+ export declare function readConfig(projectDir?: string): {
32
+ config: PaparatsConfig;
33
+ projectDir: string;
34
+ };
35
+ export declare function writeConfig(projectDir: string, config: PaparatsConfig): void;
36
+ export declare function detectLanguages(projectDir: string): SupportedLanguage[];
37
+ export declare function detectLanguage(projectDir: string): SupportedLanguage | null;
38
+ /** Collect project files for indexing (mirrors server glob logic) */
39
+ export declare function collectProjectFiles(projectDir: string, config: PaparatsConfig): Promise<string[]>;
40
+ /**
41
+ * Get language from file path for chunking/API.
42
+ * For `.h` (ambiguous extension for C/C++ headers), pass projectLanguages to prefer the project's
43
+ * configured language when it includes c or cpp.
44
+ */
45
+ export declare function getLanguageFromPath(filePath: string, projectLanguages?: string[]): string;
46
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,wBAAwB,IAAI,0BAA0B,EAEvD,MAAM,kBAAkB,CAAC;AAE1B,eAAO,MAAM,WAAW,kBAAkB,CAAC;AA0B3C,eAAO,MAAM,wBAAwB,mCAA6B,CAAC;AAEnE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,UAAU,CAAC,EAAE;QACX,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;QAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,eAAO,MAAM,mBAAmB,kHAYtB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AA8FrE,wBAAgB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAW9D;AAED,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CA+C9F;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CA4B5E;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAyBvE;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAG3E;AAoBD,qEAAqE;AACrE,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBnB;AA4BD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAWzF"}