From ba2475363033a46d147471512e2d8fff166057c9 Mon Sep 17 00:00:00 2001 From: Cody Seibert Date: Fri, 12 Dec 2025 02:43:26 -0500 Subject: [PATCH] feat: move "Report Bug / Feature Request" button to header for improved accessibility - Relocated the button from the bottom sidebar to the header next to the AutoMaker logo. - Updated the button to be a compact icon-only version with a tooltip on hover. - Adjusted the header layout to accommodate the new button placement. - Removed the old button from the sidebar to streamline the UI. --- .../agent-output.md | 53 ------- .../feature.json | 14 -- .../git-state.json | 11 -- .../agent-output.md | 29 ++++ .../feature.json | 14 ++ .../electron/services/mcp-server-factory.js | 9 ++ .../app/electron/services/mcp-server-stdio.js | 11 +- apps/app/src/app/layout.tsx | 2 - apps/app/src/components/layout/sidebar.tsx | 3 + .../src/components/ui/course-promo-badge.tsx | 145 +++--------------- apps/app/src/lib/electron.ts | 11 +- apps/app/src/lib/http-api-client.ts | 2 + .../msg_1765523524581_xhk6u45v2.json | 24 +++ apps/server/data/sessions-metadata.json | 2 +- apps/server/src/routes/setup.ts | 58 ++++++- 15 files changed, 181 insertions(+), 207 deletions(-) delete mode 100644 .automaker/features/feature-1765426941179-om12nlapa/agent-output.md delete mode 100644 .automaker/features/feature-1765426941179-om12nlapa/feature.json delete mode 100644 .automaker/features/feature-1765426941179-om12nlapa/git-state.json create mode 100644 .automaker/features/feature-1765524702667-c4ede0vih/agent-output.md create mode 100644 .automaker/features/feature-1765524702667-c4ede0vih/feature.json diff --git a/.automaker/features/feature-1765426941179-om12nlapa/agent-output.md b/.automaker/features/feature-1765426941179-om12nlapa/agent-output.md deleted file mode 100644 index f791f679..00000000 --- a/.automaker/features/feature-1765426941179-om12nlapa/agent-output.md +++ /dev/null @@ -1,53 +0,0 @@ -📋 Planning implementation for: move the report bug request button to top in header next to the automaker logo -⚡ Executing implementation for: move the report bug request button to top in header next to the automaker logo -Starting code implementation... - -🔧 Tool: TodoWrite -Let me start by exploring the header component and understanding the current structure. -🔧 Tool: Glob - -🔧 Tool: Grep - -🔧 Tool: Read - -🔧 Tool: Glob - -🔧 Tool: TodoWrite -I found the sidebar component. The "Report Bug / Feature Request" button is currently in the bottom section of the sidebar (lines 1150-1180). The feature request is to move this button to the top header, next to the Automaker logo. - -Looking at the current structure: -1. The logo section is at lines 742-770 -2. The bug report button is in the bottom section at lines 1150-1180 - -I'll move the bug report button to be next to the logo in the header area. Let me make this change: -🔧 Tool: Edit -Now I need to remove the old bug report button from the bottom section: -🔧 Tool: Edit -The change is complete. Let me verify the build compiles correctly: -🔧 Tool: Bash - -🔧 Tool: Bash - -🔧 Tool: Bash - -🔧 Tool: Bash -The TypeScript check passed with no errors. Let me mark the task as completed and update the feature status: -🔧 Tool: TodoWrite - -🔧 Tool: mcp__automaker-tools__UpdateFeatureStatus - -🔧 Tool: TodoWrite -I've completed the feature implementation. Here's a summary of what was done: - -**Changes Made:** - -1. **Modified `app/src/components/layout/sidebar.tsx`:** - - Moved the "Report Bug / Feature Request" button from the bottom sidebar section (between Running Agents and Settings) to the header area, next to the AutoMaker logo - - Changed the header container from `justify-center` to `justify-between` to accommodate the new button placement - - The button is now a compact icon-only button with a tooltip on hover - - Kept the same test ID (`bug-report-link`) for consistency - - Removed the old button from the bottom section - -The bug report button now appears as a small bug icon in the header, right next to the AutoMaker logo, making it more accessible and visible to users.✅ Verifying implementation for: move the report bug request button to top in header next to the automaker logo -Verifying implementation and checking test results... -✓ Verification successful: All tests passed diff --git a/.automaker/features/feature-1765426941179-om12nlapa/feature.json b/.automaker/features/feature-1765426941179-om12nlapa/feature.json deleted file mode 100644 index 258d3347..00000000 --- a/.automaker/features/feature-1765426941179-om12nlapa/feature.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "category": "Uncategorized", - "description": "move the report bug request button to top in header next to the automaker logo", - "steps": [], - "status": "waiting_approval", - "images": [], - "imagePaths": [], - "skipTests": true, - "model": "opus", - "thinkingLevel": "none", - "id": "feature-1765426941179-om12nlapa", - "startedAt": "2025-12-11T04:22:21.750Z", - "summary": "Moved the Report Bug / Feature Request button from the bottom sidebar section to the header, next to the AutoMaker logo. Modified: app/src/components/layout/sidebar.tsx. The button now appears as a compact icon button in the header area." -} \ No newline at end of file diff --git a/.automaker/features/feature-1765426941179-om12nlapa/git-state.json b/.automaker/features/feature-1765426941179-om12nlapa/git-state.json deleted file mode 100644 index edcfd6d1..00000000 --- a/.automaker/features/feature-1765426941179-om12nlapa/git-state.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "timestamp": "2025-12-11T04:22:21.809Z", - "modifiedFiles": [ - "app/src/components/views/analysis-view.tsx", - "app/src/components/views/interview-view.tsx" - ], - "untrackedFiles": [ - ".automaker/features/feature-1765426941179-om12nlapa/feature.json", - "marketing/index.html" - ] -} \ No newline at end of file diff --git a/.automaker/features/feature-1765524702667-c4ede0vih/agent-output.md b/.automaker/features/feature-1765524702667-c4ede0vih/agent-output.md new file mode 100644 index 00000000..28394c1a --- /dev/null +++ b/.automaker/features/feature-1765524702667-c4ede0vih/agent-output.md @@ -0,0 +1,29 @@ +## Summary + +I've implemented the requested feature. Here's what was changed: + +### Changes Made to `apps/app/src/components/ui/course-promo-badge.tsx`: + +1. **Removed the modal dialog completely** - The `Dialog` component and all its sub-components (`DialogContent`, `DialogHeader`, `DialogTitle`, `DialogDescription`, `DialogFooter`) along with the modal state (`open`) have been removed. + +2. **Changed from button to direct link** - The ` - - - - - - - - Learn Agentic AI Development - - - Master the tools and techniques behind modern AI-assisted coding - - - -
-
-

- Did you know Automaker was built entirely through agentic coding? - Want to learn how? Check out the course! -

-
- -

- Agentic Jumpstart teaches you - how to leverage AI tools to build software faster and smarter than ever before. -

- -
-
-
- -
-
-

Claude Code Mastery

-

- Learn to use Claude Code effectively for autonomous development workflows -

-
-
- -
-
- -
-
-

Cursor & AI IDEs

-

- Master Cursor and other AI-powered development environments -

-
-
- -
-
- -
-
-

Prompting Techniques

-

- Craft effective prompts that get you the results you need -

-
-
- -
-
- -
-
-

Context Engineering

-

- Structure your projects and context for optimal AI collaboration -

-
-
-
-
- - - - - -
-
- + + +
+ ); } diff --git a/apps/app/src/lib/electron.ts b/apps/app/src/lib/electron.ts index 2d141836..759e0784 100644 --- a/apps/app/src/lib/electron.ts +++ b/apps/app/src/lib/electron.ts @@ -876,17 +876,21 @@ interface SetupAPI { getClaudeStatus: () => Promise<{ success: boolean; status?: string; + installed?: boolean; method?: string; version?: string; path?: string; auth?: { authenticated: boolean; method: string; - hasCredentialsFile: boolean; - hasToken: boolean; + hasCredentialsFile?: boolean; + hasToken?: boolean; hasStoredOAuthToken?: boolean; hasStoredApiKey?: boolean; hasEnvApiKey?: boolean; + hasEnvOAuthToken?: boolean; + hasCliAuth?: boolean; + hasRecentActivity?: boolean; }; error?: string; }>; @@ -966,11 +970,14 @@ function createMockSetupAPI(): SetupAPI { return { success: true, status: "not_installed", + installed: false, auth: { authenticated: false, method: "none", hasCredentialsFile: false, hasToken: false, + hasCliAuth: false, + hasRecentActivity: false, }, }; }, diff --git a/apps/app/src/lib/http-api-client.ts b/apps/app/src/lib/http-api-client.ts index 6441b582..1437d152 100644 --- a/apps/app/src/lib/http-api-client.ts +++ b/apps/app/src/lib/http-api-client.ts @@ -381,6 +381,8 @@ export class HttpApiClient implements ElectronAPI { hasStoredApiKey?: boolean; hasEnvApiKey?: boolean; hasEnvOAuthToken?: boolean; + hasCliAuth?: boolean; + hasRecentActivity?: boolean; }; error?: string; }> => this.get("/api/setup/claude-status"), diff --git a/apps/server/data/agent-sessions/msg_1765523524581_xhk6u45v2.json b/apps/server/data/agent-sessions/msg_1765523524581_xhk6u45v2.json index 8fe81fea..ed50f4be 100644 --- a/apps/server/data/agent-sessions/msg_1765523524581_xhk6u45v2.json +++ b/apps/server/data/agent-sessions/msg_1765523524581_xhk6u45v2.json @@ -10,5 +10,29 @@ "role": "assistant", "content": "Hello! This is a test response. I'm working correctly and ready to help you with your software development projects.\n\nIs there something specific you'd like to work on today? I can help you with:\n\n- **Planning a new project** - Define requirements, architecture, and technical approach\n- **Writing code** - Create new files, implement features, or build components\n- **Editing existing code** - Modify, refactor, or fix bugs in your codebase\n- **Running commands** - Execute tests, builds, or other terminal commands\n- **Exploring your codebase** - Search for patterns, understand existing code structure\n\nJust let me know what you need!", "timestamp": "2025-12-12T07:12:14.075Z" + }, + { + "id": "msg_1765524006202_3d2cuya6b", + "role": "user", + "content": "test", + "timestamp": "2025-12-12T07:20:06.202Z" + }, + { + "id": "msg_1765524011389_sdfbuai3k", + "role": "assistant", + "content": "Hello! I'm here to help you build software. How can I assist you today?\n\nI can help you with:\n\n- **Planning** - Define requirements, discuss architecture, and design your project\n- **Coding** - Write, edit, and modify code files\n- **Debugging** - Analyze issues and fix bugs\n- **Testing** - Run tests and verify functionality\n- **Exploring** - Search and understand existing codebases\n\nWhat would you like to work on?", + "timestamp": "2025-12-12T07:20:11.389Z" + }, + { + "id": "msg_1765524491273_7ocghnbb5", + "role": "user", + "content": "test", + "timestamp": "2025-12-12T07:28:11.273Z" + }, + { + "id": "msg_1765524498237_x8b4148gc", + "role": "assistant", + "content": "Hello! I'm here to help you build software. How can I assist you today?\n\nI can help you with:\n- **Planning** - Define requirements, architecture, and technical approaches\n- **Coding** - Write, edit, and modify code files\n- **Debugging** - Find and fix issues in your codebase\n- **Testing** - Run tests and help improve test coverage\n- **Exploring** - Search and analyze your existing codebase\n\nWhat would you like to work on?", + "timestamp": "2025-12-12T07:28:18.237Z" } ] \ No newline at end of file diff --git a/apps/server/data/sessions-metadata.json b/apps/server/data/sessions-metadata.json index a5192ecd..28e9b6dc 100644 --- a/apps/server/data/sessions-metadata.json +++ b/apps/server/data/sessions-metadata.json @@ -5,6 +5,6 @@ "projectPath": "/Users/webdevcody/Workspace/automaker", "workingDirectory": "/Users/webdevcody/Workspace/automaker", "createdAt": "2025-12-12T07:12:04.582Z", - "updatedAt": "2025-12-12T07:12:14.382Z" + "updatedAt": "2025-12-12T07:28:18.571Z" } } \ No newline at end of file diff --git a/apps/server/src/routes/setup.ts b/apps/server/src/routes/setup.ts index aeb0e5d2..48cbec89 100644 --- a/apps/server/src/routes/setup.ts +++ b/apps/server/src/routes/setup.ts @@ -80,6 +80,7 @@ export function createSetupRoutes(): Router { // Not in PATH, try common locations const commonPaths = [ path.join(os.homedir(), ".local", "bin", "claude"), + path.join(os.homedir(), ".claude", "local", "claude"), "/usr/local/bin/claude", path.join(os.homedir(), ".npm-global", "bin", "claude"), ]; @@ -90,6 +91,14 @@ export function createSetupRoutes(): Router { cliPath = p; installed = true; method = "local"; + + // Get version from this path + try { + const { stdout: versionOut } = await execAsync(`"${p}" --version`); + version = versionOut.trim(); + } catch { + // Version command might not be available + } break; } catch { // Not found at this path @@ -110,10 +119,55 @@ export function createSetupRoutes(): Router { // Additional fields for detailed status oauthTokenValid: false, apiKeyValid: false, + hasCliAuth: false, + hasRecentActivity: false, }; - // Check for credentials file (OAuth tokens from claude login) - const credentialsPath = path.join(os.homedir(), ".claude", "credentials.json"); + const claudeDir = path.join(os.homedir(), ".claude"); + + // Check for recent Claude CLI activity - indicates working authentication + // The stats-cache.json file is only populated when the CLI is working properly + const statsCachePath = path.join(claudeDir, "stats-cache.json"); + try { + const statsContent = await fs.readFile(statsCachePath, "utf-8"); + const stats = JSON.parse(statsContent); + + // Check if there's any activity (which means the CLI is authenticated and working) + if (stats.dailyActivity && stats.dailyActivity.length > 0) { + auth.hasRecentActivity = true; + auth.hasCliAuth = true; + auth.authenticated = true; + auth.method = "cli_authenticated"; + } + } catch { + // Stats file doesn't exist or is invalid + } + + // Check for settings.json - indicates CLI has been set up + const settingsPath = path.join(claudeDir, "settings.json"); + try { + await fs.access(settingsPath); + // If settings exist but no activity, CLI might be set up but not authenticated + if (!auth.hasCliAuth) { + // Try to check for other indicators of auth + const sessionsDir = path.join(claudeDir, "projects"); + try { + const sessions = await fs.readdir(sessionsDir); + if (sessions.length > 0) { + auth.hasCliAuth = true; + auth.authenticated = true; + auth.method = "cli_authenticated"; + } + } catch { + // Sessions directory doesn't exist + } + } + } catch { + // Settings file doesn't exist + } + + // Check for credentials file (OAuth tokens from claude login) - legacy/alternative auth + const credentialsPath = path.join(claudeDir, "credentials.json"); try { const credentialsContent = await fs.readFile(credentialsPath, "utf-8"); const credentials = JSON.parse(credentialsContent);