Merge remote-tracking branch 'origin/main' into feat/extend-models-support

# Conflicts:
#	.automaker/feature_list.json
#	app/src/components/views/board-view.tsx
#	app/src/components/views/kanban-column.tsx
#	app/src/components/views/settings-view.tsx
This commit is contained in:
Kacper
2025-12-10 03:03:07 +01:00
18 changed files with 1197 additions and 120 deletions

View File

@@ -174,6 +174,7 @@ export function BoardView() {
runningAutoTasks,
maxConcurrency,
setMaxConcurrency,
defaultSkipTests,
} = useAppStore();
const [activeFeature, setActiveFeature] = useState<Feature | null>(null);
const [editingFeature, setEditingFeature] = useState<Feature | null>(null);
@@ -411,6 +412,16 @@ export function BoardView() {
[currentProject, persistedCategories]
);
// Sync skipTests default when dialog opens
useEffect(() => {
if (showAddDialog) {
setNewFeature((prev) => ({
...prev,
skipTests: defaultSkipTests,
}));
}
}, [showAddDialog, defaultSkipTests]);
// Auto-show activity log when auto mode starts
useEffect(() => {
if (autoMode.isRunning && !showActivityLog) {
@@ -690,7 +701,7 @@ export function BoardView() {
steps: [""],
images: [],
imagePaths: [],
skipTests: false,
skipTests: defaultSkipTests,
model: "opus",
thinkingLevel: "none",
});
@@ -1378,7 +1389,6 @@ export function BoardView() {
title={column.title}
color={column.color}
count={columnFeatures.length}
isDoubleWidth={column.id === "in_progress"}
headerAction={
column.id === "verified" && columnFeatures.length > 0 ? (
<Button
@@ -1497,18 +1507,6 @@ export function BoardView() {
</DialogDescription>
</DialogHeader>
<div className="space-y-4 py-4 overflow-y-auto flex-1 min-h-0">
<div className="space-y-2">
<Label htmlFor="category">Category</Label>
<CategoryAutocomplete
value={newFeature.category}
onChange={(value) =>
setNewFeature({ ...newFeature, category: value })
}
suggestions={categorySuggestions}
placeholder="e.g., Core, UI, API"
data-testid="feature-category-input"
/>
</div>
<div className="space-y-2">
<Label htmlFor="description">Description</Label>
<DescriptionImageDropZone
@@ -1524,34 +1522,16 @@ export function BoardView() {
/>
</div>
<div className="space-y-2">
<Label>Steps</Label>
{newFeature.steps.map((step, index) => (
<Input
key={index}
placeholder={`Step ${index + 1}`}
value={step}
onChange={(e) => {
const steps = [...newFeature.steps];
steps[index] = e.target.value;
setNewFeature({ ...newFeature, steps });
}}
data-testid={`feature-step-${index}-input`}
/>
))}
<Button
variant="outline"
size="sm"
onClick={() =>
setNewFeature({
...newFeature,
steps: [...newFeature.steps, ""],
})
<Label htmlFor="category">Category (optional)</Label>
<CategoryAutocomplete
value={newFeature.category}
onChange={(value) =>
setNewFeature({ ...newFeature, category: value })
}
data-testid="add-step-button"
>
<Plus className="w-4 h-4 mr-2" />
Add Step
</Button>
suggestions={categorySuggestions}
placeholder="e.g., Core, UI, API"
data-testid="feature-category-input"
/>
</div>
<div className="flex items-center space-x-2">
<Checkbox
@@ -1675,6 +1655,40 @@ export function BoardView() {
</p>
</div>
)}
{/* Verification Steps - Only shown when skipTests is enabled */}
{newFeature.skipTests && (
<div className="space-y-2">
<Label>Verification Steps</Label>
{newFeature.steps.map((step, index) => (
<Input
key={index}
placeholder={`Verification step ${index + 1}`}
value={step}
onChange={(e) => {
const steps = [...newFeature.steps];
steps[index] = e.target.value;
setNewFeature({ ...newFeature, steps });
}}
data-testid={`feature-step-${index}-input`}
/>
))}
<Button
variant="outline"
size="sm"
onClick={() =>
setNewFeature({
...newFeature,
steps: [...newFeature.steps, ""],
})
}
data-testid="add-step-button"
>
<Plus className="w-4 h-4 mr-2" />
Add Verification Step
</Button>
</div>
)}
</div>
<DialogFooter>
<Button variant="ghost" onClick={() => setShowAddDialog(false)}>
@@ -1709,21 +1723,6 @@ export function BoardView() {
</DialogHeader>
{editingFeature && (
<div className="space-y-4 py-4 overflow-y-auto flex-1 min-h-0">
<div className="space-y-2">
<Label htmlFor="edit-category">Category</Label>
<CategoryAutocomplete
value={editingFeature.category}
onChange={(value) =>
setEditingFeature({
...editingFeature,
category: value,
})
}
suggestions={categorySuggestions}
placeholder="e.g., Core, UI, API"
data-testid="edit-feature-category"
/>
</div>
<div className="space-y-2">
<Label htmlFor="edit-description">Description</Label>
<Textarea
@@ -1740,32 +1739,19 @@ export function BoardView() {
/>
</div>
<div className="space-y-2">
<Label>Steps</Label>
{editingFeature.steps.map((step, index) => (
<Input
key={index}
value={step}
onChange={(e) => {
const steps = [...editingFeature.steps];
steps[index] = e.target.value;
setEditingFeature({ ...editingFeature, steps });
}}
data-testid={`edit-feature-step-${index}`}
/>
))}
<Button
variant="outline"
size="sm"
onClick={() =>
<Label htmlFor="edit-category">Category (optional)</Label>
<CategoryAutocomplete
value={editingFeature.category}
onChange={(value) =>
setEditingFeature({
...editingFeature,
steps: [...editingFeature.steps, ""],
category: value,
})
}
>
<Plus className="w-4 h-4 mr-2" />
Add Step
</Button>
suggestions={categorySuggestions}
placeholder="e.g., Core, UI, API"
data-testid="edit-feature-category"
/>
</div>
<div className="flex items-center space-x-2">
<Checkbox
@@ -1897,6 +1883,39 @@ export function BoardView() {
</p>
</div>
)}
{/* Verification Steps - Only shown when skipTests is enabled */}
{editingFeature.skipTests && (
<div className="space-y-2">
<Label>Verification Steps</Label>
{editingFeature.steps.map((step, index) => (
<Input
key={index}
value={step}
placeholder={`Verification step ${index + 1}`}
onChange={(e) => {
const steps = [...editingFeature.steps];
steps[index] = e.target.value;
setEditingFeature({ ...editingFeature, steps });
}}
data-testid={`edit-feature-step-${index}`}
/>
))}
<Button
variant="outline"
size="sm"
onClick={() =>
setEditingFeature({
...editingFeature,
steps: [...editingFeature.steps, ""],
})
}
>
<Plus className="w-4 h-4 mr-2" />
Add Verification Step
</Button>
</div>
)}
</div>
)}
<DialogFooter>