agent-bober 0.1.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 (212) hide show
  1. package/.claude-plugin/plugin.json +9 -0
  2. package/LICENSE +21 -0
  3. package/README.md +495 -0
  4. package/agents/bober-evaluator.md +323 -0
  5. package/agents/bober-generator.md +245 -0
  6. package/agents/bober-planner.md +248 -0
  7. package/dist/cli/commands/eval.d.ts +6 -0
  8. package/dist/cli/commands/eval.d.ts.map +1 -0
  9. package/dist/cli/commands/eval.js +129 -0
  10. package/dist/cli/commands/eval.js.map +1 -0
  11. package/dist/cli/commands/init.d.ts +5 -0
  12. package/dist/cli/commands/init.d.ts.map +1 -0
  13. package/dist/cli/commands/init.js +547 -0
  14. package/dist/cli/commands/init.js.map +1 -0
  15. package/dist/cli/commands/plan.d.ts +5 -0
  16. package/dist/cli/commands/plan.d.ts.map +1 -0
  17. package/dist/cli/commands/plan.js +87 -0
  18. package/dist/cli/commands/plan.js.map +1 -0
  19. package/dist/cli/commands/run.d.ts +5 -0
  20. package/dist/cli/commands/run.d.ts.map +1 -0
  21. package/dist/cli/commands/run.js +120 -0
  22. package/dist/cli/commands/run.js.map +1 -0
  23. package/dist/cli/commands/sprint.d.ts +6 -0
  24. package/dist/cli/commands/sprint.d.ts.map +1 -0
  25. package/dist/cli/commands/sprint.js +206 -0
  26. package/dist/cli/commands/sprint.js.map +1 -0
  27. package/dist/cli/index.d.ts +3 -0
  28. package/dist/cli/index.d.ts.map +1 -0
  29. package/dist/cli/index.js +124 -0
  30. package/dist/cli/index.js.map +1 -0
  31. package/dist/config/defaults.d.ts +15 -0
  32. package/dist/config/defaults.d.ts.map +1 -0
  33. package/dist/config/defaults.js +226 -0
  34. package/dist/config/defaults.js.map +1 -0
  35. package/dist/config/index.d.ts +4 -0
  36. package/dist/config/index.d.ts.map +1 -0
  37. package/dist/config/index.js +8 -0
  38. package/dist/config/index.js.map +1 -0
  39. package/dist/config/loader.d.ts +18 -0
  40. package/dist/config/loader.d.ts.map +1 -0
  41. package/dist/config/loader.js +189 -0
  42. package/dist/config/loader.js.map +1 -0
  43. package/dist/config/schema.d.ts +904 -0
  44. package/dist/config/schema.d.ts.map +1 -0
  45. package/dist/config/schema.js +181 -0
  46. package/dist/config/schema.js.map +1 -0
  47. package/dist/contracts/eval-result.d.ts +205 -0
  48. package/dist/contracts/eval-result.d.ts.map +1 -0
  49. package/dist/contracts/eval-result.js +87 -0
  50. package/dist/contracts/eval-result.js.map +1 -0
  51. package/dist/contracts/index.d.ts +4 -0
  52. package/dist/contracts/index.d.ts.map +1 -0
  53. package/dist/contracts/index.js +16 -0
  54. package/dist/contracts/index.js.map +1 -0
  55. package/dist/contracts/spec.d.ts +101 -0
  56. package/dist/contracts/spec.d.ts.map +1 -0
  57. package/dist/contracts/spec.js +51 -0
  58. package/dist/contracts/spec.js.map +1 -0
  59. package/dist/contracts/sprint-contract.d.ts +141 -0
  60. package/dist/contracts/sprint-contract.d.ts.map +1 -0
  61. package/dist/contracts/sprint-contract.js +80 -0
  62. package/dist/contracts/sprint-contract.js.map +1 -0
  63. package/dist/evaluators/builtin/api-check.d.ts +13 -0
  64. package/dist/evaluators/builtin/api-check.d.ts.map +1 -0
  65. package/dist/evaluators/builtin/api-check.js +152 -0
  66. package/dist/evaluators/builtin/api-check.js.map +1 -0
  67. package/dist/evaluators/builtin/build-check.d.ts +17 -0
  68. package/dist/evaluators/builtin/build-check.d.ts.map +1 -0
  69. package/dist/evaluators/builtin/build-check.js +155 -0
  70. package/dist/evaluators/builtin/build-check.js.map +1 -0
  71. package/dist/evaluators/builtin/command-runner.d.ts +26 -0
  72. package/dist/evaluators/builtin/command-runner.d.ts.map +1 -0
  73. package/dist/evaluators/builtin/command-runner.js +114 -0
  74. package/dist/evaluators/builtin/command-runner.js.map +1 -0
  75. package/dist/evaluators/builtin/lint.d.ts +17 -0
  76. package/dist/evaluators/builtin/lint.d.ts.map +1 -0
  77. package/dist/evaluators/builtin/lint.js +264 -0
  78. package/dist/evaluators/builtin/lint.js.map +1 -0
  79. package/dist/evaluators/builtin/playwright.d.ts +16 -0
  80. package/dist/evaluators/builtin/playwright.d.ts.map +1 -0
  81. package/dist/evaluators/builtin/playwright.js +238 -0
  82. package/dist/evaluators/builtin/playwright.js.map +1 -0
  83. package/dist/evaluators/builtin/typescript-check.d.ts +12 -0
  84. package/dist/evaluators/builtin/typescript-check.d.ts.map +1 -0
  85. package/dist/evaluators/builtin/typescript-check.js +155 -0
  86. package/dist/evaluators/builtin/typescript-check.js.map +1 -0
  87. package/dist/evaluators/builtin/unit-test.d.ts +18 -0
  88. package/dist/evaluators/builtin/unit-test.d.ts.map +1 -0
  89. package/dist/evaluators/builtin/unit-test.js +279 -0
  90. package/dist/evaluators/builtin/unit-test.js.map +1 -0
  91. package/dist/evaluators/index.d.ts +11 -0
  92. package/dist/evaluators/index.d.ts.map +1 -0
  93. package/dist/evaluators/index.js +13 -0
  94. package/dist/evaluators/index.js.map +1 -0
  95. package/dist/evaluators/plugin-interface.d.ts +50 -0
  96. package/dist/evaluators/plugin-interface.d.ts.map +1 -0
  97. package/dist/evaluators/plugin-interface.js +2 -0
  98. package/dist/evaluators/plugin-interface.js.map +1 -0
  99. package/dist/evaluators/plugin-loader.d.ts +18 -0
  100. package/dist/evaluators/plugin-loader.d.ts.map +1 -0
  101. package/dist/evaluators/plugin-loader.js +107 -0
  102. package/dist/evaluators/plugin-loader.js.map +1 -0
  103. package/dist/evaluators/registry.d.ts +78 -0
  104. package/dist/evaluators/registry.d.ts.map +1 -0
  105. package/dist/evaluators/registry.js +238 -0
  106. package/dist/evaluators/registry.js.map +1 -0
  107. package/dist/index.d.ts +17 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/index.js +22 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/orchestrator/context-handoff.d.ts +543 -0
  112. package/dist/orchestrator/context-handoff.d.ts.map +1 -0
  113. package/dist/orchestrator/context-handoff.js +133 -0
  114. package/dist/orchestrator/context-handoff.js.map +1 -0
  115. package/dist/orchestrator/evaluator-agent.d.ts +15 -0
  116. package/dist/orchestrator/evaluator-agent.d.ts.map +1 -0
  117. package/dist/orchestrator/evaluator-agent.js +233 -0
  118. package/dist/orchestrator/evaluator-agent.js.map +1 -0
  119. package/dist/orchestrator/generator-agent.d.ts +16 -0
  120. package/dist/orchestrator/generator-agent.d.ts.map +1 -0
  121. package/dist/orchestrator/generator-agent.js +147 -0
  122. package/dist/orchestrator/generator-agent.js.map +1 -0
  123. package/dist/orchestrator/pipeline.d.ts +24 -0
  124. package/dist/orchestrator/pipeline.d.ts.map +1 -0
  125. package/dist/orchestrator/pipeline.js +290 -0
  126. package/dist/orchestrator/pipeline.js.map +1 -0
  127. package/dist/orchestrator/planner-agent.d.ts +10 -0
  128. package/dist/orchestrator/planner-agent.d.ts.map +1 -0
  129. package/dist/orchestrator/planner-agent.js +187 -0
  130. package/dist/orchestrator/planner-agent.js.map +1 -0
  131. package/dist/state/helpers.d.ts +5 -0
  132. package/dist/state/helpers.d.ts.map +1 -0
  133. package/dist/state/helpers.js +8 -0
  134. package/dist/state/helpers.js.map +1 -0
  135. package/dist/state/history.d.ts +39 -0
  136. package/dist/state/history.d.ts.map +1 -0
  137. package/dist/state/history.js +162 -0
  138. package/dist/state/history.js.map +1 -0
  139. package/dist/state/index.d.ts +8 -0
  140. package/dist/state/index.d.ts.map +1 -0
  141. package/dist/state/index.js +22 -0
  142. package/dist/state/index.js.map +1 -0
  143. package/dist/state/plan-state.d.ts +21 -0
  144. package/dist/state/plan-state.d.ts.map +1 -0
  145. package/dist/state/plan-state.js +108 -0
  146. package/dist/state/plan-state.js.map +1 -0
  147. package/dist/state/sprint-state.d.ts +20 -0
  148. package/dist/state/sprint-state.d.ts.map +1 -0
  149. package/dist/state/sprint-state.js +98 -0
  150. package/dist/state/sprint-state.js.map +1 -0
  151. package/dist/utils/fs.d.ts +31 -0
  152. package/dist/utils/fs.d.ts.map +1 -0
  153. package/dist/utils/fs.js +67 -0
  154. package/dist/utils/fs.js.map +1 -0
  155. package/dist/utils/git.d.ts +35 -0
  156. package/dist/utils/git.d.ts.map +1 -0
  157. package/dist/utils/git.js +84 -0
  158. package/dist/utils/git.js.map +1 -0
  159. package/dist/utils/index.d.ts +4 -0
  160. package/dist/utils/index.d.ts.map +1 -0
  161. package/dist/utils/index.js +4 -0
  162. package/dist/utils/index.js.map +1 -0
  163. package/dist/utils/logger.d.ts +45 -0
  164. package/dist/utils/logger.d.ts.map +1 -0
  165. package/dist/utils/logger.js +73 -0
  166. package/dist/utils/logger.js.map +1 -0
  167. package/hooks/hooks.json +10 -0
  168. package/package.json +67 -0
  169. package/scripts/detect-stack.sh +287 -0
  170. package/scripts/init-project.sh +206 -0
  171. package/scripts/run-eval.sh +175 -0
  172. package/skills/bober.anchor/SKILL.md +365 -0
  173. package/skills/bober.anchor/references/anchor-guide.md +567 -0
  174. package/skills/bober.brownfield/SKILL.md +422 -0
  175. package/skills/bober.brownfield/references/codebase-analysis.md +304 -0
  176. package/skills/bober.eval/SKILL.md +235 -0
  177. package/skills/bober.eval/references/eval-strategies.md +407 -0
  178. package/skills/bober.eval/references/feedback-format.md +182 -0
  179. package/skills/bober.plan/SKILL.md +244 -0
  180. package/skills/bober.plan/references/clarification-guide.md +124 -0
  181. package/skills/bober.plan/references/spec-schema.md +253 -0
  182. package/skills/bober.react/SKILL.md +330 -0
  183. package/skills/bober.react/references/react-scaffold.md +344 -0
  184. package/skills/bober.run/SKILL.md +303 -0
  185. package/skills/bober.solidity/SKILL.md +416 -0
  186. package/skills/bober.solidity/references/solidity-guide.md +487 -0
  187. package/skills/bober.sprint/SKILL.md +280 -0
  188. package/skills/bober.sprint/references/contract-schema.md +251 -0
  189. package/templates/base/CLAUDE.md +20 -0
  190. package/templates/base/bober.config.json +35 -0
  191. package/templates/brownfield/CLAUDE.md +34 -0
  192. package/templates/brownfield/bober.config.json +37 -0
  193. package/templates/presets/anchor/CLAUDE.md +163 -0
  194. package/templates/presets/anchor/bober.config.json +9 -0
  195. package/templates/presets/api-node/CLAUDE.md +153 -0
  196. package/templates/presets/api-node/bober.config.json +10 -0
  197. package/templates/presets/nextjs/CLAUDE.md +82 -0
  198. package/templates/presets/nextjs/bober.config.json +14 -0
  199. package/templates/presets/python-api/CLAUDE.md +202 -0
  200. package/templates/presets/python-api/bober.config.json +9 -0
  201. package/templates/presets/react-vite/CLAUDE.md +71 -0
  202. package/templates/presets/react-vite/bober.config.json +53 -0
  203. package/templates/presets/react-vite/scaffold/package.json +45 -0
  204. package/templates/presets/react-vite/scaffold/server/index.ts +38 -0
  205. package/templates/presets/react-vite/scaffold/server/tsconfig.json +24 -0
  206. package/templates/presets/react-vite/scaffold/src/App.tsx +37 -0
  207. package/templates/presets/react-vite/scaffold/src/index.html +12 -0
  208. package/templates/presets/react-vite/scaffold/src/main.tsx +12 -0
  209. package/templates/presets/react-vite/scaffold/tsconfig.json +27 -0
  210. package/templates/presets/react-vite/scaffold/vite.config.ts +34 -0
  211. package/templates/presets/solidity/CLAUDE.md +106 -0
  212. package/templates/presets/solidity/bober.config.json +9 -0
@@ -0,0 +1,238 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { execa } from "execa";
4
+ async function hasPlaywright(projectRoot) {
5
+ try {
6
+ const raw = await readFile(join(projectRoot, "package.json"), "utf-8");
7
+ const pkg = JSON.parse(raw);
8
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
9
+ return "@playwright/test" in allDeps || "playwright" in allDeps;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ function flattenSuites(suite, prefix = "") {
16
+ const tests = [];
17
+ const suiteName = prefix ? `${prefix} > ${suite.title}` : suite.title;
18
+ for (const spec of suite.specs ?? []) {
19
+ for (const test of spec.tests) {
20
+ const lastResult = test.results[test.results.length - 1];
21
+ if (!lastResult)
22
+ continue;
23
+ const screenshot = lastResult.attachments?.find((a) => a.contentType.startsWith("image/") && a.path);
24
+ tests.push({
25
+ title: `${suiteName} > ${spec.title}`,
26
+ status: lastResult.status,
27
+ error: lastResult.error?.message ?? lastResult.error?.stack,
28
+ file: spec.location?.file,
29
+ line: spec.location?.line,
30
+ screenshot: screenshot?.path,
31
+ });
32
+ }
33
+ }
34
+ for (const child of suite.suites ?? []) {
35
+ tests.push(...flattenSuites(child, suiteName));
36
+ }
37
+ return tests;
38
+ }
39
+ function parsePlaywrightJson(raw) {
40
+ const jsonStart = raw.indexOf("{");
41
+ if (jsonStart === -1)
42
+ return null;
43
+ try {
44
+ const parsed = JSON.parse(raw.slice(jsonStart));
45
+ if (!Array.isArray(parsed.suites))
46
+ return null;
47
+ return parsed;
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ async function startDevServer(projectRoot, devCommand, waitMs = 5000) {
54
+ const [cmd, ...args] = devCommand.split(/\s+/);
55
+ const child = execa(cmd, args, {
56
+ cwd: projectRoot,
57
+ reject: false,
58
+ // Let the process run in the background.
59
+ cleanup: true,
60
+ });
61
+ // Give the server time to start.
62
+ await new Promise((resolve) => setTimeout(resolve, waitMs));
63
+ return {
64
+ process: child,
65
+ kill: () => {
66
+ child.kill("SIGTERM");
67
+ },
68
+ };
69
+ }
70
+ // ── Evaluator ──────────────────────────────────────────────────────
71
+ const DEFAULT_TIMEOUT_MS = 120_000;
72
+ export class PlaywrightEvaluator {
73
+ name = "Playwright E2E";
74
+ description = "Runs Playwright end-to-end tests and reports results.";
75
+ async canRun(projectRoot, _config) {
76
+ return hasPlaywright(projectRoot);
77
+ }
78
+ async evaluate(context) {
79
+ const { projectRoot, config, strategy } = context;
80
+ const timestamp = new Date().toISOString();
81
+ const timeout = strategy.config?.timeout ?? DEFAULT_TIMEOUT_MS;
82
+ const shouldStartServer = strategy.config?.startServer ?? true;
83
+ let server = null;
84
+ try {
85
+ // Start dev server if configured and requested.
86
+ if (shouldStartServer && config.commands.dev) {
87
+ server = await startDevServer(projectRoot, config.commands.dev);
88
+ }
89
+ return await this.runPlaywright(projectRoot, strategy, timeout, timestamp);
90
+ }
91
+ finally {
92
+ if (server) {
93
+ server.kill();
94
+ }
95
+ }
96
+ }
97
+ async runPlaywright(projectRoot, strategy, timeout, timestamp) {
98
+ const args = ["playwright", "test", "--reporter", "json"];
99
+ // Add base URL if configured.
100
+ const baseUrl = strategy.config?.baseUrl;
101
+ if (baseUrl) {
102
+ args.push(`--config-base-url=${baseUrl}`);
103
+ }
104
+ try {
105
+ const result = await execa("npx", args, {
106
+ cwd: projectRoot,
107
+ timeout,
108
+ reject: false,
109
+ all: true,
110
+ env: {
111
+ ...process.env,
112
+ // Force non-interactive mode.
113
+ CI: "true",
114
+ },
115
+ });
116
+ const allOutput = result.all ?? result.stdout ?? "";
117
+ const report = parsePlaywrightJson(allOutput);
118
+ if (report) {
119
+ return this.buildFromReport(report, timestamp);
120
+ }
121
+ // Couldn't parse JSON — fall back to exit code.
122
+ if (result.exitCode === 0) {
123
+ return {
124
+ evaluator: this.name,
125
+ passed: true,
126
+ score: 100,
127
+ details: [],
128
+ summary: "All Playwright tests passed.",
129
+ feedback: "E2E tests completed successfully.",
130
+ timestamp,
131
+ };
132
+ }
133
+ return {
134
+ evaluator: this.name,
135
+ passed: false,
136
+ score: 0,
137
+ details: [
138
+ {
139
+ criterion: "Playwright test execution",
140
+ passed: false,
141
+ message: allOutput.slice(0, 2000) ||
142
+ `Playwright exited with code ${result.exitCode}`,
143
+ severity: "error",
144
+ },
145
+ ],
146
+ summary: "Playwright tests failed.",
147
+ feedback: allOutput.slice(0, 2000),
148
+ timestamp,
149
+ };
150
+ }
151
+ catch (err) {
152
+ return this.errorResult(err, timestamp);
153
+ }
154
+ }
155
+ buildFromReport(report, timestamp) {
156
+ const allTests = [];
157
+ for (const suite of report.suites) {
158
+ allTests.push(...flattenSuites(suite));
159
+ }
160
+ const total = allTests.length;
161
+ const passed = allTests.filter((t) => t.status === "passed").length;
162
+ const failed = allTests.filter((t) => t.status === "failed" || t.status === "timedOut").length;
163
+ const skipped = allTests.filter((t) => t.status === "skipped").length;
164
+ const details = [];
165
+ for (const test of allTests) {
166
+ if (test.status === "failed" || test.status === "timedOut") {
167
+ let message = test.error ?? `Test ${test.status}`;
168
+ if (test.screenshot) {
169
+ message += `\nScreenshot: ${test.screenshot}`;
170
+ }
171
+ details.push({
172
+ criterion: `e2e: ${test.title}`,
173
+ passed: false,
174
+ message: message.slice(0, 500),
175
+ file: test.file,
176
+ line: test.line,
177
+ severity: "error",
178
+ });
179
+ }
180
+ }
181
+ const allPassed = failed === 0;
182
+ const score = total === 0 ? 100 : Math.round((passed / total) * 100);
183
+ const summaryParts = [`E2E Tests: ${passed} passed`];
184
+ if (failed > 0)
185
+ summaryParts.push(`${failed} failed`);
186
+ if (skipped > 0)
187
+ summaryParts.push(`${skipped} skipped`);
188
+ summaryParts.push(`${total} total`);
189
+ return {
190
+ evaluator: this.name,
191
+ passed: allPassed,
192
+ score,
193
+ details,
194
+ summary: summaryParts.join(", "),
195
+ feedback: this.buildFeedback(allPassed, details, failed),
196
+ timestamp,
197
+ };
198
+ }
199
+ buildFeedback(allPassed, details, failedCount) {
200
+ if (allPassed)
201
+ return "All E2E tests passed. No changes needed.";
202
+ const lines = [`${failedCount} E2E test(s) failed. Fix the following:`, ""];
203
+ for (const d of details.slice(0, 10)) {
204
+ const loc = d.file ? ` ${d.file}${d.line ? `:${d.line}` : ""}` : " (unknown)";
205
+ lines.push(`${loc}`);
206
+ lines.push(` ${d.criterion}: ${d.message.split("\n")[0]}`);
207
+ }
208
+ if (details.length > 10) {
209
+ lines.push(` ... and ${details.length - 10} more failures`);
210
+ }
211
+ return lines.join("\n");
212
+ }
213
+ errorResult(err, timestamp) {
214
+ return {
215
+ evaluator: this.name,
216
+ passed: false,
217
+ score: 0,
218
+ details: [
219
+ {
220
+ criterion: "Playwright execution",
221
+ passed: false,
222
+ message: err instanceof Error ? err.message : String(err),
223
+ severity: "error",
224
+ },
225
+ ],
226
+ summary: "Playwright E2E tests failed to execute.",
227
+ feedback: `Playwright could not be run: ${err instanceof Error ? err.message : String(err)}`,
228
+ timestamp,
229
+ };
230
+ }
231
+ }
232
+ /**
233
+ * Factory function for the registry.
234
+ */
235
+ export function createPlaywrightEvaluator() {
236
+ return new PlaywrightEvaluator();
237
+ }
238
+ //# sourceMappingURL=playwright.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright.js","sourceRoot":"","sources":["../../../src/evaluators/builtin/playwright.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { EvaluatorPlugin, EvalContext, EvalResult, BoberConfig } from "../plugin-interface.js";
2
+ export declare class TypeScriptCheckEvaluator implements EvaluatorPlugin {
3
+ readonly name = "TypeScript Check";
4
+ readonly description = "Runs tsc --noEmit to verify the project has no type errors.";
5
+ canRun(projectRoot: string, config: BoberConfig): Promise<boolean>;
6
+ evaluate(context: EvalContext): Promise<EvalResult>;
7
+ }
8
+ /**
9
+ * Default export: factory function for the registry.
10
+ */
11
+ export declare function createTypescriptCheckEvaluator(): EvaluatorPlugin;
12
+ //# sourceMappingURL=typescript-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript-check.d.ts","sourceRoot":"","sources":["../../../src/evaluators/builtin/typescript-check.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,UAAU,EAEV,WAAW,EACZ,MAAM,wBAAwB,CAAC;AA6ChC,qBAAa,wBAAyB,YAAW,eAAe;IAC9D,QAAQ,CAAC,IAAI,sBAAsB;IACnC,QAAQ,CAAC,WAAW,iEAAiE;IAE/E,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAalE,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAsF1D;AA0BD;;GAEG;AACH,wBAAgB,8BAA8B,IAAI,eAAe,CAEhE"}
@@ -0,0 +1,155 @@
1
+ import { access } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { execa } from "execa";
4
+ /**
5
+ * Parse tsc --noEmit output lines into structured errors.
6
+ *
7
+ * Expected format per line:
8
+ * src/foo.ts(12,5): error TS2345: Argument of type ...
9
+ */
10
+ function parseTscOutput(output) {
11
+ const errors = [];
12
+ const linePattern = /^(.+?)\((\d+),(\d+)\):\s+error\s+(TS\d+):\s+(.+)$/;
13
+ for (const line of output.split("\n")) {
14
+ const trimmed = line.trim();
15
+ if (!trimmed)
16
+ continue;
17
+ const match = linePattern.exec(trimmed);
18
+ if (match) {
19
+ errors.push({
20
+ file: match[1],
21
+ line: parseInt(match[2], 10),
22
+ col: parseInt(match[3], 10),
23
+ code: match[4],
24
+ message: match[5],
25
+ });
26
+ }
27
+ }
28
+ return errors;
29
+ }
30
+ // ── Evaluator ──────────────────────────────────────────────────────
31
+ const DEFAULT_TIMEOUT_MS = 60_000;
32
+ export class TypeScriptCheckEvaluator {
33
+ name = "TypeScript Check";
34
+ description = "Runs tsc --noEmit to verify the project has no type errors.";
35
+ async canRun(projectRoot, config) {
36
+ // If a custom typecheck command is configured, assume it's runnable.
37
+ if (config.commands.typecheck)
38
+ return true;
39
+ // Otherwise check for tsconfig.json.
40
+ try {
41
+ await access(join(projectRoot, "tsconfig.json"));
42
+ return true;
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ }
48
+ async evaluate(context) {
49
+ const { projectRoot, config, strategy } = context;
50
+ const timestamp = new Date().toISOString();
51
+ const timeout = strategy.config?.timeout ?? DEFAULT_TIMEOUT_MS;
52
+ const command = config.commands.typecheck ?? "npx tsc --noEmit";
53
+ const [cmd, ...args] = command.split(/\s+/);
54
+ try {
55
+ const result = await execa(cmd, args, {
56
+ cwd: projectRoot,
57
+ timeout,
58
+ reject: false,
59
+ all: true,
60
+ });
61
+ const allOutput = result.all ?? result.stdout ?? "";
62
+ // Exit code 0 means no type errors.
63
+ if (result.exitCode === 0) {
64
+ return {
65
+ evaluator: this.name,
66
+ passed: true,
67
+ score: 100,
68
+ details: [],
69
+ summary: "TypeScript compilation succeeded with no errors.",
70
+ feedback: "All types are valid. No changes needed.",
71
+ timestamp,
72
+ };
73
+ }
74
+ // Parse errors from tsc output.
75
+ const tscErrors = parseTscOutput(allOutput);
76
+ const details = tscErrors.map((err) => ({
77
+ criterion: `Type check: ${err.code}`,
78
+ passed: false,
79
+ message: `${err.message} (${err.code})`,
80
+ file: err.file,
81
+ line: err.line,
82
+ severity: "error",
83
+ }));
84
+ // If we couldn't parse any structured errors but the command failed,
85
+ // add a generic detail with the raw output.
86
+ if (details.length === 0 && result.exitCode !== 0) {
87
+ details.push({
88
+ criterion: "TypeScript compilation",
89
+ passed: false,
90
+ message: allOutput.slice(0, 2000) || `tsc exited with code ${result.exitCode}`,
91
+ severity: "error",
92
+ });
93
+ }
94
+ // Score: 0 when there are errors. We could be proportional but
95
+ // type errors are generally blocking.
96
+ const errorCount = details.length;
97
+ const score = errorCount === 0 ? 100 : Math.max(0, 100 - errorCount * 5);
98
+ return {
99
+ evaluator: this.name,
100
+ passed: false,
101
+ score,
102
+ details,
103
+ summary: `TypeScript compilation failed with ${errorCount} error(s).`,
104
+ feedback: buildFeedback(tscErrors),
105
+ timestamp,
106
+ };
107
+ }
108
+ catch (err) {
109
+ return {
110
+ evaluator: this.name,
111
+ passed: false,
112
+ score: 0,
113
+ details: [
114
+ {
115
+ criterion: "TypeScript compilation",
116
+ passed: false,
117
+ message: err instanceof Error ? err.message : String(err),
118
+ severity: "error",
119
+ },
120
+ ],
121
+ summary: "TypeScript check failed to execute.",
122
+ feedback: `The typecheck command could not be run: ${err instanceof Error ? err.message : String(err)}`,
123
+ timestamp,
124
+ };
125
+ }
126
+ }
127
+ }
128
+ function buildFeedback(errors) {
129
+ if (errors.length === 0)
130
+ return "Fix the TypeScript compilation errors shown above.";
131
+ const grouped = new Map();
132
+ for (const err of errors) {
133
+ const existing = grouped.get(err.file) ?? [];
134
+ existing.push(err);
135
+ grouped.set(err.file, existing);
136
+ }
137
+ const lines = ["Fix the following TypeScript errors:", ""];
138
+ for (const [file, fileErrors] of grouped) {
139
+ lines.push(` ${file}:`);
140
+ for (const e of fileErrors.slice(0, 10)) {
141
+ lines.push(` line ${e.line}: ${e.message} (${e.code})`);
142
+ }
143
+ if (fileErrors.length > 10) {
144
+ lines.push(` ... and ${fileErrors.length - 10} more`);
145
+ }
146
+ }
147
+ return lines.join("\n");
148
+ }
149
+ /**
150
+ * Default export: factory function for the registry.
151
+ */
152
+ export function createTypescriptCheckEvaluator() {
153
+ return new TypeScriptCheckEvaluator();
154
+ }
155
+ //# sourceMappingURL=typescript-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript-check.js","sourceRoot":"","sources":["../../../src/evaluators/builtin/typescript-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { EvaluatorPlugin, EvalContext, EvalResult, BoberConfig } from "../plugin-interface.js";
2
+ export declare class UnitTestEvaluator implements EvaluatorPlugin {
3
+ readonly name = "Unit Tests";
4
+ readonly description = "Runs vitest or jest and reports test results.";
5
+ canRun(projectRoot: string, config: BoberConfig): Promise<boolean>;
6
+ evaluate(context: EvalContext): Promise<EvalResult>;
7
+ private runVitest;
8
+ private runJest;
9
+ private runCustomCommand;
10
+ private processJsonResults;
11
+ private buildFeedback;
12
+ private errorResult;
13
+ }
14
+ /**
15
+ * Factory function for the registry.
16
+ */
17
+ export declare function createUnitTestEvaluator(): EvaluatorPlugin;
18
+ //# sourceMappingURL=unit-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unit-test.d.ts","sourceRoot":"","sources":["../../../src/evaluators/builtin/unit-test.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,UAAU,EAEV,WAAW,EACZ,MAAM,wBAAwB,CAAC;AA8EhC,qBAAa,iBAAkB,YAAW,eAAe;IACvD,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,WAAW,mDAAmD;IAEjE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAUlE,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;YAwC3C,SAAS;YAsBT,OAAO;YAsBP,gBAAgB;IA4D9B,OAAO,CAAC,kBAAkB;IA8E1B,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,WAAW;CAkBpB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,eAAe,CAEzD"}