ue-mcp 0.7.5 → 0.7.8

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 (45) hide show
  1. package/README.md +1 -1
  2. package/dist/flow/anthropic-provider.d.ts +15 -0
  3. package/dist/flow/anthropic-provider.js +71 -0
  4. package/dist/flow/anthropic-provider.js.map +1 -0
  5. package/dist/flow/bridge-task.d.ts +4 -0
  6. package/dist/flow/bridge-task.js +23 -7
  7. package/dist/flow/bridge-task.js.map +1 -1
  8. package/dist/flow/context.d.ts +3 -1
  9. package/dist/flow/flow-tool.js +46 -6
  10. package/dist/flow/flow-tool.js.map +1 -1
  11. package/dist/flow/schema.d.ts +314 -0
  12. package/dist/tools/animation.js +12 -0
  13. package/dist/tools/animation.js.map +1 -1
  14. package/dist/tools/asset.js +3 -0
  15. package/dist/tools/asset.js.map +1 -1
  16. package/dist/tools/blueprint.js +10 -0
  17. package/dist/tools/blueprint.js.map +1 -1
  18. package/dist/tools/material.js +15 -0
  19. package/dist/tools/material.js.map +1 -1
  20. package/dist/tools/niagara.js +13 -0
  21. package/dist/tools/niagara.js.map +1 -1
  22. package/dist/tools/project.js +77 -1
  23. package/dist/tools/project.js.map +1 -1
  24. package/dist/ue-mcp.default.yml +198 -0
  25. package/package.json +3 -2
  26. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/HandlerUtils.h +69 -0
  27. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.cpp +202 -25
  28. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.h +7 -0
  29. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.cpp +356 -8
  30. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.h +4 -0
  31. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AudioHandlers.cpp +69 -13
  32. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.cpp +564 -41
  33. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.h +11 -0
  34. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.cpp +8 -2
  35. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.cpp +106 -31
  36. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.cpp +41 -41
  37. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.cpp +250 -36
  38. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.cpp +436 -4
  39. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.h +11 -0
  40. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NiagaraHandlers.cpp +403 -13
  41. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NiagaraHandlers.h +10 -0
  42. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PCGHandlers.cpp +32 -6
  43. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.cpp +8 -5
  44. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SplineHandlers.cpp +29 -5
  45. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.cpp +23 -13
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # UE-MCP
2
2
 
3
- **Unreal Engine Model Context Protocol Server** — gives AI assistants deep read/write access to the Unreal Editor through 19 category tools covering 300+ actions.
3
+ **Unreal Engine Model Context Protocol Server** — gives AI assistants deep read/write access to the Unreal Editor through 19 category tools covering 360+ actions.
4
4
 
5
5
  ```mermaid
6
6
  flowchart LR
@@ -0,0 +1,15 @@
1
+ import type { LLMProvider, LLMCompletionRequest, LLMCompletionResponse } from "@db-lyon/flowkit";
2
+ /**
3
+ * Anthropic-backed LLMProvider for use by the `agent_prompt` task.
4
+ *
5
+ * Attach to the flow context as `ctx.llm`. Requires ANTHROPIC_API_KEY
6
+ * (or explicit apiKey in constructor). Enables prompt caching on the
7
+ * system prompt so recurrent on_failure triage is cheap.
8
+ */
9
+ export declare class AnthropicProvider implements LLMProvider {
10
+ private client;
11
+ constructor(opts?: {
12
+ apiKey?: string;
13
+ });
14
+ complete(req: LLMCompletionRequest): Promise<LLMCompletionResponse>;
15
+ }
@@ -0,0 +1,71 @@
1
+ import Anthropic from "@anthropic-ai/sdk";
2
+ const DEFAULT_MODEL = "claude-opus-4-5";
3
+ const DEFAULT_MAX_TOKENS = 1024;
4
+ /**
5
+ * Anthropic-backed LLMProvider for use by the `agent_prompt` task.
6
+ *
7
+ * Attach to the flow context as `ctx.llm`. Requires ANTHROPIC_API_KEY
8
+ * (or explicit apiKey in constructor). Enables prompt caching on the
9
+ * system prompt so recurrent on_failure triage is cheap.
10
+ */
11
+ export class AnthropicProvider {
12
+ client;
13
+ constructor(opts = {}) {
14
+ const apiKey = opts.apiKey ?? process.env.ANTHROPIC_API_KEY;
15
+ if (!apiKey) {
16
+ throw new Error("AnthropicProvider: no API key. Set ANTHROPIC_API_KEY or pass { apiKey } explicitly.");
17
+ }
18
+ this.client = new Anthropic({ apiKey });
19
+ }
20
+ async complete(req) {
21
+ const model = req.model ?? DEFAULT_MODEL;
22
+ const max_tokens = req.maxTokens ?? DEFAULT_MAX_TOKENS;
23
+ let userPrompt = req.prompt;
24
+ if (req.schema) {
25
+ userPrompt +=
26
+ "\n\nRespond ONLY with a JSON object matching this schema:\n" +
27
+ JSON.stringify(req.schema) +
28
+ "\n\nOutput just the JSON, no prose, no markdown fences.";
29
+ }
30
+ const systemBlocks = req.system
31
+ ? [{ type: "text", text: req.system, cache_control: { type: "ephemeral" } }]
32
+ : undefined;
33
+ const response = await this.client.messages.create({
34
+ model,
35
+ max_tokens,
36
+ system: systemBlocks,
37
+ messages: [{ role: "user", content: userPrompt }],
38
+ });
39
+ const text = response.content
40
+ .map((block) => (block.type === "text" ? block.text : ""))
41
+ .join("")
42
+ .trim();
43
+ const out = {
44
+ text,
45
+ usage: {
46
+ inputTokens: response.usage?.input_tokens,
47
+ outputTokens: response.usage?.output_tokens,
48
+ },
49
+ };
50
+ if (req.schema) {
51
+ const parsed = tryParseJson(text);
52
+ if (parsed !== undefined)
53
+ out.parsed = parsed;
54
+ }
55
+ return out;
56
+ }
57
+ }
58
+ function tryParseJson(text) {
59
+ // Strip common markdown fences the model might add despite instructions.
60
+ const cleaned = text
61
+ .replace(/^```(?:json)?\s*/i, "")
62
+ .replace(/```$/, "")
63
+ .trim();
64
+ try {
65
+ return JSON.parse(cleaned);
66
+ }
67
+ catch {
68
+ return undefined;
69
+ }
70
+ }
71
+ //# sourceMappingURL=anthropic-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-provider.js","sourceRoot":"","sources":["../../src/flow/anthropic-provider.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAO1C,MAAM,aAAa,GAAG,iBAAiB,CAAC;AACxC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC;;;;;;GAMG;AACH,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAY;IAE1B,YAAY,OAA4B,EAAE;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAC5D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,qFAAqF,CACtF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAyB;QACtC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,aAAa,CAAC;QACzC,MAAM,UAAU,GAAG,GAAG,CAAC,SAAS,IAAI,kBAAkB,CAAC;QAEvD,IAAI,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC;QAC5B,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,UAAU;gBACR,6DAA6D;oBAC7D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;oBAC1B,yDAAyD,CAAC;QAC9D,CAAC;QAED,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM;YAC7B,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,WAAoB,EAAE,EAAE,CAAC;YAC9F,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjD,KAAK;YACL,UAAU;YACV,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;SAClD,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO;aAC1B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aACzD,IAAI,CAAC,EAAE,CAAC;aACR,IAAI,EAAE,CAAC;QAEV,MAAM,GAAG,GAA0B;YACjC,IAAI;YACJ,KAAK,EAAE;gBACL,WAAW,EAAE,QAAQ,CAAC,KAAK,EAAE,YAAY;gBACzC,YAAY,EAAE,QAAQ,CAAC,KAAK,EAAE,aAAa;aAC5C;SACF,CAAC;QAEF,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,MAAM,KAAK,SAAS;gBAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;QAChD,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,yEAAyE;IACzE,MAAM,OAAO,GAAG,IAAI;SACjB,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;SAChC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,IAAI,EAAE,CAAC;IACV,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -11,6 +11,10 @@ import { BaseTask, type TaskResult } from "@db-lyon/flowkit";
11
11
  * 2. **Built-in tasks** via `bridgeTaskClass()` factory:
12
12
  * The bridge method is baked into the class closure.
13
13
  * Options are passed through as bridge params.
14
+ *
15
+ * Handlers may attach a `rollback: { method, payload }` to their response.
16
+ * When present, it is lifted onto `TaskResult.rollback` so the flow runner
17
+ * can invoke the inverse on failure when `rollback_on_failure` is enabled.
14
18
  */
15
19
  export declare class BridgeTask extends BaseTask {
16
20
  get taskName(): string;
@@ -11,6 +11,10 @@ import { BaseTask } from "@db-lyon/flowkit";
11
11
  * 2. **Built-in tasks** via `bridgeTaskClass()` factory:
12
12
  * The bridge method is baked into the class closure.
13
13
  * Options are passed through as bridge params.
14
+ *
15
+ * Handlers may attach a `rollback: { method, payload }` to their response.
16
+ * When present, it is lifted onto `TaskResult.rollback` so the flow runner
17
+ * can invoke the inverse on failure when `rollback_on_failure` is enabled.
14
18
  */
15
19
  export class BridgeTask extends BaseTask {
16
20
  get taskName() {
@@ -22,13 +26,25 @@ export class BridgeTask extends BaseTask {
22
26
  throw new Error('BridgeTask requires a "method" option');
23
27
  }
24
28
  const ctx = this.ctx;
25
- const data = await ctx.bridge.call(method, params);
26
- return {
27
- success: true,
28
- data: typeof data === "object" && data !== null
29
- ? data
30
- : { result: data },
31
- };
29
+ const raw = await ctx.bridge.call(method, params);
30
+ if (typeof raw !== "object" || raw === null) {
31
+ return { success: true, data: { result: raw } };
32
+ }
33
+ const { rollback, ...rest } = raw;
34
+ const result = { success: true, data: rest };
35
+ if (rollback && typeof rollback === "object") {
36
+ const rb = rollback;
37
+ if (typeof rb.method === "string") {
38
+ const record = {
39
+ taskName: rb.method,
40
+ payload: rb.payload && typeof rb.payload === "object"
41
+ ? rb.payload
42
+ : {},
43
+ };
44
+ result.rollback = record;
45
+ }
46
+ }
47
+ return result;
32
48
  }
33
49
  }
34
50
  //# sourceMappingURL=bridge-task.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-task.js","sourceRoot":"","sources":["../../src/flow/bridge-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAmB,MAAM,kBAAkB,CAAC;AAG7D;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,UAAW,SAAQ,QAAQ;IACtC,IAAI,QAAQ;QACV,OAAO,UAAW,IAAI,CAAC,OAAmC,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,OAAkC,CAAC;QACtE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAkB,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAgB,EAAE,MAAM,CAAC,CAAC;QAC7D,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;gBAC7C,CAAC,CAAE,IAAgC;gBACnC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;SACrB,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"bridge-task.js","sourceRoot":"","sources":["../../src/flow/bridge-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAwC,MAAM,kBAAkB,CAAC;AAGlF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,UAAW,SAAQ,QAAQ;IACtC,IAAI,QAAQ;QACV,OAAO,UAAW,IAAI,CAAC,OAAmC,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,OAAkC,CAAC;QACtE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAkB,CAAC;QACpC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAgB,EAAE,MAAM,CAAC,CAAC;QAE5D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAClD,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,GAA8B,CAAC;QAC7D,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAEzD,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC7C,MAAM,EAAE,GAAG,QAAmD,CAAC;YAC/D,IAAI,OAAO,EAAE,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAClC,MAAM,MAAM,GAAmB;oBAC7B,QAAQ,EAAE,EAAE,CAAC,MAAM;oBACnB,OAAO,EACL,EAAE,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC,OAAO,KAAK,QAAQ;wBAC1C,CAAC,CAAE,EAAE,CAAC,OAAmC;wBACzC,CAAC,CAAC,EAAE;iBACT,CAAC;gBACF,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -1,7 +1,9 @@
1
- import type { TaskContext } from "@db-lyon/flowkit";
1
+ import type { TaskContext, LLMProvider } from "@db-lyon/flowkit";
2
2
  import type { IBridge } from "../bridge.js";
3
3
  import type { ProjectContext } from "../project.js";
4
4
  export interface FlowContext extends TaskContext {
5
5
  bridge: IBridge;
6
6
  project: ProjectContext;
7
+ /** Optional LLM provider used by the built-in `agent_prompt` task. */
8
+ llm?: LLMProvider;
7
9
  }
@@ -1,20 +1,41 @@
1
1
  import { z } from "zod";
2
- import { FlowRunner } from "@db-lyon/flowkit";
2
+ import { FlowRunner, AgentPromptTask } from "@db-lyon/flowkit";
3
+ import { AnthropicProvider } from "./anthropic-provider.js";
4
+ // Lazy-init the LLM provider so the server still starts without an API key.
5
+ let llmProvider;
6
+ let llmProviderInitAttempted = false;
7
+ function getLLMProvider() {
8
+ if (llmProviderInitAttempted)
9
+ return llmProvider;
10
+ llmProviderInitAttempted = true;
11
+ try {
12
+ llmProvider = new AnthropicProvider();
13
+ }
14
+ catch {
15
+ // No API key — agent_prompt steps will fail clearly when invoked.
16
+ }
17
+ return llmProvider;
18
+ }
3
19
  export function createFlowTool(registry, reloadConfig) {
20
+ // Ensure agent_prompt is registered on the shared registry.
21
+ registry.registerClassPath("flow.agent_prompt", AgentPromptTask);
4
22
  return {
5
23
  name: "flow",
6
24
  description: `Run or inspect named flows defined in ue-mcp.yml. Config is reloaded on every call — no restart needed.\n\n` +
7
25
  `Actions:\n` +
8
- `- run: Execute a flow. Params: flowName, skip?, params?\n` +
26
+ `- run: Execute a flow. Params: flowName, skip?, params?, rollback_on_failure?\n` +
9
27
  `- plan: Show execution plan without running. Params: flowName\n` +
10
28
  `- list: List available flows\n\n` +
11
29
  `params: Runtime options merged into every step's options (highest priority). ` +
12
- `Use to override YAML-hardcoded values like levelPath, directory, configuration, etc.`,
30
+ `Use to override YAML-hardcoded values like levelPath, directory, configuration, etc.\n\n` +
31
+ `rollback_on_failure: When true, rollback records from completed steps are invoked ` +
32
+ `in reverse order if a subsequent step fails.`,
13
33
  schema: {
14
34
  action: z.enum(["run", "plan", "list"]).describe("Action to perform"),
15
35
  flowName: z.string().optional().describe("Flow name from ue-mcp.yml"),
16
36
  skip: z.array(z.string()).optional().describe("Step names or numbers to skip"),
17
37
  params: z.record(z.unknown()).optional().describe("Runtime options merged into every step's options (highest priority)"),
38
+ rollback_on_failure: z.boolean().optional().describe("Invoke inverse tasks in reverse order on failure"),
18
39
  },
19
40
  actions: {
20
41
  run: { handler: async (ctx, params) => runFlow(registry, reloadConfig(), ctx, params) },
@@ -54,14 +75,16 @@ async function runFlow(registry, config, ctx, params) {
54
75
  throw new Error("flowName is required");
55
76
  const skip = params.skip ?? [];
56
77
  const flowParams = params.params;
78
+ const rollback_on_failure = params.rollback_on_failure;
57
79
  const runner = makeRunner(registry, config, ctx);
58
- const result = await runner.run({ flowName, skip, params: flowParams });
80
+ const result = await runner.run({ flowName, skip, params: flowParams, rollback_on_failure });
59
81
  return formatFlowResult(result);
60
82
  }
61
83
  function makeRunner(registry, config, ctx) {
62
84
  const flowCtx = {
63
85
  bridge: ctx.bridge,
64
86
  project: ctx.project,
87
+ llm: getLLMProvider(),
65
88
  };
66
89
  return new FlowRunner({
67
90
  tasks: config.tasks,
@@ -78,11 +101,11 @@ function formatFlowResult(result) {
78
101
  for (const s of result.steps) {
79
102
  const stepIcon = s.skipped ? "○" : s.result?.success ? "✓" : "✗";
80
103
  const status = s.skipped ? "skipped" : s.result?.success ? formatDuration(s.duration) : "FAILED";
81
- lines.push(` ${stepIcon} ${s.stepNumber}. ${s.name} (${s.type}) ${status}`);
104
+ const attempts = s.attempts && s.attempts > 1 ? ` [${s.attempts} attempts]` : "";
105
+ lines.push(` ${stepIcon} ${s.stepNumber}. ${s.name} (${s.type}) — ${status}${attempts}`);
82
106
  if (s.result?.error) {
83
107
  lines.push(` ${s.result.error.message}`);
84
108
  }
85
- // Show shell output if present
86
109
  if (s.result?.data?.output && typeof s.result.data.output === "string") {
87
110
  const output = s.result.data.output;
88
111
  if (output.length > 0) {
@@ -97,12 +120,29 @@ function formatFlowResult(result) {
97
120
  lines.push("");
98
121
  lines.push(` Error: ${result.error.message}`);
99
122
  }
123
+ if (result.rollback) {
124
+ lines.push("");
125
+ lines.push(` Rollback: ${result.rollback.succeeded}/${result.rollback.attempted} inverses succeeded` +
126
+ (result.rollback.errors.length ? ` — ${result.rollback.errors.length} failed` : ""));
127
+ for (const e of result.rollback.errors) {
128
+ lines.push(` ✗ ${e.taskName}: ${e.error.message}`);
129
+ }
130
+ }
131
+ if (result.hookErrors && result.hookErrors.length > 0) {
132
+ lines.push("");
133
+ lines.push(` Hook errors (${result.hookErrors.length}):`);
134
+ for (const h of result.hookErrors) {
135
+ lines.push(` ✗ ${h.phase}:${h.name} — ${h.error.message}`);
136
+ }
137
+ }
100
138
  return {
101
139
  summary: lines.join("\n"),
102
140
  success: result.success,
103
141
  duration: result.duration,
104
142
  stepCount: result.steps.length,
105
143
  failedStep: result.steps.find((s) => s.result?.success === false)?.name,
144
+ rollback: result.rollback,
145
+ hookErrors: result.hookErrors,
106
146
  };
107
147
  }
108
148
  function formatDuration(ms) {
@@ -1 +1 @@
1
- {"version":3,"file":"flow-tool.js","sourceRoot":"","sources":["../../src/flow/flow-tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flow-tool.js","sourceRoot":"","sources":["../../src/flow/flow-tool.ts"],"names":[],"mappings":"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"}