---
phase: 03-generate-node-refactor
plan: 03
type: execute
---
Ensure backward compatibility for existing workflows.
Purpose: Existing saved workflows must load and execute without modification.
Output: Migration logic, working execution with both legacy and new formats.
~/.claude/get-shit-done/workflows/execute-phase.md
~/.claude/get-shit-done/templates/summary.md
@.planning/PROJECT.md
@.planning/STATE.md
@.planning/phases/03-generate-node-refactor/03-01-SUMMARY.md
@.planning/phases/03-generate-node-refactor/03-02-SUMMARY.md
@src/store/workflowStore.ts
@src/components/nodes/GenerateImageNode.tsx
**Constraints:** Node type "nanoBanana" unchanged, legacy ModelType must work
Task 1: Add workflow migration logic
src/store/workflowStore.ts
In workflow loading (loadWorkflow or where JSON is parsed):
1. For nanoBanana nodes without selectedModel, derive it from legacy model field:
```typescript
if (node.type === "nanoBanana" && node.data.model && !node.data.selectedModel) {
node.data.selectedModel = {
provider: "gemini",
modelId: node.data.model,
displayName: node.data.model === "nano-banana" ? "Nano Banana" : "Nano Banana Pro"
};
}
```
2. Keep both fields synced on save for bidirectional compatibility
Load existing workflow file, check node has selectedModel populated
Old workflows load with selectedModel auto-populated
Task 2: Update executeWorkflow for multi-provider
src/store/workflowStore.ts
In executeWorkflow nanoBanana case:
1. Check for selectedModel
2. If non-Gemini provider, add API key headers from providerSettings:
```typescript
const headers = { "Content-Type": "application/json" };
if (nodeData.selectedModel?.provider === "replicate") {
const config = get().providerSettings.providers.find(p => p.id === "replicate");
if (config?.apiKey) headers["X-Replicate-API-Key"] = config.apiKey;
}
// Similar for fal
```
3. Include selectedModel in request body
4. Handle GenerationOutput response format
Execute workflow with Gemini model
Execution works for both legacy and new model selection
Task 3: Handle legacy data in GenerateImageNode UI
src/components/nodes/GenerateImageNode.tsx
1. On mount/data change: if model exists but not selectedModel, derive selectedModel
2. Ensure dropdowns reflect correct provider/model for migrated nodes
3. Save defaults in both formats for compatibility
Open workflow with old nanoBanana node, verify correct selection shown
UI correctly displays legacy nodes
- [ ] `npm run build` succeeds
- [ ] Existing workflow loads without errors
- [ ] Legacy Gemini execution works
- [ ] New provider selection persists correctly
- Existing workflows load and execute unchanged
- Migration auto-populates selectedModel
- Both formats work in same workflow
- Phase 3 complete