@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,379 @@
1
+ import { Intent } from "./intent.js";
2
+
3
+ const DEFAULT_PLAN = Object.freeze({
4
+ requiresRAG: false,
5
+ requiresThinking: false,
6
+ requiresTools: false,
7
+ requiresWrite: false,
8
+ requiresGit: false,
9
+ directFileTarget: false,
10
+ fileTargets: [],
11
+ steps: [],
12
+ });
13
+
14
+ const FILE_PATH_PATTERN =
15
+ /(?:^|[\s"'`(])((?:\.{0,2}[\\/])?(?:[\w@.-]+[\\/])*[\w@.-]+\.[a-z0-9]+)(?=$|[\s"'`),:;])/gi;
16
+
17
+ const CROSS_FILE_PATTERNS = [
18
+ /\b(repository|repo|codebase|project[- ]wide|repository[- ]wide)\b/i,
19
+
20
+ /\b(across|throughout)\s+(?:the\s+)?(?:project|repository|repo|codebase)\b/i,
21
+
22
+ /\b(dependencies|dependents|dependency|imports|importers|references|usages|callers|callees)\b/i,
23
+
24
+ /\b(interaction|interactions|integration|relationship|relationships|compatible|compatibility)\b/i,
25
+
26
+ /\b(find|search|locate|discover)\b/i,
27
+ ];
28
+
29
+ const PROJECT_REFERENCE_PATTERNS = [
30
+ /*
31
+ * Explicit repository scope.
32
+ */
33
+ /\b(repository|repo|codebase|project[- ]wide|repository[- ]wide)\b/i,
34
+
35
+ /*
36
+ * Direct references to the current project.
37
+ *
38
+ * Examples:
39
+ * "our system"
40
+ * "this project"
41
+ * "current codebase"
42
+ */
43
+ /\b(?:our|this|current)\s+(?:system|project|codebase|repository|repo|implementation|architecture)\b/i,
44
+
45
+ /*
46
+ * References to CodeForge subsystems/components.
47
+ *
48
+ * Examples:
49
+ * "our routing system"
50
+ * "our fallback"
51
+ * "this executor"
52
+ */
53
+ /\b(?:our|this|current)\s+(?:routing(?:\s+system)?|router|fallback|provider|executor|retrieval|rag|planner|agent|terminal|cli|tooling|tools?)\b/i,
54
+
55
+ /*
56
+ * Repository implementation terminology.
57
+ */
58
+ /\b(?:implementation|implemented|source code)\b/i,
59
+
60
+ /*
61
+ * Source-code relationships.
62
+ */
63
+ /\b(?:imports|importers|exports|dependencies|dependents|references|usages|callers|callees)\b/i,
64
+ ];
65
+
66
+ function referencesProjectImplementation(
67
+ prompt = ""
68
+ ) {
69
+ if (typeof prompt !== "string") {
70
+ return false;
71
+ }
72
+
73
+ return PROJECT_REFERENCE_PATTERNS.some(
74
+ (pattern) =>
75
+ pattern.test(prompt)
76
+ );
77
+ }
78
+
79
+
80
+
81
+ function getExplicitFileTargets(
82
+ prompt = ""
83
+ ) {
84
+ if (typeof prompt !== "string") {
85
+ return [];
86
+ }
87
+
88
+ const targets = [];
89
+
90
+ for (
91
+ const match
92
+ of prompt.matchAll(
93
+ FILE_PATH_PATTERN
94
+ )
95
+ ) {
96
+ const target =
97
+ match[1];
98
+
99
+ if (
100
+ target &&
101
+ !targets.includes(target)
102
+ ) {
103
+ targets.push(target);
104
+ }
105
+ }
106
+
107
+ return targets;
108
+ }
109
+
110
+ function requiresCrossFileContext(
111
+ prompt = ""
112
+ ) {
113
+ if (typeof prompt !== "string") {
114
+ return false;
115
+ }
116
+
117
+ return CROSS_FILE_PATTERNS.some(
118
+ (pattern) =>
119
+ pattern.test(prompt)
120
+ );
121
+ }
122
+
123
+ function applyRetrievalPolicy(
124
+ plan,
125
+ prompt
126
+ ) {
127
+ const fileTargets =
128
+ getExplicitFileTargets(
129
+ prompt
130
+ );
131
+
132
+ const crossFileContext =
133
+ requiresCrossFileContext(
134
+ prompt
135
+ );
136
+
137
+ const projectReference =
138
+ referencesProjectImplementation(
139
+ prompt
140
+ );
141
+
142
+ const directFileTarget =
143
+ fileTargets.length === 1 &&
144
+ !crossFileContext;
145
+
146
+ /*
147
+ * A direct file request is better served by
148
+ * repository tools than broad RAG retrieval.
149
+ */
150
+ if (directFileTarget) {
151
+ return {
152
+ ...plan,
153
+
154
+ requiresRAG: false,
155
+ requiresTools: true,
156
+
157
+ directFileTarget: true,
158
+ fileTargets,
159
+
160
+ steps:
161
+ plan.steps
162
+ .filter(
163
+ (step) =>
164
+ step !== "retrieve"
165
+ )
166
+ .includes("tool")
167
+ ? plan.steps.filter(
168
+ (step) =>
169
+ step !== "retrieve"
170
+ )
171
+ : [
172
+ "tool",
173
+ ...plan.steps.filter(
174
+ (step) =>
175
+ step !== "retrieve"
176
+ ),
177
+ ],
178
+ };
179
+ }
180
+
181
+ /*
182
+ * EXPLAIN is repository-independent by
183
+ * default.
184
+ *
185
+ * Only enable RAG when the actual prompt
186
+ * refers to the current repository/codebase.
187
+ */
188
+ if (
189
+ plan.intent ===
190
+ Intent.EXPLAIN &&
191
+ projectReference
192
+ ) {
193
+ return {
194
+ ...plan,
195
+
196
+ requiresRAG: true,
197
+
198
+ directFileTarget: false,
199
+ fileTargets,
200
+
201
+ steps: [
202
+ "retrieve",
203
+ ...plan.steps.filter(
204
+ (step) =>
205
+ step !== "retrieve"
206
+ ),
207
+ ],
208
+ };
209
+ }
210
+
211
+ return {
212
+ ...plan,
213
+ directFileTarget: false,
214
+ fileTargets,
215
+ };
216
+ }
217
+
218
+ function createPlan(intent) {
219
+ switch (intent) {
220
+ case Intent.CHAT:
221
+ return {
222
+ ...DEFAULT_PLAN,
223
+ intent,
224
+ steps: [
225
+ "context",
226
+ "route",
227
+ "generate",
228
+ ],
229
+ };
230
+
231
+ case Intent.EXPLAIN:
232
+ return {
233
+ ...DEFAULT_PLAN,
234
+ intent,
235
+ steps: [
236
+ "context",
237
+ "route",
238
+ "generate",
239
+ ],
240
+ };
241
+
242
+ case Intent.PLAN:
243
+ return {
244
+ ...DEFAULT_PLAN,
245
+ intent,
246
+ requiresThinking: true,
247
+ steps: [
248
+ "context",
249
+ "think",
250
+ "route",
251
+ "generate",
252
+ ],
253
+ };
254
+
255
+ case Intent.SEARCH:
256
+ return {
257
+ ...DEFAULT_PLAN,
258
+ intent,
259
+ requiresRAG: true,
260
+ requiresTools: true,
261
+ steps: [
262
+ "retrieve",
263
+ "tool",
264
+ "context",
265
+ "route",
266
+ "generate",
267
+ ],
268
+ };
269
+
270
+ case Intent.DEBUG:
271
+ return {
272
+ ...DEFAULT_PLAN,
273
+ intent,
274
+ requiresRAG: true,
275
+ requiresThinking: true,
276
+ requiresTools: true,
277
+ requiresWrite: true,
278
+ steps: [
279
+ "retrieve",
280
+ "context",
281
+ "think",
282
+ "route",
283
+ "generate",
284
+ "write",
285
+ "verify",
286
+ ],
287
+ };
288
+
289
+ case Intent.REVIEW:
290
+ return {
291
+ ...DEFAULT_PLAN,
292
+ intent,
293
+ requiresRAG: true,
294
+ requiresThinking: true,
295
+ steps: [
296
+ "retrieve",
297
+ "context",
298
+ "think",
299
+ "route",
300
+ "generate",
301
+ ],
302
+ };
303
+
304
+ case Intent.REFACTOR:
305
+ return {
306
+ ...DEFAULT_PLAN,
307
+ intent,
308
+ requiresRAG: true,
309
+ requiresThinking: true,
310
+ requiresWrite: true,
311
+ steps: [
312
+ "retrieve",
313
+ "context",
314
+ "think",
315
+ "route",
316
+ "generate",
317
+ "write",
318
+ ],
319
+ };
320
+
321
+ case Intent.TEST:
322
+ return {
323
+ ...DEFAULT_PLAN,
324
+ intent,
325
+ requiresRAG: true,
326
+ requiresWrite: true,
327
+ steps: [
328
+ "retrieve",
329
+ "context",
330
+ "route",
331
+ "generate",
332
+ "write",
333
+ ],
334
+ };
335
+
336
+ case Intent.CODE:
337
+ return {
338
+ ...DEFAULT_PLAN,
339
+ intent,
340
+ requiresRAG: true,
341
+ requiresThinking: true,
342
+ requiresWrite: true,
343
+ steps: [
344
+ "retrieve",
345
+ "context",
346
+ "think",
347
+ "route",
348
+ "generate",
349
+ "write",
350
+ ],
351
+ };
352
+
353
+ default:
354
+ return {
355
+ ...DEFAULT_PLAN,
356
+ intent: Intent.CHAT,
357
+ steps: [
358
+ "context",
359
+ "route",
360
+ "generate",
361
+ ],
362
+ };
363
+ }
364
+ }
365
+
366
+ export function createExecutionPlan(
367
+ intent,
368
+ {
369
+ prompt = "",
370
+ } = {}
371
+ ) {
372
+ const plan =
373
+ createPlan(intent);
374
+
375
+ return applyRetrievalPolicy(
376
+ plan,
377
+ prompt
378
+ );
379
+ }