ghcrawl 0.0.1 → 0.1.1

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.
package/dist/main.js ADDED
@@ -0,0 +1,398 @@
1
+ #!/usr/bin/env node
2
+ import { once } from 'node:events';
3
+ import { parseArgs } from 'node:util';
4
+ import { createApiServer, GHCrawlService } from '@ghcrawl/api-core';
5
+ import { runInitWizard } from './init-wizard.js';
6
+ import { startTui } from './tui/app.js';
7
+ function usage(devMode = false) {
8
+ const lines = [
9
+ 'ghcrawl <command> [options]',
10
+ '',
11
+ 'Commands:',
12
+ ' init [--reconfigure]',
13
+ ' doctor',
14
+ ' sync <owner/repo> [--since <iso|duration>] [--limit <count>] [--include-comments]',
15
+ ' refresh <owner/repo> [--no-sync] [--no-embed] [--no-cluster]',
16
+ ' embed <owner/repo> [--number <thread>]',
17
+ ' cluster <owner/repo> [--k <count>] [--threshold <score>]',
18
+ ' clusters <owner/repo> [--min-size <count>] [--limit <count>] [--sort recent|size] [--search <text>]',
19
+ ' cluster-detail <owner/repo> --id <cluster-id> [--member-limit <count>] [--body-chars <count>]',
20
+ ' search <owner/repo> --query <text> [--mode keyword|semantic|hybrid]',
21
+ ' neighbors <owner/repo> --number <thread> [--limit <count>] [--threshold <score>]',
22
+ ' tui [owner/repo]',
23
+ ' serve',
24
+ ];
25
+ if (devMode) {
26
+ lines.push('', 'Advanced Commands:', ' summarize <owner/repo> [--number <thread>] [--include-comments]', ' purge-comments <owner/repo> [--number <thread>]');
27
+ }
28
+ return `${lines.join('\n')}\n`;
29
+ }
30
+ function parseGlobalFlags(argv, env = process.env) {
31
+ let devMode = env.GHCRAWL_DEV_MODE === '1' || env.GHCRAWL_DEV_MODE === '1';
32
+ const filtered = [];
33
+ for (const arg of argv) {
34
+ if (arg === '--dev') {
35
+ devMode = true;
36
+ continue;
37
+ }
38
+ filtered.push(arg);
39
+ }
40
+ return { argv: filtered, devMode };
41
+ }
42
+ export function parseOwnerRepo(value) {
43
+ const trimmed = value.trim();
44
+ const parts = trimmed.split('/');
45
+ if (parts.length !== 2 || !parts[0] || !parts[1]) {
46
+ throw new Error(`Expected owner/repo, received: ${value}`);
47
+ }
48
+ return { owner: parts[0], repo: parts[1] };
49
+ }
50
+ export function parseRepoFlags(args) {
51
+ const parsed = parseArgs({
52
+ args,
53
+ allowPositionals: true,
54
+ options: {
55
+ owner: { type: 'string' },
56
+ repo: { type: 'string' },
57
+ since: { type: 'string' },
58
+ limit: { type: 'string' },
59
+ 'include-comments': { type: 'boolean' },
60
+ number: { type: 'string' },
61
+ query: { type: 'string' },
62
+ mode: { type: 'string' },
63
+ k: { type: 'string' },
64
+ threshold: { type: 'string' },
65
+ port: { type: 'string' },
66
+ id: { type: 'string' },
67
+ sort: { type: 'string' },
68
+ search: { type: 'string' },
69
+ 'min-size': { type: 'string' },
70
+ 'member-limit': { type: 'string' },
71
+ 'body-chars': { type: 'string' },
72
+ 'no-sync': { type: 'boolean' },
73
+ 'no-embed': { type: 'boolean' },
74
+ 'no-cluster': { type: 'boolean' },
75
+ },
76
+ });
77
+ if (typeof parsed.values.repo === 'string' && parsed.values.repo.includes('/')) {
78
+ const target = parseOwnerRepo(parsed.values.repo);
79
+ return { ...target, values: parsed.values };
80
+ }
81
+ if (parsed.positionals.length > 0) {
82
+ const target = parseOwnerRepo(parsed.positionals[0]);
83
+ return { ...target, values: parsed.values };
84
+ }
85
+ const owner = parsed.values.owner;
86
+ const repo = parsed.values.repo;
87
+ if (typeof owner === 'string' && typeof repo === 'string') {
88
+ return { owner, repo, values: parsed.values };
89
+ }
90
+ throw new Error('Use --repo owner/repo or provide owner/repo as the first positional argument');
91
+ }
92
+ export function resolveSinceValue(value, now = new Date()) {
93
+ const trimmed = value.trim();
94
+ const absolute = new Date(trimmed);
95
+ if (!Number.isNaN(absolute.getTime())) {
96
+ return absolute.toISOString();
97
+ }
98
+ const match = trimmed.match(/^(\d+)(s|m|h|d|w|mo|y)$/i);
99
+ if (!match) {
100
+ throw new Error(`Invalid --since value: ${value}. Use an ISO timestamp or duration like 15m, 2h, 7d, or 1mo.`);
101
+ }
102
+ const amount = Number(match[1]);
103
+ const unit = match[2].toLowerCase();
104
+ const resolved = new Date(now);
105
+ switch (unit) {
106
+ case 's':
107
+ resolved.setTime(resolved.getTime() - amount * 1000);
108
+ break;
109
+ case 'm':
110
+ resolved.setTime(resolved.getTime() - amount * 60 * 1000);
111
+ break;
112
+ case 'h':
113
+ resolved.setTime(resolved.getTime() - amount * 60 * 60 * 1000);
114
+ break;
115
+ case 'd':
116
+ resolved.setTime(resolved.getTime() - amount * 24 * 60 * 60 * 1000);
117
+ break;
118
+ case 'w':
119
+ resolved.setTime(resolved.getTime() - amount * 7 * 24 * 60 * 60 * 1000);
120
+ break;
121
+ case 'mo':
122
+ resolved.setUTCMonth(resolved.getUTCMonth() - amount);
123
+ break;
124
+ case 'y':
125
+ resolved.setUTCFullYear(resolved.getUTCFullYear() - amount);
126
+ break;
127
+ default:
128
+ throw new Error(`Unsupported --since unit: ${unit}`);
129
+ }
130
+ return resolved.toISOString();
131
+ }
132
+ export function formatLogLine(message, now = new Date()) {
133
+ return `[${now.toISOString()}] ${message}`;
134
+ }
135
+ function writeProgress(message) {
136
+ process.stderr.write(`${formatLogLine(message)}\n`);
137
+ }
138
+ function formatBooleanStatus(value) {
139
+ return value ? 'yes' : 'no';
140
+ }
141
+ function parsePositiveInteger(name, value) {
142
+ const parsed = Number(value);
143
+ if (!Number.isSafeInteger(parsed) || parsed <= 0) {
144
+ throw new Error(`Invalid ${name}: ${value}`);
145
+ }
146
+ return parsed;
147
+ }
148
+ export function formatDoctorReport(result) {
149
+ const lines = [
150
+ 'ghcrawl doctor',
151
+ '',
152
+ 'Health',
153
+ ` ok: ${formatBooleanStatus(result.health.ok)}`,
154
+ ` config path: ${result.health.configPath}`,
155
+ ` config file exists: ${formatBooleanStatus(result.health.configFileExists)}`,
156
+ ` db path: ${result.health.dbPath}`,
157
+ ` api port: ${result.health.apiPort}`,
158
+ '',
159
+ 'GitHub',
160
+ ` configured: ${formatBooleanStatus(result.github.configured)}`,
161
+ ` source: ${result.github.source}`,
162
+ ` format ok: ${formatBooleanStatus(result.github.formatOk)}`,
163
+ ` auth ok: ${formatBooleanStatus(result.github.authOk)}`,
164
+ ];
165
+ if (result.github.error) {
166
+ lines.push(` note: ${result.github.error}`);
167
+ }
168
+ lines.push('', 'OpenAI', ` configured: ${formatBooleanStatus(result.openai.configured)}`, ` source: ${result.openai.source}`, ` format ok: ${formatBooleanStatus(result.openai.formatOk)}`, ` auth ok: ${formatBooleanStatus(result.openai.authOk)}`);
169
+ if (result.openai.error) {
170
+ lines.push(` note: ${result.openai.error}`);
171
+ }
172
+ return `${lines.join('\n')}\n`;
173
+ }
174
+ function closeService(service) {
175
+ if (service) {
176
+ service.close();
177
+ }
178
+ }
179
+ export async function run(argv, stdout = process.stdout) {
180
+ const parsedGlobals = parseGlobalFlags(argv);
181
+ const [commandRaw, ...rest] = parsedGlobals.argv;
182
+ const command = commandRaw;
183
+ if (!command || commandRaw === '--help' || commandRaw === '-h' || commandRaw === 'help') {
184
+ stdout.write(usage(parsedGlobals.devMode));
185
+ return;
186
+ }
187
+ let service = null;
188
+ const getService = () => {
189
+ service ??= new GHCrawlService();
190
+ return service;
191
+ };
192
+ try {
193
+ switch (command) {
194
+ case 'init': {
195
+ const parsed = parseArgs({
196
+ args: rest,
197
+ options: {
198
+ reconfigure: { type: 'boolean' },
199
+ },
200
+ });
201
+ await runInitWizard({ reconfigure: parsed.values.reconfigure === true });
202
+ stdout.write(`${JSON.stringify(getService().init(), null, 2)}\n`);
203
+ return;
204
+ }
205
+ case 'doctor': {
206
+ const parsed = parseArgs({
207
+ args: rest,
208
+ options: {
209
+ json: { type: 'boolean' },
210
+ },
211
+ });
212
+ const result = await getService().doctor();
213
+ const shouldWriteJson = parsed.values.json === true || stdout.isTTY !== true;
214
+ stdout.write(shouldWriteJson ? `${JSON.stringify(result, null, 2)}\n` : formatDoctorReport(result));
215
+ return;
216
+ }
217
+ case 'sync': {
218
+ const { owner, repo, values } = parseRepoFlags(rest);
219
+ const result = await getService().syncRepository({
220
+ owner,
221
+ repo,
222
+ since: typeof values.since === 'string' ? resolveSinceValue(values.since) : undefined,
223
+ limit: typeof values.limit === 'string' ? Number(values.limit) : undefined,
224
+ includeComments: values['include-comments'] === true,
225
+ onProgress: writeProgress,
226
+ });
227
+ stdout.write(`${JSON.stringify(result, null, 2)}\n`);
228
+ return;
229
+ }
230
+ case 'refresh': {
231
+ const { owner, repo, values } = parseRepoFlags(rest);
232
+ const result = await getService().refreshRepository({
233
+ owner,
234
+ repo,
235
+ sync: values['no-sync'] === true ? false : undefined,
236
+ embed: values['no-embed'] === true ? false : undefined,
237
+ cluster: values['no-cluster'] === true ? false : undefined,
238
+ onProgress: writeProgress,
239
+ });
240
+ stdout.write(`${JSON.stringify(result, null, 2)}\n`);
241
+ return;
242
+ }
243
+ case 'summarize': {
244
+ const { owner, repo, values } = parseRepoFlags(rest);
245
+ const result = await getService().summarizeRepository({
246
+ owner,
247
+ repo,
248
+ threadNumber: typeof values.number === 'string' ? Number(values.number) : undefined,
249
+ includeComments: values['include-comments'] === true,
250
+ onProgress: writeProgress,
251
+ });
252
+ stdout.write(`${JSON.stringify(result, null, 2)}\n`);
253
+ return;
254
+ }
255
+ case 'purge-comments': {
256
+ const { owner, repo, values } = parseRepoFlags(rest);
257
+ const result = getService().purgeComments({
258
+ owner,
259
+ repo,
260
+ threadNumber: typeof values.number === 'string' ? Number(values.number) : undefined,
261
+ onProgress: writeProgress,
262
+ });
263
+ stdout.write(`${JSON.stringify(result, null, 2)}\n`);
264
+ return;
265
+ }
266
+ case 'embed': {
267
+ const { owner, repo, values } = parseRepoFlags(rest);
268
+ const result = await getService().embedRepository({
269
+ owner,
270
+ repo,
271
+ threadNumber: typeof values.number === 'string' ? Number(values.number) : undefined,
272
+ onProgress: writeProgress,
273
+ });
274
+ stdout.write(`${JSON.stringify(result, null, 2)}\n`);
275
+ return;
276
+ }
277
+ case 'cluster': {
278
+ const { owner, repo, values } = parseRepoFlags(rest);
279
+ const result = getService().clusterRepository({
280
+ owner,
281
+ repo,
282
+ k: typeof values.k === 'string' ? Number(values.k) : undefined,
283
+ minScore: typeof values.threshold === 'string' ? Number(values.threshold) : undefined,
284
+ onProgress: writeProgress,
285
+ });
286
+ stdout.write(`${JSON.stringify(result, null, 2)}\n`);
287
+ return;
288
+ }
289
+ case 'clusters': {
290
+ const { owner, repo, values } = parseRepoFlags(rest);
291
+ const sort = values.sort === 'recent' || values.sort === 'size' ? values.sort : undefined;
292
+ const result = getService().listClusterSummaries({
293
+ owner,
294
+ repo,
295
+ minSize: typeof values['min-size'] === 'string' ? parsePositiveInteger('min-size', values['min-size']) : undefined,
296
+ limit: typeof values.limit === 'string' ? parsePositiveInteger('limit', values.limit) : undefined,
297
+ sort,
298
+ search: typeof values.search === 'string' ? values.search : undefined,
299
+ });
300
+ stdout.write(`${JSON.stringify(result, null, 2)}\n`);
301
+ return;
302
+ }
303
+ case 'cluster-detail': {
304
+ const { owner, repo, values } = parseRepoFlags(rest);
305
+ if (typeof values.id !== 'string') {
306
+ throw new Error('Missing --id');
307
+ }
308
+ const result = getService().getClusterDetailDump({
309
+ owner,
310
+ repo,
311
+ clusterId: parsePositiveInteger('id', values.id),
312
+ memberLimit: typeof values['member-limit'] === 'string'
313
+ ? parsePositiveInteger('member-limit', values['member-limit'])
314
+ : undefined,
315
+ bodyChars: typeof values['body-chars'] === 'string'
316
+ ? parsePositiveInteger('body-chars', values['body-chars'])
317
+ : undefined,
318
+ });
319
+ stdout.write(`${JSON.stringify(result, null, 2)}\n`);
320
+ return;
321
+ }
322
+ case 'search': {
323
+ const { owner, repo, values } = parseRepoFlags(rest);
324
+ if (typeof values.query !== 'string') {
325
+ throw new Error('Missing --query');
326
+ }
327
+ const mode = values.mode === 'keyword' || values.mode === 'semantic' || values.mode === 'hybrid'
328
+ ? values.mode
329
+ : undefined;
330
+ const result = await getService().searchRepository({
331
+ owner,
332
+ repo,
333
+ query: values.query,
334
+ mode,
335
+ });
336
+ stdout.write(`${JSON.stringify(result, null, 2)}\n`);
337
+ return;
338
+ }
339
+ case 'neighbors': {
340
+ const { owner, repo, values } = parseRepoFlags(rest);
341
+ if (typeof values.number !== 'string') {
342
+ throw new Error('Missing --number');
343
+ }
344
+ const result = getService().listNeighbors({
345
+ owner,
346
+ repo,
347
+ threadNumber: Number(values.number),
348
+ limit: typeof values.limit === 'string' ? Number(values.limit) : undefined,
349
+ minScore: typeof values.threshold === 'string' ? Number(values.threshold) : undefined,
350
+ });
351
+ stdout.write(`${JSON.stringify(result, null, 2)}\n`);
352
+ return;
353
+ }
354
+ case 'tui': {
355
+ if (rest.length === 0) {
356
+ await startTui({ service: getService() });
357
+ return;
358
+ }
359
+ const { owner, repo } = parseRepoFlags(rest);
360
+ await startTui({ service: getService(), owner, repo });
361
+ return;
362
+ }
363
+ case 'serve': {
364
+ const serviceForServe = getService();
365
+ const server = createApiServer(serviceForServe);
366
+ const parsed = parseArgs({
367
+ args: rest,
368
+ options: { port: { type: 'string' } },
369
+ });
370
+ const port = typeof parsed.values.port === 'string' ? Number(parsed.values.port) : serviceForServe.config.apiPort;
371
+ server.listen(port, '127.0.0.1');
372
+ stdout.write(`ghcrawl API listening on http://127.0.0.1:${port}\n`);
373
+ const stop = async () => {
374
+ server.close();
375
+ serviceForServe.close();
376
+ };
377
+ process.once('SIGINT', () => void stop());
378
+ process.once('SIGTERM', () => void stop());
379
+ await once(server, 'close');
380
+ return;
381
+ }
382
+ default:
383
+ throw new Error(`Unknown command: ${command}`);
384
+ }
385
+ }
386
+ finally {
387
+ if (command !== 'serve') {
388
+ closeService(service);
389
+ }
390
+ }
391
+ }
392
+ if (import.meta.url === `file://${process.argv[1]}`) {
393
+ run(process.argv.slice(2)).catch((error) => {
394
+ writeProgress(error instanceof Error ? error.message : String(error));
395
+ process.exit(1);
396
+ });
397
+ }
398
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { GHCrawlService, TuiClusterDetail, TuiRepoStats, TuiThreadDetail } from '@ghcrawl/api-core';
2
+ import { type TuiFocusPane } from './state.js';
3
+ type StartTuiParams = {
4
+ service: GHCrawlService;
5
+ owner?: string;
6
+ repo?: string;
7
+ };
8
+ type RepositoryTarget = {
9
+ owner: string;
10
+ repo: string;
11
+ };
12
+ type RepositoryChoice = {
13
+ kind: 'existing';
14
+ target: RepositoryTarget;
15
+ label: string;
16
+ } | {
17
+ kind: 'new';
18
+ label: string;
19
+ };
20
+ type UpdateTaskSelection = {
21
+ sync: boolean;
22
+ embed: boolean;
23
+ cluster: boolean;
24
+ };
25
+ export declare function resolveBlessedTerminal(env?: NodeJS.ProcessEnv): string | undefined;
26
+ export declare function startTui(params: StartTuiParams): Promise<void>;
27
+ export declare function renderDetailPane(threadDetail: TuiThreadDetail | null, clusterDetail: TuiClusterDetail | null, focusPane: TuiFocusPane): string;
28
+ export declare function escapeBlessedText(value: string): string;
29
+ export declare function describeUpdateTask(task: keyof UpdateTaskSelection, stats: TuiRepoStats | null, now?: Date): string;
30
+ export declare function buildUpdatePipelineLabels(stats: TuiRepoStats | null, selection: UpdateTaskSelection, now?: Date): string[];
31
+ export declare function getRepositoryChoices(service: Pick<GHCrawlService, 'listRepositories'>, now?: Date): RepositoryChoice[];
32
+ export declare function parseOwnerRepoValue(value: string): {
33
+ owner: string;
34
+ repo: string;
35
+ } | null;
36
+ export {};
37
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/tui/app.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAEhB,YAAY,EAEZ,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAUL,KAAK,YAAY,EAElB,MAAM,YAAY,CAAC;AAGpB,KAAK,cAAc,GAAG;IACpB,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,KAAK,gBAAgB,GACjB;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf,GACD;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAgBN,KAAK,mBAAmB,GAAG;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,SAAS,CAS/F;AAaD,wBAAsB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA8nBpE;AAsED,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,eAAe,GAAG,IAAI,EACpC,aAAa,EAAE,gBAAgB,GAAG,IAAI,EACtC,SAAS,EAAE,YAAY,GACtB,MAAM,CAoCR;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAwBD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,mBAAmB,EAC/B,KAAK,EAAE,YAAY,GAAG,IAAI,EAC1B,GAAG,GAAE,IAAiB,GACrB,MAAM,CAiCR;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,YAAY,GAAG,IAAI,EAC1B,SAAS,EAAE,mBAAmB,EAC9B,GAAG,GAAE,IAAiB,GACrB,MAAM,EAAE,CAMV;AAkFD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,kBAAkB,CAAC,EAAE,GAAG,GAAE,IAAiB,GAAG,gBAAgB,EAAE,CAalI;AA6ID,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAMzF"}