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 { createTypescriptCheckEvaluator } from "./builtin/typescript-check.js";
2
+ import { createLintEvaluator } from "./builtin/lint.js";
3
+ import { createUnitTestEvaluator } from "./builtin/unit-test.js";
4
+ import { createPlaywrightEvaluator } from "./builtin/playwright.js";
5
+ import { createApiCheckEvaluator } from "./builtin/api-check.js";
6
+ import { createBuildCheckEvaluator } from "./builtin/build-check.js";
7
+ import { createCommandRunnerEvaluator } from "./builtin/command-runner.js";
8
+ import { loadPlugins } from "./plugin-loader.js";
9
+ // ── Registry ───────────────────────────────────────────────────────
10
+ /**
11
+ * Maps strategy type names to evaluator plugin instances.
12
+ *
13
+ * Built-in evaluators are registered by default. Custom plugins loaded
14
+ * via the plugin-loader are added on top.
15
+ */
16
+ export class EvaluatorRegistry {
17
+ plugins = new Map();
18
+ /**
19
+ * Register an evaluator plugin under a given name.
20
+ * Overwrites any previously registered plugin with the same name.
21
+ */
22
+ register(name, plugin) {
23
+ this.plugins.set(name, plugin);
24
+ }
25
+ /**
26
+ * Get a plugin by its registered name.
27
+ */
28
+ get(name) {
29
+ return this.plugins.get(name);
30
+ }
31
+ /**
32
+ * Check whether a plugin is registered under the given name.
33
+ */
34
+ has(name) {
35
+ return this.plugins.has(name);
36
+ }
37
+ /**
38
+ * Return a read-only view of all registered plugins.
39
+ */
40
+ all() {
41
+ return this.plugins;
42
+ }
43
+ /**
44
+ * Get the appropriate plugin for a given strategy.
45
+ *
46
+ * Resolution order:
47
+ * 1. If strategy has a `plugin` field → look up by plugin name
48
+ * 2. If strategy type matches a registered plugin → use it
49
+ * 3. If strategy has a `command` field → create an on-the-fly command runner
50
+ * 4. Otherwise → undefined (strategy will be skipped)
51
+ */
52
+ getForStrategy(strategy) {
53
+ // Explicit plugin reference (e.g. type:"custom" + plugin:"./my-eval.ts")
54
+ if (strategy.plugin && this.plugins.has(strategy.plugin)) {
55
+ return this.plugins.get(strategy.plugin);
56
+ }
57
+ // Built-in or previously registered plugin
58
+ if (this.plugins.has(strategy.type)) {
59
+ return this.plugins.get(strategy.type);
60
+ }
61
+ // Inline command shorthand (e.g. type:"k6", command:"k6 run load.js")
62
+ if (strategy.command) {
63
+ const label = strategy.label ?? strategy.type;
64
+ const timeout = strategy.config?.["timeout"] ?? 120_000;
65
+ return createCommandRunnerEvaluator(label, strategy.command, timeout);
66
+ }
67
+ return undefined;
68
+ }
69
+ /**
70
+ * List the names of all registered plugins that can run in the
71
+ * given project context.
72
+ */
73
+ async listAvailable(projectRoot, config) {
74
+ const available = [];
75
+ for (const [name, plugin] of this.plugins) {
76
+ try {
77
+ const canRun = await plugin.canRun(projectRoot, config);
78
+ if (canRun) {
79
+ available.push(name);
80
+ }
81
+ }
82
+ catch {
83
+ // If canRun throws, skip this plugin.
84
+ }
85
+ }
86
+ return available;
87
+ }
88
+ /**
89
+ * Return all registered plugin names.
90
+ */
91
+ listAll() {
92
+ return [...this.plugins.keys()];
93
+ }
94
+ }
95
+ // ── Default Registry Factory ───────────────────────────────────────
96
+ /**
97
+ * Create a registry pre-populated with all built-in evaluators.
98
+ * Optionally loads custom plugins from the config.
99
+ */
100
+ export async function createDefaultRegistry(config) {
101
+ const registry = new EvaluatorRegistry();
102
+ // Register all built-in evaluators.
103
+ registry.register("typecheck", createTypescriptCheckEvaluator());
104
+ registry.register("lint", createLintEvaluator());
105
+ registry.register("unit-test", createUnitTestEvaluator());
106
+ registry.register("playwright", createPlaywrightEvaluator());
107
+ registry.register("api-check", createApiCheckEvaluator());
108
+ registry.register("build", createBuildCheckEvaluator());
109
+ // Load custom plugins if configured.
110
+ if (config?.evaluator.plugins && config.evaluator.plugins.length > 0) {
111
+ const customPlugins = await loadPlugins(config.evaluator.plugins);
112
+ for (const plugin of customPlugins) {
113
+ registry.register(plugin.name, plugin);
114
+ }
115
+ }
116
+ return registry;
117
+ }
118
+ // ── Evaluation Runner ──────────────────────────────────────────────
119
+ /**
120
+ * Run all configured evaluation strategies and produce an aggregate result.
121
+ *
122
+ * Strategies are run sequentially to avoid resource contention (e.g. multiple
123
+ * build processes or test runners at once). Each strategy that doesn't have
124
+ * a matching plugin, or whose plugin can't run, is skipped with a warning.
125
+ */
126
+ export async function runEvaluation(registry, projectRoot, config, contract, changedFiles) {
127
+ const results = [];
128
+ const strategies = config.evaluator.strategies;
129
+ for (const strategy of strategies) {
130
+ const plugin = registry.getForStrategy(strategy);
131
+ if (!plugin) {
132
+ console.warn(`[bober] No evaluator registered for strategy "${strategy.type}"${strategy.plugin ? ` (plugin: ${strategy.plugin})` : ""}. Skipping.`);
133
+ results.push({
134
+ evaluator: strategy.type,
135
+ passed: !strategy.required,
136
+ score: strategy.required ? 0 : undefined,
137
+ details: [
138
+ {
139
+ criterion: "Plugin availability",
140
+ passed: false,
141
+ message: `No evaluator plugin found for strategy "${strategy.type}".`,
142
+ severity: strategy.required ? "error" : "warning",
143
+ },
144
+ ],
145
+ summary: `Evaluator for "${strategy.type}" not found.`,
146
+ feedback: strategy.required
147
+ ? `Required evaluator "${strategy.type}" is not available. Install the plugin or remove it from the config.`
148
+ : `Optional evaluator "${strategy.type}" is not available. Skipped.`,
149
+ timestamp: new Date().toISOString(),
150
+ });
151
+ continue;
152
+ }
153
+ // Check if the plugin can run in this project.
154
+ let canRun = false;
155
+ try {
156
+ canRun = await plugin.canRun(projectRoot, config);
157
+ }
158
+ catch (err) {
159
+ console.warn(`[bober] Error checking if "${plugin.name}" can run: ${err instanceof Error ? err.message : String(err)}`);
160
+ }
161
+ if (!canRun) {
162
+ results.push({
163
+ evaluator: plugin.name,
164
+ passed: !strategy.required,
165
+ score: strategy.required ? 0 : undefined,
166
+ details: [
167
+ {
168
+ criterion: "Plugin prerequisites",
169
+ passed: false,
170
+ message: `"${plugin.name}" cannot run in this project (missing prerequisites).`,
171
+ severity: strategy.required ? "error" : "info",
172
+ },
173
+ ],
174
+ summary: `"${plugin.name}" skipped (prerequisites not met).`,
175
+ feedback: strategy.required
176
+ ? `Required evaluator "${plugin.name}" cannot run. Check that the necessary tools and config files are present.`
177
+ : `Optional evaluator "${plugin.name}" skipped.`,
178
+ timestamp: new Date().toISOString(),
179
+ });
180
+ continue;
181
+ }
182
+ // Run the evaluator.
183
+ const context = {
184
+ projectRoot,
185
+ config,
186
+ contract,
187
+ changedFiles,
188
+ strategy,
189
+ };
190
+ try {
191
+ const result = await plugin.evaluate(context);
192
+ results.push(result);
193
+ }
194
+ catch (err) {
195
+ // Evaluators should never throw, but guard against it anyway.
196
+ results.push({
197
+ evaluator: plugin.name,
198
+ passed: false,
199
+ score: 0,
200
+ details: [
201
+ {
202
+ criterion: "Evaluator execution",
203
+ passed: false,
204
+ message: `Unexpected error: ${err instanceof Error ? err.message : String(err)}`,
205
+ severity: "error",
206
+ },
207
+ ],
208
+ summary: `"${plugin.name}" threw an unexpected error.`,
209
+ feedback: `The evaluator "${plugin.name}" crashed: ${err instanceof Error ? err.message : String(err)}`,
210
+ timestamp: new Date().toISOString(),
211
+ });
212
+ }
213
+ }
214
+ // Compute aggregate.
215
+ const requiredStrategies = strategies.filter((s) => s.required);
216
+ const requiredResults = results.filter((_r, i) => strategies[i]?.required === true);
217
+ const allRequiredPassed = requiredResults.every((r) => r.passed);
218
+ const scoredResults = results.filter((r) => r.score !== undefined);
219
+ const avgScore = scoredResults.length > 0
220
+ ? Math.round(scoredResults.reduce((sum, r) => sum + (r.score ?? 0), 0) /
221
+ scoredResults.length)
222
+ : 0;
223
+ const passedCount = results.filter((r) => r.passed).length;
224
+ const totalCount = results.length;
225
+ const summaryParts = [
226
+ `Evaluation complete: ${passedCount}/${totalCount} evaluators passed`,
227
+ `(${requiredResults.filter((r) => r.passed).length}/${requiredStrategies.length} required)`,
228
+ `Score: ${avgScore}/100`,
229
+ ];
230
+ return {
231
+ passed: allRequiredPassed,
232
+ score: avgScore,
233
+ results,
234
+ summary: summaryParts.join(". "),
235
+ timestamp: new Date().toISOString(),
236
+ };
237
+ }
238
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/evaluators/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export { type BoberConfig, type ProjectMode, type Stack, type ModelChoice, type EvalStrategy, type EvalStrategyType, StackSchema, ProjectModeSchema, createDefaultConfig, } from "./config/schema.js";
2
+ export { loadConfig, configExists } from "./config/loader.js";
3
+ export { getDefaults, getPresetNames } from "./config/defaults.js";
4
+ export { type SprintContract, type SuccessCriterion, type ContractStatus, createContract, updateContractStatus, } from "./contracts/sprint-contract.js";
5
+ export { type PlanSpec, type FeatureSpec, createSpec, } from "./contracts/spec.js";
6
+ export { type EvalResult, type EvalDetail, type SprintEvaluation as ContractSprintEvaluation, aggregateResults, formatFeedback, } from "./contracts/eval-result.js";
7
+ export { type ContextHandoff, type Decision, type ProjectContext, createHandoff, serializeHandoff, summarizeOlderSprints, } from "./orchestrator/context-handoff.js";
8
+ export { runPlanner } from "./orchestrator/planner-agent.js";
9
+ export { runGenerator, type GeneratorResult, } from "./orchestrator/generator-agent.js";
10
+ export { runEvaluatorAgent } from "./orchestrator/evaluator-agent.js";
11
+ export { runPipeline, type PipelineResult, } from "./orchestrator/pipeline.js";
12
+ export { EvaluatorRegistry, createDefaultRegistry, runEvaluation, type EvaluationRunResult, } from "./evaluators/registry.js";
13
+ export type { EvaluatorPlugin, EvaluatorFactory, EvalContext, } from "./evaluators/plugin-interface.js";
14
+ export { ensureBoberDir, saveContract, loadContract, listContracts, updateContract, saveSpec, loadSpec, loadLatestSpec, listSpecs, appendHistory, loadHistory, } from "./state/index.js";
15
+ export { logger, Logger } from "./utils/logger.js";
16
+ export { findProjectRoot } from "./utils/fs.js";
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,KAAK,EACV,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,WAAW,EACX,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAInE,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,cAAc,EACd,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,UAAU,GACX,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,gBAAgB,IAAI,wBAAwB,EACjD,gBAAgB,EAChB,cAAc,GACf,MAAM,4BAA4B,CAAC;AAIpC,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,cAAc,EACnB,aAAa,EACb,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,EACL,YAAY,EACZ,KAAK,eAAe,GACrB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,OAAO,EACL,WAAW,EACX,KAAK,cAAc,GACpB,MAAM,4BAA4B,CAAC;AAIpC,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,KAAK,mBAAmB,GACzB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,WAAW,GACZ,MAAM,kCAAkC,CAAC;AAI1C,OAAO,EACL,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,SAAS,EACT,aAAa,EACb,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,22 @@
1
+ // ── Config ─────────────────────────────────────────────────────────
2
+ export { StackSchema, ProjectModeSchema, createDefaultConfig, } from "./config/schema.js";
3
+ export { loadConfig, configExists } from "./config/loader.js";
4
+ export { getDefaults, getPresetNames } from "./config/defaults.js";
5
+ // ── Contracts ──────────────────────────────────────────────────────
6
+ export { createContract, updateContractStatus, } from "./contracts/sprint-contract.js";
7
+ export { createSpec, } from "./contracts/spec.js";
8
+ export { aggregateResults, formatFeedback, } from "./contracts/eval-result.js";
9
+ // ── Orchestrator ───────────────────────────────────────────────────
10
+ export { createHandoff, serializeHandoff, summarizeOlderSprints, } from "./orchestrator/context-handoff.js";
11
+ export { runPlanner } from "./orchestrator/planner-agent.js";
12
+ export { runGenerator, } from "./orchestrator/generator-agent.js";
13
+ export { runEvaluatorAgent } from "./orchestrator/evaluator-agent.js";
14
+ export { runPipeline, } from "./orchestrator/pipeline.js";
15
+ // ── Evaluators ─────────────────────────────────────────────────────
16
+ export { EvaluatorRegistry, createDefaultRegistry, runEvaluation, } from "./evaluators/registry.js";
17
+ // ── State ──────────────────────────────────────────────────────────
18
+ export { ensureBoberDir, saveContract, loadContract, listContracts, updateContract, saveSpec, loadSpec, loadLatestSpec, listSpecs, appendHistory, loadHistory, } from "./state/index.js";
19
+ // ── Utils ──────────────────────────────────────────────────────────
20
+ export { logger, Logger } from "./utils/logger.js";
21
+ export { findProjectRoot } from "./utils/fs.js";
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,OAAO,EAOL,WAAW,EACX,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEnE,sEAAsE;AAEtE,OAAO,EAIL,cAAc,EACd,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAGL,UAAU,GACX,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAIL,gBAAgB,EAChB,cAAc,GACf,MAAM,4BAA4B,CAAC;AAEpC,sEAAsE;AAEtE,OAAO,EAIL,aAAa,EACb,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,EACL,YAAY,GAEb,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,OAAO,EACL,WAAW,GAEZ,MAAM,4BAA4B,CAAC;AAEpC,sEAAsE;AAEtE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,GAEd,MAAM,0BAA0B,CAAC;AAQlC,sEAAsE;AAEtE,OAAO,EACL,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,SAAS,EACT,aAAa,EACb,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAE1B,sEAAsE;AAEtE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}