839 Commits
Author SHA1 Message Date
curo1305andClaude Sonnet 4.6 ce67b9f98a fix(cloud): skeleton on first render + informative toast when opening cloud files
- loading initialised to true so skeleton rows show immediately on mount
  instead of the empty state flashing before data arrives
- @file-open no longer a silent no-op; shows an info toast explaining the
  file must be opened via the cloud provider directly

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 13:57:18 +02:00
curo1305andClaude Sonnet 4.6 210670d033 docs(phase-10): mark VALIDATION.md nyquist-compliant — 16/16 tasks COVERED, 211 tests pass
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 13:43:45 +02:00
curo1305 e97ca164d7 Refactor backend and frontend cleanup paths 2026-06-16 11:50:17 +02:00
curo1305andClaude Sonnet 4.6 4f6ee06f51 docs(10): mark Phase 10 complete — 15/15 truths verified, 211 tests pass
All 12 plans executed. Gap-closure committed in 6b56763 (Escape modal close,
revoke/rename toasts, StorageBrowser picker tests). Code review critical findings
resolved (CR-01 prop mutation, CR-02 double-shortcut on modal). VERIFICATION.md
shows 15/15 verified. Known pre-existing: esbuild CVE-GHSA-gv7w requires Vite 8
upgrade (breaking) — filed for Phase 11 chore.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 10:19:59 +02:00
curo1305andClaude Sonnet 4.6 9a1c7df65d fix(10): resolve WR-03/WR-04 code review warnings
WR-04: AdminAuditView.vue had a local formatTimestamp() duplicating shared
util logic — moved to utils/formatters.js and imported from there per CLAUDE.md
shared-module rule.

WR-03: Remove unused onUnmounted import from FileManagerView.vue.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 10:18:00 +02:00
curo1305andClaude Sonnet 4.6 efd6c78a15 fix(10): resolve CR-01 prop mutation + CR-02 double-shortcut on modal open
CR-01: DocumentCard.vue `@unshared="doc.is_shared = false"` mutated a
defineProps prop (readonly in Vue 3). Replace with a local `isShared` ref
watched against prop changes so the Shared pill hides correctly after revoke.

CR-02: App.vue keyboard handler fired U/N/Escape shortcuts even when a modal
was open (no input focused). Add `role="dialog"` guard so all shortcuts are
suppressed while any dialog is in the DOM.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 10:16:28 +02:00
curo1305andClaude Sonnet 4.6 37f49bc6ea docs(10): add code review report
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 10:13:37 +02:00
curo1305andClaude Sonnet 4.6 a6e130b49e docs(10): re-verify after gap closure — all 15 truths verified, 211 tests pass
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 10:03:16 +02:00
curo1305 6b56763689 fix(10): close UX-06/UX-10/UX-13 verification gaps — Escape modal close, rename/revoke toasts, StorageBrowser picker tests 2026-06-16 09:57:17 +02:00
curo1305 2605227fe0 docs(10): add code review report 2026-06-16 09:45:54 +02:00
curo1305 b46b97864e docs(phase-10): update tracking after wave 5 complete (12/12 plans) 2026-06-16 09:40:33 +02:00
curo1305 538604394c chore: merge executor worktree (10-12 SVG AppIcon migration) 2026-06-16 09:39:58 +02:00
curo1305 dbd32fdb1c docs(10-12): complete SVG-to-AppIcon migration — CODE-05 complete 2026-06-16 09:39:27 +02:00
curo1305 20835bc706 refactor(10-12): migrate view-level SVGs to AppIcon
- CloudStorageView: cloud icon
- SettingsView: checkCircle, exclamationCircle, x (x2)
- AccountView: checkMark (TOTP enabled indicator)
- AdminAiView: chevronDown (accordion)
- AdminUsersView: copy, check, refresh
- SettingsAccountTab: checkMark (TOTP enabled)
- TotpEnrollment: checkMark (verified state)
- CloudCredentialModal: x, chevronRight
- DocumentView: warning (cloud delete modal)
- SharedView: document icon
2026-06-16 09:37:47 +02:00
curo1305 bbb9db73e7 refactor(10-12): migrate cloud/settings/UI SVGs to AppIcon
- SearchableModelSelect: chevronDown + pencilEdit
- SettingsCloudTab: warning (x2) + cloud icons
- CloudProviderTreeItem: cloud icon
- CloudFolderTreeItem: folder + fileDoc icons
2026-06-16 09:33:57 +02:00
curo1305 939ea79977 refactor(10-12): migrate folder/document/upload/sharing SVGs to AppIcon
- FolderRow.vue: folder icon + dots menu button (fill-based → stroke AppIcon)
- FolderTreeItem.vue: folder icon in #icon slot
- FolderDeleteModal.vue: warning icon
- DocumentCard.vue: document, folderMove, share action icons
- DocumentPreviewModal.vue: x close button (spinner SVG kept)
- ShareModal.vue: x close button
- DropZone.vue: upload icon
- UploadProgress.vue: exclamationCircle (error) + checkCircle (done) icons; spinner kept
2026-06-16 08:37:42 +02:00
curo1305 cb41753605 refactor(10-12): migrate sidebar + layout + TreeItem SVGs to AppIcon
- StorageBrowser.vue: replace 8 inline SVGs (plus, folder x2, pencil, trash, share, folderMove, document)
- AppSidebar.vue: replace 8 inline SVGs (tag, inbox, chevronRight x2, folder, cloud, shield, cog dual-path, logout)
- AdminSidebar.vue: replace 6 inline SVGs (home, users, chartBar, lightBulb, clipboardList, logout)
- TreeItem.vue: replace 1 inline SVG (chevronRight expand/collapse)
2026-06-16 08:35:02 +02:00
curo1305 01a0605831 docs(phase-10): update tracking after wave 4 complete (11/12 plans) 2026-06-16 08:29:09 +02:00
curo1305 7dc011f3da docs(10-11): complete drag-to-move guard + teleport dropdowns plan — 10 tests, 3 components updated 2026-06-16 08:26:38 +02:00
curo1305 892abca8cf feat(10-11): teleport FolderRow three-dot menu to body with getBoundingClientRect positioning
- Add menuTriggerEl ref, menuStyle, and updateMenuPosition() using getBoundingClientRect
- Wrap three-dot menu in Teleport to body with data-test="folder-row-menu"
- toggleMenu() captures position before opening
- Add window scroll/resize listeners with cleanup in onUnmounted
- Update outside-click handler to also exclude teleported menu element
- All 4 UX-13 dropdown tests now pass; full test suite 208/208 green
2026-06-16 08:25:30 +02:00
curo1305 e0606b49f1 feat(10-11): teleport DocumentCard folder picker to body with getBoundingClientRect positioning
- Add pickerTriggerEl ref and pickerStyle computed from getBoundingClientRect
- Wrap folder picker dropdown in Teleport to body with data-test attribute
- Add updatePickerPosition() called on toggle, scroll, and resize
- Add window scroll/resize listeners with cleanup in onUnmounted
- 2 DocumentCard dropdown tests now pass
2026-06-16 08:24:28 +02:00
curo1305 f9ddda8e05 feat(10-11): add click-after-drag guard + teleport folder picker to StorageBrowser
- Guard file-row click: draggingFile ? null : emit('file-open', file)
- Add onFileDragEnd() with nextTick reset to prevent click-after-drag navigation
- Update onDropDocOnFolder to defer draggingFile reset via await nextTick()
- Replace absolute folder picker with Teleport to body + getBoundingClientRect positioning
- Add scroll/resize listeners to reposition picker on window scroll
- All 6 UX-11 dragmove tests now pass
2026-06-16 08:23:36 +02:00
curo1305 f20420a4b5 test(10-11): promote stub tests to real tests for drag-to-move + teleport dropdowns
- 6 real tests for UX-11 drag-to-move (click guard, drop emits, amber ring, dragend reset, toast wiring)
- 4 real tests for UX-13 Teleport dropdowns (DocumentCard, FolderRow position + scroll reposition)
- All dropdown tests RED (Teleport not yet implemented)
- Click-suppression test RED (guard not yet implemented)
2026-06-16 08:22:18 +02:00
curo1305 dbb07c8c7d docs(phase-10): update tracking after wave 3 complete (10/12 plans) 2026-06-15 20:48:13 +02:00
curo1305 6c48fd36bd chore: merge executor worktree (10-10 OS drag overlay) 2026-06-15 20:48:00 +02:00
curo1305 026d3743c3 docs(10-10): complete OS drag overlay plan — OsDragOverlay.vue + App.vue wiring + 8 tests
UX-09 fully implemented: depth-counter drag detection, Teleport overlay,
FileManagerView.handleOsDrop wired through App.vue routeViewRef.
198/198 tests passing, 0 regressions.
2026-06-15 20:47:32 +02:00
curo1305 69bf40af32 feat(10-10): wire OsDragOverlay into App.vue; expose handleOsDrop on FileManagerView
- App.vue: import + mount <OsDragOverlay @files-dropped="onOsFilesDropped" />
  after <ToastContainer /> (overlay z-[9998] stays below toast z-[9999])
- App.vue: add onOsFilesDropped handler -> routeViewRef.value?.handleOsDrop?.(files)
- FileManagerView: extend defineExpose to include handleOsDrop delegating to
  existing onFilesSelected({ files, autoClassify: true }) — no duplicate upload logic
- Full test suite: 198 passed, 0 failures
2026-06-15 20:46:05 +02:00
curo1305 20eceb8983 feat(10-10): implement OsDragOverlay.vue — OS file drag detection with depth counter
- Options API component; emits files-dropped with file list
- Depth-counter pattern (D-16) prevents flicker across child element boundaries
- Guards against in-app drags via dataTransfer.types.includes('Files') check
- window addEventListener/removeEventListener in mounted/beforeUnmount
- Teleport to body; z-[9998] keeps overlay below ToastContainer z-[9999]
- Fade transition via scoped CSS (.fade-enter-active/.fade-leave-active)
- 8/8 tests GREEN
2026-06-15 20:44:39 +02:00
curo1305 71f55b84a9 test(10-10): promote OsDragOverlay stubs to 8 RED failing tests
- Replace 7 it.todo stubs with 8 real tests covering UX-09 contract
- Tests dispatch DragEvent/Event with synthetic dataTransfer on window
- Covers: hidden by default, Files type guard, depth counter, nested enter/leave,
  drop emit, drop reset, z-[9998] class on overlay element
- All 8 tests RED (OsDragOverlay.vue does not yet exist)
2026-06-15 20:43:58 +02:00
curo1305 1cb63d690d docs(phase-10): update tracking after wave 2 complete (9/12 plans) 2026-06-15 20:38:48 +02:00
curo1305 7deb7836a7 chore: merge executor worktree (10-09 keyboard shortcuts) 2026-06-15 20:38:25 +02:00
curo1305 c625d0889d docs(10-09): add plan SUMMARY — keyboard shortcuts via ref chain complete
- 3 tasks executed: RED tests → ref chain plumbing → App.vue handler GREEN
- 9 keyboard tests passing; 190 total tests, 0 failures
- Documents double optional chaining deviation (auto-fixed bug in StorageBrowser)
2026-06-15 20:37:54 +02:00
curo1305 d7bda3c605 feat(10-09): add global keydown handler to App.vue — /, Escape, U, N shortcuts live
- Add routeViewRef = ref(null) and bind to <router-view ref="routeViewRef">
- Add onKeydown handler: guards INPUT/TEXTAREA/SELECT/contenteditable; routes / → focusSearch, Escape → clearSearch, U/u → triggerUpload, N/n → startNewFolder
- Chain document.addEventListener on onMounted, removeEventListener on onUnmounted
- Add double optional chaining (?.) in StorageBrowser.triggerUpload and focusSearch so stubs don't throw in tests
- 9 keyboard shortcut tests GREEN; full suite 190 passing 0 failures
2026-06-15 20:36:52 +02:00
curo1305 aaa0532af9 feat(10-09): plumb keyboard shortcut ref chain — DropZone→SearchBar→StorageBrowser→FileManagerView
- DropZone: defineExpose({ triggerInput }) to expose file picker trigger
- SearchBar: add inputEl ref + defineExpose({ focus }) for / shortcut
- StorageBrowser: add dropZoneRef + searchBarRef; expand defineExpose to include triggerUpload, focusSearch, clearSearch
- FileManagerView: add defineExpose delegating all four methods to browserRef via optional chaining
2026-06-15 20:35:38 +02:00
curo1305 089af90e6d test(10-09): promote keyboard stubs to 9 RED failing tests for UX-05/06/07/08
- Replace 11 it.todo stubs with 9 real it() assertions
- Tests verify FileManagerView exposes focusSearch, clearSearch, triggerUpload, startNewFolder
- All 9 tests are RED — defineExpose not yet added to FileManagerView
2026-06-15 20:34:15 +02:00
curo1305 9a435f8fc0 docs(phase-10): update tracking after wave 1 complete (8/12 plans) 2026-06-15 20:30:58 +02:00
curo1305 776a1d9948 chore: merge executor worktree (10-08 admin views wiring) 2026-06-15 20:30:25 +02:00
curo1305 365b0b4eca chore: merge executor worktree (10-07 AppSidebar wiring) 2026-06-15 20:30:25 +02:00
curo1305 6fe8279c90 chore: merge executor worktree (10-06 StorageBrowser+FileManager wiring) 2026-06-15 20:30:25 +02:00
curo1305 d2110c9a98 docs(10-07): complete AppSidebar skeleton + EmptyState micro + UX-14 plan
- UX-03 skeletons, UX-01 sidebar micro EmptyState, UX-14 New button removed
- 9/9 tests GREEN; StorageBrowser.startNewFolder invariant preserved
2026-06-15 20:29:21 +02:00
curo1305 24a5cbc112 docs(10-08): complete plan — admin skeletons, EmptyStates, and BreadcrumbBar wiring
- All 3 tasks complete; 8 TDD skeleton tests GREEN
- 8 views updated with BreadcrumbBar (showRoot=false)
- AdminAuditView + AdminUsersView: animated skeleton tbody rows
- AdminAuditView + SharedView + CloudStorageView: EmptyState components
- Full worktree test suite: 178/178 pass
2026-06-15 20:28:27 +02:00
curo1305 1728de77f3 feat(10-07): AppSidebar UX-03 skeletons, UX-01 EmptyState micro, UX-14 remove New button
- UX-14: remove startNewFolder/cancelNewFolder/submitNewFolder + all related state
  (showNewFolderInput, newFolderName, newFolderError) from script and template
- UX-14: remove <button @click="startNewFolder">New</button> from folder section header
- UX-14: remove inline new-folder <div v-if="showNewFolderInput"> input block
- UX-03: replace Loading… divs with animate-pulse skeleton rows (3-row pattern) in
  all three sections (folders, cloud, topics)
- UX-01 sidebar micro: wire EmptyState size=sm for each empty section
  - folders: icon=folder headline="Create a folder in the file manager"
  - cloud: icon=cloud headline="Connect in Settings" with #cta Settings link
  - topics: icon=tag headline="No topics yet"
- Add EmptyState import; StorageBrowser.startNewFolder untouched (invariant)
- Update tests to work with script setup (Composition API) reality; all 9 GREEN
2026-06-15 20:27:54 +02:00
curo1305 b076ec9cda docs(10-06): create plan summary — skeleton/EmptyState/BreadcrumbBar/toast wired
- Documents 3 tasks (TDD RED→GREEN→Task3)
- Records 164/164 tests passing, FolderBreadcrumb deleted
- Captures dead-code hygiene deviation and decisions
2026-06-15 20:27:15 +02:00
curo1305 3e79423cfd feat(10-08): BreadcrumbBar in remaining admin views + SettingsView; EmptyState in SharedView + CloudStorageView
- AdminQuotasView: BreadcrumbBar (Quotas, showRoot=false)
- AdminAiView: BreadcrumbBar (AI Config, showRoot=false)
- AdminOverviewView: BreadcrumbBar (empty segments, showRoot=false) above existing h2
- SettingsView: BreadcrumbBar with breadcrumbSegments computed (Settings > activeTabLabel)
- SharedView: BreadcrumbBar (Shared with me) + EmptyState (icon=inbox)
- CloudStorageView: BreadcrumbBar in toolbar + EmptyState (icon=cloud) with Settings router-link CTA
- Full test suite: 178 passed, 0 failures
2026-06-15 20:27:00 +02:00
curo1305 9ea51d6401 feat(10-06): wire breadcrumb mapping + toast call sites; delete FolderBreadcrumb
- FileManagerView: add mappedBreadcrumb computed ({id,label} from foldersStore.breadcrumb)
- FileManagerView: import useToastStore; add toast.show() to doMove, doDeleteDoc, onFilesSelected
- FileManagerView: remove console.error from doMove/doDeleteDoc (toast communicates errors)
- CloudFolderView: add mappedBreadcrumb computed; pass to StorageBrowser :breadcrumb
- Delete FolderBreadcrumb.vue + FolderBreadcrumb.test.js (no dead code per CLAUDE.md)
- FileManagerView.test.js: replace dead FolderBreadcrumb mock with BreadcrumbBar mock
- StorageBrowser.skeleton.test.js: remove unused FolderBreadcrumb stub
- Full suite: 164/164 pass, 0 failures
2026-06-15 20:26:06 +02:00
curo1305 8e360f4f21 feat(10-08): skeleton tables + BreadcrumbBar + EmptyState in AdminAuditView and AdminUsersView
- AdminAuditView: add BreadcrumbBar (Audit Log, showRoot=false), replace loading spinner with 8-row skeleton tbody, replace empty div with EmptyState (icon=clipboardList) + Clear filters CTA
- AdminUsersView: add BreadcrumbBar (Users, showRoot=false), replace loading spinner with 5-row x 6-col skeleton tbody
- Promote CTA test to use real EmptyState (no stub) so slot content renders
- All 8 skeleton tests pass GREEN
2026-06-15 20:25:05 +02:00
curo1305 3fcc300ebe test(10-07): promote AppSidebar.empty stubs to RED tests (UX-01, UX-03, UX-14)
- Replace 10 it.todo stubs with 9 real tests across 3 describe blocks
- UX-03: 3 tests verify skeleton rows during loading (folders/topics/cloud)
- UX-01 sidebar micro: 3 tests verify EmptyState size=sm for each empty section
- UX-14: 3 tests verify "New" button gone, methods removed, no inline folder input
- 8/9 tests RED (1 passes trivially: input hidden while showNewFolderInput=false)
- Adapted for script setup (Composition API) rather than Options API as described in plan
2026-06-15 20:23:41 +02:00
curo1305 d040e77548 feat(10-06): update StorageBrowser — skeleton rows, EmptyState, BreadcrumbBar swap
- Replace FolderBreadcrumb import with BreadcrumbBar + EmptyState imports
- Replace <FolderBreadcrumb> with <BreadcrumbBar :root-label="mode === 'cloud' ? 'Cloud' : 'Home'">
- Replace Loading… div with 5 animated skeleton rows (animate-pulse, grid-cols-[2rem_1fr_6rem_8rem_6rem])
- Replace inline empty-state divs with three <EmptyState> blocks (search/in-folder/root)
- UX-02 skeleton tests green (4/4)
2026-06-15 20:23:34 +02:00
curo1305 ec5fd23ec2 test(10-08): promote admin skeleton stubs to real RED tests — 8 failing tests
- AdminAuditView.skeleton.test.js: 5 real assertions (skeleton rows, cell count, no loading text, EmptyState, CTA)
- AdminUsersView.skeleton.test.js: 3 real assertions (skeleton rows, 6 cells, no loading text)
- All 8 tests fail until Task 2 updates the view components
2026-06-15 20:22:34 +02:00
curo1305 413d3f0ff7 test(10-06): promote UX-02 skeleton stubs to RED failing tests
- Replace 4 it.todo stubs with real assertions for animate-pulse, Loading text, and grid class
- Keep UX-13 todo block unchanged (promoted in plan 10-12)
- setActivePinia per test; stub BreadcrumbBar/SearchBar/SortControls/DropZone/UploadProgress/TopicBadge/AppIcon/EmptyState
2026-06-15 20:22:26 +02:00