From 5745cb149f57a2c8b0ddd06b43f7c0cacf5ac2e0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 30 Jan 2026 21:29:56 +0000 Subject: [PATCH 01/69] docs: update README to v2.7.6-beta.1 [skip ci] --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index b1c1ad7d..4f8c4d1c 100644 --- a/README.md +++ b/README.md @@ -35,18 +35,18 @@ > ⚠️ Beta releases may contain bugs and breaking changes. [View all releases](https://github.com/AndyMik90/Auto-Claude/releases) -[![Beta](https://img.shields.io/badge/beta-2.7.2--beta.10-orange?style=flat-square)](https://github.com/AndyMik90/Auto-Claude/releases/tag/v2.7.2-beta.10) +[![Beta](https://img.shields.io/badge/beta-2.7.6--beta.1-orange?style=flat-square)](https://github.com/AndyMik90/Auto-Claude/releases/tag/v2.7.6-beta.1) | Platform | Download | |----------|----------| -| **Windows** | [Auto-Claude-2.7.2-beta.10-win32-x64.exe](https://github.com/AndyMik90/Auto-Claude/releases/download/v2.7.2-beta.10/Auto-Claude-2.7.2-beta.10-win32-x64.exe) | -| **macOS (Apple Silicon)** | [Auto-Claude-2.7.2-beta.10-darwin-arm64.dmg](https://github.com/AndyMik90/Auto-Claude/releases/download/v2.7.2-beta.10/Auto-Claude-2.7.2-beta.10-darwin-arm64.dmg) | -| **macOS (Intel)** | [Auto-Claude-2.7.2-beta.10-darwin-x64.dmg](https://github.com/AndyMik90/Auto-Claude/releases/download/v2.7.2-beta.10/Auto-Claude-2.7.2-beta.10-darwin-x64.dmg) | -| **Linux** | [Auto-Claude-2.7.2-beta.10-linux-x86_64.AppImage](https://github.com/AndyMik90/Auto-Claude/releases/download/v2.7.2-beta.10/Auto-Claude-2.7.2-beta.10-linux-x86_64.AppImage) | -| **Linux (Debian)** | [Auto-Claude-2.7.2-beta.10-linux-amd64.deb](https://github.com/AndyMik90/Auto-Claude/releases/download/v2.7.2-beta.10/Auto-Claude-2.7.2-beta.10-linux-amd64.deb) | -| **Linux (Flatpak)** | [Auto-Claude-2.7.2-beta.10-linux-x86_64.flatpak](https://github.com/AndyMik90/Auto-Claude/releases/download/v2.7.2-beta.10/Auto-Claude-2.7.2-beta.10-linux-x86_64.flatpak) | +| **Windows** | [Auto-Claude-2.7.6-beta.1-win32-x64.exe](https://github.com/AndyMik90/Auto-Claude/releases/download/v2.7.6-beta.1/Auto-Claude-2.7.6-beta.1-win32-x64.exe) | +| **macOS (Apple Silicon)** | [Auto-Claude-2.7.6-beta.1-darwin-arm64.dmg](https://github.com/AndyMik90/Auto-Claude/releases/download/v2.7.6-beta.1/Auto-Claude-2.7.6-beta.1-darwin-arm64.dmg) | +| **macOS (Intel)** | [Auto-Claude-2.7.6-beta.1-darwin-x64.dmg](https://github.com/AndyMik90/Auto-Claude/releases/download/v2.7.6-beta.1/Auto-Claude-2.7.6-beta.1-darwin-x64.dmg) | +| **Linux** | [Auto-Claude-2.7.6-beta.1-linux-x86_64.AppImage](https://github.com/AndyMik90/Auto-Claude/releases/download/v2.7.6-beta.1/Auto-Claude-2.7.6-beta.1-linux-x86_64.AppImage) | +| **Linux (Debian)** | [Auto-Claude-2.7.6-beta.1-linux-amd64.deb](https://github.com/AndyMik90/Auto-Claude/releases/download/v2.7.6-beta.1/Auto-Claude-2.7.6-beta.1-linux-amd64.deb) | +| **Linux (Flatpak)** | [Auto-Claude-2.7.6-beta.1-linux-x86_64.flatpak](https://github.com/AndyMik90/Auto-Claude/releases/download/v2.7.6-beta.1/Auto-Claude-2.7.6-beta.1-linux-x86_64.flatpak) | > All releases include SHA256 checksums and VirusTotal scan results for security verification. From 1a8f589f962f7b7b64f7dd9db3185c51441be551 Mon Sep 17 00:00:00 2001 From: AndyMik90 Date: Fri, 13 Feb 2026 23:42:24 +0100 Subject: [PATCH 02/69] auto-claude: subtask-1-1 - Add keepWorktree option to mark-as-done flow Add keepWorktree option to TASK_UPDATE_STATUS handler so marking a task as done bypasses the worktree existence check without deleting it. Update type definitions in task-api.ts and task-store.ts, and fix handleMarkDoneOnly in WorkspaceMessages.tsx to pass { keepWorktree: true } and check the result. Co-Authored-By: Claude Opus 4.6 --- .../src/main/ipc-handlers/task/execution-handlers.ts | 8 ++++++-- apps/frontend/src/preload/api/task-api.ts | 4 ++-- .../task-detail/task-review/WorkspaceMessages.tsx | 6 +++++- apps/frontend/src/renderer/stores/task-store.ts | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/apps/frontend/src/main/ipc-handlers/task/execution-handlers.ts b/apps/frontend/src/main/ipc-handlers/task/execution-handlers.ts index 95bcb9d8..d5bc9562 100644 --- a/apps/frontend/src/main/ipc-handlers/task/execution-handlers.ts +++ b/apps/frontend/src/main/ipc-handlers/task/execution-handlers.ts @@ -513,7 +513,7 @@ export function registerTaskExecutionHandlers( _, taskId: string, status: TaskStatus, - options?: { forceCleanup?: boolean } + options?: { forceCleanup?: boolean; keepWorktree?: boolean } ): Promise => { // Find task and project first (needed for worktree check) const { task, project } = findTaskAndProject(taskId); @@ -525,13 +525,17 @@ export function registerTaskExecutionHandlers( // Validate status transition - 'done' can only be set through merge handler // UNLESS there's no worktree (limbo state - already merged/discarded or failed) // OR forceCleanup is requested (user confirmed they want to delete the worktree) + // OR keepWorktree is requested (user wants to mark done without deleting worktree) if (status === 'done') { // Check if worktree exists (task.specId matches worktree folder name) const worktreePath = findTaskWorktree(project.path, task.specId); const hasWorktree = worktreePath !== null; if (hasWorktree) { - if (options?.forceCleanup) { + if (options?.keepWorktree) { + // User explicitly chose to keep worktree - allow marking as done + console.warn(`[TASK_UPDATE_STATUS] Marking task ${taskId} as done while keeping worktree at ${worktreePath}`); + } else if (options?.forceCleanup) { // User confirmed cleanup - delete worktree and branch console.warn(`[TASK_UPDATE_STATUS] Cleaning up worktree for task ${taskId} (user confirmed)`); try { diff --git a/apps/frontend/src/preload/api/task-api.ts b/apps/frontend/src/preload/api/task-api.ts index 857422fa..7d9b7e3a 100644 --- a/apps/frontend/src/preload/api/task-api.ts +++ b/apps/frontend/src/preload/api/task-api.ts @@ -44,7 +44,7 @@ export interface TaskAPI { updateTaskStatus: ( taskId: string, status: TaskStatus, - options?: { forceCleanup?: boolean } + options?: { forceCleanup?: boolean; keepWorktree?: boolean } ) => Promise; recoverStuckTask: ( taskId: string, @@ -135,7 +135,7 @@ export const createTaskAPI = (): TaskAPI => ({ updateTaskStatus: ( taskId: string, status: TaskStatus, - options?: { forceCleanup?: boolean } + options?: { forceCleanup?: boolean; keepWorktree?: boolean } ): Promise => ipcRenderer.invoke(IPC_CHANNELS.TASK_UPDATE_STATUS, taskId, status, options), diff --git a/apps/frontend/src/renderer/components/task-detail/task-review/WorkspaceMessages.tsx b/apps/frontend/src/renderer/components/task-detail/task-review/WorkspaceMessages.tsx index 29ac9f81..37886ba5 100644 --- a/apps/frontend/src/renderer/components/task-detail/task-review/WorkspaceMessages.tsx +++ b/apps/frontend/src/renderer/components/task-detail/task-review/WorkspaceMessages.tsx @@ -198,7 +198,11 @@ export function StagedInProjectMessage({ task, projectPath, hasWorktree = false, setError(null); try { - await persistTaskStatus(task.id, 'done'); + const result = await persistTaskStatus(task.id, 'done', { keepWorktree: true }); + if (!result.success) { + setError(result.error || 'Failed to mark as done'); + return; + } onClose?.(); } catch (err) { console.error('Error marking task as done:', err); diff --git a/apps/frontend/src/renderer/stores/task-store.ts b/apps/frontend/src/renderer/stores/task-store.ts index 6b28e88c..0358fb7a 100644 --- a/apps/frontend/src/renderer/stores/task-store.ts +++ b/apps/frontend/src/renderer/stores/task-store.ts @@ -789,7 +789,7 @@ export interface PersistStatusResult { export async function persistTaskStatus( taskId: string, status: TaskStatus, - options?: { forceCleanup?: boolean } + options?: { forceCleanup?: boolean; keepWorktree?: boolean } ): Promise { const store = useTaskStore.getState(); From cda21b2056f2a3d84cc019bec97f88f01d8f8175 Mon Sep 17 00:00:00 2001 From: AndyMik90 Date: Fri, 13 Feb 2026 23:46:12 +0100 Subject: [PATCH 03/69] auto-claude: subtask-1-1 - Add i18n translation keys for archive feature Add roadmap.archiveFeature and accessibility.archiveFeatureAriaLabel keys to both English and French locale files. Co-Authored-By: Claude Opus 4.6 --- apps/frontend/src/shared/i18n/locales/en/common.json | 4 +++- apps/frontend/src/shared/i18n/locales/fr/common.json | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/frontend/src/shared/i18n/locales/en/common.json b/apps/frontend/src/shared/i18n/locales/en/common.json index 8078a129..445ada21 100644 --- a/apps/frontend/src/shared/i18n/locales/en/common.json +++ b/apps/frontend/src/shared/i18n/locales/en/common.json @@ -11,6 +11,7 @@ }, "accessibility": { "deleteFeatureAriaLabel": "Delete feature", + "archiveFeatureAriaLabel": "Archive feature", "closeFeatureDetailsAriaLabel": "Close feature details", "regenerateRoadmapAriaLabel": "Regenerate Roadmap", "repositoryOwnerAriaLabel": "Repository owner", @@ -602,7 +603,8 @@ "taskArchived": "Archived", "showMoreFeatures": "Show {{count}} more feature", "showMoreFeatures_plural": "Show {{count}} more features", - "showLessFeatures": "Show less" + "showLessFeatures": "Show less", + "archiveFeature": "Archive" }, "roadmapGeneration": { "progress": "Progress", diff --git a/apps/frontend/src/shared/i18n/locales/fr/common.json b/apps/frontend/src/shared/i18n/locales/fr/common.json index d2c452b7..f59f2385 100644 --- a/apps/frontend/src/shared/i18n/locales/fr/common.json +++ b/apps/frontend/src/shared/i18n/locales/fr/common.json @@ -11,6 +11,7 @@ }, "accessibility": { "deleteFeatureAriaLabel": "Supprimer la fonctionnalité", + "archiveFeatureAriaLabel": "Archiver la fonctionnalité", "closeFeatureDetailsAriaLabel": "Fermer les détails de la fonctionnalité", "regenerateRoadmapAriaLabel": "Régénérer la feuille de route", "repositoryOwnerAriaLabel": "Propriétaire du dépôt", @@ -602,7 +603,8 @@ "taskArchived": "Archivé", "showMoreFeatures": "Afficher {{count}} fonctionnalité supplémentaire", "showMoreFeatures_plural": "Afficher {{count}} fonctionnalités supplémentaires", - "showLessFeatures": "Afficher moins" + "showLessFeatures": "Afficher moins", + "archiveFeature": "Archiver" }, "roadmapGeneration": { "progress": "Progression", From 3a5a9dbca9ca85ff024f4d73909e2e29c8ea033b Mon Sep 17 00:00:00 2001 From: AndyMik90 Date: Fri, 13 Feb 2026 23:46:58 +0100 Subject: [PATCH 04/69] auto-claude: subtask-1-2 - Create useFeatureArchive hook in hooks.ts Co-Authored-By: Claude Opus 4.6 --- .../src/renderer/components/roadmap/hooks.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/apps/frontend/src/renderer/components/roadmap/hooks.ts b/apps/frontend/src/renderer/components/roadmap/hooks.ts index a4a2b1c3..daa7cddb 100644 --- a/apps/frontend/src/renderer/components/roadmap/hooks.ts +++ b/apps/frontend/src/renderer/components/roadmap/hooks.ts @@ -114,6 +114,30 @@ export function useFeatureDelete(projectId: string) { return { deleteFeature: handleDeleteFeature }; } +/** + * Hook to archive features from roadmap (removes from view) + */ +export function useFeatureArchive(projectId: string) { + const deleteFeature = useRoadmapStore((state) => state.deleteFeature); + + const handleArchiveFeature = async (featureId: string) => { + // Remove from store + deleteFeature(featureId); + + // Persist to file + const roadmap = useRoadmapStore.getState().roadmap; + if (roadmap) { + try { + await window.electronAPI.saveRoadmap(projectId, roadmap); + } catch (error) { + console.error('Failed to save roadmap after archive:', error); + } + } + }; + + return { archiveFeature: handleArchiveFeature }; +} + /** * Hook to manage roadmap generation actions * From 9e89354d04db42f6f4f687ae55512285614613df Mon Sep 17 00:00:00 2001 From: AndyMik90 Date: Fri, 13 Feb 2026 23:47:49 +0100 Subject: [PATCH 05/69] auto-claude: subtask-1-3 - Update TypeScript interfaces to add onArchive callback prop Co-Authored-By: Claude Opus 4.6 --- apps/frontend/src/renderer/components/RoadmapKanbanView.tsx | 2 ++ apps/frontend/src/renderer/components/SortableFeatureCard.tsx | 1 + apps/frontend/src/renderer/components/roadmap/types.ts | 4 ++++ 3 files changed, 7 insertions(+) diff --git a/apps/frontend/src/renderer/components/RoadmapKanbanView.tsx b/apps/frontend/src/renderer/components/RoadmapKanbanView.tsx index 8269722b..6d7ef216 100644 --- a/apps/frontend/src/renderer/components/RoadmapKanbanView.tsx +++ b/apps/frontend/src/renderer/components/RoadmapKanbanView.tsx @@ -36,6 +36,7 @@ interface RoadmapKanbanViewProps { onConvertToSpec?: (feature: RoadmapFeature) => void; onGoToTask?: (specId: string) => void; onSave?: () => void; + onArchive?: (featureId: string) => void; } interface DroppableStatusColumnProps { @@ -45,6 +46,7 @@ interface DroppableStatusColumnProps { onFeatureClick: (feature: RoadmapFeature) => void; onConvertToSpec?: (feature: RoadmapFeature) => void; onGoToTask?: (specId: string) => void; + onArchive?: (featureId: string) => void; isOver: boolean; } diff --git a/apps/frontend/src/renderer/components/SortableFeatureCard.tsx b/apps/frontend/src/renderer/components/SortableFeatureCard.tsx index db15c925..951ac2b8 100644 --- a/apps/frontend/src/renderer/components/SortableFeatureCard.tsx +++ b/apps/frontend/src/renderer/components/SortableFeatureCard.tsx @@ -25,6 +25,7 @@ interface SortableFeatureCardProps { onClick: () => void; onConvertToSpec?: (feature: RoadmapFeature) => void; onGoToTask?: (specId: string) => void; + onArchive?: (featureId: string) => void; } export function SortableFeatureCard({ diff --git a/apps/frontend/src/renderer/components/roadmap/types.ts b/apps/frontend/src/renderer/components/roadmap/types.ts index abac41af..e7645c37 100644 --- a/apps/frontend/src/renderer/components/roadmap/types.ts +++ b/apps/frontend/src/renderer/components/roadmap/types.ts @@ -12,6 +12,7 @@ export interface PhaseCardProps { onFeatureSelect: (feature: RoadmapFeature) => void; onConvertToSpec: (feature: RoadmapFeature) => void; onGoToTask: (specId: string) => void; + onArchive?: (featureId: string) => void; } export interface FeatureCardProps { @@ -20,6 +21,7 @@ export interface FeatureCardProps { onConvertToSpec: (feature: RoadmapFeature) => void; onGoToTask: (specId: string) => void; hasCompetitorInsight?: boolean; + onArchive?: (featureId: string) => void; } export interface FeatureDetailPanelProps { @@ -28,6 +30,7 @@ export interface FeatureDetailPanelProps { onConvertToSpec: (feature: RoadmapFeature) => void; onGoToTask: (specId: string) => void; onDelete?: (featureId: string) => void; + onArchive?: (featureId: string) => void; competitorInsights?: CompetitorPainPoint[]; } @@ -51,4 +54,5 @@ export interface RoadmapTabsProps { onConvertToSpec: (feature: RoadmapFeature) => void; onGoToTask: (specId: string) => void; onSave?: () => void; + onArchive?: (featureId: string) => void; } From 557fda68c1be9f90913eae9a43c1fca03b1f86f4 Mon Sep 17 00:00:00 2001 From: AndyMik90 Date: Fri, 13 Feb 2026 23:49:04 +0100 Subject: [PATCH 06/69] auto-claude: subtask-2-1 - Wire useFeatureArchive in Roadmap.tsx Import and call useFeatureArchive hook alongside useFeatureDelete. Create handleArchiveFeature wrapper that archives the feature and clears selectedFeature if it matches. Pass onArchive prop to both RoadmapTabs and FeatureDetailPanel. Co-Authored-By: Claude Opus 4.6 --- apps/frontend/src/renderer/components/Roadmap.tsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/frontend/src/renderer/components/Roadmap.tsx b/apps/frontend/src/renderer/components/Roadmap.tsx index 1a5307e7..3549744e 100644 --- a/apps/frontend/src/renderer/components/Roadmap.tsx +++ b/apps/frontend/src/renderer/components/Roadmap.tsx @@ -8,7 +8,7 @@ import { RoadmapHeader } from './roadmap/RoadmapHeader'; import { RoadmapEmptyState } from './roadmap/RoadmapEmptyState'; import { RoadmapTabs } from './roadmap/RoadmapTabs'; import { FeatureDetailPanel } from './roadmap/FeatureDetailPanel'; -import { useRoadmapData, useFeatureActions, useRoadmapGeneration, useRoadmapSave, useFeatureDelete } from './roadmap/hooks'; +import { useRoadmapData, useFeatureActions, useRoadmapGeneration, useRoadmapSave, useFeatureDelete, useFeatureArchive } from './roadmap/hooks'; import { getCompetitorInsightsForFeature } from './roadmap/utils'; import type { RoadmapFeature } from '../../shared/types'; import type { RoadmapProps } from './roadmap/types'; @@ -25,6 +25,7 @@ export function Roadmap({ projectId, onGoToTask }: RoadmapProps) { const { convertFeatureToSpec } = useFeatureActions(); const { saveRoadmap } = useRoadmapSave(projectId); const { deleteFeature } = useFeatureDelete(projectId); + const { archiveFeature } = useFeatureArchive(projectId); const { competitorAnalysisDate, // New dialog for existing analysis @@ -54,6 +55,13 @@ export function Roadmap({ projectId, onGoToTask }: RoadmapProps) { } }; + const handleArchiveFeature = async (featureId: string) => { + await archiveFeature(featureId); + if (selectedFeature?.id === featureId) { + setSelectedFeature(null); + } + }; + // Show generation progress if (generationStatus.phase !== 'idle' && generationStatus.phase !== 'complete') { return ( @@ -114,6 +122,7 @@ export function Roadmap({ projectId, onGoToTask }: RoadmapProps) { onConvertToSpec={handleConvertToSpec} onGoToTask={handleGoToTask} onSave={saveRoadmap} + onArchive={handleArchiveFeature} /> @@ -125,6 +134,7 @@ export function Roadmap({ projectId, onGoToTask }: RoadmapProps) { onConvertToSpec={handleConvertToSpec} onGoToTask={handleGoToTask} onDelete={deleteFeature} + onArchive={handleArchiveFeature} competitorInsights={getCompetitorInsightsForFeature(selectedFeature, competitorAnalysis)} /> )} From 5027355a8e2fcef2a851c7337bda3004dbde7199 Mon Sep 17 00:00:00 2001 From: AndyMik90 Date: Fri, 13 Feb 2026 23:50:05 +0100 Subject: [PATCH 07/69] auto-claude: subtask-2-2 - Thread onArchive prop through RoadmapTabs.tsx Co-Authored-By: Claude Opus 4.6 --- apps/frontend/src/renderer/components/roadmap/RoadmapTabs.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/frontend/src/renderer/components/roadmap/RoadmapTabs.tsx b/apps/frontend/src/renderer/components/roadmap/RoadmapTabs.tsx index 56f2c5cd..de55fc3a 100644 --- a/apps/frontend/src/renderer/components/roadmap/RoadmapTabs.tsx +++ b/apps/frontend/src/renderer/components/roadmap/RoadmapTabs.tsx @@ -23,6 +23,7 @@ export function RoadmapTabs({ onFeatureSelect, onConvertToSpec, onGoToTask, + onArchive, onSave, }: RoadmapTabsProps) { return ( @@ -42,6 +43,7 @@ export function RoadmapTabs({ onFeatureClick={onFeatureSelect} onConvertToSpec={onConvertToSpec} onGoToTask={onGoToTask} + onArchive={onArchive} onSave={onSave} /> @@ -58,6 +60,7 @@ export function RoadmapTabs({ onFeatureSelect={onFeatureSelect} onConvertToSpec={onConvertToSpec} onGoToTask={onGoToTask} + onArchive={onArchive} /> ))} @@ -73,6 +76,7 @@ export function RoadmapTabs({ onClick={() => onFeatureSelect(feature)} onConvertToSpec={onConvertToSpec} onGoToTask={onGoToTask} + onArchive={onArchive} hasCompetitorInsight={hasCompetitorInsight(feature)} /> ))} From 432f6bd838d618e16542f31d2f3059f32f8ec129 Mon Sep 17 00:00:00 2001 From: AndyMik90 Date: Fri, 13 Feb 2026 23:51:01 +0100 Subject: [PATCH 08/69] auto-claude: subtask-2-3 - Thread onArchive prop through RoadmapKanbanView.tsx Co-Authored-By: Claude Opus 4.6 --- apps/frontend/src/renderer/components/RoadmapKanbanView.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/frontend/src/renderer/components/RoadmapKanbanView.tsx b/apps/frontend/src/renderer/components/RoadmapKanbanView.tsx index 6d7ef216..399d2ca3 100644 --- a/apps/frontend/src/renderer/components/RoadmapKanbanView.tsx +++ b/apps/frontend/src/renderer/components/RoadmapKanbanView.tsx @@ -73,6 +73,7 @@ function DroppableStatusColumn({ onFeatureClick, onConvertToSpec, onGoToTask, + onArchive, isOver }: DroppableStatusColumnProps) { const { setNodeRef } = useDroppable({ @@ -160,6 +161,7 @@ function DroppableStatusColumn({ onClick={() => onFeatureClick(feature)} onConvertToSpec={onConvertToSpec} onGoToTask={onGoToTask} + onArchive={onArchive} /> )) )} @@ -176,7 +178,8 @@ export function RoadmapKanbanView({ onFeatureClick, onConvertToSpec, onGoToTask, - onSave + onSave, + onArchive }: RoadmapKanbanViewProps) { const [activeFeature, setActiveFeature] = useState(null); const [overColumnId, setOverColumnId] = useState(null); @@ -302,6 +305,7 @@ export function RoadmapKanbanView({ onFeatureClick={onFeatureClick} onConvertToSpec={onConvertToSpec} onGoToTask={onGoToTask} + onArchive={onArchive} isOver={overColumnId === column.id} /> ))} From 3a74543a8c51eda9e46a6ef1c4fe45aa9ae8002b Mon Sep 17 00:00:00 2001 From: AndyMik90 Date: Fri, 13 Feb 2026 23:52:12 +0100 Subject: [PATCH 09/69] auto-claude: subtask-3-1 - Add archive button to FeatureCard.tsx Import Archive icon and useTranslation, destructure onArchive from props, render ghost archive button for done features with stopPropagation. Co-Authored-By: Claude Opus 4.6 --- .../components/roadmap/FeatureCard.tsx | 66 ++++++++++++------- 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/apps/frontend/src/renderer/components/roadmap/FeatureCard.tsx b/apps/frontend/src/renderer/components/roadmap/FeatureCard.tsx index 506f49f5..0a2dad73 100644 --- a/apps/frontend/src/renderer/components/roadmap/FeatureCard.tsx +++ b/apps/frontend/src/renderer/components/roadmap/FeatureCard.tsx @@ -1,4 +1,5 @@ -import { ExternalLink, Play, TrendingUp } from 'lucide-react'; +import { Archive, ExternalLink, Play, TrendingUp } from 'lucide-react'; +import { useTranslation } from 'react-i18next'; import { TaskOutcomeBadge, getTaskOutcomeColorClass } from './TaskOutcomeBadge'; import { Badge } from '../ui/badge'; import { Button } from '../ui/button'; @@ -17,8 +18,10 @@ export function FeatureCard({ onClick, onConvertToSpec, onGoToTask, + onArchive, hasCompetitorInsight = false, }: FeatureCardProps) { + const { t } = useTranslation(); return ( @@ -55,37 +58,52 @@ export function FeatureCard({

{feature.title}

{feature.description}

- {feature.taskOutcome ? ( - - - - ) : feature.linkedSpecId ? ( - - ) : ( - feature.status !== 'done' && ( +
+ {feature.taskOutcome ? ( + + + + ) : feature.linkedSpecId ? ( - ) - )} + ) : ( + feature.status !== 'done' && ( + + ) + )} + {feature.status === 'done' && onArchive && ( + + )} +
); From f1c530ad2f13d7be7f7afc0ff14c6a85d5d29a1c Mon Sep 17 00:00:00 2001 From: AndyMik90 Date: Fri, 13 Feb 2026 23:53:15 +0100 Subject: [PATCH 10/69] auto-claude: subtask-3-2 - Add archive button to SortableFeatureCard for done tasks Co-Authored-By: Claude Opus 4.6 --- .../components/SortableFeatureCard.tsx | 37 ++++++++++++++----- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/apps/frontend/src/renderer/components/SortableFeatureCard.tsx b/apps/frontend/src/renderer/components/SortableFeatureCard.tsx index 951ac2b8..bd36ba46 100644 --- a/apps/frontend/src/renderer/components/SortableFeatureCard.tsx +++ b/apps/frontend/src/renderer/components/SortableFeatureCard.tsx @@ -9,7 +9,8 @@ import { TooltipContent, TooltipTrigger } from './ui/tooltip'; -import { Play, ExternalLink, TrendingUp, Layers, ThumbsUp } from 'lucide-react'; +import { Play, ExternalLink, TrendingUp, Layers, ThumbsUp, Archive } from 'lucide-react'; +import { useTranslation } from 'react-i18next'; import { TaskOutcomeBadge, getTaskOutcomeColorClass } from './roadmap/TaskOutcomeBadge'; import { ROADMAP_PRIORITY_COLORS, @@ -33,8 +34,10 @@ export function SortableFeatureCard({ roadmap, onClick, onConvertToSpec, - onGoToTask + onGoToTask, + onArchive }: SortableFeatureCardProps) { + const { t } = useTranslation('tasks'); const { attributes, listeners, @@ -121,14 +124,30 @@ export function SortableFeatureCard({

{feature.title}

-
+
{feature.taskOutcome ? ( - - - + <> + + + + {feature.status === 'done' && onArchive && ( + + )} + ) : feature.linkedSpecId ? ( + )}
) : feature.linkedSpecId ? (
From c2db77fb5e8ed3a4d03c4ea1cec3a5f8dfddbfb0 Mon Sep 17 00:00:00 2001 From: AndyMik90 Date: Fri, 13 Feb 2026 23:55:32 +0100 Subject: [PATCH 12/69] auto-claude: subtask-3-4 - Add archive button to PhaseCard.tsx for done features Co-Authored-By: Claude Opus 4.6 --- .../renderer/components/roadmap/PhaseCard.tsx | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/apps/frontend/src/renderer/components/roadmap/PhaseCard.tsx b/apps/frontend/src/renderer/components/roadmap/PhaseCard.tsx index 08fe9001..85ef8a30 100644 --- a/apps/frontend/src/renderer/components/roadmap/PhaseCard.tsx +++ b/apps/frontend/src/renderer/components/roadmap/PhaseCard.tsx @@ -1,5 +1,5 @@ import { useState } from 'react'; -import { CheckCircle2, ChevronDown, ChevronUp, Circle, ExternalLink, Play, TrendingUp } from 'lucide-react'; +import { Archive, CheckCircle2, ChevronDown, ChevronUp, Circle, ExternalLink, Play, TrendingUp } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { TaskOutcomeBadge } from './TaskOutcomeBadge'; import { Badge } from '../ui/badge'; @@ -18,6 +18,7 @@ export function PhaseCard({ onFeatureSelect, onConvertToSpec, onGoToTask, + onArchive, }: PhaseCardProps) { const { t } = useTranslation('common'); const [isExpanded, setIsExpanded] = useState(false); @@ -118,11 +119,41 @@ export function PhaseCard({ )} {feature.taskOutcome ? ( - + + {onArchive && ( + + )} ) : feature.status === 'done' ? ( - + + + {onArchive && ( + + )} + ) : feature.linkedSpecId ? (
{feature.taskOutcome ? ( - <> - - - - {feature.status === 'done' && onArchive && ( - - )} - + + + ) : feature.linkedSpecId ? ( + )}
diff --git a/apps/frontend/src/renderer/components/roadmap/FeatureDetailPanel.tsx b/apps/frontend/src/renderer/components/roadmap/FeatureDetailPanel.tsx index 5a07e691..1320575b 100644 --- a/apps/frontend/src/renderer/components/roadmap/FeatureDetailPanel.tsx +++ b/apps/frontend/src/renderer/components/roadmap/FeatureDetailPanel.tsx @@ -247,7 +247,19 @@ export function FeatureDetailPanel({ ) : ( - feature.status !== 'done' && ( + feature.status === 'done' ? ( +
+ +
+ ) : (