mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-01-31 20:03:37 +00:00
- Added a React library for proper markdown formatting in the Agent Runner, improving the display of session messages. - Changed the hotkey for creating a new session from "W" to "N" to ensure consistency across new feature buttons. - Updated the feature list to include new entries for these enhancements, along with a detailed implementation roadmap in the project specification. These changes improve user experience by enhancing message readability and streamlining session management.
113 lines
3.2 KiB
JavaScript
113 lines
3.2 KiB
JavaScript
const { query, AbortError } = require("@anthropic-ai/claude-agent-sdk");
|
|
const promptBuilder = require("./prompt-builder");
|
|
|
|
/**
|
|
* Project Analyzer - Scans codebase and updates app_spec.txt
|
|
*/
|
|
class ProjectAnalyzer {
|
|
/**
|
|
* Run the project analysis using Claude Agent SDK
|
|
*/
|
|
async runProjectAnalysis(projectPath, analysisId, sendToRenderer, execution) {
|
|
console.log(`[ProjectAnalyzer] Running project analysis for: ${projectPath}`);
|
|
|
|
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: promptBuilder.getProjectAnalysisSystemPrompt(),
|
|
maxTurns: 50,
|
|
cwd: projectPath,
|
|
allowedTools: ["Read", "Write", "Edit", "Glob", "Grep", "Bash"],
|
|
permissionMode: "acceptEdits",
|
|
sandbox: {
|
|
enabled: true,
|
|
autoAllowBashIfSandboxed: true,
|
|
},
|
|
abortController: abortController,
|
|
};
|
|
|
|
const prompt = promptBuilder.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 (!execution.isActive()) 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("[ProjectAnalyzer] Project analysis aborted");
|
|
if (execution) {
|
|
execution.abortController = null;
|
|
execution.query = null;
|
|
}
|
|
return {
|
|
success: false,
|
|
message: "Analysis aborted",
|
|
};
|
|
}
|
|
|
|
console.error("[ProjectAnalyzer] Error in project analysis:", error);
|
|
if (execution) {
|
|
execution.abortController = null;
|
|
execution.query = null;
|
|
}
|
|
throw error;
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = new ProjectAnalyzer();
|