blueprint-extractor-mcp 6.0.8 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -20
- package/dist/active-editor-session.d.ts +2 -0
- package/dist/active-editor-session.js +48 -0
- package/dist/catalogs/example-catalog.js +44 -0
- package/dist/helpers/next-step-hints.js +1 -1
- package/dist/helpers/tool-help.js +12 -0
- package/dist/project-controller.js +6 -2
- package/dist/prompts/prompt-catalog.js +58 -0
- package/dist/register-server-tools.js +10 -0
- package/dist/resources/static-doc-resources.js +33 -0
- package/dist/schemas/tool-inputs.d.ts +14 -14
- package/dist/schemas/tool-results.d.ts +1333 -27
- package/dist/schemas/tool-results.js +141 -0
- package/dist/server-config.js +8 -2
- package/dist/tool-context.d.ts +26 -0
- package/dist/tool-surface-manager.d.ts +1 -1
- package/dist/tool-surface-manager.js +28 -0
- package/dist/tools/analysis-tools.d.ts +8 -0
- package/dist/tools/analysis-tools.js +502 -0
- package/dist/tools/project-control.d.ts +2 -1
- package/dist/tools/project-control.js +28 -0
- package/dist/tools/project-intelligence.d.ts +9 -0
- package/dist/tools/project-intelligence.js +399 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -23,9 +23,10 @@ Blueprint Extractor MCP is a [Model Context Protocol](https://modelcontextprotoc
|
|
|
23
23
|
AI Assistant stdio MCP Server HTTP :30010 Unreal Editor
|
|
24
24
|
───────────── ◄────────────► ───────────────── ◄──────────────────► ─────────────────
|
|
25
25
|
Claude Code Node.js process Remote Control API
|
|
26
|
-
Codex
|
|
27
|
-
...
|
|
28
|
-
|
|
26
|
+
Codex 106 tools BlueprintExtractor
|
|
27
|
+
... 38 resources plugin
|
|
28
|
+
4 resource templates
|
|
29
|
+
12 prompts
|
|
29
30
|
```
|
|
30
31
|
|
|
31
32
|
**What the assistant can do through this server:**
|
|
@@ -69,7 +70,7 @@ Connects to the editor at `127.0.0.1:30010` by default.
|
|
|
69
70
|
```bash
|
|
70
71
|
claude mcp add -s user -t stdio blueprint-extractor \
|
|
71
72
|
-e UE_REMOTE_CONTROL_PORT=30010 \
|
|
72
|
-
-- npx -y blueprint-extractor-mcp@6.0
|
|
73
|
+
-- npx -y blueprint-extractor-mcp@6.1.0
|
|
73
74
|
```
|
|
74
75
|
|
|
75
76
|
</td></tr>
|
|
@@ -78,7 +79,7 @@ claude mcp add -s user -t stdio blueprint-extractor \
|
|
|
78
79
|
|
|
79
80
|
```bash
|
|
80
81
|
codex mcp add --env UE_REMOTE_CONTROL_PORT=30010 \
|
|
81
|
-
blueprint-extractor -- npx -y blueprint-extractor-mcp@6.0
|
|
82
|
+
blueprint-extractor -- npx -y blueprint-extractor-mcp@6.1.0
|
|
82
83
|
```
|
|
83
84
|
|
|
84
85
|
</td></tr>
|
|
@@ -90,20 +91,25 @@ codex mcp add --env UE_REMOTE_CONTROL_PORT=30010 \
|
|
|
90
91
|
|
|
91
92
|
## Tool Surface
|
|
92
93
|
|
|
93
|
-
Only
|
|
94
|
-
|
|
95
|
-
| Scope |
|
|
96
|
-
|
|
97
|
-
| **Core** *(always on)* |
|
|
98
|
-
| `widget_authoring` |
|
|
99
|
-
| `
|
|
100
|
-
| `
|
|
101
|
-
| `
|
|
102
|
-
| `
|
|
103
|
-
| `
|
|
104
|
-
| `
|
|
105
|
-
| `
|
|
106
|
-
| `
|
|
94
|
+
Only the compact core surface is visible by default to keep the context window lean. Specialized families are loaded on demand via `activate_workflow_scope`.
|
|
95
|
+
|
|
96
|
+
| Scope | What It Unlocks |
|
|
97
|
+
|:------|:----------------|
|
|
98
|
+
| **Core** *(always on)* | Search, extraction, list/save/help, editor-session binding, and project-control entry points such as `extract_asset`, `search_assets`, `save_assets`, `get_tool_help`, and `activate_workflow_scope` |
|
|
99
|
+
| `widget_authoring` | Parent scope that loads `widget_authoring_structure`, `widget_authoring_visual`, and `widget_verification` together |
|
|
100
|
+
| `widget_authoring_structure` | Widget tree structure, hierarchy edits, wrapping, moving, replacement, and batch operations |
|
|
101
|
+
| `widget_authoring_visual` | Widget compile flows, CommonUI styles, widget animations, and widget preview capture |
|
|
102
|
+
| `widget_verification` | Widget capture, checkpoint bundles, capture listing, cleanup, and reference comparison |
|
|
103
|
+
| `material_authoring` | Material creation, `material_graph_operation`, compile, and material-instance edits |
|
|
104
|
+
| `blueprint_authoring` | Blueprint creation, member edits, graph edits, and Live Coding trigger |
|
|
105
|
+
| `schema_ai_authoring` | Structs, enums, Blackboards, Behavior Trees, and State Trees |
|
|
106
|
+
| `animation_authoring` | Anim sequences, montages, blend spaces, and widget motion authoring |
|
|
107
|
+
| `data_tables` | Data assets, data tables, curves, Input Actions, and Input Mapping Contexts |
|
|
108
|
+
| `import` | Async asset import and import-job polling |
|
|
109
|
+
| `automation_testing` | Host-side automation runs, coarse project automation context, and PIE lifecycle control |
|
|
110
|
+
| `analysis` | Deterministic Blueprint review and low-noise project asset audits |
|
|
111
|
+
| `project_intelligence` | Bounded editor context, project indexing, freshness status, and snippet-first context search |
|
|
112
|
+
| `verification` | Editor/runtime screenshots, capture comparison, motion verification, and artifact inspection |
|
|
107
113
|
|
|
108
114
|
### Contract Design
|
|
109
115
|
|
|
@@ -133,7 +139,9 @@ See [../docs/CURRENT_STATUS.md](../docs/CURRENT_STATUS.md) for the current valid
|
|
|
133
139
|
| `UE_BUILD_PLATFORM` | — | e.g. `Win64` |
|
|
134
140
|
| `UE_BUILD_CONFIGURATION` | — | e.g. `Development` |
|
|
135
141
|
|
|
136
|
-
`get_project_automation_context` surfaces the editor-derived `engineRoot`, `projectFilePath`, `editorTarget`, and `isPlayingInEditor` state that project-control and verification flows use for fallback or guard logic.
|
|
142
|
+
`get_project_automation_context` surfaces the coarse editor-derived `engineRoot`, `projectFilePath`, `editorTarget`, and `isPlayingInEditor` state that project-control and verification flows use for fallback or guard logic.
|
|
143
|
+
|
|
144
|
+
`get_editor_context` is the separate read-only editor-state snapshot for selection, open asset editors, active level, and PIE summary. It stays session-bound and intentionally does not open assets, change focus, or switch viewports.
|
|
137
145
|
|
|
138
146
|
<br>
|
|
139
147
|
|
|
@@ -162,6 +170,10 @@ blueprint://test-runs/{run_id}/{artifact} Automation test artifacts
|
|
|
162
170
|
| `plan_widget_motion_verification` | Keyframe-bundle verification planning |
|
|
163
171
|
| `wire_hud_widget_classes` | Class-default wiring for HUD assets |
|
|
164
172
|
| `debug_widget_compile_errors` | Diagnosing and recovering from compile failures |
|
|
173
|
+
| `understand_blueprint_project` | Building a project-understanding pass over indexed assets, docs, prompts, and resources |
|
|
174
|
+
| `review_blueprint_asset` | Running a deterministic read-only Blueprint review flow |
|
|
175
|
+
| `snapshot_editor_context` | Inspecting bounded editor state without changing editor focus |
|
|
176
|
+
| `audit_blueprint_project` | Running a low-noise project asset audit |
|
|
165
177
|
|
|
166
178
|
<br>
|
|
167
179
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ActiveEditorState, EditorInstanceSnapshot } from './editor-instance-types.js';
|
|
2
|
+
import type { EditorContextSnapshot } from './tool-context.js';
|
|
2
3
|
type ActiveEditorSessionOptions = {
|
|
3
4
|
cwd?: string;
|
|
4
5
|
env?: NodeJS.ProcessEnv;
|
|
@@ -44,6 +45,7 @@ export declare class ActiveEditorSession {
|
|
|
44
45
|
}): Promise<EditorInstanceSnapshot | undefined>;
|
|
45
46
|
getBoundSnapshot(): EditorInstanceSnapshot | undefined;
|
|
46
47
|
getWorkspaceProjectPath(): Promise<string | undefined>;
|
|
48
|
+
getEditorContext(): Promise<EditorContextSnapshot>;
|
|
47
49
|
private ensureActiveEditor;
|
|
48
50
|
private resolveCurrentEditorForConnection;
|
|
49
51
|
private bindFromExplicitPins;
|
|
@@ -30,6 +30,12 @@ function buildActiveEditorDriftMessage(snapshot) {
|
|
|
30
30
|
+ `${snapshot.remoteControlHost}:${snapshot.remoteControlPort}. The session has been returned to an unbound state. `
|
|
31
31
|
+ 'Call list_running_editors and select_editor to continue.';
|
|
32
32
|
}
|
|
33
|
+
function toStringArray(value) {
|
|
34
|
+
if (!Array.isArray(value)) {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
return value.filter((entry) => typeof entry === 'string' && entry.length > 0);
|
|
38
|
+
}
|
|
33
39
|
export class ActiveEditorSession {
|
|
34
40
|
cwd;
|
|
35
41
|
env;
|
|
@@ -222,6 +228,48 @@ export class ActiveEditorSession {
|
|
|
222
228
|
const resolution = await this.workspaceProjectPromise;
|
|
223
229
|
return resolution.projectPath;
|
|
224
230
|
}
|
|
231
|
+
async getEditorContext() {
|
|
232
|
+
const raw = await this.callSubsystem('GetEditorContext', {});
|
|
233
|
+
const parsed = JSON.parse(raw);
|
|
234
|
+
if (typeof parsed.error === 'string' && parsed.error.length > 0) {
|
|
235
|
+
throw new Error(parsed.error);
|
|
236
|
+
}
|
|
237
|
+
const instanceId = typeof parsed.instanceId === 'string' ? parsed.instanceId : undefined;
|
|
238
|
+
const projectFilePath = typeof parsed.projectFilePath === 'string' ? parsed.projectFilePath : undefined;
|
|
239
|
+
if (!instanceId || !projectFilePath) {
|
|
240
|
+
throw new Error('GetEditorContext did not return instanceId and projectFilePath.');
|
|
241
|
+
}
|
|
242
|
+
const pieSummary = typeof parsed.pieSummary === 'object' && parsed.pieSummary !== null
|
|
243
|
+
? parsed.pieSummary
|
|
244
|
+
: undefined;
|
|
245
|
+
return {
|
|
246
|
+
success: typeof parsed.success === 'boolean' ? parsed.success : true,
|
|
247
|
+
operation: typeof parsed.operation === 'string' ? parsed.operation : 'get_editor_context',
|
|
248
|
+
instanceId,
|
|
249
|
+
projectName: typeof parsed.projectName === 'string' ? parsed.projectName : undefined,
|
|
250
|
+
projectFilePath,
|
|
251
|
+
projectDir: typeof parsed.projectDir === 'string' ? parsed.projectDir : undefined,
|
|
252
|
+
engineRoot: typeof parsed.engineRoot === 'string' ? parsed.engineRoot : undefined,
|
|
253
|
+
editorTarget: typeof parsed.editorTarget === 'string' ? parsed.editorTarget : undefined,
|
|
254
|
+
remoteControlHost: typeof parsed.remoteControlHost === 'string' ? parsed.remoteControlHost : this.activeEditorSnapshot?.remoteControlHost ?? '127.0.0.1',
|
|
255
|
+
remoteControlPort: typeof parsed.remoteControlPort === 'number'
|
|
256
|
+
? parsed.remoteControlPort
|
|
257
|
+
: this.activeEditorSnapshot?.remoteControlPort ?? 30010,
|
|
258
|
+
lastSeenAt: typeof parsed.lastSeenAt === 'string' ? parsed.lastSeenAt : undefined,
|
|
259
|
+
selectedAssetPaths: toStringArray(parsed.selectedAssetPaths),
|
|
260
|
+
selectedActorNames: toStringArray(parsed.selectedActorNames),
|
|
261
|
+
openAssetEditors: toStringArray(parsed.openAssetEditors),
|
|
262
|
+
activeLevel: typeof parsed.activeLevel === 'string' ? parsed.activeLevel : undefined,
|
|
263
|
+
pieSummary: pieSummary ? {
|
|
264
|
+
isPlayingInEditor: typeof pieSummary.isPlayingInEditor === 'boolean' ? pieSummary.isPlayingInEditor : undefined,
|
|
265
|
+
isSimulatingInEditor: typeof pieSummary.isSimulatingInEditor === 'boolean' ? pieSummary.isSimulatingInEditor : undefined,
|
|
266
|
+
worldName: typeof pieSummary.worldName === 'string' ? pieSummary.worldName : undefined,
|
|
267
|
+
worldPath: typeof pieSummary.worldPath === 'string' ? pieSummary.worldPath : undefined,
|
|
268
|
+
} : undefined,
|
|
269
|
+
partial: typeof parsed.partial === 'boolean' ? parsed.partial : undefined,
|
|
270
|
+
unsupportedSections: toStringArray(parsed.unsupportedSections),
|
|
271
|
+
};
|
|
272
|
+
}
|
|
225
273
|
async ensureActiveEditor() {
|
|
226
274
|
const validation = await this.validateActiveSelection();
|
|
227
275
|
if (validation.healthy && this.activeEditorSnapshot) {
|
|
@@ -667,4 +667,48 @@ export const exampleCatalog = {
|
|
|
667
667
|
},
|
|
668
668
|
],
|
|
669
669
|
},
|
|
670
|
+
blueprint_review: {
|
|
671
|
+
summary: 'Run deterministic review first, then inspect the cited graph/variable evidence before planning any fix.',
|
|
672
|
+
recommended_flow: [
|
|
673
|
+
'review_blueprint',
|
|
674
|
+
'extract_blueprint',
|
|
675
|
+
],
|
|
676
|
+
examples: [
|
|
677
|
+
{
|
|
678
|
+
title: 'review_gameplay_blueprint',
|
|
679
|
+
tool: 'review_blueprint',
|
|
680
|
+
arguments: {
|
|
681
|
+
asset_path: '/Game/Blueprints/BP_PlayerCharacter',
|
|
682
|
+
},
|
|
683
|
+
},
|
|
684
|
+
],
|
|
685
|
+
},
|
|
686
|
+
project_intelligence: {
|
|
687
|
+
summary: 'Warm the project index, search published context and asset metadata, snapshot bounded editor state when needed, then audit the relevant package scope.',
|
|
688
|
+
recommended_flow: [
|
|
689
|
+
'refresh_project_index',
|
|
690
|
+
'get_project_index_status',
|
|
691
|
+
'search_project_context',
|
|
692
|
+
'get_editor_context',
|
|
693
|
+
'audit_project_assets',
|
|
694
|
+
],
|
|
695
|
+
examples: [
|
|
696
|
+
{
|
|
697
|
+
title: 'search_replication_context',
|
|
698
|
+
tool: 'search_project_context',
|
|
699
|
+
arguments: {
|
|
700
|
+
query: 'replication authority review',
|
|
701
|
+
page: 1,
|
|
702
|
+
per_page: 5,
|
|
703
|
+
},
|
|
704
|
+
},
|
|
705
|
+
{
|
|
706
|
+
title: 'audit_ui_assets',
|
|
707
|
+
tool: 'audit_project_assets',
|
|
708
|
+
arguments: {
|
|
709
|
+
package_path: '/Game/UI',
|
|
710
|
+
},
|
|
711
|
+
},
|
|
712
|
+
],
|
|
713
|
+
},
|
|
670
714
|
};
|
|
@@ -173,7 +173,7 @@ export const NEXT_STEP_HINTS_REGISTRY = new Map([
|
|
|
173
173
|
'Use get_tool_help for detailed usage of newly available tools.',
|
|
174
174
|
],
|
|
175
175
|
on_error: [
|
|
176
|
-
'Check available scope names: widget_authoring, material_authoring, blueprint_authoring, schema_ai_authoring, animation_authoring, data_tables, import, automation_testing, verification.',
|
|
176
|
+
'Check available scope names: widget_authoring, material_authoring, blueprint_authoring, schema_ai_authoring, animation_authoring, data_tables, import, automation_testing, verification, analysis, project_intelligence.',
|
|
177
177
|
],
|
|
178
178
|
}],
|
|
179
179
|
['find_and_extract', {
|
|
@@ -178,6 +178,18 @@ export function collectRelatedResources(toolName) {
|
|
|
178
178
|
|| toolName === 'relaunch_pie') {
|
|
179
179
|
resources.add('blueprint://project-automation');
|
|
180
180
|
}
|
|
181
|
+
if (toolName === 'review_blueprint' || toolName === 'audit_project_assets') {
|
|
182
|
+
resources.add('blueprint://analysis-workflows');
|
|
183
|
+
}
|
|
184
|
+
if (toolName === 'refresh_project_index'
|
|
185
|
+
|| toolName === 'get_project_index_status'
|
|
186
|
+
|| toolName === 'search_project_context'
|
|
187
|
+
|| toolName === 'get_editor_context') {
|
|
188
|
+
resources.add('blueprint://project-intelligence-workflows');
|
|
189
|
+
}
|
|
190
|
+
if (toolName === 'get_editor_context') {
|
|
191
|
+
resources.add('blueprint://project-automation');
|
|
192
|
+
}
|
|
181
193
|
if (toolName.includes('animation')
|
|
182
194
|
|| toolName.includes('motion')
|
|
183
195
|
|| toolName === 'compare_motion_capture_bundle') {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { execSync, spawn } from 'node:child_process';
|
|
2
2
|
import { access, readdir, unlink } from 'node:fs/promises';
|
|
3
3
|
import { constants as fsConstants } from 'node:fs';
|
|
4
|
-
import { dirname, resolve } from 'node:path';
|
|
4
|
+
import { dirname, resolve, win32 as win32Path } from 'node:path';
|
|
5
5
|
const DEFAULT_BUILD_TIMEOUT_MS = 30 * 60 * 1000;
|
|
6
6
|
const DEFAULT_DISCONNECT_TIMEOUT_MS = 60 * 1000;
|
|
7
7
|
const DEFAULT_RECONNECT_TIMEOUT_MS = 3 * 60 * 1000;
|
|
@@ -164,6 +164,9 @@ function fileName(path) {
|
|
|
164
164
|
const lastSlash = normalized.lastIndexOf('/');
|
|
165
165
|
return lastSlash >= 0 ? normalized.slice(lastSlash + 1) : normalized;
|
|
166
166
|
}
|
|
167
|
+
function normalizeFilesystemPathForCommand(path, platform) {
|
|
168
|
+
return platform === 'win32' ? win32Path.normalize(path) : path;
|
|
169
|
+
}
|
|
167
170
|
export function classifyChangedPaths(changedPaths, forceRebuild = false) {
|
|
168
171
|
const reasons = new Set();
|
|
169
172
|
if (forceRebuild) {
|
|
@@ -355,6 +358,7 @@ export class ProjectController {
|
|
|
355
358
|
throw new Error('compile_project_code requires target or UE_PROJECT_TARGET/UE_EDITOR_TARGET');
|
|
356
359
|
}
|
|
357
360
|
const buildScript = await resolveBuildScript(engineRoot, this.platform);
|
|
361
|
+
const commandProjectPath = normalizeFilesystemPathForCommand(projectPath, this.platform);
|
|
358
362
|
let uhtCacheFilesDeleted;
|
|
359
363
|
if (request.clearUhtCache) {
|
|
360
364
|
uhtCacheFilesDeleted = await clearUhtCacheFiles(dirname(projectPath));
|
|
@@ -363,7 +367,7 @@ export class ProjectController {
|
|
|
363
367
|
target,
|
|
364
368
|
platform,
|
|
365
369
|
configuration,
|
|
366
|
-
`-Project=${
|
|
370
|
+
`-Project=${commandProjectPath}`,
|
|
367
371
|
'-WaitMutex',
|
|
368
372
|
'-NoHotReloadFromIDE',
|
|
369
373
|
];
|
|
@@ -282,6 +282,64 @@ export const promptCatalog = {
|
|
|
282
282
|
'Return the minimal follow-up extract/modify/compile sequence needed to fix the compile state, then finish with capture_widget_preview or explicit partial verification if rendering is blocked.',
|
|
283
283
|
].join('\n'),
|
|
284
284
|
},
|
|
285
|
+
understand_blueprint_project: {
|
|
286
|
+
title: 'Understand Blueprint Project',
|
|
287
|
+
description: 'Plan a project-understanding pass that uses the published project-intelligence tools and resources.',
|
|
288
|
+
args: {
|
|
289
|
+
package_path: z.string().default('/Game'),
|
|
290
|
+
question: z.string(),
|
|
291
|
+
},
|
|
292
|
+
buildPrompt: ({ package_path, question }) => [
|
|
293
|
+
`Understand the Blueprint Extractor project context rooted at ${package_path}.`,
|
|
294
|
+
`Question: ${question}.`,
|
|
295
|
+
'Start with refresh_project_index if the cache is missing or stale, then inspect get_project_index_status and search_project_context.',
|
|
296
|
+
'Prefer published docs, prompts, and resources before making assumptions from memory.',
|
|
297
|
+
'When the answer depends on one concrete asset, narrow into extract_asset, extract_blueprint, or extract_widget_blueprint instead of staying at search-summary level.',
|
|
298
|
+
].join('\n'),
|
|
299
|
+
},
|
|
300
|
+
review_blueprint_asset: {
|
|
301
|
+
title: 'Review Blueprint Asset',
|
|
302
|
+
description: 'Plan a deterministic read-only Blueprint review pass.',
|
|
303
|
+
args: {
|
|
304
|
+
asset_path: z.string(),
|
|
305
|
+
review_goal: z.string().optional(),
|
|
306
|
+
},
|
|
307
|
+
buildPrompt: ({ asset_path, review_goal }) => [
|
|
308
|
+
`Review Blueprint asset ${asset_path}.`,
|
|
309
|
+
review_goal ? `Review goal: ${review_goal}.` : 'Focus on deterministic graph/data issues only.',
|
|
310
|
+
'Use review_blueprint first, then inspect the cited evidence with extract_blueprint when a finding needs deeper confirmation.',
|
|
311
|
+
'Keep the output findings-first and include only issues supported by extracted evidence.',
|
|
312
|
+
'Do not propose autofixes that are not backed by the current public tool surface.',
|
|
313
|
+
].join('\n'),
|
|
314
|
+
},
|
|
315
|
+
snapshot_editor_context: {
|
|
316
|
+
title: 'Snapshot Editor Context',
|
|
317
|
+
description: 'Plan a bounded read-only editor-context inspection.',
|
|
318
|
+
args: {
|
|
319
|
+
intent: z.string(),
|
|
320
|
+
},
|
|
321
|
+
buildPrompt: ({ intent }) => [
|
|
322
|
+
`Snapshot the active editor context for: ${intent}.`,
|
|
323
|
+
'Use get_active_editor first when selection health is unclear, then call get_editor_context for bounded read-only state.',
|
|
324
|
+
'Treat the result as session-bound and partial when the editor is unbound, headless, or not rendering.',
|
|
325
|
+
'Do not suggest focus changes, asset opening, or viewport switching because get_editor_context is intentionally query-only.',
|
|
326
|
+
].join('\n'),
|
|
327
|
+
},
|
|
328
|
+
audit_blueprint_project: {
|
|
329
|
+
title: 'Audit Blueprint Project',
|
|
330
|
+
description: 'Plan a low-noise project asset audit pass.',
|
|
331
|
+
args: {
|
|
332
|
+
package_path: z.string().default('/Game'),
|
|
333
|
+
class_filter: z.string().optional(),
|
|
334
|
+
},
|
|
335
|
+
buildPrompt: ({ package_path, class_filter }) => [
|
|
336
|
+
`Audit project assets under ${package_path}.`,
|
|
337
|
+
class_filter ? `Restrict the audit to class filter: ${class_filter}.` : 'Audit all asset classes in scope.',
|
|
338
|
+
'Use audit_project_assets for low-noise metadata checks, then use extract_asset or extract_blueprint only for follow-up on concrete findings.',
|
|
339
|
+
'Present results grouped by check family with counts first, then the actionable findings.',
|
|
340
|
+
'Keep unsupported checks out of scope instead of widening heuristics until they become noisy.',
|
|
341
|
+
].join('\n'),
|
|
342
|
+
},
|
|
285
343
|
};
|
|
286
344
|
export function registerPromptCatalog(server) {
|
|
287
345
|
for (const [name, prompt] of Object.entries(promptCatalog)) {
|
|
@@ -4,6 +4,7 @@ import { collectRelatedResources, collectToolExampleFamilies as collectToolExamp
|
|
|
4
4
|
import { AnimMontageMutationOperationSchema, AnimationNotifySelectorSchema, AnimSequenceMutationOperationSchema, BehaviorTreeMutationOperationSchema, BehaviorTreeNodeSelectorSchema, BlackboardKeySchema, BlackboardMutationOperationSchema, BlendParameterSchema, BlendSpaceMutationOperationSchema, BlendSpaceSampleSchema, BlueprintGraphMutationOperationSchema, BlueprintMemberMutationOperationSchema, BuildConfigurationSchema, BuildPlatformSchema, CurveChannelSchema, CurveKeyDeleteSchema, CurveKeyUpsertSchema, CurveTableModeSchema, CurveTableRowSchema, CurveTypeSchema, DataTableRowSchema, ExtractAssetTypeSchema, EnhancedInputValueTypeSchema, FontImportItemSchema, ImportJobListSchema, ImportJobSchema, InputMappingSchema, JsonObjectSchema, MaterialConnectionSelectorFieldsSchema, MaterialFontParameterSchema, MaterialGraphOperationKindSchema, MaterialGraphOperationSchema, MaterialLayerStackSchema, MaterialNodePositionSchema, MaterialScalarParameterSchema, MaterialStaticSwitchParameterSchema, MaterialTextureParameterSchema, MaterialVectorParameterSchema, MeshImportOptionsSchema, StateTreeEditorNodeSelectorSchema, StateTreeMutationOperationSchema, StateTreeStateSelectorSchema, StateTreeTransitionSelectorSchema, StateTreeBindingsObjectSchema, TextureImportOptionsSchema, UserDefinedEnumEntrySchema, UserDefinedEnumMutationOperationSchema, UserDefinedStructFieldSchema, UserDefinedStructMutationOperationSchema, WidgetBlueprintMutationOperationSchema, WidgetNodeSchema, WidgetSelectorFieldsSchema, WindowFontApplicationSchema, } from './schemas/tool-inputs.js';
|
|
5
5
|
import { applyWindowUiChangesResultSchema, AutomationRunListSchema, automationRunSchema, CaptureResultSchema, CascadeResultSchema, CleanupCapturesResultSchema, CompareCaptureResultSchema, CompareMotionCaptureBundleResultSchema, CreateModifyWidgetAnimationResultSchema, ExtractWidgetAnimationResultSchema, ListCapturesResultSchema, motionCaptureModeSchema, MotionCaptureBundleResultSchema, widgetAnimationCheckpointSchema, } from './schemas/tool-results.js';
|
|
6
6
|
import { registerAnimationAuthoringTools } from './tools/animation-authoring.js';
|
|
7
|
+
import { registerAnalysisTools } from './tools/analysis-tools.js';
|
|
7
8
|
import { registerAutomationRunTools } from './tools/automation-runs.js';
|
|
8
9
|
import { registerBlueprintAuthoringTools } from './tools/blueprint-authoring.js';
|
|
9
10
|
import { registerCompositeTools } from './tools/composite-tools.js';
|
|
@@ -13,6 +14,7 @@ import { registerExtractionTools } from './tools/extraction.js';
|
|
|
13
14
|
import { registerImportJobTools } from './tools/import-jobs.js';
|
|
14
15
|
import { registerMaterialAuthoringTools } from './tools/material-authoring.js';
|
|
15
16
|
import { registerMaterialInstanceTools } from './tools/material-instance.js';
|
|
17
|
+
import { registerProjectIntelligenceTools } from './tools/project-intelligence.js';
|
|
16
18
|
import { registerProjectControlTools } from './tools/project-control.js';
|
|
17
19
|
import { registerSchemaAndAiAuthoringTools } from './tools/schema-and-ai-authoring.js';
|
|
18
20
|
import { registerTablesAndCurvesTools } from './tools/tables-and-curves.js';
|
|
@@ -121,6 +123,10 @@ export function registerServerTools({ server, client, projectController, automat
|
|
|
121
123
|
automationRunSchema,
|
|
122
124
|
automationRunListSchema: AutomationRunListSchema,
|
|
123
125
|
});
|
|
126
|
+
registerAnalysisTools({
|
|
127
|
+
server,
|
|
128
|
+
callSubsystemJson,
|
|
129
|
+
});
|
|
124
130
|
registerProjectControlTools({
|
|
125
131
|
server,
|
|
126
132
|
client,
|
|
@@ -136,6 +142,10 @@ export function registerServerTools({ server, client, projectController, automat
|
|
|
136
142
|
buildConfigurationSchema: BuildConfigurationSchema,
|
|
137
143
|
editorPollIntervalMs,
|
|
138
144
|
});
|
|
145
|
+
registerProjectIntelligenceTools({
|
|
146
|
+
server,
|
|
147
|
+
callSubsystemJson,
|
|
148
|
+
});
|
|
139
149
|
registerWindowUiTools({
|
|
140
150
|
server,
|
|
141
151
|
client,
|
|
@@ -343,4 +343,37 @@ export function registerStaticDocResources(server) {
|
|
|
343
343
|
'- When a scenario cannot export checkpoint artifacts yet, report partial verification explicitly instead of silently treating the automation run as sufficient proof.',
|
|
344
344
|
'- Compile/save alone is never accepted as motion verification.',
|
|
345
345
|
]);
|
|
346
|
+
registerStaticTextResource(server, 'analysis-workflows', 'blueprint://analysis-workflows', 'Job-based entry paths for deterministic Blueprint review and asset-audit workflows.', [
|
|
347
|
+
'Blueprint Extractor Analysis Workflows',
|
|
348
|
+
'',
|
|
349
|
+
'Understand project:',
|
|
350
|
+
'- refresh_project_index -> get_project_index_status -> search_project_context',
|
|
351
|
+
'',
|
|
352
|
+
'Review asset:',
|
|
353
|
+
'- review_blueprint -> extract_blueprint',
|
|
354
|
+
'- review_blueprint returns deterministic findings only. Each finding includes severity, category, evidence, and next_steps.',
|
|
355
|
+
'',
|
|
356
|
+
'Audit project:',
|
|
357
|
+
'- audit_project_assets for low-noise asset metadata checks.',
|
|
358
|
+
'- Current check families: naming, package hygiene, and asset-family coverage.',
|
|
359
|
+
'',
|
|
360
|
+
'Guardrail:',
|
|
361
|
+
'- Findings-first output is intentional. Do not treat review_blueprint or audit_project_assets as autofix tools.',
|
|
362
|
+
]);
|
|
363
|
+
registerStaticTextResource(server, 'project-intelligence-workflows', 'blueprint://project-intelligence-workflows', 'Job-based entry paths for indexing/searching published context and snapshotting bounded editor context.', [
|
|
364
|
+
'Blueprint Extractor Project Intelligence Workflows',
|
|
365
|
+
'',
|
|
366
|
+
'Project indexing:',
|
|
367
|
+
'- refresh_project_index caches asset metadata plus published docs, prompts, and resources.',
|
|
368
|
+
'- get_project_index_status reports freshness, size, and staleness.',
|
|
369
|
+
'- search_project_context returns snippet-first results with provenance and pagination.',
|
|
370
|
+
'',
|
|
371
|
+
'Snapshot editor context:',
|
|
372
|
+
'- get_editor_context is bounded, session-bound, and read-only.',
|
|
373
|
+
'- Returned sections are intentionally limited: selected_asset_paths, selected_actor_names, open_asset_editors, active_level, and pie_summary.',
|
|
374
|
+
'',
|
|
375
|
+
'Unsupported boundaries:',
|
|
376
|
+
'- get_editor_context does not open assets, change editor focus, or switch viewports.',
|
|
377
|
+
'- Search remains metadata-first in v1; code indexing is intentionally deferred.',
|
|
378
|
+
]);
|
|
346
379
|
}
|
|
@@ -1346,14 +1346,14 @@ export declare const ImportJobSchema: z.ZodObject<{
|
|
|
1346
1346
|
}>, "many">;
|
|
1347
1347
|
}, "strip", z.ZodTypeAny, {
|
|
1348
1348
|
status: string;
|
|
1349
|
+
success: boolean;
|
|
1350
|
+
operation: string;
|
|
1349
1351
|
diagnostics: {
|
|
1350
1352
|
code: string;
|
|
1351
1353
|
message: string;
|
|
1352
1354
|
severity: string;
|
|
1353
1355
|
path?: string | undefined;
|
|
1354
1356
|
}[];
|
|
1355
|
-
success: boolean;
|
|
1356
|
-
operation: string;
|
|
1357
1357
|
items: {
|
|
1358
1358
|
status: string;
|
|
1359
1359
|
diagnostics: {
|
|
@@ -1396,14 +1396,14 @@ export declare const ImportJobSchema: z.ZodObject<{
|
|
|
1396
1396
|
jobId?: string | undefined;
|
|
1397
1397
|
}, {
|
|
1398
1398
|
status: string;
|
|
1399
|
+
success: boolean;
|
|
1400
|
+
operation: string;
|
|
1399
1401
|
diagnostics: {
|
|
1400
1402
|
code: string;
|
|
1401
1403
|
message: string;
|
|
1402
1404
|
severity: string;
|
|
1403
1405
|
path?: string | undefined;
|
|
1404
1406
|
}[];
|
|
1405
|
-
success: boolean;
|
|
1406
|
-
operation: string;
|
|
1407
1407
|
items: {
|
|
1408
1408
|
status: string;
|
|
1409
1409
|
diagnostics: {
|
|
@@ -1605,14 +1605,14 @@ export declare const ImportJobListSchema: z.ZodObject<{
|
|
|
1605
1605
|
}>, "many">;
|
|
1606
1606
|
}, "strip", z.ZodTypeAny, {
|
|
1607
1607
|
status: string;
|
|
1608
|
+
success: boolean;
|
|
1609
|
+
operation: string;
|
|
1608
1610
|
diagnostics: {
|
|
1609
1611
|
code: string;
|
|
1610
1612
|
message: string;
|
|
1611
1613
|
severity: string;
|
|
1612
1614
|
path?: string | undefined;
|
|
1613
1615
|
}[];
|
|
1614
|
-
success: boolean;
|
|
1615
|
-
operation: string;
|
|
1616
1616
|
items: {
|
|
1617
1617
|
status: string;
|
|
1618
1618
|
diagnostics: {
|
|
@@ -1655,14 +1655,14 @@ export declare const ImportJobListSchema: z.ZodObject<{
|
|
|
1655
1655
|
jobId?: string | undefined;
|
|
1656
1656
|
}, {
|
|
1657
1657
|
status: string;
|
|
1658
|
+
success: boolean;
|
|
1659
|
+
operation: string;
|
|
1658
1660
|
diagnostics: {
|
|
1659
1661
|
code: string;
|
|
1660
1662
|
message: string;
|
|
1661
1663
|
severity: string;
|
|
1662
1664
|
path?: string | undefined;
|
|
1663
1665
|
}[];
|
|
1664
|
-
success: boolean;
|
|
1665
|
-
operation: string;
|
|
1666
1666
|
items: {
|
|
1667
1667
|
status: string;
|
|
1668
1668
|
diagnostics: {
|
|
@@ -1711,14 +1711,14 @@ export declare const ImportJobListSchema: z.ZodObject<{
|
|
|
1711
1711
|
jobCount: number;
|
|
1712
1712
|
jobs: {
|
|
1713
1713
|
status: string;
|
|
1714
|
+
success: boolean;
|
|
1715
|
+
operation: string;
|
|
1714
1716
|
diagnostics: {
|
|
1715
1717
|
code: string;
|
|
1716
1718
|
message: string;
|
|
1717
1719
|
severity: string;
|
|
1718
1720
|
path?: string | undefined;
|
|
1719
1721
|
}[];
|
|
1720
|
-
success: boolean;
|
|
1721
|
-
operation: string;
|
|
1722
1722
|
items: {
|
|
1723
1723
|
status: string;
|
|
1724
1724
|
diagnostics: {
|
|
@@ -1784,14 +1784,14 @@ export declare const ImportJobListSchema: z.ZodObject<{
|
|
|
1784
1784
|
jobCount: number;
|
|
1785
1785
|
jobs: {
|
|
1786
1786
|
status: string;
|
|
1787
|
+
success: boolean;
|
|
1788
|
+
operation: string;
|
|
1787
1789
|
diagnostics: {
|
|
1788
1790
|
code: string;
|
|
1789
1791
|
message: string;
|
|
1790
1792
|
severity: string;
|
|
1791
1793
|
path?: string | undefined;
|
|
1792
1794
|
}[];
|
|
1793
|
-
success: boolean;
|
|
1794
|
-
operation: string;
|
|
1795
1795
|
items: {
|
|
1796
1796
|
status: string;
|
|
1797
1797
|
diagnostics: {
|
|
@@ -1872,16 +1872,16 @@ export declare const UserDefinedStructFieldSchema: z.ZodObject<{
|
|
|
1872
1872
|
guid?: string | undefined;
|
|
1873
1873
|
name?: string | undefined;
|
|
1874
1874
|
defaultValue?: unknown;
|
|
1875
|
+
metadata?: Record<string, unknown> | undefined;
|
|
1875
1876
|
friendlyName?: string | undefined;
|
|
1876
1877
|
pinType?: Record<string, unknown> | undefined;
|
|
1877
|
-
metadata?: Record<string, unknown> | undefined;
|
|
1878
1878
|
}, {
|
|
1879
1879
|
guid?: string | undefined;
|
|
1880
1880
|
name?: string | undefined;
|
|
1881
1881
|
defaultValue?: unknown;
|
|
1882
|
+
metadata?: Record<string, unknown> | undefined;
|
|
1882
1883
|
friendlyName?: string | undefined;
|
|
1883
1884
|
pinType?: Record<string, unknown> | undefined;
|
|
1884
|
-
metadata?: Record<string, unknown> | undefined;
|
|
1885
1885
|
}>;
|
|
1886
1886
|
export declare const UserDefinedEnumEntrySchema: z.ZodObject<{
|
|
1887
1887
|
name: z.ZodString;
|