@gempack/squad-mcp 0.3.1 → 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 +4 -2
- package/CHANGELOG.md +395 -8
- package/INSTALL.md +554 -0
- package/README.md +311 -25
- package/agents/{Skill-Squad-Dev.md → _shared/Skill-Squad-Dev.md} +30 -3
- package/agents/{Skill-Squad-Review.md → _shared/Skill-Squad-Review.md} +70 -0
- 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 +640 -0
- 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/brainstorm.md +21 -0
- package/commands/commit-suggest.md +12 -0
- 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 +14 -2
- package/dist/resources/agent-loader.js +235 -53
- 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/agents.js +4 -1
- package/dist/tools/agents.js.map +1 -1
- 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/dist/util/override-allowlist.d.ts +63 -0
- package/dist/util/override-allowlist.js +191 -0
- package/dist/util/override-allowlist.js.map +1 -0
- package/dist/util/path-internal.d.ts +6 -0
- package/dist/util/path-internal.js +27 -0
- package/dist/util/path-internal.js.map +1 -0
- package/dist/util/path-safety.js +0 -0
- package/dist/util/path-safety.js.map +1 -1
- package/package.json +5 -1
- package/skills/brainstorm/SKILL.md +284 -0
- package/skills/commit-suggest/SKILL.md +255 -0
- package/skills/squad/SKILL.md +454 -0
- package/tools/post-review.mjs +212 -0
- package/agents/Senior-Dev-Reviewer.md +0 -104
- /package/agents/{_Severity-and-Ownership.md → _shared/_Severity-and-Ownership.md} +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
import { AGENT_NAMES_TUPLE } from
|
|
3
|
-
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AGENT_NAMES_TUPLE } from "../config/ownership-matrix.js";
|
|
3
|
+
import { scoreRubric } from "./score-rubric.js";
|
|
4
|
+
const severity = z.enum(["Blocker", "Major", "Minor", "Suggestion"]);
|
|
4
5
|
const reportSchema = z.object({
|
|
5
6
|
agent: z.enum(AGENT_NAMES_TUPLE),
|
|
6
7
|
findings: z
|
|
@@ -13,9 +14,35 @@ const reportSchema = z.object({
|
|
|
13
14
|
}))
|
|
14
15
|
.max(500),
|
|
15
16
|
not_evaluated: z.boolean().optional().default(false),
|
|
17
|
+
/**
|
|
18
|
+
* Optional dimension score 0-100 produced by the agent. When at least one
|
|
19
|
+
* report carries a score, the consolidator emits a rubric scorecard and the
|
|
20
|
+
* verdict can be downgraded if `min_score` is supplied. Backward compatible:
|
|
21
|
+
* pre-rubric clients omit this field and behave exactly as before.
|
|
22
|
+
*/
|
|
23
|
+
score: z.number().min(0).max(100).optional(),
|
|
24
|
+
score_rationale: z.string().max(2048).optional(),
|
|
16
25
|
});
|
|
17
26
|
const schema = z.object({
|
|
18
27
|
reports: z.array(reportSchema).max(50),
|
|
28
|
+
/**
|
|
29
|
+
* Optional weight overrides for the rubric (sum must be 100). Forwarded to
|
|
30
|
+
* `score_rubric`. Ignored when no report carries a score.
|
|
31
|
+
*/
|
|
32
|
+
weights: z
|
|
33
|
+
.record(z.enum(AGENT_NAMES_TUPLE), z.number().min(0).max(100))
|
|
34
|
+
.optional(),
|
|
35
|
+
/**
|
|
36
|
+
* Per-dimension threshold for flagging individual scores. Defaults to 75.
|
|
37
|
+
*/
|
|
38
|
+
threshold: z.number().min(0).max(100).optional().default(75),
|
|
39
|
+
/**
|
|
40
|
+
* If supplied AND the weighted score is below this floor AND severity rules
|
|
41
|
+
* would otherwise return APPROVED, downgrade to CHANGES_REQUIRED. Lets a
|
|
42
|
+
* project enforce a "minimum quality bar" beyond just absence of Blockers.
|
|
43
|
+
* Independent of `threshold` (which flags individual dimensions).
|
|
44
|
+
*/
|
|
45
|
+
min_score: z.number().min(0).max(100).optional(),
|
|
19
46
|
});
|
|
20
47
|
export function applyConsolidationRules(input) {
|
|
21
48
|
const blockers = [];
|
|
@@ -23,7 +50,12 @@ export function applyConsolidationRules(input) {
|
|
|
23
50
|
const forwarded = [];
|
|
24
51
|
const notEvaluated = [];
|
|
25
52
|
const agentsInvolved = new Set();
|
|
26
|
-
const counts = {
|
|
53
|
+
const counts = {
|
|
54
|
+
Blocker: 0,
|
|
55
|
+
Major: 0,
|
|
56
|
+
Minor: 0,
|
|
57
|
+
Suggestion: 0,
|
|
58
|
+
};
|
|
27
59
|
for (const r of input.reports) {
|
|
28
60
|
agentsInvolved.add(r.agent);
|
|
29
61
|
if (r.not_evaluated) {
|
|
@@ -32,27 +64,62 @@ export function applyConsolidationRules(input) {
|
|
|
32
64
|
}
|
|
33
65
|
for (const f of r.findings) {
|
|
34
66
|
counts[f.severity] += 1;
|
|
35
|
-
if (f.severity ===
|
|
67
|
+
if (f.severity === "Blocker")
|
|
36
68
|
blockers.push({ agent: r.agent, title: f.title });
|
|
37
|
-
if (f.severity ===
|
|
69
|
+
if (f.severity === "Major" && !f.justified)
|
|
38
70
|
majorsUnjustified.push({ agent: r.agent, title: f.title });
|
|
39
71
|
if (f.forwarded_to)
|
|
40
72
|
forwarded.push({ from: r.agent, to: f.forwarded_to, title: f.title });
|
|
41
73
|
}
|
|
42
74
|
}
|
|
75
|
+
// Compute rubric only if at least one report carried a score. Avoids
|
|
76
|
+
// disrupting legacy callers that never opted in.
|
|
77
|
+
const scoredReports = input.reports.filter((r) => typeof r.score === "number" && !r.not_evaluated);
|
|
78
|
+
let rubric = null;
|
|
79
|
+
if (scoredReports.length > 0) {
|
|
80
|
+
rubric = scoreRubric({
|
|
81
|
+
scores: scoredReports.map((r) => ({
|
|
82
|
+
agent: r.agent,
|
|
83
|
+
score: r.score,
|
|
84
|
+
rationale: r.score_rationale,
|
|
85
|
+
})),
|
|
86
|
+
weights: input.weights,
|
|
87
|
+
threshold: input.threshold,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// Severity rules (legacy, unchanged)
|
|
43
91
|
let verdict;
|
|
44
92
|
if (blockers.length)
|
|
45
|
-
verdict =
|
|
93
|
+
verdict = "REJECTED";
|
|
46
94
|
else if (majorsUnjustified.length)
|
|
47
|
-
verdict =
|
|
95
|
+
verdict = "REJECTED";
|
|
48
96
|
else if (counts.Major + counts.Minor > 0)
|
|
49
|
-
verdict =
|
|
97
|
+
verdict = "CHANGES_REQUIRED";
|
|
50
98
|
else
|
|
51
|
-
verdict =
|
|
99
|
+
verdict = "APPROVED";
|
|
100
|
+
// Optional score floor: APPROVED with weighted_score < min_score → CHANGES_REQUIRED.
|
|
101
|
+
// Never PROMOTES a verdict (a low score doesn't override a Blocker rejection),
|
|
102
|
+
// and never demotes below CHANGES_REQUIRED.
|
|
103
|
+
let downgradedByScore = false;
|
|
104
|
+
if (typeof input.min_score === "number" &&
|
|
105
|
+
rubric !== null &&
|
|
106
|
+
verdict === "APPROVED" &&
|
|
107
|
+
rubric.weighted_score < input.min_score) {
|
|
108
|
+
verdict = "CHANGES_REQUIRED";
|
|
109
|
+
downgradedByScore = true;
|
|
110
|
+
}
|
|
111
|
+
const scoreSummary = rubric
|
|
112
|
+
? ` Weighted score: ${rubric.weighted_score.toFixed(1)}/100${rubric.passes_threshold ? "" : " (below threshold)"}.`
|
|
113
|
+
: "";
|
|
114
|
+
const downgradeSummary = downgradedByScore
|
|
115
|
+
? ` Downgraded from APPROVED to CHANGES_REQUIRED because weighted score < min_score (${input.min_score}).`
|
|
116
|
+
: "";
|
|
52
117
|
const summary = `Verdict: ${verdict}. ` +
|
|
53
118
|
`${blockers.length} blocker(s), ${majorsUnjustified.length} unjustified major(s), ` +
|
|
54
119
|
`${forwarded.length} forwarded item(s), ${notEvaluated.length} agent(s) not evaluated. ` +
|
|
55
|
-
`Severity counts: ${counts.Blocker} blocker / ${counts.Major} major / ${counts.Minor} minor / ${counts.Suggestion} suggestion
|
|
120
|
+
`Severity counts: ${counts.Blocker} blocker / ${counts.Major} major / ${counts.Minor} minor / ${counts.Suggestion} suggestion.` +
|
|
121
|
+
scoreSummary +
|
|
122
|
+
downgradeSummary;
|
|
56
123
|
return {
|
|
57
124
|
verdict,
|
|
58
125
|
blockers,
|
|
@@ -62,13 +129,18 @@ export function applyConsolidationRules(input) {
|
|
|
62
129
|
severity_counts: counts,
|
|
63
130
|
agents_involved: Array.from(agentsInvolved).sort(),
|
|
64
131
|
summary,
|
|
132
|
+
rubric,
|
|
133
|
+
downgraded_by_score: downgradedByScore,
|
|
65
134
|
};
|
|
66
135
|
}
|
|
67
136
|
export const applyConsolidationRulesTool = {
|
|
68
|
-
name:
|
|
69
|
-
description:
|
|
70
|
-
|
|
71
|
-
|
|
137
|
+
name: "apply_consolidation_rules",
|
|
138
|
+
description: "Aggregate advisory reports and emit a verdict per the rules in _shared/_Severity-and-Ownership.md. " +
|
|
139
|
+
"Blocker -> REJECTED. Unjustified Major -> REJECTED. Otherwise CHANGES_REQUIRED or APPROVED. " +
|
|
140
|
+
"When reports carry per-dimension scores (0-100), also returns a weighted rubric scorecard " +
|
|
141
|
+
"(see score_rubric). Optional `min_score` downgrades APPROVED to CHANGES_REQUIRED if the " +
|
|
142
|
+
"weighted score is below the floor — useful for projects that want a quality bar beyond " +
|
|
143
|
+
"absence of blockers. Includes severity_counts and agents_involved for downstream summarization.",
|
|
72
144
|
schema,
|
|
73
145
|
handler: applyConsolidationRules,
|
|
74
146
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consolidate.js","sourceRoot":"","sources":["../../src/tools/consolidate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"consolidate.js","sourceRoot":"","sources":["../../src/tools/consolidate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
subtasks: z.ZodArray<z.ZodObject<{
|
|
8
|
+
title: z.ZodString;
|
|
9
|
+
description: z.ZodOptional<z.ZodString>;
|
|
10
|
+
/** Reference sibling subtasks by id (assigned in input order, starting at max+1). */
|
|
11
|
+
dependencies: z.ZodOptional<z.ZodArray<z.ZodNumber, "many">>;
|
|
12
|
+
details: z.ZodOptional<z.ZodString>;
|
|
13
|
+
}, "strip", z.ZodTypeAny, {
|
|
14
|
+
title: string;
|
|
15
|
+
details?: string | undefined;
|
|
16
|
+
description?: string | undefined;
|
|
17
|
+
dependencies?: number[] | undefined;
|
|
18
|
+
}, {
|
|
19
|
+
title: string;
|
|
20
|
+
details?: string | undefined;
|
|
21
|
+
description?: string | undefined;
|
|
22
|
+
dependencies?: number[] | undefined;
|
|
23
|
+
}>, "many">;
|
|
24
|
+
}, "strip", z.ZodTypeAny, {
|
|
25
|
+
workspace_root: string;
|
|
26
|
+
subtasks: {
|
|
27
|
+
title: string;
|
|
28
|
+
details?: string | undefined;
|
|
29
|
+
description?: string | undefined;
|
|
30
|
+
dependencies?: number[] | undefined;
|
|
31
|
+
}[];
|
|
32
|
+
task_id: number;
|
|
33
|
+
}, {
|
|
34
|
+
workspace_root: string;
|
|
35
|
+
subtasks: {
|
|
36
|
+
title: string;
|
|
37
|
+
details?: string | undefined;
|
|
38
|
+
description?: string | undefined;
|
|
39
|
+
dependencies?: number[] | undefined;
|
|
40
|
+
}[];
|
|
41
|
+
task_id: number;
|
|
42
|
+
}>;
|
|
43
|
+
type Input = z.infer<typeof schema>;
|
|
44
|
+
export interface ExpandTaskOutput {
|
|
45
|
+
expanded: true;
|
|
46
|
+
file: string;
|
|
47
|
+
task: Task;
|
|
48
|
+
}
|
|
49
|
+
export declare function expandTaskTool(input: Input): Promise<ExpandTaskOutput>;
|
|
50
|
+
export declare const expandTaskToolDef: ToolDef<typeof schema>;
|
|
51
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { expandTask } from "../tasks/store.js";
|
|
3
|
+
import { readSquadYaml } from "../config/squad-yaml.js";
|
|
4
|
+
import { resolveSafePath, createSafePathContext } from "../util/path-safety.js";
|
|
5
|
+
const subtaskInputSchema = z.object({
|
|
6
|
+
title: z.string().min(1).max(512),
|
|
7
|
+
description: z.string().max(4096).optional(),
|
|
8
|
+
/** Reference sibling subtasks by id (assigned in input order, starting at max+1). */
|
|
9
|
+
dependencies: z.array(z.number().int().positive()).max(50).optional(),
|
|
10
|
+
details: z.string().max(8192).optional(),
|
|
11
|
+
});
|
|
12
|
+
const schema = z.object({
|
|
13
|
+
workspace_root: z.string().min(1).max(4096),
|
|
14
|
+
task_id: z.number().int().positive(),
|
|
15
|
+
subtasks: z.array(subtaskInputSchema).min(1).max(50),
|
|
16
|
+
});
|
|
17
|
+
export async function expandTaskTool(input) {
|
|
18
|
+
const ctx = createSafePathContext();
|
|
19
|
+
const safeRoot = await resolveSafePath(input.workspace_root, ".", ctx);
|
|
20
|
+
const config = await readSquadYaml(safeRoot);
|
|
21
|
+
const result = await expandTask(safeRoot, input.task_id, input.subtasks.map((s) => ({
|
|
22
|
+
title: s.title,
|
|
23
|
+
...(s.description !== undefined && { description: s.description }),
|
|
24
|
+
...(s.dependencies !== undefined && { dependencies: s.dependencies }),
|
|
25
|
+
...(s.details !== undefined && { details: s.details }),
|
|
26
|
+
})), { configuredPath: config.tasks.path });
|
|
27
|
+
return { expanded: true, file: result.filePath, task: result.task };
|
|
28
|
+
}
|
|
29
|
+
export const expandTaskToolDef = {
|
|
30
|
+
name: "expand_task",
|
|
31
|
+
description: "Append subtasks to an existing task. Mechanical only — the caller (skill or LLM) supplies the subtask inputs. Subtask ids allocated sequentially starting from `max(existing.subtasks.id) + 1`. Side-effecting, atomic write.",
|
|
32
|
+
schema,
|
|
33
|
+
handler: expandTaskTool,
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=expand-task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand-task.js","sourceRoot":"","sources":["../../src/tools/expand-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAa,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;IAC5C,qFAAqF;IACrF,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACrE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;CACzC,CAAC,CAAC;AAEH,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,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;CACrD,CAAC,CAAC;AAUH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAY;IAC/C,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,UAAU,CAC7B,QAAQ,EACR,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,GAAG,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAClE,GAAG,CAAC,CAAC,CAAC,YAAY,KAAK,SAAS,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC;QACrE,GAAG,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;KACvD,CAAC,CAAC,EACH,EAAE,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CACtC,CAAC;IAEF,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,+NAA+N;IACjO,MAAM;IACN,OAAO,EAAE,cAAc;CACxB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
status: z.ZodOptional<z.ZodArray<z.ZodEnum<["pending", "in-progress", "review", "done", "blocked", "cancelled"]>, "many">>;
|
|
7
|
+
agent: z.ZodOptional<z.ZodEnum<[import("../config/ownership-matrix.js").AgentName, ...import("../config/ownership-matrix.js").AgentName[]]>>;
|
|
8
|
+
changed_files: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
9
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
workspace_root: string;
|
|
12
|
+
status?: ("pending" | "in-progress" | "review" | "done" | "blocked" | "cancelled")[] | undefined;
|
|
13
|
+
agent?: import("../config/ownership-matrix.js").AgentName | undefined;
|
|
14
|
+
limit?: number | undefined;
|
|
15
|
+
changed_files?: string[] | undefined;
|
|
16
|
+
}, {
|
|
17
|
+
workspace_root: string;
|
|
18
|
+
status?: ("pending" | "in-progress" | "review" | "done" | "blocked" | "cancelled")[] | undefined;
|
|
19
|
+
agent?: import("../config/ownership-matrix.js").AgentName | undefined;
|
|
20
|
+
limit?: number | undefined;
|
|
21
|
+
changed_files?: string[] | undefined;
|
|
22
|
+
}>;
|
|
23
|
+
type Input = z.infer<typeof schema>;
|
|
24
|
+
export interface ListTasksOutput {
|
|
25
|
+
tasks: Task[];
|
|
26
|
+
total_in_store: number;
|
|
27
|
+
source: string | null;
|
|
28
|
+
}
|
|
29
|
+
export declare function listTasksTool(input: Input): Promise<ListTasksOutput>;
|
|
30
|
+
export declare const listTasksToolDef: ToolDef<typeof schema>;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { readTasks } from "../tasks/store.js";
|
|
3
|
+
import { listTasks as listTasksFn } from "../tasks/select.js";
|
|
4
|
+
import { readSquadYaml } from "../config/squad-yaml.js";
|
|
5
|
+
import { resolveSafePath, createSafePathContext } from "../util/path-safety.js";
|
|
6
|
+
import { AGENT_NAMES_TUPLE } from "../config/ownership-matrix.js";
|
|
7
|
+
const taskStatusEnum = z.enum([
|
|
8
|
+
"pending",
|
|
9
|
+
"in-progress",
|
|
10
|
+
"review",
|
|
11
|
+
"done",
|
|
12
|
+
"blocked",
|
|
13
|
+
"cancelled",
|
|
14
|
+
]);
|
|
15
|
+
const schema = z.object({
|
|
16
|
+
workspace_root: z.string().min(1).max(4096),
|
|
17
|
+
status: z.array(taskStatusEnum).max(6).optional(),
|
|
18
|
+
agent: z.enum(AGENT_NAMES_TUPLE).optional(),
|
|
19
|
+
changed_files: z.array(z.string().min(1).max(4096)).max(5000).optional(),
|
|
20
|
+
limit: z.number().int().positive().max(2000).optional(),
|
|
21
|
+
});
|
|
22
|
+
export async function listTasksTool(input) {
|
|
23
|
+
const ctx = createSafePathContext();
|
|
24
|
+
const safeRoot = await resolveSafePath(input.workspace_root, ".", ctx);
|
|
25
|
+
const config = await readSquadYaml(safeRoot);
|
|
26
|
+
if (!config.tasks.enabled) {
|
|
27
|
+
return { tasks: [], total_in_store: 0, source: null };
|
|
28
|
+
}
|
|
29
|
+
const file = await readTasks(safeRoot, { configuredPath: config.tasks.path });
|
|
30
|
+
const filtered = listTasksFn(file.tasks, {
|
|
31
|
+
...(input.status !== undefined && { status: input.status }),
|
|
32
|
+
...(input.agent !== undefined && { agent: input.agent }),
|
|
33
|
+
...(input.changed_files !== undefined && {
|
|
34
|
+
changed_files: input.changed_files,
|
|
35
|
+
}),
|
|
36
|
+
...(input.limit !== undefined && { limit: input.limit }),
|
|
37
|
+
});
|
|
38
|
+
return {
|
|
39
|
+
tasks: filtered,
|
|
40
|
+
total_in_store: file.tasks.length,
|
|
41
|
+
source: file.tasks.length > 0 ? `${safeRoot}/${config.tasks.path}` : null,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export const listTasksToolDef = {
|
|
45
|
+
name: "list_tasks",
|
|
46
|
+
description: "List tasks from `.squad/tasks.json` with optional filters (status, agent, changed_files glob match against task.scope). Returns the filtered tasks plus the total count in the store.",
|
|
47
|
+
schema,
|
|
48
|
+
handler: listTasksTool,
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=list-tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-tasks.js","sourceRoot":"","sources":["../../src/tools/list-tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
agent: z.ZodOptional<z.ZodEnum<[import("../config/ownership-matrix.js").AgentName, ...import("../config/ownership-matrix.js").AgentName[]]>>;
|
|
7
|
+
changed_files: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
8
|
+
/** Override default candidate statuses (default `["pending"]`). */
|
|
9
|
+
candidate_statuses: z.ZodOptional<z.ZodArray<z.ZodEnum<["pending", "in-progress", "review", "done", "blocked", "cancelled"]>, "many">>;
|
|
10
|
+
/** Override what "complete" means for dep checks (default `["done"]`). */
|
|
11
|
+
done_statuses: z.ZodOptional<z.ZodArray<z.ZodEnum<["pending", "in-progress", "review", "done", "blocked", "cancelled"]>, "many">>;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
workspace_root: string;
|
|
14
|
+
agent?: import("../config/ownership-matrix.js").AgentName | undefined;
|
|
15
|
+
changed_files?: string[] | undefined;
|
|
16
|
+
candidate_statuses?: ("pending" | "in-progress" | "review" | "done" | "blocked" | "cancelled")[] | undefined;
|
|
17
|
+
done_statuses?: ("pending" | "in-progress" | "review" | "done" | "blocked" | "cancelled")[] | undefined;
|
|
18
|
+
}, {
|
|
19
|
+
workspace_root: string;
|
|
20
|
+
agent?: import("../config/ownership-matrix.js").AgentName | undefined;
|
|
21
|
+
changed_files?: string[] | undefined;
|
|
22
|
+
candidate_statuses?: ("pending" | "in-progress" | "review" | "done" | "blocked" | "cancelled")[] | undefined;
|
|
23
|
+
done_statuses?: ("pending" | "in-progress" | "review" | "done" | "blocked" | "cancelled")[] | undefined;
|
|
24
|
+
}>;
|
|
25
|
+
type Input = z.infer<typeof schema>;
|
|
26
|
+
export interface NextTaskOutput {
|
|
27
|
+
task: Task | null;
|
|
28
|
+
reason: "no_candidates" | "all_blocked" | "ok";
|
|
29
|
+
blocked: Array<{
|
|
30
|
+
id: number;
|
|
31
|
+
title: string;
|
|
32
|
+
missing_deps: number[];
|
|
33
|
+
}>;
|
|
34
|
+
}
|
|
35
|
+
export declare function nextTaskTool(input: Input): Promise<NextTaskOutput>;
|
|
36
|
+
export declare const nextTaskToolDef: ToolDef<typeof schema>;
|
|
37
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { readTasks } from "../tasks/store.js";
|
|
3
|
+
import { nextTask as nextTaskFn } from "../tasks/select.js";
|
|
4
|
+
import { readSquadYaml } from "../config/squad-yaml.js";
|
|
5
|
+
import { resolveSafePath, createSafePathContext } from "../util/path-safety.js";
|
|
6
|
+
import { AGENT_NAMES_TUPLE } from "../config/ownership-matrix.js";
|
|
7
|
+
const taskStatusEnum = z.enum([
|
|
8
|
+
"pending",
|
|
9
|
+
"in-progress",
|
|
10
|
+
"review",
|
|
11
|
+
"done",
|
|
12
|
+
"blocked",
|
|
13
|
+
"cancelled",
|
|
14
|
+
]);
|
|
15
|
+
const schema = z.object({
|
|
16
|
+
workspace_root: z.string().min(1).max(4096),
|
|
17
|
+
agent: z.enum(AGENT_NAMES_TUPLE).optional(),
|
|
18
|
+
changed_files: z.array(z.string().min(1).max(4096)).max(5000).optional(),
|
|
19
|
+
/** Override default candidate statuses (default `["pending"]`). */
|
|
20
|
+
candidate_statuses: z.array(taskStatusEnum).max(6).optional(),
|
|
21
|
+
/** Override what "complete" means for dep checks (default `["done"]`). */
|
|
22
|
+
done_statuses: z.array(taskStatusEnum).max(6).optional(),
|
|
23
|
+
});
|
|
24
|
+
export async function nextTaskTool(input) {
|
|
25
|
+
const ctx = createSafePathContext();
|
|
26
|
+
const safeRoot = await resolveSafePath(input.workspace_root, ".", ctx);
|
|
27
|
+
const config = await readSquadYaml(safeRoot);
|
|
28
|
+
if (!config.tasks.enabled) {
|
|
29
|
+
return { task: null, reason: "no_candidates", blocked: [] };
|
|
30
|
+
}
|
|
31
|
+
const file = await readTasks(safeRoot, { configuredPath: config.tasks.path });
|
|
32
|
+
const result = nextTaskFn(file.tasks, {
|
|
33
|
+
...(input.agent !== undefined && { agent: input.agent }),
|
|
34
|
+
...(input.changed_files !== undefined && {
|
|
35
|
+
changed_files: input.changed_files,
|
|
36
|
+
}),
|
|
37
|
+
...(input.candidate_statuses !== undefined && {
|
|
38
|
+
candidate_statuses: input.candidate_statuses,
|
|
39
|
+
}),
|
|
40
|
+
...(input.done_statuses !== undefined && {
|
|
41
|
+
done_statuses: input.done_statuses,
|
|
42
|
+
}),
|
|
43
|
+
});
|
|
44
|
+
return {
|
|
45
|
+
task: result.task,
|
|
46
|
+
reason: result.reason,
|
|
47
|
+
blocked: result.blocked.map((b) => ({
|
|
48
|
+
id: b.task.id,
|
|
49
|
+
title: b.task.title,
|
|
50
|
+
missing_deps: b.missing_deps,
|
|
51
|
+
})),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export const nextTaskToolDef = {
|
|
55
|
+
name: "next_task",
|
|
56
|
+
description: "Pick the next ready task: candidate status (default pending), all dependencies done, optional agent / changed_files filter. Tiebreaker priority then id. Returns null with reason when none ready, plus the blocked list so callers can show 'X is next when Y completes'.",
|
|
57
|
+
schema,
|
|
58
|
+
handler: nextTaskTool,
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=next-task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"next-task.js","sourceRoot":"","sources":["../../src/tools/next-task.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ToolDef } from "./registry.js";
|
|
3
|
+
import { type LearningEntry } from "../learning/store.js";
|
|
4
|
+
declare const schema: z.ZodObject<{
|
|
5
|
+
workspace_root: z.ZodString;
|
|
6
|
+
/** Cap rendered/returned entries. Default 50. */
|
|
7
|
+
limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
8
|
+
/** When set, restrict to learnings for this agent. */
|
|
9
|
+
agent: z.ZodOptional<z.ZodEnum<[import("../config/ownership-matrix.js").AgentName, ...import("../config/ownership-matrix.js").AgentName[]]>>;
|
|
10
|
+
/** When set, restrict to accepts or rejects. Default both. */
|
|
11
|
+
decision: z.ZodOptional<z.ZodEnum<["accept", "reject"]>>;
|
|
12
|
+
/**
|
|
13
|
+
* When set, filter scope-tagged entries to those whose scope glob matches
|
|
14
|
+
* at least one of these files. Entries without a scope always pass.
|
|
15
|
+
*/
|
|
16
|
+
changed_files: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
17
|
+
/**
|
|
18
|
+
* When true (default), also return the rendered markdown block ready to
|
|
19
|
+
* inject into an agent / consolidator prompt. When false, only the entries
|
|
20
|
+
* array. Skip the render when the caller will format their own.
|
|
21
|
+
*/
|
|
22
|
+
include_rendered: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
23
|
+
}, "strip", z.ZodTypeAny, {
|
|
24
|
+
workspace_root: string;
|
|
25
|
+
limit: number;
|
|
26
|
+
include_rendered: boolean;
|
|
27
|
+
agent?: import("../config/ownership-matrix.js").AgentName | undefined;
|
|
28
|
+
decision?: "accept" | "reject" | undefined;
|
|
29
|
+
changed_files?: string[] | undefined;
|
|
30
|
+
}, {
|
|
31
|
+
workspace_root: string;
|
|
32
|
+
agent?: import("../config/ownership-matrix.js").AgentName | undefined;
|
|
33
|
+
decision?: "accept" | "reject" | undefined;
|
|
34
|
+
limit?: number | undefined;
|
|
35
|
+
changed_files?: string[] | undefined;
|
|
36
|
+
include_rendered?: boolean | undefined;
|
|
37
|
+
}>;
|
|
38
|
+
type Input = z.infer<typeof schema>;
|
|
39
|
+
export interface ReadLearningsOutput {
|
|
40
|
+
entries: LearningEntry[];
|
|
41
|
+
total_in_store: number;
|
|
42
|
+
rendered: string;
|
|
43
|
+
source: string | null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Read recent learnings from `.squad/learnings.jsonl` (path overridable via
|
|
47
|
+
* `.squad.yaml`.learnings.path). Returns the filtered entries plus a
|
|
48
|
+
* pre-rendered markdown block ready to inject into an agent / consolidator
|
|
49
|
+
* prompt. Pure-ish — reads filesystem, no writes.
|
|
50
|
+
*/
|
|
51
|
+
export declare function readLearningsTool(input: Input): Promise<ReadLearningsOutput>;
|
|
52
|
+
export declare const readLearningsToolDef: ToolDef<typeof schema>;
|
|
53
|
+
export {};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { readLearnings, tailRecent, } from "../learning/store.js";
|
|
3
|
+
import { formatLearningsForPrompt } from "../learning/format.js";
|
|
4
|
+
import { readSquadYaml } from "../config/squad-yaml.js";
|
|
5
|
+
import { resolveSafePath, createSafePathContext } from "../util/path-safety.js";
|
|
6
|
+
import { AGENT_NAMES_TUPLE } from "../config/ownership-matrix.js";
|
|
7
|
+
const schema = z.object({
|
|
8
|
+
workspace_root: z.string().min(1).max(4096),
|
|
9
|
+
/** Cap rendered/returned entries. Default 50. */
|
|
10
|
+
limit: z.number().int().positive().max(200).optional().default(50),
|
|
11
|
+
/** When set, restrict to learnings for this agent. */
|
|
12
|
+
agent: z.enum(AGENT_NAMES_TUPLE).optional(),
|
|
13
|
+
/** When set, restrict to accepts or rejects. Default both. */
|
|
14
|
+
decision: z.enum(["accept", "reject"]).optional(),
|
|
15
|
+
/**
|
|
16
|
+
* When set, filter scope-tagged entries to those whose scope glob matches
|
|
17
|
+
* at least one of these files. Entries without a scope always pass.
|
|
18
|
+
*/
|
|
19
|
+
changed_files: z.array(z.string().min(1).max(4096)).max(5000).optional(),
|
|
20
|
+
/**
|
|
21
|
+
* When true (default), also return the rendered markdown block ready to
|
|
22
|
+
* inject into an agent / consolidator prompt. When false, only the entries
|
|
23
|
+
* array. Skip the render when the caller will format their own.
|
|
24
|
+
*/
|
|
25
|
+
include_rendered: z.boolean().optional().default(true),
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* Read recent learnings from `.squad/learnings.jsonl` (path overridable via
|
|
29
|
+
* `.squad.yaml`.learnings.path). Returns the filtered entries plus a
|
|
30
|
+
* pre-rendered markdown block ready to inject into an agent / consolidator
|
|
31
|
+
* prompt. Pure-ish — reads filesystem, no writes.
|
|
32
|
+
*/
|
|
33
|
+
export async function readLearningsTool(input) {
|
|
34
|
+
const ctx = createSafePathContext();
|
|
35
|
+
const safeRoot = await resolveSafePath(input.workspace_root, ".", ctx);
|
|
36
|
+
const config = await readSquadYaml(safeRoot);
|
|
37
|
+
// Honor the master switch — if learnings disabled, return empty without
|
|
38
|
+
// touching the filesystem (the user explicitly turned it off).
|
|
39
|
+
if (!config.learnings.enabled) {
|
|
40
|
+
return { entries: [], total_in_store: 0, rendered: "", source: null };
|
|
41
|
+
}
|
|
42
|
+
const configuredPath = config.learnings.path;
|
|
43
|
+
const allEntries = await readLearnings(safeRoot, { configuredPath });
|
|
44
|
+
const filtered = tailRecent(allEntries, input.limit, {
|
|
45
|
+
...(input.agent !== undefined ? { agent: input.agent } : {}),
|
|
46
|
+
...(input.decision !== undefined ? { decision: input.decision } : {}),
|
|
47
|
+
});
|
|
48
|
+
const rendered = input.include_rendered
|
|
49
|
+
? formatLearningsForPrompt(filtered, {
|
|
50
|
+
...(input.changed_files ? { changedFiles: input.changed_files } : {}),
|
|
51
|
+
limit: input.limit,
|
|
52
|
+
})
|
|
53
|
+
: "";
|
|
54
|
+
return {
|
|
55
|
+
entries: filtered,
|
|
56
|
+
total_in_store: allEntries.length,
|
|
57
|
+
rendered,
|
|
58
|
+
source: allEntries.length > 0
|
|
59
|
+
? `${safeRoot}/${configuredPath ?? ".squad/learnings.jsonl"}`
|
|
60
|
+
: null,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export const readLearningsToolDef = {
|
|
64
|
+
name: "read_learnings",
|
|
65
|
+
description: "Read recent team decisions from `.squad/learnings.jsonl` (path overridable via .squad.yaml.learnings.path). " +
|
|
66
|
+
"Returns the filtered entries plus a pre-rendered markdown block ready to inject into agent / consolidator prompts. " +
|
|
67
|
+
"Filters: agent, decision (accept|reject), changed_files (matches scoped entries against these paths). " +
|
|
68
|
+
"Used by the /squad-review skill in Phase 5 (advisory) and Phase 10 (consolidation) to make the squad less repetitive over time.",
|
|
69
|
+
schema,
|
|
70
|
+
handler: readLearningsTool,
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=read-learnings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-learnings.js","sourceRoot":"","sources":["../../src/tools/read-learnings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ToolDef } from "./registry.js";
|
|
3
|
+
import { type ResolvedSquadConfig } from "../config/squad-yaml.js";
|
|
4
|
+
declare const schema: z.ZodObject<{
|
|
5
|
+
workspace_root: z.ZodString;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
workspace_root: string;
|
|
8
|
+
}, {
|
|
9
|
+
workspace_root: string;
|
|
10
|
+
}>;
|
|
11
|
+
type Input = z.infer<typeof schema>;
|
|
12
|
+
/**
|
|
13
|
+
* MCP tool wrapper around the YAML reader. Lets non-Claude-Code clients (or
|
|
14
|
+
* non-composer callers) inspect the resolved config explicitly. Pure tools
|
|
15
|
+
* (apply_consolidation_rules, score_rubric, select_squad) do NOT call this —
|
|
16
|
+
* the composers (compose_squad_workflow, compose_advisory_bundle) read
|
|
17
|
+
* .squad.yaml automatically when they receive workspace_root, then pass the
|
|
18
|
+
* concrete values down. This tool is for direct introspection and for clients
|
|
19
|
+
* that want to construct a tailored bundle themselves.
|
|
20
|
+
*/
|
|
21
|
+
export declare function readSquadConfig(input: Input): Promise<ResolvedSquadConfig>;
|
|
22
|
+
export declare const readSquadConfigTool: ToolDef<typeof schema>;
|
|
23
|
+
export {};
|