From 11ce860572b5f5c9f811cd0b34503907200b1a47 Mon Sep 17 00:00:00 2001 From: Yelyzaveta Berest Date: Fri, 10 Jul 2026 11:18:20 +0300 Subject: [PATCH] fix(smart-forms): pushSmartForm Windows path bug, bump to 2.4.1 pushSmartForm Phase 2 mapped the create response back to local paths with filepath.Dir, which returns backslash-separated paths on Windows and misses the slash-keyed folder map. Creating a new page (pages//config) then aborted with "server did not return id for created file ...", even though the server had already created the folder and files (pullSmartForm showed them). The mapping now reuses resolveParentID (the same ToSlash-normalized lookup used when POSTing), so the key is consistent across OSes. No behaviour change on macOS/Linux (ToSlash is a no-op there). Bumps version 2.4.0 -> 2.4.1 across all six manifests + CHANGELOG. Co-Authored-By: Claude Opus 4.8 (1M context) --- .agents/plugins/marketplace.json | 2 +- .claude-plugin/marketplace.json | 2 +- CHANGELOG.md | 5 +++++ POWER.md | 2 +- plugins/simulator/.claude-plugin/plugin.json | 2 +- plugins/simulator/.codex-plugin/plugin.json | 2 +- plugins/simulator/.kiro-plugin/plugin.json | 2 +- .../mcp-server/internal/engines/smartform/push.go | 9 +++++---- 8 files changed, 16 insertions(+), 10 deletions(-) diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json index d7bff5f..8c88745 100644 --- a/.agents/plugins/marketplace.json +++ b/.agents/plugins/marketplace.json @@ -6,7 +6,7 @@ "plugins": [ { "name": "simulator", - "version": "2.4.0", + "version": "2.4.1", "source": { "source": "local", "path": "./plugins/simulator" diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 4179577..16ef33a 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -9,7 +9,7 @@ "name": "simulator", "source": "./plugins/simulator", "description": "Simulator.Company platform assistant. Exposes the Simulator REST API as an MCP server and provides skills for managing actors, forms, graph structures, and financial accounts.", - "version": "2.4.0", + "version": "2.4.1", "author": { "name": "Simulator.Company", "url": "https://simulator.company" diff --git a/CHANGELOG.md b/CHANGELOG.md index e1ef795..d0cf4e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## [2.4.1] + +### Fixed +- **`pushSmartForm` failed on Windows when creating files in a new subfolder (e.g. a new Smart Form page `pages//config`).** Phase 2 mapped the server's create response back to local paths using `filepath.Dir`, which yields backslash-separated paths on Windows and misses the slash-keyed folder map — so the push aborted with "server did not return id for created file …" even though the server had already created the folder and files (a subsequent `pullSmartForm` showed them). The response mapping now reuses `resolveParentID` (the same `ToSlash`-normalized lookup used when POSTing), keeping the key consistent across OSes. macOS/Linux behaviour is unchanged (`ToSlash` is a no-op there). + ## [2.4.0] ### Added diff --git a/POWER.md b/POWER.md index 261fbf3..70e9d6c 100644 --- a/POWER.md +++ b/POWER.md @@ -1,7 +1,7 @@ --- name: simulator displayName: Simulator.Company -version: 2.4.0 +version: 2.4.1 description: BPM, graph, and financial-tracking toolkit for the Simulator.Company platform. Exposes the Simulator REST API as MCP tools plus 16 skills covering actors, forms, graphs, layers, accounts, transactions, transfers, charts, smart forms, meetings, reactions, and attachments. author: name: Simulator.Company diff --git a/plugins/simulator/.claude-plugin/plugin.json b/plugins/simulator/.claude-plugin/plugin.json index fc8c0bb..84a14ab 100644 --- a/plugins/simulator/.claude-plugin/plugin.json +++ b/plugins/simulator/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "simulator", - "version": "2.4.0", + "version": "2.4.1", "description": "Simulator.Company platform assistant. Exposes the Simulator REST API as an MCP server and provides skills for managing actors, forms, graph structures, and financial accounts.", "author": { "name": "Simulator.Company", diff --git a/plugins/simulator/.codex-plugin/plugin.json b/plugins/simulator/.codex-plugin/plugin.json index fc8c0bb..84a14ab 100644 --- a/plugins/simulator/.codex-plugin/plugin.json +++ b/plugins/simulator/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "simulator", - "version": "2.4.0", + "version": "2.4.1", "description": "Simulator.Company platform assistant. Exposes the Simulator REST API as an MCP server and provides skills for managing actors, forms, graph structures, and financial accounts.", "author": { "name": "Simulator.Company", diff --git a/plugins/simulator/.kiro-plugin/plugin.json b/plugins/simulator/.kiro-plugin/plugin.json index 246e9ac..4d8b26a 100644 --- a/plugins/simulator/.kiro-plugin/plugin.json +++ b/plugins/simulator/.kiro-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "simulator", - "version": "2.4.0", + "version": "2.4.1", "description": "Simulator.Company platform assistant. Exposes the Simulator REST API as an MCP server and provides skills for managing actors, forms, graph structures, and financial accounts.", "author": { "name": "Simulator.Company", diff --git a/plugins/simulator/mcp-server/internal/engines/smartform/push.go b/plugins/simulator/mcp-server/internal/engines/smartform/push.go index 7851610..eb85401 100644 --- a/plugins/simulator/mcp-server/internal/engines/smartform/push.go +++ b/plugins/simulator/mcp-server/internal/engines/smartform/push.go @@ -242,10 +242,11 @@ func handlePushSmartForm(ctx context.Context, req mcp.CallToolRequest) (*mcp.Cal byKey[fmt.Sprintf("%d/%s", c.FolderID, c.Title)] = c } for _, relPath := range newFilePaths { - parentID := manifest.Folders[filepath.Dir(relPath)] - if filepath.Dir(relPath) == "." { - parentID = manifest.EnvRootFolderID - } + // Reuse resolveParentID (with ToSlash) so the lookup key matches the + // parentID actually POSTed above. Computing filepath.Dir inline here + // breaks on Windows, where it yields backslash-separated paths that + // miss the slash-keyed manifest.Folders map. + parentID, _ := resolveParentID(relPath, manifest.Folders, manifest.EnvRootFolderID) key := fmt.Sprintf("%d/%s", parentID, filepath.Base(relPath)) c, ok := byKey[key] if !ok {