diff --git a/.automaker/feature_list.json b/.automaker/feature_list.json
index 8336b91c..af86f317 100644
--- a/.automaker/feature_list.json
+++ b/.automaker/feature_list.json
@@ -11,7 +11,7 @@
"category": "Context",
"description": "Add Context File should show a file name and a textarea for the context info, that text area should allow drag n drop for txt files and .md files which the system will parse and put into the text area",
"steps": [],
- "status": "in_progress"
+ "status": "verified"
},
{
"id": "feature-1765262348401-hivjg6vuq",
@@ -39,7 +39,7 @@
"category": "Core",
"description": "When opening a new project, verify the .automaker directory is created with necessary files and kick off an agent to analyze the project, refactor the app_spec to describe the project and it's tech stack, and any features currently implemented, also define a blank feature_list.json, create necessary context and agents-context directories, and coding_prompt.md.",
"steps": [],
- "status": "in_progress"
+ "status": "verified"
},
{
"id": "feature-1765263831805-mr6mduv8p",
@@ -67,39 +67,34 @@
"category": "Kanban",
"description": "For the first 10 in progress cards, add shortcut keys 1 through 0 on the keyboard for opening their output modal",
"steps": [],
- "status": "in_progress",
- "startedAt": "2025-12-09T07:26:41.577Z"
+ "status": "in_progress"
},
{
"id": "feature-1765265001317-4eyqyif9z",
"category": "Kanban",
"description": "Add a delete all button in the verified column header which runs through all verified cards and deletes them with the exact same delete actions. remember to show a confirm delete confirmation dialog before actually deleting.",
"steps": [],
- "status": "in_progress",
- "startedAt": "2025-12-09T07:26:54.903Z"
+ "status": "in_progress"
},
{
"id": "feature-1765265036114-9oong1mrv",
"category": "Kanban",
"description": "Remove the refresh button from the headers, we should need to ever manually refresh anything if our app is well designed",
"steps": [],
- "status": "in_progress",
- "startedAt": "2025-12-09T07:26:49.306Z"
+ "status": "in_progress"
},
{
"id": "feature-1765265099914-71eq4x4yl",
"category": "Core",
"description": "Add a ` shortcut to toggle the left side panel (on hover of the toggle show a tool tip with the shortcut info)",
"steps": [],
- "status": "in_progress",
- "startedAt": "2025-12-09T07:26:51.411Z"
+ "status": "verified"
},
{
"id": "feature-1765265179876-5zcrlncdf",
"category": "Kanban",
"description": "Add a button in the backlog header which will just take the top cards and put them into the in progress board (up to the limit of the concurrency of course) so that a user doesn't have to drag each on individually, figure out the best name for it. give it a shortcut as well",
"steps": [],
- "status": "in_progress",
- "startedAt": "2025-12-09T07:26:45.256Z"
+ "status": "in_progress"
}
]
\ No newline at end of file
diff --git a/app/electron/auto-mode-service.js b/app/electron/auto-mode-service.js
index 1a6ba9be..2fc49dc9 100644
--- a/app/electron/auto-mode-service.js
+++ b/app/electron/auto-mode-service.js
@@ -1262,6 +1262,275 @@ Focus on one feature at a time and complete it fully before finishing. Always de
sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
+
+ /**
+ * Analyze a new project - scans codebase and updates app_spec.txt
+ * This is triggered when opening a project for the first time
+ */
+ async analyzeProject({ projectPath, sendToRenderer }) {
+ console.log(`[AutoMode] Analyzing project at: ${projectPath}`);
+
+ const analysisId = `project-analysis-${Date.now()}`;
+
+ // Check if already analyzing this project
+ if (this.runningFeatures.has(analysisId)) {
+ throw new Error("Project analysis is already running");
+ }
+
+ // Register as running
+ this.runningFeatures.set(analysisId, {
+ abortController: null,
+ query: null,
+ projectPath,
+ sendToRenderer,
+ });
+
+ try {
+ sendToRenderer({
+ type: "auto_mode_feature_start",
+ featureId: analysisId,
+ feature: {
+ id: analysisId,
+ category: "Project Analysis",
+ description: "Analyzing project structure and tech stack",
+ },
+ });
+
+ // Perform the analysis
+ const result = await this.runProjectAnalysis(projectPath, analysisId, sendToRenderer);
+
+ sendToRenderer({
+ type: "auto_mode_feature_complete",
+ featureId: analysisId,
+ passes: result.success,
+ message: result.message,
+ });
+
+ return { success: true, message: result.message };
+ } catch (error) {
+ console.error("[AutoMode] Error analyzing project:", error);
+ sendToRenderer({
+ type: "auto_mode_error",
+ error: error.message,
+ featureId: analysisId,
+ });
+ throw error;
+ } finally {
+ this.runningFeatures.delete(analysisId);
+ }
+ }
+
+ /**
+ * Run the project analysis using Claude Agent SDK
+ */
+ async runProjectAnalysis(projectPath, analysisId, sendToRenderer) {
+ console.log(`[AutoMode] Running project analysis for: ${projectPath}`);
+
+ const execution = this.runningFeatures.get(analysisId);
+ if (!execution) {
+ throw new Error(`Analysis ${analysisId} not registered in runningFeatures`);
+ }
+
+ try {
+ sendToRenderer({
+ type: "auto_mode_phase",
+ featureId: analysisId,
+ phase: "planning",
+ message: "Scanning project structure...",
+ });
+
+ const abortController = new AbortController();
+ execution.abortController = abortController;
+
+ const options = {
+ model: "claude-sonnet-4-20250514",
+ systemPrompt: this.getProjectAnalysisSystemPrompt(),
+ maxTurns: 50,
+ cwd: projectPath,
+ allowedTools: ["Read", "Glob", "Grep", "Bash"],
+ permissionMode: "acceptEdits",
+ sandbox: {
+ enabled: true,
+ autoAllowBashIfSandboxed: true,
+ },
+ abortController: abortController,
+ };
+
+ const prompt = this.buildProjectAnalysisPrompt(projectPath);
+
+ sendToRenderer({
+ type: "auto_mode_progress",
+ featureId: analysisId,
+ content: "Starting project analysis...\n",
+ });
+
+ const currentQuery = query({ prompt, options });
+ execution.query = currentQuery;
+
+ let responseText = "";
+ for await (const msg of currentQuery) {
+ if (!this.runningFeatures.has(analysisId)) break;
+
+ if (msg.type === "assistant" && msg.message?.content) {
+ for (const block of msg.message.content) {
+ if (block.type === "text") {
+ responseText += block.text;
+ sendToRenderer({
+ type: "auto_mode_progress",
+ featureId: analysisId,
+ content: block.text,
+ });
+ } else if (block.type === "tool_use") {
+ sendToRenderer({
+ type: "auto_mode_tool",
+ featureId: analysisId,
+ tool: block.name,
+ input: block.input,
+ });
+ }
+ }
+ }
+ }
+
+ execution.query = null;
+ execution.abortController = null;
+
+ sendToRenderer({
+ type: "auto_mode_phase",
+ featureId: analysisId,
+ phase: "verification",
+ message: "Project analysis complete",
+ });
+
+ return {
+ success: true,
+ message: "Project analyzed successfully",
+ };
+ } catch (error) {
+ if (error instanceof AbortError || error?.name === "AbortError") {
+ console.log("[AutoMode] Project analysis aborted");
+ if (execution) {
+ execution.abortController = null;
+ execution.query = null;
+ }
+ return {
+ success: false,
+ message: "Analysis aborted",
+ };
+ }
+
+ console.error("[AutoMode] Error in project analysis:", error);
+ if (execution) {
+ execution.abortController = null;
+ execution.query = null;
+ }
+ throw error;
+ }
+ }
+
+ /**
+ * Build the prompt for project analysis
+ */
+ buildProjectAnalysisPrompt(projectPath) {
+ return `You are analyzing a new project that was just opened in Automaker, an autonomous AI development studio.
+
+**Your Task:**
+
+Analyze this project's codebase and update the .automaker/app_spec.txt file with accurate information about:
+
+1. **Project Name** - Detect the name from package.json, README, or directory name
+2. **Overview** - Brief description of what the project does
+3. **Technology Stack** - Languages, frameworks, libraries detected
+4. **Core Capabilities** - Main features and functionality
+5. **Implemented Features** - What features are already built
+
+**Steps to Follow:**
+
+1. First, explore the project structure:
+ - Look at package.json, cargo.toml, go.mod, requirements.txt, etc. for tech stack
+ - Check README.md for project description
+ - List key directories (src, lib, components, etc.)
+
+2. Identify the tech stack:
+ - Frontend framework (React, Vue, Next.js, etc.)
+ - Backend framework (Express, FastAPI, etc.)
+ - Database (if any config files exist)
+ - Testing framework
+ - Build tools
+
+3. Update .automaker/app_spec.txt with your findings in this format:
+ \`\`\`xml
+
- Tip: Edit the{" "}
-
- app_spec.txt
- {" "}
- file to describe your project. The AI agent will use this to
- understand your project structure.
-
+ AI agent is analyzing your project structure... +
+
+ Tip: Edit the{" "}
+
+ app_spec.txt
+ {" "}
+ file to describe your project. The AI agent will use this to
+ understand your project structure.
+