@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,145 @@
1
+ /**
2
+ * packages/retrieval/symbols.js
3
+ *
4
+ * Repository-wide symbol index.
5
+ */
6
+
7
+ export class SymbolIndex {
8
+ constructor() {
9
+ this.clear();
10
+ }
11
+
12
+ clear() {
13
+ this.byId = new Map();
14
+ this.byName = new Map();
15
+ this.byFile = new Map();
16
+ this.byKind = new Map();
17
+ }
18
+
19
+ /**
20
+ * Add a single symbol.
21
+ */
22
+ add(symbol) {
23
+ if (!symbol) {
24
+ return;
25
+ }
26
+
27
+ // ------------------------------------------------------------------
28
+ // ID
29
+ // ------------------------------------------------------------------
30
+
31
+ this.byId.set(symbol.id, symbol);
32
+
33
+ // ------------------------------------------------------------------
34
+ // Name
35
+ // ------------------------------------------------------------------
36
+
37
+ if (!this.byName.has(symbol.name)) {
38
+ this.byName.set(symbol.name, []);
39
+ }
40
+
41
+ this.byName.get(symbol.name).push(symbol);
42
+
43
+ // ------------------------------------------------------------------
44
+ // File
45
+ // ------------------------------------------------------------------
46
+
47
+ if (!this.byFile.has(symbol.file)) {
48
+ this.byFile.set(symbol.file, []);
49
+ }
50
+
51
+ this.byFile.get(symbol.file).push(symbol);
52
+
53
+ // ------------------------------------------------------------------
54
+ // Kind
55
+ // ------------------------------------------------------------------
56
+
57
+ if (!this.byKind.has(symbol.kind)) {
58
+ this.byKind.set(symbol.kind, []);
59
+ }
60
+
61
+ this.byKind.get(symbol.kind).push(symbol);
62
+ }
63
+
64
+ /**
65
+ * Index one parsed file.
66
+ */
67
+ addFile(parsedFile) {
68
+ if (!parsedFile?.symbols) {
69
+ return;
70
+ }
71
+
72
+ for (const symbol of parsedFile.symbols) {
73
+ this.add(symbol);
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Build the complete repository index.
79
+ */
80
+ build(repository) {
81
+ this.clear();
82
+
83
+ const files = repository.files ?? repository;
84
+
85
+ for (const file of files) {
86
+ this.addFile(file);
87
+ }
88
+
89
+ return this;
90
+ }
91
+
92
+ /**
93
+ * Lookup by ID.
94
+ */
95
+ get(id) {
96
+ return this.byId.get(id) ?? null;
97
+ }
98
+
99
+ /**
100
+ * Find symbols by name.
101
+ */
102
+ find(name) {
103
+ return this.byName.get(name) ?? [];
104
+ }
105
+
106
+ /**
107
+ * Get symbols in a file.
108
+ */
109
+ file(path) {
110
+ return this.byFile.get(path) ?? [];
111
+ }
112
+
113
+ /**
114
+ * Get symbols by kind.
115
+ */
116
+ kind(kind) {
117
+ return this.byKind.get(kind) ?? [];
118
+ }
119
+
120
+ /**
121
+ * All indexed symbols.
122
+ */
123
+ values() {
124
+ return [...this.byId.values()];
125
+ }
126
+
127
+ /**
128
+ * Repository statistics.
129
+ */
130
+ stats() {
131
+ return {
132
+ total: this.byId.size,
133
+ names: this.byName.size,
134
+ files: this.byFile.size,
135
+ kinds: this.byKind.size,
136
+ };
137
+ }
138
+ }
139
+
140
+ /**
141
+ * Convenience helper.
142
+ */
143
+ export function buildSymbolIndex(repository) {
144
+ return new SymbolIndex().build(repository);
145
+ }
@@ -0,0 +1,69 @@
1
+ import fs from "fs/promises";
2
+ import path from "path";
3
+
4
+ async function readPackageJson(root) {
5
+ const file = path.join(root, "package.json");
6
+
7
+ try {
8
+ const content = await fs.readFile(file, "utf8");
9
+ return JSON.parse(content);
10
+ } catch {
11
+ return null;
12
+ }
13
+ }
14
+
15
+ export async function detectProject(root) {
16
+ const packageJson = await readPackageJson(root);
17
+
18
+ let framework = "unknown";
19
+ let packageManager = "unknown";
20
+
21
+ if (!packageJson) {
22
+ return {
23
+ framework,
24
+ packageManager,
25
+ packageJson: null
26
+ };
27
+ }
28
+
29
+ const deps = {
30
+ ...(packageJson.dependencies ?? {}),
31
+ ...(packageJson.devDependencies ?? {})
32
+ };
33
+
34
+ if (deps.next)
35
+ framework = "next";
36
+
37
+ else if (deps.react)
38
+ framework = "react";
39
+
40
+ else if (deps["@nestjs/core"])
41
+ framework = "nest";
42
+
43
+ else if (deps.express)
44
+ framework = "express";
45
+
46
+ else if (deps.vue)
47
+ framework = "vue";
48
+
49
+ else if (deps.vite)
50
+ framework = "vite";
51
+
52
+ else
53
+ framework = "node";
54
+
55
+ if (packageJson.packageManager?.startsWith("pnpm"))
56
+ packageManager = "pnpm";
57
+
58
+ else if (packageJson.packageManager?.startsWith("yarn"))
59
+ packageManager = "yarn";
60
+
61
+ else
62
+ packageManager = "npm";
63
+
64
+ return {
65
+ framework,
66
+ packageManager,
67
+ packageJson
68
+ };
69
+ }
@@ -0,0 +1,12 @@
1
+ export const DEFAULT_IGNORE = [
2
+ "node_modules",
3
+ ".git",
4
+ ".next",
5
+ "dist",
6
+ "build",
7
+ ".turbo",
8
+ ".cache",
9
+ ".codeforge",
10
+ ".idea",
11
+ ".vscode"
12
+ ];
@@ -0,0 +1,2 @@
1
+ export * from "./scanner.js";
2
+ export * from "./root.js";
@@ -0,0 +1,21 @@
1
+ import fs from "fs/promises";
2
+ import path from "path";
3
+
4
+ export async function findWorkspaceRoot(start) {
5
+ let current = path.resolve(start);
6
+
7
+ while (true) {
8
+ try {
9
+ await fs.access(path.join(current, "pnpm-workspace.yaml"));
10
+ return current;
11
+ } catch {}
12
+
13
+ const parent = path.dirname(current);
14
+
15
+ if (parent === current) {
16
+ return start;
17
+ }
18
+
19
+ current = parent;
20
+ }
21
+ }
@@ -0,0 +1,35 @@
1
+ import fs from "fs/promises";
2
+ import path from "path";
3
+
4
+ import { detectProject } from "./detect.js";
5
+ import { buildTree } from "./tree.js";
6
+
7
+ export async function scanProject(root) {
8
+ const detection = await detectProject(root);
9
+
10
+ let files = [];
11
+
12
+ try {
13
+ files = await fs.readdir(root);
14
+ } catch {}
15
+
16
+ return {
17
+ name: path.basename(root),
18
+
19
+ root,
20
+
21
+ packageManager: detection.packageManager,
22
+
23
+ framework: detection.framework,
24
+
25
+ hasGit: files.includes(".git"),
26
+
27
+ hasNodeModules: files.includes("node_modules"),
28
+
29
+ tree: await buildTree(root),
30
+
31
+ packageJson: detection.packageJson,
32
+
33
+ files
34
+ };
35
+ }
@@ -0,0 +1,45 @@
1
+ import fs from "fs/promises";
2
+ import path from "path";
3
+ import { DEFAULT_IGNORE } from "./ignore.js";
4
+
5
+ const MAX_DEPTH = 3;
6
+
7
+ async function walk(dir, depth = 0) {
8
+ if (depth > MAX_DEPTH)
9
+ return [];
10
+
11
+ let entries = await fs.readdir(dir, {
12
+ withFileTypes: true
13
+ });
14
+
15
+ entries = entries
16
+ .filter(entry => !DEFAULT_IGNORE.includes(entry.name))
17
+ .sort((a, b) => a.name.localeCompare(b.name));
18
+
19
+ const lines = [];
20
+
21
+ for (const entry of entries) {
22
+ const indent = " ".repeat(depth);
23
+
24
+ if (entry.isDirectory()) {
25
+ lines.push(`${indent}${entry.name}/`);
26
+
27
+ const children = await walk(
28
+ path.join(dir, entry.name),
29
+ depth + 1
30
+ );
31
+
32
+ lines.push(...children);
33
+ } else {
34
+ lines.push(`${indent}${entry.name}`);
35
+ }
36
+ }
37
+
38
+ return lines;
39
+ }
40
+
41
+ export async function buildTree(root) {
42
+ const lines = await walk(root);
43
+
44
+ return lines.join("\n");
45
+ }