mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-01-31 06:42:03 +00:00
- Introduced a new endpoint `/resume-interrupted` to handle resuming features that were interrupted during server restarts. - Implemented the `createResumeInterruptedHandler` to check for and resume interrupted features based on the project path. - Enhanced the `AutoModeService` to track and manage the execution state of features, ensuring they can be resumed correctly. - Updated relevant types and prompts to include the new 'ux-reviewer' enhancement mode for better user experience handling. - Added new templates for UX review and other enhancement modes to improve task descriptions from a user experience perspective.
399 lines
13 KiB
TypeScript
399 lines
13 KiB
TypeScript
/**
|
|
* Automaker Paths - Utilities for managing automaker data storage
|
|
*
|
|
* Provides functions to construct paths for:
|
|
* - Project-level data stored in {projectPath}/.automaker/
|
|
* - Global user data stored in app userData directory
|
|
*
|
|
* All returned paths are absolute and ready to use with fs module.
|
|
* Directory creation is handled separately by ensure* functions.
|
|
*/
|
|
|
|
import * as secureFs from './secure-fs.js';
|
|
import path from 'path';
|
|
|
|
/**
|
|
* Get the automaker data directory root for a project
|
|
*
|
|
* All project-specific automaker data is stored under {projectPath}/.automaker/
|
|
* This directory is created when needed via ensureAutomakerDir().
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @returns Absolute path to {projectPath}/.automaker
|
|
*/
|
|
export function getAutomakerDir(projectPath: string): string {
|
|
return path.join(projectPath, '.automaker');
|
|
}
|
|
|
|
/**
|
|
* Get the features directory for a project
|
|
*
|
|
* Contains subdirectories for each feature, keyed by featureId.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @returns Absolute path to {projectPath}/.automaker/features
|
|
*/
|
|
export function getFeaturesDir(projectPath: string): string {
|
|
return path.join(getAutomakerDir(projectPath), 'features');
|
|
}
|
|
|
|
/**
|
|
* Get the directory for a specific feature
|
|
*
|
|
* Contains feature-specific data like generated code, tests, and logs.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @param featureId - Feature identifier
|
|
* @returns Absolute path to {projectPath}/.automaker/features/{featureId}
|
|
*/
|
|
export function getFeatureDir(projectPath: string, featureId: string): string {
|
|
return path.join(getFeaturesDir(projectPath), featureId);
|
|
}
|
|
|
|
/**
|
|
* Get the images directory for a feature
|
|
*
|
|
* Stores screenshots, diagrams, or other images related to the feature.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @param featureId - Feature identifier
|
|
* @returns Absolute path to {projectPath}/.automaker/features/{featureId}/images
|
|
*/
|
|
export function getFeatureImagesDir(projectPath: string, featureId: string): string {
|
|
return path.join(getFeatureDir(projectPath, featureId), 'images');
|
|
}
|
|
|
|
/**
|
|
* Get the board directory for a project
|
|
*
|
|
* Contains board-related data like background images and customization files.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @returns Absolute path to {projectPath}/.automaker/board
|
|
*/
|
|
export function getBoardDir(projectPath: string): string {
|
|
return path.join(getAutomakerDir(projectPath), 'board');
|
|
}
|
|
|
|
/**
|
|
* Get the general images directory for a project
|
|
*
|
|
* Stores project-level images like background images or shared assets.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @returns Absolute path to {projectPath}/.automaker/images
|
|
*/
|
|
export function getImagesDir(projectPath: string): string {
|
|
return path.join(getAutomakerDir(projectPath), 'images');
|
|
}
|
|
|
|
/**
|
|
* Get the context files directory for a project
|
|
*
|
|
* Stores user-uploaded context files for reference during generation.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @returns Absolute path to {projectPath}/.automaker/context
|
|
*/
|
|
export function getContextDir(projectPath: string): string {
|
|
return path.join(getAutomakerDir(projectPath), 'context');
|
|
}
|
|
|
|
/**
|
|
* Get the worktrees metadata directory for a project
|
|
*
|
|
* Stores information about git worktrees associated with the project.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @returns Absolute path to {projectPath}/.automaker/worktrees
|
|
*/
|
|
export function getWorktreesDir(projectPath: string): string {
|
|
return path.join(getAutomakerDir(projectPath), 'worktrees');
|
|
}
|
|
|
|
/**
|
|
* Get the validations directory for a project
|
|
*
|
|
* Stores GitHub issue validation results, organized by issue number.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @returns Absolute path to {projectPath}/.automaker/validations
|
|
*/
|
|
export function getValidationsDir(projectPath: string): string {
|
|
return path.join(getAutomakerDir(projectPath), 'validations');
|
|
}
|
|
|
|
/**
|
|
* Get the directory for a specific issue validation
|
|
*
|
|
* Contains validation result and metadata for a GitHub issue.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @param issueNumber - GitHub issue number
|
|
* @returns Absolute path to {projectPath}/.automaker/validations/{issueNumber}
|
|
*/
|
|
export function getValidationDir(projectPath: string, issueNumber: number): string {
|
|
return path.join(getValidationsDir(projectPath), String(issueNumber));
|
|
}
|
|
|
|
/**
|
|
* Get the validation result file path for a GitHub issue
|
|
*
|
|
* Stores the JSON validation result including verdict, analysis, and metadata.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @param issueNumber - GitHub issue number
|
|
* @returns Absolute path to {projectPath}/.automaker/validations/{issueNumber}/validation.json
|
|
*/
|
|
export function getValidationPath(projectPath: string, issueNumber: number): string {
|
|
return path.join(getValidationDir(projectPath, issueNumber), 'validation.json');
|
|
}
|
|
|
|
/**
|
|
* Get the app spec file path for a project
|
|
*
|
|
* Stores the application specification document used for generation.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @returns Absolute path to {projectPath}/.automaker/app_spec.txt
|
|
*/
|
|
export function getAppSpecPath(projectPath: string): string {
|
|
return path.join(getAutomakerDir(projectPath), 'app_spec.txt');
|
|
}
|
|
|
|
/**
|
|
* Get the branch tracking file path for a project
|
|
*
|
|
* Stores JSON metadata about active git branches and worktrees.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @returns Absolute path to {projectPath}/.automaker/active-branches.json
|
|
*/
|
|
export function getBranchTrackingPath(projectPath: string): string {
|
|
return path.join(getAutomakerDir(projectPath), 'active-branches.json');
|
|
}
|
|
|
|
/**
|
|
* Get the execution state file path for a project
|
|
*
|
|
* Stores JSON metadata about auto-mode execution state for recovery on restart.
|
|
* Tracks which features were running and auto-loop configuration.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @returns Absolute path to {projectPath}/.automaker/execution-state.json
|
|
*/
|
|
export function getExecutionStatePath(projectPath: string): string {
|
|
return path.join(getAutomakerDir(projectPath), 'execution-state.json');
|
|
}
|
|
|
|
/**
|
|
* Create the automaker directory structure for a project if it doesn't exist
|
|
*
|
|
* Creates {projectPath}/.automaker with all subdirectories recursively.
|
|
* Safe to call multiple times - uses recursive: true.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @returns Promise resolving to the created automaker directory path
|
|
*/
|
|
export async function ensureAutomakerDir(projectPath: string): Promise<string> {
|
|
const automakerDir = getAutomakerDir(projectPath);
|
|
await secureFs.mkdir(automakerDir, { recursive: true });
|
|
return automakerDir;
|
|
}
|
|
|
|
// ============================================================================
|
|
// Ideation Paths
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Get the ideation directory for a project
|
|
*
|
|
* Contains ideas, sessions, and drafts for brainstorming.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @returns Absolute path to {projectPath}/.automaker/ideation
|
|
*/
|
|
export function getIdeationDir(projectPath: string): string {
|
|
return path.join(getAutomakerDir(projectPath), 'ideation');
|
|
}
|
|
|
|
/**
|
|
* Get the ideas directory for a project
|
|
*
|
|
* Contains subdirectories for each idea, keyed by ideaId.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @returns Absolute path to {projectPath}/.automaker/ideation/ideas
|
|
*/
|
|
export function getIdeasDir(projectPath: string): string {
|
|
return path.join(getIdeationDir(projectPath), 'ideas');
|
|
}
|
|
|
|
/**
|
|
* Get the directory for a specific idea
|
|
*
|
|
* Contains idea metadata and attachments.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @param ideaId - Idea identifier
|
|
* @returns Absolute path to {projectPath}/.automaker/ideation/ideas/{ideaId}
|
|
*/
|
|
export function getIdeaDir(projectPath: string, ideaId: string): string {
|
|
return path.join(getIdeasDir(projectPath), ideaId);
|
|
}
|
|
|
|
/**
|
|
* Get the idea metadata file path
|
|
*
|
|
* Stores the idea JSON data.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @param ideaId - Idea identifier
|
|
* @returns Absolute path to {projectPath}/.automaker/ideation/ideas/{ideaId}/idea.json
|
|
*/
|
|
export function getIdeaPath(projectPath: string, ideaId: string): string {
|
|
return path.join(getIdeaDir(projectPath, ideaId), 'idea.json');
|
|
}
|
|
|
|
/**
|
|
* Get the idea attachments directory
|
|
*
|
|
* Stores images and other attachments for an idea.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @param ideaId - Idea identifier
|
|
* @returns Absolute path to {projectPath}/.automaker/ideation/ideas/{ideaId}/attachments
|
|
*/
|
|
export function getIdeaAttachmentsDir(projectPath: string, ideaId: string): string {
|
|
return path.join(getIdeaDir(projectPath, ideaId), 'attachments');
|
|
}
|
|
|
|
/**
|
|
* Get the ideation sessions directory for a project
|
|
*
|
|
* Contains conversation history for ideation sessions.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @returns Absolute path to {projectPath}/.automaker/ideation/sessions
|
|
*/
|
|
export function getIdeationSessionsDir(projectPath: string): string {
|
|
return path.join(getIdeationDir(projectPath), 'sessions');
|
|
}
|
|
|
|
/**
|
|
* Get the session file path for an ideation session
|
|
*
|
|
* Stores the session messages and metadata.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @param sessionId - Session identifier
|
|
* @returns Absolute path to {projectPath}/.automaker/ideation/sessions/{sessionId}.json
|
|
*/
|
|
export function getIdeationSessionPath(projectPath: string, sessionId: string): string {
|
|
return path.join(getIdeationSessionsDir(projectPath), `${sessionId}.json`);
|
|
}
|
|
|
|
/**
|
|
* Get the ideation drafts directory for a project
|
|
*
|
|
* Stores unsaved conversation drafts.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @returns Absolute path to {projectPath}/.automaker/ideation/drafts
|
|
*/
|
|
export function getIdeationDraftsDir(projectPath: string): string {
|
|
return path.join(getIdeationDir(projectPath), 'drafts');
|
|
}
|
|
|
|
/**
|
|
* Get the project analysis result file path
|
|
*
|
|
* Stores the cached project analysis result.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @returns Absolute path to {projectPath}/.automaker/ideation/analysis.json
|
|
*/
|
|
export function getIdeationAnalysisPath(projectPath: string): string {
|
|
return path.join(getIdeationDir(projectPath), 'analysis.json');
|
|
}
|
|
|
|
/**
|
|
* Create the ideation directory structure for a project if it doesn't exist
|
|
*
|
|
* Creates {projectPath}/.automaker/ideation with all subdirectories.
|
|
* Safe to call multiple times - uses recursive: true.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @returns Promise resolving to the created ideation directory path
|
|
*/
|
|
export async function ensureIdeationDir(projectPath: string): Promise<string> {
|
|
const ideationDir = getIdeationDir(projectPath);
|
|
await secureFs.mkdir(ideationDir, { recursive: true });
|
|
await secureFs.mkdir(getIdeasDir(projectPath), { recursive: true });
|
|
await secureFs.mkdir(getIdeationSessionsDir(projectPath), { recursive: true });
|
|
await secureFs.mkdir(getIdeationDraftsDir(projectPath), { recursive: true });
|
|
return ideationDir;
|
|
}
|
|
|
|
// ============================================================================
|
|
// Global Settings Paths (stored in DATA_DIR from app.getPath('userData'))
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Get the global settings file path
|
|
*
|
|
* Stores user preferences, keyboard shortcuts, AI profiles, and project history.
|
|
* Located in the platform-specific userData directory.
|
|
*
|
|
* Default locations:
|
|
* - macOS: ~/Library/Application Support/automaker
|
|
* - Windows: %APPDATA%\automaker
|
|
* - Linux: ~/.config/automaker
|
|
*
|
|
* @param dataDir - User data directory (from app.getPath('userData'))
|
|
* @returns Absolute path to {dataDir}/settings.json
|
|
*/
|
|
export function getGlobalSettingsPath(dataDir: string): string {
|
|
return path.join(dataDir, 'settings.json');
|
|
}
|
|
|
|
/**
|
|
* Get the credentials file path
|
|
*
|
|
* Stores sensitive API keys separately from other settings for security.
|
|
* Located in the platform-specific userData directory.
|
|
*
|
|
* @param dataDir - User data directory (from app.getPath('userData'))
|
|
* @returns Absolute path to {dataDir}/credentials.json
|
|
*/
|
|
export function getCredentialsPath(dataDir: string): string {
|
|
return path.join(dataDir, 'credentials.json');
|
|
}
|
|
|
|
/**
|
|
* Get the project settings file path
|
|
*
|
|
* Stores project-specific settings that override global settings.
|
|
* Located within the project's .automaker directory.
|
|
*
|
|
* @param projectPath - Absolute path to project directory
|
|
* @returns Absolute path to {projectPath}/.automaker/settings.json
|
|
*/
|
|
export function getProjectSettingsPath(projectPath: string): string {
|
|
return path.join(getAutomakerDir(projectPath), 'settings.json');
|
|
}
|
|
|
|
/**
|
|
* Create the global data directory if it doesn't exist
|
|
*
|
|
* Creates the userData directory for storing global settings and credentials.
|
|
* Safe to call multiple times - uses recursive: true.
|
|
*
|
|
* @param dataDir - User data directory path to create
|
|
* @returns Promise resolving to the created data directory path
|
|
*/
|
|
export async function ensureDataDir(dataDir: string): Promise<string> {
|
|
await secureFs.mkdir(dataDir, { recursive: true });
|
|
return dataDir;
|
|
}
|