Skip to content

Claude/mcp codekeeper webapp ldnzsg - #3184

Closed
amirbiron wants to merge 6 commits into
mainfrom
claude/mcp-codekeeper-webapp-ldnzsg
Closed

Claude/mcp codekeeper webapp ldnzsg#3184
amirbiron wants to merge 6 commits into
mainfrom
claude/mcp-codekeeper-webapp-ldnzsg

Conversation

@amirbiron

Copy link
Copy Markdown
Owner

תבנית Pull Request

✨ תיאור קצר

  • מה שיניתם ולמה? (2-3 משפטים)

📦 שינויים עיקריים

  • קוד (Backend)
  • בוט טלגרם
  • מסד נתונים/מיגרציות
  • תיעוד (docs/)
  • DevOps/CI/CD

פירוט נקודות (רשימת תבליטים):

🧪 בדיקות

  • איך בדקתם? מה עבר? מה נשאר?
  • Unit
  • Integration
  • Manual

🧪 בדיקות נדרשות ב‑PR

  • 🔍 Code Quality & Security
  • Unit Tests (3.11)
  • Unit Tests (3.12)

📝 סוג שינוי

  • feat: פיצ'ר חדש
  • fix: תיקון באג
  • docs: שינוי תיעוד בלבד
  • refactor: שינוי קוד ללא שינוי התנהגות
  • perf: שיפור ביצועים
  • chore/ci: תשתית/CI
  • breaking change: שינוי שובר תאימות

דוגמאות Conventional Commits

סוג דוגמה להודעה מתי להשתמש
feat feat: הוספת מסך הגדרות פיצ'ר חדש למשתמש
fix fix: תיקון קריסה בעת התחברות תיקון באג מול משתמשים/פרודקשן
chore chore: שדרוג Gradle ל-8.9 תחזוקה, כלי פיתוח, housekeeping
docs docs: עדכון README עם הוראות התקנה שינויי תיעוד בלבד
refactor refactor: חילוץ Repository ל-UseCases שינוי מבני ללא שינוי התנהגות
test test: הוספת בדיקות ל-LoginViewModel הוספת/עדכון בדיקות
build build: הוספת flavor staging ל-CI שינויים בבילד/תלויות/תצורה

✅ צ'קליסט

  • הקוד עוקב אחרי הסגנון (Black/isort/flake8/mypy)
  • בדיקות רצות ועוברות
  • תיעוד עודכן (README/Docs)
  • אם נוספו ג'ובים חדשים (Background Jobs) – וודא שהם רשומים ב-services/register_jobs.py (כולל Callback/Trigger להפעלה ידנית — למשל callback_name/trigger_func לפי המבנה) כדי שיופיעו בדשבורד
  • אם נוספו/שונו משתני סביבה – עודכן docs/environment-variables.rst וגם services/config_inspector_service.py
  • אם נוספו/השתנו טוקנים – עודכן גם docs/webapp/theming_and_css.rst + FEATURE_SUGGESTIONS/theme_matrix.md
  • אין סודות/מפתחות בקוד
  • אין מחיקות מסוכנות/פעולות על root (ראו .cursorrules)
  • הודעת הקומיט תואמת Conventional Commits (ע"פ הטבלה)
  • CHANGELOG עודכן אם נדרש
  • כל ה‑Required Checks לעיל ירוקים
  • צילום/וידאו UI מצורף אם רלוונטי

🧩 השפעות/סיכונים

  • השפעה אפשרית על פרודקשן, ביצועים, או אבטחה:

🔗 קישורים

🧯 סיכון / החזרה לאחור (Rollback)

  • תוכנית חזרה לאחור במקרה תקלה:

claude added 5 commits July 19, 2026 22:36
מימוש דפדפן הריפו ב-MCP (קריאה בלבד, אדמין בלבד), לפי סעיף 13 במסמך התכנון:

- 4 כלים חדשים מעל ה-Repo Sync Engine הקיים (ללא לוגיקת persistence חדשה):
  codekeeper_list_repos / list_repo_tree (עימוד+סינון) / get_repo_file (מעטפת
  יציבה: ok/binary/too_large + not_found/path_denied) / search_repo (snippets).
- שער אדמין fail-closed: require_admin ב-auth.py (config.ADMIN_USER_IDS בלבד,
  בלי מפלט CHATOPS_ALLOW_ALL_IF_NO_ADMINS; רשימה ריקה = אף אחד) בגוף כל כלי,
  ו-AdminAwareFastMCP שמסתיר את הכלים מ-tools/list ללא-אדמין (הסתרה = UX,
  החסימה האמיתית בגוף).
- מדיניות סינון סודות מחייבת (repo_policy.py): חסימה/השמטה/דילוג של .env*,
  *.pem, id_rsa* וכו' בכל שלושת המשטחים; נרמול נתיבים case-insensitive על נתיב
  מלא ו-basename; fail-closed על שגיאה פנימית; הרחבה דרך MCP_REPO_DENYLIST_EXTRA.
- תקרות שרת + clamp (repo_handlers.py): limit 50/200, per_page 200/1000,
  max_results 50/100, תקציב פלט 256KB עם truncated.
- הערת הביקורת של המשתמש #1: אינדקס unique ל-repo_metadata נוצר כחלק מהפאזה —
  גם ב-scripts/create_repo_indexes.py וגם best-effort באתחול ה-backend.
- הערת הביקורת של המשתמש #2: כשל קריאה בזמן sync פעיל מחזיר
  {"error": "sync_in_progress", "retry_after": 30} (בדיקת sync_jobs.running) —
  כדי שהמודל הקורא יחזור אחרי המתנה ולא יסיק שהקובץ לא קיים.
- תיעוד: README (כולל הערת פריסה — דיסק פר-שירות ב-Render + REPO_MIRROR_PATH),
  environment-variables.rst + config_inspector (MCP_REPO_DENYLIST_EXTRA חדש),
  ועדכון סטטוס פאזה ד' במסמך התכנון (כולל retry_after וסגירת פער 6).

טסטים: 61 חדשים (policy/backend/handlers/require_admin/visibility) — 145 עוברים
סה"כ; black/ruff/flake8 נקי; אומת גם שער האדמין בשרשרת המלאה.

עיינתי בתיעוד: https://amirbiron.github.io/CodeBot/

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
…ls, index dup-guard

תיקוני code review על מימוש פאזה ד' (כל שלושת הממצאים תקפים):

- list_tree: נרמול הגנתי של page/per_page גם בשכבת ה-backend (ה-handler כבר
  עושה clamp, אבל המתודה ציבורית): קלט לא-מספרי ⇒ ברירת מחדל, רצפה של 1,
  ותקרת TREE_PER_PAGE_MAX — הערכים המנורמלים משמשים גם לחיתוך וגם בתשובה
  (בלי slicing שלילי ובלי ValueError).
- search: total משקף עכשיו את מספר ההתאמות המותרות לאחר סינון המדיניות (ולא את
  ה-total הגולמי של המנוע שכולל נתיבים חסומים), ו-truncated נדלק גם כשקיימות
  התאמות מותרות מעבר ל-max_results (בנוסף לקיטום תקציב-הבייטים ולדגל המנוע).
- create_repo_indexes.py: בדיקת כפילויות repo_name (aggregation) לפני יצירת
  ה-unique index — כפילות מדווחת ומדלגת במקום להפיל את הסקריפט באמצע ריצת
  שאר האינדקסים.

טסטים: עודכן test_search_caps_filters_and_snippets (total+truncated), נוספו
טסט אי-קיטום מתחת לתקרה וטסט נרמול קלט לעץ. 147 עוברים; black/ruff/flake8 נקי.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
הפיכת עדכון ה-mirrors בשירות ה-MCP לאוטומטי לגמרי, באותו דפוס כמו הוובאפ
(thread רקע דמון בתוך אותו שירות — לא cron ולא שירות Render נוסף):

- mcp_server/repo_autosync.py: לולאת רענון שמנצלת את מה שכבר קורה — הוובאפ
  מקבל את ה-webhook מ-GitHub ואחרי כל sync כותב last_synced_sha ל-Mongo
  המשותף. הלולאה משווה את ה-SHA המקומי ומריצה fetch כשיש סטייה; ריפו שקיים
  ב-repo_metadata אך חסר בדיסק המקומי משוכפל אוטומטית מ-repo_url
  (init_mirror אידמפוטנטי) — אין יותר initial_import ידני בצד ה-MCP.
- זרימה: merge ל-main → webhook לוובאפ → SHA ב-Mongo → ה-MCP מזהה ומושך.
- בזמן clone/fetch מקומי הכלים מחזירים sync_in_progress+retry_after
  (is_refreshing משולב ב-RepoBackend._sync_running לצד תור ה-jobs של הוובאפ).
- שליטה: MCP_REPO_AUTOSYNC (ברירת מחדל פעיל, 0 מכבה),
  MCP_REPO_AUTOSYNC_INTERVAL (ברירת מחדל 300ש', רצפה 30). מותנע מ-create_app
  עם עטיפת שגיאות — כשל בהתנעה לא מפיל את השירות.
- תיעוד: README (זרימה + ENV: צריך GITHUB_TOKENS לפרטיים, לא צריך
  GITHUB_WEBHOOK_SECRET ב-MCP), environment-variables.rst + config_inspector.

טסטים: 10 חדשים ל-refresh_once (clone-חסר, דילוג SHA-זהה, fetch על סטייה/חוסר
ודאות, בליעת שגיאות + ניקוי דגל, is_refreshing בזמן פעולה, kill-switch, רצפת
interval) + טסט backend ל-sync_in_progress ברענון מקומי. 157 עוברים; לינט נקי.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
עמוד תיעוד חדש docs/mcp-server.rst (משולב ב-toctree תחת האינטגרציות):

- מה זה נותן + ארכיטקטורה בקצרה (in-process, user_id מהטוקן, Smart Projection).
- טבלאות כל 12 הכלים — 8 כלי משתמש + 4 כלי אדמין (דפדפן הריפו).
- אימות והרשאות: PAT/OAuth מאוחדים, שכבות read/write/אדמין.
- הפעלה צעד-אחר-צעד: שירות Render → מצב PAT → מצב OAuth (כולל אילו ENV על איזה
  שירות) → דפדפן הריפו (דיסק, ADMIN_USER_IDS, GITHUB_TOKENS; בלי webhook secret).
- חיבור משלושת הלקוחות (Claude.ai / Code / Desktop) עם פקודות מוכנות להעתקה.
- autosync (זרימת merge→webhook→SHA→fetch), מדיניות סינון הסודות, התנהגות
  sync_in_progress/retry_after, עקרונות אבטחה, וטבלת פתרון תקלות.

בנוסף: תיקון docstring ב-database/collections_manager.py (get_tags_metadata) —
רשימת ההגדרות השבורה הייתה שתי האזהרות היחידות בבניית Sphinx; אחרי התיקון
הבנייה כולה על 0 אזהרות (חובה לפי מדיניות ה-RTD fail_on_warning).

אומת: בנייה מלאה exit 0 עם 0 אזהרות; doc8 נקי על העמוד החדש.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WNFuSyshwpRcxozVZEui5K
ממצא ביקורת: לוגי הכשל של autosync מדפיסים message שמגיע מתלות חיצונית
(init_mirror/fetch_updates) ועלול להכיל URL של git עם טוקן.

אימות מול הקוד: המנוע עצמו כבר מסנן את ה-stderr במקור (_run_git_command →
_sanitize_output, כולל ה-URL עם הטוקן), כך שלא נמצאה דליפה חיה בנתיבים
הקיימים — אבל אנחנו מלוגגים ערכים מתלות duck-typed, ולפי CLAUDE.md אסור
שסודות יגיעו ללוגים בכלל. לכן נוסף helper משותף `_redact`:

- מסיר credentials מ-userinfo של URL (https://user:token@host → https://***@host)
- מסיר צורות טוקן של GitHub (ghp_/gho_/ghu_/ghs_/ghr_/github_pat_)
- fail-closed: שגיאה פנימית ⇒ placeholder, לעולם לא הטקסט הגולמי
- מוחל על שני אתרי הלוג (clone failed / fetch failed)

טסטים: יחידה ל-_redact (URL עם credentials, טוקן חשוף, שימור אבחון תקין,
None) + טסט caplog שמוכיח שנתיב הכשל לא מדליף טוקן ללוג. 159 עוברים; לינט נקי.

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.

@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

@amirbiron amirbiron closed this Jul 20, 2026
Repository owner locked and limited conversation to collaborators Jul 20, 2026
@amirbiron
amirbiron deleted the claude/mcp-codekeeper-webapp-ldnzsg branch July 20, 2026 01:25
@amirbiron
amirbiron restored the claude/mcp-codekeeper-webapp-ldnzsg branch July 20, 2026 01:25
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants