refactor: enhance type safety and error handling in navigation and project creation

- Updated navigation functions to cast route paths correctly, improving type safety.
- Added error handling for the templates API in project creation hooks to ensure robustness.
- Refactored task progress panel to improve type handling for feature data.
- Introduced type checks and default values in various components to enhance overall stability.

These changes improve the reliability and maintainability of the application, ensuring better user experience and code quality.
This commit is contained in:
DhanushSantosh
2026-01-06 20:46:06 +05:30
parent 27c6d5a3bb
commit 96f154d440
39 changed files with 241 additions and 172 deletions

View File

@@ -4,8 +4,11 @@ import type { Project, TrashedProject } from '@/lib/electron';
import type {
Feature as BaseFeature,
FeatureImagePath,
FeatureTextFilePath,
ModelAlias,
PlanningMode,
ThinkingLevel,
ModelProvider,
AIProfile,
CursorModelId,
PhaseModelConfig,
@@ -20,7 +23,15 @@ import type {
import { getAllCursorModelIds, DEFAULT_PHASE_MODELS } from '@automaker/types';
// Re-export types for convenience
export type { ThemeMode, ModelAlias };
export type {
ModelAlias,
PlanningMode,
ThinkingLevel,
ModelProvider,
AIProfile,
FeatureTextFilePath,
FeatureImagePath,
};
export type ViewMode =
| 'welcome'
@@ -567,6 +578,10 @@ export interface AppState {
claudeUsage: ClaudeUsage | null;
claudeUsageLastUpdated: number | null;
// Codex Usage Tracking
codexUsage: CodexUsage | null;
codexUsageLastUpdated: number | null;
// Pipeline Configuration (per-project, keyed by project path)
pipelineConfigByProject: Record<string, PipelineConfig>;
}
@@ -600,6 +615,41 @@ export type ClaudeUsage = {
// Response type for Claude usage API (can be success or error)
export type ClaudeUsageResponse = ClaudeUsage | { error: string; message?: string };
// Codex Usage types
export type CodexPlanType =
| 'free'
| 'plus'
| 'pro'
| 'team'
| 'business'
| 'enterprise'
| 'edu'
| 'unknown';
export interface CodexCreditsSnapshot {
balance?: string;
unlimited?: boolean;
hasCredits?: boolean;
}
export interface CodexRateLimitWindow {
limit: number;
used: number;
remaining: number;
window: number; // Duration in minutes
resetsAt: number; // Unix timestamp in seconds
}
export interface CodexUsage {
planType: CodexPlanType | null;
credits: CodexCreditsSnapshot | null;
rateLimits: {
session?: CodexRateLimitWindow;
weekly?: CodexRateLimitWindow;
} | null;
lastUpdated: string;
}
/**
* Check if Claude usage is at its limit (any of: session >= 100%, weekly >= 100%, OR cost >= limit)
* Returns true if any limit is reached, meaning auto mode should pause feature pickup.
@@ -928,6 +978,14 @@ export interface AppActions {
deletePipelineStep: (projectPath: string, stepId: string) => void;
reorderPipelineSteps: (projectPath: string, stepIds: string[]) => void;
// Claude Usage Tracking actions
setClaudeRefreshInterval: (interval: number) => void;
setClaudeUsageLastUpdated: (timestamp: number) => void;
setClaudeUsage: (usage: ClaudeUsage | null) => void;
// Codex Usage Tracking actions
setCodexUsage: (usage: CodexUsage | null) => void;
// Reset
reset: () => void;
}
@@ -1053,6 +1111,8 @@ const initialState: AppState = {
claudeRefreshInterval: 60,
claudeUsage: null,
claudeUsageLastUpdated: null,
codexUsage: null,
codexUsageLastUpdated: null,
pipelineConfigByProject: {},
};
@@ -2774,6 +2834,13 @@ export const useAppStore = create<AppState & AppActions>()(
claudeUsageLastUpdated: usage ? Date.now() : null,
}),
// Codex Usage Tracking actions
setCodexUsage: (usage: CodexUsage | null) =>
set({
codexUsage: usage,
codexUsageLastUpdated: usage ? Date.now() : null,
}),
// Pipeline actions
setPipelineConfig: (projectPath, config) => {
set({

View File

@@ -124,7 +124,7 @@ export interface SetupState {
cursorCliStatus: CursorCliStatus | null;
// Codex CLI state
codexCliStatus: CodexCliStatus | null;
codexCliStatus: CliStatus | null;
codexAuthStatus: CodexAuthStatus | null;
codexInstallProgress: InstallProgress;
@@ -153,7 +153,7 @@ export interface SetupActions {
setCursorCliStatus: (status: CursorCliStatus | null) => void;
// Codex CLI
setCodexCliStatus: (status: CodexCliStatus | null) => void;
setCodexCliStatus: (status: CliStatus | null) => void;
setCodexAuthStatus: (status: CodexAuthStatus | null) => void;
setCodexInstallProgress: (progress: Partial<InstallProgress>) => void;
resetCodexInstallProgress: () => void;