Skip to content

Claude/mcp codekeeper webapp ldnzsg - #3192

Merged
amirbiron merged 8 commits into
mainfrom
claude/mcp-codekeeper-webapp-ldnzsg
Jul 20, 2026
Merged

Claude/mcp codekeeper webapp ldnzsg#3192
amirbiron merged 8 commits into
mainfrom
claude/mcp-codekeeper-webapp-ldnzsg

Conversation

@amirbiron

@amirbiron amirbiron commented Jul 20, 2026

Copy link
Copy Markdown
Owner

סיכום מה שנעשה (commit 7ea470a)

1) הזזת אייקון התיאור בכרטיס אוסף

  • האייקון ℹ️ עבר משורת ה-meta (מתחת לשם) אל צד שם הקובץ, באותה שורה, משמאל (RTL), עם רווח.
  • כשהשם ארוך ונשבר לשתי שורות — האייקון קופץ לשורת 4 הכפתורים, משמאל להם עם רווח, ולא נשאר "יתום" בשורה משלו. מומש דרך layoutDescIcons שמנצל את זיהוי ה-is-wrapped הקיים של autoFitText (סדר reset→autoFit→move כדי למנוע ריצוד).

2) ארכיון לאוספים

  • שדה is_archived חדש (נפרד מ-is_active).
  • כפתור toggle 🗄️ "הצג ארכיון" בסיידבר; במצב ארכיון הכותרת משתנה ל"🗄️ ארכיון".
  • כפתור "🗄️ ארכב" / "↩️ שחזר מארכיון" בכותרת האוסף (ליד "שנה שם"/"מחק").
  • list_collections קיבל archived_only ו-include_archived; ברירת המחדל מחריגה מאורכבים ($ne:True מכסה גם אוספים ישנים בלי השדה).

שורש שתיקנתי אגב: הגיבוי האישי (personal_backup_service) קרא ל-list_collections — עם שינוי ברירת המחדל הוא היה מפספס אוספים בארכיון בגיבוי. הוספתי include_archived=True בגיבוי ובבדיקת-הכפילות בשחזור, כדי שלא ייווצר אובדן נתונים.

בדיקות: 36 טסטי collections (כולל 4 חדשים לארכיון) + 23 MCP + 19 גיבוי — כולם ירוקים. תחביר JS תקין (node --check), Python מהודר.

מה שנשאר לך

  • Deploy לוובאפ בלבד (לא MCP, לא בוט).
  • אימות ידני אחרי deploy (אני לא יכול להריץ את הדפדפן כאן):
    • אייקון: אוסף עם קבצים בעלי תיאור — שם קצר ⇒ ℹ️ ליד השם; שם ארוך מאוד ⇒ ℹ️ בשורת הכפתורים; שינוי רוחב חלון ⇒ מתעדכן חלק.
    • ארכיון: פתיחת אוסף ⇒ "🗄️ ארכב" ⇒ נעלם מהרשימה ⇒ 🗄️ "הצג ארכיון" ⇒ מופיע ⇒ "↩️ שחזר" ⇒ חוזר.

Summary by CodeRabbit

  • תכונות חדשות

    • נוספה תצוגת ארכיון לאוספים, כולל מעבר בין אוספים פעילים למאורכבים.
    • ניתן לארכב ולשחזר אוספים ישירות ממסך האוספים.
    • פריטי אוסף מציגים תיאורי קבצים, עם חלון מידע לקריאה נוחה.
    • אוספים מאורכבים נכללים כעת בגיבוי ובשחזור.
  • שיפורים

    • שופרה אמינות רענון התוכן לאחר פריסה חדשה.
    • שופרה תצוגת כותרות, תיאורים וכפתורים במסך האוספים, כולל שמות ארוכים.
  • תיקוני באגים

    • ביטול קאש לקובץ מנקה כעת גם תצוגות Markdown קשורות.
    • תיאורי קבצים אינם מוצגים עבור קבצים לא פעילים.

claude and others added 7 commits July 20, 2026 09:18
שלושה כלים חדשים מעל קולקציית sticky_notes הקיימת של הוובאפ:
- codekeeper_list_notes — פתקי הקובץ (קריאה טהורה, בלי ה-backfill של ה-GET בוובאפ)
- codekeeper_create_note — פתק חדש על קובץ קיים; line מעגן לשורת מקור,
  בלעדיו הפתק נוצר צף עם sentinel __floating__ מפורש (אחרת ה-JS מעגן
  אוטומטית לשורה הקרובה ודורס את הכוונה)
- codekeeper_update_note — עדכון חלקי לפי note_id, עם annotation נפרד
  (destructive+idempotent) כי פתק נדרס במקום ואין לו היסטוריית גרסאות

עקרונות:
- כותבים בדיוק את סכמת הוובאפ (scope_id מ-sticky_notes_scope.make_scope_id
  הקנוני, ברירות מחדל בפריטת הקליינט) — פתק מה-MCP מופיע מיד ב-UI
- זהות תמיד מהטוקן; יצירה/עדכון מאחורי require_write
- תוכן >5000 תווים נדחה בשגיאה (לא קיטום שקט — סוכן לא ישים לב לאובדן)
- מגן אנטי-לולאה: עד 200 פתקים לקובץ ביצירה
- אינדקס (user_id, scope_id) שחסר היום נוצר lazy/best-effort — משרת גם את
  שאילתת ה-scope הזהה של הוובאפ
- בלי מחיקה ובלי תזכורות (non-goal מתועד); אפס שינויי קוד בוובאפ —
  דיפלוי לשירות ה-MCP בלבד

בדיקות: 19 טסטים הרמטיים חדשים (סניטציה, ולידציות, sentinel, צבעים,
scope filter מול make_scope_id האמיתי, סריאליזציה) + עדכון טסט הרישום.
188 טסטי MCP עוברים; black/flake8/doc8 נקיים; Sphinx נבנה עם 0 אזהרות.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
הוספת פריט "תיאור" בתפריט 3-הנקודות בעמוד הצפייה בקובץ (view_file),
ראשון ברשימה, שפותח מודאל קטן לעריכת שדה התיאור — חוסך את הכניסה
לעריכת קובץ מלאה רק כדי לשנות תיאור. "נעץ לדשבורד" עלה לשני, "שתף"
לשלישי.

- משתמש ב-endpoint הקיים POST /api/file/<id>/quick-update שמעדכן את
  התיאור in-place (מטא-דאטה, בלי גרסה חדשה) — אין קוד שרת חדש
- מודאל בדפוס מודאל השיתוף הקיים (Escape, לחיצה על הרקע, טוסט הצלחה),
  עם textarea ומונה תווים (עד 500, תואם למגבלת ה-endpoint)
- עדכון חי של התצוגה מתחת לשם ושל תווית התפריט בלי רענון עמוד
- זמין לכל הקבצים (התיאור הוא מטא-דאטה אוניברסלי)
- אין בעיית מודאל-בתוך-מודאל: התפריט (dropdown) נסגר לפני שהמודאל
  נפתח, בדיוק כמו "שתף קובץ" הקיים
- שינוי template בלבד; דורש דיפלוי לוובאפ

בדיקות: Jinja parse תקין, תחביר JS תקין; אין קוד Python שהשתנה.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
באג: אחרי deploy של תבנית, משתמשים שצפו בקובץ לאחרונה המשיכו לראות את
הגרסה הישנה (בלי אלמנטים חדשים) הרבה זמן; אחרים כן ראו חדש. השורש:
ה-ETag של /file/<id> ו-/md/<id> חושב מנתוני הקובץ בלבד (updated_at/תוכן/
version/theme) בלי גרסת ה-deploy — אז קובץ שלא נערך החזיר ETag זהה בין
deploys → הדפדפן קיבל 304 והציג HTML ישן מה-cache. תורם שני: מסלול
If-Modified-Since מבוסס updated_at החזיר 304 בנפרד.

תיקון שורשי (webapp/app.py + cache_manager.py):
- _compute_file_etag כולל עכשיו את _STATIC_VERSION (גרסת deploy) — כל
  deploy מבטל ETags ישנים. קורא מרכזי אחד ⇒ מכסה view_file וגם md_preview.
- שלושת מסלולי If-Modified-Since מכבדים RFC 7232 §3.3: מדלגים כשקיים
  If-None-Match (אחרת 304 מיושן גם אחרי שה-ETag השתנה).
- מפתח ה-cache צד-שרת של md_preview כולל את גרסת ה-deploy (אחרת HTML
  מרונדר ישן מוגש עד 30 דק').
- נלווה: invalidate_file_related מבטל עכשיו גם את המפתח האמיתי
  web:md_preview:user:*:{file_id}:* (היה prefix שגוי — עריכת קובץ לא
  ביטלה את cache ה-md שלו).

ב-Render גרסת ה-deploy מגיעה מ-RENDER_GIT_COMMIT (משתנה לכל commit).

אימות: py_compile + flake8 + 9 טסטי cache/invalidation עוברים. את לוגיקת
ה-ETag אימתתי בבידוד (הרצת הפונקציה האמיתית: גרסת deploy משנה את ה-ETag,
יציב לאותו קלט, ותוכן עדיין משנה). טסט יחידה שמייבא webapp.app לא ישים —
טסטי ה-webapp מדולגים ב-CI ("צינור הבוט") ו-flask לא זמין בסביבה.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
מתחת לכל קובץ באוסף שיש לו תיאור מופיע אייקון ℹ️; לחיצה פותחת מודאל
קטן (קריאה בלבד) עם התיאור — בלי להיכנס לקובץ.

- Backend: get_collection_items מצרף עכשיו את ה-description של הקובץ
  לכל פריט, דרך אותו batch שכבר מחשב is_file_active (הרחבת ה-projection
  ל-file_name+description) — בלי N+1 ובלי שדות כבדים (Smart Projection
  נשמר; description ≤500 תווים). קובץ בלי תיאור/לא-פעיל ⇒ "".
- Frontend: אייקון ℹ️ ב-.collection-card__meta רק אם יש תיאור;
  openDescriptionModal בדפוס .collection-modal הקיים (Escape/רקע סוגרים,
  textContent — בטוח מ-XSS).
- מצב workspace לא נכלל בשלב זה.

בדיקות: 3 טסטי enrichment חדשים (fakes שתומכים ב-projection) + 49 טסטי
collections_manager עוברים; node --check ל-JS; py_compile.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
אייקון התיאור בכרטיס קובץ עבר משורת ה-meta אל צד שם הקובץ (משמאל, RTL) באותה
שורה, עם רווח. כשהשם ארוך ונשבר לשתי שורות — האייקון "קופץ" לשורת 4 הכפתורים,
משמאל להם (פונקציה layoutDescIcons שמנצלת את זיהוי is-wrapped של autoFitText,
בסדר reset→autoFit→move כדי למנוע oscillation).

ארכיון לאוספים: שדה is_archived חדש (נפרד מ-is_active), toggle 🗄️ "הצג ארכיון"
בסיידבר, וכפתור ארכב/שחזר בכותרת האוסף (מגודר ל-non-workspace). list_collections
קיבל archived_only ו-include_archived; ברירת המחדל מחריגה מאורכבים (ne:True מכסה
גם אוספים ישנים ללא השדה). הקאש כבר מבחין לפי querystring, וה-PUT מנקה את שתי
התצוגות. הגיבוי האישי משתמש ב-include_archived=True כדי לא לפספס אוספים בארכיון.

- database/collections_manager.py: doc-build, allow-list, list filter, serializer, index+backfill
- webapp/collections_api.py: פרמטר archived ב-GET, דילוג על "שולחן עבודה" בתצוגת ארכיון
- webapp/static/js/collections.js + collections.css: אייקון, toggle, כפתורי ארכב/שחזר
- services/personal_backup_service.py: include_archived=True בגיבוי ובבדיקת כפילות
- tests/test_collections_archive.py: ארכוב/שחזור/include/legacy

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@coderabbitai

coderabbitai Bot commented Jul 20, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Changes

העדכון מוסיף ארכוב אוספים עם סינון, UI, גיבוי ותאימות לאוספים ישנים; מעשיר פריטים בתיאורי קבצים; ומעדכן ביטול קאש, ETag ו-Conditional GET.

ארכוב אוספים

Layer / File(s) Summary
מודל וסינון אוספים
database/collections_manager.py, tests/test_collections_archive.py
נוסף is_archived ליצירה, עדכון, אינדקסים, מיגרציה, סינון וייצוג ציבורי, עם בדיקות לארכוב, שחזור, הכללה ותאימות למידע ישן.
העשרת תיאורי פריטים
database/collections_manager.py, tests/test_collections_description_enrichment.py
פריטי אוספים פעילים מקבלים תיאור קובץ ממיפוי batch, עם בדיקות לתיאור קיים, ריק וקובץ לא פעיל.
שילוב ארכיון בגיבוי
services/personal_backup_service.py
ייצוא ושחזור כוללים אוספים בארכיון בבדיקת הרשימות והכפילויות.
API וממשק תצוגת ארכיון
webapp/collections_api.py, webapp/static/js/collections.js, webapp/static/css/collections.css, webapp/FEATURE_SUGGESTIONS/...
נוספו מצב ארכיון, כפתורי ארכוב ושחזור, מודאל תיאור, פריסת אייקונים, עיצוב תואם ותיעוד changelog.

ביטול קאש קבצים

Layer / File(s) Summary
ביטול קאש preview
cache_manager.py
נוסף דפוס מחיקה למפתחות preview של Markdown לפי file_id.

מטמון HTTP

Layer / File(s) Summary
ETag ו-Conditional GET
webapp/app.py
גרסת deploy נכללת ב-ETag, ו-If-Modified-Since נבדק רק ללא If-None-Match במסלולי HTTP הרלוונטיים.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Browser
  participant collections_js
  participant collections_api
  participant CollectionsManager
  participant MongoDB
  Browser->>collections_js: מעבר לתצוגת ארכיון
  collections_js->>collections_api: בקשת archived=1
  collections_api->>CollectionsManager: list_collections(archived_only=True)
  CollectionsManager->>MongoDB: שאילתת אוספים בארכיון
  MongoDB-->>CollectionsManager: תוצאות מסוננות
  CollectionsManager-->>collections_api: רשימת אוספים
  collections_api-->>collections_js: JSON
  collections_js-->>Browser: רינדור ארכיון
Loading

Poem

ארנב קטן קפץ אל הקאש,
סידר אוספים במדף חדש.
ארכיון נפתח, תיאור הופיע,
ETag התחלף — הישן נרגע.
והגזר לחש: “איזה עדכון נפלא!”

🚥 Pre-merge checks | ✅ 2 | ❌ 3

❌ Failed checks (2 warnings, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 46.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ⚠️ Warning התיאור מכיל סיכום ובדיקות, אבל חסרים רוב סעיפי התבנית: What/Why, סוג שינוי, סיכונים, קישורים ו-Rollback. להוסיף את סעיפי התבנית החסרים ולמלא אותם: תיאור קצר, שינויים עיקריים, בדיקות, סוג שינוי, השפעות/סיכונים וקישורים/Rollback.
Title check ❓ Inconclusive הכותרת כללית ולא מתארת את השינוי המרכזי ב-PR. להחליף לכותרת קצרה וספציפית שמתארת את השינוי העיקרי, למשל ארכוב אוספים ותצוגת ארכיון בוובאפ.
✅ Passed checks (2 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/mcp-codekeeper-webapp-ldnzsg

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
services/personal_backup_service.py (1)

924-999: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

שחזור גיבוי לא משמר את סטטוס הארכיון של האוסף.

_export_collections כולל אוספים בארכיון (include_archived=True), אבל ב-_restore_collections הקריאה ל-mgr.create_collection(...) (שורות 948-956) לא מעבירה is_archived, ו-create_collection בכלל לא מקבל פרמטר כזה — כל אוסף חדש נוצר עם is_archived=False (הערך הקבוע ב-doc). כתוצאה מכך, שחזור גיבוי שכולל אוספים מאורכבים "משחזר" אותם כפעילים (לא-מאורכבים), בסתירה למטרת התכונה ("תמיכה בגיבוי אוספים מאורכבים").

🛠️ הצעת תיקון: שחזור סטטוס is_archived אחרי יצירת האוסף
                 result = mgr.create_collection(
                     user_id=user_id,
                     name=coll_name,
                     description=coll.get("description", ""),
                     mode=coll.get("mode", "manual"),
                     icon=coll.get("icon"),
                     color=coll.get("color"),
                     is_favorite=coll.get("is_favorite", False),
                 )
                 if result.get("ok") and result.get("collection"):
                     new_id = result["collection"].get("id")
                     if old_id and new_id:
                         old_to_new_id[old_id] = new_id
                     collections_count += 1
+                    if coll.get("is_archived") and new_id:
+                        mgr.update_collection(user_id, new_id, is_archived=True)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@services/personal_backup_service.py` around lines 924 - 999, Update
_restore_collections around the mgr.create_collection call to preserve each
collection’s archived state from the backup. After a new collection is created,
read the source collection’s is_archived value and apply it to the created
collection using the existing collection-management/archive operation; keep
duplicate-name mappings unchanged and ensure collections without the flag remain
active.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@services/personal_backup_service.py`:
- Around line 924-999: Update _restore_collections around the
mgr.create_collection call to preserve each collection’s archived state from the
backup. After a new collection is created, read the source collection’s
is_archived value and apply it to the created collection using the existing
collection-management/archive operation; keep duplicate-name mappings unchanged
and ensure collections without the flag remain active.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: fd39254a-1936-4d68-acfb-967afa3ccf97

📥 Commits

Reviewing files that changed from the base of the PR and between 86c3331 and 7ea470a.

📒 Files selected for processing (10)
  • cache_manager.py
  • database/collections_manager.py
  • services/personal_backup_service.py
  • tests/test_collections_archive.py
  • tests/test_collections_description_enrichment.py
  • webapp/FEATURE_SUGGESTIONS/MY_COLLECTIONS_IMPLEMENTATION_GUIDE.md
  • webapp/app.py
  • webapp/collections_api.py
  • webapp/static/css/collections.css
  • webapp/static/js/collections.js

main קלט את אייקון-התיאור הבסיסי דרך squash (#3191), ולכן נוצר קונפליקט מול
העבודה החדשה בענף (הזזת האייקון + ארכיון). מיזגתי את main לענף ופתרתי:
- collections.css: נשמרה הגרסה שלי (superset — בסיס .desc-info + flex + Slot 2 + toggle ארכיון).
- collections.js: הוחזר לגרסה שלי כדי למנוע שכפול של כפתור התיאור שהמיזוג האוטומטי יצר.
תוצאת המיזוג זהה בדיוק לעבודה שכבר נבדקה (36 טסטים ירוקים).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
@github-actions

Copy link
Copy Markdown

🧯 Dangerous deletes guard report

Policy: see .cursorrules — dangerous deletions are blocked unless wrapped safely.

Summary:

  • Flagged findings (blocking): 0
    0
  • Excluded matches (not blocking): 15
  • Total matches (all files): 129

Flagged findings (file:line:snippet):
(none)

Excluded matches (by path pattern)
./webapp/static/js/md_preview.bundle.js.map:4:  "sourcesContent": ["// Markdown-it plugin to render GitHub-style task lists; see\n//\n// https://github.com/blog/1375-task-lists-in-gfm-issues-pulls-comments\n// https://github.com/blog/1825-t … [truncated]
./README.md:842:find . -name "__pycache__" -exec rm -rf {} +
./Dockerfile:42:    rm -rf /var/lib/apt/lists/*
./Dockerfile:121:    rm -rf /var/lib/apt/lists/*
./node_modules/mermaid/dist/mermaid.min.js:1524:`,"getStyles"),c1e=RQe});var h1e={};dr(h1e,{diagram:()=>NQe});var NQe,f1e=N(()=>{"use strict";$ge();a1e();l1e();u1e();NQe={parser:Fge,db:n1e,renderer:o1e,styles:c1e}});var m1e,g1e=N(()=>{"use  … [truncated]
./node_modules/mermaid/dist/mermaid.min.js.map:4:  "sourcesContent": ["/**\n* Default values for dimensions\n*/\nconst defaultIconDimensions = Object.freeze({\n\tleft: 0,\n\ttop: 0,\n\twidth: 16,\n\theight: 16\n});\n/**\n* Default values fo … [truncated]
./node_modules/mermaid/dist/chunks/mermaid.core/chunk-KS23V3DP.mjs.map:4:  "sourcesContent": ["{\n  \"name\": \"mermaid\",\n  \"version\": \"11.12.0\",\n  \"description\": \"Markdown-ish syntax for generating flowcharts, mindmaps, sequence  … [truncated]
./node_modules/mermaid/dist/chunks/mermaid.esm/chunk-2M32CCKP.mjs.map:4:  "sourcesContent": ["{\n  \"name\": \"mermaid\",\n  \"version\": \"11.12.0\",\n  \"description\": \"Markdown-ish syntax for generating flowcharts, mindmaps, sequence d … [truncated]
./node_modules/mermaid/dist/chunks/mermaid.esm.min/chunk-4HFYJGYH.mjs.map:4:  "sourcesContent": ["{\n  \"name\": \"mermaid\",\n  \"version\": \"11.12.0\",\n  \"description\": \"Markdown-ish syntax for generating flowcharts, mindmaps, sequen … [truncated]
./node_modules/mermaid/dist/chunks/mermaid.esm.min/chunk-4HFYJGYH.mjs:1:var r={name:"mermaid",version:"11.12.0",description:"Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graph … [truncated]
./node_modules/mermaid/dist/mermaid.js.map:4:  "sourcesContent": ["/**\n* Default values for dimensions\n*/\nconst defaultIconDimensions = Object.freeze({\n\tleft: 0,\n\ttop: 0,\n\twidth: 16,\n\theight: 16\n});\n/**\n* Default values for tr … [truncated]
./node_modules/katex/src/fonts/Makefile:139:	rm -rf pfa ff otf ttf woff woff2
./node_modules/katex/package.json:153:    "build": "rimraf dist/ && mkdirp dist && cp README.md dist && rollup -c --failAfterWarnings && webpack && node update-sri.js package dist/README.md",
./docs/Makefile:24:	rm -rf $(BUILDDIR)
./docs/DOCUMENTATION_GUIDE.md:453:rm -rf _build

@github-actions

Copy link
Copy Markdown

⏱️ Performance report

(No performance test durations collected. Mark tests with @pytest.mark.performance.)

@github-actions

Copy link
Copy Markdown

📖 Documentation Preview

The documentation has been built successfully!

To view locally:

  1. Download the artifacts
  2. Extract the zip file
  3. Open index.html in your browser

@codecov

codecov Bot commented Jul 20, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 91.66667% with 1 line in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
services/personal_backup_service.py 50.00% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@amirbiron
amirbiron merged commit b797529 into main Jul 20, 2026
25 checks passed
amirbiron pushed a commit that referenced this pull request Jul 20, 2026
…קט collections.css

main קלט את הארכיון והזזת האייקון דרך squash (#3192), והענף ממשיך עם תיקון
הטוקנים (991b1ad) שנגע באותה שורה. נשמרה גרסת הטוקנים של #toggleArchivedBtn
(var(--glass-*)) — ההבדל היחיד מול main, שהוחלף בכוונה. תוצאת המיזוג זהה
לחלוטין לעץ שכבר נבדק.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants