Improve project/task/sub-task workflows across backend and web

Backend:
- notes.py: add parent_id filter to list_notes()
- routes/notes.py: expose project_id, milestone_id, parent_id, type
  query params on GET /api/notes
- milestones.py: add find_milestone_by_title() (cross-project search)
- tools.py: list_notes project filter + updated_at; list_tasks milestone
  without project; tag_mode default add; fail-fast project resolution

Web frontend:
- TaskEditorView: add sub-tasks section (fetch, toggle, create inline);
  pre-fill projectId/milestoneId/parentId from URL query params on new task
- ProjectView: add + button in Todo kanban column header linking to
  /tasks/new?projectId=X&milestoneId=Y for quick task creation

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-02 22:00:44 -05:00
parent 6580d16942
commit 4fd2c915b6
6 changed files with 266 additions and 4 deletions
+15
View File
@@ -474,6 +474,11 @@ function formatDate(dateStr?: string | null): string {
<div class="kanban-col-header">
<span>Todo</span>
<span class="col-count">{{ group.tasks.filter(t => t.status === 'todo').length }}</span>
<router-link
:to="`/tasks/new?projectId=${projectId}${group.milestone ? '&milestoneId=' + group.milestone.id : ''}`"
class="col-add-btn"
title="Add task"
>+</router-link>
</div>
<div class="kanban-cards">
<router-link
@@ -969,6 +974,16 @@ function formatDate(dateStr?: string | null): string {
color: var(--color-text-muted);
font-weight: 600;
}
.col-add-btn {
margin-left: auto;
color: var(--color-text-muted);
text-decoration: none;
font-size: 1rem;
line-height: 1;
padding: 0 0.15rem;
border-radius: var(--radius-sm);
}
.col-add-btn:hover { color: var(--color-primary); }
.kanban-cards {
display: flex;
flex-direction: column;