Skip to content

Commit e43d839

Browse files
committed
Self-review
1 parent 7dd0fb1 commit e43d839

File tree

9 files changed

+80
-47
lines changed

9 files changed

+80
-47
lines changed

media/shorthand-logo.svg

Lines changed: 1 addition & 1 deletion
Loading

media/tasks-logo.svg

Lines changed: 2 additions & 2 deletions
Loading

packages/shared/src/tasks/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@ export type { Preset, Task, TaskLogEntry, TaskState, TaskStatus, Template };
1717
export interface TaskTemplate {
1818
id: string;
1919
name: string;
20-
displayName: string;
21-
icon: string;
20+
description: string;
2221
activeVersionId: string;
2322
presets: TaskPreset[];
2423
}
2524

2625
export interface TaskPreset {
2726
id: string;
2827
name: string;
28+
description: string;
2929
isDefault: boolean;
3030
}
3131

packages/tasks/src/components/CreateTaskSection.tsx

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { useTasksApi } from "../hooks/useTasksApi";
1010

1111
import { PromptInput } from "./PromptInput";
1212

13-
import type { CreateTaskParams, TaskTemplate } from "@repo/shared";
13+
import type { CreateTaskParams, TaskPreset, TaskTemplate } from "@repo/shared";
1414

1515
interface CreateTaskSectionProps {
1616
templates: readonly TaskTemplate[];
@@ -20,15 +20,16 @@ export function CreateTaskSection({ templates }: CreateTaskSectionProps) {
2020
const api = useTasksApi();
2121
const [prompt, setPrompt] = useState("");
2222
const [templateId, setTemplateId] = useState(templates[0]?.id || "");
23-
const [presetId, setPresetId] = useState("");
23+
const selectedTemplate = templates.find((t) => t.id === templateId);
24+
const [presetId, setPresetId] = useState(() =>
25+
defaultPresetId(selectedTemplate?.presets ?? []),
26+
);
2427

2528
const { mutate, isPending, error } = useMutation({
2629
mutationFn: (params: CreateTaskParams) => api.createTask(params),
2730
onSuccess: () => setPrompt(""),
2831
onError: (err) => logger.error("Failed to create task", err),
2932
});
30-
31-
const selectedTemplate = templates.find((t) => t.id === templateId);
3233
const presets = selectedTemplate?.presets ?? [];
3334
const canSubmit = prompt.trim().length > 0 && selectedTemplate && !isPending;
3435

@@ -63,14 +64,20 @@ export function CreateTaskSection({ templates }: CreateTaskSectionProps) {
6364
className="option-select"
6465
value={templateId}
6566
onChange={(e) => {
66-
setTemplateId((e.target as HTMLSelectElement).value);
67-
setPresetId("");
67+
const newId = (e.target as HTMLSelectElement).value;
68+
setTemplateId(newId);
69+
const newTemplate = templates.find((t) => t.id === newId);
70+
setPresetId(defaultPresetId(newTemplate?.presets ?? []));
6871
}}
6972
disabled={isPending}
7073
>
7174
{templates.map((template) => (
72-
<VscodeOption key={template.id} value={template.id}>
73-
{template.displayName}
75+
<VscodeOption
76+
key={template.id}
77+
value={template.id}
78+
description={template.description}
79+
>
80+
{template.name}
7481
</VscodeOption>
7582
))}
7683
</VscodeSingleSelect>
@@ -86,9 +93,12 @@ export function CreateTaskSection({ templates }: CreateTaskSectionProps) {
8693
}
8794
disabled={isPending}
8895
>
89-
<VscodeOption value="">No preset</VscodeOption>
9096
{presets.map((preset) => (
91-
<VscodeOption key={preset.id} value={preset.id}>
97+
<VscodeOption
98+
key={preset.id}
99+
value={preset.id}
100+
description={preset.description}
101+
>
92102
{preset.name}
93103
{preset.isDefault ? " (Default)" : ""}
94104
</VscodeOption>
@@ -100,3 +110,10 @@ export function CreateTaskSection({ templates }: CreateTaskSectionProps) {
100110
</div>
101111
);
102112
}
113+
114+
function defaultPresetId(presets: readonly TaskPreset[]): string {
115+
if (presets.length === 0) {
116+
return "";
117+
}
118+
return (presets.find((p) => p.isDefault) ?? presets[0]).id;
119+
}

packages/tasks/src/index.css

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ body {
66
margin: 0;
77
padding: 0;
88
font-family: var(--vscode-font-family);
9-
font-size: calc(var(--vscode-font-size) * 0.9);
9+
font-size: var(--vscode-font-size);
1010
color: var(--vscode-foreground);
1111
background: var(--vscode-sideBar-background);
1212
overflow: hidden;
@@ -205,7 +205,8 @@ vscode-collapsible::part(body) {
205205
}
206206

207207
.task-title,
208-
.task-subtitle {
208+
.task-subtitle,
209+
.task-detail-title {
209210
overflow: hidden;
210211
text-overflow: ellipsis;
211212
white-space: nowrap;
@@ -230,7 +231,8 @@ vscode-collapsible::part(body) {
230231
opacity: 0.7;
231232
}
232233

233-
.task-item-spinner {
234+
.task-item-spinner,
235+
.action-menu-spinner {
234236
width: 1em;
235237
height: 1em;
236238
}
@@ -251,7 +253,7 @@ vscode-collapsible::part(body) {
251253
border-radius: 50%;
252254
flex-shrink: 0;
253255
background: var(--status-color);
254-
box-shadow: 0 0 0 0.25em
256+
box-shadow: 0 0 0 0.2em
255257
color-mix(in srgb, var(--status-color) 25%, transparent);
256258
}
257259

@@ -415,8 +417,6 @@ vscode-icon.disabled {
415417
}
416418

417419
.action-menu-spinner {
418-
width: 1em;
419-
height: 1em;
420420
margin-inline-end: 4px;
421421
}
422422

@@ -440,19 +440,11 @@ vscode-icon.disabled {
440440
var(--vscode-sideBarSectionHeader-border, var(--vscode-panel-border));
441441
}
442442

443-
.task-detail-header .status-dot {
444-
width: 0.7em;
445-
height: 0.7em;
446-
}
447-
448443
.task-detail-title {
449444
flex: 1;
450445
min-width: 0;
451-
overflow: hidden;
452-
text-overflow: ellipsis;
453-
white-space: nowrap;
454446
font-weight: 500;
455-
font-size: 1.05em;
447+
margin-inline-start: 0.25em;
456448
}
457449

458450
.error-banner {
@@ -516,14 +508,17 @@ vscode-icon.disabled {
516508
word-break: break-word;
517509
}
518510

511+
.log-entry-input,
512+
.log-entry-output {
513+
padding-inline-start: 6px;
514+
}
515+
519516
.log-entry-input {
520517
border-inline-start: 2px solid var(--vscode-textLink-foreground);
521-
padding-inline-start: 6px;
522518
}
523519

524520
.log-entry-output {
525521
border-inline-start: 2px solid var(--vscode-descriptionForeground);
526-
padding-inline-start: 6px;
527522
}
528523

529524
.log-entry-role {

src/webviews/tasks/tasksPanelProvider.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,9 @@ export class TasksPanelProvider
479479
}
480480

481481
try {
482-
const templates = await this.client.getTemplates({});
482+
const templates = await this.client.getTemplates({
483+
q: "has-ai-task:true",
484+
});
483485

484486
return await Promise.all(
485487
templates.map(async (template: Template): Promise<TaskTemplate> => {
@@ -495,13 +497,13 @@ export class TasksPanelProvider
495497

496498
return {
497499
id: template.id,
498-
name: template.name,
499-
displayName: template.display_name || template.name,
500-
icon: template.icon,
500+
name: template.display_name || template.name,
501+
description: template.description,
501502
activeVersionId: template.active_version_id,
502503
presets: presets.map((p) => ({
503504
id: p.ID,
504505
name: p.Name,
506+
description: p.Description,
505507
isDefault: p.Default,
506508
})),
507509
};

test/mocks/tasks.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,9 +167,8 @@ export function taskTemplate(
167167
): TaskTemplate {
168168
return {
169169
id: "template-1",
170-
name: "test-template",
171-
displayName: "Test Template",
172-
icon: "/icon.svg",
170+
name: "Test Template",
171+
description: "A test template",
173172
activeVersionId: "version-1",
174173
presets: [],
175174
...overrides,

test/unit/webviews/tasks/tasksPanelProvider.test.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,22 @@ describe("TasksPanelProvider", () => {
255255

256256
const res = await h.request(TasksApi.getTemplates);
257257

258+
expect(h.client.getTemplates).toHaveBeenCalledWith({
259+
q: "has-ai-task:true",
260+
});
258261
expect(res.data?.[0].presets).toEqual([
259-
{ id: "p1", name: "Default", isDefault: true },
260-
{ id: "p2", name: "Custom", isDefault: false },
262+
{
263+
id: "p1",
264+
name: "Default",
265+
description: "Test preset",
266+
isDefault: true,
267+
},
268+
{
269+
id: "p2",
270+
name: "Custom",
271+
description: "Test preset",
272+
isDefault: false,
273+
},
261274
]);
262275
});
263276

test/webview/tasks/CreateTaskSection.test.tsx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ describe("CreateTaskSection", () => {
4040
vi.clearAllMocks();
4141
});
4242

43-
it("renders template options by displayName", () => {
43+
it("renders template options by name", () => {
4444
renderSection([
45-
taskTemplate({ id: "t1", displayName: "First" }),
46-
taskTemplate({ id: "t2", displayName: "Second" }),
45+
taskTemplate({ id: "t1", name: "First" }),
46+
taskTemplate({ id: "t2", name: "Second" }),
4747
]);
4848
expect(screen.queryByText("First")).toBeInTheDocument();
4949
expect(screen.queryByText("Second")).toBeInTheDocument();
@@ -57,7 +57,14 @@ describe("CreateTaskSection", () => {
5757
it("renders preset dropdown when template has presets", () => {
5858
renderSection([
5959
taskTemplate({
60-
presets: [{ id: "p1", name: "Fast Mode", isDefault: false }],
60+
presets: [
61+
{
62+
id: "p1",
63+
name: "Fast Mode",
64+
description: "A fast preset",
65+
isDefault: false,
66+
},
67+
],
6168
}),
6269
]);
6370
expect(screen.queryByText("Preset:")).toBeInTheDocument();
@@ -94,8 +101,8 @@ describe("CreateTaskSection", () => {
94101
});
95102

96103
it("syncs templateId when templates change", () => {
97-
const templates1 = [taskTemplate({ id: "t1", displayName: "Old" })];
98-
const templates2 = [taskTemplate({ id: "t2", displayName: "New" })];
104+
const templates1 = [taskTemplate({ id: "t1", name: "Old" })];
105+
const templates2 = [taskTemplate({ id: "t2", name: "New" })];
99106

100107
const { rerender } = renderWithQuery(
101108
<CreateTaskSection templates={templates1} />,

0 commit comments

Comments
 (0)