@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.
Files changed (96) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +3 -2
  3. package/CHANGELOG.md +260 -17
  4. package/INSTALL.md +156 -24
  5. package/README.md +279 -27
  6. package/agents/{PO.md → product-owner.md} +33 -1
  7. package/agents/{Senior-Architect.md → senior-architect.md} +33 -1
  8. package/agents/{Senior-DBA.md → senior-dba.md} +33 -1
  9. package/agents/{Senior-Dev-Reviewer.md → senior-dev-reviewer.md} +33 -1
  10. package/agents/{Senior-Dev-Security.md → senior-dev-security.md} +33 -1
  11. package/agents/{Senior-Developer.md → senior-developer.md} +33 -1
  12. package/agents/{Senior-QA.md → senior-qa.md} +33 -1
  13. package/agents/{TechLead-Consolidator.md → tech-lead-consolidator.md} +7 -1
  14. package/agents/{TechLead-Planner.md → tech-lead-planner.md} +7 -1
  15. package/commands/squad-review.md +10 -58
  16. package/commands/squad.md +11 -70
  17. package/dist/config/ownership-matrix.d.ts +24 -2
  18. package/dist/config/ownership-matrix.js +466 -139
  19. package/dist/config/ownership-matrix.js.map +1 -1
  20. package/dist/config/squad-yaml.d.ts +242 -0
  21. package/dist/config/squad-yaml.js +403 -0
  22. package/dist/config/squad-yaml.js.map +1 -0
  23. package/dist/errors.d.ts +1 -1
  24. package/dist/errors.js +1 -1
  25. package/dist/errors.js.map +1 -1
  26. package/dist/format/pr-review.d.ts +61 -0
  27. package/dist/format/pr-review.js +146 -0
  28. package/dist/format/pr-review.js.map +1 -0
  29. package/dist/index.js +19 -13
  30. package/dist/index.js.map +1 -1
  31. package/dist/learning/format.d.ts +29 -0
  32. package/dist/learning/format.js +55 -0
  33. package/dist/learning/format.js.map +1 -0
  34. package/dist/learning/store.d.ts +102 -0
  35. package/dist/learning/store.js +169 -0
  36. package/dist/learning/store.js.map +1 -0
  37. package/dist/resources/agent-loader.d.ts +1 -1
  38. package/dist/resources/agent-loader.js +53 -40
  39. package/dist/resources/agent-loader.js.map +1 -1
  40. package/dist/tasks/select.d.ts +64 -0
  41. package/dist/tasks/select.js +84 -0
  42. package/dist/tasks/select.js.map +1 -0
  43. package/dist/tasks/store.d.ts +338 -0
  44. package/dist/tasks/store.js +321 -0
  45. package/dist/tasks/store.js.map +1 -0
  46. package/dist/tools/compose-advisory-bundle.d.ts +5 -5
  47. package/dist/tools/compose-advisory-bundle.js +24 -12
  48. package/dist/tools/compose-advisory-bundle.js.map +1 -1
  49. package/dist/tools/compose-prd-parse.d.ts +53 -0
  50. package/dist/tools/compose-prd-parse.js +167 -0
  51. package/dist/tools/compose-prd-parse.js.map +1 -0
  52. package/dist/tools/compose-squad-workflow.d.ts +28 -10
  53. package/dist/tools/compose-squad-workflow.js +0 -0
  54. package/dist/tools/compose-squad-workflow.js.map +1 -1
  55. package/dist/tools/consolidate.d.ts +55 -4
  56. package/dist/tools/consolidate.js +87 -15
  57. package/dist/tools/consolidate.js.map +1 -1
  58. package/dist/tools/expand-task.d.ts +51 -0
  59. package/dist/tools/expand-task.js +35 -0
  60. package/dist/tools/expand-task.js.map +1 -0
  61. package/dist/tools/list-tasks.d.ts +31 -0
  62. package/dist/tools/list-tasks.js +50 -0
  63. package/dist/tools/list-tasks.js.map +1 -0
  64. package/dist/tools/next-task.d.ts +37 -0
  65. package/dist/tools/next-task.js +60 -0
  66. package/dist/tools/next-task.js.map +1 -0
  67. package/dist/tools/read-learnings.d.ts +53 -0
  68. package/dist/tools/read-learnings.js +72 -0
  69. package/dist/tools/read-learnings.js.map +1 -0
  70. package/dist/tools/read-squad-config.d.ts +23 -0
  71. package/dist/tools/read-squad-config.js +34 -0
  72. package/dist/tools/read-squad-config.js.map +1 -0
  73. package/dist/tools/record-learning.d.ts +62 -0
  74. package/dist/tools/record-learning.js +80 -0
  75. package/dist/tools/record-learning.js.map +1 -0
  76. package/dist/tools/record-tasks.d.ts +71 -0
  77. package/dist/tools/record-tasks.js +45 -0
  78. package/dist/tools/record-tasks.js.map +1 -0
  79. package/dist/tools/registry.d.ts +1 -1
  80. package/dist/tools/registry.js +71 -39
  81. package/dist/tools/registry.js.map +1 -1
  82. package/dist/tools/score-rubric.d.ts +74 -0
  83. package/dist/tools/score-rubric.js +140 -0
  84. package/dist/tools/score-rubric.js.map +1 -0
  85. package/dist/tools/slice-files-for-task.d.ts +31 -0
  86. package/dist/tools/slice-files-for-task.js +52 -0
  87. package/dist/tools/slice-files-for-task.js.map +1 -0
  88. package/dist/tools/update-task-status.d.ts +29 -0
  89. package/dist/tools/update-task-status.js +35 -0
  90. package/dist/tools/update-task-status.js.map +1 -0
  91. package/package.json +4 -1
  92. package/skills/squad/SKILL.md +454 -0
  93. package/tools/post-review.mjs +212 -0
  94. /package/agents/{Skill-Squad-Dev.md → _shared/Skill-Squad-Dev.md} +0 -0
  95. /package/agents/{Skill-Squad-Review.md → _shared/Skill-Squad-Review.md} +0 -0
  96. /package/agents/{_Severity-and-Ownership.md → _shared/_Severity-and-Ownership.md} +0 -0
@@ -1,16 +1,27 @@
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 { classifyWorkTypeTool } from './classify-work-type.js';
8
- import { detectChangedFilesTool } from './detect-changed-files.js';
9
- import { validatePlanTextTool } from './validate-plan-text.js';
10
- import { composeSquadWorkflowTool } from './compose-squad-workflow.js';
11
- import { composeAdvisoryBundleTool } from './compose-advisory-bundle.js';
12
- import { isSquadError } from '../errors.js';
13
- import { logger, newRequestId } from '../observability/logger.js';
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: 'text', text: JSON.stringify(body, null, 2) }],
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 !== 'object')
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 === 'object') {
57
- out[k] = '[object]';
78
+ else if (typeof v === "object") {
79
+ out[k] = "[object]";
58
80
  }
59
- else if (typeof v === 'string') {
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('unknown tool', {
95
+ logger.warn("unknown tool", {
74
96
  tool: name,
75
97
  request_id: requestId,
76
- outcome: 'unknown_tool',
98
+ outcome: "unknown_tool",
77
99
  duration_ms: Date.now() - started,
78
100
  });
79
101
  return asToolErrorResponse({
80
- error: { code: 'UNKNOWN_TOOL', message: `unknown tool: ${name}` },
102
+ error: { code: "UNKNOWN_TOOL", message: `unknown tool: ${name}` },
81
103
  });
82
104
  }
83
- logger.debug('tool call', { tool: name, request_id: requestId, input_shape: shapeOf(args) });
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('invalid input', {
112
+ logger.warn("invalid input", {
87
113
  tool: name,
88
114
  request_id: requestId,
89
- outcome: 'invalid_input',
115
+ outcome: "invalid_input",
90
116
  duration_ms: Date.now() - started,
91
117
  });
92
118
  return asToolErrorResponse({
93
119
  error: {
94
- code: 'INVALID_INPUT',
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('tool ok', {
128
+ logger.info("tool ok", {
103
129
  tool: name,
104
130
  request_id: requestId,
105
- outcome: 'success',
131
+ outcome: "success",
106
132
  duration_ms: Date.now() - started,
107
133
  });
108
134
  return {
109
- content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
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('tool error', {
143
+ logger.warn("tool error", {
116
144
  tool: name,
117
145
  request_id: requestId,
118
- outcome: 'tool_error',
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('internal error', {
155
+ logger.error("internal error", {
128
156
  tool: name,
129
157
  request_id: requestId,
130
- outcome: 'internal_error',
158
+ outcome: "internal_error",
131
159
  duration_ms,
132
160
  details: { message },
133
161
  });
134
162
  return asToolErrorResponse({
135
- error: { code: 'INTERNAL_ERROR', message: 'internal tool error' },
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 { type: 'object', properties, ...(required.length ? { required } : {}) };
177
+ return {
178
+ type: "object",
179
+ properties,
180
+ ...(required.length ? { required } : {}),
181
+ };
150
182
  }
151
183
  if (schema instanceof z.ZodString)
152
- return { type: 'string' };
184
+ return { type: "string" };
153
185
  if (schema instanceof z.ZodNumber)
154
- return { type: 'number' };
186
+ return { type: "number" };
155
187
  if (schema instanceof z.ZodBoolean)
156
- return { type: 'boolean' };
188
+ return { type: "boolean" };
157
189
  if (schema instanceof z.ZodArray)
158
- return { type: 'array', items: zodToJsonSchema(schema.element) };
190
+ return { type: "array", items: zodToJsonSchema(schema.element) };
159
191
  if (schema instanceof z.ZodEnum)
160
- return { type: 'string', enum: schema.options };
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":"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"}
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.5.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",