mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-01-30 22:32:04 +00:00
- Refactored AutoModeService to delegate tasks to specialized services: featureLoader, featureExecutor, featureVerifier, contextManager, and projectAnalyzer.
- Implemented feature verification logic in a new FeatureVerifier service, which runs tests and updates feature status.
- Added ProjectAnalyzer service to scan project structure and update app_spec.txt.
- Removed obsolete methods related to feature loading and context management from AutoModeService.
- Updated feature status handling to ensure context files are deleted when features are verified.
This refactor enhances modularity and maintainability of the codebase, allowing for better separation of concerns in feature management.
🤖 Generated with Claude Code
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", "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();
|