-
-
- {formatModelName(feature.model ?? DEFAULT_MODEL)}
-
- {agentInfo.currentPhase && (
-
- {agentInfo.currentPhase}
+ <>
+
+ {/* Model & Phase */}
+
+
+
+ {formatModelName(feature.model ?? DEFAULT_MODEL)}
- )}
-
-
- {/* Task List Progress */}
- {agentInfo.todos.length > 0 && (
-
-
-
-
- {agentInfo.todos.filter((t) => t.status === 'completed').length}/
- {agentInfo.todos.length} tasks
-
-
-
- {agentInfo.todos.slice(0, 3).map((todo, idx) => (
-
- {todo.status === 'completed' ? (
-
- ) : todo.status === 'in_progress' ? (
-
- ) : (
-
- )}
-
- {todo.content}
-
-
- ))}
- {agentInfo.todos.length > 3 && (
-
- +{agentInfo.todos.length - 3} more
-
- )}
-
-
- )}
-
- {/* Summary for waiting_approval and verified */}
- {(feature.status === 'waiting_approval' || feature.status === 'verified') && (
- <>
- {(feature.summary || summary || agentInfo.summary) && (
-
-
-
-
- Summary
-
-
-
-
- {feature.summary || summary || agentInfo.summary}
-
+ {agentInfo.currentPhase && (
+
+ {agentInfo.currentPhase}
)}
- {!feature.summary && !summary && !agentInfo.summary && agentInfo.toolCallCount > 0 && (
-
-
-
- {agentInfo.toolCallCount} tool calls
+
+
+ {/* Task List Progress */}
+ {agentInfo.todos.length > 0 && (
+
+
+
+
+ {agentInfo.todos.filter((t) => t.status === 'completed').length}/
+ {agentInfo.todos.length} tasks
- {agentInfo.todos.length > 0 && (
-
-
- {agentInfo.todos.filter((t) => t.status === 'completed').length} tasks done
-
+
+
+ {agentInfo.todos.slice(0, 3).map((todo, idx) => (
+
+ {todo.status === 'completed' ? (
+
+ ) : todo.status === 'in_progress' ? (
+
+ ) : (
+
+ )}
+
+ {todo.content}
+
+
+ ))}
+ {agentInfo.todos.length > 3 && (
+
+ +{agentInfo.todos.length - 3} more
+
)}
- )}
- >
- )}
-
+
+ )}
+
+ {/* Summary for waiting_approval and verified */}
+ {(feature.status === 'waiting_approval' || feature.status === 'verified') && (
+ <>
+ {(feature.summary || summary || agentInfo.summary) && (
+
+
+
+
+ Summary
+
+
+
+
+ {feature.summary || summary || agentInfo.summary}
+
+
+ )}
+ {!feature.summary &&
+ !summary &&
+ !agentInfo.summary &&
+ agentInfo.toolCallCount > 0 && (
+
+
+
+ {agentInfo.toolCallCount} tool calls
+
+ {agentInfo.todos.length > 0 && (
+
+
+ {agentInfo.todos.filter((t) => t.status === 'completed').length} tasks done
+
+ )}
+
+ )}
+ >
+ )}
+
+ {/* SummaryDialog must be rendered alongside the expand button */}
+
+ >
);
}
diff --git a/apps/ui/src/components/views/board-view/components/kanban-card/card-content-sections.tsx b/apps/ui/src/components/views/board-view/components/kanban-card/card-content-sections.tsx
index b360ffde..3a49769b 100644
--- a/apps/ui/src/components/views/board-view/components/kanban-card/card-content-sections.tsx
+++ b/apps/ui/src/components/views/board-view/components/kanban-card/card-content-sections.tsx
@@ -1,17 +1,12 @@
import { Feature } from '@/store/app-store';
-import { GitBranch, GitPullRequest, ExternalLink, CheckCircle2, Circle } from 'lucide-react';
+import { GitBranch, GitPullRequest, ExternalLink } from 'lucide-react';
interface CardContentSectionsProps {
feature: Feature;
useWorktrees: boolean;
- showSteps: boolean;
}
-export function CardContentSections({
- feature,
- useWorktrees,
- showSteps,
-}: CardContentSectionsProps) {
+export function CardContentSections({ feature, useWorktrees }: CardContentSectionsProps) {
return (
<>
{/* Target Branch Display */}
@@ -50,30 +45,6 @@ export function CardContentSections({
);
})()}
-
- {/* Steps Preview */}
- {showSteps && feature.steps && feature.steps.length > 0 && (
-
- {feature.steps.slice(0, 3).map((step, index) => (
-
- {feature.status === 'verified' ? (
-
- ) : (
-
- )}
- {step}
-
- ))}
- {feature.steps.length > 3 && (
-
- +{feature.steps.length - 3} more
-
- )}
-
- )}
>
);
}
diff --git a/apps/ui/src/components/views/board-view/components/kanban-card/kanban-card.tsx b/apps/ui/src/components/views/board-view/components/kanban-card/kanban-card.tsx
index abeb4e7f..7a610aab 100644
--- a/apps/ui/src/components/views/board-view/components/kanban-card/kanban-card.tsx
+++ b/apps/ui/src/components/views/board-view/components/kanban-card/kanban-card.tsx
@@ -61,9 +61,7 @@ export const KanbanCard = memo(function KanbanCard({
cardBorderEnabled = true,
cardBorderOpacity = 100,
}: KanbanCardProps) {
- const { kanbanCardDetailLevel, useWorktrees } = useAppStore();
-
- const showSteps = kanbanCardDetailLevel === 'standard' || kanbanCardDetailLevel === 'detailed';
+ const { useWorktrees } = useAppStore();
const isDraggable =
feature.status === 'backlog' ||
@@ -152,7 +150,7 @@ export const KanbanCard = memo(function KanbanCard({
{/* Content Sections */}
-
+
{/* Agent Info Panel */}
s.trim()),
images: newFeature.images,
imagePaths: newFeature.imagePaths,
textFilePaths: newFeature.textFilePaths,
@@ -211,7 +208,6 @@ export function AddFeatureDialog({
title: '',
category: '',
description: '',
- steps: [''],
images: [],
imagePaths: [],
textFilePaths: [],
@@ -502,8 +498,6 @@ export function AddFeatureDialog({
setNewFeature({ ...newFeature, skipTests })}
- steps={newFeature.steps}
- onStepsChange={(steps) => setNewFeature({ ...newFeature, steps })}
/>
diff --git a/apps/ui/src/components/views/board-view/dialogs/edit-feature-dialog.tsx b/apps/ui/src/components/views/board-view/dialogs/edit-feature-dialog.tsx
index d7f9e5ac..bcf68150 100644
--- a/apps/ui/src/components/views/board-view/dialogs/edit-feature-dialog.tsx
+++ b/apps/ui/src/components/views/board-view/dialogs/edit-feature-dialog.tsx
@@ -64,7 +64,6 @@ interface EditFeatureDialogProps {
title: string;
category: string;
description: string;
- steps: string[];
skipTests: boolean;
model: AgentModel;
thinkingLevel: ThinkingLevel;
@@ -165,7 +164,6 @@ export function EditFeatureDialog({
title: editingFeature.title ?? '',
category: editingFeature.category,
description: editingFeature.description,
- steps: editingFeature.steps,
skipTests: editingFeature.skipTests ?? false,
model: selectedModel,
thinkingLevel: normalizedThinking,
@@ -491,8 +489,6 @@ export function EditFeatureDialog({
setEditingFeature({ ...editingFeature, skipTests })}
- steps={editingFeature.steps}
- onStepsChange={(steps) => setEditingFeature({ ...editingFeature, steps })}
testIdPrefix="edit"
/>
diff --git a/apps/ui/src/components/views/board-view/dialogs/feature-suggestions-dialog.tsx b/apps/ui/src/components/views/board-view/dialogs/feature-suggestions-dialog.tsx
index 22067264..3af13bfa 100644
--- a/apps/ui/src/components/views/board-view/dialogs/feature-suggestions-dialog.tsx
+++ b/apps/ui/src/components/views/board-view/dialogs/feature-suggestions-dialog.tsx
@@ -245,7 +245,6 @@ export function FeatureSuggestionsDialog({
id: `feature-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
category: s.category,
description: s.description,
- steps: s.steps,
status: 'backlog' as const,
skipTests: true, // As specified, testing mode true
priority: s.priority, // Preserve priority from suggestion
@@ -453,23 +452,9 @@ export function FeatureSuggestionsDialog({
{suggestion.description}
- {isExpanded && (
-
- {suggestion.reasoning && (
-
{suggestion.reasoning}
- )}
- {suggestion.steps.length > 0 && (
-
-
- Implementation Steps:
-
-
- {suggestion.steps.map((step, i) => (
- - {step}
- ))}
-
-
- )}
+ {isExpanded && suggestion.reasoning && (
+
)}
diff --git a/apps/ui/src/components/views/board-view/hooks/use-board-actions.ts b/apps/ui/src/components/views/board-view/hooks/use-board-actions.ts
index e58079ac..97bb47a6 100644
--- a/apps/ui/src/components/views/board-view/hooks/use-board-actions.ts
+++ b/apps/ui/src/components/views/board-view/hooks/use-board-actions.ts
@@ -89,7 +89,6 @@ export function useBoardActions({
title: string;
category: string;
description: string;
- steps: string[];
images: FeatureImage[];
imagePaths: DescriptionImagePath[];
skipTests: boolean;
@@ -208,7 +207,6 @@ export function useBoardActions({
title: string;
category: string;
description: string;
- steps: string[];
skipTests: boolean;
model: AgentModel;
thinkingLevel: ThinkingLevel;
diff --git a/apps/ui/src/components/views/board-view/shared/testing-tab-content.tsx b/apps/ui/src/components/views/board-view/shared/testing-tab-content.tsx
index 68be2107..1e6139f4 100644
--- a/apps/ui/src/components/views/board-view/shared/testing-tab-content.tsx
+++ b/apps/ui/src/components/views/board-view/shared/testing-tab-content.tsx
@@ -1,36 +1,20 @@
-import { Button } from '@/components/ui/button';
-import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { Checkbox } from '@/components/ui/checkbox';
-import { FlaskConical, Plus } from 'lucide-react';
+import { FlaskConical } from 'lucide-react';
interface TestingTabContentProps {
skipTests: boolean;
onSkipTestsChange: (skipTests: boolean) => void;
- steps: string[];
- onStepsChange: (steps: string[]) => void;
testIdPrefix?: string;
}
export function TestingTabContent({
skipTests,
onSkipTestsChange,
- steps,
- onStepsChange,
testIdPrefix = '',
}: TestingTabContentProps) {
const checkboxId = testIdPrefix ? `${testIdPrefix}-skip-tests` : 'skip-tests';
- const handleStepChange = (index: number, value: string) => {
- const newSteps = [...steps];
- newSteps[index] = value;
- onStepsChange(newSteps);
- };
-
- const handleAddStep = () => {
- onStepsChange([...steps, '']);
- };
-
return (
@@ -48,37 +32,9 @@ export function TestingTabContent({
- When enabled, this feature will use automated TDD. When disabled, it will require manual
- verification.
+ When enabled, the agent will use Playwright to verify the feature works correctly before
+ marking it as verified. When disabled, manual verification will be required.
-
- {/* Verification Steps - Only shown when skipTests is enabled */}
- {skipTests && (
-
-
-
- Add manual steps to verify this feature works correctly.
-
- {steps.map((step, index) => (
-
handleStepChange(index, e.target.value)}
- data-testid={`${testIdPrefix ? testIdPrefix + '-' : ''}feature-step-${index}${testIdPrefix ? '' : '-input'}`}
- />
- ))}
-
-
- )}
);
}
diff --git a/apps/ui/src/components/views/github-issues-view.tsx b/apps/ui/src/components/views/github-issues-view.tsx
new file mode 100644
index 00000000..3d254cb2
--- /dev/null
+++ b/apps/ui/src/components/views/github-issues-view.tsx
@@ -0,0 +1,334 @@
+import { useState, useEffect, useCallback } from 'react';
+import { CircleDot, Loader2, RefreshCw, ExternalLink, CheckCircle2, Circle, X } from 'lucide-react';
+import { getElectronAPI, GitHubIssue } from '@/lib/electron';
+import { useAppStore } from '@/store/app-store';
+import { Button } from '@/components/ui/button';
+import { cn } from '@/lib/utils';
+
+export function GitHubIssuesView() {
+ const [openIssues, setOpenIssues] = useState