@memvid/maw 1.0.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 (86) hide show
  1. package/README.md +188 -0
  2. package/dist/bin/maw.d.ts +6 -0
  3. package/dist/bin/maw.d.ts.map +1 -0
  4. package/dist/bin/maw.js +275 -0
  5. package/dist/bin/maw.js.map +1 -0
  6. package/dist/src/crawler/index.d.ts +71 -0
  7. package/dist/src/crawler/index.d.ts.map +1 -0
  8. package/dist/src/crawler/index.js +249 -0
  9. package/dist/src/crawler/index.js.map +1 -0
  10. package/dist/src/crawler/robots.d.ts +26 -0
  11. package/dist/src/crawler/robots.d.ts.map +1 -0
  12. package/dist/src/crawler/robots.js +179 -0
  13. package/dist/src/crawler/robots.js.map +1 -0
  14. package/dist/src/crawler/sitemap.d.ts +36 -0
  15. package/dist/src/crawler/sitemap.d.ts.map +1 -0
  16. package/dist/src/crawler/sitemap.js +209 -0
  17. package/dist/src/crawler/sitemap.js.map +1 -0
  18. package/dist/src/engine/detector.d.ts +18 -0
  19. package/dist/src/engine/detector.d.ts.map +1 -0
  20. package/dist/src/engine/detector.js +155 -0
  21. package/dist/src/engine/detector.js.map +1 -0
  22. package/dist/src/engine/fetch.d.ts +18 -0
  23. package/dist/src/engine/fetch.d.ts.map +1 -0
  24. package/dist/src/engine/fetch.js +53 -0
  25. package/dist/src/engine/fetch.js.map +1 -0
  26. package/dist/src/engine/index.d.ts +39 -0
  27. package/dist/src/engine/index.d.ts.map +1 -0
  28. package/dist/src/engine/index.js +116 -0
  29. package/dist/src/engine/index.js.map +1 -0
  30. package/dist/src/engine/playwright.d.ts +23 -0
  31. package/dist/src/engine/playwright.d.ts.map +1 -0
  32. package/dist/src/engine/playwright.js +88 -0
  33. package/dist/src/engine/playwright.js.map +1 -0
  34. package/dist/src/engine/rebrowser.d.ts +22 -0
  35. package/dist/src/engine/rebrowser.d.ts.map +1 -0
  36. package/dist/src/engine/rebrowser.js +142 -0
  37. package/dist/src/engine/rebrowser.js.map +1 -0
  38. package/dist/src/extractor/cleaner.d.ts +13 -0
  39. package/dist/src/extractor/cleaner.d.ts.map +1 -0
  40. package/dist/src/extractor/cleaner.js +122 -0
  41. package/dist/src/extractor/cleaner.js.map +1 -0
  42. package/dist/src/extractor/index.d.ts +29 -0
  43. package/dist/src/extractor/index.d.ts.map +1 -0
  44. package/dist/src/extractor/index.js +162 -0
  45. package/dist/src/extractor/index.js.map +1 -0
  46. package/dist/src/extractor/links.d.ts +22 -0
  47. package/dist/src/extractor/links.d.ts.map +1 -0
  48. package/dist/src/extractor/links.js +92 -0
  49. package/dist/src/extractor/links.js.map +1 -0
  50. package/dist/src/extractor/markdown.d.ts +13 -0
  51. package/dist/src/extractor/markdown.d.ts.map +1 -0
  52. package/dist/src/extractor/markdown.js +94 -0
  53. package/dist/src/extractor/markdown.js.map +1 -0
  54. package/dist/src/git/index.d.ts +40 -0
  55. package/dist/src/git/index.d.ts.map +1 -0
  56. package/dist/src/git/index.js +303 -0
  57. package/dist/src/git/index.js.map +1 -0
  58. package/dist/src/index.d.ts +103 -0
  59. package/dist/src/index.d.ts.map +1 -0
  60. package/dist/src/index.js +229 -0
  61. package/dist/src/index.js.map +1 -0
  62. package/dist/src/ingestor/index.d.ts +95 -0
  63. package/dist/src/ingestor/index.d.ts.map +1 -0
  64. package/dist/src/ingestor/index.js +471 -0
  65. package/dist/src/ingestor/index.js.map +1 -0
  66. package/dist/src/utils/dedup.d.ts +66 -0
  67. package/dist/src/utils/dedup.d.ts.map +1 -0
  68. package/dist/src/utils/dedup.js +296 -0
  69. package/dist/src/utils/dedup.js.map +1 -0
  70. package/dist/src/utils/index.d.ts +3 -0
  71. package/dist/src/utils/index.d.ts.map +1 -0
  72. package/dist/src/utils/index.js +3 -0
  73. package/dist/src/utils/index.js.map +1 -0
  74. package/dist/src/utils/logger.d.ts +12 -0
  75. package/dist/src/utils/logger.d.ts.map +1 -0
  76. package/dist/src/utils/logger.js +49 -0
  77. package/dist/src/utils/logger.js.map +1 -0
  78. package/dist/src/utils/ui.d.ts +126 -0
  79. package/dist/src/utils/ui.d.ts.map +1 -0
  80. package/dist/src/utils/ui.js +357 -0
  81. package/dist/src/utils/ui.js.map +1 -0
  82. package/dist/src/utils/url.d.ts +21 -0
  83. package/dist/src/utils/url.d.ts.map +1 -0
  84. package/dist/src/utils/url.js +107 -0
  85. package/dist/src/utils/url.js.map +1 -0
  86. package/package.json +71 -0
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Link extraction utilities
3
+ */
4
+ import type { CheerioAPI } from 'cheerio';
5
+ export interface ExtractedLink {
6
+ href: string;
7
+ text: string;
8
+ isInternal: boolean;
9
+ }
10
+ /**
11
+ * Extract all links from HTML
12
+ */
13
+ export declare function extractLinks($: CheerioAPI, baseUrl: string): string[];
14
+ /**
15
+ * Extract links with additional metadata
16
+ */
17
+ export declare function extractLinksWithMeta($: CheerioAPI, baseUrl: string): ExtractedLink[];
18
+ /**
19
+ * Extract only internal links (same domain)
20
+ */
21
+ export declare function extractInternalLinks($: CheerioAPI, baseUrl: string): string[];
22
+ //# sourceMappingURL=links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../../src/extractor/links.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CA4BrE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAoCpF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAa7E"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Link extraction utilities
3
+ */
4
+ import { resolveUrl, shouldSkipUrl } from '../utils/url.js';
5
+ /**
6
+ * Extract all links from HTML
7
+ */
8
+ export function extractLinks($, baseUrl) {
9
+ const links = [];
10
+ const seen = new Set();
11
+ try {
12
+ const baseHost = new URL(baseUrl).hostname;
13
+ $('a[href]').each((_, el) => {
14
+ const href = $(el).attr('href');
15
+ if (!href)
16
+ return;
17
+ const resolved = resolveUrl(href, baseUrl);
18
+ if (!resolved)
19
+ return;
20
+ // Skip non-HTML resources
21
+ if (shouldSkipUrl(resolved))
22
+ return;
23
+ // Deduplicate
24
+ if (seen.has(resolved))
25
+ return;
26
+ seen.add(resolved);
27
+ links.push(resolved);
28
+ });
29
+ }
30
+ catch {
31
+ // Invalid base URL
32
+ }
33
+ return links;
34
+ }
35
+ /**
36
+ * Extract links with additional metadata
37
+ */
38
+ export function extractLinksWithMeta($, baseUrl) {
39
+ const links = [];
40
+ const seen = new Set();
41
+ try {
42
+ const baseHost = new URL(baseUrl).hostname;
43
+ $('a[href]').each((_, el) => {
44
+ const $el = $(el);
45
+ const href = $el.attr('href');
46
+ if (!href)
47
+ return;
48
+ const resolved = resolveUrl(href, baseUrl);
49
+ if (!resolved)
50
+ return;
51
+ if (shouldSkipUrl(resolved))
52
+ return;
53
+ if (seen.has(resolved))
54
+ return;
55
+ seen.add(resolved);
56
+ let isInternal = false;
57
+ try {
58
+ isInternal = new URL(resolved).hostname === baseHost;
59
+ }
60
+ catch { }
61
+ links.push({
62
+ href: resolved,
63
+ text: $el.text().trim().slice(0, 100),
64
+ isInternal,
65
+ });
66
+ });
67
+ }
68
+ catch {
69
+ // Invalid base URL
70
+ }
71
+ return links;
72
+ }
73
+ /**
74
+ * Extract only internal links (same domain)
75
+ */
76
+ export function extractInternalLinks($, baseUrl) {
77
+ try {
78
+ const baseHost = new URL(baseUrl).hostname;
79
+ return extractLinks($, baseUrl).filter(link => {
80
+ try {
81
+ return new URL(link).hostname === baseHost;
82
+ }
83
+ catch {
84
+ return false;
85
+ }
86
+ });
87
+ }
88
+ catch {
89
+ return [];
90
+ }
91
+ }
92
+ //# sourceMappingURL=links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.js","sourceRoot":"","sources":["../../../src/extractor/links.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * HTML to Markdown conversion using node-html-markdown
3
+ * 1.57x faster than Turndown
4
+ */
5
+ /**
6
+ * Convert HTML to Markdown
7
+ */
8
+ export declare function htmlToMarkdown(html: string): string;
9
+ /**
10
+ * Extract plain text from markdown (remove formatting)
11
+ */
12
+ export declare function markdownToPlainText(markdown: string): string;
13
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../src/extractor/markdown.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYnD;AA4CD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmC5D"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * HTML to Markdown conversion using node-html-markdown
3
+ * 1.57x faster than Turndown
4
+ */
5
+ import { NodeHtmlMarkdown } from 'node-html-markdown';
6
+ // Configure node-html-markdown for optimal output
7
+ const nhm = new NodeHtmlMarkdown({
8
+ codeFence: '```',
9
+ bulletMarker: '-',
10
+ codeBlockStyle: 'fenced',
11
+ emDelimiter: '*',
12
+ strongDelimiter: '**',
13
+ maxConsecutiveNewlines: 2,
14
+ useLinkReferenceDefinitions: false,
15
+ useInlineLinks: true,
16
+ });
17
+ /**
18
+ * Convert HTML to Markdown
19
+ */
20
+ export function htmlToMarkdown(html) {
21
+ if (!html || !html.trim()) {
22
+ return '';
23
+ }
24
+ try {
25
+ const markdown = nhm.translate(html);
26
+ return postProcess(markdown);
27
+ }
28
+ catch (error) {
29
+ // Fallback: strip HTML tags if conversion fails
30
+ return html.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim();
31
+ }
32
+ }
33
+ /**
34
+ * Post-process markdown for cleaner output
35
+ */
36
+ function postProcess(markdown) {
37
+ return markdown
38
+ // Normalize line endings
39
+ .replace(/\r\n/g, '\n')
40
+ // Max 2 consecutive newlines
41
+ .replace(/\n{3,}/g, '\n\n')
42
+ // Trim trailing whitespace on each line
43
+ .replace(/[ \t]+$/gm, '')
44
+ // Fix code block spacing
45
+ .replace(/```(\w*)\n\n+/g, '```$1\n')
46
+ .replace(/\n\n+```/g, '\n```')
47
+ // Remove empty code blocks
48
+ .replace(/```\w*\n\s*\n?```/g, '')
49
+ // Collapse multiple spaces (but not in code blocks)
50
+ .replace(/(?<!```)[ ]{2,}(?!```)/g, ' ')
51
+ // Remove leading/trailing empty lines in blockquotes
52
+ .replace(/^>\s*\n/gm, '> ')
53
+ .replace(/\n>\s*$/gm, '')
54
+ // Fix list formatting
55
+ .replace(/^(-|\*|\d+\.)\s+\n/gm, '')
56
+ // Remove excessive horizontal rules
57
+ .replace(/(---\n){2,}/g, '---\n')
58
+ // Clean up link formatting
59
+ .replace(/\[([^\]]*)\]\(\s+/g, '[$1](')
60
+ .replace(/\s+\)/g, ')')
61
+ // Final trim
62
+ .trim() + '\n';
63
+ }
64
+ /**
65
+ * Extract plain text from markdown (remove formatting)
66
+ */
67
+ export function markdownToPlainText(markdown) {
68
+ return markdown
69
+ // Remove code blocks
70
+ .replace(/```[\s\S]*?```/g, '')
71
+ .replace(/`[^`]+`/g, '')
72
+ // Remove images
73
+ .replace(/!\[([^\]]*)\]\([^)]+\)/g, '$1')
74
+ // Convert links to text
75
+ .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1')
76
+ // Remove headers
77
+ .replace(/^#{1,6}\s+/gm, '')
78
+ // Remove emphasis
79
+ .replace(/\*\*([^*]+)\*\*/g, '$1')
80
+ .replace(/\*([^*]+)\*/g, '$1')
81
+ .replace(/__([^_]+)__/g, '$1')
82
+ .replace(/_([^_]+)_/g, '$1')
83
+ // Remove blockquotes
84
+ .replace(/^>\s*/gm, '')
85
+ // Remove horizontal rules
86
+ .replace(/^---$/gm, '')
87
+ // Remove list markers
88
+ .replace(/^[-*+]\s+/gm, '')
89
+ .replace(/^\d+\.\s+/gm, '')
90
+ // Collapse whitespace
91
+ .replace(/\s+/g, ' ')
92
+ .trim();
93
+ }
94
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/extractor/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Git repository ingestion
3
+ * Clone and read files from git repos
4
+ */
5
+ export interface GitFile {
6
+ path: string;
7
+ content: string;
8
+ language: string;
9
+ size: number;
10
+ }
11
+ export interface GitRepoInfo {
12
+ name: string;
13
+ url?: string;
14
+ localPath: string;
15
+ isTemp: boolean;
16
+ }
17
+ /**
18
+ * Check if a string is a git URL
19
+ */
20
+ export declare function isGitUrl(input: string): boolean;
21
+ /**
22
+ * Check if a path is a local git repo
23
+ */
24
+ export declare function isLocalGitRepo(path: string): boolean;
25
+ /**
26
+ * Clone a git repo to temp directory
27
+ */
28
+ export declare function cloneRepo(url: string): Promise<GitRepoInfo>;
29
+ /**
30
+ * Read all files from a git repo
31
+ */
32
+ export declare function readGitRepo(input: string): AsyncGenerator<GitFile>;
33
+ /**
34
+ * Get repo info without reading files
35
+ */
36
+ export declare function getRepoInfo(input: string): Promise<{
37
+ name: string;
38
+ fileCount: number;
39
+ }>;
40
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/git/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4FH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAS/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMpD;AAcD;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAsBjE;AAsFD;;GAEG;AACH,wBAAuB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAwCzE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB7F"}
@@ -0,0 +1,303 @@
1
+ /**
2
+ * Git repository ingestion
3
+ * Clone and read files from git repos
4
+ */
5
+ import { execSync } from 'child_process';
6
+ import { existsSync, readdirSync, readFileSync, statSync, rmSync } from 'fs';
7
+ import { join, extname, relative } from 'path';
8
+ import { tmpdir } from 'os';
9
+ import { createLogger } from '../utils/logger.js';
10
+ const log = createLogger();
11
+ // File extensions to include
12
+ const CODE_EXTENSIONS = new Set([
13
+ // JavaScript/TypeScript
14
+ '.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs',
15
+ // Python
16
+ '.py', '.pyi',
17
+ // Rust
18
+ '.rs',
19
+ // Go
20
+ '.go',
21
+ // Java/Kotlin
22
+ '.java', '.kt', '.kts',
23
+ // C/C++
24
+ '.c', '.h', '.cpp', '.hpp', '.cc', '.cxx',
25
+ // C#
26
+ '.cs',
27
+ // Ruby
28
+ '.rb',
29
+ // PHP
30
+ '.php',
31
+ // Swift
32
+ '.swift',
33
+ // Shell
34
+ '.sh', '.bash', '.zsh',
35
+ // Web
36
+ '.html', '.css', '.scss', '.sass', '.less', '.vue', '.svelte',
37
+ // Data/Config
38
+ '.json', '.yaml', '.yml', '.toml', '.xml', '.ini', '.env.example',
39
+ // Documentation
40
+ '.md', '.mdx', '.rst', '.txt', '.adoc',
41
+ // SQL
42
+ '.sql',
43
+ // GraphQL
44
+ '.graphql', '.gql',
45
+ // Solidity
46
+ '.sol',
47
+ ]);
48
+ // Directories to skip
49
+ const SKIP_DIRS = new Set([
50
+ 'node_modules',
51
+ '.git',
52
+ '.svn',
53
+ '.hg',
54
+ 'vendor',
55
+ 'target',
56
+ 'dist',
57
+ 'build',
58
+ 'out',
59
+ '.next',
60
+ '.nuxt',
61
+ '__pycache__',
62
+ '.pytest_cache',
63
+ '.mypy_cache',
64
+ 'venv',
65
+ '.venv',
66
+ 'env',
67
+ '.tox',
68
+ 'coverage',
69
+ '.coverage',
70
+ '.nyc_output',
71
+ 'logs',
72
+ 'tmp',
73
+ '.cache',
74
+ '.parcel-cache',
75
+ '.turbo',
76
+ ]);
77
+ // Files to skip
78
+ const SKIP_FILES = new Set([
79
+ 'package-lock.json',
80
+ 'yarn.lock',
81
+ 'pnpm-lock.yaml',
82
+ 'Cargo.lock',
83
+ 'Gemfile.lock',
84
+ 'poetry.lock',
85
+ 'composer.lock',
86
+ ]);
87
+ // Max file size to read (500KB)
88
+ const MAX_FILE_SIZE = 500 * 1024;
89
+ /**
90
+ * Check if a string is a git URL
91
+ */
92
+ export function isGitUrl(input) {
93
+ return (input.startsWith('https://github.com/') ||
94
+ input.startsWith('https://gitlab.com/') ||
95
+ input.startsWith('https://bitbucket.org/') ||
96
+ input.startsWith('git@github.com:') ||
97
+ input.startsWith('git@gitlab.com:') ||
98
+ input.endsWith('.git'));
99
+ }
100
+ /**
101
+ * Check if a path is a local git repo
102
+ */
103
+ export function isLocalGitRepo(path) {
104
+ try {
105
+ return existsSync(join(path, '.git'));
106
+ }
107
+ catch {
108
+ return false;
109
+ }
110
+ }
111
+ /**
112
+ * Extract repo name from URL or path
113
+ */
114
+ function getRepoName(input) {
115
+ // GitHub URL: https://github.com/user/repo or https://github.com/user/repo.git
116
+ const match = input.match(/\/([^/]+?)(\.git)?$/);
117
+ if (match)
118
+ return match[1];
119
+ // Local path
120
+ return input.split('/').pop() || 'repo';
121
+ }
122
+ /**
123
+ * Clone a git repo to temp directory
124
+ */
125
+ export async function cloneRepo(url) {
126
+ const repoName = getRepoName(url);
127
+ const tempPath = join(tmpdir(), `maw-${repoName}-${Date.now()}`);
128
+ log.info(` Cloning ${repoName}...`);
129
+ try {
130
+ // Shallow clone for speed
131
+ execSync(`git clone --depth 1 "${url}" "${tempPath}"`, {
132
+ stdio: 'pipe',
133
+ timeout: 60000, // 1 minute timeout
134
+ });
135
+ return {
136
+ name: repoName,
137
+ url,
138
+ localPath: tempPath,
139
+ isTemp: true,
140
+ };
141
+ }
142
+ catch (error) {
143
+ throw new Error(`Failed to clone ${url}: ${error.message}`);
144
+ }
145
+ }
146
+ /**
147
+ * Get language from file extension
148
+ */
149
+ function getLanguage(ext) {
150
+ const langMap = {
151
+ '.js': 'javascript',
152
+ '.jsx': 'javascript',
153
+ '.ts': 'typescript',
154
+ '.tsx': 'typescript',
155
+ '.py': 'python',
156
+ '.rs': 'rust',
157
+ '.go': 'go',
158
+ '.java': 'java',
159
+ '.kt': 'kotlin',
160
+ '.c': 'c',
161
+ '.cpp': 'cpp',
162
+ '.cs': 'csharp',
163
+ '.rb': 'ruby',
164
+ '.php': 'php',
165
+ '.swift': 'swift',
166
+ '.sh': 'shell',
167
+ '.md': 'markdown',
168
+ '.json': 'json',
169
+ '.yaml': 'yaml',
170
+ '.yml': 'yaml',
171
+ '.sql': 'sql',
172
+ '.html': 'html',
173
+ '.css': 'css',
174
+ '.vue': 'vue',
175
+ '.svelte': 'svelte',
176
+ };
177
+ return langMap[ext] || ext.slice(1) || 'text';
178
+ }
179
+ /**
180
+ * Walk directory and collect files
181
+ */
182
+ function* walkDir(dir, basePath = dir) {
183
+ const entries = readdirSync(dir, { withFileTypes: true });
184
+ for (const entry of entries) {
185
+ const fullPath = join(dir, entry.name);
186
+ const relativePath = relative(basePath, fullPath);
187
+ if (entry.isDirectory()) {
188
+ // Skip ignored directories
189
+ if (SKIP_DIRS.has(entry.name) || entry.name.startsWith('.')) {
190
+ continue;
191
+ }
192
+ yield* walkDir(fullPath, basePath);
193
+ }
194
+ else if (entry.isFile()) {
195
+ // Skip ignored files
196
+ if (SKIP_FILES.has(entry.name))
197
+ continue;
198
+ const ext = extname(entry.name).toLowerCase();
199
+ // Only include known extensions
200
+ if (!CODE_EXTENSIONS.has(ext))
201
+ continue;
202
+ // Check file size
203
+ const stats = statSync(fullPath);
204
+ if (stats.size > MAX_FILE_SIZE)
205
+ continue;
206
+ if (stats.size === 0)
207
+ continue;
208
+ try {
209
+ const content = readFileSync(fullPath, 'utf-8');
210
+ // Skip binary files (files with null bytes)
211
+ if (content.includes('\0'))
212
+ continue;
213
+ yield {
214
+ path: relativePath,
215
+ content,
216
+ language: getLanguage(ext),
217
+ size: stats.size,
218
+ };
219
+ }
220
+ catch {
221
+ // Skip files that can't be read
222
+ continue;
223
+ }
224
+ }
225
+ }
226
+ }
227
+ /**
228
+ * Read all files from a git repo
229
+ */
230
+ export async function* readGitRepo(input) {
231
+ let repoInfo;
232
+ if (isGitUrl(input)) {
233
+ repoInfo = await cloneRepo(input);
234
+ }
235
+ else if (isLocalGitRepo(input)) {
236
+ repoInfo = {
237
+ name: getRepoName(input),
238
+ localPath: input,
239
+ isTemp: false,
240
+ };
241
+ }
242
+ else if (existsSync(input)) {
243
+ // Treat as local directory even if not a git repo
244
+ repoInfo = {
245
+ name: getRepoName(input),
246
+ localPath: input,
247
+ isTemp: false,
248
+ };
249
+ }
250
+ else {
251
+ throw new Error(`Not a valid git URL or local path: ${input}`);
252
+ }
253
+ try {
254
+ let fileCount = 0;
255
+ for (const file of walkDir(repoInfo.localPath)) {
256
+ fileCount++;
257
+ yield file;
258
+ }
259
+ log.info(` Found ${fileCount} files`);
260
+ }
261
+ finally {
262
+ // Clean up temp directory
263
+ if (repoInfo.isTemp) {
264
+ try {
265
+ rmSync(repoInfo.localPath, { recursive: true, force: true });
266
+ }
267
+ catch {
268
+ // Ignore cleanup errors
269
+ }
270
+ }
271
+ }
272
+ }
273
+ /**
274
+ * Get repo info without reading files
275
+ */
276
+ export async function getRepoInfo(input) {
277
+ let localPath;
278
+ let isTemp = false;
279
+ if (isGitUrl(input)) {
280
+ const info = await cloneRepo(input);
281
+ localPath = info.localPath;
282
+ isTemp = true;
283
+ }
284
+ else {
285
+ localPath = input;
286
+ }
287
+ try {
288
+ let count = 0;
289
+ for (const _ of walkDir(localPath)) {
290
+ count++;
291
+ }
292
+ return { name: getRepoName(input), fileCount: count };
293
+ }
294
+ finally {
295
+ if (isTemp) {
296
+ try {
297
+ rmSync(localPath, { recursive: true, force: true });
298
+ }
299
+ catch { }
300
+ }
301
+ }
302
+ }
303
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/git/index.ts"],"names":[],"mappings":"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"}