feat(KB-104): move file browser from task modal to toolbar

- Add backend API routes and file service for project-scoped file operations
- Create useProjectFileBrowser and useProjectFileEditor hooks with comprehensive tests
- Update FileBrowserModal to support both task and project modes via dualMode prop
- Add Files button to dashboard header toolbar
- Remove Files tab from TaskDetailModal
- Integrate project file browser into main App layout
- Include changeset for @dustinbyrne/kb package
This commit is contained in:
gsxdsm
2026-03-30 17:06:50 -07:00
parent 0ab4f251cf
commit cf5a98fdf0
12 changed files with 1130 additions and 30 deletions

View File

@@ -1,5 +1,5 @@
import { useState, useEffect, useRef, useCallback } from "react";
import { Settings, Pause, Play, Square, Download, LayoutGrid, List, Terminal, Lightbulb, Search, X, Activity, MoreHorizontal, Clock } from "lucide-react";
import { Settings, Pause, Play, Square, Download, LayoutGrid, List, Terminal, Lightbulb, Search, X, Activity, MoreHorizontal, Clock, Folder } from "lucide-react";
interface HeaderProps {
onOpenSettings?: () => void;
@@ -8,6 +8,8 @@ interface HeaderProps {
onOpenUsage?: () => void;
onOpenSchedules?: () => void;
onToggleTerminal?: () => void;
onToggleFiles?: () => void;
filesOpen?: boolean;
globalPaused?: boolean;
enginePaused?: boolean;
onToggleGlobalPause?: () => void;
@@ -42,6 +44,8 @@ export function Header({
onOpenUsage,
onOpenSchedules,
onToggleTerminal,
onToggleFiles,
filesOpen,
globalPaused,
enginePaused,
onToggleGlobalPause,
@@ -262,6 +266,18 @@ export function Header({
</button>
)}
{/* Files button - desktop only */}
{!isMobile && onToggleFiles && (
<button
className={`btn-icon${filesOpen ? " btn-icon--active" : ""}`}
onClick={onToggleFiles}
title="Browse Files"
data-testid="files-toggle-btn"
>
<Folder size={16} />
</button>
)}
{/* Pause button (soft pause) - always inline */}
<button
className={`btn-icon${enginePaused ? " btn-icon--paused" : ""}`}
@@ -321,6 +337,18 @@ export function Header({
<Terminal size={16} />
<span>Open Terminal</span>
</button>
{/* Files - in overflow on mobile */}
{onToggleFiles && (
<button
className="mobile-overflow-item"
onClick={() => handleOverflowAction(onToggleFiles)}
role="menuitem"
data-testid="overflow-files-btn"
>
<Folder size={16} />
<span>Browse Files</span>
</button>
)}
<button
className="mobile-overflow-item"
onClick={() => handleOverflowAction(onOpenGitHubImport)}