diff --git a/src/frontend/src/App.tsx b/src/frontend/src/App.tsx
index be27815..18d6567 100644
--- a/src/frontend/src/App.tsx
+++ b/src/frontend/src/App.tsx
@@ -196,9 +196,9 @@ function CreateTaskModal({ onClose, onSubmit }: {
{/* Title */}
-
+
setTitle(e.target.value)}
- placeholder="简要概括任务..."
+ placeholder="简要概括任务,不填自动从描述生成..."
style={{ width: '100%', padding: '8px 12px', borderRadius: 6, border: '1px solid var(--line)', background: 'var(--panel)', color: 'var(--fg)', fontSize: 13 }} />
diff --git a/src/frontend/src/api.ts b/src/frontend/src/api.ts
index d40b62e..06eaedd 100644
--- a/src/frontend/src/api.ts
+++ b/src/frontend/src/api.ts
@@ -222,14 +222,16 @@ export const api = {
const pid = _currentProjectId || Object.keys((await api.projects()).projects)[0];
if (!pid) return { ok: false, error: 'No project selected' };
const prio = typeof data.priority === 'string' ? parseInt(data.priority, 10) || 5 : 5;
- return postJ(`${API_BASE}/api/projects/${pid}/tasks`, {
+ // title 为空时不传,后端自动生成(description 前30字 + …)
+ const payload: any = {
id: `task-${Date.now().toString(36)}`,
- title: data.title || data.requirement || '',
description: data.requirement || data.title || '',
task_type: data.project_type || 'general',
priority: prio,
assigned_by: 'user',
- });
+ };
+ if (data.title && data.title.trim()) payload.title = data.title.trim();
+ return postJ(`${API_BASE}/api/projects/${pid}/tasks`, payload);
} catch (e: any) {
return { ok: false, error: e.message };
}