@gempack/squad-mcp 0.5.0 → 0.6.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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +3 -2
- package/CHANGELOG.md +260 -17
- package/INSTALL.md +156 -24
- package/README.md +279 -27
- package/agents/{PO.md → product-owner.md} +33 -1
- package/agents/{Senior-Architect.md → senior-architect.md} +33 -1
- package/agents/{Senior-DBA.md → senior-dba.md} +33 -1
- package/agents/{Senior-Dev-Reviewer.md → senior-dev-reviewer.md} +33 -1
- package/agents/{Senior-Dev-Security.md → senior-dev-security.md} +33 -1
- package/agents/{Senior-Developer.md → senior-developer.md} +33 -1
- package/agents/{Senior-QA.md → senior-qa.md} +33 -1
- package/agents/{TechLead-Consolidator.md → tech-lead-consolidator.md} +7 -1
- package/agents/{TechLead-Planner.md → tech-lead-planner.md} +7 -1
- package/commands/squad-review.md +10 -58
- package/commands/squad.md +11 -70
- package/dist/config/ownership-matrix.d.ts +24 -2
- package/dist/config/ownership-matrix.js +466 -139
- package/dist/config/ownership-matrix.js.map +1 -1
- package/dist/config/squad-yaml.d.ts +242 -0
- package/dist/config/squad-yaml.js +403 -0
- package/dist/config/squad-yaml.js.map +1 -0
- package/dist/errors.d.ts +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/format/pr-review.d.ts +61 -0
- package/dist/format/pr-review.js +146 -0
- package/dist/format/pr-review.js.map +1 -0
- package/dist/index.js +19 -13
- package/dist/index.js.map +1 -1
- package/dist/learning/format.d.ts +29 -0
- package/dist/learning/format.js +55 -0
- package/dist/learning/format.js.map +1 -0
- package/dist/learning/store.d.ts +102 -0
- package/dist/learning/store.js +169 -0
- package/dist/learning/store.js.map +1 -0
- package/dist/resources/agent-loader.d.ts +1 -1
- package/dist/resources/agent-loader.js +53 -40
- package/dist/resources/agent-loader.js.map +1 -1
- package/dist/tasks/select.d.ts +64 -0
- package/dist/tasks/select.js +84 -0
- package/dist/tasks/select.js.map +1 -0
- package/dist/tasks/store.d.ts +338 -0
- package/dist/tasks/store.js +321 -0
- package/dist/tasks/store.js.map +1 -0
- package/dist/tools/compose-advisory-bundle.d.ts +5 -5
- package/dist/tools/compose-advisory-bundle.js +24 -12
- package/dist/tools/compose-advisory-bundle.js.map +1 -1
- package/dist/tools/compose-prd-parse.d.ts +53 -0
- package/dist/tools/compose-prd-parse.js +167 -0
- package/dist/tools/compose-prd-parse.js.map +1 -0
- package/dist/tools/compose-squad-workflow.d.ts +28 -10
- package/dist/tools/compose-squad-workflow.js +0 -0
- package/dist/tools/compose-squad-workflow.js.map +1 -1
- package/dist/tools/consolidate.d.ts +55 -4
- package/dist/tools/consolidate.js +87 -15
- package/dist/tools/consolidate.js.map +1 -1
- package/dist/tools/expand-task.d.ts +51 -0
- package/dist/tools/expand-task.js +35 -0
- package/dist/tools/expand-task.js.map +1 -0
- package/dist/tools/list-tasks.d.ts +31 -0
- package/dist/tools/list-tasks.js +50 -0
- package/dist/tools/list-tasks.js.map +1 -0
- package/dist/tools/next-task.d.ts +37 -0
- package/dist/tools/next-task.js +60 -0
- package/dist/tools/next-task.js.map +1 -0
- package/dist/tools/read-learnings.d.ts +53 -0
- package/dist/tools/read-learnings.js +72 -0
- package/dist/tools/read-learnings.js.map +1 -0
- package/dist/tools/read-squad-config.d.ts +23 -0
- package/dist/tools/read-squad-config.js +34 -0
- package/dist/tools/read-squad-config.js.map +1 -0
- package/dist/tools/record-learning.d.ts +62 -0
- package/dist/tools/record-learning.js +80 -0
- package/dist/tools/record-learning.js.map +1 -0
- package/dist/tools/record-tasks.d.ts +71 -0
- package/dist/tools/record-tasks.js +45 -0
- package/dist/tools/record-tasks.js.map +1 -0
- package/dist/tools/registry.d.ts +1 -1
- package/dist/tools/registry.js +71 -39
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/score-rubric.d.ts +74 -0
- package/dist/tools/score-rubric.js +140 -0
- package/dist/tools/score-rubric.js.map +1 -0
- package/dist/tools/slice-files-for-task.d.ts +31 -0
- package/dist/tools/slice-files-for-task.js +52 -0
- package/dist/tools/slice-files-for-task.js.map +1 -0
- package/dist/tools/update-task-status.d.ts +29 -0
- package/dist/tools/update-task-status.js +35 -0
- package/dist/tools/update-task-status.js.map +1 -0
- package/package.json +4 -1
- package/skills/squad/SKILL.md +454 -0
- package/tools/post-review.mjs +212 -0
- /package/agents/{Skill-Squad-Dev.md → _shared/Skill-Squad-Dev.md} +0 -0
- /package/agents/{Skill-Squad-Review.md → _shared/Skill-Squad-Review.md} +0 -0
- /package/agents/{_Severity-and-Ownership.md → _shared/_Severity-and-Ownership.md} +0 -0
package/dist/tools/registry.js
CHANGED
|
@@ -1,16 +1,27 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
import { scoreRiskTool } from
|
|
3
|
-
import { selectSquadTool } from
|
|
4
|
-
import { sliceFilesForAgentTool } from
|
|
5
|
-
import { listAgentsTool, getAgentDefinitionTool, initLocalConfigTool } from
|
|
6
|
-
import { applyConsolidationRulesTool } from
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { scoreRiskTool } from "./score-risk.js";
|
|
3
|
+
import { selectSquadTool } from "./select-squad.js";
|
|
4
|
+
import { sliceFilesForAgentTool } from "./slice-files.js";
|
|
5
|
+
import { listAgentsTool, getAgentDefinitionTool, initLocalConfigTool, } from "./agents.js";
|
|
6
|
+
import { applyConsolidationRulesTool } from "./consolidate.js";
|
|
7
|
+
import { scoreRubricTool } from "./score-rubric.js";
|
|
8
|
+
import { readSquadConfigTool } from "./read-squad-config.js";
|
|
9
|
+
import { readLearningsToolDef } from "./read-learnings.js";
|
|
10
|
+
import { recordLearningToolDef } from "./record-learning.js";
|
|
11
|
+
import { listTasksToolDef } from "./list-tasks.js";
|
|
12
|
+
import { nextTaskToolDef } from "./next-task.js";
|
|
13
|
+
import { recordTasksToolDef } from "./record-tasks.js";
|
|
14
|
+
import { updateTaskStatusToolDef } from "./update-task-status.js";
|
|
15
|
+
import { expandTaskToolDef } from "./expand-task.js";
|
|
16
|
+
import { sliceFilesForTaskToolDef } from "./slice-files-for-task.js";
|
|
17
|
+
import { composePrdParseToolDef } from "./compose-prd-parse.js";
|
|
18
|
+
import { classifyWorkTypeTool } from "./classify-work-type.js";
|
|
19
|
+
import { detectChangedFilesTool } from "./detect-changed-files.js";
|
|
20
|
+
import { validatePlanTextTool } from "./validate-plan-text.js";
|
|
21
|
+
import { composeSquadWorkflowTool } from "./compose-squad-workflow.js";
|
|
22
|
+
import { composeAdvisoryBundleTool } from "./compose-advisory-bundle.js";
|
|
23
|
+
import { isSquadError } from "../errors.js";
|
|
24
|
+
import { logger, newRequestId } from "../observability/logger.js";
|
|
14
25
|
const tools = new Map();
|
|
15
26
|
export function register(def) {
|
|
16
27
|
tools.set(def.name, def);
|
|
@@ -23,6 +34,17 @@ export function registerTools() {
|
|
|
23
34
|
register(getAgentDefinitionTool);
|
|
24
35
|
register(initLocalConfigTool);
|
|
25
36
|
register(applyConsolidationRulesTool);
|
|
37
|
+
register(scoreRubricTool);
|
|
38
|
+
register(readSquadConfigTool);
|
|
39
|
+
register(readLearningsToolDef);
|
|
40
|
+
register(recordLearningToolDef);
|
|
41
|
+
register(listTasksToolDef);
|
|
42
|
+
register(nextTaskToolDef);
|
|
43
|
+
register(recordTasksToolDef);
|
|
44
|
+
register(updateTaskStatusToolDef);
|
|
45
|
+
register(expandTaskToolDef);
|
|
46
|
+
register(sliceFilesForTaskToolDef);
|
|
47
|
+
register(composePrdParseToolDef);
|
|
26
48
|
register(classifyWorkTypeTool);
|
|
27
49
|
register(detectChangedFilesTool);
|
|
28
50
|
register(validatePlanTextTool);
|
|
@@ -38,12 +60,12 @@ export function listTools() {
|
|
|
38
60
|
}
|
|
39
61
|
function asToolErrorResponse(body) {
|
|
40
62
|
return {
|
|
41
|
-
content: [{ type:
|
|
63
|
+
content: [{ type: "text", text: JSON.stringify(body, null, 2) }],
|
|
42
64
|
isError: true,
|
|
43
65
|
};
|
|
44
66
|
}
|
|
45
67
|
function shapeOf(args) {
|
|
46
|
-
if (args === null || typeof args !==
|
|
68
|
+
if (args === null || typeof args !== "object")
|
|
47
69
|
return undefined;
|
|
48
70
|
const out = {};
|
|
49
71
|
for (const [k, v] of Object.entries(args)) {
|
|
@@ -53,10 +75,10 @@ function shapeOf(args) {
|
|
|
53
75
|
else if (Array.isArray(v)) {
|
|
54
76
|
out[k] = `[Array(${v.length})]`;
|
|
55
77
|
}
|
|
56
|
-
else if (typeof v ===
|
|
57
|
-
out[k] =
|
|
78
|
+
else if (typeof v === "object") {
|
|
79
|
+
out[k] = "[object]";
|
|
58
80
|
}
|
|
59
|
-
else if (typeof v ===
|
|
81
|
+
else if (typeof v === "string") {
|
|
60
82
|
out[k] = `[string(${v.length})]`;
|
|
61
83
|
}
|
|
62
84
|
else {
|
|
@@ -70,28 +92,32 @@ export async function dispatchTool(name, args) {
|
|
|
70
92
|
const started = Date.now();
|
|
71
93
|
const tool = tools.get(name);
|
|
72
94
|
if (!tool) {
|
|
73
|
-
logger.warn(
|
|
95
|
+
logger.warn("unknown tool", {
|
|
74
96
|
tool: name,
|
|
75
97
|
request_id: requestId,
|
|
76
|
-
outcome:
|
|
98
|
+
outcome: "unknown_tool",
|
|
77
99
|
duration_ms: Date.now() - started,
|
|
78
100
|
});
|
|
79
101
|
return asToolErrorResponse({
|
|
80
|
-
error: { code:
|
|
102
|
+
error: { code: "UNKNOWN_TOOL", message: `unknown tool: ${name}` },
|
|
81
103
|
});
|
|
82
104
|
}
|
|
83
|
-
logger.debug(
|
|
105
|
+
logger.debug("tool call", {
|
|
106
|
+
tool: name,
|
|
107
|
+
request_id: requestId,
|
|
108
|
+
input_shape: shapeOf(args),
|
|
109
|
+
});
|
|
84
110
|
const parsed = tool.schema.safeParse(args);
|
|
85
111
|
if (!parsed.success) {
|
|
86
|
-
logger.warn(
|
|
112
|
+
logger.warn("invalid input", {
|
|
87
113
|
tool: name,
|
|
88
114
|
request_id: requestId,
|
|
89
|
-
outcome:
|
|
115
|
+
outcome: "invalid_input",
|
|
90
116
|
duration_ms: Date.now() - started,
|
|
91
117
|
});
|
|
92
118
|
return asToolErrorResponse({
|
|
93
119
|
error: {
|
|
94
|
-
code:
|
|
120
|
+
code: "INVALID_INPUT",
|
|
95
121
|
message: parsed.error.message,
|
|
96
122
|
details: { issues: parsed.error.issues.length },
|
|
97
123
|
},
|
|
@@ -99,23 +125,25 @@ export async function dispatchTool(name, args) {
|
|
|
99
125
|
}
|
|
100
126
|
try {
|
|
101
127
|
const result = await tool.handler(parsed.data);
|
|
102
|
-
logger.info(
|
|
128
|
+
logger.info("tool ok", {
|
|
103
129
|
tool: name,
|
|
104
130
|
request_id: requestId,
|
|
105
|
-
outcome:
|
|
131
|
+
outcome: "success",
|
|
106
132
|
duration_ms: Date.now() - started,
|
|
107
133
|
});
|
|
108
134
|
return {
|
|
109
|
-
content: [
|
|
135
|
+
content: [
|
|
136
|
+
{ type: "text", text: JSON.stringify(result, null, 2) },
|
|
137
|
+
],
|
|
110
138
|
};
|
|
111
139
|
}
|
|
112
140
|
catch (err) {
|
|
113
141
|
const duration_ms = Date.now() - started;
|
|
114
142
|
if (isSquadError(err)) {
|
|
115
|
-
logger.warn(
|
|
143
|
+
logger.warn("tool error", {
|
|
116
144
|
tool: name,
|
|
117
145
|
request_id: requestId,
|
|
118
|
-
outcome:
|
|
146
|
+
outcome: "tool_error",
|
|
119
147
|
duration_ms,
|
|
120
148
|
error_code: err.code,
|
|
121
149
|
});
|
|
@@ -124,15 +152,15 @@ export async function dispatchTool(name, args) {
|
|
|
124
152
|
});
|
|
125
153
|
}
|
|
126
154
|
const message = err instanceof Error ? err.message : String(err);
|
|
127
|
-
logger.error(
|
|
155
|
+
logger.error("internal error", {
|
|
128
156
|
tool: name,
|
|
129
157
|
request_id: requestId,
|
|
130
|
-
outcome:
|
|
158
|
+
outcome: "internal_error",
|
|
131
159
|
duration_ms,
|
|
132
160
|
details: { message },
|
|
133
161
|
});
|
|
134
162
|
return asToolErrorResponse({
|
|
135
|
-
error: { code:
|
|
163
|
+
error: { code: "INTERNAL_ERROR", message: "internal tool error" },
|
|
136
164
|
});
|
|
137
165
|
}
|
|
138
166
|
}
|
|
@@ -146,18 +174,22 @@ function zodToJsonSchema(schema) {
|
|
|
146
174
|
if (!value.isOptional())
|
|
147
175
|
required.push(key);
|
|
148
176
|
}
|
|
149
|
-
return {
|
|
177
|
+
return {
|
|
178
|
+
type: "object",
|
|
179
|
+
properties,
|
|
180
|
+
...(required.length ? { required } : {}),
|
|
181
|
+
};
|
|
150
182
|
}
|
|
151
183
|
if (schema instanceof z.ZodString)
|
|
152
|
-
return { type:
|
|
184
|
+
return { type: "string" };
|
|
153
185
|
if (schema instanceof z.ZodNumber)
|
|
154
|
-
return { type:
|
|
186
|
+
return { type: "number" };
|
|
155
187
|
if (schema instanceof z.ZodBoolean)
|
|
156
|
-
return { type:
|
|
188
|
+
return { type: "boolean" };
|
|
157
189
|
if (schema instanceof z.ZodArray)
|
|
158
|
-
return { type:
|
|
190
|
+
return { type: "array", items: zodToJsonSchema(schema.element) };
|
|
159
191
|
if (schema instanceof z.ZodEnum)
|
|
160
|
-
return { type:
|
|
192
|
+
return { type: "string", enum: schema.options };
|
|
161
193
|
if (schema instanceof z.ZodOptional)
|
|
162
194
|
return zodToJsonSchema(schema.unwrap());
|
|
163
195
|
if (schema instanceof z.ZodDefault)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAc,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ToolDef } from "./registry.js";
|
|
3
|
+
import { type AgentName } from "../config/ownership-matrix.js";
|
|
4
|
+
declare const schema: z.ZodObject<{
|
|
5
|
+
scores: z.ZodArray<z.ZodObject<{
|
|
6
|
+
agent: z.ZodEnum<[AgentName, ...AgentName[]]>;
|
|
7
|
+
score: z.ZodNumber;
|
|
8
|
+
rationale: z.ZodOptional<z.ZodString>;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
agent: AgentName;
|
|
11
|
+
score: number;
|
|
12
|
+
rationale?: string | undefined;
|
|
13
|
+
}, {
|
|
14
|
+
agent: AgentName;
|
|
15
|
+
score: number;
|
|
16
|
+
rationale?: string | undefined;
|
|
17
|
+
}>, "many">;
|
|
18
|
+
weights: z.ZodOptional<z.ZodRecord<z.ZodEnum<[AgentName, ...AgentName[]]>, z.ZodNumber>>;
|
|
19
|
+
threshold: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
20
|
+
}, "strip", z.ZodTypeAny, {
|
|
21
|
+
scores: {
|
|
22
|
+
agent: AgentName;
|
|
23
|
+
score: number;
|
|
24
|
+
rationale?: string | undefined;
|
|
25
|
+
}[];
|
|
26
|
+
threshold: number;
|
|
27
|
+
weights?: Partial<Record<AgentName, number>> | undefined;
|
|
28
|
+
}, {
|
|
29
|
+
scores: {
|
|
30
|
+
agent: AgentName;
|
|
31
|
+
score: number;
|
|
32
|
+
rationale?: string | undefined;
|
|
33
|
+
}[];
|
|
34
|
+
weights?: Partial<Record<AgentName, number>> | undefined;
|
|
35
|
+
threshold?: number | undefined;
|
|
36
|
+
}>;
|
|
37
|
+
type Input = z.infer<typeof schema>;
|
|
38
|
+
export interface DimensionEntry {
|
|
39
|
+
agent: AgentName;
|
|
40
|
+
dimension: string;
|
|
41
|
+
score: number;
|
|
42
|
+
weight: number;
|
|
43
|
+
contribution: number;
|
|
44
|
+
rationale?: string;
|
|
45
|
+
below_threshold: boolean;
|
|
46
|
+
}
|
|
47
|
+
export interface RubricOutput {
|
|
48
|
+
weighted_score: number;
|
|
49
|
+
threshold: number;
|
|
50
|
+
passes_threshold: boolean;
|
|
51
|
+
dimensions: DimensionEntry[];
|
|
52
|
+
ignored_agents: string[];
|
|
53
|
+
weights_source: "default" | "override";
|
|
54
|
+
scorecard_text: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Compute the weighted-rubric scorecard from per-agent dimension scores.
|
|
58
|
+
*
|
|
59
|
+
* Math:
|
|
60
|
+
* - Reduce supplied scores to the subset of agents present.
|
|
61
|
+
* - Resolve weights: override (if provided AND keys sum to 100) > default.
|
|
62
|
+
* - For each scored agent, contribution = score * weight / 100.
|
|
63
|
+
* - weighted_score = sum of contributions normalised so weights sum to 100
|
|
64
|
+
* across the agents that ACTUALLY scored. (If only 6 of 9 agents scored,
|
|
65
|
+
* the rubric renormalises across those 6 instead of leaving 3 dimensions
|
|
66
|
+
* contributing 0 to the weighted average.)
|
|
67
|
+
* - Dimensions below `threshold` are flagged.
|
|
68
|
+
*
|
|
69
|
+
* Returns a RubricOutput; meta-agents (weight 0) and unscored agents are listed
|
|
70
|
+
* in `ignored_agents`.
|
|
71
|
+
*/
|
|
72
|
+
export declare function scoreRubric(input: Input): RubricOutput;
|
|
73
|
+
export declare const scoreRubricTool: ToolDef<typeof schema>;
|
|
74
|
+
export {};
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AGENT_NAMES_TUPLE, AGENTS, DEFAULT_RUBRIC_WEIGHTS, } from "../config/ownership-matrix.js";
|
|
3
|
+
/**
|
|
4
|
+
* Per-agent dimension score from an advisory pass. Scores are 0-100 (higher is
|
|
5
|
+
* better). Reports without a score (e.g. legacy clients, unsupported agents,
|
|
6
|
+
* `not_evaluated: true`) are simply omitted from the rubric.
|
|
7
|
+
*/
|
|
8
|
+
const dimensionScoreSchema = z.object({
|
|
9
|
+
agent: z.enum(AGENT_NAMES_TUPLE),
|
|
10
|
+
score: z.number().min(0).max(100),
|
|
11
|
+
rationale: z.string().max(2048).optional(),
|
|
12
|
+
});
|
|
13
|
+
/**
|
|
14
|
+
* Repo override of weights. Keys are agent names; values 0-100. The set of
|
|
15
|
+
* supplied keys must sum to 100 (validated). Agents absent from this object
|
|
16
|
+
* fall back to DEFAULT_RUBRIC_WEIGHTS for that name. Useful when a project
|
|
17
|
+
* wants to ignore a dimension entirely (set its weight to 0 and redistribute).
|
|
18
|
+
*/
|
|
19
|
+
const weightOverridesSchema = z
|
|
20
|
+
.record(z.enum(AGENT_NAMES_TUPLE), z.number().min(0).max(100))
|
|
21
|
+
.optional();
|
|
22
|
+
const schema = z.object({
|
|
23
|
+
scores: z.array(dimensionScoreSchema).max(50),
|
|
24
|
+
weights: weightOverridesSchema,
|
|
25
|
+
threshold: z.number().min(0).max(100).optional().default(75),
|
|
26
|
+
});
|
|
27
|
+
const BAR_WIDTH = 20;
|
|
28
|
+
function renderBar(score) {
|
|
29
|
+
const filled = Math.round((score / 100) * BAR_WIDTH);
|
|
30
|
+
return "█".repeat(filled) + "░".repeat(BAR_WIDTH - filled);
|
|
31
|
+
}
|
|
32
|
+
function formatScorecard(out) {
|
|
33
|
+
const header = `SQUAD RUBRIC — weighted ${out.weighted_score.toFixed(1)} / 100 (threshold ${out.threshold})`;
|
|
34
|
+
const verdictLine = out.passes_threshold ? "PASS" : "BELOW THRESHOLD";
|
|
35
|
+
const lines = out.dimensions.map((d) => {
|
|
36
|
+
const flag = d.below_threshold ? " ⚠" : " ";
|
|
37
|
+
const dim = d.dimension.padEnd(20);
|
|
38
|
+
const bar = renderBar(d.score);
|
|
39
|
+
const score = String(d.score).padStart(3);
|
|
40
|
+
const weight = `×${d.weight.toString().padStart(2)}%`;
|
|
41
|
+
return `${dim} ${bar} ${score} ${weight} ${d.agent}${flag}`;
|
|
42
|
+
});
|
|
43
|
+
return [header, "─".repeat(70), ...lines, "─".repeat(70), verdictLine].join("\n");
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Compute the weighted-rubric scorecard from per-agent dimension scores.
|
|
47
|
+
*
|
|
48
|
+
* Math:
|
|
49
|
+
* - Reduce supplied scores to the subset of agents present.
|
|
50
|
+
* - Resolve weights: override (if provided AND keys sum to 100) > default.
|
|
51
|
+
* - For each scored agent, contribution = score * weight / 100.
|
|
52
|
+
* - weighted_score = sum of contributions normalised so weights sum to 100
|
|
53
|
+
* across the agents that ACTUALLY scored. (If only 6 of 9 agents scored,
|
|
54
|
+
* the rubric renormalises across those 6 instead of leaving 3 dimensions
|
|
55
|
+
* contributing 0 to the weighted average.)
|
|
56
|
+
* - Dimensions below `threshold` are flagged.
|
|
57
|
+
*
|
|
58
|
+
* Returns a RubricOutput; meta-agents (weight 0) and unscored agents are listed
|
|
59
|
+
* in `ignored_agents`.
|
|
60
|
+
*/
|
|
61
|
+
export function scoreRubric(input) {
|
|
62
|
+
const overrides = input.weights;
|
|
63
|
+
let weights;
|
|
64
|
+
let weightsSource;
|
|
65
|
+
if (overrides && Object.keys(overrides).length > 0) {
|
|
66
|
+
const overrideSum = Object.values(overrides).reduce((acc, v) => acc + v, 0);
|
|
67
|
+
if (Math.abs(overrideSum - 100) > 0.01) {
|
|
68
|
+
throw new Error(`weights override must sum to 100, got ${overrideSum}. Supplied: ${JSON.stringify(overrides)}`);
|
|
69
|
+
}
|
|
70
|
+
weights = { ...DEFAULT_RUBRIC_WEIGHTS, ...overrides };
|
|
71
|
+
weightsSource = "override";
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
weights = { ...DEFAULT_RUBRIC_WEIGHTS };
|
|
75
|
+
weightsSource = "default";
|
|
76
|
+
}
|
|
77
|
+
// Build the dimension list from scores actually supplied.
|
|
78
|
+
const scoredAgents = new Set(input.scores.map((s) => s.agent));
|
|
79
|
+
const ignored = [];
|
|
80
|
+
for (const agentName of AGENT_NAMES_TUPLE) {
|
|
81
|
+
if (!scoredAgents.has(agentName)) {
|
|
82
|
+
// Either unscored OR weight 0 (meta-agent). Both go to ignored, distinguished by weight.
|
|
83
|
+
ignored.push(agentName);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Effective weight base: sum of weights across agents that actually scored AND have weight > 0.
|
|
87
|
+
// We renormalise to this base so the weighted score reflects only the dimensions evaluated.
|
|
88
|
+
let weightBase = 0;
|
|
89
|
+
for (const s of input.scores) {
|
|
90
|
+
weightBase += weights[s.agent] ?? 0;
|
|
91
|
+
}
|
|
92
|
+
const dimensions = [];
|
|
93
|
+
let weightedScore = 0;
|
|
94
|
+
if (weightBase > 0) {
|
|
95
|
+
for (const s of input.scores) {
|
|
96
|
+
const w = weights[s.agent] ?? 0;
|
|
97
|
+
if (w === 0) {
|
|
98
|
+
// Meta-agent that somehow emitted a score — ignore from rubric, surface in ignored.
|
|
99
|
+
if (!ignored.includes(s.agent))
|
|
100
|
+
ignored.push(s.agent);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const normalisedWeight = (w / weightBase) * 100;
|
|
104
|
+
const contribution = (s.score * normalisedWeight) / 100;
|
|
105
|
+
dimensions.push({
|
|
106
|
+
agent: s.agent,
|
|
107
|
+
dimension: AGENTS[s.agent].dimension,
|
|
108
|
+
score: s.score,
|
|
109
|
+
weight: Math.round(normalisedWeight * 10) / 10,
|
|
110
|
+
contribution: Math.round(contribution * 10) / 10,
|
|
111
|
+
rationale: s.rationale,
|
|
112
|
+
below_threshold: s.score < input.threshold,
|
|
113
|
+
});
|
|
114
|
+
weightedScore += contribution;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
weightedScore = Math.round(weightedScore * 10) / 10;
|
|
118
|
+
// Sort dimensions by descending weight so the most important come first.
|
|
119
|
+
dimensions.sort((a, b) => b.weight - a.weight);
|
|
120
|
+
const partial = {
|
|
121
|
+
weighted_score: weightedScore,
|
|
122
|
+
threshold: input.threshold,
|
|
123
|
+
passes_threshold: weightedScore >= input.threshold,
|
|
124
|
+
dimensions,
|
|
125
|
+
ignored_agents: ignored,
|
|
126
|
+
weights_source: weightsSource,
|
|
127
|
+
};
|
|
128
|
+
return { ...partial, scorecard_text: formatScorecard(partial) };
|
|
129
|
+
}
|
|
130
|
+
export const scoreRubricTool = {
|
|
131
|
+
name: "score_rubric",
|
|
132
|
+
description: "Compute a weighted multi-dimensional rubric scorecard from per-agent advisory scores (0-100). " +
|
|
133
|
+
"Each agent represents one dimension (Architecture, Security, Testing, etc.) with a default weight; " +
|
|
134
|
+
"weights can be overridden per-repo via .squad.yaml. Returns weighted_score, per-dimension breakdown, " +
|
|
135
|
+
"pass/fail vs threshold (default 75), and a pre-formatted ASCII scorecard. " +
|
|
136
|
+
"Renormalises across agents that actually scored, so a partial advisory pass produces a meaningful score.",
|
|
137
|
+
schema,
|
|
138
|
+
handler: scoreRubric,
|
|
139
|
+
};
|
|
140
|
+
//# sourceMappingURL=score-rubric.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score-rubric.js","sourceRoot":"","sources":["../../src/tools/score-rubric.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ToolDef } from "./registry.js";
|
|
3
|
+
declare const schema: z.ZodObject<{
|
|
4
|
+
workspace_root: z.ZodString;
|
|
5
|
+
task_id: z.ZodNumber;
|
|
6
|
+
files: z.ZodArray<z.ZodString, "many">;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
files: string[];
|
|
9
|
+
workspace_root: string;
|
|
10
|
+
task_id: number;
|
|
11
|
+
}, {
|
|
12
|
+
files: string[];
|
|
13
|
+
workspace_root: string;
|
|
14
|
+
task_id: number;
|
|
15
|
+
}>;
|
|
16
|
+
type Input = z.infer<typeof schema>;
|
|
17
|
+
export interface SliceFilesForTaskOutput {
|
|
18
|
+
task_id: number;
|
|
19
|
+
scope: string | null;
|
|
20
|
+
matched: string[];
|
|
21
|
+
unmatched: string[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Filter a file list down to those that fall inside a task's scope glob.
|
|
25
|
+
* When the task has no scope (repo-wide), all files match. Wraps the same
|
|
26
|
+
* `matchesGlob` primitive used by skip_paths and learnings scope filters —
|
|
27
|
+
* single source of glob semantics across squad-mcp.
|
|
28
|
+
*/
|
|
29
|
+
export declare function sliceFilesForTaskTool(input: Input): Promise<SliceFilesForTaskOutput>;
|
|
30
|
+
export declare const sliceFilesForTaskToolDef: ToolDef<typeof schema>;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { readTasks } from "../tasks/store.js";
|
|
3
|
+
import { matchesGlob, readSquadYaml } from "../config/squad-yaml.js";
|
|
4
|
+
import { resolveSafePath, createSafePathContext } from "../util/path-safety.js";
|
|
5
|
+
import { SquadError } from "../errors.js";
|
|
6
|
+
const schema = z.object({
|
|
7
|
+
workspace_root: z.string().min(1).max(4096),
|
|
8
|
+
task_id: z.number().int().positive(),
|
|
9
|
+
files: z.array(z.string().min(1).max(4096)).max(10_000),
|
|
10
|
+
});
|
|
11
|
+
/**
|
|
12
|
+
* Filter a file list down to those that fall inside a task's scope glob.
|
|
13
|
+
* When the task has no scope (repo-wide), all files match. Wraps the same
|
|
14
|
+
* `matchesGlob` primitive used by skip_paths and learnings scope filters —
|
|
15
|
+
* single source of glob semantics across squad-mcp.
|
|
16
|
+
*/
|
|
17
|
+
export async function sliceFilesForTaskTool(input) {
|
|
18
|
+
const ctx = createSafePathContext();
|
|
19
|
+
const safeRoot = await resolveSafePath(input.workspace_root, ".", ctx);
|
|
20
|
+
const config = await readSquadYaml(safeRoot);
|
|
21
|
+
const file = await readTasks(safeRoot, { configuredPath: config.tasks.path });
|
|
22
|
+
const task = file.tasks.find((t) => t.id === input.task_id);
|
|
23
|
+
if (!task) {
|
|
24
|
+
throw new SquadError("INVALID_INPUT", `task ${input.task_id} not found in store`);
|
|
25
|
+
}
|
|
26
|
+
if (!task.scope) {
|
|
27
|
+
return {
|
|
28
|
+
task_id: input.task_id,
|
|
29
|
+
scope: null,
|
|
30
|
+
matched: [...input.files],
|
|
31
|
+
unmatched: [],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const matched = [];
|
|
35
|
+
const unmatched = [];
|
|
36
|
+
for (const f of input.files) {
|
|
37
|
+
if (matchesGlob(task.scope, f)) {
|
|
38
|
+
matched.push(f);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
unmatched.push(f);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { task_id: input.task_id, scope: task.scope, matched, unmatched };
|
|
45
|
+
}
|
|
46
|
+
export const sliceFilesForTaskToolDef = {
|
|
47
|
+
name: "slice_files_for_task",
|
|
48
|
+
description: "Filter a file list to those matching a task's `scope` glob. Without a scope, the task is repo-wide and all files match. Same glob primitive as skip_paths and learnings scope.",
|
|
49
|
+
schema,
|
|
50
|
+
handler: sliceFilesForTaskTool,
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=slice-files-for-task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slice-files-for-task.js","sourceRoot":"","sources":["../../src/tools/slice-files-for-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACpC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;CACxD,CAAC,CAAC;AAWH;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAY;IAEZ,MAAM,GAAG,GAAG,qBAAqB,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IAE7C,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,UAAU,CAClB,eAAe,EACf,QAAQ,KAAK,CAAC,OAAO,qBAAqB,CAC3C,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;YACzB,SAAS,EAAE,EAAE;SACd,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAC3E,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAA2B;IAC9D,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EACT,gLAAgL;IAClL,MAAM;IACN,OAAO,EAAE,qBAAqB;CAC/B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ToolDef } from "./registry.js";
|
|
3
|
+
import { type Task } from "../tasks/store.js";
|
|
4
|
+
declare const schema: z.ZodObject<{
|
|
5
|
+
workspace_root: z.ZodString;
|
|
6
|
+
task_id: z.ZodNumber;
|
|
7
|
+
/** When set, update that subtask's status instead of the parent task's. */
|
|
8
|
+
subtask_id: z.ZodOptional<z.ZodNumber>;
|
|
9
|
+
status: z.ZodEnum<["pending", "in-progress", "review", "done", "blocked", "cancelled"]>;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
status: "pending" | "in-progress" | "review" | "done" | "blocked" | "cancelled";
|
|
12
|
+
workspace_root: string;
|
|
13
|
+
task_id: number;
|
|
14
|
+
subtask_id?: number | undefined;
|
|
15
|
+
}, {
|
|
16
|
+
status: "pending" | "in-progress" | "review" | "done" | "blocked" | "cancelled";
|
|
17
|
+
workspace_root: string;
|
|
18
|
+
task_id: number;
|
|
19
|
+
subtask_id?: number | undefined;
|
|
20
|
+
}>;
|
|
21
|
+
type Input = z.infer<typeof schema>;
|
|
22
|
+
export interface UpdateTaskStatusOutput {
|
|
23
|
+
updated: true;
|
|
24
|
+
file: string;
|
|
25
|
+
task: Task;
|
|
26
|
+
}
|
|
27
|
+
export declare function updateTaskStatusTool(input: Input): Promise<UpdateTaskStatusOutput>;
|
|
28
|
+
export declare const updateTaskStatusToolDef: ToolDef<typeof schema>;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { updateTaskStatus } from "../tasks/store.js";
|
|
3
|
+
import { readSquadYaml } from "../config/squad-yaml.js";
|
|
4
|
+
import { resolveSafePath, createSafePathContext } from "../util/path-safety.js";
|
|
5
|
+
const schema = z.object({
|
|
6
|
+
workspace_root: z.string().min(1).max(4096),
|
|
7
|
+
task_id: z.number().int().positive(),
|
|
8
|
+
/** When set, update that subtask's status instead of the parent task's. */
|
|
9
|
+
subtask_id: z.number().int().positive().optional(),
|
|
10
|
+
status: z.enum([
|
|
11
|
+
"pending",
|
|
12
|
+
"in-progress",
|
|
13
|
+
"review",
|
|
14
|
+
"done",
|
|
15
|
+
"blocked",
|
|
16
|
+
"cancelled",
|
|
17
|
+
]),
|
|
18
|
+
});
|
|
19
|
+
export async function updateTaskStatusTool(input) {
|
|
20
|
+
const ctx = createSafePathContext();
|
|
21
|
+
const safeRoot = await resolveSafePath(input.workspace_root, ".", ctx);
|
|
22
|
+
const config = await readSquadYaml(safeRoot);
|
|
23
|
+
const result = await updateTaskStatus(safeRoot, input.task_id, input.status, {
|
|
24
|
+
...(input.subtask_id !== undefined && { subtaskId: input.subtask_id }),
|
|
25
|
+
configuredPath: config.tasks.path,
|
|
26
|
+
});
|
|
27
|
+
return { updated: true, file: result.filePath, task: result.task };
|
|
28
|
+
}
|
|
29
|
+
export const updateTaskStatusToolDef = {
|
|
30
|
+
name: "update_task_status",
|
|
31
|
+
description: "Flip a task (or subtask) status: pending / in-progress / review / done / blocked / cancelled. Stamps updated_at. Atomic write. Throws when the task / subtask id is unknown.",
|
|
32
|
+
schema,
|
|
33
|
+
handler: updateTaskStatusTool,
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=update-task-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-task-status.js","sourceRoot":"","sources":["../../src/tools/update-task-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAa,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACpC,2EAA2E;IAC3E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAClD,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;QACb,SAAS;QACT,aAAa;QACb,QAAQ;QACR,MAAM;QACN,SAAS;QACT,WAAW;KACZ,CAAC;CACH,CAAC,CAAC;AAUH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAY;IAEZ,MAAM,GAAG,GAAG,qBAAqB,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE;QAC3E,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;QACtE,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;KAClC,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAA2B;IAC7D,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EACT,8KAA8K;IAChL,MAAM;IACN,OAAO,EAAE,oBAAoB;CAC9B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gempack/squad-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "MCP server for the squad-dev workflow: classification, risk scoring, agent selection, advisory orchestration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
"agents",
|
|
46
46
|
"commands",
|
|
47
47
|
"skills",
|
|
48
|
+
"tools/post-review.mjs",
|
|
48
49
|
".claude-plugin",
|
|
49
50
|
"README.md",
|
|
50
51
|
"INSTALL.md",
|
|
@@ -61,9 +62,11 @@
|
|
|
61
62
|
},
|
|
62
63
|
"dependencies": {
|
|
63
64
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
65
|
+
"js-yaml": "^4.1.1",
|
|
64
66
|
"zod": "^3.23.0"
|
|
65
67
|
},
|
|
66
68
|
"devDependencies": {
|
|
69
|
+
"@types/js-yaml": "^4.0.9",
|
|
67
70
|
"@types/node": "^22.0.0",
|
|
68
71
|
"tsx": "^4.19.0",
|
|
69
72
|
"typescript": "^5.6.0",
|