@idea404/repocontext 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.
@@ -0,0 +1,33 @@
1
+ import { FileFinder } from '@ff-labs/fff-node';
2
+ export interface SearchMatch {
3
+ relativePath: string;
4
+ absolutePath: string;
5
+ lineNumber: number;
6
+ column: number;
7
+ lineContent: string;
8
+ matchRanges: Array<[number, number]>;
9
+ isDefinition?: boolean;
10
+ }
11
+ export declare function getFinder(rootPath: string): Promise<FileFinder | null>;
12
+ export declare function searchFiles(pattern: string, options?: {
13
+ mode?: 'plain' | 'regex' | 'fuzzy';
14
+ glob?: string;
15
+ exclude?: string[];
16
+ limit?: number;
17
+ contextLines?: number;
18
+ }): Promise<SearchMatch[]>;
19
+ export declare function listFiles(glob: string, options?: {
20
+ exclude?: string[];
21
+ limit?: number;
22
+ }): Promise<Array<{
23
+ relativePath: string;
24
+ absolutePath: string;
25
+ }>>;
26
+ export declare function fuzzyFindFiles(query: string, options?: {
27
+ limit?: number;
28
+ }): Promise<Array<{
29
+ relativePath: string;
30
+ absolutePath: string;
31
+ }>>;
32
+ export declare function closeFinders(): Promise<void>;
33
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAe/C,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAQD,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAc5E;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,OAAO,CAAC,WAAW,EAAE,CAAC,CAsCxB;AAcD,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACnD,OAAO,CAAC,KAAK,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAyBhE;AASD,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,KAAK,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CA0BhE;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAKlD"}
package/dist/search.js ADDED
@@ -0,0 +1,135 @@
1
+ import { FileFinder } from '@ff-labs/fff-node';
2
+ import { getRoots } from './roots.js';
3
+ import { DEFAULT_SCAN_TIMEOUT_MS, log } from './utils.js';
4
+ import path from 'node:path';
5
+ const finders = new Map();
6
+ const DEFAULT_EXCLUDES = ['node_modules', '.git', 'dist', 'build', '.next', '.turbo'];
7
+ function isExcluded(relativePath, extraExcludes) {
8
+ const segments = relativePath.split(path.sep);
9
+ const allExcludes = [...DEFAULT_EXCLUDES, ...(extraExcludes ?? [])];
10
+ return segments.some((segment) => allExcludes.includes(segment));
11
+ }
12
+ export async function getFinder(rootPath) {
13
+ const existing = finders.get(rootPath);
14
+ if (existing)
15
+ return existing;
16
+ const created = FileFinder.create({ basePath: rootPath, aiMode: true });
17
+ if (!created.ok) {
18
+ log('error', `Failed to create FileFinder for ${rootPath}: ${created.error}`);
19
+ return null;
20
+ }
21
+ const finder = created.value;
22
+ await finder.waitForScan(DEFAULT_SCAN_TIMEOUT_MS);
23
+ finders.set(rootPath, finder);
24
+ return finder;
25
+ }
26
+ export async function searchFiles(pattern, options = {}) {
27
+ const roots = getRoots();
28
+ const limit = options.limit ?? 25;
29
+ const results = [];
30
+ const query = [options.glob, pattern].filter(Boolean).join(' ');
31
+ for (const root of roots) {
32
+ const finder = await getFinder(root.path);
33
+ if (!finder)
34
+ continue;
35
+ const grepOptions = {
36
+ mode: options.mode ?? 'plain',
37
+ smartCase: true,
38
+ maxMatchesPerFile: 20,
39
+ pageSize: limit,
40
+ beforeContext: options.contextLines ?? 0,
41
+ afterContext: options.contextLines ?? 0,
42
+ classifyDefinitions: true,
43
+ };
44
+ const grepResult = finder.grep(query, grepOptions);
45
+ if (!grepResult.ok) {
46
+ log('warning', `grep failed for ${root.path}: ${grepResult.error}`);
47
+ continue;
48
+ }
49
+ for (const item of grepResult.value.items) {
50
+ if (results.length >= limit)
51
+ break;
52
+ if (isExcluded(item.relativePath, options.exclude))
53
+ continue;
54
+ results.push(toSearchMatch(item, root.path));
55
+ }
56
+ if (results.length >= limit)
57
+ break;
58
+ }
59
+ return results;
60
+ }
61
+ function toSearchMatch(item, rootPath) {
62
+ return {
63
+ relativePath: item.relativePath,
64
+ absolutePath: path.join(rootPath, item.relativePath),
65
+ lineNumber: item.lineNumber,
66
+ column: item.col,
67
+ lineContent: item.lineContent,
68
+ matchRanges: item.matchRanges,
69
+ isDefinition: item.isDefinition,
70
+ };
71
+ }
72
+ export async function listFiles(glob, options = {}) {
73
+ const roots = getRoots();
74
+ const limit = options.limit ?? 100;
75
+ const results = [];
76
+ for (const root of roots) {
77
+ const finder = await getFinder(root.path);
78
+ if (!finder)
79
+ continue;
80
+ const globResult = finder.glob(glob, { pageSize: limit });
81
+ if (!globResult.ok) {
82
+ log('warning', `glob failed for ${root.path}: ${globResult.error}`);
83
+ continue;
84
+ }
85
+ for (const item of globResult.value.items) {
86
+ if (results.length >= limit)
87
+ break;
88
+ if (isExcluded(item.relativePath, options.exclude))
89
+ continue;
90
+ results.push(toFileEntry(item, root.path));
91
+ }
92
+ if (results.length >= limit)
93
+ break;
94
+ }
95
+ return results;
96
+ }
97
+ function toFileEntry(item, rootPath) {
98
+ return {
99
+ relativePath: item.relativePath,
100
+ absolutePath: path.join(rootPath, item.relativePath),
101
+ };
102
+ }
103
+ export async function fuzzyFindFiles(query, options = {}) {
104
+ const roots = getRoots();
105
+ const limit = options.limit ?? 25;
106
+ const results = [];
107
+ for (const root of roots) {
108
+ const finder = await getFinder(root.path);
109
+ if (!finder)
110
+ continue;
111
+ const searchOptions = { pageSize: limit };
112
+ const searchResult = finder.fileSearch(query, searchOptions);
113
+ if (!searchResult.ok) {
114
+ log('warning', `fileSearch failed for ${root.path}: ${searchResult.error}`);
115
+ continue;
116
+ }
117
+ for (const item of searchResult.value.items) {
118
+ if (results.length >= limit)
119
+ break;
120
+ if (isExcluded(item.relativePath))
121
+ continue;
122
+ results.push(toFileEntry(item, root.path));
123
+ }
124
+ if (results.length >= limit)
125
+ break;
126
+ }
127
+ return results;
128
+ }
129
+ export async function closeFinders() {
130
+ for (const finder of finders.values()) {
131
+ finder.destroy();
132
+ }
133
+ finders.clear();
134
+ }
135
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function startServer(): Promise<void>;
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAqFA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA4gBjD"}