@mandujs/mcp 0.36.3 → 0.37.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/package.json +4 -4
- package/src/activity-adapter.ts +23 -23
- package/src/adapters/index.ts +20 -20
- package/src/adapters/monitor-adapter.ts +100 -100
- package/src/adapters/tool-adapter.ts +90 -90
- package/src/executor/index.ts +22 -22
- package/src/executor/tool-executor.ts +148 -148
- package/src/hooks/config-watcher.ts +173 -173
- package/src/hooks/index.ts +23 -23
- package/src/hooks/mcp-hooks.ts +227 -227
- package/src/index.ts +0 -0
- package/src/logging/index.ts +15 -15
- package/src/logging/mcp-transport.ts +134 -134
- package/src/profiles.ts +34 -34
- package/src/registry/index.ts +13 -13
- package/src/registry/mcp-tool-registry.ts +298 -298
- package/src/resources/skills/guides.ts +1136 -1136
- package/src/resources/skills/index.ts +12 -12
- package/src/resources/skills/mandu-composition/SKILL.md +91 -91
- package/src/resources/skills/mandu-composition/metadata.json +13 -13
- package/src/resources/skills/mandu-composition/rules/_sections.md +26 -26
- package/src/resources/skills/mandu-composition/rules/_template.md +77 -77
- package/src/resources/skills/mandu-composition/rules/comp-arch-avoid-boolean-props.md +146 -146
- package/src/resources/skills/mandu-composition/rules/comp-arch-compound-components.md +164 -164
- package/src/resources/skills/mandu-composition/rules/comp-island-event.md +161 -161
- package/src/resources/skills/mandu-composition/rules/comp-island-slot-split.md +167 -167
- package/src/resources/skills/mandu-composition/rules/comp-pattern-children.md +149 -149
- package/src/resources/skills/mandu-composition/rules/comp-state-context-interface.md +148 -148
- package/src/resources/skills/mandu-composition/rules/comp-state-lift-state.md +150 -150
- package/src/resources/skills/mandu-deployment/SKILL.md +92 -92
- package/src/resources/skills/mandu-deployment/_sections.md +41 -41
- package/src/resources/skills/mandu-deployment/_template.md +38 -38
- package/src/resources/skills/mandu-deployment/metadata.json +13 -13
- package/src/resources/skills/mandu-deployment/rules/db-provider-supabase.md +300 -300
- package/src/resources/skills/mandu-deployment/rules/deploy-build-bun.md +109 -109
- package/src/resources/skills/mandu-deployment/rules/deploy-build-output.md +115 -115
- package/src/resources/skills/mandu-deployment/rules/deploy-cicd-github.md +219 -219
- package/src/resources/skills/mandu-deployment/rules/deploy-docker-bun.md +150 -150
- package/src/resources/skills/mandu-deployment/rules/deploy-docker-compose.md +223 -223
- package/src/resources/skills/mandu-deployment/rules/deploy-platform-fly.md +152 -152
- package/src/resources/skills/mandu-deployment/rules/deploy-platform-render.md +179 -179
- package/src/resources/skills/mandu-deployment/rules/deploy-platform-vercel.md +140 -140
- package/src/resources/skills/mandu-fs-routes/SKILL.md +82 -82
- package/src/resources/skills/mandu-fs-routes/metadata.json +12 -12
- package/src/resources/skills/mandu-fs-routes/rules/_sections.md +36 -36
- package/src/resources/skills/mandu-fs-routes/rules/_template.md +69 -69
- package/src/resources/skills/mandu-fs-routes/rules/routes-api-methods.md +65 -65
- package/src/resources/skills/mandu-fs-routes/rules/routes-dynamic-param.md +93 -93
- package/src/resources/skills/mandu-fs-routes/rules/routes-naming-page.md +55 -55
- package/src/resources/skills/mandu-guard/SKILL.md +129 -129
- package/src/resources/skills/mandu-guard/metadata.json +12 -12
- package/src/resources/skills/mandu-guard/rules/_sections.md +36 -36
- package/src/resources/skills/mandu-guard/rules/_template.md +82 -82
- package/src/resources/skills/mandu-guard/rules/guard-config-rules.md +100 -100
- package/src/resources/skills/mandu-guard/rules/guard-layer-direction.md +76 -76
- package/src/resources/skills/mandu-guard/rules/guard-preset-mandu.md +81 -81
- package/src/resources/skills/mandu-guard/rules/guard-validate-import.md +80 -80
- package/src/resources/skills/mandu-hydration/SKILL.md +91 -91
- package/src/resources/skills/mandu-hydration/metadata.json +12 -12
- package/src/resources/skills/mandu-hydration/rules/_sections.md +31 -31
- package/src/resources/skills/mandu-hydration/rules/_template.md +72 -72
- package/src/resources/skills/mandu-hydration/rules/hydration-data-event.md +109 -109
- package/src/resources/skills/mandu-hydration/rules/hydration-directive-use-client.md +55 -55
- package/src/resources/skills/mandu-hydration/rules/hydration-island-setup.md +113 -113
- package/src/resources/skills/mandu-hydration/rules/hydration-priority-visible.md +68 -68
- package/src/resources/skills/mandu-performance/SKILL.md +85 -85
- package/src/resources/skills/mandu-performance/metadata.json +14 -14
- package/src/resources/skills/mandu-performance/rules/_sections.md +31 -31
- package/src/resources/skills/mandu-performance/rules/_template.md +64 -64
- package/src/resources/skills/mandu-performance/rules/perf-async-defer-await.md +103 -103
- package/src/resources/skills/mandu-performance/rules/perf-async-parallel.md +95 -95
- package/src/resources/skills/mandu-performance/rules/perf-bun-file.md +124 -124
- package/src/resources/skills/mandu-performance/rules/perf-bun-serve.md +125 -125
- package/src/resources/skills/mandu-performance/rules/perf-bundle-imports.md +80 -80
- package/src/resources/skills/mandu-performance/rules/perf-bundle-island-lazy.md +145 -145
- package/src/resources/skills/mandu-performance/rules/perf-cache-react.md +98 -98
- package/src/resources/skills/mandu-performance/rules/perf-render-transitions.md +154 -154
- package/src/resources/skills/mandu-security/SKILL.md +87 -87
- package/src/resources/skills/mandu-security/metadata.json +13 -13
- package/src/resources/skills/mandu-security/rules/_sections.md +31 -31
- package/src/resources/skills/mandu-security/rules/_template.md +74 -74
- package/src/resources/skills/mandu-security/rules/sec-auth-guard.md +127 -127
- package/src/resources/skills/mandu-security/rules/sec-env-management.md +133 -133
- package/src/resources/skills/mandu-security/rules/sec-input-validate.md +148 -148
- package/src/resources/skills/mandu-security/rules/sec-protect-csrf.md +146 -146
- package/src/resources/skills/mandu-security/rules/sec-protect-headers.md +138 -138
- package/src/resources/skills/mandu-slot/SKILL.md +85 -85
- package/src/resources/skills/mandu-slot/metadata.json +12 -12
- package/src/resources/skills/mandu-slot/rules/_sections.md +36 -36
- package/src/resources/skills/mandu-slot/rules/_template.md +63 -63
- package/src/resources/skills/mandu-slot/rules/slot-basic-structure.md +38 -38
- package/src/resources/skills/mandu-slot/rules/slot-ctx-response.md +56 -56
- package/src/resources/skills/mandu-slot/rules/slot-guard-auth.md +59 -59
- package/src/resources/skills/mandu-slot/rules/slot-http-methods.md +64 -64
- package/src/resources/skills/mandu-styling/SKILL.md +154 -154
- package/src/resources/skills/mandu-styling/_sections.md +43 -43
- package/src/resources/skills/mandu-styling/_template.md +32 -32
- package/src/resources/skills/mandu-styling/metadata.json +15 -15
- package/src/resources/skills/mandu-styling/rules/style-component-compound.md +235 -235
- package/src/resources/skills/mandu-styling/rules/style-component-slots.md +255 -255
- package/src/resources/skills/mandu-styling/rules/style-component-tokens.md +205 -205
- package/src/resources/skills/mandu-styling/rules/style-island-animations.md +272 -272
- package/src/resources/skills/mandu-styling/rules/style-island-scoping.md +167 -167
- package/src/resources/skills/mandu-styling/rules/style-island-variants.md +221 -221
- package/src/resources/skills/mandu-styling/rules/style-perf-critical.md +209 -209
- package/src/resources/skills/mandu-styling/rules/style-perf-purge.md +192 -192
- package/src/resources/skills/mandu-styling/rules/style-setup-modules.md +162 -162
- package/src/resources/skills/mandu-styling/rules/style-setup-panda.md +164 -164
- package/src/resources/skills/mandu-styling/rules/style-setup-tailwind.md +170 -170
- package/src/resources/skills/mandu-styling/rules/style-tailwind-v4-gotchas.md +179 -179
- package/src/resources/skills/mandu-styling/rules/style-theme-darkmode.md +229 -229
- package/src/resources/skills/mandu-testing/SKILL.md +99 -99
- package/src/resources/skills/mandu-testing/metadata.json +13 -13
- package/src/resources/skills/mandu-testing/rules/_sections.md +26 -26
- package/src/resources/skills/mandu-testing/rules/_template.md +65 -65
- package/src/resources/skills/mandu-testing/rules/test-component-island.md +195 -195
- package/src/resources/skills/mandu-testing/rules/test-e2e-playwright.md +196 -196
- package/src/resources/skills/mandu-testing/rules/test-mock-fetch.md +219 -219
- package/src/resources/skills/mandu-testing/rules/test-slot-unit.md +192 -192
- package/src/resources/skills/mandu-ui/SKILL.md +117 -117
- package/src/resources/skills/mandu-ui/_sections.md +23 -23
- package/src/resources/skills/mandu-ui/_template.md +32 -32
- package/src/resources/skills/mandu-ui/metadata.json +13 -13
- package/src/resources/skills/mandu-ui/rules/ui-accessibility-aria.md +232 -232
- package/src/resources/skills/mandu-ui/rules/ui-accessibility-focus.md +238 -238
- package/src/resources/skills/mandu-ui/rules/ui-composition-patterns.md +259 -259
- package/src/resources/skills/mandu-ui/rules/ui-island-integration.md +258 -258
- package/src/resources/skills/mandu-ui/rules/ui-radix-patterns.md +213 -213
- package/src/resources/skills/mandu-ui/rules/ui-shadcn-setup.md +209 -209
- package/src/resources/skills/recipes.ts +932 -932
- package/src/server.ts +3 -3
- package/src/tools/ate-exemplar.ts +92 -92
- package/src/tools/ate-flakes.ts +90 -90
- package/src/tools/ate-mutate.ts +103 -103
- package/src/tools/ate-mutation-report.ts +64 -64
- package/src/tools/ate-oracle-pending.ts +49 -49
- package/src/tools/ate-oracle-replay.ts +44 -44
- package/src/tools/ate-oracle-verdict.ts +70 -70
- package/src/tools/ate-prompt.ts +146 -146
- package/src/tools/brain.ts +3 -3
- package/src/tools/deploy-plan.ts +378 -378
- package/src/tools/deploy-preview.ts +316 -316
- package/src/tools/design.ts +825 -825
- package/src/tools/docs.ts +350 -350
- package/src/tools/kitchen.ts +109 -23
- package/src/tools/lint.ts +226 -226
- package/src/tools/loop-close.ts +175 -175
- package/src/tools/negotiate.ts +263 -263
- package/src/tools/run-tests.ts +424 -424
- package/src/tools/runtime.ts +1 -1
- package/src/tools/slot-validation.ts +199 -199
- package/src/tx-lock.ts +73 -73
- package/src/utils/runtime-control.ts +52 -52
package/src/tools/ate-prompt.ts
CHANGED
|
@@ -1,146 +1,146 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `mandu_ate_prompt` — Phase A.3 prompt catalog tool.
|
|
3
|
-
*
|
|
4
|
-
* See `docs/ate/roadmap-v2-agent-native.md` §4.2 and §7 (A.3 extension
|
|
5
|
-
* "Pre-composed prompts") for the design.
|
|
6
|
-
*
|
|
7
|
-
* Semantics:
|
|
8
|
-
* - If `context` is provided, the handler composes the full prompt
|
|
9
|
-
* (template + matched exemplars + serialized context) and returns
|
|
10
|
-
* a single ready-to-send-to-LLM string.
|
|
11
|
-
* - If `context` is omitted, the handler returns the raw template body +
|
|
12
|
-
* sha256 + a peek at available exemplars — the agent composes.
|
|
13
|
-
*
|
|
14
|
-
* Snake_case tool name (§11 decision #4). Read-only.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import type { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
18
|
-
import {
|
|
19
|
-
loadPrompt,
|
|
20
|
-
scanExemplars,
|
|
21
|
-
composePrompt,
|
|
22
|
-
type Exemplar,
|
|
23
|
-
} from "@mandujs/ate";
|
|
24
|
-
|
|
25
|
-
export const atePromptToolDefinitions: Tool[] = [
|
|
26
|
-
{
|
|
27
|
-
name: "mandu_ate_prompt",
|
|
28
|
-
annotations: {
|
|
29
|
-
readOnlyHint: true,
|
|
30
|
-
},
|
|
31
|
-
description:
|
|
32
|
-
"Phase A.3 agent-native prompt catalog. Returns the system prompt for a " +
|
|
33
|
-
"given test kind, with Mandu-specific primitives, anti-patterns, and the " +
|
|
34
|
-
"selector convention baked in. When `context` is passed, the handler " +
|
|
35
|
-
"also injects up-to-3 matching exemplars (tagged with @ate-exemplar:) " +
|
|
36
|
-
"plus the JSON context block and returns a fully composed, ready-to-" +
|
|
37
|
-
"send-to-LLM string. When `context` is omitted, the handler returns the " +
|
|
38
|
-
"raw template + the separate exemplar list so the agent can compose. " +
|
|
39
|
-
"Kinds available in v1: filling_unit, filling_integration, e2e_playwright. " +
|
|
40
|
-
"The returned sha256 is stable per-version and safe as a cache key.",
|
|
41
|
-
inputSchema: {
|
|
42
|
-
type: "object",
|
|
43
|
-
properties: {
|
|
44
|
-
repoRoot: {
|
|
45
|
-
type: "string",
|
|
46
|
-
description:
|
|
47
|
-
"Absolute path to the Mandu project root. Required when context is " +
|
|
48
|
-
"omitted so we can scan exemplars from the repo.",
|
|
49
|
-
},
|
|
50
|
-
kind: {
|
|
51
|
-
type: "string",
|
|
52
|
-
description:
|
|
53
|
-
"Prompt kind. v1 catalog: filling_unit | filling_integration | e2e_playwright.",
|
|
54
|
-
},
|
|
55
|
-
version: {
|
|
56
|
-
type: "number",
|
|
57
|
-
description:
|
|
58
|
-
"Pin to a specific template version. Defaults to the highest available.",
|
|
59
|
-
},
|
|
60
|
-
context: {
|
|
61
|
-
type: "object",
|
|
62
|
-
description:
|
|
63
|
-
"Optional semantic context (usually the output of mandu_ate_context). " +
|
|
64
|
-
"When present, the returned `prompt` is pre-composed.",
|
|
65
|
-
additionalProperties: true,
|
|
66
|
-
},
|
|
67
|
-
maxPositive: {
|
|
68
|
-
type: "number",
|
|
69
|
-
description: "Max positive exemplars to inject. Default 3.",
|
|
70
|
-
},
|
|
71
|
-
maxAnti: {
|
|
72
|
-
type: "number",
|
|
73
|
-
description: "Max anti-exemplars to inject. Default 1.",
|
|
74
|
-
},
|
|
75
|
-
},
|
|
76
|
-
required: ["kind"],
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
];
|
|
80
|
-
|
|
81
|
-
export function atePromptTools(_projectRoot: string) {
|
|
82
|
-
return {
|
|
83
|
-
mandu_ate_prompt: async (args: Record<string, unknown>) => {
|
|
84
|
-
const kind = args.kind as string | undefined;
|
|
85
|
-
if (!kind || typeof kind !== "string") {
|
|
86
|
-
return { ok: false, error: "'kind' is required and must be a string" };
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
const version = typeof args.version === "number" ? args.version : undefined;
|
|
90
|
-
const repoRoot = typeof args.repoRoot === "string" ? args.repoRoot : undefined;
|
|
91
|
-
const context = args.context;
|
|
92
|
-
const maxPositive = typeof args.maxPositive === "number" ? args.maxPositive : undefined;
|
|
93
|
-
const maxAnti = typeof args.maxAnti === "number" ? args.maxAnti : undefined;
|
|
94
|
-
|
|
95
|
-
try {
|
|
96
|
-
// When context is given, return a pre-composed prompt.
|
|
97
|
-
if (context !== undefined) {
|
|
98
|
-
const composed = await composePrompt({
|
|
99
|
-
kind,
|
|
100
|
-
version,
|
|
101
|
-
context,
|
|
102
|
-
repoRoot,
|
|
103
|
-
...(maxPositive !== undefined ? { maxPositive } : {}),
|
|
104
|
-
...(maxAnti !== undefined ? { maxAnti } : {}),
|
|
105
|
-
});
|
|
106
|
-
return {
|
|
107
|
-
ok: true,
|
|
108
|
-
prompt: composed.prompt,
|
|
109
|
-
sha256: composed.sha256,
|
|
110
|
-
version: composed.version,
|
|
111
|
-
kind: composed.kind,
|
|
112
|
-
exemplarCount: composed.exemplarCount,
|
|
113
|
-
antiCount: composed.antiCount,
|
|
114
|
-
tokenEstimate: composed.tokenEstimate,
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Otherwise: raw template + exemplar peek so the agent composes.
|
|
119
|
-
const loaded = loadPrompt(kind, version);
|
|
120
|
-
let exemplars: Exemplar[] = [];
|
|
121
|
-
if (repoRoot) {
|
|
122
|
-
try {
|
|
123
|
-
const all = await scanExemplars(repoRoot);
|
|
124
|
-
exemplars = all.filter((e) => e.kind === kind).slice(0, 5);
|
|
125
|
-
} catch {
|
|
126
|
-
// non-fatal — caller may invoke without a repoRoot
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
return {
|
|
130
|
-
ok: true,
|
|
131
|
-
prompt: loaded.raw,
|
|
132
|
-
sha256: loaded.sha256,
|
|
133
|
-
version: loaded.frontmatter.version,
|
|
134
|
-
kind: loaded.frontmatter.kind,
|
|
135
|
-
exemplars,
|
|
136
|
-
exemplarCount: exemplars.filter((e) => !e.anti).length,
|
|
137
|
-
antiCount: exemplars.filter((e) => e.anti).length,
|
|
138
|
-
tokenEstimate: Math.ceil(loaded.raw.length / 4),
|
|
139
|
-
};
|
|
140
|
-
} catch (err) {
|
|
141
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
142
|
-
return { ok: false, error: msg };
|
|
143
|
-
}
|
|
144
|
-
},
|
|
145
|
-
};
|
|
146
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* `mandu_ate_prompt` — Phase A.3 prompt catalog tool.
|
|
3
|
+
*
|
|
4
|
+
* See `docs/ate/roadmap-v2-agent-native.md` §4.2 and §7 (A.3 extension
|
|
5
|
+
* "Pre-composed prompts") for the design.
|
|
6
|
+
*
|
|
7
|
+
* Semantics:
|
|
8
|
+
* - If `context` is provided, the handler composes the full prompt
|
|
9
|
+
* (template + matched exemplars + serialized context) and returns
|
|
10
|
+
* a single ready-to-send-to-LLM string.
|
|
11
|
+
* - If `context` is omitted, the handler returns the raw template body +
|
|
12
|
+
* sha256 + a peek at available exemplars — the agent composes.
|
|
13
|
+
*
|
|
14
|
+
* Snake_case tool name (§11 decision #4). Read-only.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
18
|
+
import {
|
|
19
|
+
loadPrompt,
|
|
20
|
+
scanExemplars,
|
|
21
|
+
composePrompt,
|
|
22
|
+
type Exemplar,
|
|
23
|
+
} from "@mandujs/ate";
|
|
24
|
+
|
|
25
|
+
export const atePromptToolDefinitions: Tool[] = [
|
|
26
|
+
{
|
|
27
|
+
name: "mandu_ate_prompt",
|
|
28
|
+
annotations: {
|
|
29
|
+
readOnlyHint: true,
|
|
30
|
+
},
|
|
31
|
+
description:
|
|
32
|
+
"Phase A.3 agent-native prompt catalog. Returns the system prompt for a " +
|
|
33
|
+
"given test kind, with Mandu-specific primitives, anti-patterns, and the " +
|
|
34
|
+
"selector convention baked in. When `context` is passed, the handler " +
|
|
35
|
+
"also injects up-to-3 matching exemplars (tagged with @ate-exemplar:) " +
|
|
36
|
+
"plus the JSON context block and returns a fully composed, ready-to-" +
|
|
37
|
+
"send-to-LLM string. When `context` is omitted, the handler returns the " +
|
|
38
|
+
"raw template + the separate exemplar list so the agent can compose. " +
|
|
39
|
+
"Kinds available in v1: filling_unit, filling_integration, e2e_playwright. " +
|
|
40
|
+
"The returned sha256 is stable per-version and safe as a cache key.",
|
|
41
|
+
inputSchema: {
|
|
42
|
+
type: "object",
|
|
43
|
+
properties: {
|
|
44
|
+
repoRoot: {
|
|
45
|
+
type: "string",
|
|
46
|
+
description:
|
|
47
|
+
"Absolute path to the Mandu project root. Required when context is " +
|
|
48
|
+
"omitted so we can scan exemplars from the repo.",
|
|
49
|
+
},
|
|
50
|
+
kind: {
|
|
51
|
+
type: "string",
|
|
52
|
+
description:
|
|
53
|
+
"Prompt kind. v1 catalog: filling_unit | filling_integration | e2e_playwright.",
|
|
54
|
+
},
|
|
55
|
+
version: {
|
|
56
|
+
type: "number",
|
|
57
|
+
description:
|
|
58
|
+
"Pin to a specific template version. Defaults to the highest available.",
|
|
59
|
+
},
|
|
60
|
+
context: {
|
|
61
|
+
type: "object",
|
|
62
|
+
description:
|
|
63
|
+
"Optional semantic context (usually the output of mandu_ate_context). " +
|
|
64
|
+
"When present, the returned `prompt` is pre-composed.",
|
|
65
|
+
additionalProperties: true,
|
|
66
|
+
},
|
|
67
|
+
maxPositive: {
|
|
68
|
+
type: "number",
|
|
69
|
+
description: "Max positive exemplars to inject. Default 3.",
|
|
70
|
+
},
|
|
71
|
+
maxAnti: {
|
|
72
|
+
type: "number",
|
|
73
|
+
description: "Max anti-exemplars to inject. Default 1.",
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
required: ["kind"],
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
];
|
|
80
|
+
|
|
81
|
+
export function atePromptTools(_projectRoot: string) {
|
|
82
|
+
return {
|
|
83
|
+
mandu_ate_prompt: async (args: Record<string, unknown>) => {
|
|
84
|
+
const kind = args.kind as string | undefined;
|
|
85
|
+
if (!kind || typeof kind !== "string") {
|
|
86
|
+
return { ok: false, error: "'kind' is required and must be a string" };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const version = typeof args.version === "number" ? args.version : undefined;
|
|
90
|
+
const repoRoot = typeof args.repoRoot === "string" ? args.repoRoot : undefined;
|
|
91
|
+
const context = args.context;
|
|
92
|
+
const maxPositive = typeof args.maxPositive === "number" ? args.maxPositive : undefined;
|
|
93
|
+
const maxAnti = typeof args.maxAnti === "number" ? args.maxAnti : undefined;
|
|
94
|
+
|
|
95
|
+
try {
|
|
96
|
+
// When context is given, return a pre-composed prompt.
|
|
97
|
+
if (context !== undefined) {
|
|
98
|
+
const composed = await composePrompt({
|
|
99
|
+
kind,
|
|
100
|
+
version,
|
|
101
|
+
context,
|
|
102
|
+
repoRoot,
|
|
103
|
+
...(maxPositive !== undefined ? { maxPositive } : {}),
|
|
104
|
+
...(maxAnti !== undefined ? { maxAnti } : {}),
|
|
105
|
+
});
|
|
106
|
+
return {
|
|
107
|
+
ok: true,
|
|
108
|
+
prompt: composed.prompt,
|
|
109
|
+
sha256: composed.sha256,
|
|
110
|
+
version: composed.version,
|
|
111
|
+
kind: composed.kind,
|
|
112
|
+
exemplarCount: composed.exemplarCount,
|
|
113
|
+
antiCount: composed.antiCount,
|
|
114
|
+
tokenEstimate: composed.tokenEstimate,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Otherwise: raw template + exemplar peek so the agent composes.
|
|
119
|
+
const loaded = loadPrompt(kind, version);
|
|
120
|
+
let exemplars: Exemplar[] = [];
|
|
121
|
+
if (repoRoot) {
|
|
122
|
+
try {
|
|
123
|
+
const all = await scanExemplars(repoRoot);
|
|
124
|
+
exemplars = all.filter((e) => e.kind === kind).slice(0, 5);
|
|
125
|
+
} catch {
|
|
126
|
+
// non-fatal — caller may invoke without a repoRoot
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
ok: true,
|
|
131
|
+
prompt: loaded.raw,
|
|
132
|
+
sha256: loaded.sha256,
|
|
133
|
+
version: loaded.frontmatter.version,
|
|
134
|
+
kind: loaded.frontmatter.kind,
|
|
135
|
+
exemplars,
|
|
136
|
+
exemplarCount: exemplars.filter((e) => !e.anti).length,
|
|
137
|
+
antiCount: exemplars.filter((e) => e.anti).length,
|
|
138
|
+
tokenEstimate: Math.ceil(loaded.raw.length / 4),
|
|
139
|
+
};
|
|
140
|
+
} catch (err) {
|
|
141
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
142
|
+
return { ok: false, error: msg };
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
package/src/tools/brain.ts
CHANGED
|
@@ -496,9 +496,9 @@ export function brainTools(projectRoot: string, server?: Server, monitor?: Activ
|
|
|
496
496
|
mcpWarningUnsubscribe = null;
|
|
497
497
|
}
|
|
498
498
|
|
|
499
|
-
await stopWatcher();
|
|
500
|
-
|
|
501
|
-
return {
|
|
499
|
+
await stopWatcher();
|
|
500
|
+
|
|
501
|
+
return {
|
|
502
502
|
success: true,
|
|
503
503
|
message: "Watch stopped and notifications cleaned up",
|
|
504
504
|
};
|