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,279 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { execa } from "execa";
4
+ async function readPackageJson(projectRoot) {
5
+ try {
6
+ const raw = await readFile(join(projectRoot, "package.json"), "utf-8");
7
+ return JSON.parse(raw);
8
+ }
9
+ catch {
10
+ return null;
11
+ }
12
+ }
13
+ function detectFramework(pkg) {
14
+ const allDeps = {
15
+ ...pkg.dependencies,
16
+ ...pkg.devDependencies,
17
+ };
18
+ if ("vitest" in allDeps)
19
+ return "vitest";
20
+ if ("jest" in allDeps)
21
+ return "jest";
22
+ // Check scripts for hints
23
+ const testScript = pkg.scripts?.test ?? "";
24
+ if (testScript.includes("vitest"))
25
+ return "vitest";
26
+ if (testScript.includes("jest"))
27
+ return "jest";
28
+ return "unknown";
29
+ }
30
+ // ── Parser ─────────────────────────────────────────────────────────
31
+ function parseJsonTestResults(raw) {
32
+ // The JSON may be preceded by console output. Find the first '{'.
33
+ const jsonStart = raw.indexOf("{");
34
+ if (jsonStart === -1)
35
+ return null;
36
+ try {
37
+ const parsed = JSON.parse(raw.slice(jsonStart));
38
+ if (typeof parsed.numTotalTests !== "number")
39
+ return null;
40
+ return parsed;
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ // ── Evaluator ──────────────────────────────────────────────────────
47
+ const DEFAULT_TIMEOUT_MS = 60_000;
48
+ export class UnitTestEvaluator {
49
+ name = "Unit Tests";
50
+ description = "Runs vitest or jest and reports test results.";
51
+ async canRun(projectRoot, config) {
52
+ if (config.commands.test)
53
+ return true;
54
+ const pkg = await readPackageJson(projectRoot);
55
+ if (!pkg)
56
+ return false;
57
+ const framework = detectFramework(pkg);
58
+ return framework !== "unknown";
59
+ }
60
+ async evaluate(context) {
61
+ const { projectRoot, config, strategy } = context;
62
+ const timestamp = new Date().toISOString();
63
+ const timeout = strategy.config?.timeout ?? DEFAULT_TIMEOUT_MS;
64
+ // Determine command
65
+ if (config.commands.test) {
66
+ return this.runCustomCommand(config.commands.test, projectRoot, timeout, timestamp);
67
+ }
68
+ const pkg = await readPackageJson(projectRoot);
69
+ const framework = pkg ? detectFramework(pkg) : "unknown";
70
+ switch (framework) {
71
+ case "vitest":
72
+ return this.runVitest(projectRoot, timeout, timestamp);
73
+ case "jest":
74
+ return this.runJest(projectRoot, timeout, timestamp);
75
+ default:
76
+ return {
77
+ evaluator: this.name,
78
+ passed: false,
79
+ score: 0,
80
+ details: [
81
+ {
82
+ criterion: "Test framework detection",
83
+ passed: false,
84
+ message: "No supported test framework detected (vitest or jest).",
85
+ severity: "error",
86
+ },
87
+ ],
88
+ summary: "Could not detect a test framework.",
89
+ feedback: "Install vitest or jest, or set commands.test in your bober config.",
90
+ timestamp,
91
+ };
92
+ }
93
+ }
94
+ // ── Vitest ─────────────────────────────────────────────────────
95
+ async runVitest(projectRoot, timeout, timestamp) {
96
+ try {
97
+ const result = await execa("npx", ["vitest", "run", "--reporter", "json"], {
98
+ cwd: projectRoot,
99
+ timeout,
100
+ reject: false,
101
+ all: true,
102
+ });
103
+ const allOutput = result.all ?? result.stdout ?? "";
104
+ return this.processJsonResults(allOutput, result.exitCode ?? 1, timestamp);
105
+ }
106
+ catch (err) {
107
+ return this.errorResult(err, timestamp);
108
+ }
109
+ }
110
+ // ── Jest ───────────────────────────────────────────────────────
111
+ async runJest(projectRoot, timeout, timestamp) {
112
+ try {
113
+ const result = await execa("npx", ["jest", "--json", "--forceExit"], {
114
+ cwd: projectRoot,
115
+ timeout,
116
+ reject: false,
117
+ all: true,
118
+ });
119
+ const allOutput = result.all ?? result.stdout ?? "";
120
+ return this.processJsonResults(allOutput, result.exitCode ?? 1, timestamp);
121
+ }
122
+ catch (err) {
123
+ return this.errorResult(err, timestamp);
124
+ }
125
+ }
126
+ // ── Custom command ─────────────────────────────────────────────
127
+ async runCustomCommand(command, projectRoot, timeout, timestamp) {
128
+ const [cmd, ...args] = command.split(/\s+/);
129
+ try {
130
+ const result = await execa(cmd, args, {
131
+ cwd: projectRoot,
132
+ timeout,
133
+ reject: false,
134
+ all: true,
135
+ });
136
+ const allOutput = result.all ?? result.stdout ?? "";
137
+ // Try to parse JSON output (in case the custom command produces it).
138
+ const jsonResults = parseJsonTestResults(allOutput);
139
+ if (jsonResults) {
140
+ return this.processJsonResults(allOutput, result.exitCode ?? 1, timestamp);
141
+ }
142
+ // Fallback: simple pass/fail based on exit code.
143
+ if (result.exitCode === 0) {
144
+ return {
145
+ evaluator: this.name,
146
+ passed: true,
147
+ score: 100,
148
+ details: [],
149
+ summary: "All tests passed.",
150
+ feedback: "Tests completed successfully.",
151
+ timestamp,
152
+ };
153
+ }
154
+ return {
155
+ evaluator: this.name,
156
+ passed: false,
157
+ score: 0,
158
+ details: [
159
+ {
160
+ criterion: "Test execution",
161
+ passed: false,
162
+ message: allOutput.slice(0, 2000) || `Tests exited with code ${result.exitCode}`,
163
+ severity: "error",
164
+ },
165
+ ],
166
+ summary: "Tests failed.",
167
+ feedback: allOutput.slice(0, 2000),
168
+ timestamp,
169
+ };
170
+ }
171
+ catch (err) {
172
+ return this.errorResult(err, timestamp);
173
+ }
174
+ }
175
+ // ── Result processing ──────────────────────────────────────────
176
+ processJsonResults(rawOutput, exitCode, timestamp) {
177
+ const parsed = parseJsonTestResults(rawOutput);
178
+ if (!parsed) {
179
+ // Couldn't parse JSON — fall back to exit code.
180
+ const passed = exitCode === 0;
181
+ return {
182
+ evaluator: this.name,
183
+ passed,
184
+ score: passed ? 100 : 0,
185
+ details: passed
186
+ ? []
187
+ : [
188
+ {
189
+ criterion: "Test execution",
190
+ passed: false,
191
+ message: rawOutput.slice(0, 2000) ||
192
+ `Tests exited with code ${exitCode}`,
193
+ severity: "error",
194
+ },
195
+ ],
196
+ summary: passed ? "Tests passed." : "Tests failed (could not parse JSON output).",
197
+ feedback: passed ? "All tests passed." : rawOutput.slice(0, 2000),
198
+ timestamp,
199
+ };
200
+ }
201
+ const { numTotalTests, numPassedTests, numFailedTests, numPendingTests } = parsed;
202
+ const details = [];
203
+ // Map each failed test to a detail.
204
+ for (const suite of parsed.testResults ?? []) {
205
+ for (const assertion of suite.assertionResults ?? []) {
206
+ if (assertion.status === "failed") {
207
+ details.push({
208
+ criterion: `test: ${assertion.fullName}`,
209
+ passed: false,
210
+ message: (assertion.failureMessages ?? []).join("\n").slice(0, 500),
211
+ file: suite.name,
212
+ line: assertion.location?.line,
213
+ severity: "error",
214
+ });
215
+ }
216
+ }
217
+ }
218
+ const passed = numFailedTests === 0;
219
+ const score = numTotalTests === 0 ? 100 : Math.round((numPassedTests / numTotalTests) * 100);
220
+ const summary = [
221
+ `Tests: ${numPassedTests} passed`,
222
+ numFailedTests > 0 ? `${numFailedTests} failed` : null,
223
+ numPendingTests > 0 ? `${numPendingTests} skipped` : null,
224
+ `${numTotalTests} total`,
225
+ ]
226
+ .filter(Boolean)
227
+ .join(", ");
228
+ const feedback = this.buildFeedback(passed, details, numFailedTests);
229
+ return {
230
+ evaluator: this.name,
231
+ passed,
232
+ score,
233
+ details,
234
+ summary,
235
+ feedback,
236
+ timestamp,
237
+ };
238
+ }
239
+ // ── Helpers ────────────────────────────────────────────────────
240
+ buildFeedback(passed, details, failedCount) {
241
+ if (passed)
242
+ return "All tests passed. No changes needed.";
243
+ const lines = [`${failedCount} test(s) failed. Fix the following:`, ""];
244
+ for (const d of details.slice(0, 15)) {
245
+ const loc = d.file ? ` ${d.file}${d.line ? `:${d.line}` : ""}` : " (unknown)";
246
+ lines.push(`${loc}`);
247
+ lines.push(` ${d.criterion}: ${d.message.split("\n")[0]}`);
248
+ }
249
+ if (details.length > 15) {
250
+ lines.push(` ... and ${details.length - 15} more failures`);
251
+ }
252
+ return lines.join("\n");
253
+ }
254
+ errorResult(err, timestamp) {
255
+ return {
256
+ evaluator: this.name,
257
+ passed: false,
258
+ score: 0,
259
+ details: [
260
+ {
261
+ criterion: "Test execution",
262
+ passed: false,
263
+ message: err instanceof Error ? err.message : String(err),
264
+ severity: "error",
265
+ },
266
+ ],
267
+ summary: "Unit test runner failed to execute.",
268
+ feedback: `The test command could not be run: ${err instanceof Error ? err.message : String(err)}`,
269
+ timestamp,
270
+ };
271
+ }
272
+ }
273
+ /**
274
+ * Factory function for the registry.
275
+ */
276
+ export function createUnitTestEvaluator() {
277
+ return new UnitTestEvaluator();
278
+ }
279
+ //# sourceMappingURL=unit-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unit-test.js","sourceRoot":"","sources":["../../../src/evaluators/builtin/unit-test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type { EvaluatorPlugin, EvaluatorFactory, EvalContext, } from "./plugin-interface.js";
2
+ export { EvaluatorRegistry, createDefaultRegistry, runEvaluation, type EvaluationRunResult, } from "./registry.js";
3
+ export { loadPlugin, loadPlugins } from "./plugin-loader.js";
4
+ export { TypeScriptCheckEvaluator, createTypescriptCheckEvaluator, } from "./builtin/typescript-check.js";
5
+ export { LintEvaluator, createLintEvaluator } from "./builtin/lint.js";
6
+ export { UnitTestEvaluator, createUnitTestEvaluator, } from "./builtin/unit-test.js";
7
+ export { PlaywrightEvaluator, createPlaywrightEvaluator, } from "./builtin/playwright.js";
8
+ export { ApiCheckEvaluator, createApiCheckEvaluator, } from "./builtin/api-check.js";
9
+ export { BuildCheckEvaluator, createBuildCheckEvaluator, } from "./builtin/build-check.js";
10
+ export { CommandRunnerEvaluator, createCommandRunnerEvaluator, } from "./builtin/command-runner.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/evaluators/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,WAAW,GACZ,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAG7D,OAAO,EACL,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEvE,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,13 @@
1
+ // ── Registry & Runner ─────────────────────────────────────────────
2
+ export { EvaluatorRegistry, createDefaultRegistry, runEvaluation, } from "./registry.js";
3
+ // ── Plugin Loader ─────────────────────────────────────────────────
4
+ export { loadPlugin, loadPlugins } from "./plugin-loader.js";
5
+ // ── Built-in Evaluators ───────────────────────────────────────────
6
+ export { TypeScriptCheckEvaluator, createTypescriptCheckEvaluator, } from "./builtin/typescript-check.js";
7
+ export { LintEvaluator, createLintEvaluator } from "./builtin/lint.js";
8
+ export { UnitTestEvaluator, createUnitTestEvaluator, } from "./builtin/unit-test.js";
9
+ export { PlaywrightEvaluator, createPlaywrightEvaluator, } from "./builtin/playwright.js";
10
+ export { ApiCheckEvaluator, createApiCheckEvaluator, } from "./builtin/api-check.js";
11
+ export { BuildCheckEvaluator, createBuildCheckEvaluator, } from "./builtin/build-check.js";
12
+ export { CommandRunnerEvaluator, createCommandRunnerEvaluator, } from "./builtin/command-runner.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/evaluators/index.ts"],"names":[],"mappings":"AAOA,qEAAqE;AACrE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,GAEd,MAAM,eAAe,CAAC;AAEvB,qEAAqE;AACrE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE7D,qEAAqE;AACrE,OAAO,EACL,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEvE,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { EvalResult, EvalDetail } from "../contracts/eval-result.js";
2
+ import type { SprintContract } from "../contracts/sprint-contract.js";
3
+ import type { BoberConfig, EvalStrategy } from "../config/schema.js";
4
+ export type { EvalResult, EvalDetail, SprintContract, BoberConfig, EvalStrategy };
5
+ /**
6
+ * Context provided to every evaluator plugin when it runs.
7
+ */
8
+ export interface EvalContext {
9
+ /** Absolute path to the project being evaluated. */
10
+ projectRoot: string;
11
+ /** The resolved bober configuration. */
12
+ config: BoberConfig;
13
+ /** The sprint contract that defines expected outcomes. */
14
+ contract: SprintContract;
15
+ /** Paths of files changed during the sprint (relative to projectRoot). */
16
+ changedFiles: string[];
17
+ /** The evaluation strategy entry that triggered this evaluator. */
18
+ strategy: EvalStrategy;
19
+ }
20
+ /**
21
+ * The interface every evaluator plugin must implement.
22
+ *
23
+ * Built-in evaluators (typecheck, lint, etc.) and custom plugins both
24
+ * conform to this shape.
25
+ */
26
+ export interface EvaluatorPlugin {
27
+ /** Human-readable name of the evaluator, e.g. "TypeScript Check". */
28
+ readonly name: string;
29
+ /** Short description of what this evaluator validates. */
30
+ readonly description: string;
31
+ /**
32
+ * Determine whether this evaluator can run in the given project.
33
+ * Return false if a required tool or config is missing so the
34
+ * registry can skip it gracefully.
35
+ */
36
+ canRun(projectRoot: string, config: BoberConfig): Promise<boolean>;
37
+ /**
38
+ * Execute the evaluation and return structured results.
39
+ * Must handle errors internally and never throw — return a
40
+ * failed EvalResult instead.
41
+ */
42
+ evaluate(context: EvalContext): Promise<EvalResult>;
43
+ }
44
+ /**
45
+ * Factory function signature for creating evaluator plugin instances.
46
+ * Custom plugins export a default factory so the loader can instantiate
47
+ * them with optional per-strategy configuration.
48
+ */
49
+ export type EvaluatorFactory = (config?: Record<string, unknown>) => EvaluatorPlugin;
50
+ //# sourceMappingURL=plugin-interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-interface.d.ts","sourceRoot":"","sources":["../../src/evaluators/plugin-interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGrE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AAIlF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,MAAM,EAAE,WAAW,CAAC;IACpB,0DAA0D;IAC1D,QAAQ,EAAE,cAAc,CAAC;IACzB,0EAA0E;IAC1E,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mEAAmE;IACnE,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B;;;;OAIG;IACH,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEnE;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACrD;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plugin-interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-interface.js","sourceRoot":"","sources":["../../src/evaluators/plugin-interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import type { EvaluatorPlugin } from "./plugin-interface.js";
2
+ /**
3
+ * Load a single evaluator plugin from a file path or npm package name.
4
+ *
5
+ * The module should either:
6
+ * - Export a default EvaluatorFactory function
7
+ * - Export a default EvaluatorPlugin instance
8
+ * - Export a named `createEvaluator` factory function
9
+ * - Export a named `plugin` instance
10
+ *
11
+ * Returns null (with a console warning) if loading fails.
12
+ */
13
+ export declare function loadPlugin(pluginPath: string, config?: Record<string, unknown>): Promise<EvaluatorPlugin | null>;
14
+ /**
15
+ * Load multiple evaluator plugins. Skips any that fail to load.
16
+ */
17
+ export declare function loadPlugins(paths: string[], config?: Record<string, unknown>): Promise<EvaluatorPlugin[]>;
18
+ //# sourceMappingURL=plugin-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../../src/evaluators/plugin-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,uBAAuB,CAAC;AA6C/E;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAkDjC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,eAAe,EAAE,CAAC,CAa5B"}
@@ -0,0 +1,107 @@
1
+ import { access } from "node:fs/promises";
2
+ import { resolve, isAbsolute } from "node:path";
3
+ // ── Validation ─────────────────────────────────────────────────────
4
+ /**
5
+ * Validate that a loaded module conforms to the EvaluatorPlugin interface.
6
+ */
7
+ function isEvaluatorPlugin(value) {
8
+ if (value === null || typeof value !== "object")
9
+ return false;
10
+ const obj = value;
11
+ return (typeof obj.name === "string" &&
12
+ typeof obj.description === "string" &&
13
+ typeof obj.canRun === "function" &&
14
+ typeof obj.evaluate === "function");
15
+ }
16
+ /**
17
+ * Validate that a loaded module exports a factory function.
18
+ */
19
+ function isEvaluatorFactory(value) {
20
+ return typeof value === "function";
21
+ }
22
+ // ── Loading ────────────────────────────────────────────────────────
23
+ /**
24
+ * Resolve a plugin path to an absolute path or npm package name.
25
+ *
26
+ * Supports:
27
+ * - Absolute paths: `/home/user/my-plugin.js`
28
+ * - Relative paths: `./plugins/my-plugin.js` (resolved from cwd)
29
+ * - npm package names: `bober-plugin-my-check`
30
+ */
31
+ function resolvePluginPath(pluginPath) {
32
+ if (isAbsolute(pluginPath))
33
+ return pluginPath;
34
+ if (pluginPath.startsWith("./") || pluginPath.startsWith("../")) {
35
+ return resolve(process.cwd(), pluginPath);
36
+ }
37
+ // Treat as npm package name — dynamic import will resolve it.
38
+ return pluginPath;
39
+ }
40
+ /**
41
+ * Load a single evaluator plugin from a file path or npm package name.
42
+ *
43
+ * The module should either:
44
+ * - Export a default EvaluatorFactory function
45
+ * - Export a default EvaluatorPlugin instance
46
+ * - Export a named `createEvaluator` factory function
47
+ * - Export a named `plugin` instance
48
+ *
49
+ * Returns null (with a console warning) if loading fails.
50
+ */
51
+ export async function loadPlugin(pluginPath, config) {
52
+ const resolved = resolvePluginPath(pluginPath);
53
+ // For file paths, verify the file exists before attempting dynamic import.
54
+ if (isAbsolute(resolved)) {
55
+ try {
56
+ await access(resolved);
57
+ }
58
+ catch {
59
+ console.warn(`[bober] Plugin file not found: ${resolved}`);
60
+ return null;
61
+ }
62
+ }
63
+ try {
64
+ const mod = await import(resolved);
65
+ // Try default export first.
66
+ const defaultExport = mod.default;
67
+ if (isEvaluatorPlugin(defaultExport)) {
68
+ return defaultExport;
69
+ }
70
+ if (isEvaluatorFactory(defaultExport)) {
71
+ const instance = defaultExport(config);
72
+ if (isEvaluatorPlugin(instance))
73
+ return instance;
74
+ console.warn(`[bober] Default factory from ${pluginPath} did not return a valid plugin.`);
75
+ return null;
76
+ }
77
+ // Try named exports.
78
+ if (isEvaluatorFactory(mod.createEvaluator)) {
79
+ const instance = mod.createEvaluator(config);
80
+ if (isEvaluatorPlugin(instance))
81
+ return instance;
82
+ }
83
+ if (isEvaluatorPlugin(mod.plugin)) {
84
+ return mod.plugin;
85
+ }
86
+ console.warn(`[bober] Plugin at ${pluginPath} does not export a valid EvaluatorPlugin or EvaluatorFactory.`);
87
+ return null;
88
+ }
89
+ catch (err) {
90
+ console.warn(`[bober] Failed to load plugin from ${pluginPath}: ${err instanceof Error ? err.message : String(err)}`);
91
+ return null;
92
+ }
93
+ }
94
+ /**
95
+ * Load multiple evaluator plugins. Skips any that fail to load.
96
+ */
97
+ export async function loadPlugins(paths, config) {
98
+ const results = await Promise.allSettled(paths.map((p) => loadPlugin(p, config)));
99
+ const plugins = [];
100
+ for (const result of results) {
101
+ if (result.status === "fulfilled" && result.value !== null) {
102
+ plugins.push(result.value);
103
+ }
104
+ }
105
+ return plugins;
106
+ }
107
+ //# sourceMappingURL=plugin-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../../src/evaluators/plugin-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import type { EvalResult } from "../contracts/eval-result.js";
2
+ import type { SprintContract } from "../contracts/sprint-contract.js";
3
+ import type { BoberConfig, EvalStrategy } from "../config/schema.js";
4
+ import type { EvaluatorPlugin } from "./plugin-interface.js";
5
+ /**
6
+ * The aggregate result of running all configured evaluators for a sprint.
7
+ */
8
+ export interface EvaluationRunResult {
9
+ /** Whether all *required* evaluators passed. */
10
+ passed: boolean;
11
+ /** Aggregate score (average of all evaluator scores). */
12
+ score: number;
13
+ /** Individual results from each evaluator. */
14
+ results: EvalResult[];
15
+ /** Human-readable summary. */
16
+ summary: string;
17
+ /** Timestamp when the evaluation completed. */
18
+ timestamp: string;
19
+ }
20
+ /**
21
+ * Maps strategy type names to evaluator plugin instances.
22
+ *
23
+ * Built-in evaluators are registered by default. Custom plugins loaded
24
+ * via the plugin-loader are added on top.
25
+ */
26
+ export declare class EvaluatorRegistry {
27
+ private readonly plugins;
28
+ /**
29
+ * Register an evaluator plugin under a given name.
30
+ * Overwrites any previously registered plugin with the same name.
31
+ */
32
+ register(name: string, plugin: EvaluatorPlugin): void;
33
+ /**
34
+ * Get a plugin by its registered name.
35
+ */
36
+ get(name: string): EvaluatorPlugin | undefined;
37
+ /**
38
+ * Check whether a plugin is registered under the given name.
39
+ */
40
+ has(name: string): boolean;
41
+ /**
42
+ * Return a read-only view of all registered plugins.
43
+ */
44
+ all(): ReadonlyMap<string, EvaluatorPlugin>;
45
+ /**
46
+ * Get the appropriate plugin for a given strategy.
47
+ *
48
+ * Resolution order:
49
+ * 1. If strategy has a `plugin` field → look up by plugin name
50
+ * 2. If strategy type matches a registered plugin → use it
51
+ * 3. If strategy has a `command` field → create an on-the-fly command runner
52
+ * 4. Otherwise → undefined (strategy will be skipped)
53
+ */
54
+ getForStrategy(strategy: EvalStrategy): EvaluatorPlugin | undefined;
55
+ /**
56
+ * List the names of all registered plugins that can run in the
57
+ * given project context.
58
+ */
59
+ listAvailable(projectRoot: string, config: BoberConfig): Promise<string[]>;
60
+ /**
61
+ * Return all registered plugin names.
62
+ */
63
+ listAll(): string[];
64
+ }
65
+ /**
66
+ * Create a registry pre-populated with all built-in evaluators.
67
+ * Optionally loads custom plugins from the config.
68
+ */
69
+ export declare function createDefaultRegistry(config?: BoberConfig): Promise<EvaluatorRegistry>;
70
+ /**
71
+ * Run all configured evaluation strategies and produce an aggregate result.
72
+ *
73
+ * Strategies are run sequentially to avoid resource contention (e.g. multiple
74
+ * build processes or test runners at once). Each strategy that doesn't have
75
+ * a matching plugin, or whose plugin can't run, is skipped with a warning.
76
+ */
77
+ export declare function runEvaluation(registry: EvaluatorRegistry, projectRoot: string, config: BoberConfig, contract: SprintContract, changedFiles: string[]): Promise<EvaluationRunResult>;
78
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/evaluators/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,uBAAuB,CAAC;AAa1E;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,gDAAgD;IAChD,MAAM,EAAE,OAAO,CAAC;IAChB,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;CACnB;AAID;;;;;GAKG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAE9D;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IAIrD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI9C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACH,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC;IAI3C;;;;;;;;OAQG;IACH,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,eAAe,GAAG,SAAS;IAqBnE;;;OAGG;IACG,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiBhF;;OAEG;IACH,OAAO,IAAI,MAAM,EAAE;CAGpB;AAID;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,iBAAiB,CAAC,CAoB5B;AAID;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,iBAAiB,EAC3B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,cAAc,EACxB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,mBAAmB,CAAC,CAgI9B"}