@oisheek_c/codeforge 1.0.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.
Files changed (141) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +7 -0
  3. package/apps/cli/bin/codeforge.cmd +2 -0
  4. package/apps/cli/src/bootstrap.js +115 -0
  5. package/apps/cli/src/cli.js +189 -0
  6. package/apps/cli/src/dev/git.js +17 -0
  7. package/apps/cli/src/dev/index.js +68 -0
  8. package/apps/cli/src/dev/provider.js +48 -0
  9. package/apps/cli/src/dev/scanner.js +14 -0
  10. package/apps/cli/src/index.js +31 -0
  11. package/bin/codeforge.js +2 -0
  12. package/package.json +63 -0
  13. package/packages/agent/contextBuilder.js +234 -0
  14. package/packages/agent/executor.js +1729 -0
  15. package/packages/agent/fallback.js +129 -0
  16. package/packages/agent/index.js +26 -0
  17. package/packages/agent/intent.js +73 -0
  18. package/packages/agent/modelSelector.js +469 -0
  19. package/packages/agent/planner.js +379 -0
  20. package/packages/agent/rag.js +412 -0
  21. package/packages/agent/ragSelector.js +570 -0
  22. package/packages/agent/router.js +121 -0
  23. package/packages/agent/thinking.js +54 -0
  24. package/packages/agent/toolCalls.js +258 -0
  25. package/packages/config/config.js +391 -0
  26. package/packages/config/defaults.js +72 -0
  27. package/packages/config/index.js +2 -0
  28. package/packages/core/approvalPolicy.js +140 -0
  29. package/packages/core/context.js +0 -0
  30. package/packages/core/message.js +0 -0
  31. package/packages/core/plan.js +0 -0
  32. package/packages/core/reasoning.js +0 -0
  33. package/packages/core/result.js +0 -0
  34. package/packages/core/retrieval.js +0 -0
  35. package/packages/core/tool.js +536 -0
  36. package/packages/git/branch.js +7 -0
  37. package/packages/git/commit.js +16 -0
  38. package/packages/git/diff.js +15 -0
  39. package/packages/git/git.js +35 -0
  40. package/packages/git/index.js +6 -0
  41. package/packages/git/remote.js +9 -0
  42. package/packages/git/status.js +11 -0
  43. package/packages/memory/index.js +0 -0
  44. package/packages/memory/project.js +0 -0
  45. package/packages/memory/session.js +0 -0
  46. package/packages/prompts/builder.js +43 -0
  47. package/packages/prompts/coder.js +38 -0
  48. package/packages/prompts/index.js +5 -0
  49. package/packages/prompts/planner.js +49 -0
  50. package/packages/prompts/reviewer.js +38 -0
  51. package/packages/prompts/system.js +94 -0
  52. package/packages/providers/index.js +31 -0
  53. package/packages/providers/openrouter.js +380 -0
  54. package/packages/reasoning/budget.js +0 -0
  55. package/packages/reasoning/chain.js +0 -0
  56. package/packages/reasoning/coder.js +0 -0
  57. package/packages/reasoning/evaluator.js +0 -0
  58. package/packages/reasoning/index.js +8 -0
  59. package/packages/reasoning/planner.js +0 -0
  60. package/packages/reasoning/reflector.js +0 -0
  61. package/packages/reasoning/reviewer.js +0 -0
  62. package/packages/reasoning/router.js +0 -0
  63. package/packages/retrieval/budget.js +92 -0
  64. package/packages/retrieval/cache.js +84 -0
  65. package/packages/retrieval/embeddings.js +147 -0
  66. package/packages/retrieval/graph.js +151 -0
  67. package/packages/retrieval/imports.js +74 -0
  68. package/packages/retrieval/index.js +9 -0
  69. package/packages/retrieval/parser/extractors/calls.js +43 -0
  70. package/packages/retrieval/parser/extractors/comments.js +49 -0
  71. package/packages/retrieval/parser/extractors/diagnostics.js +21 -0
  72. package/packages/retrieval/parser/extractors/exports.js +71 -0
  73. package/packages/retrieval/parser/extractors/imports.js +40 -0
  74. package/packages/retrieval/parser/extractors/index.js +12 -0
  75. package/packages/retrieval/parser/extractors/metrics.js +78 -0
  76. package/packages/retrieval/parser/extractors/symbols.js +51 -0
  77. package/packages/retrieval/parser/extractors/todos.js +53 -0
  78. package/packages/retrieval/parser/helpers.js +138 -0
  79. package/packages/retrieval/parser/index.js +10 -0
  80. package/packages/retrieval/parser/languages/c.js +14 -0
  81. package/packages/retrieval/parser/languages/cpp.js +21 -0
  82. package/packages/retrieval/parser/languages/csharp.js +14 -0
  83. package/packages/retrieval/parser/languages/go.js +14 -0
  84. package/packages/retrieval/parser/languages/index.js +12 -0
  85. package/packages/retrieval/parser/languages/java.js +14 -0
  86. package/packages/retrieval/parser/languages/javascript.js +14 -0
  87. package/packages/retrieval/parser/languages/php.js +14 -0
  88. package/packages/retrieval/parser/languages/python.js +14 -0
  89. package/packages/retrieval/parser/languages/ruby.js +14 -0
  90. package/packages/retrieval/parser/languages/rust.js +14 -0
  91. package/packages/retrieval/parser/languages/swift.js +14 -0
  92. package/packages/retrieval/parser/languages/typescript.js +14 -0
  93. package/packages/retrieval/parser/languages.js +218 -0
  94. package/packages/retrieval/parser/parseFile.js +79 -0
  95. package/packages/retrieval/parser/parseRepository.js +78 -0
  96. package/packages/retrieval/parser/queries/c.js +148 -0
  97. package/packages/retrieval/parser/queries/cpp.js +198 -0
  98. package/packages/retrieval/parser/queries/csharp.js +151 -0
  99. package/packages/retrieval/parser/queries/go.js +124 -0
  100. package/packages/retrieval/parser/queries/index.js +35 -0
  101. package/packages/retrieval/parser/queries/java.js +128 -0
  102. package/packages/retrieval/parser/queries/javascript.js +181 -0
  103. package/packages/retrieval/parser/queries/php.js +140 -0
  104. package/packages/retrieval/parser/queries/python.js +110 -0
  105. package/packages/retrieval/parser/queries/ruby.js +105 -0
  106. package/packages/retrieval/parser/queries/rust.js +175 -0
  107. package/packages/retrieval/parser/queries/swift.js +134 -0
  108. package/packages/retrieval/parser/queries/typescript.js +202 -0
  109. package/packages/retrieval/parser/registry.js +107 -0
  110. package/packages/retrieval/parser/traverse.js +82 -0
  111. package/packages/retrieval/parser/types.js +239 -0
  112. package/packages/retrieval/parser.js +78 -0
  113. package/packages/retrieval/ranker.js +73 -0
  114. package/packages/retrieval/retriever.js +910 -0
  115. package/packages/retrieval/symbols.js +145 -0
  116. package/packages/scanner/detect.js +69 -0
  117. package/packages/scanner/ignore.js +12 -0
  118. package/packages/scanner/index.js +2 -0
  119. package/packages/scanner/root.js +21 -0
  120. package/packages/scanner/scanner.js +35 -0
  121. package/packages/scanner/tree.js +45 -0
  122. package/packages/terminal/activity.js +514 -0
  123. package/packages/terminal/banner.js +34 -0
  124. package/packages/terminal/colors.js +16 -0
  125. package/packages/terminal/dashboard.js +94 -0
  126. package/packages/terminal/index.js +19 -0
  127. package/packages/terminal/logger.js +43 -0
  128. package/packages/terminal/prompt.js +11 -0
  129. package/packages/terminal/renderer.js +1209 -0
  130. package/packages/terminal/spinner.js +9 -0
  131. package/packages/tools/editFile.js +261 -0
  132. package/packages/tools/filesystem.js +82 -0
  133. package/packages/tools/index.js +24 -0
  134. package/packages/tools/readFile.js +101 -0
  135. package/packages/tools/registry.js +227 -0
  136. package/packages/tools/searchFiles.js +322 -0
  137. package/packages/tools/shell.js +352 -0
  138. package/packages/tools/writeFile.js +212 -0
  139. package/packages/utils/constants.js +0 -0
  140. package/packages/utils/helpers.js +0 -0
  141. package/packages/utils/logger.js +0 -0
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Tree-sitter queries for JavaScript.
3
+ *
4
+ * Stable capture namespaces:
5
+ *
6
+ * @symbol.class
7
+ * @symbol.function
8
+ * @symbol.method
9
+ * @symbol.field
10
+ * @symbol.variable
11
+ *
12
+ * @import
13
+ * @export
14
+ * @call
15
+ * @comment
16
+ * @todo
17
+ */
18
+
19
+ export const SYMBOLS = `
20
+ ;; ============================================================
21
+ ;; Classes
22
+ ;; ============================================================
23
+
24
+ (class_declaration
25
+ name: (identifier) @symbol.class)
26
+
27
+ ;; ============================================================
28
+ ;; Functions
29
+ ;; ============================================================
30
+
31
+ (function_declaration
32
+ name: (identifier) @symbol.function)
33
+
34
+ (generator_function_declaration
35
+ name: (identifier) @symbol.function)
36
+
37
+ ;; Arrow functions
38
+
39
+ (variable_declarator
40
+ name: (identifier) @symbol.function
41
+ value: (arrow_function))
42
+
43
+ ;; Function expressions
44
+
45
+ (variable_declarator
46
+ name: (identifier) @symbol.function
47
+ value: (function))
48
+
49
+ ;; ============================================================
50
+ ;; Methods
51
+ ;; ============================================================
52
+
53
+ (method_definition
54
+ name: (property_identifier) @symbol.method)
55
+
56
+ ;; ============================================================
57
+ ;; Class fields (modern JavaScript)
58
+ ;; ============================================================
59
+
60
+ (public_field_definition
61
+ name: (property_identifier) @symbol.field)
62
+
63
+ ;; ============================================================
64
+ ;; Variables
65
+ ;; ============================================================
66
+
67
+ (variable_declarator
68
+ name: (identifier) @symbol.variable)
69
+ `;
70
+
71
+ export const IMPORTS = `
72
+ ;; ============================================================
73
+ ;; ES Modules
74
+ ;; ============================================================
75
+
76
+ (import_statement) @import
77
+
78
+ ;; ============================================================
79
+ ;; require(...)
80
+ ;; ============================================================
81
+
82
+ (call_expression
83
+ function: (identifier) @_require
84
+ (#eq? @_require "require"))
85
+ @import
86
+
87
+ ;; ============================================================
88
+ ;; Dynamic import(...)
89
+ ;; ============================================================
90
+
91
+ (import_expression) @import
92
+ `;
93
+
94
+ export const EXPORTS = `
95
+ ;; ============================================================
96
+ ;; Named declaration exports
97
+ ;; ============================================================
98
+
99
+ (export_statement
100
+ declaration:
101
+ (function_declaration
102
+ name: (identifier) @export.named))
103
+
104
+ (export_statement
105
+ declaration:
106
+ (generator_function_declaration
107
+ name: (identifier) @export.named))
108
+
109
+ (export_statement
110
+ declaration:
111
+ (class_declaration
112
+ name: (type_identifier) @export.named))
113
+
114
+ (export_statement
115
+ declaration:
116
+ (lexical_declaration
117
+ (variable_declarator
118
+ name: (identifier) @export.named)))
119
+
120
+ ;; ============================================================
121
+ ;; Named export specifiers
122
+ ;; ============================================================
123
+
124
+ (export_specifier
125
+ alias: (identifier) @export.named)
126
+
127
+ (export_specifier
128
+ name: (identifier) @export.named)
129
+
130
+ ;; ============================================================
131
+ ;; Default named declarations
132
+ ;; ============================================================
133
+
134
+ (export_statement
135
+ declaration:
136
+ (function_declaration
137
+ name: (identifier) @export.default))
138
+
139
+ (export_statement
140
+ declaration:
141
+ (class_declaration
142
+ name: (type_identifier) @export.default))
143
+
144
+ ;; ============================================================
145
+ ;; CommonJS: module.exports = ...
146
+ ;; ============================================================
147
+
148
+ (assignment_expression
149
+ left:
150
+ (member_expression
151
+ object: (identifier) @_module
152
+ property: (property_identifier) @export.commonjs)
153
+ (#eq? @_module "module")
154
+ (#eq? @export.commonjs "exports"))
155
+
156
+ ;; ============================================================
157
+ ;; CommonJS: exports.foo = ...
158
+ ;; ============================================================
159
+
160
+ (assignment_expression
161
+ left:
162
+ (member_expression
163
+ object: (identifier) @_exports
164
+ property: (property_identifier) @export.commonjs)
165
+ (#eq? @_exports "exports"))
166
+ `;
167
+
168
+ export const CALLS = `
169
+ ;; foo()
170
+
171
+ (call_expression
172
+ function: (identifier) @call)
173
+
174
+ ;; obj.foo()
175
+
176
+ (call_expression
177
+ function:
178
+ (member_expression
179
+ property: (property_identifier) @call))
180
+
181
+ ;; obj["foo"]()
182
+
183
+ (call_expression
184
+ function:
185
+ (subscript_expression) @call)
186
+
187
+ ;; obj?.foo()
188
+
189
+ (optional_call_expression
190
+ function:
191
+ (member_expression
192
+ property: (property_identifier) @call))
193
+ `;
194
+
195
+ export const COMMENTS = `
196
+ (comment) @comment
197
+ `;
198
+
199
+ export const TODOS = `
200
+ (comment) @todo
201
+ (#match? @todo "(?i)(TODO|FIXME|BUG|HACK|XXX|NOTE)")
202
+ `;
@@ -0,0 +1,107 @@
1
+ /**
2
+ * packages/retrieval/parser/registry.js
3
+ */
4
+
5
+ import Parser from "tree-sitter";
6
+
7
+ import * as languages from "./languages.js";
8
+ import { getQuerySet } from "./queries/index.js";
9
+
10
+ const parserCache = new Map();
11
+ const queryCache = new Map();
12
+
13
+ export function supportedLanguages() {
14
+ return [
15
+ "javascript",
16
+ "typescript",
17
+ "python",
18
+ "java",
19
+ "go",
20
+ "rust",
21
+ "c",
22
+ "cpp",
23
+ "csharp",
24
+ "php",
25
+ "ruby",
26
+ "swift",
27
+ ];
28
+ }
29
+
30
+ /* -------------------------------------------------------------------------- */
31
+ /* Parser */
32
+ /* -------------------------------------------------------------------------- */
33
+
34
+ export function getParser(language) {
35
+ if (parserCache.has(language)) {
36
+ return parserCache.get(language);
37
+ }
38
+
39
+ const grammar = languages.getGrammar(language);
40
+
41
+ if (!grammar) {
42
+ throw new Error(`Unsupported language: ${language}`);
43
+ }
44
+
45
+ const parser = new Parser();
46
+
47
+ parser.setLanguage(grammar);
48
+
49
+ parserCache.set(language, parser);
50
+
51
+ return parser;
52
+ }
53
+
54
+ /* -------------------------------------------------------------------------- */
55
+ /* Queries */
56
+ /* -------------------------------------------------------------------------- */
57
+
58
+ export function getQueries(language) {
59
+ if (queryCache.has(language)) {
60
+ return queryCache.get(language);
61
+ }
62
+
63
+ const grammar = languages.getGrammar(language);
64
+ const querySet = getQuerySet(language);
65
+
66
+ if (!grammar) {
67
+ throw new Error(`Unsupported language: ${language}`);
68
+ }
69
+
70
+ if (!querySet) {
71
+ throw new Error(`No query set registered for language: ${language}`);
72
+ }
73
+
74
+ const compiled = {};
75
+
76
+ for (const [name, source] of Object.entries(querySet)) {
77
+ if (!source?.trim()) {
78
+ compiled[name] = null;
79
+ continue;
80
+ }
81
+
82
+ try {
83
+ compiled[name] = new Parser.Query(grammar, source);
84
+ } catch (err) {
85
+ console.error("\n========================================");
86
+ console.error(`Failed language : ${language}`);
87
+ console.error(`Failed query : ${name}`);
88
+ console.error("========================================");
89
+ console.error(source);
90
+ console.error("========================================\n");
91
+ throw err;
92
+ }
93
+ }
94
+
95
+ queryCache.set(language, compiled);
96
+
97
+ return compiled;
98
+ }
99
+
100
+ /* -------------------------------------------------------------------------- */
101
+ /* Cache */
102
+ /* -------------------------------------------------------------------------- */
103
+
104
+ export function clearRegistryCache() {
105
+ parserCache.clear();
106
+ queryCache.clear();
107
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * packages/retrieval/parser/traverse.js
3
+ */
4
+
5
+ import extractSymbols from "./extractors/symbols.js";
6
+ import extractImports from "./extractors/imports.js";
7
+ import extractExports from "./extractors/exports.js";
8
+ import extractCalls from "./extractors/calls.js";
9
+ import extractComments from "./extractors/comments.js";
10
+ import extractTodos from "./extractors/todos.js";
11
+ import extractDiagnostics from "./extractors/diagnostics.js";
12
+ import extractMetrics from "./extractors/metrics.js";
13
+
14
+ export function traverse({
15
+ tree,
16
+ source,
17
+ file,
18
+ language,
19
+ queries,
20
+ }) {
21
+ const symbols = extractSymbols({
22
+ query: queries.SYMBOLS,
23
+ tree,
24
+ source,
25
+ file,
26
+ language,
27
+ });
28
+
29
+ const imports = extractImports({
30
+ query: queries.IMPORTS,
31
+ tree,
32
+ source,
33
+ });
34
+
35
+ const exportsList = extractExports({
36
+ query: queries.EXPORTS,
37
+ tree,
38
+ source,
39
+ });
40
+
41
+ const calls = extractCalls({
42
+ query: queries.CALLS,
43
+ tree,
44
+ source,
45
+ });
46
+
47
+ const comments = extractComments({
48
+ query: queries.COMMENTS,
49
+ tree,
50
+ source,
51
+ });
52
+
53
+ const todos = extractTodos({
54
+ query: queries.TODOS,
55
+ tree,
56
+ source,
57
+ });
58
+
59
+ const metrics = extractMetrics({
60
+ source,
61
+ symbols,
62
+ imports,
63
+ exports: exportsList,
64
+ todos,
65
+ });
66
+
67
+ const diagnostics = extractDiagnostics({
68
+ tree,
69
+ source,
70
+ });
71
+
72
+ return {
73
+ symbols,
74
+ imports,
75
+ exports: exportsList,
76
+ calls,
77
+ comments,
78
+ todos,
79
+ metrics,
80
+ diagnostics,
81
+ };
82
+ }
@@ -0,0 +1,239 @@
1
+ /**
2
+ * packages/retrieval/parser/types.js
3
+ *
4
+ * Normalized parser data contracts.
5
+ * Every extractor should create objects using these factories.
6
+ */
7
+
8
+ import crypto from "node:crypto";
9
+
10
+ /* -------------------------------------------------------------------------- */
11
+ /* Location */
12
+ /* -------------------------------------------------------------------------- */
13
+
14
+ export function createLocation(data = {}) {
15
+ return {
16
+ startLine: data.startLine ?? 0,
17
+ startColumn: data.startColumn ?? 0,
18
+
19
+ endLine: data.endLine ?? 0,
20
+ endColumn: data.endColumn ?? 0,
21
+ };
22
+ }
23
+
24
+ /* -------------------------------------------------------------------------- */
25
+ /* Parsed File */
26
+ /* -------------------------------------------------------------------------- */
27
+
28
+ export function createParsedFile(data = {}) {
29
+ return {
30
+ path: data.path ?? "",
31
+ name: data.name ?? "",
32
+ extension: data.extension ?? "",
33
+ language: data.language ?? "",
34
+
35
+ hash: data.hash ?? "",
36
+ size: data.size ?? 0,
37
+
38
+ supported: data.supported ?? true,
39
+
40
+ parser: data.parser ?? "tree-sitter",
41
+ parserVersion: data.parserVersion ?? 1,
42
+ grammarVersion: data.grammarVersion ?? 1,
43
+
44
+ source: data.source ?? "",
45
+ ast: data.ast ?? null,
46
+
47
+ imports: data.imports ?? [],
48
+ exports: data.exports ?? [],
49
+ symbols: data.symbols ?? [],
50
+ calls: data.calls ?? [],
51
+ comments: data.comments ?? [],
52
+ todos: data.todos ?? [],
53
+
54
+ diagnostics: data.diagnostics ?? [],
55
+ metrics: data.metrics ?? createMetrics(),
56
+ };
57
+ }
58
+
59
+ /* -------------------------------------------------------------------------- */
60
+ /* Symbol */
61
+ /* -------------------------------------------------------------------------- */
62
+
63
+ export function createSymbol(data = {}) {
64
+ return {
65
+ id: data.id ?? crypto.randomUUID(),
66
+
67
+ name: data.name ?? "anonymous",
68
+ qualifiedName: data.qualifiedName ?? null,
69
+
70
+ kind: data.kind ?? "unknown",
71
+
72
+ language: data.language ?? "",
73
+ file: data.file ?? "",
74
+
75
+ parent: data.parent ?? null,
76
+
77
+ exported: data.exported ?? false,
78
+
79
+ signature: data.signature ?? null,
80
+
81
+ modifiers: data.modifiers ?? [],
82
+
83
+ metadata: data.metadata ?? {},
84
+
85
+ location: data.location ?? createLocation(),
86
+ };
87
+ }
88
+
89
+ /* -------------------------------------------------------------------------- */
90
+ /* Import */
91
+ /* -------------------------------------------------------------------------- */
92
+
93
+ export function createImport(data = {}) {
94
+ return {
95
+ source: data.source ?? "",
96
+
97
+ default: data.default ?? null,
98
+ namespace: data.namespace ?? null,
99
+ specifiers: data.specifiers ?? [],
100
+
101
+ alias: data.alias ?? null,
102
+
103
+ typeOnly: data.typeOnly ?? false,
104
+ dynamic: data.dynamic ?? false,
105
+
106
+ metadata: data.metadata ?? {},
107
+
108
+ location: data.location ?? createLocation(),
109
+ };
110
+ }
111
+
112
+ /* -------------------------------------------------------------------------- */
113
+ /* Export */
114
+ /* -------------------------------------------------------------------------- */
115
+
116
+ export function createExport(data = {}) {
117
+ return {
118
+ name: data.name ?? "",
119
+
120
+ kind: data.kind ?? "named",
121
+
122
+ source: data.source ?? null,
123
+
124
+ default: data.default ?? false,
125
+
126
+ exported: data.exported ?? null,
127
+
128
+ metadata: data.metadata ?? {},
129
+
130
+ location: data.location ?? createLocation(),
131
+ };
132
+ }
133
+
134
+ /* -------------------------------------------------------------------------- */
135
+ /* Call */
136
+ /* -------------------------------------------------------------------------- */
137
+
138
+ export function createCall(data = {}) {
139
+ return {
140
+ name: data.name ?? "",
141
+
142
+ kind: data.kind ?? "function",
143
+
144
+ receiver: data.receiver ?? null,
145
+
146
+ arguments: data.arguments ?? 0,
147
+
148
+ async: data.async ?? false,
149
+
150
+ metadata: data.metadata ?? {},
151
+
152
+ location: data.location ?? createLocation(),
153
+ };
154
+ }
155
+ /* -------------------------------------------------------------------------- */
156
+ /* Comment */
157
+ /* -------------------------------------------------------------------------- */
158
+
159
+ export function createComment(data = {}) {
160
+ return {
161
+ text: data.text ?? "",
162
+
163
+ block: data.block ?? false,
164
+
165
+ documentation: data.documentation ?? false,
166
+
167
+ line: data.line ?? 0,
168
+
169
+ metadata: data.metadata ?? {},
170
+
171
+ location: data.location ?? createLocation(),
172
+ };
173
+ }
174
+
175
+ /* -------------------------------------------------------------------------- */
176
+ /* TODO */
177
+ /* -------------------------------------------------------------------------- */
178
+
179
+ export function createTodo(data = {}) {
180
+ return {
181
+ type: data.type ?? "TODO",
182
+
183
+ text: data.text ?? "",
184
+
185
+ line: data.line ?? 0,
186
+
187
+ metadata: data.metadata ?? {},
188
+
189
+ location: data.location ?? createLocation(),
190
+ };
191
+ }
192
+
193
+ /* -------------------------------------------------------------------------- */
194
+ /* Diagnostic */
195
+ /* -------------------------------------------------------------------------- */
196
+
197
+ export function createDiagnostic(data = {}) {
198
+ return {
199
+ severity: data.severity ?? "error",
200
+
201
+ type: data.type ?? "syntax",
202
+
203
+ message: data.message ?? "",
204
+
205
+ location: data.location ?? createLocation(),
206
+ };
207
+ }
208
+
209
+ /* -------------------------------------------------------------------------- */
210
+ /* Metrics */
211
+ /* -------------------------------------------------------------------------- */
212
+
213
+ export function createMetrics(data = {}) {
214
+ return {
215
+ files: data.files ?? 1,
216
+
217
+ lines: data.lines ?? 0,
218
+ code: data.code ?? 0,
219
+ comments: data.comments ?? 0,
220
+ blanks: data.blanks ?? 0,
221
+
222
+ statements: data.statements ?? 0,
223
+
224
+ functions: data.functions ?? 0,
225
+ classes: data.classes ?? 0,
226
+ methods: data.methods ?? 0,
227
+
228
+ imports: data.imports ?? 0,
229
+ exports: data.exports ?? 0,
230
+
231
+ todos: data.todos ?? 0,
232
+
233
+ branches: data.branches ?? 0,
234
+
235
+ depth: data.depth ?? 0,
236
+
237
+ complexity: data.complexity ?? 0,
238
+ };
239
+ }
@@ -0,0 +1,78 @@
1
+ /**
2
+ * packages/retrieval/parser.js
3
+ *
4
+ * Builds the complete retrieval pipeline for a repository.
5
+ */
6
+
7
+ import fs from "node:fs/promises";
8
+ import path from "node:path";
9
+
10
+ import { DEFAULT_IGNORE } from "../scanner/ignore.js";
11
+
12
+ import { parseRepository } from "./parser/index.js";
13
+
14
+ import { buildSymbolIndex } from "./symbols.js";
15
+ import { buildImportIndex } from "./imports.js";
16
+ import { buildRepositoryGraph } from "./graph.js";
17
+ import { createRetriever } from "./retriever.js";
18
+
19
+ async function collectFiles(root) {
20
+ const files = [];
21
+
22
+ async function walk(dir) {
23
+ const entries = await fs.readdir(dir, {
24
+ withFileTypes: true,
25
+ });
26
+
27
+ for (const entry of entries) {
28
+ if (DEFAULT_IGNORE.includes(entry.name)) {
29
+ continue;
30
+ }
31
+
32
+ const fullPath = path.join(dir, entry.name);
33
+
34
+ if (entry.isDirectory()) {
35
+ await walk(fullPath);
36
+ } else {
37
+ files.push(fullPath);
38
+ }
39
+ }
40
+ }
41
+
42
+ await walk(root);
43
+
44
+ return files;
45
+ }
46
+
47
+ /**
48
+ * Build complete retrieval pipeline.
49
+ */
50
+ export async function buildRepository(repositoryRoot, cache = null) {
51
+ const fileIndex = await collectFiles(repositoryRoot);
52
+
53
+ const repository = await parseRepository(fileIndex, cache);
54
+
55
+ const symbols = buildSymbolIndex(repository);
56
+ const imports = buildImportIndex(repository);
57
+
58
+ const graph = buildRepositoryGraph(
59
+ repository,
60
+ symbols,
61
+ imports
62
+ );
63
+
64
+ const retriever = createRetriever({
65
+ repository,
66
+ symbols,
67
+ imports,
68
+ graph,
69
+ });
70
+
71
+ return {
72
+ repository,
73
+ symbols,
74
+ imports,
75
+ graph,
76
+ retriever,
77
+ };
78
+ }