chore: טעינת פריימר CodeKeeper בפתיחת סשן דרך SessionStart hook - #3212
Conversation
Reviewer's guide (collapsed on small PRs)Reviewer's GuideThis PR introduces a new configuration file File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
🧯 Dangerous deletes guard reportPolicy: see .cursorrules — dangerous deletions are blocked unless wrapped safely. Summary:
Flagged findings (file:line:snippet): Excluded matches (by path pattern) |
📝 WalkthroughWalkthroughנוספה תצורת Claude Code עם הוק Changesאינטגרציית CodeKeeper
Estimated code review effort: 2 (Simple) | ~10 דקות Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
PR Summary by QodoAdd Claude Code settings to load CodeKeeper agent primer on session start
AI Description
Diagram
High-Level Assessment
Files changed (1)
|
⏱️ Performance report(No performance test durations collected. Mark tests with |
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
Code Review by Qodo
1. Env var name mismatch
|
…gin (#3220) #3212 recorded that web session containers don't load marketplace plugins, but mcp_server/README.md never said it — so the section reads as if the repo hook and the codekeeper-plugin hook are two ways to do the same thing, and a future reader has no reason not to delete one. Names the cause: the container starts with SKIP_PLUGIN_MARKETPLACE=true, so no plugin directory and no CLAUDE_PLUGIN_ROOT exist and the plugin's hook cannot run or report. Skills sync into those containers; plugins do not. Links to codekeeper-plugin#3 for the evidence rather than repeating it here. Docs only. No code, no behaviour change. Claude-Session: https://claude.ai/code/session_01UsK3m6urmrmCJTxe46x5rP Co-authored-by: Claude <noreply@anthropic.com>
תבנית Pull Request
✨ תיאור קצר
הפלאגין
codekeeper-memoryמותקן ומופעל ברמת חשבון claude.ai, אבל סביבות ההרצה המרוחקות של Claude Code on the web לא טוענות פלאגינים מהמרקטפלייס — אין תיקיית~/.claude/plugins, וההוק שלו אף פעם לא רץ. התוצאה: הוראות הסוכן מ-CodeKeeper לא הגיעו להקשר, בשקט מוחלט.ה-PR רושם את אותה התנהגות ישירות ב-
.claude/settings.jsonשל הריפו, כך שהיא לא תלויה במנגנון הפלאגינים ורצה בכל סשן על CodeBot — מרוחק או מקומי.📦 שינויים עיקריים
פירוט נקודות:
.claude/settings.jsonעםSessionStarthook יחיד (קובץ חדש, 22 שורות, אין שינוי בקוד קיים)http— פונה ל-GET /api/agent/primerשל שירות ה-MCP ומחזירtext/plainשנכנס להקשר הסשן$CODEKEEPER_PAT, שמוצהר ב-allowedEnvVars. שום ערך סודי לא נכנס לגיט — רק שם המשתנהtimeout: 10שניות, כדי ש-cold start של Render לא יתקע את פתיחת הסשןלמה
httpולא סקריפט shellהגרסה הראשונה שנשקלה העתיקה את
session_start.shמריפו הפלאגין. הגרסה הזו עדיפה:204(אין הוראות מוגדרות) מטופל חינם: הוא 2xx עם גוף ריק, כלומר "הצלחה בלי הקשר" — בדיוק ההתנהגות שהסקריפט מימש ידניתexit 0בסקריפט נתןמה שנאבד: הודעות ה-stderr המפורטות של הסקריפט (למשל
check CODEKEEPER_PAT). מודע ומקובל.🧪 בדיקות
מה נבדק:
jq -eעל נתיב ההוק מחזיר את ה-URL, exit 0curlהחזיר401עםwww-authenticate: Bearer realm="CodeKeeper MCP", ולא404. כלומר ה-URL נכון והנתיב קייםCODEKEEPER_PATבסביבה מתחיל ב-ckmcp_באורך 49, תואם את הפורמט ב-mcp_server/README.mdמה לא נבדק: שהטוקן בתוקף (לא בוטל), ושהשדה "הוראות לסוכן" בוובאפ אינו ריק. אם הוא ריק — האנדפוינט יחזיר
204והכל יישאר שקט למרות שהתצורה תקינה. שתי הנקודות יתבררו רק בסשן הראשון אחרי ה-merge.🧪 בדיקות נדרשות ב‑PR
(כל 20 ה-checks ירוקים)
📝 סוג שינוי
✅ צ'קליסט
mcp_server/README.mdבריפו (סעיף "פריימר לסוכן"). באתר CodeBot Docs לא עיינתי — השינוי אינו נוגע לקוד או לטסטיםdocs/environment-variables.rstוגםservices/config_inspector_service.pyהערה על הסעיף האחרון:
CODEKEEPER_PATו-CODEKEEPER_PRIMER_URLאינם משתני סביבה של אפליקציית CodeBot — הם של סביבת הפיתוח של הסוכן. הם לא נקראים בשום מקום בקוד הריפו ולכן אין להם מקום ב-config inspector. אם המדיניות אומרת אחרת — אשמח לתקן.🧩 השפעות/סיכונים
אפס השפעה על הריצה של הבוט או הוובאפ. הקובץ נקרא רק על ידי Claude Code בפתיחת סשן פיתוח.
התייחסות לשני הממצאים של Qodo
1. "אי-התאמה בשם משתנה הסביבה" — לא באג.
Qodo מצביע על
mcp_server/README.md:103שמשתמש ב-$CODEKEEPER_TOKEN. אבל זו דוגמתcurlבלבד, ושם המשתנה שם הוא מקומי לדוגמה. השרת קורא את הערך בכותרתAuthorization: Bearer <value>— הוא לא יודע ולא אכפת לו איך המשתנה נקרא אצל הלקוח. אין כאן חוזה לשבור. אומת בפועל: הערך שב-CODEKEEPER_PATבפורמטckmcp_…הנכון.2. "סוד נשלח דרך הוק" — ממצא לגיטימי, ומקובל בכוונה.
זו בדיוק מטרת ה-PR: שליחת PAT לשירות של בעל הריפו כדי למשוך את הוראות הסוכן שלו. הטוקן נשלח ל-host אחד בלבד, מוצהר במפורש ב-
allowedEnvVars, ולא נשמר בגיט.הנקודה השווה מהממצא היא אחרת: מכיוון שהקובץ מגיע מהריפו, שינוי עתידי ב-
url(למשל מ-fork או PR זדוני) יכול להפנות את הטוקן ליעד אחר. המיטיגציה הנכונה היאallowedHttpHookUrlsב-~/.claude/settings.jsonהאישי — הוא מגביל לאילו כתובות הוקים מסוגhttpרשאים לפנות, והגדרות פרויקט לא יכולות לעקוף אותו. לא נכלל כאן כי מקומו בהגדרות המשתמש ולא בריפו. מומלץ להוסיף:{ "allowedHttpHookUrls": ["https://codekeeper-mcp.onrender.com/*"] }🔗 קישורים
mcp_server/README.md, סעיף "פריימר לסוכן —GET /api/agent/primer"🧯 סיכון / החזרה לאחור (Rollback)
מחיקת
.claude/settings.jsonמחזירה את המצב לקדמותו לחלוטין. אין מיגרציה, אין state, אין תלות של קוד בקובץ.ביטול זמני בלי מחיקה: הסרת ההוק דרך
/hooks, או הגדרתdisableAllHooks: trueבהגדרות המשתמש.גם בכשל מלא של השירות החיצוני אין נזק — תשובה שאינה 2xx היא שגיאה לא-חוסמת והסשן נפתח כרגיל.