@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,324 @@
1
+ import { Command } from 'commander';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ import { execSync, spawn } from 'child_process';
6
+ import chalk from 'chalk';
7
+ import ora from 'ora';
8
+ import { createTimeoutSignal } from '../abort.js';
9
+ const PAPARATS_HOME = path.join(os.homedir(), '.paparats');
10
+ const MODELS_DIR = path.join(PAPARATS_HOME, 'models');
11
+ const OLLAMA_MODEL_NAME = 'jina-code-embeddings';
12
+ const GGUF_URL = 'https://huggingface.co/jinaai/jina-code-embeddings-1.5b-GGUF/resolve/main/jina-code-embeddings-1.5b-Q8_0.gguf';
13
+ const GGUF_FILE = path.join(MODELS_DIR, 'jina-code-embeddings-1.5b-Q8_0.gguf');
14
+ export function commandExists(cmd) {
15
+ try {
16
+ const command = process.platform === 'win32' ? `where ${cmd}` : `command -v ${cmd}`;
17
+ execSync(command, { stdio: 'ignore', timeout: 3000 });
18
+ return true;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ export function getDockerComposeCommand() {
25
+ try {
26
+ execSync('docker compose version', { stdio: 'ignore', timeout: 3000 });
27
+ return 'docker compose';
28
+ }
29
+ catch {
30
+ try {
31
+ execSync('docker-compose version', { stdio: 'ignore', timeout: 3000 });
32
+ return 'docker-compose';
33
+ }
34
+ catch {
35
+ throw new Error('Docker Compose not found. ' +
36
+ 'Install Docker Desktop or docker-compose: https://docs.docker.com/compose/install/');
37
+ }
38
+ }
39
+ }
40
+ function execCmd(cmd, options) {
41
+ return execSync(cmd, {
42
+ encoding: 'utf8',
43
+ stdio: ['pipe', 'pipe', 'pipe'],
44
+ timeout: options?.timeout ?? 30_000,
45
+ }).trim();
46
+ }
47
+ export function ollamaModelExists(modelName) {
48
+ try {
49
+ const output = execCmd('ollama list', { timeout: 10_000 });
50
+ return output.includes(modelName);
51
+ }
52
+ catch {
53
+ return false;
54
+ }
55
+ }
56
+ export async function isOllamaRunning() {
57
+ try {
58
+ const res = await fetch('http://localhost:11434/api/tags', {
59
+ signal: createTimeoutSignal(2000),
60
+ });
61
+ return res.ok;
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ export async function waitForHealth(url, label, maxRetries = 30, delayMs = 1000) {
68
+ const spinner = ora(`Waiting for ${label}...`).start();
69
+ for (let i = 0; i < maxRetries; i++) {
70
+ try {
71
+ const ok = await fetch(url).then((r) => r.ok);
72
+ if (ok) {
73
+ spinner.succeed(`${label} is ready`);
74
+ return true;
75
+ }
76
+ }
77
+ catch {
78
+ // not ready yet
79
+ }
80
+ await new Promise((r) => setTimeout(r, delayMs));
81
+ }
82
+ spinner.fail(`${label} failed to start within ${maxRetries}s`);
83
+ return false;
84
+ }
85
+ function downloadWithCurl(url, dest) {
86
+ return new Promise((resolve, reject) => {
87
+ const proc = spawn('curl', ['-L', '--progress-bar', '-o', dest, url], {
88
+ stdio: ['ignore', 'inherit', 'inherit'],
89
+ });
90
+ proc.on('close', (code) => {
91
+ if (code === 0)
92
+ resolve();
93
+ else
94
+ reject(new Error(`curl exited with code ${code}`));
95
+ });
96
+ proc.on('error', (err) => {
97
+ reject(new Error(`Failed to spawn curl: ${err.message}`));
98
+ });
99
+ });
100
+ }
101
+ async function downloadFile(url, dest, signal) {
102
+ if (commandExists('curl')) {
103
+ return downloadWithCurl(url, dest);
104
+ }
105
+ const response = await fetch(url, { signal });
106
+ if (!response.ok) {
107
+ throw new Error(`Download failed: HTTP ${response.status}`);
108
+ }
109
+ const buffer = await response.arrayBuffer();
110
+ fs.writeFileSync(dest, Buffer.from(buffer));
111
+ }
112
+ function findTemplatePath() {
113
+ const templateLocations = [
114
+ path.join(import.meta.dirname, '../../node_modules/@paparats/server/docker-compose.template.yml'),
115
+ path.join(import.meta.dirname, '../../../server/docker-compose.template.yml'),
116
+ path.join(import.meta.dirname, '../../../../packages/server/docker-compose.template.yml'),
117
+ ];
118
+ for (const loc of templateLocations) {
119
+ if (fs.existsSync(loc))
120
+ return loc;
121
+ }
122
+ throw new Error('Could not find docker-compose.template.yml. ' + 'Looked in: ' + templateLocations.join(', '));
123
+ }
124
+ export function upsertMcpServer(filePath, serverName, serverConfig, deps) {
125
+ const readFile = deps?.readFileSync ?? ((p) => fs.readFileSync(p, 'utf8'));
126
+ const writeFile = deps?.writeFileSync ?? ((p, d) => fs.writeFileSync(p, d));
127
+ const exists = deps?.existsSync ?? ((p) => fs.existsSync(p));
128
+ const mkdir = deps?.mkdirSync ?? ((p) => fs.mkdirSync(p, { recursive: true }));
129
+ let data;
130
+ if (!exists(filePath)) {
131
+ const dir = path.dirname(filePath);
132
+ if (!exists(dir)) {
133
+ mkdir(dir);
134
+ }
135
+ data = { mcpServers: { [serverName]: serverConfig } };
136
+ writeFile(filePath, JSON.stringify(data, null, 2) + '\n');
137
+ return 'added';
138
+ }
139
+ const raw = readFile(filePath, 'utf8');
140
+ data = JSON.parse(raw);
141
+ if (!data.mcpServers) {
142
+ data.mcpServers = {};
143
+ }
144
+ const existing = data.mcpServers[serverName];
145
+ if (!existing) {
146
+ data.mcpServers[serverName] = serverConfig;
147
+ writeFile(filePath, JSON.stringify(data, null, 2) + '\n');
148
+ return 'added';
149
+ }
150
+ const bothHaveUrl = 'url' in existing && 'url' in serverConfig;
151
+ const bothHaveCommand = 'command' in existing && 'command' in serverConfig;
152
+ if (bothHaveUrl && existing['url'] === serverConfig['url']) {
153
+ return 'unchanged';
154
+ }
155
+ if (bothHaveCommand && JSON.stringify(existing) === JSON.stringify(serverConfig)) {
156
+ return 'unchanged';
157
+ }
158
+ if (!bothHaveUrl &&
159
+ !bothHaveCommand &&
160
+ JSON.stringify(existing) === JSON.stringify(serverConfig)) {
161
+ return 'unchanged';
162
+ }
163
+ data.mcpServers[serverName] = serverConfig;
164
+ writeFile(filePath, JSON.stringify(data, null, 2) + '\n');
165
+ return 'updated';
166
+ }
167
+ export async function runInstall(opts, deps) {
168
+ const cmdExists = deps?.commandExists ?? commandExists;
169
+ const getCompose = deps?.getDockerComposeCommand ?? getDockerComposeCommand;
170
+ const modelExists = deps?.ollamaModelExists ?? ollamaModelExists;
171
+ const ollamaRunning = deps?.isOllamaRunning ?? isOllamaRunning;
172
+ const waitHealth = deps?.waitForHealth ?? waitForHealth;
173
+ const download = deps?.downloadFile ?? downloadFile;
174
+ const findTemplate = deps?.findTemplatePath ?? findTemplatePath;
175
+ const mkdir = deps?.mkdirSync ?? ((p) => fs.mkdirSync(p, { recursive: true }));
176
+ const copyFile = deps?.copyFileSync ?? fs.copyFileSync.bind(fs);
177
+ const readFile = deps?.readFileSync ?? ((p) => fs.readFileSync(p, 'utf8'));
178
+ const writeFile = deps?.writeFileSync ?? fs.writeFileSync.bind(fs);
179
+ const exists = deps?.existsSync ?? fs.existsSync.bind(fs);
180
+ const unlink = deps?.unlinkSync ?? fs.unlinkSync.bind(fs);
181
+ const signal = deps?.signal;
182
+ const cleanupTasks = [];
183
+ if (signal) {
184
+ signal.addEventListener('abort', () => {
185
+ console.log(chalk.yellow('\nInstallation cancelled'));
186
+ for (const task of cleanupTasks) {
187
+ try {
188
+ task();
189
+ }
190
+ catch {
191
+ // ignore
192
+ }
193
+ }
194
+ process.exit(130);
195
+ });
196
+ }
197
+ console.log(chalk.bold('\npaparats install\n'));
198
+ const checks = [
199
+ { cmd: 'docker', name: 'Docker', install: 'https://docker.com' },
200
+ { cmd: 'ollama', name: 'Ollama', install: 'https://ollama.com' },
201
+ ];
202
+ for (const check of checks) {
203
+ if (!cmdExists(check.cmd)) {
204
+ throw new Error(`${check.name} not found. Install from ${check.install}`);
205
+ }
206
+ }
207
+ console.log(chalk.green('✓ Prerequisites found (Docker, Ollama)\n'));
208
+ if (!opts.skipDocker) {
209
+ const spinner = ora('Setting up Docker containers...').start();
210
+ mkdir(PAPARATS_HOME);
211
+ const templatePath = findTemplate();
212
+ const composeDest = path.join(PAPARATS_HOME, 'docker-compose.yml');
213
+ copyFile(templatePath, composeDest);
214
+ spinner.text = 'Starting Docker containers...';
215
+ const composeCmd = getCompose();
216
+ const fullCmd = `${composeCmd} -f "${composeDest}" up -d`;
217
+ try {
218
+ execSync(fullCmd, {
219
+ stdio: opts.verbose ? 'inherit' : ['pipe', 'pipe', 'pipe'],
220
+ timeout: 120_000,
221
+ });
222
+ spinner.succeed('Docker containers started');
223
+ }
224
+ catch (err) {
225
+ spinner.fail('Failed to start Docker containers');
226
+ throw err;
227
+ }
228
+ const qdrantReady = await waitHealth('http://localhost:6333/healthz', 'Qdrant');
229
+ if (!qdrantReady)
230
+ throw new Error('Qdrant failed to start');
231
+ const mcpReady = await waitHealth('http://localhost:9876/health', 'MCP server');
232
+ if (!mcpReady)
233
+ throw new Error('MCP server failed to start');
234
+ }
235
+ if (!opts.skipOllama) {
236
+ if (modelExists(OLLAMA_MODEL_NAME)) {
237
+ console.log(chalk.green(`✓ Ollama model ${OLLAMA_MODEL_NAME} already exists\n`));
238
+ }
239
+ else {
240
+ if (!(await ollamaRunning())) {
241
+ console.log(chalk.dim('Starting Ollama...'));
242
+ spawn('ollama', ['serve'], { stdio: 'ignore', detached: true }).unref();
243
+ await new Promise((r) => setTimeout(r, 3000));
244
+ if (!(await ollamaRunning())) {
245
+ throw new Error('Failed to start Ollama. Please start it manually: ollama serve');
246
+ }
247
+ }
248
+ if (exists(GGUF_FILE)) {
249
+ console.log(chalk.dim(`GGUF already downloaded at ${GGUF_FILE}`));
250
+ }
251
+ else {
252
+ if (!cmdExists('curl')) {
253
+ console.log(chalk.yellow('Note: curl not found. Using Node fetch (slower for large files). Install curl for better download performance.'));
254
+ }
255
+ console.log(chalk.bold('Downloading jina-code-embeddings (~1.65 GB)...'));
256
+ mkdir(MODELS_DIR);
257
+ cleanupTasks.push(() => {
258
+ if (exists(GGUF_FILE))
259
+ unlink(GGUF_FILE);
260
+ });
261
+ await download(GGUF_URL, GGUF_FILE, signal);
262
+ cleanupTasks.pop();
263
+ console.log(chalk.green('✓ Download complete'));
264
+ }
265
+ const modelfilePath = path.join(MODELS_DIR, 'Modelfile');
266
+ writeFile(modelfilePath, `FROM ${GGUF_FILE}\n`);
267
+ const spinner = ora('Registering model in Ollama...').start();
268
+ try {
269
+ execSync(`ollama create ${OLLAMA_MODEL_NAME} -f "${modelfilePath}"`, {
270
+ stdio: ['pipe', 'pipe', 'pipe'],
271
+ timeout: 60_000,
272
+ });
273
+ spinner.succeed(`Ollama model ${OLLAMA_MODEL_NAME} registered`);
274
+ }
275
+ catch (err) {
276
+ spinner.fail('Failed to register model');
277
+ throw err;
278
+ }
279
+ }
280
+ }
281
+ // Auto-configure Cursor MCP
282
+ const cursorDir = path.join(os.homedir(), '.cursor');
283
+ if (exists(cursorDir)) {
284
+ const cursorMcpPath = path.join(cursorDir, 'mcp.json');
285
+ const result = upsertMcpServer(cursorMcpPath, 'paparats', { type: 'http', url: 'http://localhost:9876/mcp' }, {
286
+ readFileSync: readFile,
287
+ writeFileSync: writeFile,
288
+ existsSync: exists,
289
+ mkdirSync: mkdir,
290
+ });
291
+ if (result === 'unchanged') {
292
+ console.log(chalk.green('✓ Cursor MCP already configured'));
293
+ }
294
+ else {
295
+ console.log(chalk.green('✓ Cursor MCP configured'));
296
+ }
297
+ }
298
+ else {
299
+ console.log(chalk.dim('Cursor not detected, skipping MCP config'));
300
+ }
301
+ console.log(chalk.bold.green('\n✓ Installation complete!\n'));
302
+ console.log('Next steps:');
303
+ console.log(chalk.dim(' 1. cd <your-project>'));
304
+ console.log(chalk.dim(' 2. paparats init'));
305
+ console.log(chalk.dim(' 3. paparats index'));
306
+ console.log(chalk.dim(' 4. Connect your IDE (see README)\n'));
307
+ }
308
+ export const installCommand = new Command('install')
309
+ .description('Set up Docker containers (Qdrant + MCP server) and Ollama embedding model')
310
+ .option('--skip-docker', 'Skip Docker setup')
311
+ .option('--skip-ollama', 'Skip Ollama model setup')
312
+ .option('-v, --verbose', 'Show detailed output')
313
+ .action(async (opts) => {
314
+ const controller = new AbortController();
315
+ process.on('SIGINT', () => controller.abort());
316
+ try {
317
+ await runInstall(opts, { signal: controller.signal });
318
+ }
319
+ catch (err) {
320
+ console.error(chalk.red(err.message));
321
+ process.exit(1);
322
+ }
323
+ });
324
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AACtD,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AACjD,MAAM,QAAQ,GACZ,+GAA+G,CAAC;AAClH,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,qCAAqC,CAAC,CAAC;AAE/E,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,EAAE,CAAC;QACpF,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,IAAI,CAAC;QACH,QAAQ,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,QAAQ,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,OAAO,gBAAgB,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,4BAA4B;gBAC1B,oFAAoF,CACvF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,GAAW,EAAE,OAA8B;IAC1D,OAAO,QAAQ,CAAC,GAAG,EAAE;QACnB,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QAC/B,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,MAAM;KACpC,CAAC,CAAC,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3D,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,iCAAiC,EAAE;YACzD,MAAM,EAAE,mBAAmB,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAW,EACX,KAAa,EACb,UAAU,GAAG,EAAE,EACf,OAAO,GAAG,IAAI;IAEd,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,KAAK,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9C,IAAI,EAAE,EAAE,CAAC;gBACP,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC;gBACrC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,2BAA2B,UAAU,GAAG,CAAC,CAAC;IAC/D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW,EAAE,IAAY;IACjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE;YACpE,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC;SACxC,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;;gBACrB,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,MAAM,CAAC,IAAI,KAAK,CAAC,yBAA0B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,IAAY,EAAE,MAAoB;IACzE,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC5C,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,iBAAiB,GAAG;QACxB,IAAI,CAAC,IAAI,CACP,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,iEAAiE,CAClE;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,6CAA6C,CAAC;QAC7E,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,yDAAyD,CAAC;KAC1F,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACpC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;IACrC,CAAC;IAED,MAAM,IAAI,KAAK,CACb,8CAA8C,GAAG,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAC9F,CAAC;AACJ,CAAC;AASD,MAAM,UAAU,eAAe,CAC7B,QAAgB,EAChB,UAAkB,EAClB,YAAqC,EACrC,IAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,EAAE,YAAY,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,IAAI,EAAE,aAAa,IAAI,CAAC,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,MAAM,GAAG,IAAI,EAAE,UAAU,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,IAAI,EAAE,SAAS,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEvF,IAAI,IAA8D,CAAC;IAEnE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACjB,KAAK,CAAC,GAAG,CAAC,CAAC;QACb,CAAC;QACD,IAAI,GAAG,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,YAAY,EAAE,EAAE,CAAC;QACtD,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC1D,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IAEtC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;IACvB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC;QAC3C,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC1D,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,WAAW,GAAG,KAAK,IAAI,QAAQ,IAAI,KAAK,IAAI,YAAY,CAAC;IAC/D,MAAM,eAAe,GAAG,SAAS,IAAI,QAAQ,IAAI,SAAS,IAAI,YAAY,CAAC;IAE3E,IAAI,WAAW,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3D,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,IAAI,eAAe,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;QACjF,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,IACE,CAAC,WAAW;QACZ,CAAC,eAAe;QAChB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EACzD,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC;IAC3C,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1D,OAAO,SAAS,CAAC;AACnB,CAAC;AAyBD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAoB,EACpB,IAA6C;IAE7C,MAAM,SAAS,GAAG,IAAI,EAAE,aAAa,IAAI,aAAa,CAAC;IACvD,MAAM,UAAU,GAAG,IAAI,EAAE,uBAAuB,IAAI,uBAAuB,CAAC;IAC5E,MAAM,WAAW,GAAG,IAAI,EAAE,iBAAiB,IAAI,iBAAiB,CAAC;IACjE,MAAM,aAAa,GAAG,IAAI,EAAE,eAAe,IAAI,eAAe,CAAC;IAC/D,MAAM,UAAU,GAAG,IAAI,EAAE,aAAa,IAAI,aAAa,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,EAAE,YAAY,IAAI,YAAY,CAAC;IACpD,MAAM,YAAY,GAAG,IAAI,EAAE,gBAAgB,IAAI,gBAAgB,CAAC;IAChE,MAAM,KAAK,GAAG,IAAI,EAAE,SAAS,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,IAAI,EAAE,YAAY,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,IAAI,EAAE,YAAY,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,IAAI,EAAE,aAAa,IAAI,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,IAAI,EAAE,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,EAAE,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC;IAE5B,MAAM,YAAY,GAAsB,EAAE,CAAC;IAE3C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACtD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;gBAChC,IAAI,CAAC;oBACH,IAAI,EAAE,CAAC;gBACT,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG;QACb,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE;QAChE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE;KACjE,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;IAErE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,GAAG,CAAC,iCAAiC,CAAC,CAAC,KAAK,EAAE,CAAC;QAE/D,KAAK,CAAC,aAAa,CAAC,CAAC;QAErB,MAAM,YAAY,GAAG,YAAY,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;QACnE,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAEpC,OAAO,CAAC,IAAI,GAAG,+BAA+B,CAAC;QAE/C,MAAM,UAAU,GAAG,UAAU,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,GAAG,UAAU,QAAQ,WAAW,SAAS,CAAC;QAC1D,IAAI,CAAC;YACH,QAAQ,CAAC,OAAO,EAAE;gBAChB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAC1D,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC;YACH,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YAClD,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,+BAA+B,EAAE,QAAQ,CAAC,CAAC;QAChF,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAE5D,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,8BAA8B,EAAE,YAAY,CAAC,CAAC;QAChF,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,IAAI,WAAW,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,iBAAiB,mBAAmB,CAAC,CAAC,CAAC;QACnF,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAC7C,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;gBACxE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC9C,IAAI,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,EAAE,CAAC;oBAC7B,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;gBACpF,CAAC;YACH,CAAC;YAED,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;oBACvB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,gHAAgH,CACjH,CACF,CAAC;gBACJ,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;gBAC1E,KAAK,CAAC,UAAU,CAAC,CAAC;gBAClB,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE;oBACrB,IAAI,MAAM,CAAC,SAAS,CAAC;wBAAE,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC3C,CAAC,CAAC,CAAC;gBACH,MAAM,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;gBAC5C,YAAY,CAAC,GAAG,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAClD,CAAC;YAED,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YACzD,SAAS,CAAC,aAAa,EAAE,QAAQ,SAAS,IAAI,CAAC,CAAC;YAEhD,MAAM,OAAO,GAAG,GAAG,CAAC,gCAAgC,CAAC,CAAC,KAAK,EAAE,CAAC;YAC9D,IAAI,CAAC;gBACH,QAAQ,CAAC,iBAAiB,iBAAiB,QAAQ,aAAa,GAAG,EAAE;oBACnE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;oBAC/B,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAC;gBACH,OAAO,CAAC,OAAO,CAAC,gBAAgB,iBAAiB,aAAa,CAAC,CAAC;YAClE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBACzC,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACtB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,eAAe,CAC5B,aAAa,EACb,UAAU,EACV,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,2BAA2B,EAAE,EAClD;YACE,YAAY,EAAE,QAAQ;YACtB,aAAa,EAAE,SAAS;YACxB,UAAU,EAAE,MAAM;YAClB,SAAS,EAAE,KAAK;SACjB,CACF,CAAC;QACF,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,2EAA2E,CAAC;KACxF,MAAM,CAAC,eAAe,EAAE,mBAAmB,CAAC;KAC5C,MAAM,CAAC,eAAe,EAAE,yBAAyB,CAAC;KAClD,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC;KAC/C,MAAM,CAAC,KAAK,EAAE,IAAoB,EAAE,EAAE;IACrC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { Command } from 'commander';
2
+ import ora from 'ora';
3
+ export interface SearchResultItem {
4
+ project: string;
5
+ file: string;
6
+ language: string;
7
+ startLine: number;
8
+ endLine: number;
9
+ content: string;
10
+ score: number;
11
+ }
12
+ export interface SearchResponseData {
13
+ results: SearchResultItem[];
14
+ total: number;
15
+ metrics: {
16
+ tokensReturned: number;
17
+ estimatedFullFileTokens: number;
18
+ tokensSaved: number;
19
+ savingsPercent: number;
20
+ };
21
+ }
22
+ export declare function validateSearchResponse(data: unknown): data is SearchResponseData;
23
+ export interface SearchOptions {
24
+ limit?: number;
25
+ project?: string;
26
+ group?: string;
27
+ timeout?: number;
28
+ json?: boolean;
29
+ verbose?: boolean;
30
+ }
31
+ interface SearchClient {
32
+ search(group: string, query: string, opts: {
33
+ project?: string;
34
+ limit?: number;
35
+ timeout?: number;
36
+ signal?: AbortSignal;
37
+ }): Promise<{
38
+ status: number;
39
+ data: unknown;
40
+ }>;
41
+ }
42
+ export interface SearchDeps {
43
+ readConfig?: () => {
44
+ config: {
45
+ group: string;
46
+ };
47
+ };
48
+ spinner?: ReturnType<typeof ora> | null;
49
+ }
50
+ export declare function runSearch(client: SearchClient, query: string, opts: SearchOptions, deps?: SearchDeps): Promise<void>;
51
+ export declare const searchCommand: Command;
52
+ export {};
53
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,GAAG,MAAM,KAAK,CAAC;AAItB,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QACP,cAAc,EAAE,MAAM,CAAC;QACvB,uBAAuB,EAAE,MAAM,CAAC;QAChC,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,kBAAkB,CAWhF;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,YAAY;IACpB,MAAM,CACJ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACjF,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,MAAM;QAAE,MAAM,EAAE;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IACjD,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC;CACzC;AAWD,wBAAsB,SAAS,CAC7B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,aAAa,EACnB,IAAI,CAAC,EAAE,UAAU,GAChB,OAAO,CAAC,IAAI,CAAC,CA+Gf;AAED,eAAO,MAAM,aAAa,SAyHvB,CAAC"}
@@ -0,0 +1,216 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { readConfig } from '../config.js';
5
+ import { ApiClient } from '../api-client.js';
6
+ export function validateSearchResponse(data) {
7
+ if (!data || typeof data !== 'object')
8
+ return false;
9
+ const d = data;
10
+ return (Array.isArray(d.results) &&
11
+ typeof d.total === 'number' &&
12
+ typeof d.metrics === 'object' &&
13
+ d.metrics !== null);
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 async function runSearch(client, query, opts, deps) {
25
+ const readCfg = deps?.readConfig ?? readConfig;
26
+ const spinner = deps?.spinner !== undefined ? deps.spinner : ora('Searching...').start();
27
+ let group = opts.group;
28
+ if (!group) {
29
+ try {
30
+ const config = readCfg();
31
+ group = config.config.group;
32
+ }
33
+ catch (err) {
34
+ spinner?.stop();
35
+ outputError(err.message, opts.json ?? false);
36
+ }
37
+ }
38
+ const limit = opts.limit ?? 5;
39
+ const timeout = opts.timeout ?? 30_000;
40
+ const project = opts.project === 'all' ? undefined : opts.project;
41
+ try {
42
+ const res = await client.search(group, query, {
43
+ project,
44
+ limit,
45
+ timeout,
46
+ });
47
+ if (res.status !== 200) {
48
+ const data = res.data;
49
+ spinner?.fail(`Search failed: ${String(data.error ?? 'Unknown error')}`);
50
+ outputError(String(data.error ?? 'Search failed'), opts.json ?? false);
51
+ }
52
+ if (!validateSearchResponse(res.data)) {
53
+ spinner?.fail('Invalid search response from server');
54
+ outputError('Invalid search response from server', opts.json ?? false);
55
+ }
56
+ const data = res.data;
57
+ spinner?.stop();
58
+ if (opts.json) {
59
+ console.log(JSON.stringify(data, null, 2));
60
+ return;
61
+ }
62
+ if (data.results.length === 0) {
63
+ console.log(chalk.yellow('No results found. Make sure the project is indexed.'));
64
+ return;
65
+ }
66
+ if (opts.verbose) {
67
+ console.log(chalk.dim('\nSearch parameters:'));
68
+ console.log(chalk.dim(` Group: ${group}`));
69
+ console.log(chalk.dim(` Query: ${query}`));
70
+ console.log(chalk.dim(` Project filter: ${opts.project ?? 'all'}`));
71
+ console.log(chalk.dim(` Limit: ${limit}`));
72
+ console.log();
73
+ }
74
+ console.log(chalk.bold(`\n${data.total} results for "${query}":\n`));
75
+ for (const r of data.results) {
76
+ const score = (r.score * 100).toFixed(1);
77
+ const header = `${chalk.cyan(`[${r.project}]`)} ${chalk.bold(r.file)}:${chalk.yellow(String(r.startLine))} ${chalk.dim(`(${score}%)`)}`;
78
+ console.log(header);
79
+ console.log(chalk.dim('─'.repeat(60)));
80
+ const lines = r.content.split('\n');
81
+ let lineNum = r.startLine;
82
+ for (const line of lines) {
83
+ const lineNumStr = String(lineNum).padStart(4, ' ');
84
+ console.log(chalk.dim(` ${lineNumStr} │ `) + line);
85
+ lineNum++;
86
+ }
87
+ console.log();
88
+ }
89
+ if (data.metrics.tokensSaved > 0) {
90
+ console.log(chalk.dim(`Token savings: ~${data.metrics.tokensSaved} tokens saved (${data.metrics.savingsPercent}%)`));
91
+ }
92
+ if (opts.verbose && data.metrics) {
93
+ console.log(chalk.dim('\nDetailed metrics:'));
94
+ console.log(chalk.dim(` Tokens returned: ${data.metrics.tokensReturned}`));
95
+ console.log(chalk.dim(` Estimated full file tokens: ${data.metrics.estimatedFullFileTokens}`));
96
+ console.log(chalk.dim(` Tokens saved: ${data.metrics.tokensSaved}`));
97
+ console.log(chalk.dim(` Savings: ${data.metrics.savingsPercent}%`));
98
+ }
99
+ }
100
+ catch (err) {
101
+ const message = err.message;
102
+ if (message.startsWith('EXIT:')) {
103
+ const code = parseInt(message.slice(5), 10);
104
+ process.exit(Number.isNaN(code) ? 1 : code);
105
+ }
106
+ if (message.includes('aborted') ||
107
+ message.includes('AbortError') ||
108
+ message.includes('Request aborted')) {
109
+ spinner?.fail('Search cancelled');
110
+ process.exit(130);
111
+ }
112
+ spinner?.fail('Search failed');
113
+ outputError(message, opts.json ?? false);
114
+ }
115
+ }
116
+ export const searchCommand = new Command('search')
117
+ .description('Search code across indexed projects')
118
+ .argument('<query>', 'Search query')
119
+ .option('-n, --limit <n>', 'Max results', '5')
120
+ .option('-p, --project <name>', 'Filter by project name', 'all')
121
+ .option('-g, --group <name>', 'Override group from config')
122
+ .option('--server <url>', 'MCP server URL', 'http://localhost:9876')
123
+ .option('--timeout <ms>', 'Request timeout in milliseconds', '30000')
124
+ .option('--json', 'Output as JSON')
125
+ .option('-v, --verbose', 'Show detailed output')
126
+ .action(async (query, opts) => {
127
+ let limit = 5;
128
+ if (opts.limit) {
129
+ const parsed = parseInt(opts.limit, 10);
130
+ if (Number.isNaN(parsed) || parsed <= 0) {
131
+ const msg = `Invalid limit: ${opts.limit}. Must be a positive number.`;
132
+ if (opts.json) {
133
+ console.log(JSON.stringify({ error: msg }));
134
+ }
135
+ else {
136
+ console.error(chalk.red(msg));
137
+ }
138
+ process.exit(1);
139
+ }
140
+ if (parsed > 100) {
141
+ const msg = `Limit too large: ${parsed}. Maximum is 100.`;
142
+ if (opts.json) {
143
+ console.log(JSON.stringify({ error: msg }));
144
+ }
145
+ else {
146
+ console.error(chalk.red(msg));
147
+ }
148
+ process.exit(1);
149
+ }
150
+ limit = parsed;
151
+ }
152
+ let timeout = 30_000;
153
+ if (opts.timeout) {
154
+ const parsed = parseInt(opts.timeout, 10);
155
+ if (Number.isNaN(parsed) || parsed <= 0) {
156
+ const msg = `Invalid timeout: ${opts.timeout}. Must be a positive number.`;
157
+ if (opts.json) {
158
+ console.log(JSON.stringify({ error: msg }));
159
+ }
160
+ else {
161
+ console.error(chalk.red(msg));
162
+ }
163
+ process.exit(1);
164
+ }
165
+ timeout = parsed;
166
+ }
167
+ const controller = new AbortController();
168
+ let spinner = null;
169
+ const sigintHandler = () => {
170
+ spinner?.stop();
171
+ if (!opts.json) {
172
+ console.log(chalk.yellow('\nSearch cancelled'));
173
+ }
174
+ controller.abort();
175
+ process.exit(130);
176
+ };
177
+ process.on('SIGINT', sigintHandler);
178
+ const client = new ApiClient(opts.server);
179
+ const searchClient = {
180
+ search: (g, q, o) => client.search(g, q, { ...o, signal: controller.signal }),
181
+ };
182
+ spinner = opts.json ? null : ora('Searching...').start();
183
+ try {
184
+ await runSearch(searchClient, query, {
185
+ limit,
186
+ project: opts.project,
187
+ group: opts.group,
188
+ timeout,
189
+ json: opts.json,
190
+ verbose: opts.verbose,
191
+ }, { spinner });
192
+ }
193
+ catch (err) {
194
+ const message = err.message;
195
+ if (message.startsWith('EXIT:')) {
196
+ const code = parseInt(message.slice(5), 10);
197
+ process.exit(Number.isNaN(code) ? 1 : code);
198
+ }
199
+ if (message.includes('aborted') ||
200
+ message.includes('AbortError') ||
201
+ message.includes('Request aborted')) {
202
+ process.exit(130);
203
+ }
204
+ if (opts.json) {
205
+ console.log(JSON.stringify({ error: message }));
206
+ }
207
+ else {
208
+ console.error(chalk.red(message));
209
+ }
210
+ process.exit(1);
211
+ }
212
+ finally {
213
+ process.off('SIGINT', sigintHandler);
214
+ }
215
+ });
216
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}