diff --git a/.automaker/feature_list.json b/.automaker/feature_list.json index 2de9f84c..0637a088 100644 --- a/.automaker/feature_list.json +++ b/.automaker/feature_list.json @@ -1,347 +1 @@ -[ - { - "id": "feature-1765288408132-3pmld0an6", - "category": "Core", - "description": "Can you add a shortcut key for O to open up a new project? To click on the open new project button that's in like the logo header area.", - "steps": [], - "status": "verified", - "model": "opus", - "thinkingLevel": "none" - }, - { - "id": "feature-1765300273422-a8ovhdlwq", - "category": "Core", - "description": "I want the ability to press P which will automatically select my projects drop down and show all my projects. And then for each one, put a hotkey in the left that says 12345 and selecting one of those with my keyboard should automatically select that project.\n", - "steps": [], - "status": "verified", - "model": "opus", - "thinkingLevel": "none" - }, - { - "id": "feature-1765301095506-cpy06q9u0", - "category": "Core", - "description": "It seems like there's only a limit of five of how many things show up in the project select drop down. I need to show everything.", - "steps": [], - "status": "verified", - "model": "opus", - "thinkingLevel": "none" - }, - { - "id": "feature-1765301127030-a4nnqp0ja", - "category": "Kanban", - "description": "In creating new cards in Kanban, I need the ability to drag and drop images into the description section, which will attach the image as context in store in the temp directory, so that later on when the agent runs, it can know where to fetch that image from.", - "steps": [], - "status": "verified", - "model": "opus", - "thinkingLevel": "none" - }, - { - "id": "feature-1765301184184-ttvhd8kkt", - "category": "Core", - "description": "-o should actually open the select folder prompt. Right now when you click o it goes to like the overview page. That's not the correct experience I'm looking for. Also just clicking on the top left open folder icon should do the same thing of opening the system prompt so they can select a project.", - "steps": [], - "status": "verified", - "model": "opus", - "thinkingLevel": "none" - }, - { - "id": "feature-1765305181443-qze22t1hl", - "category": "Other", - "description": "the settings view is not allowing us to scroll to see rest of the content ", - "steps": [ - "start the project", - "open Setting view", - "try to scroll " - ], - "status": "verified", - "model": "opus", - "thinkingLevel": "none" - }, - { - "id": "feature-1765310151816-plx1pxl0z", - "category": "Kanban", - "description": "So i want to improve the look of the view of agent output modal its just plain text and im thinking to parse it better and kinda make it look like the last image of coolify logs nice colorded and somehow grouped into some types of info / debug so in our case like prompt / tool call etc", - "steps": [], - "status": "verified", - "model": "opus", - "thinkingLevel": "none" - }, - { - "id": "feature-1765318148517-715isvwwb", - "category": "Kanban", - "description": "When agent finish work the cards is moved either to waiting approval or into verified one But mostly its include some type of summary at the end i want you to modify our prompts and ui so when its in both states we can see the feature summary of what was done / modified instead of relying on going to code editor to see what got changed etc.", - "steps": [], - "status": "verified", - "startedAt": "2025-12-09T22:09:13.684Z", - "imagePaths": [], - "skipTests": true, - "model": "opus", - "thinkingLevel": "none" - }, - { - "id": "feature-1765319491258-x933j6kbq", - "category": "Core", - "description": "When running new feature in skip automated testing once its got finished its moved to waiting approval for us to manual test it / follow up prompt. Once we are satisfied we can click commit button so ai agent can commit it work this is only hapening in this scenerio because if we have unchecked the skip automated testing its do it automaticly and commit already. But the issue is when its going to commit we move it to in progress state where we can use stop button and if user use that button its moved to backlog column and. that kinda break what we are doing becase we have no longer even abbility to move it back to waiting approval or to run commit button / follow up again so if user use manual one and stop the commit i want it to be again moved back to waiting approval state / column", - "steps": [], - "status": "verified", - "startedAt": "2025-12-09T22:31:41.946Z", - "imagePaths": [], - "skipTests": true, - "model": "opus", - "thinkingLevel": "none" - }, - { - "id": "feature-1765321570899-oefrfast6", - "category": "Core", - "description": "I would like to have abbility to set correct model for new feautres. so inteas of only using claude opus we could use other models like sonnet or haiku for easier / light one tasks as well to add abbility how much thinking lvl we wanna use on each task as well", - "steps": [ - "User add new feature", - "User Describe it", - "Select the automated testing or manual one", - "If the task is light / easy to implement he use lighter model from anthropi sdk such as sonnet / haiku", - "agent execute task with correct model " - ], - "status": "verified", - "startedAt": "2025-12-09T23:07:37.223Z", - "imagePaths": [], - "skipTests": false, - "summary": "Added model selection (Haiku/Sonnet/Opus) and thinking level (None/Low/Medium/High) controls to feature creation and edit dialogs. Modified: app-store.ts (added AgentModel and ThinkingLevel types), board-view.tsx (UI controls), feature-executor.js (dynamic model/thinking config), feature-loader.js (field persistence). Agent now executes with user-selected model and extended thinking settings.", - "model": "opus", - "thinkingLevel": "none" - }, - { - "id": "feature-1765332414638-8jt9o8v06", - "category": "Kanban", - "description": "I want you to refactor the add new feature modal there are to many settings going on and its hard / annoyig to navigate lets split the settings in modal into tabs \nprompt icon - prompt and category\ngear icon - model and thinking ( here i would also like to split somehow the claude with thinking and codex that dont use it )\ntest icon - skip automated testing and verification steps\n", - "steps": [], - "status": "verified", - "startedAt": "2025-12-10T02:17:18.943Z", - "imagePaths": [], - "skipTests": true, - "summary": "Made model selection buttons compact. Removed descriptions and badges from cards, now shows short model names (Haiku, Sonnet, Opus, Max, Codex, Mini) in horizontal row. Full description available on hover. Modified: board-view.tsx (renderModelOptions function).", - "model": "opus", - "thinkingLevel": "high" - }, - { - "id": "feature-1765333519168-1z97a3dcq", - "category": "Uncategorized", - "description": "Make the add new feature modal widther ", - "steps": [], - "status": "verified", - "startedAt": "2025-12-10T02:25:21.328Z", - "imagePaths": [ - { - "id": "img-1765333063064-qygrbjul4", - "path": "/var/folders/lh/zcj91n9j4vj4_wg8jsvpqr9m0000gn/T/automaker-images/1765333063058_SCR-20251210-dseh.png", - "filename": "SCR-20251210-dseh.png", - "mimeType": "image/png" - } - ], - "skipTests": true, - "summary": "Increased dialog max-width from max-w-md/max-w-lg to max-w-2xl. Modified: app/src/components/ui/dialog.tsx. This makes the add new feature modal and all other dialogs wider (from 448-512px to 672px) for better content display.", - "model": "haiku", - "thinkingLevel": "none" - }, - { - "id": "feature-1765334441225-h3j832sbz", - "category": "Kanban", - "description": "For example i got haiku model running or codex one but we can still see opus 4.5 check if it not hardcoded and fix it to use proper model name that was used in this task", - "steps": [], - "status": "verified", - "startedAt": "2025-12-10T02:40:43.706Z", - "imagePaths": [], - "skipTests": true, - "summary": "Kanban cards now render the agent info model badge using feature.model so the displayed model matches the one selected for the task.", - "model": "gpt-5.1-codex", - "thinkingLevel": "none" - }, - { - "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, - "model": "opus", - "thinkingLevel": "none" - }, - { - "id": "feature-1765358858108-r8ay1p5mj", - "category": "Settings", - "description": "Add claude and codex to the left sidebar of settings so its will scroll to thoes sections as well", - "steps": [], - "status": "verified", - "startedAt": "2025-12-10T09:32:31.638Z", - "imagePaths": [ - { - "id": "img-1765358823366-6vchdhwsj", - "path": "/Users/shirone/Library/Application Support/automaker/images/1765358823364-e0ir8jy9l_SCR-20251210-jooz.png", - "filename": "SCR-20251210-jooz.png", - "mimeType": "image/png" - } - ], - "skipTests": true, - "model": "sonnet", - "thinkingLevel": "none" - }, - { - "id": "feature-1765360739103-3h218d1nn", - "category": "Kanban", - "description": "When u write new feature for ai agent and attacht context images and change tab to choose diff model and go back to prompt tab the image preview break and im not sure if it even saved properly in state to be later attached check it out for me", - "steps": [], - "status": "verified", - "startedAt": "2025-12-10T09:59:02.988Z", - "imagePaths": [], - "skipTests": true, - "summary": "Fixed image preview breaking when switching tabs in Add Feature modal. Added previewMap/onPreviewMapChange props to DescriptionImageDropZone component to lift preview state up to parent. Modified: description-image-dropzone.tsx (added parent-controlled state support), board-view.tsx (added newFeaturePreviewMap and followUpPreviewMap state, wired up to DescriptionImageDropZone). Image paths were already stored correctly in state - only the preview thumbnails (base64) were lost on tab switch due to component unmounting.", - "model": "opus", - "thinkingLevel": "high" - }, - { - "id": "feature-1765363330908-vu0hip87r", - "category": "Kanban", - "description": "Take a look at waiting aproval column in kanban board and fix the card that render in it u can see in attached images that they text is overlaping check other columns how we have them", - "steps": [], - "status": "verified", - "startedAt": "2025-12-10T10:46:42.494Z", - "imagePaths": [ - { - "id": "img-1765363296205-e4cwlj2j8", - "path": "/Users/shirone/Library/Application Support/automaker/images/1765363296203-bud50snjv_SCR-20251210-kosr.png", - "filename": "SCR-20251210-kosr.png", - "mimeType": "image/png" - }, - { - "id": "img-1765363296214-lloeta38x", - "path": "/Users/shirone/Library/Application Support/automaker/images/1765363296212-zg03hi120_SCR-20251210-kotn.png", - "filename": "SCR-20251210-kotn.png", - "mimeType": "image/png" - }, - { - "id": "img-1765363296221-oupa9su2f", - "path": "/Users/shirone/Library/Application Support/automaker/images/1765363296219-7kndnuzr2_SCR-20251210-koud.png", - "filename": "SCR-20251210-koud.png", - "mimeType": "image/png" - } - ], - "skipTests": true, - "model": "sonnet", - "thinkingLevel": "low" - }, - { - "id": "feature-1765365064255-wk51aoz3e", - "category": "Core", - "description": "I want to have some abbility when executing a task on project to have some type of rewing / checkpoint system so if the changes made by agent in the project dont satisfy me / break something i can click in the ui to revert them. The best way for it would be to implement github worktress so when spin up new task claude take a look at it generate new branch that fit task issue and make it as gihub worktree then we would create a a new folder in project .automaker/worktree with branch name and clone of repo so agent can freely work one something like that ", - "steps": [], - "status": "verified", - "startedAt": "2025-12-10T11:11:06.115Z", - "imagePaths": [], - "skipTests": true, - "summary": "Implemented Git Worktree Checkpoint/Revert System. Created: worktree-manager.js service. Modified: auto-mode-service.js (worktree integration, revert/merge methods), feature-loader.js (worktree tracking), main.js (IPC handlers), preload.js (API exposure), app-store.ts (Feature type), electron.d.ts (types), electron.ts (mock API), kanban-card.tsx (branch badge, revert/merge buttons), board-view.tsx (handlers). Features: isolated git branches per feature, branch badge on cards, revert changes button, merge to main button, file diff APIs.", - "model": "opus", - "thinkingLevel": "ultrathink" - }, - { - "id": "feature-1765365411551-87ww2zw6g", - "category": "Kanban", - "description": "When a agent is workig on task or when its in waiting approval column its would be nice to have some type of git diff panel and see what files got changed as well as reusing our custom themes we have in settings for the editor view of it take a look at codebase and create implementation for it", - "steps": [], - "status": "verified", - "startedAt": "2025-12-10T11:16:54.069Z", - "imagePaths": [], - "skipTests": true, - "summary": "Added git diff panel for in-progress and waiting approval features. Created GitDiffPanel component with themed syntax highlighting. Modified: git-diff-panel.tsx (new), agent-output-modal.tsx, worktree-manager.js, auto-mode-service.js, main.js, preload.js, electron.d.ts. The panel shows changed files with +/- stats and expandable unified diff view using CSS theme variables.", - "model": "opus", - "thinkingLevel": "ultrathink" - }, - { - "id": "feature-1765370691119-yz43i6m6a", - "category": "Core", - "description": "i want you to run 'npx tsc --noEmi' on our app and fix / get rid of typescript errors that are left ", - "steps": [], - "status": "verified", - "imagePaths": [], - "skipTests": false, - "summary": "Fixed all TypeScript errors in the codebase. Modified: src/app/api/claude/test/route.ts (rewrote to use fetch instead of missing @anthropic-ai/sdk), src/lib/electron.ts (fixed saveImageToTemp signature, removed duplicate Window declaration), src/types/electron.d.ts (added deleteFile, resumeFeature, contextExists, analyzeProject methods), src/store/app-store.ts (added FileTreeNode, ProjectAnalysis types and analysis state/actions), src/components/views/analysis-view.tsx (added type annotations for implicit any), src/hooks/use-electron-agent.ts (fixed return type to include queue properties). Created: src/components/ui/badge.tsx (new component required by chat-history.tsx).", - "model": "opus", - "thinkingLevel": "ultrathink" - }, - { - "id": "feature-1765371638849-1gfiifuqy", - "category": "Uncategorized", - "description": "So currently we have both predefined profiles and custom one created by users and custom tweaking in modal tab when creatign new feature for ai agent to run i want you to add an abbility in our settings view to have enabled only showing profiels by default and what that mean that the model tweaking like selecting bewteen claude / codex and thinking mode is hidden and only profiles are shown so the ui wont be ower head and if users want to tweaks seetings they can always reenabled it in setting view ", - "steps": [], - "status": "verified", - "imagePaths": [ - { - "id": "img-1765371471290-6jcmwkviv", - "path": "/Users/shirone/Library/Application Support/automaker/images/1765371471287-jejcmoc8q_SCR-20251210-lpki.png", - "filename": "SCR-20251210-lpki.png", - "mimeType": "image/png" - } - ], - "skipTests": true, - "model": "sonnet", - "thinkingLevel": "medium" - }, - { - "id": "feature-1765372497502-kxppqqv3k", - "category": "Uncategorized", - "description": "As u can see in our git diff panel on each new file its show modified or untracked if it untracked and that not good for ui / ux what if user / agett change over 40-50 files in one go this wiould be complete mess i would rather do 1 type for each with number and icon", - "steps": [], - "status": "verified", - "startedAt": "2025-12-10T13:15:19.417Z", - "imagePaths": [ - { - "id": "img-1765372428239-jg07w3zxv", - "path": "/Users/shirone/Library/Application Support/automaker/images/1765372428236-6t02kvclp_SCR-20251210-mplr.png", - "filename": "SCR-20251210-mplr.png", - "mimeType": "image/png" - } - ], - "skipTests": false, - "model": "sonnet", - "thinkingLevel": "none" - }, - { - "id": "feature-1765374057950-og96suob2", - "category": "Other", - "description": "I found an issue u can reorder custom profiles created by our self but the pre build in when u try to drag nothing happend", - "steps": [], - "status": "verified", - "startedAt": "2025-12-10T13:40:58.991Z", - "imagePaths": [ - { - "id": "img-1765374055642-rdjksh8g1", - "path": "/Users/shirone/Library/Application Support/automaker/images/1765374055641-o7pu97zuz_SCR-20251210-namv.png", - "filename": "SCR-20251210-namv.png", - "mimeType": "image/png" - } - ], - "skipTests": true, - "model": "sonnet", - "thinkingLevel": "medium" - }, - { - "id": "feature-1765375218276-4sgru3lca", - "category": "Other", - "description": "I want you to add a shortcuts to ai profies in siedbar to be M and insite that view the new profile should be also shortuct to open to crate a new profile by shortcat N", - "steps": [], - "status": "verified", - "startedAt": "2025-12-10T14:00:32.639Z", - "imagePaths": [], - "skipTests": true, - "summary": "Added keyboard shortcuts for AI Profiles:\n- Press M to navigate to AI Profiles view from sidebar\n- Press N in profiles view to create new profile\n- Visual shortcut indicators added to UI\nModified: use-keyboard-shortcuts.ts (added profiles:M and addProfile:N shortcuts), sidebar.tsx (added shortcut to profiles nav item), profiles-view.tsx (imported keyboard shortcut hooks, implemented N shortcut handler, added visual indicator to New Profile button)", - "model": "haiku", - "thinkingLevel": "none" - } -] \ No newline at end of file +[] \ No newline at end of file diff --git a/app/electron/services/project-analyzer.js b/app/electron/services/project-analyzer.js index de91e4dd..1922e415 100644 --- a/app/electron/services/project-analyzer.js +++ b/app/electron/services/project-analyzer.js @@ -27,7 +27,7 @@ class ProjectAnalyzer { systemPrompt: promptBuilder.getProjectAnalysisSystemPrompt(), maxTurns: 50, cwd: projectPath, - allowedTools: ["Read", "Glob", "Grep", "Bash"], + allowedTools: ["Read", "Write", "Edit", "Glob", "Grep", "Bash"], permissionMode: "acceptEdits", sandbox: { enabled: true, diff --git a/app/electron/services/prompt-builder.js b/app/electron/services/prompt-builder.js index f5ece767..de0c6b00 100644 --- a/app/electron/services/prompt-builder.js +++ b/app/electron/services/prompt-builder.js @@ -359,6 +359,7 @@ Analyze this project's codebase and update the .automaker/app_spec.txt file with 3. **Technology Stack** - Languages, frameworks, libraries detected 4. **Core Capabilities** - Main features and functionality 5. **Implemented Features** - What features are already built +6. **Implementation Roadmap** - Break down remaining work into phases with individual features **Steps to Follow:** @@ -406,10 +407,42 @@ Analyze this project's codebase and update the .automaker/app_spec.txt file with + + + + + + + + + + + + \`\`\` -4. Ensure .automaker/feature_list.json exists (create as empty array [] if not) +4. **IMPORTANT - Generate Feature List:** + After writing the app_spec.txt, you MUST update .automaker/feature_list.json with features from the implementation_roadmap section: + - Read the app_spec.txt you just created + - For EVERY feature in each phase of the implementation_roadmap, create an entry + - Write ALL features to .automaker/feature_list.json + + The feature_list.json format should be: + \`\`\`json + [ + { + "id": "feature--", + "category": "", + "description": "", + "status": "backlog", + "steps": ["Step 1", "Step 2", "..."], + "skipTests": true + } + ] + \`\`\` + + Generate unique IDs using the current timestamp and index (e.g., "feature-1234567890-0", "feature-1234567890-1", etc.) 5. Ensure .automaker/context/ directory exists @@ -420,6 +453,7 @@ Analyze this project's codebase and update the .automaker/app_spec.txt file with - Only include information you can verify from the codebase - If unsure about something, note it as "to be determined" - Don't make up features that don't exist +- Include EVERY feature from the roadmap in feature_list.json - do not skip any Begin by exploring the project structure.`; } @@ -618,6 +652,7 @@ Your goal is to: - Identify programming languages, frameworks, and libraries - Detect existing features and capabilities - Update the .automaker/app_spec.txt with accurate information +- Generate a feature list in .automaker/feature_list.json based on the implementation roadmap - Ensure all required .automaker files and directories exist Be efficient - don't read every file, focus on: @@ -626,7 +661,13 @@ Be efficient - don't read every file, focus on: - Directory structure - README and documentation -You have read access to files and can run basic bash commands to explore the structure.`; +**CRITICAL - Feature List Generation:** +After creating/updating the app_spec.txt, you MUST also update .automaker/feature_list.json: +1. Read the app_spec.txt you just wrote +2. Extract all features from the implementation_roadmap section +3. Write them to .automaker/feature_list.json in the correct format + +You have access to Read, Write, Edit, Glob, Grep, and Bash tools. Use them to explore the structure and write the necessary files.`; } } diff --git a/app/src/components/session-manager.tsx b/app/src/components/session-manager.tsx index 2b8df243..88144679 100644 --- a/app/src/components/session-manager.tsx +++ b/app/src/components/session-manager.tsx @@ -67,6 +67,29 @@ export function SessionManager({ const [editingName, setEditingName] = useState(""); const [isCreating, setIsCreating] = useState(false); const [newSessionName, setNewSessionName] = useState(""); + const [runningSessions, setRunningSessions] = useState>(new Set()); + + // Check running state for all sessions + const checkRunningSessions = async (sessionList: SessionListItem[]) => { + if (!window.electronAPI?.agent) return; + + const runningIds = new Set(); + + // Check each session's running state + for (const session of sessionList) { + try { + const result = await window.electronAPI.agent.getHistory(session.id); + if (result.success && result.isRunning) { + runningIds.add(session.id); + } + } catch (err) { + // Ignore errors for individual session checks + console.warn(`[SessionManager] Failed to check running state for ${session.id}:`, err); + } + } + + setRunningSessions(runningIds); + }; // Load sessions const loadSessions = async () => { @@ -76,6 +99,8 @@ export function SessionManager({ const result = await window.electronAPI.sessions.list(true); if (result.success && result.sessions) { setSessions(result.sessions); + // Check running state for all sessions + await checkRunningSessions(result.sessions); } }; @@ -83,6 +108,20 @@ export function SessionManager({ loadSessions(); }, []); + // Periodically check running state for sessions (useful for detecting when agents finish) + useEffect(() => { + // Only poll if there are running sessions + if (runningSessions.size === 0 && !isCurrentSessionThinking) return; + + const interval = setInterval(async () => { + if (sessions.length > 0) { + await checkRunningSessions(sessions); + } + }, 3000); // Check every 3 seconds + + return () => clearInterval(interval); + }, [sessions, runningSessions.size, isCurrentSessionThinking]); + // Create new session with random name const handleCreateSession = async () => { if (!window.electronAPI?.sessions) return; @@ -328,13 +367,14 @@ export function SessionManager({ ) : ( <>
- {currentSessionId === session.id && isCurrentSessionThinking ? ( + {/* Show loading indicator if this session is running (either current session thinking or any session in runningSessions) */} + {((currentSessionId === session.id && isCurrentSessionThinking) || runningSessions.has(session.id)) ? ( ) : ( )}

{session.name}

- {currentSessionId === session.id && isCurrentSessionThinking && ( + {((currentSessionId === session.id && isCurrentSessionThinking) || runningSessions.has(session.id)) && ( thinking... diff --git a/app/src/components/ui/description-image-dropzone.tsx b/app/src/components/ui/description-image-dropzone.tsx index 76874a41..f483fb1a 100644 --- a/app/src/components/ui/description-image-dropzone.tsx +++ b/app/src/components/ui/description-image-dropzone.tsx @@ -317,7 +317,7 @@ export function DescriptionImageDropZone({