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,26 @@
1
+ import type { EvaluatorPlugin, EvalContext, EvalResult } from "../plugin-interface.js";
2
+ import type { BoberConfig } from "../../config/schema.js";
3
+ /**
4
+ * A generic evaluator that runs an arbitrary shell command.
5
+ *
6
+ * This powers two use cases:
7
+ * 1. Inline `command` field on any strategy (e.g. `{ "type": "k6", "command": "k6 run load.js", "required": false }`)
8
+ * 2. Fallback for unknown strategy types that have a `command` configured
9
+ *
10
+ * Pass criteria: exit code 0 = pass, non-zero = fail.
11
+ * Output is captured and parsed for common error patterns.
12
+ */
13
+ export declare class CommandRunnerEvaluator implements EvaluatorPlugin {
14
+ readonly name: string;
15
+ readonly description: string;
16
+ private readonly command;
17
+ private readonly timeout;
18
+ constructor(name: string, command: string, timeout?: number);
19
+ canRun(_projectRoot: string, _config: BoberConfig): Promise<boolean>;
20
+ evaluate(context: EvalContext): Promise<EvalResult>;
21
+ }
22
+ /**
23
+ * Factory: create a CommandRunnerEvaluator from a strategy's command field.
24
+ */
25
+ export declare function createCommandRunnerEvaluator(name: string, command: string, timeout?: number): CommandRunnerEvaluator;
26
+ //# sourceMappingURL=command-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-runner.d.ts","sourceRoot":"","sources":["../../../src/evaluators/builtin/command-runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,UAAU,EAEX,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;;;GASG;AACH,qBAAa,sBAAuB,YAAW,eAAe;IAC5D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,SAAU;IAOtD,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAMpE,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CA0F1D;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,sBAAsB,CAExB"}
@@ -0,0 +1,114 @@
1
+ import { execa } from "execa";
2
+ /**
3
+ * A generic evaluator that runs an arbitrary shell command.
4
+ *
5
+ * This powers two use cases:
6
+ * 1. Inline `command` field on any strategy (e.g. `{ "type": "k6", "command": "k6 run load.js", "required": false }`)
7
+ * 2. Fallback for unknown strategy types that have a `command` configured
8
+ *
9
+ * Pass criteria: exit code 0 = pass, non-zero = fail.
10
+ * Output is captured and parsed for common error patterns.
11
+ */
12
+ export class CommandRunnerEvaluator {
13
+ name;
14
+ description;
15
+ command;
16
+ timeout;
17
+ constructor(name, command, timeout = 120_000) {
18
+ this.name = name;
19
+ this.description = `Run command: ${command}`;
20
+ this.command = command;
21
+ this.timeout = timeout;
22
+ }
23
+ async canRun(_projectRoot, _config) {
24
+ // Command-based evaluators are always considered runnable.
25
+ // If the command itself doesn't exist, evaluate() handles the error.
26
+ return true;
27
+ }
28
+ async evaluate(context) {
29
+ const timestamp = new Date().toISOString();
30
+ const { projectRoot } = context;
31
+ const timeout = context.strategy.config?.["timeout"] ??
32
+ this.timeout;
33
+ const parts = this.command.split(/\s+/);
34
+ const cmd = parts[0];
35
+ const args = parts.slice(1);
36
+ try {
37
+ const result = await execa(cmd, args, {
38
+ cwd: projectRoot,
39
+ timeout,
40
+ reject: false,
41
+ all: true,
42
+ env: { ...process.env, FORCE_COLOR: "0" },
43
+ });
44
+ const output = result.all ?? result.stdout ?? "";
45
+ const passed = result.exitCode === 0;
46
+ const details = [];
47
+ if (!passed) {
48
+ // Try to extract meaningful error lines from the output
49
+ const lines = output.split("\n");
50
+ const errorLines = lines.filter((line) => /error|fail|fatal|panic|exception/i.test(line) &&
51
+ line.trim().length > 0);
52
+ if (errorLines.length > 0) {
53
+ for (const line of errorLines.slice(0, 20)) {
54
+ details.push({
55
+ criterion: this.name,
56
+ passed: false,
57
+ message: line.trim(),
58
+ severity: "error",
59
+ });
60
+ }
61
+ }
62
+ else {
63
+ // No specific errors found — include tail of output
64
+ const tail = lines.slice(-10).join("\n").trim();
65
+ details.push({
66
+ criterion: this.name,
67
+ passed: false,
68
+ message: tail || `Command exited with code ${result.exitCode}`,
69
+ severity: "error",
70
+ });
71
+ }
72
+ }
73
+ return {
74
+ evaluator: this.name,
75
+ passed,
76
+ score: passed ? 100 : 0,
77
+ details,
78
+ summary: passed
79
+ ? `${this.name}: passed`
80
+ : `${this.name}: failed (exit code ${result.exitCode ?? "unknown"})`,
81
+ feedback: passed
82
+ ? "Command completed successfully."
83
+ : `Command failed. Output:\n${(output ?? "").slice(-2000)}`,
84
+ timestamp,
85
+ };
86
+ }
87
+ catch (err) {
88
+ const message = err instanceof Error ? err.message : String(err);
89
+ return {
90
+ evaluator: this.name,
91
+ passed: false,
92
+ score: 0,
93
+ details: [
94
+ {
95
+ criterion: this.name,
96
+ passed: false,
97
+ message: `Failed to execute: ${message}`,
98
+ severity: "error",
99
+ },
100
+ ],
101
+ summary: `${this.name}: error — ${message}`,
102
+ feedback: `Could not run command "${this.command}": ${message}`,
103
+ timestamp,
104
+ };
105
+ }
106
+ }
107
+ }
108
+ /**
109
+ * Factory: create a CommandRunnerEvaluator from a strategy's command field.
110
+ */
111
+ export function createCommandRunnerEvaluator(name, command, timeout) {
112
+ return new CommandRunnerEvaluator(name, command, timeout);
113
+ }
114
+ //# sourceMappingURL=command-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-runner.js","sourceRoot":"","sources":["../../../src/evaluators/builtin/command-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { EvaluatorPlugin, EvalContext, EvalResult, BoberConfig } from "../plugin-interface.js";
2
+ export declare class LintEvaluator implements EvaluatorPlugin {
3
+ readonly name = "Lint";
4
+ readonly description = "Runs ESLint (or a custom lint command) and reports violations.";
5
+ canRun(projectRoot: string, config: BoberConfig): Promise<boolean>;
6
+ evaluate(context: EvalContext): Promise<EvalResult>;
7
+ private runEslintStructured;
8
+ private buildFromEslintResults;
9
+ private runGenericLint;
10
+ private buildFeedback;
11
+ private errorResult;
12
+ }
13
+ /**
14
+ * Factory function for the registry.
15
+ */
16
+ export declare function createLintEvaluator(): EvaluatorPlugin;
17
+ //# sourceMappingURL=lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../../src/evaluators/builtin/lint.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,UAAU,EAEV,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAmEhC,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,oEAAoE;IAElF,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlE,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;YAiB3C,mBAAmB;IAuEjC,OAAO,CAAC,sBAAsB;YAmDhB,cAAc;IAsD5B,OAAO,CAAC,aAAa;IAiCrB,OAAO,CAAC,WAAW;CAkBpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,eAAe,CAErD"}
@@ -0,0 +1,264 @@
1
+ import { access } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { execa } from "execa";
4
+ // ── ESLint config file candidates ──────────────────────────────────
5
+ const ESLINT_CONFIG_FILES = [
6
+ "eslint.config.js",
7
+ "eslint.config.mjs",
8
+ "eslint.config.cjs",
9
+ "eslint.config.ts",
10
+ ".eslintrc",
11
+ ".eslintrc.js",
12
+ ".eslintrc.cjs",
13
+ ".eslintrc.json",
14
+ ".eslintrc.yml",
15
+ ".eslintrc.yaml",
16
+ ];
17
+ async function hasEslintConfig(projectRoot) {
18
+ for (const candidate of ESLINT_CONFIG_FILES) {
19
+ try {
20
+ await access(join(projectRoot, candidate));
21
+ return true;
22
+ }
23
+ catch {
24
+ // not found
25
+ }
26
+ }
27
+ return false;
28
+ }
29
+ // ── Parser ─────────────────────────────────────────────────────────
30
+ function parseEslintJson(raw) {
31
+ // ESLint --format json outputs an array. Sometimes extra text
32
+ // precedes the JSON (e.g. deprecation warnings). Find the first '['.
33
+ const jsonStart = raw.indexOf("[");
34
+ if (jsonStart === -1)
35
+ return [];
36
+ try {
37
+ const parsed = JSON.parse(raw.slice(jsonStart));
38
+ if (!Array.isArray(parsed))
39
+ return [];
40
+ return parsed;
41
+ }
42
+ catch {
43
+ return [];
44
+ }
45
+ }
46
+ // ── Evaluator ──────────────────────────────────────────────────────
47
+ const DEFAULT_TIMEOUT_MS = 60_000;
48
+ export class LintEvaluator {
49
+ name = "Lint";
50
+ description = "Runs ESLint (or a custom lint command) and reports violations.";
51
+ async canRun(projectRoot, config) {
52
+ if (config.commands.lint)
53
+ return true;
54
+ return hasEslintConfig(projectRoot);
55
+ }
56
+ async evaluate(context) {
57
+ const { projectRoot, config, strategy } = context;
58
+ const timestamp = new Date().toISOString();
59
+ const timeout = strategy.config?.timeout ?? DEFAULT_TIMEOUT_MS;
60
+ // Prefer structured ESLint JSON output when no custom command is set.
61
+ const useStructuredEslint = !config.commands.lint || config.commands.lint.includes("eslint");
62
+ if (useStructuredEslint) {
63
+ return this.runEslintStructured(projectRoot, config, timeout, timestamp);
64
+ }
65
+ return this.runGenericLint(projectRoot, config, timeout, timestamp);
66
+ }
67
+ // ── Structured ESLint ──────────────────────────────────────────
68
+ async runEslintStructured(projectRoot, config, timeout, timestamp) {
69
+ // Build command. If config.commands.lint is set and contains "eslint",
70
+ // we append --format json. Otherwise default to npx eslint.
71
+ let cmd;
72
+ let args;
73
+ if (config.commands.lint) {
74
+ const parts = config.commands.lint.split(/\s+/);
75
+ cmd = parts[0];
76
+ args = [...parts.slice(1), "--format", "json"];
77
+ }
78
+ else {
79
+ cmd = "npx";
80
+ args = ["eslint", ".", "--format", "json"];
81
+ }
82
+ try {
83
+ const result = await execa(cmd, args, {
84
+ cwd: projectRoot,
85
+ timeout,
86
+ reject: false,
87
+ all: true,
88
+ });
89
+ const allOutput = result.all ?? result.stdout ?? "";
90
+ const eslintResults = parseEslintJson(allOutput);
91
+ // If we got structured results, use them.
92
+ if (eslintResults.length > 0) {
93
+ return this.buildFromEslintResults(eslintResults, timestamp);
94
+ }
95
+ // No structured results but exit code 0 => assume clean.
96
+ if (result.exitCode === 0) {
97
+ return {
98
+ evaluator: this.name,
99
+ passed: true,
100
+ score: 100,
101
+ details: [],
102
+ summary: "Linting passed with no issues.",
103
+ feedback: "No lint issues found.",
104
+ timestamp,
105
+ };
106
+ }
107
+ // Fallback: couldn't parse JSON, treat raw output as a single error.
108
+ return {
109
+ evaluator: this.name,
110
+ passed: false,
111
+ score: 0,
112
+ details: [
113
+ {
114
+ criterion: "Lint check",
115
+ passed: false,
116
+ message: allOutput.slice(0, 2000) || `Lint exited with code ${result.exitCode}`,
117
+ severity: "error",
118
+ },
119
+ ],
120
+ summary: "Linting failed.",
121
+ feedback: allOutput.slice(0, 2000),
122
+ timestamp,
123
+ };
124
+ }
125
+ catch (err) {
126
+ return this.errorResult(err, timestamp);
127
+ }
128
+ }
129
+ buildFromEslintResults(results, timestamp) {
130
+ let totalErrors = 0;
131
+ let totalWarnings = 0;
132
+ const details = [];
133
+ for (const file of results) {
134
+ totalErrors += file.errorCount;
135
+ totalWarnings += file.warningCount;
136
+ for (const msg of file.messages) {
137
+ details.push({
138
+ criterion: msg.ruleId ? `lint/${msg.ruleId}` : "lint/unknown",
139
+ passed: false,
140
+ message: msg.message,
141
+ file: file.filePath,
142
+ line: msg.line,
143
+ severity: msg.severity === 2 ? "error" : "warning",
144
+ });
145
+ }
146
+ }
147
+ const passed = totalErrors === 0;
148
+ const totalIssues = totalErrors + totalWarnings;
149
+ const score = totalIssues === 0
150
+ ? 100
151
+ : Math.max(0, Math.round(100 - (totalErrors * 10 + totalWarnings * 2)));
152
+ const summary = totalIssues === 0
153
+ ? "Linting passed with no issues."
154
+ : `Linting found ${totalErrors} error(s) and ${totalWarnings} warning(s).`;
155
+ const feedback = this.buildFeedback(details);
156
+ return {
157
+ evaluator: this.name,
158
+ passed,
159
+ score,
160
+ details,
161
+ summary,
162
+ feedback,
163
+ timestamp,
164
+ };
165
+ }
166
+ // ── Generic lint command ───────────────────────────────────────
167
+ async runGenericLint(projectRoot, config, timeout, timestamp) {
168
+ const command = config.commands.lint;
169
+ const [cmd, ...args] = command.split(/\s+/);
170
+ try {
171
+ const result = await execa(cmd, args, {
172
+ cwd: projectRoot,
173
+ timeout,
174
+ reject: false,
175
+ all: true,
176
+ });
177
+ const allOutput = result.all ?? result.stdout ?? "";
178
+ if (result.exitCode === 0) {
179
+ return {
180
+ evaluator: this.name,
181
+ passed: true,
182
+ score: 100,
183
+ details: [],
184
+ summary: "Linting passed with no issues.",
185
+ feedback: "No lint issues found.",
186
+ timestamp,
187
+ };
188
+ }
189
+ return {
190
+ evaluator: this.name,
191
+ passed: false,
192
+ score: 0,
193
+ details: [
194
+ {
195
+ criterion: "Lint check",
196
+ passed: false,
197
+ message: allOutput.slice(0, 2000) || `Lint exited with code ${result.exitCode}`,
198
+ severity: "error",
199
+ },
200
+ ],
201
+ summary: "Linting failed.",
202
+ feedback: allOutput.slice(0, 2000),
203
+ timestamp,
204
+ };
205
+ }
206
+ catch (err) {
207
+ return this.errorResult(err, timestamp);
208
+ }
209
+ }
210
+ // ── Helpers ────────────────────────────────────────────────────
211
+ buildFeedback(details) {
212
+ if (details.length === 0)
213
+ return "No lint issues found.";
214
+ const errors = details.filter((d) => d.severity === "error");
215
+ const warnings = details.filter((d) => d.severity === "warning");
216
+ const lines = ["Fix the following lint issues:", ""];
217
+ if (errors.length > 0) {
218
+ lines.push("Errors (must fix):");
219
+ for (const e of errors.slice(0, 20)) {
220
+ const loc = e.file ? ` ${e.file}${e.line ? `:${e.line}` : ""}` : " (unknown file)";
221
+ lines.push(`${loc}: ${e.message} [${e.criterion}]`);
222
+ }
223
+ if (errors.length > 20) {
224
+ lines.push(` ... and ${errors.length - 20} more errors`);
225
+ }
226
+ }
227
+ if (warnings.length > 0) {
228
+ lines.push("", "Warnings (should fix):");
229
+ for (const w of warnings.slice(0, 10)) {
230
+ const loc = w.file ? ` ${w.file}${w.line ? `:${w.line}` : ""}` : " (unknown file)";
231
+ lines.push(`${loc}: ${w.message} [${w.criterion}]`);
232
+ }
233
+ if (warnings.length > 10) {
234
+ lines.push(` ... and ${warnings.length - 10} more warnings`);
235
+ }
236
+ }
237
+ return lines.join("\n");
238
+ }
239
+ errorResult(err, timestamp) {
240
+ return {
241
+ evaluator: this.name,
242
+ passed: false,
243
+ score: 0,
244
+ details: [
245
+ {
246
+ criterion: "Lint execution",
247
+ passed: false,
248
+ message: err instanceof Error ? err.message : String(err),
249
+ severity: "error",
250
+ },
251
+ ],
252
+ summary: "Lint check failed to execute.",
253
+ feedback: `The lint command could not be run: ${err instanceof Error ? err.message : String(err)}`,
254
+ timestamp,
255
+ };
256
+ }
257
+ }
258
+ /**
259
+ * Factory function for the registry.
260
+ */
261
+ export function createLintEvaluator() {
262
+ return new LintEvaluator();
263
+ }
264
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../../src/evaluators/builtin/lint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { EvaluatorPlugin, EvalContext, EvalResult, BoberConfig } from "../plugin-interface.js";
2
+ export declare class PlaywrightEvaluator implements EvaluatorPlugin {
3
+ readonly name = "Playwright E2E";
4
+ readonly description = "Runs Playwright end-to-end tests and reports results.";
5
+ canRun(projectRoot: string, _config: BoberConfig): Promise<boolean>;
6
+ evaluate(context: EvalContext): Promise<EvalResult>;
7
+ private runPlaywright;
8
+ private buildFromReport;
9
+ private buildFeedback;
10
+ private errorResult;
11
+ }
12
+ /**
13
+ * Factory function for the registry.
14
+ */
15
+ export declare function createPlaywrightEvaluator(): EvaluatorPlugin;
16
+ //# sourceMappingURL=playwright.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../../../src/evaluators/builtin/playwright.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,UAAU,EAEV,WAAW,EACZ,MAAM,wBAAwB,CAAC;AA6IhC,qBAAa,mBAAoB,YAAW,eAAe;IACzD,QAAQ,CAAC,IAAI,oBAAoB;IACjC,QAAQ,CAAC,WAAW,2DAA2D;IAEzE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAInE,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;YAsB3C,aAAa;IAsE3B,OAAO,CAAC,eAAe;IAuDvB,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,WAAW;CAkBpB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,eAAe,CAE3D"}