@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,212 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+
4
+ import {
5
+ createToolError,
6
+ resolveProjectPath,
7
+ } from "./filesystem.js";
8
+
9
+ import {
10
+ defineTool,
11
+ } from "../core/tool.js";
12
+
13
+ async function assertParentDirectory(
14
+ resolvedPath
15
+ ) {
16
+ const parent =
17
+ path.dirname(resolvedPath);
18
+
19
+ try {
20
+ const stats =
21
+ await fs.stat(parent);
22
+
23
+ if (!stats.isDirectory()) {
24
+ throw createToolError(
25
+ "parent_not_directory",
26
+ "Parent path is not a directory."
27
+ );
28
+ }
29
+ } catch (error) {
30
+ if (
31
+ error?.code ===
32
+ "parent_not_directory"
33
+ ) {
34
+ throw error;
35
+ }
36
+
37
+ if (error?.code === "ENOENT") {
38
+ throw createToolError(
39
+ "parent_directory_not_found",
40
+ "Parent directory does not exist."
41
+ );
42
+ }
43
+
44
+ throw error;
45
+ }
46
+ }
47
+
48
+ async function inspectExistingFile(
49
+ resolvedPath
50
+ ) {
51
+ try {
52
+ const stats =
53
+ await fs.stat(resolvedPath);
54
+
55
+ if (!stats.isFile()) {
56
+ throw createToolError(
57
+ "path_not_file",
58
+ "Target path is not a file."
59
+ );
60
+ }
61
+
62
+ return {
63
+ exists: true,
64
+ size: stats.size,
65
+ };
66
+ } catch (error) {
67
+ if (
68
+ error?.code ===
69
+ "path_not_file"
70
+ ) {
71
+ throw error;
72
+ }
73
+
74
+ if (error?.code === "ENOENT") {
75
+ return {
76
+ exists: false,
77
+ size: 0,
78
+ };
79
+ }
80
+
81
+ throw error;
82
+ }
83
+ }
84
+
85
+ export const writeFileTool =
86
+ defineTool({
87
+ name: "write_file",
88
+
89
+ description:
90
+ "Write UTF-8 text content to a file inside the project root.",
91
+
92
+ capabilities: [
93
+ "filesystem.write",
94
+ ],
95
+
96
+ sideEffect: "write",
97
+ approval: "policy",
98
+
99
+ inputSchema: {
100
+ type: "object",
101
+
102
+ properties: {
103
+ path: {
104
+ type: "string",
105
+ minLength: 1,
106
+ },
107
+
108
+ content: {
109
+ type: "string",
110
+ },
111
+ },
112
+
113
+ required: [
114
+ "path",
115
+ "content",
116
+ ],
117
+
118
+ additionalProperties: false,
119
+ },
120
+
121
+ async execute(
122
+ input,
123
+ context
124
+ ) {
125
+ const {
126
+ projectRoot,
127
+ } = context;
128
+
129
+ const filePath =
130
+ input?.path;
131
+
132
+ const content =
133
+ input?.content;
134
+
135
+ if (typeof content !== "string") {
136
+ throw createToolError(
137
+ "invalid_content",
138
+ "File content must be a string."
139
+ );
140
+ }
141
+
142
+ const {
143
+ resolved,
144
+ relative,
145
+ } = resolveProjectPath(
146
+ projectRoot,
147
+ filePath
148
+ );
149
+
150
+ await assertParentDirectory(
151
+ resolved
152
+ );
153
+
154
+ const before =
155
+ await inspectExistingFile(
156
+ resolved
157
+ );
158
+
159
+ try {
160
+ await fs.writeFile(
161
+ resolved,
162
+ content,
163
+ {
164
+ encoding: "utf8",
165
+ flag: "w",
166
+ }
167
+ );
168
+ } catch (error) {
169
+ throw createToolError(
170
+ "file_write_failed",
171
+ `Failed to write file: ${relative}`,
172
+ {
173
+ cause:
174
+ error?.message ??
175
+ String(error),
176
+ }
177
+ );
178
+ }
179
+
180
+ let after;
181
+
182
+ try {
183
+ after =
184
+ await fs.stat(resolved);
185
+ } catch (error) {
186
+ throw createToolError(
187
+ "file_verification_failed",
188
+ `Unable to verify written file: ${relative}`,
189
+ {
190
+ cause:
191
+ error?.message ??
192
+ String(error),
193
+ }
194
+ );
195
+ }
196
+
197
+ if (!after.isFile()) {
198
+ throw createToolError(
199
+ "file_verification_failed",
200
+ `Written path is not a file: ${relative}`
201
+ );
202
+ }
203
+
204
+ return {
205
+ path: relative,
206
+ created: !before.exists,
207
+ overwritten: before.exists,
208
+ previousSize: before.size,
209
+ size: after.size,
210
+ };
211
+ },
212
+ });
File without changes
File without changes
File without changes