feat(case-files): פאנל "קבצי-התיק" — גישה מה-UI לכל תתי-התיקיות #414
Reference in New Issue
Block a user
Delete Branch "worktree-case-files-browser"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
מימוש מוקאפ X17 מאושר (
18m-case-files-browser). פותר את הפער שהעלה היו"ר: קובץ הטיוטה שהסוכן שמר (documents/research/interim-decision-draft.md) היה נגיש רק ב-SSH לשרת — לא מה-UI.Backend —
web/app.pyהכללה של שני ה-endpoints הקיימים מ-
research/proofreadלכל תת-תיקיית-תוכן:_case_file_folders— מונה כל תת-תיקייה תחת התיק (מקור · מחולץ · מחקר · הגהה · טיוטות · גיבויים), רקורסיה שכבה אחת לתוךdocuments/, מדלג על מוסתרות (.git/.claude) ו-thumbnails._resolve_case_file— מאמתfolder-key מול רשימת-התיקיות וחוסם path-traversal (target.parent == base+is_file).GET /local-filesמחזיר את כל התיקיות כולל ריקות (files:[]);GET /local-files/{folder}/{filename}מגיש מכל תיקייה עםmedia_typeלפי סיומת.Frontend
lib/api/case-files.ts—useCaseFiles·useCaseFileText·caseFileUrl.CaseFilesBrowser— עץ-תיקיות (אקורדיון; ריקות מסומנות "ריק"; תווית-נתיב) + viewer מובנה ל-.md/.txt(רכיב Markdown הקיים) + הורדה לכל קובץ. נבחר כברירת-מחדל קובץ-טקסט ב-research. נטען בטאב "טיוטות והערות" מתחת ל-DraftsPanel.הערות
response_modelבשני ה-endpoints → אין תלות ב-api:types(מודול הטיפוסים בכתב-יד).originalsנשאר לשלמות.Invariants
בדיקות
tsc --noEmit✓ ·eslint✓ · לוגיקת enumeration+resolution נבדקה מול תיק אמיתי (מזהה 6 תיקיות, חוסם../ו-folder-key זדוני). Build מלא ב-CI.🤖 Generated with Claude Code
היו"ר לא יכל לגשת לטיוטה שהסוכן שמר בדיסק (interim-decision-draft.md) אלא ב-SSH. מימוש מוקאפ X17 מאושר (18m): פאנל דפדפן-קבצים בטאב "טיוטות והערות". Backend (web/app.py) — הכללה של ה-endpoints הקיימים ל**כל** תת-תיקייה: - `_case_file_folders` — מונה כל תת-תיקיית-תוכן תחת התיק (מקור/מחולץ/מחקר/הגהה/ טיוטות/גיבויים), רקורסיה שכבה אחת לתוך documents/, מדלג על מוסתרות (.git/.claude) ו-thumbnails. `_resolve_case_file` מאמת folder-key מול הרשימה + חוסם path-traversal. - `/local-files` מחזיר את כל התיקיות (כולל ריקות, עם files=[]); `/local-files/{folder}/{filename}` מגיש מכל תיקייה עם media-type לפי סיומת. Frontend: - `lib/api/case-files.ts` — useCaseFiles / useCaseFileText / caseFileUrl. - `CaseFilesBrowser` — עץ-תיקיות (אקורדיון, ריקות מסומנות "ריק") + viewer מובנה ל-md/txt (Markdown הקיים) + הורדה לכל קובץ. נטען בטאב "טיוטות והערות". אין response_model → אין תלות ב-api:types (מודול טיפוסים בכתב-יד). Invariants: G1, G2 (אין מסלול-קבצים מקביל — מכליל את הקיים), אבטחת-נתיב. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>