unity-open-mcp 0.4.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +20 -14
  2. package/dist/batch-spawn.d.ts +4 -0
  3. package/dist/batch-spawn.js +55 -11
  4. package/dist/batch-spawn.js.map +1 -1
  5. package/dist/capabilities/build-capabilities.js +6 -0
  6. package/dist/capabilities/build-capabilities.js.map +1 -1
  7. package/dist/capabilities/cost-hints.js +30 -0
  8. package/dist/capabilities/cost-hints.js.map +1 -1
  9. package/dist/capabilities/lifecycle.js +13 -0
  10. package/dist/capabilities/lifecycle.js.map +1 -1
  11. package/dist/capabilities/tool-groups.js +4 -0
  12. package/dist/capabilities/tool-groups.js.map +1 -1
  13. package/dist/cli/commands.js +9 -8
  14. package/dist/cli/commands.js.map +1 -1
  15. package/dist/cli/ping-poller.js +20 -0
  16. package/dist/cli/ping-poller.js.map +1 -1
  17. package/dist/constants.d.ts +89 -0
  18. package/dist/constants.js +109 -0
  19. package/dist/constants.js.map +1 -0
  20. package/dist/dialog-dismiss.d.ts +0 -7
  21. package/dist/dialog-dismiss.js +17 -19
  22. package/dist/dialog-dismiss.js.map +1 -1
  23. package/dist/hub-control.d.ts +6 -2
  24. package/dist/hub-control.js +8 -8
  25. package/dist/hub-control.js.map +1 -1
  26. package/dist/index.js +6 -5
  27. package/dist/index.js.map +1 -1
  28. package/dist/instance-discovery.js +2 -1
  29. package/dist/instance-discovery.js.map +1 -1
  30. package/dist/live-client.d.ts +72 -0
  31. package/dist/live-client.js +387 -255
  32. package/dist/live-client.js.map +1 -1
  33. package/dist/offline/api.d.ts +171 -0
  34. package/dist/offline/api.js +852 -0
  35. package/dist/offline/api.js.map +1 -0
  36. package/dist/offline/hierarchy.d.ts +24 -0
  37. package/dist/offline/hierarchy.js +242 -0
  38. package/dist/offline/hierarchy.js.map +1 -0
  39. package/dist/offline/index-builders.d.ts +11 -0
  40. package/dist/offline/index-builders.js +202 -0
  41. package/dist/offline/index-builders.js.map +1 -0
  42. package/dist/offline/model.d.ts +8 -0
  43. package/dist/offline/model.js +188 -0
  44. package/dist/offline/model.js.map +1 -0
  45. package/dist/offline/names.d.ts +7 -0
  46. package/dist/offline/names.js +20 -0
  47. package/dist/offline/names.js.map +1 -0
  48. package/dist/offline/overrides.d.ts +17 -0
  49. package/dist/offline/overrides.js +266 -0
  50. package/dist/offline/overrides.js.map +1 -0
  51. package/dist/offline/parse.d.ts +25 -0
  52. package/dist/offline/parse.js +236 -0
  53. package/dist/offline/parse.js.map +1 -0
  54. package/dist/offline/paths.d.ts +4 -0
  55. package/dist/offline/paths.js +23 -0
  56. package/dist/offline/paths.js.map +1 -0
  57. package/dist/offline/primitives.d.ts +17 -0
  58. package/dist/offline/primitives.js +195 -0
  59. package/dist/offline/primitives.js.map +1 -0
  60. package/dist/offline/references.d.ts +9 -0
  61. package/dist/offline/references.js +55 -0
  62. package/dist/offline/references.js.map +1 -0
  63. package/dist/offline/types.d.ts +65 -0
  64. package/dist/offline/types.js +154 -0
  65. package/dist/offline/types.js.map +1 -0
  66. package/dist/offline.d.ts +2 -180
  67. package/dist/offline.js +27 -2282
  68. package/dist/offline.js.map +1 -1
  69. package/dist/project-health.d.ts +1 -1
  70. package/dist/project-health.js +66 -3
  71. package/dist/project-health.js.map +1 -1
  72. package/dist/routers.js +6 -5
  73. package/dist/routers.js.map +1 -1
  74. package/dist/running-unity.d.ts +105 -0
  75. package/dist/running-unity.js +387 -0
  76. package/dist/running-unity.js.map +1 -0
  77. package/dist/skill/client-paths.d.ts +22 -0
  78. package/dist/skill/client-paths.js +66 -5
  79. package/dist/skill/client-paths.js.map +1 -1
  80. package/dist/skill/generate-skill.d.ts +43 -4
  81. package/dist/skill/generate-skill.js +132 -34
  82. package/dist/skill/generate-skill.js.map +1 -1
  83. package/dist/tool-router.d.ts +12 -0
  84. package/dist/tool-router.js +112 -100
  85. package/dist/tool-router.js.map +1 -1
  86. package/dist/tools/batch-execute.d.ts +2 -0
  87. package/dist/tools/batch-execute.js +83 -0
  88. package/dist/tools/batch-execute.js.map +1 -0
  89. package/dist/tools/bridge-status.js +8 -1
  90. package/dist/tools/bridge-status.js.map +1 -1
  91. package/dist/tools/component-get.js +44 -11
  92. package/dist/tools/component-get.js.map +1 -1
  93. package/dist/tools/editor-status.js +3 -2
  94. package/dist/tools/editor-status.js.map +1 -1
  95. package/dist/tools/execute-csharp.js +3 -2
  96. package/dist/tools/execute-csharp.js.map +1 -1
  97. package/dist/tools/generate-skill.js +8 -0
  98. package/dist/tools/generate-skill.js.map +1 -1
  99. package/dist/tools/index.d.ts +1 -0
  100. package/dist/tools/index.js +29 -17
  101. package/dist/tools/index.js.map +1 -1
  102. package/dist/tools/inputsystem-asset-create.js +4 -4
  103. package/dist/tools/inputsystem-asset-create.js.map +1 -1
  104. package/dist/tools/invoke-method.js +2 -1
  105. package/dist/tools/invoke-method.js.map +1 -1
  106. package/dist/tools/navigation-surface-add.js +6 -5
  107. package/dist/tools/navigation-surface-add.js.map +1 -1
  108. package/dist/tools/probuilder-create-shape.js +4 -4
  109. package/dist/tools/probuilder-create-shape.js.map +1 -1
  110. package/dist/tools/read-compile-errors.js +44 -31
  111. package/dist/tools/read-compile-errors.js.map +1 -1
  112. package/dist/tools/scene-get-data.js +10 -2
  113. package/dist/tools/scene-get-data.js.map +1 -1
  114. package/dist/tools/scene-save.js +16 -5
  115. package/dist/tools/scene-save.js.map +1 -1
  116. package/dist/tools/scene-set-active.js +22 -6
  117. package/dist/tools/scene-set-active.js.map +1 -1
  118. package/dist/tools/scene-unload.js +20 -6
  119. package/dist/tools/scene-unload.js.map +1 -1
  120. package/package.json +1 -1
@@ -13,7 +13,7 @@
13
13
  // 3. writeSkillToClients() — writes the generated file to .claude/skills/ etc.
14
14
  import { readFile, writeFile, readdir, stat } from "node:fs/promises";
15
15
  import { join, basename, relative, sep } from "node:path";
16
- import { clientSkillRelativePath } from "./client-paths.js";
16
+ import { clientSkillRelativePath, resolveTemplateSkillPath } from "./client-paths.js";
17
17
  // ---------------------------------------------------------------------------
18
18
  // Constants
19
19
  // ---------------------------------------------------------------------------
@@ -29,6 +29,10 @@ const SKIP_DIRS = new Set([
29
29
  ]);
30
30
  const MAX_CS_SCAN = 500;
31
31
  const MAX_TYPES_IN_SKILL = 40;
32
+ // Cap the inventory preview embedded in Hub/CLI responses so the JSON
33
+ // envelope stays bounded. The full skill is always written to disk
34
+ // when write=true; this is only the echo shown to the caller.
35
+ const MAX_INVENTORY_PREVIEW_CHARS = 6000;
32
36
  // ---------------------------------------------------------------------------
33
37
  // 1. Project state reader (disk I/O)
34
38
  // ---------------------------------------------------------------------------
@@ -150,14 +154,16 @@ function extractTypes(content, filePath, projectRoot, monoBehaviours, scriptable
150
154
  // ---------------------------------------------------------------------------
151
155
  // 2. Skill markdown generator (pure, no I/O)
152
156
  // ---------------------------------------------------------------------------
153
- export function generateSkillMarkdown(state, caps) {
157
+ /**
158
+ * Project-specific inventory blocks the template cannot know: Unity
159
+ * version, bridge/verify install state, installed packages, and the
160
+ * key MonoBehaviour / ScriptableObject types discovered in Assets/.
161
+ * Used both by the standalone full builder (`generateSkillMarkdown`)
162
+ * and by the template+inventory composer (`composeSkillMarkdown`) so
163
+ * the two never drift on the project-section shape.
164
+ */
165
+ function buildProjectInventoryBlocks(state) {
154
166
  const lines = [];
155
- const now = new Date().toISOString().slice(0, 10);
156
- lines.push(`# Unity Agent Skill — ${state.projectName}`);
157
- lines.push("");
158
- lines.push(`> Auto-generated by \`unity_open_mcp_generate_skill\` on ${now}.`);
159
- lines.push(`> Regenerate after package or script changes to keep this file current.`);
160
- lines.push("");
161
167
  // --- Project environment ---
162
168
  lines.push("## Project environment");
163
169
  lines.push("");
@@ -186,6 +192,42 @@ export function generateSkillMarkdown(state, caps) {
186
192
  }
187
193
  lines.push("");
188
194
  }
195
+ // --- Key project types ---
196
+ if (state.monoBehaviours.length > 0 || state.scriptableObjects.length > 0) {
197
+ lines.push("## Key project types");
198
+ lines.push("");
199
+ lines.push("Use `unity_open_mcp_find_members` to inspect any of these before editing.");
200
+ lines.push("");
201
+ if (state.monoBehaviours.length > 0) {
202
+ lines.push("### MonoBehaviours");
203
+ lines.push("");
204
+ for (const mb of state.monoBehaviours) {
205
+ const fullName = mb.namespace ? `${mb.namespace}.${mb.name}` : mb.name;
206
+ lines.push(`- **${fullName}** — \`${mb.filePath}\``);
207
+ }
208
+ lines.push("");
209
+ }
210
+ if (state.scriptableObjects.length > 0) {
211
+ lines.push("### ScriptableObjects");
212
+ lines.push("");
213
+ for (const so of state.scriptableObjects) {
214
+ const fullName = so.namespace ? `${so.namespace}.${so.name}` : so.name;
215
+ lines.push(`- **${fullName}** — \`${so.filePath}\``);
216
+ }
217
+ lines.push("");
218
+ }
219
+ }
220
+ return lines;
221
+ }
222
+ export function generateSkillMarkdown(state, caps) {
223
+ const lines = [];
224
+ const now = new Date().toISOString().slice(0, 10);
225
+ lines.push(`# Unity Agent Skill — ${state.projectName}`);
226
+ lines.push("");
227
+ lines.push(`> Auto-generated by \`unity_open_mcp_generate_skill\` on ${now}.`);
228
+ lines.push(`> Regenerate after package or script changes to keep this file current.`);
229
+ lines.push("");
230
+ lines.push(...buildProjectInventoryBlocks(state));
189
231
  // --- Available tools ---
190
232
  const implementedTools = caps.tools.filter((t) => t.implemented);
191
233
  if (implementedTools.length > 0) {
@@ -234,31 +276,6 @@ export function generateSkillMarkdown(state, caps) {
234
276
  }
235
277
  lines.push("");
236
278
  }
237
- // --- Key project types ---
238
- if (state.monoBehaviours.length > 0 || state.scriptableObjects.length > 0) {
239
- lines.push("## Key project types");
240
- lines.push("");
241
- lines.push("Use `unity_open_mcp_find_members` to inspect any of these before editing.");
242
- lines.push("");
243
- if (state.monoBehaviours.length > 0) {
244
- lines.push("### MonoBehaviours");
245
- lines.push("");
246
- for (const mb of state.monoBehaviours) {
247
- const fullName = mb.namespace ? `${mb.namespace}.${mb.name}` : mb.name;
248
- lines.push(`- **${fullName}** — \`${mb.filePath}\``);
249
- }
250
- lines.push("");
251
- }
252
- if (state.scriptableObjects.length > 0) {
253
- lines.push("### ScriptableObjects");
254
- lines.push("");
255
- for (const so of state.scriptableObjects) {
256
- const fullName = so.namespace ? `${so.namespace}.${so.name}` : so.name;
257
- lines.push(`- **${fullName}** — \`${so.filePath}\``);
258
- }
259
- lines.push("");
260
- }
261
- }
262
279
  // --- Core workflow ---
263
280
  lines.push("## Core workflow: mutate → gate → fix");
264
281
  lines.push("");
@@ -372,11 +389,79 @@ async function ensureParentDir(filePath) {
372
389
  }
373
390
  }
374
391
  // ---------------------------------------------------------------------------
392
+ // Template + inventory composer
393
+ // ---------------------------------------------------------------------------
394
+ //
395
+ // The template (`skills/unity-open-mcp/SKILL.md`) is the source of truth
396
+ // for the workflow playbook — agent guidance that does not vary per
397
+ // project. The generator uniquely knows the project-specific inventory
398
+ // (Unity version, installed packages, key types). `composeSkillMarkdown`
399
+ // merges the two so a single `unity_open_mcp_generate_skill` write
400
+ // produces one file containing the full playbook AND this project's
401
+ // inventory, instead of two parallel builders that each lose half the
402
+ // picture.
403
+ /**
404
+ * Read the template workflow playbook from disk. Returns the template
405
+ * text (normalized to end with a single trailing newline), or `null`
406
+ * when the template cannot be located or read — the composer then
407
+ * degrades to the standalone full-inventory output. Never throws.
408
+ */
409
+ export async function readTemplateWorkflow() {
410
+ const templatePath = resolveTemplateSkillPath();
411
+ if (!templatePath)
412
+ return null;
413
+ try {
414
+ const raw = await readFile(templatePath, "utf-8");
415
+ return raw.endsWith("\n") ? raw : `${raw}\n`;
416
+ }
417
+ catch {
418
+ return null;
419
+ }
420
+ }
421
+ /**
422
+ * Compose the final skill markdown from the template playbook + the
423
+ * project inventory.
424
+ *
425
+ * - When `template` is non-null and `includeWorkflow !== false`: the
426
+ * template is emitted verbatim (the authoritative workflow prose),
427
+ * followed by a `---` separator and a `# Project inventory —
428
+ * <projectName>` section carrying the project-specific blocks. Both
429
+ * the template's heading and the project-name heading appear in the
430
+ * output.
431
+ * - When `template` is null (standalone install, template missing) or
432
+ * `includeWorkflow === false`: falls back to `generateSkillMarkdown`
433
+ * (the full standalone inventory, including its own workflow summary).
434
+ */
435
+ export function composeSkillMarkdown(state, caps, template, options = {}) {
436
+ const includeWorkflow = options.includeWorkflow !== false;
437
+ if (!template || !includeWorkflow) {
438
+ return generateSkillMarkdown(state, caps);
439
+ }
440
+ const lines = [];
441
+ // Template playbook, verbatim.
442
+ lines.push(template.endsWith("\n") ? template : `${template}\n`);
443
+ lines.push("---");
444
+ lines.push("");
445
+ // Project inventory section.
446
+ lines.push(`# Project inventory — ${state.projectName}`);
447
+ lines.push("");
448
+ lines.push(`> Project-specific section generated by \`unity_open_mcp_generate_skill\`. ` +
449
+ `Regenerate after package or script changes.`);
450
+ lines.push("");
451
+ lines.push(...buildProjectInventoryBlocks(state));
452
+ return lines.join("\n") + "\n";
453
+ }
454
+ // ---------------------------------------------------------------------------
375
455
  // Orchestrator
376
456
  // ---------------------------------------------------------------------------
377
457
  export async function generateSkill(projectRoot, caps, options = {}) {
378
458
  const state = await readProjectState(projectRoot);
379
- const skill = generateSkillMarkdown(state, caps);
459
+ const template = options.includeWorkflow !== false
460
+ ? await readTemplateWorkflow()
461
+ : null;
462
+ const skill = composeSkillMarkdown(state, caps, template, {
463
+ includeWorkflow: options.includeWorkflow,
464
+ });
380
465
  let written = [];
381
466
  if (options.write) {
382
467
  const clients = options.clients && options.clients.length > 0
@@ -386,4 +471,17 @@ export async function generateSkill(projectRoot, caps, options = {}) {
386
471
  }
387
472
  return { skill, project: state, written };
388
473
  }
474
+ /**
475
+ * Truncate a skill preview for embedding in a JSON envelope (Hub /
476
+ * CLI echo). The full skill is always written to disk when write=true;
477
+ * this only bounds the in-response copy.
478
+ */
479
+ export function truncateForPreview(skill) {
480
+ if (skill.length <= MAX_INVENTORY_PREVIEW_CHARS)
481
+ return skill;
482
+ const cut = skill.slice(0, MAX_INVENTORY_PREVIEW_CHARS);
483
+ const lastNewline = cut.lastIndexOf("\n");
484
+ const head = lastNewline > 0 ? cut.slice(0, lastNewline) : cut;
485
+ return `${head}\n\n… (${skill.length - head.length} more chars; full content written to disk)`;
486
+ }
389
487
  //# sourceMappingURL=generate-skill.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate-skill.js","sourceRoot":"","sources":["../../src/skill/generate-skill.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate-skill.js","sourceRoot":"","sources":["../../src/skill/generate-skill.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,18 @@ export declare class ToolRouter implements Router {
32
32
  private onToolListChanged?;
33
33
  private hubBackend;
34
34
  private readonly modelCache;
35
+ /**
36
+ * M28-refactoring Plan 3 (T3.2) — named-tool dispatch map. Replaces the
37
+ * former ~70-block `if (toolName === "...")` chain in routeCore. Each entry
38
+ * binds the tool name to its route-handler method. The map is built lazily on
39
+ * first use (the handlers are bound instance methods, so it cannot be a
40
+ * static field). Adding a new named-tool route is now a map entry, not a new
41
+ * `if` block. Tools that share a handler (validate_edit + scan_paths) or are
42
+ * reached via a predicate (isCompressible) are handled below the lookup — the
43
+ * map covers only exact-name dispatch.
44
+ */
45
+ private routeHandlers?;
46
+ private getRouteHandlers;
35
47
  constructor(live: LiveClient, batch: BatchSpawn, projectPath: string, eventStream: BridgeEventStream, sessionState: ToolSessionState, onToolListChanged?: (() => void | Promise<void>) | undefined, hubBackend?: HubControlBackend);
36
48
  route(toolName: string, args: Record<string, unknown>): Promise<CallToolResult>;
37
49
  /**
@@ -10,6 +10,8 @@ import { generateSkill } from "./skill/generate-skill.js";
10
10
  import { knownClientKeys } from "./skill/client-paths.js";
11
11
  import { ALL_TOOLS } from "./tools/index.js";
12
12
  import { lockPath, readInstanceLock, classifyInstance, isPidAlive } from "./instance-discovery.js";
13
+ import { PORT_ENV_VAR } from "./constants.js";
14
+ import { findUnityForProject } from "./running-unity.js";
13
15
  import { listInstalledEditors, fetchAvailableReleases, openInstallDeepLink, getInstallPath, setInstallPath, } from "./hub-control.js";
14
16
  /** Default Hub-control backend — calls the real hub-control functions. */
15
17
  const defaultHubBackend = {
@@ -19,7 +21,7 @@ const defaultHubBackend = {
19
21
  getInstallPath: () => getInstallPath(),
20
22
  setInstallPath: (path) => setInstallPath(path),
21
23
  };
22
- import { BATCH_TOOL_NAMES } from "./batch-spawn.js";
24
+ import { BATCH_TOOL_NAMES, ALWAYS_BATCH_TOOLS } from "./batch-spawn.js";
23
25
  import { readProfileAndDetail, applyPaging, attachPagination, foldVerifyResult, parseResultBody, withResultBody, } from "./output-profile.js";
24
26
  function injectRouteMeta(result, meta) {
25
27
  if (result.content.length === 0)
@@ -238,6 +240,50 @@ export class ToolRouter {
238
240
  onToolListChanged;
239
241
  hubBackend;
240
242
  modelCache = new AssetModelCache();
243
+ /**
244
+ * M28-refactoring Plan 3 (T3.2) — named-tool dispatch map. Replaces the
245
+ * former ~70-block `if (toolName === "...")` chain in routeCore. Each entry
246
+ * binds the tool name to its route-handler method. The map is built lazily on
247
+ * first use (the handlers are bound instance methods, so it cannot be a
248
+ * static field). Adding a new named-tool route is now a map entry, not a new
249
+ * `if` block. Tools that share a handler (validate_edit + scan_paths) or are
250
+ * reached via a predicate (isCompressible) are handled below the lookup — the
251
+ * map covers only exact-name dispatch.
252
+ */
253
+ routeHandlers;
254
+ getRouteHandlers() {
255
+ if (this.routeHandlers)
256
+ return this.routeHandlers;
257
+ const handlers = new Map([
258
+ // Offline-routed tools (resolved from disk; never hit the bridge).
259
+ ["unity_open_mcp_list_assets", (_l, a) => this.routeListAssets(a)],
260
+ ["unity_open_mcp_read_compile_errors", (_l, a) => this.routeReadCompileErrors(a)],
261
+ // Local-routed tools (server-only; no live/batch hop).
262
+ ["unity_senses_pull_events", (l, a) => this.routePullEvents(a, l)],
263
+ ["unity_open_mcp_capabilities", (l, a) => this.routeCapabilities(a, l)],
264
+ ["unity_open_mcp_list_rules", (_l, a) => this.routeListRules(a)],
265
+ ["unity_open_mcp_generate_skill", (_l, a) => this.routeGenerateSkill(a)],
266
+ ["unity_open_mcp_manage_tools", (l, a) => this.routeManageTools(a, l)],
267
+ ["unity_open_mcp_bridge_status", (l, a) => this.routeBridgeStatus(a, l)],
268
+ // Hub control tools (local-routed; system-level ops).
269
+ ["unity_open_mcp_hub_list_editors", () => this.routeHubListEditors()],
270
+ ["unity_open_mcp_hub_available_releases", () => this.routeHubAvailableReleases()],
271
+ ["unity_open_mcp_hub_install_editor", (_l, a) => this.routeHubInstallEditor(a)],
272
+ ["unity_open_mcp_hub_install_modules", (_l, a) => this.routeHubInstallModules(a)],
273
+ ["unity_open_mcp_hub_get_install_path", () => this.routeHubGetInstallPath()],
274
+ ["unity_open_mcp_hub_set_install_path", (_l, a) => this.routeHubSetInstallPath(a)],
275
+ // Offline-first reference tools (fall back to live when the bridge is up).
276
+ ["unity_open_mcp_find_references", (l, a) => this.routeFindReferences(a, l)],
277
+ ["unity_open_mcp_dependencies", (l, a) => this.routeDependencies(a, l)],
278
+ // Verify tools — share a single handler (toolName carried through).
279
+ ["unity_open_mcp_validate_edit", (l, a) => this.routeVerifyResult("unity_open_mcp_validate_edit", a, l)],
280
+ ["unity_open_mcp_scan_paths", (l, a) => this.routeVerifyResult("unity_open_mcp_scan_paths", a, l)],
281
+ // Scene data — output-profile + paging applied server-side.
282
+ ["unity_open_mcp_scene_get_data", (l, a) => this.routeSceneGetData(a, l)],
283
+ ]);
284
+ this.routeHandlers = handlers;
285
+ return handlers;
286
+ }
241
287
  constructor(live, batch, projectPath, eventStream, sessionState, onToolListChanged,
242
288
  // M26 Plan 2 — injectable Hub-control backend. Omit in production (the
243
289
  // default calls the real hub-control functions); tests pass a fake to
@@ -266,101 +312,13 @@ export class ToolRouter {
266
312
  return this.routeCore(overrideLive, toolName, args);
267
313
  }
268
314
  async routeCore(live, toolName, args) {
269
- // list_assets — always offline (no live equivalent needed).
270
- if (toolName === "unity_open_mcp_list_assets") {
271
- return this.routeListAssets(args);
272
- }
273
- // read_compile_errors — always offline. Reads Unity's Editor.log directly;
274
- // the one channel that works when the bridge assembly itself has failed to
275
- // compile (every in-bridge channel is dead with it, and compile_check can't
276
- // run). Never touches the bridge or spawns Unity.
277
- if (toolName === "unity_open_mcp_read_compile_errors") {
278
- return this.routeReadCompileErrors(args);
279
- }
280
- // M13 T4.4 — bridge event stream pull. The MCP server is the only long-lived
281
- // hop between the bridge and the agent; a per-process SSE reader amortizes
282
- // the connection and shares the queue across pulls. Lives only when the
283
- // bridge is reachable; an unreachable bridge returns a clear error instead
284
- // of hanging on connect.
285
- if (toolName === "unity_senses_pull_events") {
286
- return this.routePullEvents(args, live);
287
- }
288
- // capabilities — local capability-discovery surface (no live/batch hop).
289
- if (toolName === "unity_open_mcp_capabilities") {
290
- return this.routeCapabilities(args, live);
291
- }
292
- // list_rules — local rule catalog (no live/batch hop). Lets an agent
293
- // discover which rules apply to which asset kinds before calling
294
- // scan_paths / validate_edit.
295
- if (toolName === "unity_open_mcp_list_rules") {
296
- return this.routeListRules(args);
297
- }
298
- // generate_skill — local skill generation (no live/batch hop).
299
- if (toolName === "unity_open_mcp_generate_skill") {
300
- return this.routeGenerateSkill(args);
301
- }
302
- // M18 Plan 2 / T18.2.2 — manage_tools is server-only. It mutates the
303
- // per-session tool-group visibility state that lives in the MCP server
304
- // (ToolSessionState). The bridge does not track session state — it answers
305
- // manage_tools meta-calls by reporting the compiled tool set; the MCP
306
- // server applies the activate / deactivate filter to ListTools. Always
307
- // visible regardless of the current active set (meta-tool).
308
- if (toolName === "unity_open_mcp_manage_tools") {
309
- return this.routeManageTools(args, live);
310
- }
311
- // testsuite-tauri phase-3 — bridge_status. Operator-only health snapshot.
312
- // Server-resolved (classifyInstance + one /ping via the LiveClient); never
313
- // hits the bridge tool endpoint and never spawns Unity. Returns a coarse
314
- // `status` token (running/compiling/stopped/dead_bridge) the Validation
315
- // Suite app drives its offline-scenario gate off. Read-only, gate-free.
316
- if (toolName === "unity_open_mcp_bridge_status") {
317
- return this.routeBridgeStatus(args, live);
318
- }
319
- // M26 Plan 2 — Unity Hub control tools. Local-routed: resolved inside the
320
- // MCP server (filesystem discovery + Unity archive feed + unityhub:// deep
321
- // link + Hub CLI). Never hit the bridge tool endpoint, never spawn Unity.
322
- // Mutating members are system-level ops (paths_hint N/A, gate-free).
323
- if (toolName === "unity_open_mcp_hub_list_editors") {
324
- return this.routeHubListEditors();
325
- }
326
- if (toolName === "unity_open_mcp_hub_available_releases") {
327
- return this.routeHubAvailableReleases();
328
- }
329
- if (toolName === "unity_open_mcp_hub_install_editor") {
330
- return this.routeHubInstallEditor(args);
331
- }
332
- if (toolName === "unity_open_mcp_hub_install_modules") {
333
- return this.routeHubInstallModules(args);
334
- }
335
- if (toolName === "unity_open_mcp_hub_get_install_path") {
336
- return this.routeHubGetInstallPath();
337
- }
338
- if (toolName === "unity_open_mcp_hub_set_install_path") {
339
- return this.routeHubSetInstallPath(args);
340
- }
341
- // find_references — offline-first when no bridge is connected; live
342
- // ReferenceGraph remains available when the bridge is up.
343
- if (toolName === "unity_open_mcp_find_references") {
344
- return this.routeFindReferences(args, live);
345
- }
346
- // dependencies — offline-first (M24 Plan 2 / T24.2). Forward + reverse
347
- // edges + impact analysis all compute from YAML on disk when no bridge is
348
- // connected; the live DependenciesTool remains available when the bridge
349
- // is up. The offline path is the only one that exposes include_impact
350
- // (transitive reverse closure) today.
351
- if (toolName === "unity_open_mcp_dependencies") {
352
- return this.routeDependencies(args, live);
353
- }
354
- // M22 — verify tools. The bridge returns the full issues[] list; we fold +
355
- // page server-side per the output profile (compact = counts only).
356
- if (toolName === "unity_open_mcp_validate_edit" || toolName === "unity_open_mcp_scan_paths") {
357
- return this.routeVerifyResult(toolName, args, live);
358
- }
359
- // M22 — scene_get_data. Resolves the output profile (onto detail) and pages
360
- // the node stream server-side; the bridge detail/max_nodes params keep
361
- // working as back-compat aliases.
362
- if (toolName === "unity_open_mcp_scene_get_data") {
363
- return this.routeSceneGetData(args, live);
315
+ // Named-tool dispatch (T3.2): the handler map covers every exact-name
316
+ // route. The per-tool policy rationale (offline / local / hub / offline-
317
+ // first / verify-fold / scene-paging) lives in each routeXxx method's
318
+ // header comment.
319
+ const handler = this.getRouteHandlers().get(toolName);
320
+ if (handler) {
321
+ return handler(live, args);
364
322
  }
365
323
  // Compact drill-down reads: offline-first for text-serialized assets, fall
366
324
  // back to live bridge for binary formats. The compressible-router handles
@@ -376,12 +334,27 @@ export class ToolRouter {
376
334
  // running it against a live Editor that already compiled successfully
377
335
  // would trivially report "compile_passed" and never surface the broken
378
336
  // state the tool exists to diagnose.
379
- if (toolName === "unity_open_mcp_compile_check") {
380
- console.error(`[unity-open-mcp] Route: ${toolName} -> batch (compile check always spawns fresh)`);
337
+ //
338
+ // Verify-family tools (scan_all / baseline_create / regression_check) are
339
+ // batch-only: they require the headless verify package and are NOT
340
+ // registered on the live bridge. Routing them live (the previous default
341
+ // when the bridge was up) yielded a bare `tool_not_found`. An open Editor
342
+ // holding the project lock surfaces as `editor_instance_locked` from the
343
+ // batch spawn (the expected degraded outcome — agents should read the lock
344
+ // code, not chase a live registration miss).
345
+ //
346
+ // validate_edit / scan_paths are intentionally excluded: those ARE
347
+ // registered on the live bridge and stay live-first (routeVerifyResult
348
+ // below handles their output-profile folding). The always-batch policy is
349
+ // declared once in ALWAYS_BATCH_TOOLS (tool name → reason); do not add a
350
+ // second pinned branch for a new always-batch tool — extend the map.
351
+ const alwaysBatchReason = ALWAYS_BATCH_TOOLS.get(toolName);
352
+ if (alwaysBatchReason !== undefined) {
353
+ console.error(`[unity-open-mcp] Route: ${toolName} -> batch (always-batch: ${alwaysBatchReason})`);
381
354
  const result = await this.batch.route(toolName, args);
382
355
  return injectRouteMeta(result, {
383
356
  route: "batch",
384
- fallbackReason: "compile_check_always_batch",
357
+ fallbackReason: alwaysBatchReason,
385
358
  });
386
359
  }
387
360
  if (!canBatch && !isPing) {
@@ -575,7 +548,7 @@ export class ToolRouter {
575
548
  "Ensure the Unity Editor is open with the Agent Bridge running. " +
576
549
  "The bridge port is per-project (20000 + sha256(projectPath) % 10000), not fixed — " +
577
550
  `if Unity is open, check the instance lock at ${lockPath(this.projectPath)} ` +
578
- "for the live port/pid, or set UNITY_OPEN_MCP_BRIDGE_PORT.",
551
+ `for the live port/pid, or set ${PORT_ENV_VAR}.`,
579
552
  },
580
553
  }),
581
554
  },
@@ -643,6 +616,9 @@ export class ToolRouter {
643
616
  }
644
617
  async routeGenerateSkill(args) {
645
618
  const write = args.write === true;
619
+ // include_workflow defaults to true; explicitly passing false
620
+ // opts out of the template+inventory merge.
621
+ const includeWorkflow = args.include_workflow !== false;
646
622
  const rawClients = Array.isArray(args.clients) ? args.clients : [];
647
623
  // Client allowlist comes from the single-source manifest at
648
624
  // `skills/client-paths.json`. Do not add a literal union here.
@@ -658,6 +634,7 @@ export class ToolRouter {
658
634
  const result = await generateSkill(this.projectPath, caps, {
659
635
  write,
660
636
  clients: clients.length > 0 ? clients : undefined,
637
+ includeWorkflow,
661
638
  });
662
639
  return {
663
640
  content: [
@@ -952,6 +929,12 @@ export class ToolRouter {
952
929
  // /ping reachable, compiling=true → "compiling"
953
930
  // /ping reachable, connected=true → "running"
954
931
  // /ping UNreachable + Unity running → "unreachable" (T-fix-3)
932
+ // no lock + /ping UNreachable + Unity proc → "dead_bridge" (M27 Plan 1,
933
+ // cold Safe Mode — reuses the
934
+ // dead_bridge status token +
935
+ // recoveryHint; the instance
936
+ // sub-object carries
937
+ // `unityProcessPid`)
955
938
  // otherwise (offline / toolbar off / gone) → "stopped"
956
939
  //
957
940
  // "stopped" intentionally folds two indistinguishable cases from the
@@ -995,6 +978,24 @@ export class ToolRouter {
995
978
  // domain-reload window; a live-PID "healthy"/"gone"-with-alive-pid lock
996
979
  // also indicates Unity is up.
997
980
  const lockPidAlive = lock !== null && isPidAlive(lock.pid);
981
+ // M27 Plan 1 — cold Safe Mode detection. When the lock is absent
982
+ // (classification "gone") AND the ping is unreachable, the bridge's
983
+ // [InitializeOnLoad] may have never run at all — Unity launched straight
984
+ // into Safe Mode (bridge assembly failed to compile from a cold start) and
985
+ // no lock was ever written. Before this fix that state folded into the
986
+ // generic "stopped", hiding the recovery path (read_compile_errors works
987
+ // even with the bridge dead — it reads Editor.log offline). Scan for a live
988
+ // Unity process whose -projectPath references this project; a match is a
989
+ // strong positive signal of cold Safe Mode and reuses the existing
990
+ // dead_bridge status token + recoveryHint (no new status). The scan only
991
+ // runs in this narrow branch (no lock + unreachable) so the happy path and
992
+ // the reload-window path never pay the ps/PowerShell cost.
993
+ let unityProcessPid = null;
994
+ if (classification === "gone" && !pingReachable) {
995
+ const proc = findUnityForProject(this.projectPath);
996
+ if (proc)
997
+ unityProcessPid = proc.pid;
998
+ }
998
999
  let status;
999
1000
  if (classification === "dead_bridge") {
1000
1001
  status = "dead_bridge";
@@ -1005,6 +1006,13 @@ export class ToolRouter {
1005
1006
  else if (connected) {
1006
1007
  status = "running";
1007
1008
  }
1009
+ else if (!pingReachable && unityProcessPid !== null) {
1010
+ // M27 Plan 1 — cold Safe Mode: no lock (bridge never compiled) + a live
1011
+ // Unity process for this project. Reuse the dead_bridge status token so
1012
+ // the existing recoveryHint + nextStep (read_compile_errors) applies
1013
+ // unchanged. Operators get a `unityProcessPid` to confirm the diagnosis.
1014
+ status = "dead_bridge";
1015
+ }
1008
1016
  else if (!pingReachable && (classification === "reloading" || lockPidAlive)) {
1009
1017
  // Unity is running but the listener didn't respond — transient (reload
1010
1018
  // window) or toolbar-off. Surface as unreachable so it isn't masked by
@@ -1036,6 +1044,10 @@ export class ToolRouter {
1036
1044
  lockPath: lockOnDisk,
1037
1045
  classification,
1038
1046
  lock: lock ? summarizeBridgeStatusLock(lock) : null,
1047
+ // M27 Plan 1 — PID of the live Unity process for this project, when
1048
+ // the cold-Safe-Mode scan matched one. Omitted (absent) when no scan
1049
+ // ran (happy path / reload window) or when the scan found no match.
1050
+ ...(unityProcessPid !== null ? { unityProcessPid } : {}),
1039
1051
  },
1040
1052
  ping: pingReachable
1041
1053
  ? {