From 39043b8958ba6a6e0c971d7dfce978f274af1b24 Mon Sep 17 00:00:00 2001 From: Cody Seibert Date: Tue, 9 Dec 2025 22:06:52 -0500 Subject: [PATCH 1/4] feat(auto-mode): enhance error handling and feature status updates - Improved error handling in AutoModeService to log errors and update feature status to "waiting_approval" when an error occurs during feature execution. - Added error message writing to the context file for better debugging. - Updated FeatureLoader to include an optional error message parameter when updating feature status. - Enhanced prompt generation to include detailed context about attached images for better user guidance during feature implementation. - Modified KanbanCard component to visually indicate features with errors, improving user awareness of issues. These changes significantly enhance the robustness of the auto mode feature and improve the user experience by providing clearer feedback on feature execution status. --- .../feature-1765326577290-x65tvg9n0.md | 117 --------------- .../feature-1765326669854-gcjsh15zz.md | 139 ------------------ .automaker/feature_list.json | 102 +------------ app/electron/auto-mode-service.js | 125 ++++++++++++++++ app/electron/services/feature-executor.js | 10 +- app/electron/services/feature-loader.js | 14 +- app/electron/services/prompt-builder.js | 51 +++++-- app/src/components/layout/sidebar.tsx | 6 +- .../components/views/agent-output-modal.tsx | 2 +- app/src/components/views/board-view.tsx | 19 ++- app/src/components/views/kanban-card.tsx | 104 ++++++------- app/src/store/app-store.ts | 1 + 12 files changed, 261 insertions(+), 429 deletions(-) delete mode 100644 .automaker/agents-context/feature-1765326577290-x65tvg9n0.md delete mode 100644 .automaker/agents-context/feature-1765326669854-gcjsh15zz.md diff --git a/.automaker/agents-context/feature-1765326577290-x65tvg9n0.md b/.automaker/agents-context/feature-1765326577290-x65tvg9n0.md deleted file mode 100644 index d537d922..00000000 --- a/.automaker/agents-context/feature-1765326577290-x65tvg9n0.md +++ /dev/null @@ -1,117 +0,0 @@ -📋 Planning implementation for: switch the order inside the add new feature panel so descriptino comes first followed by an optional category, also update the edit feature panel. -⚡ Executing implementation for: switch the order inside the add new feature panel so descriptino comes first followed by an optional category, also update the edit feature panel. -Starting code implementation... - -🔧 Tool: Task - -🔧 Tool: Bash - -🔧 Tool: Glob - -🔧 Tool: Glob - -🔧 Tool: Grep - -🔧 Tool: Grep - -🔧 Tool: Glob - -🔧 Tool: Glob - -🔧 Tool: Bash - -🔧 Tool: Read - -🔧 Tool: Bash - -🔧 Tool: Bash - -🔧 Tool: Bash - -🔧 Tool: Bash - -🔧 Tool: Read - -🔧 Tool: Read - -🔧 Tool: Grep - -🔧 Tool: Read - -🔧 Tool: Grep - -🔧 Tool: Read - -🔧 Tool: Bash - -🔧 Tool: Read - -🔧 Tool: Bash - -🔧 Tool: Read - -🔧 Tool: Read - -🔧 Tool: Read - -🔧 Tool: Bash - -🔧 Tool: Bash - -🔧 Tool: Read - -🔧 Tool: Bash - -🔧 Tool: Bash - -🔧 Tool: Read - -🔧 Tool: Bash - -🔧 Tool: Read -Now I have a good understanding of the codebase. Let me read the specific files to see the exact structure of the add and edit feature dialogs: -🔧 Tool: Read -Now I have a clear understanding of both dialogs. I need to: - -1. In the **Add Feature Dialog** (lines 1342-1419): Move the Description field before the Category field -2. In the **Edit Feature Dialog** (lines 1452-1536): Move the Description field before the Category field - -Let me make these edits: -🔧 Tool: Edit -Now let me update the Edit Feature Dialog similarly: -🔧 Tool: Edit -Both dialogs have been updated. Now let me verify the changes are correct by reading the updated sections: -🔧 Tool: Read -Now let me verify the edit dialog changes: -🔧 Tool: Read -Both dialogs have been successfully updated. The changes are: - -1. **Add New Feature Dialog**: - - Description field now comes first - - Category field now comes second with label "Category (optional)" - -2. **Edit Feature Dialog**: - - Description field now comes first - - Category field now comes second with label "Category (optional)" - -Now let me mark this feature as verified using the UpdateFeatureStatus tool: -🔧 Tool: mcp__automaker-tools__UpdateFeatureStatus -I've completed the feature implementation. Here's a summary of what was done: - -## Changes Made - -**File Modified:** `app/src/components/views/board-view.tsx` - -### Add New Feature Dialog (lines 1342-1368) -- Moved **Description** field to the first position (was second) -- Moved **Category** field to the second position (was first) -- Updated Category label from "Category" to "Category (optional)" - -### Edit Feature Dialog (lines 1452-1482) -- Moved **Description** field to the first position (was second) -- Moved **Category** field to the second position (was first) -- Updated Category label from "Category" to "Category (optional)" - -The feature has been marked as `waiting_approval` (automatically converted from `verified` because `skipTests=true`). Please manually verify the changes and commit when ready.✅ Verifying implementation for: switch the order inside the add new feature panel so descriptino comes first followed by an optional category, also update the edit feature panel. -Verifying implementation and checking test results... -✓ Verification successful: All tests passed diff --git a/.automaker/agents-context/feature-1765326669854-gcjsh15zz.md b/.automaker/agents-context/feature-1765326669854-gcjsh15zz.md deleted file mode 100644 index 2c2cce77..00000000 --- a/.automaker/agents-context/feature-1765326669854-gcjsh15zz.md +++ /dev/null @@ -1,139 +0,0 @@ -📋 Planning implementation for: remember the users choice for skip testing and add a setting toggle in settings page to let them change their default when making new tasks. if it's enabled, show the steps to allow user to add manual testing steps. change label from steps to Verification Steps -⚡ Executing implementation for: remember the users choice for skip testing and add a setting toggle in settings page to let them change their default when making new tasks. if it's enabled, show the steps to allow user to add manual testing steps. change label from steps to Verification Steps -Starting code implementation... - -🔧 Tool: Glob -Let me look at the project structure more specifically: -🔧 Tool: Glob - -🔧 Tool: Read - -🔧 Tool: Read - -🔧 Tool: Read -Now I have a good understanding of the codebase. Let me implement the feature: - -1. Add a `defaultSkipTests` setting to the app store (persisted) -2. Add a toggle in the settings page -3. Update the "Add Feature" dialog to: - - Default skipTests based on user preference - - Show "Verification Steps" label instead of "Steps" when skipTests is enabled -4. Also update the edit dialog label -🔧 Tool: TodoWrite - -🔧 Tool: Edit -Input: { - "file_path": "/Users/webdevcody/Workspace/automaker/app/src/store/app-store.ts", - "old_string": " // Kanban Card Display Settings\n kanbanCardDetailLevel: KanbanCardDetailLevel; // Level of detail shown on kanban cards\n}", - "new_string": " // Kanban Card Display Settings\n kanbanCardDetailLevel: KanbanCardDetailLevel; // Level of detail shown on kanban cards\n\n // Feature Default Settings\n defaultSkipTests: boolean; // Default value for skip tests when creating new features\n}" -} -🔧 Tool: Edit - -🔧 Tool: Edit -Input: { - "file_path": "/Users/webdevcody/Workspace/automaker/app/src/store/app-store.ts", - "old_string": " maxConcurrency: 3, // Default to 3 concurrent agents\n kanbanCardDetailLevel: \"standard\", // Default to standard detail level\n};", - "new_string": " maxConcurrency: 3, // Default to 3 concurrent agents\n kanbanCardDetailLevel: \"standard\", // Default to standard detail level\n defaultSkipTests: false, // Default to TDD mode (tests enabled)\n};" -} -🔧 Tool: Edit -Now I need to add `defaultSkipTests` to the persisted state: -🔧 Tool: Edit - -🔧 Tool: TodoWrite -Now let me add the toggle in the settings page. I'll add a new section for Feature Defaults: -🔧 Tool: Read - -🔧 Tool: Edit - -🔧 Tool: Edit -Now let me find where I can add the new section. Let me read more of the settings view to find where to add the feature defaults section: -🔧 Tool: Read -Now let me add the Feature Defaults section after the Kanban Card Display section: -🔧 Tool: Edit - -🔧 Tool: TodoWrite -Now let me update the board-view.tsx to: -1. Use `defaultSkipTests` as the default value for new features -2. Change the label from "Steps" to "Verification Steps" when skipTests is enabled -🔧 Tool: Read - -🔧 Tool: Edit -Now I need to update the newFeature state initialization to use defaultSkipTests. Since it's initialized with a static value, I need to use an effect to sync it when the dialog opens or when defaultSkipTests changes: -🔧 Tool: Read -I need to update the handleAddFeature to reset skipTests to the default value: -🔧 Tool: Edit -Now I also need to make sure the initial state and when dialog opens uses the default. Let me add an effect that resets the form when the dialog opens: -🔧 Tool: Read -I need to add an effect to reset the skipTests when the dialog opens. Let me find a good place to add it: -🔧 Tool: Edit -Now let me update the label from "Steps" to "Verification Steps" when skipTests is enabled. Let me find the Add Feature dialog: -🔧 Tool: Read -I'll now update the label to change dynamically based on skipTests. I also need to: -1. Change the "Steps" label to "Verification Steps" when skipTests is enabled -2. Only show the steps section when skipTests is enabled (based on the requirement "if it's enabled, show the steps to allow user to add manual testing steps") - -Let me update the add feature dialog: -🔧 Tool: Edit - -🔧 Tool: TodoWrite -Now let me find and update the Edit Feature dialog to also show "Verification Steps" when skipTests is enabled: -🔧 Tool: Read - -🔧 Tool: Edit - -🔧 Tool: TodoWrite -Now let me verify the implementation is correct by checking that everything compiles. Let me run a quick type check: -🔧 Tool: Bash -The errors are from an example file and API routes, not from the files I modified. The core application code I changed compiles correctly. Let me verify specifically that the files I modified don't have errors: -🔧 Tool: Bash -The errors are in a different file (analysis-view.tsx) that imports from the store but has missing types - not related to my changes. The store, board-view, and settings-view themselves have no type errors. - -Let me now mark the feature as verified using the UpdateFeatureStatus tool: -🔧 Tool: mcp__automaker-tools__UpdateFeatureStatus -Let me check if the feature exists in the feature list: -🔧 Tool: Bash - -🔧 Tool: Read -The feature list is empty. This could be because the feature is being tracked elsewhere or the file was cleared. Let me clear my todo list and provide a summary of what was implemented: -🔧 Tool: TodoWrite -## Feature Implementation Complete - -I have successfully implemented the feature to remember the user's choice for skip testing and added a settings toggle. Here's a summary of the changes made: - -### Files Modified: - -1. **`app/src/store/app-store.ts`** - - Added `defaultSkipTests: boolean` to the AppState interface - - Added `setDefaultSkipTests: (skip: boolean) => void` action - - Set initial state to `false` (TDD mode by default) - - Added `defaultSkipTests` to the persisted state so it's remembered across sessions - -2. **`app/src/components/views/settings-view.tsx`** - - Added `FlaskConical` icon import and `Checkbox` component import - - Added `defaultSkipTests` and `setDefaultSkipTests` from the store - - Added a new "Feature Defaults" section with a toggle for "Skip automated testing by default" - - The toggle is displayed with helpful description text - -3. **`app/src/components/views/board-view.tsx`** - - Added `defaultSkipTests` from the store - - Added an effect to sync `skipTests` default when the Add Feature dialog opens - - **Add Feature Dialog**: - - Moved the skip tests checkbox above the steps section - - Steps section now only shows when `skipTests` is enabled - - Changed label from "Steps" to "Verification Steps" - - Changed button from "Add Step" to "Add Verification Step" - - Changed placeholder from "Step X" to "Verification step X" - - **Edit Feature Dialog**: - - Applied the same changes - steps only show when `skipTests` is enabled - - Changed label to "Verification Steps" and button to "Add Verification Step" - - Reset form uses `defaultSkipTests` value after adding a feature - -### Behavior: -- Users can set their default preference in Settings → Feature Defaults -- When creating a new feature, the "Skip automated testing" checkbox will be pre-checked based on their preference -- When skip tests is enabled, the "Verification Steps" input section appears, allowing users to add manual testing/verification steps -- The setting persists across browser sessions via localStorage - -**Note:** The feature could not be marked as verified via the UpdateFeatureStatus tool because the feature list appears to be empty. Since this is a `skipTests` feature, the user should manually review and commit the changes.✅ Verifying implementation for: remember the users choice for skip testing and add a setting toggle in settings page to let them change their default when making new tasks. if it's enabled, show the steps to allow user to add manual testing steps. change label from steps to Verification Steps -Verifying implementation and checking test results... -✗ Verification: Tests need attention diff --git a/.automaker/feature_list.json b/.automaker/feature_list.json index d1c15a56..128e17c4 100644 --- a/.automaker/feature_list.json +++ b/.automaker/feature_list.json @@ -1,106 +1,20 @@ [ { - "id": "feature-1765328064583-6zpz7ddil", - "category": "Kanban", - "description": "remove the auto mode activity panel completley.", + "id": "feature-1765335919754-r010d1fw5", + "category": "Uncategorized", + "description": "what does the text in the button say?\n", "steps": [], "status": "waiting_approval", - "startedAt": "2025-12-10T00:55:21.540Z", + "startedAt": "2025-12-10T03:05:34.894Z", "imagePaths": [ { - "id": "img-1765328011980-j8d2r6b78", - "path": "/var/folders/yk/56l0_s6978qfh521xf1dtx3r0000gn/T/automaker-images/1765328011979_Screenshot_2025-12-09_at_7.53.30_PM.png", - "filename": "Screenshot 2025-12-09 at 7.53.30 PM.png", + "id": "img-1765335919132-0x3t37l1r", + "path": "/Users/webdevcody/Library/Application Support/automaker/images/1765335919131-g4qvs053g_Screenshot_2025-12-09_at_10.05.17_PM.png", + "filename": "Screenshot 2025-12-09 at 10.05.17 PM.png", "mimeType": "image/png" } ], "skipTests": true, - "summary": "Removed auto mode activity panel completely. Deleted: auto-mode-log.tsx. Modified: board-view.tsx - removed AutoModeLog import, showActivityLog state, activity toggle button, and activity panel rendering. Also removed unused cn import and ChevronUp/ChevronDown icons." - }, - { - "id": "feature-1765330657132-oapdvbygc", - "category": "Uncategorized", - "description": "these buttons should be refactored to match more with selected theme, make sure they are set to use the button component variant styles", - "steps": [], - "status": "waiting_approval", - "startedAt": "2025-12-10T01:37:40.700Z", - "imagePaths": [ - { - "id": "img-1765330619380-q9tu8blks", - "path": "/var/folders/yk/56l0_s6978qfh521xf1dtx3r0000gn/T/automaker-images/1765330619376_Screenshot_2025-12-09_at_8.36.56_PM.png", - "filename": "Screenshot 2025-12-09 at 8.36.56 PM.png", - "mimeType": "image/png" - } - ], - "skipTests": true, - "summary": "Refactored theme selector and kanban detail level buttons to use Button component variants. Modified: settings-view.tsx. Changed 12 theme buttons and 3 kanban detail buttons from raw <button> to <Button> with dynamic variant (secondary when selected, outline when unselected) and brand-500 ring highlight for selected state." - }, - { - "id": "feature-1765330774043-35l9kw70q", - "category": "Kanban", - "description": "Increase the width of this modal and reduce font size of log output to make it easier to fit more output in modal", - "steps": [], - "status": "waiting_approval", - "imagePaths": [ - { - "id": "img-1765330741800-jhmtz9ttc", - "path": "/var/folders/yk/56l0_s6978qfh521xf1dtx3r0000gn/T/automaker-images/1765330741799_Screenshot_2025-12-09_at_8.38.59_PM.png", - "filename": "Screenshot 2025-12-09 at 8.38.59 PM.png", - "mimeType": "image/png" - } - ], - "skipTests": true, - "summary": "Increased modal width from max-w-4xl to max-w-6xl and reduced log output font sizes from text-sm to text-xs. Modified: agent-output-modal.tsx (modal width + container font), log-viewer.tsx (log entry content + preview text fonts)." - }, - { - "id": "feature-1765330800921-uwy5iu3lp", - "category": "Uncategorized", - "description": "what color is the screenshot button? don't change code just answer.", - "steps": [], - "status": "waiting_approval", - "imagePaths": [ - { - "id": "img-1765330783407-msplpgmwk", - "path": "/var/folders/yk/56l0_s6978qfh521xf1dtx3r0000gn/T/automaker-images/1765330783407_Screenshot_2025-12-09_at_8.39.40_PM.png", - "filename": "Screenshot 2025-12-09 at 8.39.40 PM.png", - "mimeType": "image/png" - } - ], - "skipTests": true, - "summary": "Answered question about screenshot button color. The image attachment button (Paperclip icon) is blue when active (bg-blue-100/text-blue-600 light, bg-blue-900/text-blue-400 dark) and uses standard outline styling when inactive. No code changes made." - }, - { - "id": "feature-1765331813319-jzlk7eku2", - "category": "Uncategorized", - "description": "describe the attached image do not change code", - "steps": [], - "status": "verified", - "startedAt": "2025-12-10T02:02:54.785Z", - "imagePaths": [ - { - "id": "img-1765331797511-v4ssc1hha", - "path": "/Users/webdevcody/Library/Application Support/automaker/images/1765331797510-ypiiz13rt_Screenshot_2025-12-09_at_8.56.34_PM.png", - "filename": "Screenshot 2025-12-09 at 8.56.34 PM.png", - "mimeType": "image/png" - } - ], - "skipTests": true - }, - { - "id": "feature-1765333165618-qmik9gy7p", - "category": "Uncategorized", - "description": "what is the text in the attache image say?", - "steps": [], - "status": "in_progress", - "startedAt": "2025-12-10T02:19:28.342Z", - "imagePaths": [ - { - "id": "img-1765333155109-on4lk435f", - "path": "/Users/webdevcody/Library/Application Support/automaker/images/1765333155106-czd46vc93_Screenshot_2025-12-09_at_9.19.13_PM.png", - "filename": "Screenshot 2025-12-09 at 9.19.13 PM.png", - "mimeType": "image/png" - } - ], - "skipTests": true + "summary": "Investigated button text in the app. Main buttons found in welcome-view.tsx: \"Create Project\" (primary action), \"Browse Folder\" (secondary action), \"Browse\" (directory selector), \"Cancel\", \"Get Started\". No code changes made - this was an investigative question." } ] \ No newline at end of file diff --git a/app/electron/auto-mode-service.js b/app/electron/auto-mode-service.js index 10b314fb..6277f7c8 100644 --- a/app/electron/auto-mode-service.js +++ b/app/electron/auto-mode-service.js @@ -181,6 +181,31 @@ class AutoModeService { return { success: true, passes: result.passes }; } catch (error) { console.error("[AutoMode] Error running feature:", error); + + // Write error to context file + try { + await contextManager.writeToContextFile( + projectPath, + featureId, + `\n\n❌ ERROR: ${error.message}\n\n${error.stack || ''}\n` + ); + } catch (contextError) { + console.error("[AutoMode] Failed to write error to context:", contextError); + } + + // Update feature status to waiting_approval so user can review the error + try { + await featureLoader.updateFeatureStatus( + featureId, + "waiting_approval", + projectPath, + null, // no summary + error.message // pass error message + ); + } catch (statusError) { + console.error("[AutoMode] Failed to update feature status after error:", statusError); + } + sendToRenderer({ type: "auto_mode_error", error: error.message, @@ -260,6 +285,31 @@ class AutoModeService { return { success: true, passes: result.passes }; } catch (error) { console.error("[AutoMode] Error verifying feature:", error); + + // Write error to context file + try { + await contextManager.writeToContextFile( + projectPath, + featureId, + `\n\n❌ ERROR: ${error.message}\n\n${error.stack || ''}\n` + ); + } catch (contextError) { + console.error("[AutoMode] Failed to write error to context:", contextError); + } + + // Update feature status to waiting_approval so user can review the error + try { + await featureLoader.updateFeatureStatus( + featureId, + "waiting_approval", + projectPath, + null, // no summary + error.message // pass error message + ); + } catch (statusError) { + console.error("[AutoMode] Failed to update feature status after error:", statusError); + } + sendToRenderer({ type: "auto_mode_error", error: error.message, @@ -400,6 +450,31 @@ class AutoModeService { return { success: true, passes: finalResult.passes }; } catch (error) { console.error("[AutoMode] Error resuming feature:", error); + + // Write error to context file + try { + await contextManager.writeToContextFile( + projectPath, + featureId, + `\n\n❌ ERROR: ${error.message}\n\n${error.stack || ''}\n` + ); + } catch (contextError) { + console.error("[AutoMode] Failed to write error to context:", contextError); + } + + // Update feature status to waiting_approval so user can review the error + try { + await featureLoader.updateFeatureStatus( + featureId, + "waiting_approval", + projectPath, + null, // no summary + error.message // pass error message + ); + } catch (statusError) { + console.error("[AutoMode] Failed to update feature status after error:", statusError); + } + sendToRenderer({ type: "auto_mode_error", error: error.message, @@ -544,6 +619,31 @@ class AutoModeService { }); } catch (error) { console.error(`[AutoMode] Error running feature ${featureId}:`, error); + + // Write error to context file + try { + await contextManager.writeToContextFile( + projectPath, + featureId, + `\n\n❌ ERROR: ${error.message}\n\n${error.stack || ''}\n` + ); + } catch (contextError) { + console.error("[AutoMode] Failed to write error to context:", contextError); + } + + // Update feature status to waiting_approval so user can review the error + try { + await featureLoader.updateFeatureStatus( + featureId, + "waiting_approval", + projectPath, + null, // no summary + error.message // pass error message + ); + } catch (statusError) { + console.error("[AutoMode] Failed to update feature status after error:", statusError); + } + sendToRenderer({ type: "auto_mode_error", error: error.message, @@ -761,6 +861,31 @@ class AutoModeService { }); } catch (error) { console.error("[AutoMode] Error in follow-up:", error); + + // Write error to context file + try { + await contextManager.writeToContextFile( + projectPath, + featureId, + `\n\n❌ ERROR: ${error.message}\n\n${error.stack || ''}\n` + ); + } catch (contextError) { + console.error("[AutoMode] Failed to write error to context:", contextError); + } + + // Update feature status to waiting_approval so user can review the error + try { + await featureLoader.updateFeatureStatus( + featureId, + "waiting_approval", + projectPath, + null, // no summary + error.message // pass error message + ); + } catch (statusError) { + console.error("[AutoMode] Failed to update feature status after error:", statusError); + } + sendToRenderer({ type: "auto_mode_error", error: error.message, diff --git a/app/electron/services/feature-executor.js b/app/electron/services/feature-executor.js index c626f358..57e2aa9a 100644 --- a/app/electron/services/feature-executor.js +++ b/app/electron/services/feature-executor.js @@ -342,7 +342,8 @@ class FeatureExecutor { const path = require("path"); for (const imagePathObj of imagePaths) { try { - const imagePath = imagePathObj.path; + // Handle both string paths and FeatureImagePath objects + const imagePath = typeof imagePathObj === 'string' ? imagePathObj : imagePathObj.path; const imageBuffer = fs.readFileSync(imagePath); const base64Data = imageBuffer.toString("base64"); const ext = path.extname(imagePath).toLowerCase(); @@ -353,7 +354,9 @@ class FeatureExecutor { ".gif": "image/gif", ".webp": "image/webp", }; - const mediaType = mimeTypeMap[ext] || imagePathObj.mimeType || "image/png"; + const mediaType = typeof imagePathObj === 'string' + ? (mimeTypeMap[ext] || "image/png") + : (mimeTypeMap[ext] || imagePathObj.mimeType || "image/png"); contentBlocks.push({ type: "image", @@ -366,8 +369,9 @@ class FeatureExecutor { console.log(`[FeatureExecutor] Added image to resume prompt: ${imagePath}`); } catch (error) { + const errorPath = typeof imagePathObj === 'string' ? imagePathObj : imagePathObj.path; console.error( - `[FeatureExecutor] Failed to load image ${imagePathObj.path}:`, + `[FeatureExecutor] Failed to load image ${errorPath}:`, error ); } diff --git a/app/electron/services/feature-loader.js b/app/electron/services/feature-loader.js index 7e312ee2..d9ae2b44 100644 --- a/app/electron/services/feature-loader.js +++ b/app/electron/services/feature-loader.js @@ -36,8 +36,9 @@ class FeatureLoader { * @param {string} status - The new status * @param {string} projectPath - Path to the project * @param {string} [summary] - Optional summary of what was done + * @param {string} [error] - Optional error message if feature errored */ - async updateFeatureStatus(featureId, status, projectPath, summary) { + async updateFeatureStatus(featureId, status, projectPath, summary, error) { const featuresPath = path.join( projectPath, ".automaker", @@ -98,6 +99,14 @@ class FeatureLoader { feature.summary = summary; } + // Update the error field (set or clear) + if (error) { + feature.error = error; + } else { + // Clear any previous error when status changes without error + delete feature.error; + } + // Save back to file const toSave = features.map((f) => { const featureData = { @@ -123,6 +132,9 @@ class FeatureLoader { if (f.summary !== undefined) { featureData.summary = f.summary; } + if (f.error !== undefined) { + featureData.error = f.error; + } return featureData; }); diff --git a/app/electron/services/prompt-builder.js b/app/electron/services/prompt-builder.js index 7a4c9f81..f5ece767 100644 --- a/app/electron/services/prompt-builder.js +++ b/app/electron/services/prompt-builder.js @@ -10,9 +10,18 @@ class PromptBuilder { ? `\n**⚠️ IMPORTANT - Manual Testing Mode:**\nThis feature has skipTests=true, which means:\n- DO NOT commit changes automatically\n- DO NOT mark as verified - it will automatically go to "waiting_approval" status\n- The user will manually review and commit the changes\n- Just implement the feature and mark it as verified (it will be converted to waiting_approval)\n` : ""; - const imagesNote = feature.imagePaths && feature.imagePaths.length > 0 - ? `\n**📎 Context Images Attached:**\nThe user has attached ${feature.imagePaths.length} image(s) for context. These images will be provided to you visually to help understand the requirements. Review them carefully before implementing.\n` - : ""; + let imagesNote = ""; + if (feature.imagePaths && feature.imagePaths.length > 0) { + const imagesList = feature.imagePaths.map((img, idx) => + ` ${idx + 1}. ${img.filename} (${img.mimeType})\n Path: ${img.path}` + ).join("\n"); + + imagesNote = `\n**📎 Context Images Attached:**\nThe user has attached ${feature.imagePaths.length} image(s) for context. These images are provided both visually (in the initial message) and as files you can read: + +${imagesList} + +You can use the Read tool to view these images at any time during implementation. Review them carefully before implementing.\n`; + } return `You are working on a feature implementation task. @@ -121,9 +130,18 @@ Begin by reading the project structure and then implementing the feature.`; ? `\n**⚠️ IMPORTANT - Manual Testing Mode:**\nThis feature has skipTests=true, which means:\n- DO NOT commit changes automatically\n- DO NOT mark as verified - it will automatically go to "waiting_approval" status\n- The user will manually review and commit the changes\n- Just implement the feature and mark it as verified (it will be converted to waiting_approval)\n` : ""; - const imagesNote = feature.imagePaths && feature.imagePaths.length > 0 - ? `\n**📎 Context Images Attached:**\nThe user has attached ${feature.imagePaths.length} image(s) for context. These images will be provided to you visually to help understand the requirements. Review them carefully before implementing.\n` - : ""; + let imagesNote = ""; + if (feature.imagePaths && feature.imagePaths.length > 0) { + const imagesList = feature.imagePaths.map((img, idx) => + ` ${idx + 1}. ${img.filename} (${img.mimeType})\n Path: ${img.path}` + ).join("\n"); + + imagesNote = `\n**📎 Context Images Attached:**\nThe user has attached ${feature.imagePaths.length} image(s) for context. These images are provided both visually (in the initial message) and as files you can read: + +${imagesList} + +You can use the Read tool to view these images at any time during implementation. Review them carefully before implementing.\n`; + } return `You are implementing and verifying a feature until it is complete and working correctly. @@ -224,9 +242,24 @@ Begin by reading the project structure and understanding what needs to be implem ? `\n**⚠️ IMPORTANT - Manual Testing Mode:**\nThis feature has skipTests=true, which means:\n- DO NOT commit changes automatically\n- DO NOT mark as verified - it will automatically go to "waiting_approval" status\n- The user will manually review and commit the changes\n- Just implement the feature and mark it as verified (it will be converted to waiting_approval)\n` : ""; - const imagesNote = feature.imagePaths && feature.imagePaths.length > 0 - ? `\n**📎 Context Images Attached:**\nThe user has attached ${feature.imagePaths.length} image(s) for context. These images will be provided to you visually to help understand the requirements. Review them carefully.\n` - : ""; + // For resume, check both followUpImages and imagePaths + const imagePaths = feature.followUpImages || feature.imagePaths; + let imagesNote = ""; + if (imagePaths && imagePaths.length > 0) { + const imagesList = imagePaths.map((img, idx) => { + // Handle both FeatureImagePath objects and simple path strings + const path = typeof img === 'string' ? img : img.path; + const filename = typeof img === 'string' ? path.split('/').pop() : img.filename; + const mimeType = typeof img === 'string' ? 'image/*' : img.mimeType; + return ` ${idx + 1}. ${filename} (${mimeType})\n Path: ${path}`; + }).join("\n"); + + imagesNote = `\n**📎 Context Images Attached:**\nThe user has attached ${imagePaths.length} image(s) for context. These images are provided both visually (in the initial message) and as files you can read: + +${imagesList} + +You can use the Read tool to view these images at any time. Review them carefully.\n`; + } return `You are resuming work on a feature implementation that was previously started. diff --git a/app/src/components/layout/sidebar.tsx b/app/src/components/layout/sidebar.tsx index bab8ca63..67fa4c2a 100644 --- a/app/src/components/layout/sidebar.tsx +++ b/app/src/components/layout/sidebar.tsx @@ -581,7 +581,7 @@ export function Sidebar() { isActive ? "bg-sidebar-accent/50 text-foreground border border-sidebar-border" : "text-muted-foreground hover:text-foreground hover:bg-sidebar-accent/50", - !sidebarOpen && "justify-center" + sidebarOpen ? "justify-start" : "justify-center" )} title={!sidebarOpen ? item.label : undefined} data-testid={`nav-${item.id}`} @@ -599,7 +599,7 @@ export function Sidebar() { /> @@ -665,7 +665,7 @@ export function Sidebar() { /> diff --git a/app/src/components/views/agent-output-modal.tsx b/app/src/components/views/agent-output-modal.tsx index 307d7437..ec982fc5 100644 --- a/app/src/components/views/agent-output-modal.tsx +++ b/app/src/components/views/agent-output-modal.tsx @@ -202,7 +202,7 @@ export function AgentOutputModal({ return ( diff --git a/app/src/components/views/board-view.tsx b/app/src/components/views/board-view.tsx index fb8febe8..ce5564ed 100644 --- a/app/src/components/views/board-view.tsx +++ b/app/src/components/views/board-view.tsx @@ -338,16 +338,32 @@ export function BoardView() { }, [showAddDialog, defaultSkipTests]); - // Listen for auto mode feature completion and reload features + // Listen for auto mode feature completion and errors to reload features useEffect(() => { const api = getElectronAPI(); if (!api?.autoMode) return; + const { removeRunningTask } = useAppStore.getState(); + const unsubscribe = api.autoMode.onEvent((event) => { if (event.type === "auto_mode_feature_complete") { // Reload features when a feature is completed console.log("[Board] Feature completed, reloading features..."); loadFeatures(); + } else if (event.type === "auto_mode_error") { + // Reload features when an error occurs (feature moved to waiting_approval) + console.log("[Board] Feature error, reloading features...", event.error); + + // Remove from running tasks so it moves to the correct column + if (event.featureId) { + removeRunningTask(event.featureId); + } + + loadFeatures(); + // Show error toast + toast.error("Agent encountered an error", { + description: event.error || "Check the logs for details", + }); } }); @@ -439,6 +455,7 @@ export function BoardView() { imagePaths: f.imagePaths, skipTests: f.skipTests, summary: f.summary, + error: f.error, })); await api.writeFile( `${currentProject.path}/.automaker/feature_list.json`, diff --git a/app/src/components/views/kanban-card.tsx b/app/src/components/views/kanban-card.tsx index 3a8bbf70..1d4a0db8 100644 --- a/app/src/components/views/kanban-card.tsx +++ b/app/src/components/views/kanban-card.tsx @@ -39,7 +39,6 @@ import { RotateCcw, StopCircle, Hand, - ArrowLeft, MessageSquare, GitCommit, Cpu, @@ -49,6 +48,7 @@ import { Expand, FileText, MoreVertical, + AlertCircle, } from "lucide-react"; import { CountUpTimer } from "@/components/ui/count-up-timer"; import { getElectronAPI } from "@/lib/electron"; @@ -199,7 +199,10 @@ export function KanbanCard({ "cursor-grab active:cursor-grabbing transition-all backdrop-blur-sm border-border relative", isDragging && "opacity-50 scale-105 shadow-lg", isCurrentAutoTask && - "border-running-indicator border-2 shadow-running-indicator/50 shadow-lg animate-pulse" + "border-running-indicator border-2 shadow-running-indicator/50 shadow-lg animate-pulse", + feature.error && + !isCurrentAutoTask && + "border-red-500 border-2 shadow-red-500/30 shadow-lg" )} data-testid={`kanban-card-${feature.id}`} {...attributes} @@ -214,7 +217,7 @@ export function KanbanCard({ )} {/* Skip Tests indicator badge */} - {feature.skipTests && ( + {feature.skipTests && !feature.error && (
Manual
)} + {/* Error indicator badge */} + {feature.error && ( +
+ + Errored +
+ )} {isCurrentAutoTask && (
@@ -255,6 +273,28 @@ export function KanbanCard({ + { + e.stopPropagation(); + onEdit(); + }} + data-testid={`edit-feature-${feature.id}`} + > + + Edit + + {onViewOutput && ( + { + e.stopPropagation(); + onViewOutput(); + }} + data-testid={`view-logs-${feature.id}`} + > + + Logs + + )} { @@ -565,55 +605,10 @@ export function KanbanCard({ Logs )} - {/* Move back button for skipTests verified features */} - {feature.skipTests && onMoveBackToInProgress && ( - - )} - )} {!isCurrentAutoTask && feature.status === "waiting_approval" && ( <> - {/* Logs button if context exists */} - {hasContext && onViewOutput && ( - - )} {/* Follow-up prompt button */} {onFollowUp && ( )}
diff --git a/app/src/store/app-store.ts b/app/src/store/app-store.ts index d7e983d6..d1b537e5 100644 --- a/app/src/store/app-store.ts +++ b/app/src/store/app-store.ts @@ -86,6 +86,7 @@ export interface Feature { startedAt?: string; // ISO timestamp for when the card moved to in_progress skipTests?: boolean; // When true, skip TDD approach and require manual verification summary?: string; // Summary of what was done/modified by the agent + error?: string; // Error message if the agent errored during processing } export interface AppState { From d014a0ba4fcbd9451feb7013457636f0c143be0a Mon Sep 17 00:00:00 2001 From: SuperComboGamer Date: Tue, 9 Dec 2025 22:37:04 -0500 Subject: [PATCH 2/4] feat(sidebar): implement trash functionality for project management - Added a new `trashItem` method in the Electron API to move projects to the system trash. - Enhanced the sidebar component to include a trash button and manage trashed projects. - Implemented functionality to restore and permanently delete projects from the trash. - Updated the application state to track trashed projects and provide user feedback through toast notifications. This update significantly improves project management by allowing users to easily manage deleted projects without permanent loss. --- app/electron/main.js | 15 +- app/electron/preload.js | 1 + app/src/components/layout/sidebar.tsx | 252 +++++++++++++++++++++++++- app/src/lib/electron.ts | 22 +++ app/src/store/app-store.ts | 85 ++++++++- 5 files changed, 368 insertions(+), 7 deletions(-) diff --git a/app/electron/main.js b/app/electron/main.js index 1b8f276a..2d8639b5 100644 --- a/app/electron/main.js +++ b/app/electron/main.js @@ -3,7 +3,7 @@ const path = require("path"); // Load environment variables from .env file require("dotenv").config({ path: path.join(__dirname, "../.env") }); -const { app, BrowserWindow, ipcMain, dialog } = require("electron"); +const { app, BrowserWindow, ipcMain, dialog, shell } = require("electron"); const fs = require("fs/promises"); const agentService = require("./agent-service"); const autoModeService = require("./auto-mode-service"); @@ -169,6 +169,15 @@ ipcMain.handle("fs:deleteFile", async (_, filePath) => { } }); +ipcMain.handle("fs:trashItem", async (_, targetPath) => { + try { + await shell.trashItem(targetPath); + return { success: true }; + } catch (error) { + return { success: false, error: error.message }; + } +}); + // App data path ipcMain.handle("app:getPath", (_, name) => { return app.getPath(name); @@ -193,7 +202,9 @@ ipcMain.handle( await fs.mkdir(imagesDir, { recursive: true }); // Generate unique filename with unique ID - const uniqueId = `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`; + const uniqueId = `${Date.now()}-${Math.random() + .toString(36) + .substring(2, 11)}`; const safeName = filename.replace(/[^a-zA-Z0-9.-]/g, "_"); const imageFilePath = path.join(imagesDir, `${uniqueId}_${safeName}`); diff --git a/app/electron/preload.js b/app/electron/preload.js index 0e47bfee..18a1eaeb 100644 --- a/app/electron/preload.js +++ b/app/electron/preload.js @@ -19,6 +19,7 @@ contextBridge.exposeInMainWorld("electronAPI", { exists: (filePath) => ipcRenderer.invoke("fs:exists", filePath), stat: (filePath) => ipcRenderer.invoke("fs:stat", filePath), deleteFile: (filePath) => ipcRenderer.invoke("fs:deleteFile", filePath), + trashItem: (filePath) => ipcRenderer.invoke("fs:trashItem", filePath), // App APIs getPath: (name) => ipcRenderer.invoke("app:getPath", name), diff --git a/app/src/components/layout/sidebar.tsx b/app/src/components/layout/sidebar.tsx index bab8ca63..e938a048 100644 --- a/app/src/components/layout/sidebar.tsx +++ b/app/src/components/layout/sidebar.tsx @@ -3,7 +3,6 @@ import { useState, useMemo, useEffect, useCallback } from "react"; import { cn } from "@/lib/utils"; import { useAppStore } from "@/store/app-store"; -import Link from "next/link"; import { FolderOpen, Plus, @@ -23,13 +22,25 @@ import { Check, BookOpen, GripVertical, + Trash2, + Undo2, } from "lucide-react"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, + DropdownMenuSeparator, } from "@/components/ui/dropdown-menu"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { Button } from "@/components/ui/button"; import { useKeyboardShortcuts, NAV_SHORTCUTS, @@ -37,7 +48,7 @@ import { ACTION_SHORTCUTS, KeyboardShortcut, } from "@/hooks/use-keyboard-shortcuts"; -import { getElectronAPI, Project } from "@/lib/electron"; +import { getElectronAPI, Project, TrashedProject } from "@/lib/electron"; import { initializeProject } from "@/lib/project-init"; import { toast } from "sonner"; import { @@ -73,6 +84,7 @@ interface SortableProjectItemProps { index: number; currentProjectId: string | undefined; onSelect: (project: Project) => void; + onTrash: (project: Project) => void; } function SortableProjectItem({ @@ -80,6 +92,7 @@ function SortableProjectItem({ index, currentProjectId, onSelect, + onTrash, }: SortableProjectItemProps) { const { attributes, @@ -138,6 +151,19 @@ function SortableProjectItem({ )} + + {/* Move to trash */} + ); } @@ -145,6 +171,7 @@ function SortableProjectItem({ export function Sidebar() { const { projects, + trashedProjects, currentProject, currentView, sidebarOpen, @@ -152,12 +179,18 @@ export function Sidebar() { setCurrentProject, setCurrentView, toggleSidebar, - removeProject, + moveProjectToTrash, + restoreTrashedProject, + deleteTrashedProject, + emptyTrash, reorderProjects, } = useAppStore(); // State for project picker dropdown const [isProjectPickerOpen, setIsProjectPickerOpen] = useState(false); + const [showTrashDialog, setShowTrashDialog] = useState(false); + const [activeTrashId, setActiveTrashId] = useState(null); + const [isEmptyingTrash, setIsEmptyingTrash] = useState(false); // Sensors for drag-and-drop const sensors = useSensors( @@ -239,6 +272,89 @@ export function Sidebar() { } }, [addProject, setCurrentProject]); + const handleTrashProject = useCallback( + (project: Project) => { + const confirmed = window.confirm( + `Move "${project.name}" to Trash?\nThe folder stays on disk until you delete it from Trash.` + ); + if (!confirmed) return; + + moveProjectToTrash(project.id); + setIsProjectPickerOpen(false); + toast.success("Project moved to Trash", { + description: `${project.name} was removed from the sidebar.`, + }); + }, + [moveProjectToTrash] + ); + + const handleRestoreProject = useCallback( + (projectId: string) => { + restoreTrashedProject(projectId); + toast.success("Project restored", { + description: "Added back to your project list.", + }); + setShowTrashDialog(false); + }, + [restoreTrashedProject] + ); + + const handleDeleteProjectFromDisk = useCallback( + async (trashedProject: TrashedProject) => { + const confirmed = window.confirm( + `Delete "${trashedProject.name}" from disk?\nThis sends the folder to your system Trash.` + ); + if (!confirmed) return; + + setActiveTrashId(trashedProject.id); + try { + const api = getElectronAPI(); + if (!api.trashItem) { + throw new Error("System Trash is not available in this build."); + } + + const result = await api.trashItem(trashedProject.path); + if (!result.success) { + throw new Error(result.error || "Failed to delete project folder"); + } + + deleteTrashedProject(trashedProject.id); + toast.success("Project folder sent to system Trash", { + description: trashedProject.path, + }); + } catch (error) { + console.error("[Sidebar] Failed to delete project from disk:", error); + toast.error("Failed to delete project folder", { + description: error instanceof Error ? error.message : "Unknown error", + }); + } finally { + setActiveTrashId(null); + } + }, + [deleteTrashedProject] + ); + + const handleEmptyTrash = useCallback(() => { + if (trashedProjects.length === 0) { + setShowTrashDialog(false); + return; + } + + const confirmed = window.confirm( + "Clear all trashed projects from Automaker? This does not delete folders from disk." + ); + if (!confirmed) return; + + setIsEmptyingTrash(true); + try { + emptyTrash(); + toast.success("Trash cleared"); + setShowTrashDialog(false); + } finally { + setIsEmptyingTrash(false); + } + }, [emptyTrash, trashedProjects.length]); + const navSections: NavSection[] = [ { label: "Project", @@ -530,10 +646,23 @@ export function Sidebar() { setCurrentProject(p); setIsProjectPickerOpen(false); }} + onTrash={handleTrashProject} /> ))} + + { + e.preventDefault(); + setShowTrashDialog(true); + }} + className="text-destructive focus:text-destructive" + data-testid="manage-trash" + > + + Manage Trash ({trashedProjects.length}) + @@ -638,8 +767,38 @@ export function Sidebar() { {/* Bottom Section - User / Settings */}
- {/* Settings Link */} + {/* Trash + Settings Links */}
+
+ + + + Trash + + Restore projects to the sidebar or delete their folders using your + system Trash. + + + + {trashedProjects.length === 0 ? ( +

Trash is empty.

+ ) : ( +
+ {trashedProjects.map((project) => ( +
+
+

+ {project.name} +

+

+ {project.path} +

+

+ Trashed {new Date(project.trashedAt).toLocaleString()} +

+
+
+ + + +
+
+ ))} +
+ )} + + + + {trashedProjects.length > 0 && ( + + )} + +
+
); } diff --git a/app/src/lib/electron.ts b/app/src/lib/electron.ts index 8ef9642c..ccadd497 100644 --- a/app/src/lib/electron.ts +++ b/app/src/lib/electron.ts @@ -89,6 +89,7 @@ export interface ElectronAPI { exists: (filePath: string) => Promise; stat: (filePath: string) => Promise; deleteFile: (filePath: string) => Promise; + trashItem?: (filePath: string) => Promise; getPath: (name: string) => Promise; saveImageToTemp?: (data: string, filename: string, mimeType: string) => Promise; autoMode?: AutoModeAPI; @@ -115,6 +116,7 @@ const mockFeatures = [ const STORAGE_KEYS = { PROJECTS: "automaker_projects", CURRENT_PROJECT: "automaker_current_project", + TRASHED_PROJECTS: "automaker_trashed_projects", } as const; // Mock file system using localStorage @@ -335,6 +337,10 @@ export const getElectronAPI = (): ElectronAPI => { return { success: true }; }, + trashItem: async () => { + return { success: true }; + }, + getPath: async (name: string) => { if (name === "userData") { return "/mock/userData"; @@ -771,6 +777,11 @@ export interface Project { lastOpened?: string; } +export interface TrashedProject extends Project { + trashedAt: string; + deletedFromDisk?: boolean; +} + export const getStoredProjects = (): Project[] => { if (typeof window === "undefined") return []; const stored = localStorage.getItem(STORAGE_KEYS.PROJECTS); @@ -812,3 +823,14 @@ export const removeProject = (projectId: string): void => { const projects = getStoredProjects().filter((p) => p.id !== projectId); saveProjects(projects); }; + +export const getStoredTrashedProjects = (): TrashedProject[] => { + if (typeof window === "undefined") return []; + const stored = localStorage.getItem(STORAGE_KEYS.TRASHED_PROJECTS); + return stored ? JSON.parse(stored) : []; +}; + +export const saveTrashedProjects = (projects: TrashedProject[]): void => { + if (typeof window === "undefined") return; + localStorage.setItem(STORAGE_KEYS.TRASHED_PROJECTS, JSON.stringify(projects)); +}; diff --git a/app/src/store/app-store.ts b/app/src/store/app-store.ts index d7e983d6..dbac63cc 100644 --- a/app/src/store/app-store.ts +++ b/app/src/store/app-store.ts @@ -1,6 +1,6 @@ import { create } from "zustand"; import { persist } from "zustand/middleware"; -import type { Project } from "@/lib/electron"; +import type { Project, TrashedProject } from "@/lib/electron"; export type ViewMode = | "welcome" @@ -92,6 +92,7 @@ export interface AppState { // Project state projects: Project[]; currentProject: Project | null; + trashedProjects: TrashedProject[]; // View state currentView: ViewMode; @@ -154,6 +155,10 @@ export interface AppActions { setProjects: (projects: Project[]) => void; addProject: (project: Project) => void; removeProject: (projectId: string) => void; + moveProjectToTrash: (projectId: string) => void; + restoreTrashedProject: (projectId: string) => void; + deleteTrashedProject: (projectId: string) => void; + emptyTrash: () => void; setCurrentProject: (project: Project | null) => void; reorderProjects: (oldIndex: number, newIndex: number) => void; @@ -216,6 +221,7 @@ export interface AppActions { const initialState: AppState = { projects: [], currentProject: null, + trashedProjects: [], currentView: "welcome", sidebarOpen: true, theme: "dark", @@ -269,6 +275,82 @@ export const useAppStore = create()( set({ projects: get().projects.filter((p) => p.id !== projectId) }); }, + moveProjectToTrash: (projectId) => { + const project = get().projects.find((p) => p.id === projectId); + if (!project) return; + + const remainingProjects = get().projects.filter( + (p) => p.id !== projectId + ); + const existingTrash = get().trashedProjects.filter( + (p) => p.id !== projectId + ); + const trashedProject: TrashedProject = { + ...project, + trashedAt: new Date().toISOString(), + deletedFromDisk: false, + }; + + const isCurrent = get().currentProject?.id === projectId; + + set({ + projects: remainingProjects, + trashedProjects: [trashedProject, ...existingTrash], + currentProject: isCurrent ? null : get().currentProject, + currentView: isCurrent ? "welcome" : get().currentView, + }); + }, + + restoreTrashedProject: (projectId) => { + const trashed = get().trashedProjects.find((p) => p.id === projectId); + if (!trashed) return; + + const remainingTrash = get().trashedProjects.filter( + (p) => p.id !== projectId + ); + const existingProjects = get().projects; + const samePathProject = existingProjects.find( + (p) => p.path === trashed.path + ); + const projectsWithoutId = existingProjects.filter( + (p) => p.id !== projectId + ); + + // If a project with the same path already exists, keep it and just remove from trash + if (samePathProject) { + set({ + trashedProjects: remainingTrash, + currentProject: samePathProject, + currentView: "board", + }); + return; + } + + const restoredProject: Project = { + id: trashed.id, + name: trashed.name, + path: trashed.path, + lastOpened: new Date().toISOString(), + }; + + set({ + trashedProjects: remainingTrash, + projects: [...projectsWithoutId, restoredProject], + currentProject: restoredProject, + currentView: "board", + }); + }, + + deleteTrashedProject: (projectId) => { + set({ + trashedProjects: get().trashedProjects.filter( + (p) => p.id !== projectId + ), + }); + }, + + emptyTrash: () => set({ trashedProjects: [] }), + reorderProjects: (oldIndex, newIndex) => { const projects = [...get().projects]; const [movedProject] = projects.splice(oldIndex, 1); @@ -495,6 +577,7 @@ export const useAppStore = create()( partialize: (state) => ({ projects: state.projects, currentProject: state.currentProject, + trashedProjects: state.trashedProjects, currentView: state.currentView, theme: state.theme, sidebarOpen: state.sidebarOpen, From 229df2ee29fcedb3f621ca876ad155592e5fd3b5 Mon Sep 17 00:00:00 2001 From: Cody Seibert Date: Tue, 9 Dec 2025 22:48:58 -0500 Subject: [PATCH 3/4] feat(icon): update application icon and references - Changed application icon from `icon_gold.png` to `logo.png` across package.json, main.js, and relevant components. - Updated image source paths in Sidebar and WelcomeView components to reflect the new logo file. This update standardizes the icon used throughout the application, enhancing visual consistency. --- app/electron/main.js | 10 ++++++---- app/package.json | 6 +++--- app/public/logo.png | Bin 0 -> 110831 bytes app/src/components/layout/sidebar.tsx | 8 ++++---- app/src/components/views/welcome-view.tsx | 6 +----- 5 files changed, 14 insertions(+), 16 deletions(-) create mode 100644 app/public/logo.png diff --git a/app/electron/main.js b/app/electron/main.js index 1b8f276a..bf7c55f6 100644 --- a/app/electron/main.js +++ b/app/electron/main.js @@ -12,11 +12,11 @@ let mainWindow = null; // Get icon path - works in both dev and production function getIconPath() { - // In dev: __dirname is electron/, so ../public/icon_gold.png + // In dev: __dirname is electron/, so ../public/logo.png // In production: public folder is included in the app bundle return app.isPackaged - ? path.join(process.resourcesPath, "app", "public", "icon_gold.png") - : path.join(__dirname, "../public/icon_gold.png"); + ? path.join(process.resourcesPath, "app", "public", "logo.png") + : path.join(__dirname, "../public/logo.png"); } function createWindow() { @@ -193,7 +193,9 @@ ipcMain.handle( await fs.mkdir(imagesDir, { recursive: true }); // Generate unique filename with unique ID - const uniqueId = `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`; + const uniqueId = `${Date.now()}-${Math.random() + .toString(36) + .substring(2, 11)}`; const safeName = filename.replace(/[^a-zA-Z0-9.-]/g, "_"); const imageFilePath = path.join(imagesDir, `${uniqueId}_${safeName}`); diff --git a/app/package.json b/app/package.json index b72dc6dc..38725950 100644 --- a/app/package.json +++ b/app/package.json @@ -87,7 +87,7 @@ "arch": ["x64", "arm64"] } ], - "icon": "public/icon_gold.png" + "icon": "public/logo.png" }, "win": { "target": [ @@ -96,7 +96,7 @@ "arch": ["x64"] } ], - "icon": "public/icon_gold.png" + "icon": "public/logo.png" }, "linux": { "target": [ @@ -110,7 +110,7 @@ } ], "category": "Development", - "icon": "public/icon_gold.png" + "icon": "public/logo.png" }, "nsis": { "oneClick": false, diff --git a/app/public/logo.png b/app/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3f0aaa1080c750c71c81a04f0ee5db97670bfa47 GIT binary patch literal 110831 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

j4`T9#DMB<*o|9^Y+Hk{#ow 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%0AM0f}QguZ;fc$-ob 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 literal 0 HcmV?d00001 diff --git a/app/src/components/layout/sidebar.tsx b/app/src/components/layout/sidebar.tsx index 67fa4c2a..ee8dd606 100644 --- a/app/src/components/layout/sidebar.tsx +++ b/app/src/components/layout/sidebar.tsx @@ -428,16 +428,16 @@ export function Sidebar() { onClick={() => setCurrentView("welcome")} data-testid="logo-button" > -

+
Automaker Logo
diff --git a/app/src/components/views/welcome-view.tsx b/app/src/components/views/welcome-view.tsx index 5c690543..901e0fa7 100644 --- a/app/src/components/views/welcome-view.tsx +++ b/app/src/components/views/welcome-view.tsx @@ -284,11 +284,7 @@ export function WelcomeView() {
- Automaker Logo + Automaker Logo

From e9a4dd03198cf8a2c96c0ad9150fc05e2fdad87f Mon Sep 17 00:00:00 2001 From: Cody Seibert Date: Tue, 9 Dec 2025 23:07:40 -0500 Subject: [PATCH 4/4] feat(sidebar, settings): enhance project management and UI navigation - Removed trash functionality from the sidebar component, including the associated button and event handlers. - Added a new "Danger Zone" section in the settings view for project deletion, featuring a confirmation dialog. - Implemented smooth scrolling and active section highlighting in the settings sidebar for improved navigation. - Updated various UI elements for better consistency and responsiveness. These changes streamline project management and enhance user experience within the application. --- app/src/components/layout/sidebar.tsx | 100 ++------ app/src/components/views/board-view.tsx | 34 ++- app/src/components/views/settings-view.tsx | 260 +++++++++++++++++++-- 3 files changed, 281 insertions(+), 113 deletions(-) diff --git a/app/src/components/layout/sidebar.tsx b/app/src/components/layout/sidebar.tsx index f47c23e4..43021508 100644 --- a/app/src/components/layout/sidebar.tsx +++ b/app/src/components/layout/sidebar.tsx @@ -10,14 +10,11 @@ import { FileText, LayoutGrid, Bot, - ChevronLeft, - ChevronRight, Folder, X, Wrench, PanelLeft, PanelLeftClose, - Sparkles, ChevronDown, Check, BookOpen, @@ -28,9 +25,7 @@ import { import { DropdownMenu, DropdownMenuContent, - DropdownMenuItem, DropdownMenuTrigger, - DropdownMenuSeparator, } from "@/components/ui/dropdown-menu"; import { Dialog, @@ -84,7 +79,6 @@ interface SortableProjectItemProps { index: number; currentProjectId: string | undefined; onSelect: (project: Project) => void; - onTrash: (project: Project) => void; } function SortableProjectItem({ @@ -92,7 +86,6 @@ function SortableProjectItem({ index, currentProjectId, onSelect, - onTrash, }: SortableProjectItemProps) { const { attributes, @@ -151,19 +144,6 @@ function SortableProjectItem({ )}

- - {/* Move to trash */} -
); } @@ -179,7 +159,6 @@ export function Sidebar() { setCurrentProject, setCurrentView, toggleSidebar, - moveProjectToTrash, restoreTrashedProject, deleteTrashedProject, emptyTrash, @@ -272,22 +251,6 @@ export function Sidebar() { } }, [addProject, setCurrentProject]); - const handleTrashProject = useCallback( - (project: Project) => { - const confirmed = window.confirm( - `Move "${project.name}" to Trash?\nThe folder stays on disk until you delete it from Trash.` - ); - if (!confirmed) return; - - moveProjectToTrash(project.id); - setIsProjectPickerOpen(false); - toast.success("Project moved to Trash", { - description: `${project.name} was removed from the sidebar.`, - }); - }, - [moveProjectToTrash] - ); - const handleRestoreProject = useCallback( (projectId: string) => { restoreTrashedProject(projectId); @@ -571,7 +534,7 @@ export function Sidebar() { title="New Project" data-testid="new-project-button" > - + New @@ -583,13 +546,23 @@ export function Sidebar() { data-testid="open-project-button" > - - Open - {ACTION_SHORTCUTS.openProject} +
)} @@ -646,23 +619,10 @@ export function Sidebar() { setCurrentProject(p); setIsProjectPickerOpen(false); }} - onTrash={handleTrashProject} /> ))} - - { - e.preventDefault(); - setShowTrashDialog(true); - }} - className="text-destructive focus:text-destructive" - data-testid="manage-trash" - > - - Manage Trash ({trashedProjects.length}) -
@@ -767,38 +727,8 @@ export function Sidebar() { {/* Bottom Section - User / Settings */}
- {/* Trash + Settings Links */} + {/* Settings Link */}
-
- {/* Content Area */} -
-
- {/* API Keys Section */} -
-
-
- -

- API Keys -

+ {/* Content Area with Sidebar */} +
+ {/* Sticky Side Navigation */} + + + {/* Scrollable Content */} +
+
+ {/* API Keys Section */} +
+
+
+ +

+ API Keys +

+
+

+ Configure your AI provider API keys. Keys are stored locally in + your browser. +

-

- Configure your AI provider API keys. Keys are stored locally in - your browser. -

-
{/* Claude/Anthropic API Key */}
@@ -391,7 +499,10 @@ export function SettingsView() {
{/* Appearance Section */} -
+
@@ -569,7 +680,10 @@ export function SettingsView() {
{/* Kanban Card Display Section */} -
+
@@ -647,7 +761,10 @@ export function SettingsView() {
{/* Feature Defaults Section */} -
+
@@ -689,6 +806,51 @@ export function SettingsView() {
+ {/* Delete Project Section - Only show when a project is selected */} + {currentProject && ( +
+
+
+ +

+ Danger Zone +

+
+

+ Permanently remove this project from Automaker. +

+
+
+
+
+
+ +
+
+

+ {currentProject.name} +

+

+ {currentProject.path} +

+
+
+ +
+
+
+ )} + {/* Save Button */}
+
+ + {/* Delete Project Confirmation Dialog */} + + + + + + Delete Project + + + Are you sure you want to move this project to Trash? + + + + {currentProject && ( +
+
+ +
+
+

+ {currentProject.name} +

+

+ {currentProject.path} +

+
+
+ )} + +

+ The folder will remain on disk until you permanently delete it from Trash. +

+ + + + + +
+
); }