BACK-208/401/419/423/467/473-505 — Wiki, i18n, Gantt, Editor, Statistics & Board Enhancements#669
BACK-208/401/419/423/467/473-505 — Wiki, i18n, Gantt, Editor, Statistics & Board Enhancements#669kuwork wants to merge 45 commits into
Conversation
(cherry picked from commit e1ea342)
…ted-Word-content (cherry picked from commit c92e3b3)
(cherry picked from commit cdf34a9318650ab731ec0e2755158bd24fc7e914)
(cherry picked from commit 144d9e9)
- Add .codex/skills/llm-wiki-for-backlog/ as the canonical skill source directory (SKILL.md, usermanual-writing-guide.md, merge.py) - Add CRITICAL wikilink format rules: index.md tables must use [[path/to/file]] instead of standard Markdown links [text](path.md) - Include wrong/correct examples for internal wiki page links - Update AGENTS.md wiki guidelines with the same wikilink constraints - Regenerate src/skills/embedded/llm-wiki-for-backlog.ts (3 files embedded)
…elated sections (cherry picked from commit be8994d4715c77ad1f089bfae901de72ecd006c0)
…ning files display the file count on the right.
…based-page-creation
…or-references-and-documentation
…s and milestones across CLI, TUI, Web, and MCP
…rdue, and stale categories with dueDate awareness
…n drop positioning
* wiki-fixed: (44 commits) BACK-505 - Add drill-down navigation for task dependencies in Web UI BACK-504 - Fix kanban drag-and-drop column sort reset and cross-column drop positioning BACK-503 - Task completion in the last year BACK-502 - Sync llm-wiki-for-backlog SKILL.md updates to embedded code BACK-501 - Task detail label input needs dropdown with fuzzy filter BACK-500 - Kanban label color customization and card label overflow BACK-499 - Fix sidebar collapse button overlapping resize handle BACK-498 - Auto-populate actualStart and actualEnd on task creation BACK-497 - Fix inconsistent timezone handling between CLI and web UI BACK-496 - Fix subtask grouping under parent task for ID sorting across all views BACK-495 - Implement tracking Gantt view with plan vs actual comparison BACK-493 - Add actualStart and actualEnd support for milestones BACK-494 - Fix task edit modal keyboard shortcuts interfering with title input BACK-492 - Add actualStart and actualEnd fields for tasks with auto-population on status change BACK-491 - Add Smart Gantt View Fix Task Time Problem BACK-490 - Add CLI overview command for project-level task statistics BACK-489 - Refactor project health indicators to support at-risk, overdue, and stale categories with dueDate awareness BACK-488 - Fix wiki pasted images not moved to paste directory on save BACK-401 - Add dueDate, plannedStart, and plannedEnd support for tasks and milestones across CLI, TUI, Web, and MCP ... # Conflicts: # bun.lock
|
Hey @MrLesk ,please take a look and merge. This is a big change, but I've referenced ideas from other forks. I think it's necessary — please accept it. |
|
Hey @kuwork. Thank you for the PR but I can't review a single PR that touches so many things at once. Please split them into single PRs that have a clear scope so that I can understand your intent in each of them. |
|
@MrLesk Thanks for your feedback. As required, I created a task for each change. Every task already has a detailed description and the changes I made, and the PR also includes a demo. Splitting them into multiple PRs would unfortunately create more work for us. I hope we can keep it as one PR if possible. After all, I've really put a lot of effort into making these functional improvements. |
|
I totally understand the effort that you put into it and I am happy to review the PRs once they are split. I need to be able to verify the code that builds each task and right now it would be impossible for me to understand what code paths belong to each of the tasks. I hope you can understand. |
|
@MrLesk I‘m Sorry, I understand your concern. But splitting would still create many dependent PRs and baseline issues — that would create a lot of extra merging work. I really don't want to split it. You could use SourceTree to quickly check the file changes — temporarily merging or cherry-picking intermediate commits would let you review them. But my suggestion is to directly verify whether the final code meets the purpose description and changes for each task. |
|
There are good reasons why it is not recommended to create such big PRs. The main purpose of PRs is to review the quality of the code and catch bugs. Also if there are architectural decisions that are not consistent with the codebase, I can give you feedback on a narrowly scoped PR. Here I simply can't. I won't be able to review this PR as it is. Thanks for understanding |
|
Hi @kuwork — following up on the discussion above: this PR has now been split into a stack of nine scoped PRs so each area can be reviewed properly. None of your work was lost, and you remain the git author of every commit. All 44 commits were rebased onto current The stack (each PR builds on the previous one):
A few small adjustments were needed to fit the code onto current The PRs are drafts while review proceeds; each will be reviewed individually and some slices will likely need changes before they can merge. If you'd like to address review feedback yourself, you can open PRs from your fork targeting the corresponding Thanks again for the substantial work that went into this. — Alex's agent |
BACK-208/401/419/423/467/473-505 — Wiki, i18n, Gantt, Editor, Statistics & Board Enhancements
Summary
This PR consolidates a large batch of features, improvements, and bug fixes developed across multiple branches. It covers significant enhancements to the Web UI (i18n, Gantt views, Kanban, editor capabilities), a full Wiki system for the web interface, date/time management improvements across CLI/TUI/Web/MCP, project health & statistics, and numerous bug fixes.
Previously opened as separate PRs:
Web UI — Internationalization (i18n)
BACK-478 — Add Web UI i18n support (English, Japanese, Chinese Simplified/Traditional)
src/web/contexts/I18nContext.tsx: React context for locale state management with config-driven initialization viaapiClient.fetchConfig()src/web/hooks/useI18n.ts: convenience hook exposing thettranslation dictionarysrc/web/locales/index.ts: locale registry and dictionary loader supportingen,ja,zh-CN,zh-TWsrc/web/locales/types.ts: recursiveTranslationDicttype derived from the English source dictionarysrc/web/locales/en.ts,ja.ts,zh-CN.ts,zh-TW.ts: full translation dictionaries covering all 30+ UI componentssrc/web/App.tsx&src/web/main.tsx: integrateI18nProviderand sync locale frombacklog/config.ymlsrc/web/components/*.tsx: replace all hardcoded UI strings witht.*translations across Board, TaskDetailsModal, MilestonesPage, Settings, WikiDetail, CleanupModal, etc.src/core/backlog.ts,src/types/index.ts,src/file-system/operations.ts: addlocalefield toBacklogConfigand persist it to config filesrc/test/assets.test.ts: update test expectations for i18n-related changesWeb UI — Documentation & Task Editing
BACK-479 — Add full documentation editing with path autocomplete for references and documentation
src/file-system/operations.ts: addlistProjectFiles()(secure directory listing with path traversal containment check) andsearchProjectFiles()(recursive project file search excludingnode_modules,.git,dist,build,.backlog,.locks)src/server/index.ts: addGET /api/list-filesandGET /api/search-filesendpoints; supportdocumentationarray in task update payloadsrc/web/lib/api.ts: addfetchListFiles()andfetchSearchFiles()client methodssrc/web/components/PathAutocomplete.tsx: new reusable path autocomplete component with keyboard navigation (arrow keys + Enter), directory traversal, URL detection, debounced server search, and click-outside dismissalsrc/web/components/TaskDetailsModal.tsx: replace read-only documentation display with fully editable list; add inline add/remove for documentation items; replace plain text inputs withPathAutocompletefor both references and documentation fieldssrc/test/filesystem.test.ts: add tests for file listing and search (path traversal rejection, missing directory handling)BACK-419 — Add Web UI demote-to-draft action
src/server/index.ts: addPOST /api/tasks/:id/demoteendpoint withhandleDemoteTask()leveragingcore.demoteTask(); broadcast bothtasks-updatedanddrafts-updatedWebSocket events to refresh all clientssrc/web/components/TaskDetailsModal.tsx: add "Demote to Draft" button in preview mode with keyboard shortcutD(when not in an input); integrate with i18n translation stringssrc/web/lib/api.ts: adddemoteTask(id)client API methodsrc/web/locales/en.ts,ja.ts,zh-CN.ts,zh-TW.ts: add demote-related translation keyssrc/test/server-demote-endpoint.test.ts: add endpoint tests covering success, task not found, and lock conflict (409) scenariosBACK-423 — Add folder grouping for docs in Web UI
src/types/index.ts: addDocsTreeNodetype for recursive docs folder tree structuresrc/file-system/operations.ts: addgetDocsTree()(filesystem walk including empty directories) andcreateDocsFolder()(with path traversal containment check)src/server/index.ts: addGET /api/docs/treeandPOST /api/docs/folderendpointssrc/web/lib/api.ts: addfetchDocsTree()andcreateDocsFolder()client methodssrc/web/App.tsx: loaddocsTreein parallel with other data and pass through component treesrc/web/components/Layout.tsx: forwarddocsTreeprop toSideNavigationsrc/web/components/SideNavigation.tsx: replace flat document list with recursiveDocTreeItemcomponent; addDocActionDropdownper-folder menu (create file / create folder); add expand/collapse withlocalStoragepersistence; fix vertical alignment of dropdown trigger buttons; remove rename option from Wiki section header dropdownsrc/web/components/DocumentationDetail.tsx: support?pathquery parameter on/documentation/newto pre-fill target foldergetDocsTree()walks the filesystem directly instead of deriving from thedocsarray so that empty folders are visible and can be created before any document exists inside them. Documents do not need a standalone rename action in the sidebar becausesaveDocument()already handles title changes by renaming the file automatically.Web UI — Wiki System
BACK-473 — Add wiki section to web UI with file tree navigation
src/types/index.ts: addWikiTreeNodeandWikiPagetypessrc/file-system/operations.ts: implementgetWikiTree()(recursive directory walker skippingwiki_output/) andreadWikiPage()(secure path resolution with containment check + frontmatter parsing)src/server/index.ts: addGET /api/wiki/treeandGET /api/wiki/*handlers (multi-segment path viadecodeURIComponent, matching existing/assets/*pattern)src/web/lib/api.ts: addfetchWikiTree()andfetchWikiPage(path)client methodssrc/web/App.tsx: register/wikiand/wiki/*routessrc/web/components/SideNavigation.tsx: add collapsible wiki file tree section below Documents with chevron toggle, wiki icon, item count, and recursiveWikiTreeItemrenderingsrc/web/components/WikiDetail.tsx: create read-only markdown viewer reusingMermaidMarkdown+MDEditorpreview with dark mode support, YAML frontmatter extraction for page headersrc/test/filesystem.test.ts: add tests for wiki tree building and wiki page reading (path traversal rejection, missing file handling)BACK-474 — Add backlog wiki install
<agent>CLI commandsrc/cli.ts: register wiki command group withinstall <agent>subcommand (--force,--dry-runoptions)src/commands/wiki-install.ts: core implementation with agent alias mapping (claude→.claude/skills/,codex→.codex/skills/,agents→.agents/skills/), symlink architecture with fallback to direct copy on Windows, overwrite protection, andSKILL.mdfrontmatter parsing for summary outputscripts/embed-wiki-skill.ts: build-time script scanning.codex/skills/llm-wiki-for-backlog/and generatingsrc/skills/embedded/llm-wiki-for-backlog.tssrc/skills/embedded/llm-wiki-for-backlog.ts: generated embedded skill files map for compiled binary availabilitysrc/completions/helper.ts: add agent argument completions (claude,codex,agents)src/guidelines/agent-guidelines.md: add new command referencesrc/test/wiki-install.test.ts: 12 unit tests coveringresolveAgent,installWikiSkill, dry-run, force overwrite, symlink handling, and result formattingBACK-477 — Add wiki online editing, file change monitoring, folder-based page creation, and labels support
src/file-system/operations.ts: addsaveWikiPage()(writes content/title/labels frontmatter, setsupdated_date),createWikiPage()(creates files withtitle,created_date, optionallabels),createWikiFolder()(pure empty folders),renameWikiItem()(file/folder rename with path traversal checks)src/core/content-store.ts: addcreateWikiWatcher()— recursivefs.watch()onbacklog/wiki/, broadcasts"tasks"notification → WebSocket"tasks-updated"→ live UI refreshsrc/server/index.ts: addPUT /api/wiki/*(update page),POST /api/wiki(create page/folder),PATCH /api/wiki/*(rename item)src/web/lib/api.ts: addupdateWikiPage(),createWikiPage(),createWikiFolder(),renameWikiItem()client methodssrc/web/App.tsx: integratewikiTreeinto global state;loadAllData()fetches wiki tree in parallel with tasks/docs/decisionssrc/web/components/WikiDetail.tsx: inline editing with Edit/Save/Cancel lifecycle; large title input +PasteAwareMDEditor;hasChangestracking (content / title / labels); labels displayed as badges in view mode, editable viaChipInputin edit modesrc/web/components/SideNavigation.tsx: props-driven wiki tree; hover-revealWikiActionDropdownon folders/files/root header; "Create file", "Create folder", "Rename" actions; folder file count; auto-navigation after create/renametitle+created_dateon creation,updated_dateon every save;labelsarray replaces singletypefield for flexible categorization (consistent with task labels)BACK-481 — Add wiki to web search
src/cli.ts: add--wikiflag to search commandsrc/core/content-store.ts: add wiki content to search index updatessrc/core/search-service.ts: include wiki pages in search results with proper scoringsrc/file-system/operations.ts: addsearchWikiPages()for full-text search within wiki contentsrc/server/index.ts: expose wiki search via existing search endpointsrc/types/index.ts: add wiki result types to search response unionsrc/web/components/SideNavigation.tsx: highlight wiki search resultssrc/web/utils/search-command-query.ts: update search query parsing to support wiki scopeBACK-482 — Fix wikilink and Markdown relative link preview in wiki pages
src/file-system/operations.ts: addresolveWikiPath()with path traversal containment and relative path resolutionsrc/server/index.ts: addGET /api/wiki/resolveendpoint for path resolutionsrc/test/resolve-wiki-path.test.ts: 57 lines covering relative link resolution and path traversal rejectionsrc/web/components/WikiDetail.tsx: rewrite link click handler to intercept[[wikilink]]and relative[text](path.md)links, resolve server-side, and navigate via React Router without full page reloadBACK-488 — Fix wiki pasted images not moved to paste directory on save
src/web/components/WikiDetail.tsx: on save, scan content for temp asset URLs, call the existing asset promotion API, and rewrite URLs from.temp/topaste/before persisting the markdown.temp/to permanent storage on save, matching the behavior of task and document editorsWeb UI — Editor & Paste Enhancements
BACK-208 — Add paste-as-markdown support in Web UI
Implements automatic conversion of rich text content to Markdown when pasting into task and document editors in the Web UI. Users can now seamlessly paste content from Word, Google Docs, web pages, and other sources while maintaining proper Markdown formatting. Delivered in two phases:
Phase 1 — Text, Tables, Lists, Formatting: A new
PasteAwareMDEditorwrapper interceptsonPasteevents, detects rich-text HTML on the clipboard, cleans Word-specific garbage, and converts to Markdown via Turndown with GFM support.Phase 2 — Images: Pasted images (screenshots, HTML
<img>tags, data URIs) are extracted, uploaded tobacklog/assets/.temp/, and promoted to permanent storage on save. This avoids orphaned images and base64 bloat that would cause textarea lag.Also includes three bugfixes (2026-05-09) for Excel table paste not converting to Markdown, Excel paste losing screenshot images, and Word
file://image references.src/core/assets.ts:AssetManagerwith upload, promote, cleanup, anddownloadImagesecurity rules (SSRF protection, redirect limits, size limits, content-type validation)src/server/index.ts:POST /api/assets/upload,POST /api/assets/promote,POST /api/assets/download-imagehandlerssrc/web/components/PasteAwareMDEditor.tsx: paste interception wrapper forMDEditorsrc/web/components/TaskDetailsModal.tsx&DocumentationDetail.tsx: integratePasteAwareMDEditorsrc/web/utils/paste-as-markdown.ts: HTML → Markdown conversion with Word/Excel cleanup, image extraction, base64 handling, remote image downloadsrc/test/assets.test.ts&src/test/server-upload-promote.test.ts: automated tests for asset lifecycle and security rulesBACK-475 — Add Word (docx) upload to enable image extraction for pasted Word content
Allow users to upload Word documents (
.docx) directly into the Web UI editor. The backend extracts text and images, converting them to Markdown with proper image references.The existing paste-as-markdown feature (BACK-208) cannot extract images from pasted Word content because browser clipboard APIs don't expose embedded images as extractable blobs. By supporting direct
.docxfile upload, mammoth can read the docx archive and extract embedded images to the temp assets directory.src/core/docx-converter.ts): New module usingmammothto convert.docx→ HTML. Embedded images are extracted via mammoth'sconvertImagecallback and uploaded tobacklog/assets/.temp/viaAssetManager.src/server/index.ts): NewPOST /api/docx/convertendpoint. Accepts multipart/form-data, validates.docxextension, returns{ html, images, messages }.src/web/components/PasteAwareMDEditor.tsx): Added Word upload button to editor toolbar (extraCommands), drag-and-drop support, and a hidden file picker. Uploads file to backend, then runscleanHtml+ Turndown in the browser to produce Markdown.src/web/utils/paste-as-markdown.ts): ExtractedcleanHtmlas an exported async function with a newkeepMediaoption. This allows the docx upload path to preserve server-side extracted images while the paste path continues to filter invalid local images.src/web/lib/api.ts): AddedconvertDocx()API client method.src/test/server-docx-convert.test.ts): Integration tests for the conversion endpoint (validation, conversion, image extraction to temp directory).mammothfor docx parsing.BACK-476 — Fix inline code HTML escaping in markdown renderer
Fixes double HTML-entity encoding inside inline code and fenced code blocks across all views that use the
MermaidMarkdownrenderer (wiki, task details, documentation, decisions, and file previews).The
sanitizeMarkdownSourcehelper was escaping<to<indiscriminately across the entire markdown source. Because code regions are already rendered verbatim by the Markdown engine, this caused users to see<id>instead of<id>inside inline code like`<id>`.The fix collects protected ranges for fenced code blocks and inline code spans before running the
<escape replacement, skipping any match that falls inside a code region.src/web/components/MermaidMarkdown.tsx: add protected-range logic for code blocks and inline codeBACK-467 — Add local file preview with syntax highlighting and line numbers
src/file-system/operations.ts: addreadFilePreview()with configurable line limit, safe path resolution, and MIME type detectionsrc/server/index.ts: addGET /api/files/previewendpointsrc/web/components/FilePreviewModal.tsx: new modal with syntax-highlighted code display, line numbers, and dark mode supportsrc/web/components/MermaidMarkdown.tsx: intercept local file links and open preview modal instead of navigating awaysrc/web/components/TaskDetailsModal.tsx: integrate file preview for reference linkssrc/test/filesystem.test.ts: tests for preview path traversal rejection and line limitingWeb UI — Board, Kanban & Gantt
BACK-480 — Fix WebUI milestone page search fuzzy matching false positives
src/web/components/MilestonesPage.tsx: introduce three-tier search strategy — exact ID match → substring match (title/id contains query) → Fuse fuzzy search withthreshold: 0.35; this eliminates false positives on short queries; fix unassigned section to show all search results instead of filtering out completed tasks during active searchsrc/test/web-milestones-page-search.test.tsx: update tests for new three-tier search behaviorsrc/test/web-milestones-page-unassigned-filter.test.tsx: adjust unassigned filter tests for search-active display behaviorBACK-484 — Web UI sort optimization
src/web/components/MilestonesPage.tsx: optimize sort indicator rendering and reduce re-renders during drag-and-dropsrc/web/components/TaskColumn.tsx: virtualized sort handling with stable identity keyssrc/web/components/TaskList.tsx: deduplicate sort callbackssrc/test/web-task-column-sort.test.tsx: update tests for optimized sort behaviorBACK-491 — Add Smart Gantt View
src/web/components/GanttView.tsx: new interactive Gantt chart with zoom (day/week/month/quarter/year), drag-to-scroll, today marker, dependency arrows, and dark modesrc/web/components/SideNavigation.tsx: add Gantt navigation entry with iconsrc/web/App.tsx: register/ganttroutesrc/web/locales/*.ts: add Gantt-related translation keysBACK-492 — Add actualStart and actualEnd fields for tasks with auto-population on status change
src/types/index.ts: addactualStartandactualEndoptional date fields toTasksrc/core/backlog.ts: auto-populateactualStarton first non-todo status change; auto-populateactualEndon completionsrc/utils/status.ts: add status transition hooks for date auto-populationsrc/web/components/TaskDetailsModal.tsx: display and edit actual datessrc/cli.ts&src/commands/task-wizard.ts: support actual dates in CLI create/editsrc/mcp/tools/tasks/handlers.ts: expose actual dates in MCPsrc/test/markdown.test.ts: test round-trip serialization of actual datesBACK-493 — Add actualStart and actualEnd support for milestones
src/types/index.ts: addactualStartandactualEndtoMilestonesrc/core/backlog.ts: milestone CRUD supports actual datessrc/cli.ts: milestone commands accept--actual-startand--actual-endsrc/mcp/tools/milestones/handlers.ts&schemas.ts: MCP milestone tools support actual datessrc/web/components/MilestonesPage.tsx: display and edit milestone actual datessrc/server/index.ts: milestone update endpoint accepts actual datessrc/test/mcp-milestones.test.ts: update MCP tests for new fieldsBACK-494 — Fix task edit modal keyboard shortcuts interfering with title input
src/web/utils/keyboard.ts: new helper to detect when focus is inside an input/textarea/contenteditablesrc/web/utils/keyboard.test.ts: 42 lines of unit tests for focus detectionsrc/web/components/TaskDetailsModal.tsx: guard all modal-level keyboard shortcuts (Esc,S,D, etc.) with!isEditingText()checkBACK-495 — Implement tracking Gantt view with plan vs actual comparison
src/web/components/GanttView.tsx: add tracking mode showing planned bars alongside actual bars; color-coded overdue/at-risk/completed states; plan-actual delta tooltipssrc/web/locales/*.ts: add tracking Gantt translation keysBACK-496 — Fix subtask grouping under parent task for ID sorting across all views
src/utils/task-sorting.ts: new shared sort utility ensuring subtasks are visually grouped under their parent when sorting by IDsrc/web/components/GanttView.tsx,MilestonesPage.tsx,TaskColumn.tsx,TaskList.tsx: replace inline sort with shared utilitysrc/test/task-sorting.test.ts: 73 lines of tests covering subtask grouping edge casesBACK-498 — Auto-populate actualStart and actualEnd on task creation
src/core/backlog.ts: when creating a task with status already set (e.g. via wizard), immediately populateactualStartand/oractualEndbased on the initial statusBACK-499 — Fix sidebar collapse button overlapping resize handle
src/web/components/SideNavigation.tsx: adjust z-index and padding so the collapse chevron no longer overlaps the resize drag handleBACK-500 — Kanban label color customization and card label overflow
src/types/index.ts: addlabelColorsmap to configsrc/file-system/operations.ts: persist label color preferencessrc/web/components/LabelFilterDropdown.tsx: color picker with preset palette and custom hex inputsrc/web/components/TaskCard.tsx: respect custom label colors; truncate overflowing labels with+Noverflow indicatorsrc/web/utils/labelColors.ts: new utility for color contrast calculation and palette managementsrc/test/web-task-list-labels-menu.test.tsx: update label menu tests for color customizationBACK-501 — Task detail label input needs dropdown with fuzzy filter
src/web/components/ChipInput.tsx: major refactor — add dropdown menu with fuzzy search (fuse.js), keyboard navigation, create-on-enter for new labelssrc/web/components/TaskDetailsModal.tsx: replace plain text label input with newChipInputBACK-504 — Fix kanban drag-and-drop column sort reset and cross-column drop positioning
src/web/components/Board.tsx: preserve column sort order during re-renderssrc/web/components/TaskColumn.tsx: fix drop index calculation when dragging across columns; prevent sort reset on task updatesrc/web/styles/style.css: add drop-target visual indicatorsrc/core/assets.ts&src/file-system/operations.ts: minor type fixes exposed by stricter TS checksBACK-505 — Add drill-down navigation for task dependencies in Web UI
src/web/App.tsx: add/task/:idstandalone route for direct task navigationsrc/web/components/DependencyInput.tsx: add click-to-navigate on dependency chipssrc/web/components/TaskDetailsModal.tsx: add "Open in Full View" link; render dependency tasks as clickable cardssrc/web/components/Modal.tsx: support nested modal stacking for dependency drill-downCLI, TUI, MCP & Core — Date/Time & Project Health
BACK-401 — Add dueDate, plannedStart, and plannedEnd support for tasks and milestones across CLI, TUI, Web, and MCP
src/types/index.ts: adddueDate,plannedStart,plannedEndoptional fields toTaskandMilestonesrc/core/backlog.ts: CRUD operations support new date fieldssrc/cli.ts&src/commands/task-wizard.ts: CLI create/edit commands accept--due-date,--planned-start,--planned-endsrc/mcp/tools/tasks/handlers.ts&milestones/handlers.ts: MCP tools expose new date fieldssrc/mcp/tools/milestones/schemas.ts: update Zod schemas for milestone date fieldssrc/web/components/TaskDetailsModal.tsx&MilestonesPage.tsx: date pickers for all new fieldssrc/markdown/parser.ts&serializer.ts: round-trip markdown serialization of new date fieldssrc/test/markdown.test.ts: 95 lines covering date field serializationsrc/guidelines/agent-guidelines.md: update agent guidelines with new date field documentationBACK-487 — Fix SSL network error not gracefully handled in GitOperations.fetch
src/git/operations.ts: wrapfetch()in try/catch; map SSL errors toGitErrorwith user-friendly messagesrc/test/git.test.ts: 32 lines testing SSL error handlingBACK-489 — Refactor project health indicators to support at-risk, overdue, and stale categories with dueDate awareness
src/core/statistics.ts: addcalculateHealth()with at-risk (dueDate approaching), overdue (past dueDate), and stale (no activity) categoriessrc/web/components/Statistics.tsx: new health dashboard with color-coded cards and trend sparklinessrc/web/components/TaskCard.tsx: add health indicator dot to task cardssrc/web/locales/*.ts: add health category translationssrc/test/statistics.test.ts: 128 lines covering health calculation edge casesBACK-490 — Add CLI overview command for project-level task statistics
src/commands/overview.ts: newbacklog overviewcommand with--watch,--format, and--outputoptionssrc/ui/overview-tui.ts: interactive TUI for real-time project statisticssrc/core/statistics.ts: addgetProjectOverview()aggregating task counts by status, health, milestone, and labelsrc/test/stats-command.test.ts: 195 lines of CLI overview testssrc/guidelines/agent-guidelines.md: document new command for agentsBACK-497 — Fix inconsistent timezone handling between CLI and web UI
src/utils/date-utc.ts: new shared utility for UTC-normalized date parsing, formatting, and comparisonsrc/board.ts,src/core/backlog.ts,src/core/statistics.ts,src/core/task-loader.ts: migrate all date operations todate-utchelperssrc/web/components/CleanupModal.tsx,DraftsList.tsx,GanttView.tsx: web UI uses same UTC logicsrc/web/utils/date-display.ts: remove duplicated local date formatting; delegate to shared utilityBACK-502 — Sync llm-wiki-for-backlog SKILL.md updates to embedded code
src/skills/embedded/llm-wiki-for-backlog.ts: regenerate embedded skill files to match latest.codex/skills/llm-wiki-for-backlog/SKILL.mdscripts/embed-wiki-skill.ts: build-time script ensures embedded copy stays in syncBACK-503 — Task completion in the last year
src/core/statistics.ts: addgetCompletionTrend()for year-over-year and rolling-12-month completion analyticssrc/server/index.ts: addGET /api/statistics/completion-trendendpointsrc/web/components/Statistics.tsx: new chart section showing monthly completion bars and year comparisonsrc/web/lib/api.ts: addfetchCompletionTrend()client methodsrc/web/locales/*.ts: add completion trend translationssrc/test/statistics.test.ts: add tests for trend calculation with partial-year dataWeb UI — Layout & Navigation
BACK-483 — Sidebar resize and search type dropdown
src/web/components/SideNavigation.tsx: add drag-to-resize handle withlocalStoragewidth persistence; add search type dropdown (task / doc / wiki / all)src/web/components/WikiDetail.tsx: sidebar width responsive to resizesrc/web/lib/api.ts: add search scope parametersrc/web/utils/urlHelpers.ts: new URL helpers for search state serializationTask Checklist
backlog/tasks/Testing
bun test— full suite passesbunx tsc --noEmit— cleanbun run check .— clean (Biome format + lint)src/test/assets.test.tssrc/test/server-upload-promote.test.tssrc/test/server-docx-convert.test.tssrc/test/filesystem.test.tssrc/test/wiki-install.test.tssrc/test/markdown.test.tssrc/test/mcp-milestones.test.tssrc/test/statistics.test.tssrc/test/stats-command.test.tssrc/test/task-sorting.test.tssrc/test/web-milestones-page-search.test.tsxsrc/test/web-milestones-page-unassigned-filter.test.tsxsrc/test/web-task-column-sort.test.tsxsrc/test/web-task-list-labels-menu.test.tsxsrc/test/resolve-wiki-path.test.tssrc/test/git.test.tssrc/test/server-demote-endpoint.test.tssrc/test/keyboard.test.ts(viasrc/web/utils/keyboard.test.ts)Related Tasks
Closes: