agent-bober 0.6.2 → 0.8.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.
- package/README.md +220 -30
- package/dist/cli/commands/eval.d.ts +2 -0
- package/dist/cli/commands/eval.d.ts.map +1 -1
- package/dist/cli/commands/eval.js +10 -0
- package/dist/cli/commands/eval.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +357 -62
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/plan.d.ts +2 -0
- package/dist/cli/commands/plan.d.ts.map +1 -1
- package/dist/cli/commands/plan.js +10 -0
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/run.d.ts +2 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +10 -0
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/sprint.d.ts +2 -0
- package/dist/cli/commands/sprint.d.ts.map +1 -1
- package/dist/cli/commands/sprint.js +10 -0
- package/dist/cli/commands/sprint.js.map +1 -1
- package/dist/cli/index.js +22 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/config/schema.d.ts +160 -43
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +11 -7
- package/dist/config/schema.js.map +1 -1
- package/dist/contracts/sprint-contract.d.ts +8 -8
- package/dist/discovery/config-generator.d.ts +28 -0
- package/dist/discovery/config-generator.d.ts.map +1 -0
- package/dist/discovery/config-generator.js +225 -0
- package/dist/discovery/config-generator.js.map +1 -0
- package/dist/discovery/index.d.ts +20 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +19 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/scanner.d.ts +17 -0
- package/dist/discovery/scanner.d.ts.map +1 -0
- package/dist/discovery/scanner.js +120 -0
- package/dist/discovery/scanner.js.map +1 -0
- package/dist/discovery/scanners/ci-checks.d.ts +10 -0
- package/dist/discovery/scanners/ci-checks.d.ts.map +1 -0
- package/dist/discovery/scanners/ci-checks.js +169 -0
- package/dist/discovery/scanners/ci-checks.js.map +1 -0
- package/dist/discovery/scanners/code-conventions.d.ts +12 -0
- package/dist/discovery/scanners/code-conventions.d.ts.map +1 -0
- package/dist/discovery/scanners/code-conventions.js +216 -0
- package/dist/discovery/scanners/code-conventions.js.map +1 -0
- package/dist/discovery/scanners/documentation.d.ts +17 -0
- package/dist/discovery/scanners/documentation.d.ts.map +1 -0
- package/dist/discovery/scanners/documentation.js +92 -0
- package/dist/discovery/scanners/documentation.js.map +1 -0
- package/dist/discovery/scanners/git-conventions.d.ts +11 -0
- package/dist/discovery/scanners/git-conventions.d.ts.map +1 -0
- package/dist/discovery/scanners/git-conventions.js +128 -0
- package/dist/discovery/scanners/git-conventions.js.map +1 -0
- package/dist/discovery/scanners/package-scripts.d.ts +9 -0
- package/dist/discovery/scanners/package-scripts.d.ts.map +1 -0
- package/dist/discovery/scanners/package-scripts.js +112 -0
- package/dist/discovery/scanners/package-scripts.js.map +1 -0
- package/dist/discovery/scanners/test-conventions.d.ts +9 -0
- package/dist/discovery/scanners/test-conventions.d.ts.map +1 -0
- package/dist/discovery/scanners/test-conventions.js +231 -0
- package/dist/discovery/scanners/test-conventions.js.map +1 -0
- package/dist/discovery/synthesizer.d.ts +30 -0
- package/dist/discovery/synthesizer.d.ts.map +1 -0
- package/dist/discovery/synthesizer.js +348 -0
- package/dist/discovery/synthesizer.js.map +1 -0
- package/dist/discovery/types.d.ts +160 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +9 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.d.ts +4 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +4 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/run-manager.d.ts +47 -0
- package/dist/mcp/run-manager.d.ts.map +1 -0
- package/dist/mcp/run-manager.js +79 -0
- package/dist/mcp/run-manager.js.map +1 -0
- package/dist/mcp/server.d.ts +15 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +107 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/config.d.ts +2 -0
- package/dist/mcp/tools/config.d.ts.map +1 -0
- package/dist/mcp/tools/config.js +153 -0
- package/dist/mcp/tools/config.js.map +1 -0
- package/dist/mcp/tools/contracts.d.ts +2 -0
- package/dist/mcp/tools/contracts.d.ts.map +1 -0
- package/dist/mcp/tools/contracts.js +61 -0
- package/dist/mcp/tools/contracts.js.map +1 -0
- package/dist/mcp/tools/eval.d.ts +2 -0
- package/dist/mcp/tools/eval.d.ts.map +1 -0
- package/dist/mcp/tools/eval.js +157 -0
- package/dist/mcp/tools/eval.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +20 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +47 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/init.d.ts +2 -0
- package/dist/mcp/tools/init.d.ts.map +1 -0
- package/dist/mcp/tools/init.js +222 -0
- package/dist/mcp/tools/init.js.map +1 -0
- package/dist/mcp/tools/plan.d.ts +2 -0
- package/dist/mcp/tools/plan.d.ts.map +1 -0
- package/dist/mcp/tools/plan.js +97 -0
- package/dist/mcp/tools/plan.js.map +1 -0
- package/dist/mcp/tools/principles.d.ts +2 -0
- package/dist/mcp/tools/principles.d.ts.map +1 -0
- package/dist/mcp/tools/principles.js +66 -0
- package/dist/mcp/tools/principles.js.map +1 -0
- package/dist/mcp/tools/registry.d.ts +45 -0
- package/dist/mcp/tools/registry.d.ts.map +1 -0
- package/dist/mcp/tools/registry.js +23 -0
- package/dist/mcp/tools/registry.js.map +1 -0
- package/dist/mcp/tools/run.d.ts +2 -0
- package/dist/mcp/tools/run.d.ts.map +1 -0
- package/dist/mcp/tools/run.js +66 -0
- package/dist/mcp/tools/run.js.map +1 -0
- package/dist/mcp/tools/spec.d.ts +2 -0
- package/dist/mcp/tools/spec.d.ts.map +1 -0
- package/dist/mcp/tools/spec.js +32 -0
- package/dist/mcp/tools/spec.js.map +1 -0
- package/dist/mcp/tools/sprint.d.ts +2 -0
- package/dist/mcp/tools/sprint.d.ts.map +1 -0
- package/dist/mcp/tools/sprint.js +243 -0
- package/dist/mcp/tools/sprint.js.map +1 -0
- package/dist/mcp/tools/status.d.ts +2 -0
- package/dist/mcp/tools/status.d.ts.map +1 -0
- package/dist/mcp/tools/status.js +76 -0
- package/dist/mcp/tools/status.js.map +1 -0
- package/dist/orchestrator/agentic-loop.d.ts +7 -6
- package/dist/orchestrator/agentic-loop.d.ts.map +1 -1
- package/dist/orchestrator/agentic-loop.js +33 -40
- package/dist/orchestrator/agentic-loop.js.map +1 -1
- package/dist/orchestrator/context-handoff.d.ts +20 -20
- package/dist/orchestrator/evaluator-agent.d.ts.map +1 -1
- package/dist/orchestrator/evaluator-agent.js +2 -2
- package/dist/orchestrator/evaluator-agent.js.map +1 -1
- package/dist/orchestrator/generator-agent.d.ts.map +1 -1
- package/dist/orchestrator/generator-agent.js +2 -2
- package/dist/orchestrator/generator-agent.js.map +1 -1
- package/dist/orchestrator/model-resolver.d.ts +35 -4
- package/dist/orchestrator/model-resolver.d.ts.map +1 -1
- package/dist/orchestrator/model-resolver.js +68 -15
- package/dist/orchestrator/model-resolver.js.map +1 -1
- package/dist/orchestrator/planner-agent.d.ts.map +1 -1
- package/dist/orchestrator/planner-agent.js +2 -2
- package/dist/orchestrator/planner-agent.js.map +1 -1
- package/dist/orchestrator/tools/index.d.ts +3 -4
- package/dist/orchestrator/tools/index.d.ts.map +1 -1
- package/dist/orchestrator/tools/index.js.map +1 -1
- package/dist/orchestrator/tools/schemas.d.ts +11 -12
- package/dist/orchestrator/tools/schemas.d.ts.map +1 -1
- package/dist/orchestrator/tools/schemas.js +3 -2
- package/dist/orchestrator/tools/schemas.js.map +1 -1
- package/dist/providers/anthropic.d.ts +15 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +133 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/factory.d.ts +37 -0
- package/dist/providers/factory.d.ts.map +1 -0
- package/dist/providers/factory.js +119 -0
- package/dist/providers/factory.js.map +1 -0
- package/dist/providers/google.d.ts +39 -0
- package/dist/providers/google.d.ts.map +1 -0
- package/dist/providers/google.js +195 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/index.d.ts +7 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +6 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai-compat.d.ts +39 -0
- package/dist/providers/openai-compat.d.ts.map +1 -0
- package/dist/providers/openai-compat.js +42 -0
- package/dist/providers/openai-compat.js.map +1 -0
- package/dist/providers/openai.d.ts +41 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +205 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +144 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +8 -0
- package/dist/providers/types.js.map +1 -0
- package/package.json +22 -4
- package/skills/bober.principles/SKILL.md +36 -3
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// ── bober_config tool ─────────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// No args -> read and return bober.config.json as-is.
|
|
4
|
+
// With { key, value } -> update a specific dot-path field and write back.
|
|
5
|
+
// e.g. key="generator.model", value="opus"
|
|
6
|
+
import { readFile, writeFile, access } from "node:fs/promises";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { constants } from "node:fs";
|
|
9
|
+
import { cwd } from "node:process";
|
|
10
|
+
import { registerTool } from "./registry.js";
|
|
11
|
+
// ── Helpers ───────────────────────────────────────────────────────────
|
|
12
|
+
const CONFIG_CANDIDATES = ["bober.config.json", ".bober/config.json"];
|
|
13
|
+
async function findConfigPath(projectRoot) {
|
|
14
|
+
for (const candidate of CONFIG_CANDIDATES) {
|
|
15
|
+
const fullPath = join(projectRoot, candidate);
|
|
16
|
+
try {
|
|
17
|
+
await access(fullPath, constants.R_OK);
|
|
18
|
+
return fullPath;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// not found, try next
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Set a value at a dot-separated path inside a plain object.
|
|
28
|
+
* Creates intermediate objects as needed.
|
|
29
|
+
* Returns the mutated object (same reference).
|
|
30
|
+
*/
|
|
31
|
+
function setNestedValue(obj, dotPath, value) {
|
|
32
|
+
const parts = dotPath.split(".");
|
|
33
|
+
let cursor = obj;
|
|
34
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
35
|
+
const part = parts[i];
|
|
36
|
+
if (cursor[part] === undefined ||
|
|
37
|
+
cursor[part] === null ||
|
|
38
|
+
typeof cursor[part] !== "object" ||
|
|
39
|
+
Array.isArray(cursor[part])) {
|
|
40
|
+
cursor[part] = {};
|
|
41
|
+
}
|
|
42
|
+
cursor = cursor[part];
|
|
43
|
+
}
|
|
44
|
+
const lastPart = parts[parts.length - 1];
|
|
45
|
+
cursor[lastPart] = value;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Attempt to coerce a string value to a more appropriate JSON type.
|
|
49
|
+
* "true"/"false" -> boolean, numeric strings -> number, else keep as string.
|
|
50
|
+
*/
|
|
51
|
+
function coerceValue(raw) {
|
|
52
|
+
if (raw === "true")
|
|
53
|
+
return true;
|
|
54
|
+
if (raw === "false")
|
|
55
|
+
return false;
|
|
56
|
+
const n = Number(raw);
|
|
57
|
+
if (!isNaN(n) && raw.trim() !== "")
|
|
58
|
+
return n;
|
|
59
|
+
return raw;
|
|
60
|
+
}
|
|
61
|
+
// ── Registration ─────────────────────────────────────────────────────
|
|
62
|
+
export function registerConfigTool() {
|
|
63
|
+
registerTool({
|
|
64
|
+
name: "bober_config",
|
|
65
|
+
description: "Read or update the Bober project configuration (bober.config.json). " +
|
|
66
|
+
"Without arguments returns the full config as JSON. " +
|
|
67
|
+
"With key and value, updates a specific config field using dot-notation " +
|
|
68
|
+
"(e.g. key='generator.model', value='opus'). " +
|
|
69
|
+
"Numeric and boolean values are coerced automatically.",
|
|
70
|
+
inputSchema: {
|
|
71
|
+
type: "object",
|
|
72
|
+
properties: {
|
|
73
|
+
key: {
|
|
74
|
+
type: "string",
|
|
75
|
+
description: "Dot-separated config path to update (e.g. generator.model, evaluator.maxIterations).",
|
|
76
|
+
},
|
|
77
|
+
value: {
|
|
78
|
+
type: "string",
|
|
79
|
+
description: "New value for the key. Numbers and booleans are coerced automatically.",
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
additionalProperties: false,
|
|
83
|
+
},
|
|
84
|
+
handler: async (args) => {
|
|
85
|
+
const projectRoot = cwd();
|
|
86
|
+
const configPath = await findConfigPath(projectRoot);
|
|
87
|
+
if (!configPath) {
|
|
88
|
+
return JSON.stringify({
|
|
89
|
+
error: "No bober.config.json found. Run bober_init first.",
|
|
90
|
+
}, null, 2);
|
|
91
|
+
}
|
|
92
|
+
// Parse the existing config file
|
|
93
|
+
let rawContent;
|
|
94
|
+
try {
|
|
95
|
+
rawContent = await readFile(configPath, "utf-8");
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
return JSON.stringify({
|
|
99
|
+
error: `Failed to read config: ${err instanceof Error ? err.message : String(err)}`,
|
|
100
|
+
}, null, 2);
|
|
101
|
+
}
|
|
102
|
+
let parsed;
|
|
103
|
+
try {
|
|
104
|
+
parsed = JSON.parse(rawContent);
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
return JSON.stringify({
|
|
108
|
+
error: `Invalid JSON in config file: ${err instanceof Error ? err.message : String(err)}`,
|
|
109
|
+
}, null, 2);
|
|
110
|
+
}
|
|
111
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
112
|
+
return JSON.stringify({ error: "Config file does not contain a JSON object." }, null, 2);
|
|
113
|
+
}
|
|
114
|
+
const configObj = parsed;
|
|
115
|
+
const key = typeof args.key === "string" && args.key.trim()
|
|
116
|
+
? args.key.trim()
|
|
117
|
+
: undefined;
|
|
118
|
+
const value = typeof args.value === "string" ? args.value : undefined;
|
|
119
|
+
// Read mode (no key provided)
|
|
120
|
+
if (key === undefined) {
|
|
121
|
+
return JSON.stringify({
|
|
122
|
+
path: configPath,
|
|
123
|
+
config: configObj,
|
|
124
|
+
}, null, 2);
|
|
125
|
+
}
|
|
126
|
+
// Update mode requires both key and value
|
|
127
|
+
if (value === undefined) {
|
|
128
|
+
return JSON.stringify({
|
|
129
|
+
error: "Both key and value must be provided to update the config.",
|
|
130
|
+
}, null, 2);
|
|
131
|
+
}
|
|
132
|
+
const coerced = coerceValue(value);
|
|
133
|
+
setNestedValue(configObj, key, coerced);
|
|
134
|
+
try {
|
|
135
|
+
await writeFile(configPath, JSON.stringify(configObj, null, 2) + "\n", "utf-8");
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
return JSON.stringify({
|
|
139
|
+
error: `Failed to write config: ${err instanceof Error ? err.message : String(err)}`,
|
|
140
|
+
}, null, 2);
|
|
141
|
+
}
|
|
142
|
+
process.stderr.write(`[bober_config] Updated ${key} = ${JSON.stringify(coerced)} in ${configPath}\n`);
|
|
143
|
+
return JSON.stringify({
|
|
144
|
+
status: "updated",
|
|
145
|
+
path: configPath,
|
|
146
|
+
key,
|
|
147
|
+
value: coerced,
|
|
148
|
+
config: configObj,
|
|
149
|
+
}, null, 2);
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/mcp/tools/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/contracts.ts"],"names":[],"mappings":"AAYA,wBAAgB,qBAAqB,IAAI,IAAI,CAmE5C"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// ── bober_contracts tool ──────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// No args -> list all contracts with id, feature, status, dependsOn.
|
|
4
|
+
// With { contractId } -> return the full contract JSON.
|
|
5
|
+
import { cwd } from "node:process";
|
|
6
|
+
import { listContracts, loadContract } from "../../state/index.js";
|
|
7
|
+
import { registerTool } from "./registry.js";
|
|
8
|
+
// ── Registration ─────────────────────────────────────────────────────
|
|
9
|
+
export function registerContractsTool() {
|
|
10
|
+
registerTool({
|
|
11
|
+
name: "bober_contracts",
|
|
12
|
+
description: "List all sprint contracts or read a specific contract. " +
|
|
13
|
+
"Without arguments returns a summary list of all contracts (id, feature, status, dependsOn). " +
|
|
14
|
+
"With contractId returns the full contract JSON including success criteria and evaluator feedback.",
|
|
15
|
+
inputSchema: {
|
|
16
|
+
type: "object",
|
|
17
|
+
properties: {
|
|
18
|
+
contractId: {
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "Contract ID to read. Omit to list all contracts.",
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
additionalProperties: false,
|
|
24
|
+
},
|
|
25
|
+
handler: async (args) => {
|
|
26
|
+
const projectRoot = cwd();
|
|
27
|
+
const contractId = typeof args.contractId === "string" && args.contractId.trim()
|
|
28
|
+
? args.contractId.trim()
|
|
29
|
+
: undefined;
|
|
30
|
+
// Return full contract when contractId is provided
|
|
31
|
+
if (contractId !== undefined) {
|
|
32
|
+
try {
|
|
33
|
+
const contract = await loadContract(projectRoot, contractId);
|
|
34
|
+
return JSON.stringify(contract, null, 2);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
return JSON.stringify({
|
|
38
|
+
error: `Contract "${contractId}" not found.`,
|
|
39
|
+
details: err instanceof Error ? err.message : String(err),
|
|
40
|
+
}, null, 2);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// List mode
|
|
44
|
+
const contracts = await listContracts(projectRoot);
|
|
45
|
+
if (contracts.length === 0) {
|
|
46
|
+
return JSON.stringify({
|
|
47
|
+
contracts: [],
|
|
48
|
+
message: "No contracts found. Run bober_plan first to generate sprint contracts.",
|
|
49
|
+
}, null, 2);
|
|
50
|
+
}
|
|
51
|
+
const summary = contracts.map((c) => ({
|
|
52
|
+
id: c.id,
|
|
53
|
+
feature: c.feature,
|
|
54
|
+
status: c.status,
|
|
55
|
+
dependsOn: c.dependsOn,
|
|
56
|
+
}));
|
|
57
|
+
return JSON.stringify({ contracts: summary }, null, 2);
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../src/mcp/tools/contracts.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,qEAAqE;AACrE,wDAAwD;AAExD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,wEAAwE;AAExE,MAAM,UAAU,qBAAqB;IACnC,YAAY,CAAC;QACX,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,yDAAyD;YACzD,8FAA8F;YAC9F,mGAAmG;QACrG,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,kDAAkD;iBACrD;aACF;YACD,oBAAoB,EAAE,KAAK;SAC5B;QACD,OAAO,EAAE,KAAK,EAAE,IAA6B,EAAmB,EAAE;YAChE,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC;YAC1B,MAAM,UAAU,GACd,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;gBAC3D,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;gBACxB,CAAC,CAAC,SAAS,CAAC;YAEhB,mDAAmD;YACnD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;oBAC7D,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC3C,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,IAAI,CAAC,SAAS,CACnB;wBACE,KAAK,EAAE,aAAa,UAAU,cAAc;wBAC5C,OAAO,EACL,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;qBACnD,EACD,IAAI,EACJ,CAAC,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,YAAY;YACZ,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;YACnD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,IAAI,CAAC,SAAS,CACnB;oBACE,SAAS,EAAE,EAAE;oBACb,OAAO,EACL,wEAAwE;iBAC3E,EACD,IAAI,EACJ,CAAC,CACF,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,SAAS,EAAE,CAAC,CAAC,SAAS;aACvB,CAAC,CAAC,CAAC;YAEJ,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/eval.ts"],"names":[],"mappings":"AAwBA,wBAAgB,gBAAgB,IAAI,IAAI,CAuKvC"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// ── bober_eval tool ──────────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Runs the evaluator agent against a specific sprint or the most
|
|
4
|
+
// recent in-progress sprint.
|
|
5
|
+
// Accepts { sprintId?: string }. Returns a JSON eval result summary.
|
|
6
|
+
import { cwd } from "node:process";
|
|
7
|
+
import { McpError, ErrorCode } from "@modelcontextprotocol/sdk/types.js";
|
|
8
|
+
import { configExists, loadConfig } from "../../config/loader.js";
|
|
9
|
+
import { createHandoff } from "../../orchestrator/context-handoff.js";
|
|
10
|
+
import { runEvaluatorAgent } from "../../orchestrator/evaluator-agent.js";
|
|
11
|
+
import { ensureBoberDir, listContracts, loadLatestSpec, } from "../../state/index.js";
|
|
12
|
+
import { getCurrentBranch, getChangedFiles } from "../../utils/git.js";
|
|
13
|
+
import { registerTool } from "./registry.js";
|
|
14
|
+
// ── Registration ─────────────────────────────────────────────────────
|
|
15
|
+
export function registerEvalTool() {
|
|
16
|
+
registerTool({
|
|
17
|
+
name: "bober_eval",
|
|
18
|
+
description: "Run the Bober evaluator agent against a sprint. " +
|
|
19
|
+
"If sprintId is omitted the most recent in-progress, evaluating, or " +
|
|
20
|
+
"needs-rework sprint is targeted (falls back to the last contract). " +
|
|
21
|
+
"Returns a JSON object with pass/fail, score, per-criterion details, " +
|
|
22
|
+
"and actionable feedback.",
|
|
23
|
+
inputSchema: {
|
|
24
|
+
type: "object",
|
|
25
|
+
properties: {
|
|
26
|
+
sprintId: {
|
|
27
|
+
type: "string",
|
|
28
|
+
description: "ID of the sprint contract to evaluate. Omit to target the most " +
|
|
29
|
+
"recent active sprint.",
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
additionalProperties: false,
|
|
33
|
+
},
|
|
34
|
+
handler: async (args) => {
|
|
35
|
+
const sprintId = typeof args.sprintId === "string" && args.sprintId.trim()
|
|
36
|
+
? args.sprintId.trim()
|
|
37
|
+
: undefined;
|
|
38
|
+
const projectRoot = cwd();
|
|
39
|
+
const hasConfig = await configExists(projectRoot);
|
|
40
|
+
if (!hasConfig) {
|
|
41
|
+
throw new McpError(ErrorCode.InvalidRequest, "No bober.config.json found. Run bober_init first.");
|
|
42
|
+
}
|
|
43
|
+
let config;
|
|
44
|
+
try {
|
|
45
|
+
config = await loadConfig(projectRoot);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
return JSON.stringify({
|
|
49
|
+
error: `Failed to load config: ${err instanceof Error ? err.message : String(err)}`,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
await ensureBoberDir(projectRoot);
|
|
53
|
+
const spec = await loadLatestSpec(projectRoot);
|
|
54
|
+
if (!spec) {
|
|
55
|
+
return JSON.stringify({
|
|
56
|
+
error: "No plan found. Run bober_plan first.",
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const contracts = await listContracts(projectRoot);
|
|
60
|
+
if (contracts.length === 0) {
|
|
61
|
+
return JSON.stringify({
|
|
62
|
+
error: "No sprint contracts found. Run bober_plan first.",
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
// Resolve target contract
|
|
66
|
+
let targetContract;
|
|
67
|
+
if (sprintId) {
|
|
68
|
+
targetContract = contracts.find((c) => c.id === sprintId);
|
|
69
|
+
if (!targetContract) {
|
|
70
|
+
return JSON.stringify({
|
|
71
|
+
error: `Sprint "${sprintId}" not found.`,
|
|
72
|
+
available: contracts.map((c) => c.id),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
targetContract = contracts.find((c) => c.status === "in-progress" ||
|
|
78
|
+
c.status === "evaluating" ||
|
|
79
|
+
c.status === "needs-rework");
|
|
80
|
+
if (!targetContract) {
|
|
81
|
+
// Fall back to the last contract
|
|
82
|
+
targetContract = contracts[contracts.length - 1];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
process.stderr.write(`[bober_eval] Evaluating: ${targetContract.feature} (${targetContract.id})\n`);
|
|
86
|
+
// Build project context
|
|
87
|
+
let currentBranch;
|
|
88
|
+
try {
|
|
89
|
+
currentBranch = await getCurrentBranch(projectRoot);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
currentBranch = "unknown";
|
|
93
|
+
}
|
|
94
|
+
const projectContext = {
|
|
95
|
+
name: config.project.name,
|
|
96
|
+
type: config.project.mode,
|
|
97
|
+
techStack: spec.techStack,
|
|
98
|
+
entryPoints: [],
|
|
99
|
+
currentBranch,
|
|
100
|
+
};
|
|
101
|
+
// Get changed files
|
|
102
|
+
let changedFiles;
|
|
103
|
+
try {
|
|
104
|
+
changedFiles = await getChangedFiles(projectRoot);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
changedFiles = [];
|
|
108
|
+
}
|
|
109
|
+
const completedContracts = contracts.filter((c) => c.status === "passed");
|
|
110
|
+
const handoff = createHandoff({
|
|
111
|
+
from: "generator",
|
|
112
|
+
to: "evaluator",
|
|
113
|
+
projectContext,
|
|
114
|
+
spec,
|
|
115
|
+
currentContract: targetContract,
|
|
116
|
+
sprintHistory: completedContracts,
|
|
117
|
+
instructions: `Evaluate sprint: ${targetContract.feature}`,
|
|
118
|
+
changedFiles,
|
|
119
|
+
});
|
|
120
|
+
try {
|
|
121
|
+
const evaluation = await runEvaluatorAgent(handoff, projectRoot, config);
|
|
122
|
+
return JSON.stringify({
|
|
123
|
+
contractId: targetContract.id,
|
|
124
|
+
feature: targetContract.feature,
|
|
125
|
+
passed: evaluation.passed,
|
|
126
|
+
score: evaluation.score,
|
|
127
|
+
summary: evaluation.summary,
|
|
128
|
+
feedback: evaluation.results
|
|
129
|
+
.filter((r) => !r.passed && r.feedback)
|
|
130
|
+
.map((r) => ({ evaluator: r.evaluator, feedback: r.feedback })),
|
|
131
|
+
results: evaluation.results.map((r) => ({
|
|
132
|
+
evaluator: r.evaluator,
|
|
133
|
+
passed: r.passed,
|
|
134
|
+
score: r.score,
|
|
135
|
+
summary: r.summary,
|
|
136
|
+
failedCriteria: r.details
|
|
137
|
+
.filter((d) => !d.passed)
|
|
138
|
+
.map((d) => ({
|
|
139
|
+
message: d.message,
|
|
140
|
+
severity: d.severity,
|
|
141
|
+
...(d.file ? { file: d.file, line: d.line } : {}),
|
|
142
|
+
})),
|
|
143
|
+
})),
|
|
144
|
+
timestamp: evaluation.timestamp,
|
|
145
|
+
}, null, 2);
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
return JSON.stringify({
|
|
149
|
+
error: `Evaluation failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
150
|
+
contractId: targetContract.id,
|
|
151
|
+
feature: targetContract.feature,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=eval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval.js","sourceRoot":"","sources":["../../../src/mcp/tools/eval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registers all built-in agent-bober MCP tools into the global registry.
|
|
3
|
+
* Call this once before starting the MCP server.
|
|
4
|
+
*
|
|
5
|
+
* Registered tools (10 total):
|
|
6
|
+
* 1. bober_init – Initialise a project
|
|
7
|
+
* 2. bober_plan – Generate a sprint plan
|
|
8
|
+
* 3. bober_sprint – Execute the next sprint cycle
|
|
9
|
+
* 4. bober_eval – Evaluate a sprint
|
|
10
|
+
* 5. bober_run – Start the full pipeline asynchronously
|
|
11
|
+
* 6. bober_status – Poll pipeline status
|
|
12
|
+
* 7. bober_contracts – List/read sprint contracts
|
|
13
|
+
* 8. bober_spec – Read the latest plan spec
|
|
14
|
+
* 9. bober_principles – Read/write .bober/principles.md
|
|
15
|
+
* 10. bober_config – Read/update bober.config.json
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerAllTools(): void;
|
|
18
|
+
export { registerTool, getAllTools, getTool } from "./registry.js";
|
|
19
|
+
export type { BoberToolDefinition, JsonSchemaObject, JsonSchemaProperty, } from "./registry.js";
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAgBvC;AAED,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACnE,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// ── Tool Registration ───────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// This file is the central place where all MCP tools are registered.
|
|
4
|
+
// Import each tool module's register function here and call it once.
|
|
5
|
+
import { registerInitTool } from "./init.js";
|
|
6
|
+
import { registerPlanTool } from "./plan.js";
|
|
7
|
+
import { registerSprintTool } from "./sprint.js";
|
|
8
|
+
import { registerEvalTool } from "./eval.js";
|
|
9
|
+
import { registerRunTool } from "./run.js";
|
|
10
|
+
import { registerStatusTool } from "./status.js";
|
|
11
|
+
import { registerContractsTool } from "./contracts.js";
|
|
12
|
+
import { registerSpecTool } from "./spec.js";
|
|
13
|
+
import { registerPrinciplesTool } from "./principles.js";
|
|
14
|
+
import { registerConfigTool } from "./config.js";
|
|
15
|
+
/**
|
|
16
|
+
* Registers all built-in agent-bober MCP tools into the global registry.
|
|
17
|
+
* Call this once before starting the MCP server.
|
|
18
|
+
*
|
|
19
|
+
* Registered tools (10 total):
|
|
20
|
+
* 1. bober_init – Initialise a project
|
|
21
|
+
* 2. bober_plan – Generate a sprint plan
|
|
22
|
+
* 3. bober_sprint – Execute the next sprint cycle
|
|
23
|
+
* 4. bober_eval – Evaluate a sprint
|
|
24
|
+
* 5. bober_run – Start the full pipeline asynchronously
|
|
25
|
+
* 6. bober_status – Poll pipeline status
|
|
26
|
+
* 7. bober_contracts – List/read sprint contracts
|
|
27
|
+
* 8. bober_spec – Read the latest plan spec
|
|
28
|
+
* 9. bober_principles – Read/write .bober/principles.md
|
|
29
|
+
* 10. bober_config – Read/update bober.config.json
|
|
30
|
+
*/
|
|
31
|
+
export function registerAllTools() {
|
|
32
|
+
// ── Core workflow tools ─────────────────────────────────────────
|
|
33
|
+
registerInitTool();
|
|
34
|
+
registerPlanTool();
|
|
35
|
+
registerSprintTool();
|
|
36
|
+
registerEvalTool();
|
|
37
|
+
// ── Async pipeline tools ────────────────────────────────────────
|
|
38
|
+
registerRunTool();
|
|
39
|
+
registerStatusTool();
|
|
40
|
+
// ── Read / configuration tools ──────────────────────────────────
|
|
41
|
+
registerContractsTool();
|
|
42
|
+
registerSpecTool();
|
|
43
|
+
registerPrinciplesTool();
|
|
44
|
+
registerConfigTool();
|
|
45
|
+
}
|
|
46
|
+
export { registerTool, getAllTools, getTool } from "./registry.js";
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,qEAAqE;AACrE,qEAAqE;AAErE,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,gBAAgB;IAC9B,mEAAmE;IACnE,gBAAgB,EAAE,CAAC;IACnB,gBAAgB,EAAE,CAAC;IACnB,kBAAkB,EAAE,CAAC;IACrB,gBAAgB,EAAE,CAAC;IAEnB,mEAAmE;IACnE,eAAe,EAAE,CAAC;IAClB,kBAAkB,EAAE,CAAC;IAErB,mEAAmE;IACnE,qBAAqB,EAAE,CAAC;IACxB,gBAAgB,EAAE,CAAC;IACnB,sBAAsB,EAAE,CAAC;IACzB,kBAAkB,EAAE,CAAC;AACvB,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/init.ts"],"names":[],"mappings":"AAsBA,wBAAgB,gBAAgB,IAAI,IAAI,CA0OvC"}
|