1 שלב הבסיס

Headless Mode and CLI Automation — מצב ללא ממשק ואוטומציה בשורת הפקודה

עד עכשיו ניהלתם שיחה עם Claude Code — שאלתם, קיבלתם תשובה, אישרתם. בפרק הזה אתם עוברים מ-"שיחה" ל-"שירות": Claude מקבל פקודה, מריץ, מחזיר תוצאה — בלי שום ממשק, בלי אישורים, בלי בן אדם בלופ. זו השכבה שעליה נבנים כל ה-pipelines, cron jobs, ו-CI/CD workflows שנלמד בקורס הזה.

מה יהיה לכם בסוף הפרק הזה
יעדי למידה
דרישות קדם
★ עשו עכשיו — בדיקת מוכנות 3 דקות

הריצו את הפקודות הבאות לוודא שהכל מוכן:

# בדיקת Claude Code
claude --version   # צריך 2.1.81 ומעלה

# בדיקת API key
echo $ANTHROPIC_API_KEY | head -c 10   # צריך להתחיל ב-sk-ant

# בדיקת jq
jq --version   # אם לא מותקן: brew install jq (macOS) / sudo apt install jq (Linux)

# בדיקת bash
bash --version   # צריך 4+ (macOS: brew install bash אם גרסה 3)

# Windows? בדקו WSL:
wsl --list   # אם לא מותקן: wsl --install בPowerShell כ-admin

אם אחד הכלים חסר — התקינו אותו לפני שממשיכים.

הפרויקט שלכם

בקורס CC Power User למדתם לעבוד עם Claude Code כ-Power User — הגדרתם Hooks, יצרתם Agents ו-Skills, חיברתם MCP servers, ובניתם סביבת עבודה מתקדמת עם CLAUDE.md ו-Worktrees. בפרק הזה אתם עוברים מ-"שימוש אינטראקטיבי מתקדם" ל-"אוטומציה ללא ממשק" — תלמדו להריץ את Claude Code בלי שום בן אדם בלופ, לשלב אותו בסקריפטים, ולבנות תהליכים אוטומטיים שרצים לבד. בפרק הבא תיקחו את הכלים האלה ותטמיעו אותם ב-GitHub Actions — כדי ש-Claude יעשה code review, security audit, ויצירת release notes על כל PR באופן אוטומטי.

מילון מונחים — Headless ו-CLI Automation
מונח (English) תרגום הגדרה
Headless Mode מצב ללא ממשק הרצת Claude Code ללא ממשק אינטראקטיבי — שולחים פקודה, מקבלים תוצאה, התהליך נסגר
-p Flag (Print Mode) דגל הדפסה הדגל שמפעיל מצב Headless: claude -p "prompt" — שולח prompt, מדפיס תוצאה, יוצא
--bare Flag דגל חשוף מצב מהיר שמדלג על Hooks, LSP, Plugins ו-Skills — מיועד ל-CI/CD ואוטומציה מהירה
Exit Code קוד יציאה מספר שמחזירה תוכנית כשהיא מסיימת: 0 = הצלחה, כל דבר אחר = שגיאה. הבסיס ל-error handling בסקריפטים
stdout / stderr פלט רגיל / פלט שגיאות שני ערוצי הפלט של כל תוכנית בלינוקס — stdout לתוצאות, stderr להודעות שגיאה ו-debug
Pipeline צינור עיבוד שרשרת פקודות שכל אחת מקבלת את הפלט של הקודמת כקלט — cmd1 | cmd2 | cmd3
Batch Processing עיבוד אצווה הרצת אותה פעולה על קבוצת קבצים או נתונים — במקום לעבד אחד-אחד, הכל ברצף אוטומטי
Cron Job משימה מתוזמנת פקודה שרצה באופן אוטומטי בזמנים קבועים — כל יום, כל שעה, כל שבוע. מנוהלת ע״י crontab
JSON Output Format פלט בפורמט JSON פלט מובנה עם שדות מוגדרים (result, cost, tokens_used) — קל לפירוק ועיבוד אוטומטי בקוד
Idempotency אידמפוטנטיות תכונה של פעולה שמייצרת את אותה תוצאה גם אם מריצים אותה פעמיים — קריטי לאוטומציה אמינה
apiKeyHelper סקריפט עזר למפתח סקריפט שמחזיר API key טרי בכל קריאה — לסביבות Enterprise עם key rotation
מתחיל 10 דקות מושג חינם

מ-Interactive ל-Headless — שינוי הפרדיגמה

בשלושת הקורסים הקודמים עבדתם עם Claude Code בצורה אינטראקטיבית: פתחתם טרמינל, כתבתם prompt, קראתם את התשובה, אישרתם פעולות, שאלתם שאלות המשך. זו שיחה — יש בן אדם בלופ כל הזמן. זה מעולה ללמידה, לתכנון, ולעבודה יצירתית. אבל זה לא מתאים כשצריך שהתהליך ירוץ לבד.

Headless mode (מצב ללא ממשק, נקרא גם CLI mode או Print mode) מסיר את הבן אדם מהמשוואה לחלוטין. Claude מקבל פקודה, מריץ, מייצר פלט, ויוצא. אין back-and-forth, אין אישורים, אין ממשק. זה ההבדל בין לדבר עם עובד לבין לתת לו מעטפה עם הוראות ולקבל את התוצאה מוכנה על השולחן.

למה זה כל כך חשוב? כי כל מה שתלמדו בקורס הזה — CI/CD pipelines, GitHub Actions, SDK-based agents, automated testing, scheduled monitoring — הכל מבוסס על היכולת של Claude Code לרוץ בלי בן אדם. בלי Headless mode, אין אוטומציה.

Interactive → Semi-automated → Headless → Pipeline

ספקטרום האוטומציה: Interactive = בן אדם עושה הכל. Semi-automated = בן אדם מאשר. Headless = בלי בן אדם. Pipeline = שרשרת של שלבי Headless שרצים אוטומטית. בפרק הזה אתם מטפסים מ-Headless ל-Pipeline.

דוגמאות מייצגות: מה אנשים עושים עם Headless mode

כדי להבין את הטווח של מה שאפשר לעשות, הנה כמה תרחישים נפוצים:

כל התרחישים האלה חולקים מאפיין משותף: הם חוזרים על עצמם, לא דורשים שיקול דעת אנושי בכל הרצה, ו-מייצרים ערך מצטבר. אם המשימה שלכם עונה על שלושת הקריטריונים האלה — היא מועמדת מצוינת ל-headless.

המעבר המנטלי — מ-"משתמש" ל-"אדריכל"

השינוי הכי חשוב הוא לא טכני — הוא מנטלי. כש-Claude Code רץ אינטראקטיבית, אתם משתמשים שמנהלים שיחה. כש-Claude Code רץ Headless, אתם אדריכלים שמעצבים מערכות אוטומטיות. חשבו על זה ככה: בשיחה אינטראקטיבית, אם Claude לא הבין — אתם מבהירים. ב-headless, ה-prompt צריך להיות מושלם מראש כי אין הזדמנות שנייה. זו אמנות שונה לגמרי.

ההבדל הזה משפיע על כל מה שתכתבו מעכשיו: prompts צריכים להיות מדויקים יותר, error handling צריך להיות מובנה מראש, ותכנון הפלט צריך לקחת בחשבון שמחשב — לא בן אדם — קורא את התוצאה. בואו נראה מה זה אומר בפועל:

מצב אינטראקטיבי מצב Headless
כותבים prompt ומחכים לתשובהמעצבים prompt שעובד בלי פידבק
מאשרים כל פעולה ידניתכל ההרשאות מוגדרות מראש
קוראים את הפלט ומגיביםהפלט נשמר לקובץ או מועבר לתהליך הבא
עובדים session אחד בכל פעםמריצים עשרות sessions במקביל
טעות? מתקנים ידניתטעות? הסקריפט מטפל אוטומטית
מסגרת החלטה: מתי לעבור ל-Headless?
תנאיInteractiveHeadless
צריך שיקול דעת אנושי תוך כדיכןלא
התהליך רץ יותר מפעם אחתלאכן
צריך שירוץ בלי בן אדם (cron, CI)לאכן
הפלט צריך להיכנס ל-pipelineלאכן
צריך לעבד עשרות קבציםלאכן

כלל אצבע: אם אתם מריצים את אותו prompt יותר מפעמיים — הגיע הזמן להעביר ל-Headless.

עשו עכשיו 2 דקות

פתחו טרמינל והריצו: claude -p "what is 2+2"

שימו לב מה קורה: Claude מחזיר תשובה ויוצא מיד. אין ממשק, אין שיחה. זה Headless mode.

מתחיל 15 דקות הקמה חינם

הדגל -p — הכניסה לעולם ה-Headless

הדגל -p (קיצור של --print) הוא הכלי הבסיסי ביותר: הוא שולח prompt ל-Claude, מקבל תשובה, ומדפיס אותה ל-stdout (הפלט הסטנדרטי). אחרי שהתשובה מודפסת, התהליך נסגר אוטומטית. בניגוד למצב אינטראקטיבי, אין כאן שיחה מתמשכת — זה one-shot.

שימוש בסיסי

claude -p "analyze this codebase and list all TODO comments"

הפקודה הזו מריצה את Claude, הוא מנתח את ה-codebase (כן, יש לו גישה לכלי Read ו-Bash גם ב-headless), מוצא את כל ה-TODOs, ומדפיס את הרשימה. ברגע שהוא סיים — התהליך יוצא עם exit code 0.

שימו לב — Claude ב-headless mode לא "מוגבל" יותר מהמצב האינטראקטיבי. יש לו גישה לאותם כלים בדיוק: Read, Write, Edit, Bash, Grep, Glob, ואפילו WebSearch (אם מורשה). ההבדל היחיד הוא שאין בן אדם שמאשר פעולות — ולכן ההרשאות צריכות להיות מוגדרות מראש דרך --allowedTools או דרך ה-permission system.

שם Session ומעקב

כשמריצים הרבה הרצות headless, חשוב לתת להן שמות שאפשר לעקוב אחריהם:

# שם Session מותאם — קל למצוא אחר כך
claude -p "audit code quality" -n "nightly-audit-$(date +%Y%m%d)"

# השם יופיע ב-session history
claude sessions list | grep "nightly-audit"

שם ה-session לא משפיע על ההתנהגות — הוא רק עוזר לכם לזהות הרצות בהיסטוריה, במיוחד כשיש לכם עשרות הרצות מתוזמנות ביום. בלי שמות, כל ההרצות נראות אותו דבר ב-claude sessions list ואתם לא יודעים איזו הצליחה ואיזו נכשלה.

הדגל --append-system-prompt

לפעמים צריכים להוסיף הוראות ספציפיות בלי לשנות את CLAUDE.md. הדגל --append-system-prompt מאפשר להזריק הנחיות נוספות:

claude -p "review this code" --bare \
    --append-system-prompt "Focus only on security issues. Ignore style."

זה שימושי כשאותו סקריפט צריך לרוץ עם הנחיות שונות בהקשרים שונים — למשל, סקריפט אחד שפעם רץ כ-security audit ופעם כ-performance review.

Exit codes — השפה של הסקריפטים

כל תוכנית בלינוקס מחזירה exit code כשהיא מסיימת. 0 אומר "הצלחה", כל מספר אחר אומר "שגיאה". זה קריטי לסקריפטים כי אפשר לבנות תנאים על סמך זה:

# אם Claude הצליח — הדפס הצלחה. אם נכשל — הדפס שגיאה
claude -p "run tests" && echo "All good" || echo "Something failed"

# שמור את ה-exit code למשתנה
claude -p "check code quality" --bare
EXIT_CODE=$?
if [ $EXIT_CODE -ne 0 ]; then
    echo "Claude failed with exit code $EXIT_CODE"
fi

הפניית פלט — stdout ו-pipes

מכיוון שהפלט יוצא ל-stdout, אפשר לעשות איתו כל מה שעושים עם פלט רגיל בלינוקס. זו הנקודה שהופכת את Claude Code לכלי CLI אמיתי: הוא משתלב ב-pipeline של Unix בדיוק כמו grep, sed, או כל כלי אחר שמייצר טקסט. אפשר לשמור לקובץ, לשמור למשתנה, להעביר ל-pipe, או להוסיף לקובץ קיים:

# שמירה לקובץ
claude -p "list all functions in main.py" --bare > functions.txt

# שמירה למשתנה
RESULT=$(claude -p "summarize README.md" --bare)

# העברה לכלי הבא ב-pipeline
claude -p "list bugs" --bare | grep "CRITICAL"

# הוספה לקובץ קיים (append)
claude -p "analyze errors" --bare >> daily-report.txt

שילוב עם מודלים שונים

לא חייבים להריץ Opus על כל משימה. אחד ההחלטות הכי חשובות ב-headless automation הוא בחירת מודל. Opus חכם יותר אבל יקר פי 5-15 מ-Sonnet, ו-Sonnet מספיק לרוב המשימות האוטומטיות. בחירת מודל חכמה חוסכת כסף משמעותי לאורך זמן:

# Sonnet למשימות רגילות — זול יותר, מהיר יותר
claude -p "quick code review" -m claude-sonnet-4-6

# Opus למשימות שדורשות שיקול דעת עמוק
claude -p "architecture review of entire system" -m claude-opus-4

# Haiku לבדיקות פשוטות — הכי זול
claude -p "check if file exists" -m claude-haiku-3
עשו עכשיו 3 דקות

הריצו: claude -p "list all files in this directory with their sizes" --bare > file-list.txt

פתחו את file-list.txt ובדקו שהפלט נשמר. נסו גם: claude -p "say hello" && echo "Exit code: $?"

עשו עכשיו 2 דקות

הריצו את הפקודה עם &&: claude -p "echo success" --bare && echo "Claude exited with 0"

בדקו שה-exit code מתנהג כצפוי — אם Claude מצליח, גם ה-echo השני ירוץ.

טעות נפוצה: לא לבדוק exit codes

מה קורה: מריצים claude -p בסקריפט בלי לבדוק אם הפקודה הצליחה. הסקריפט ממשיך לרוץ עם פלט ריק או שגוי.

למה זה מפתה: הכל עובד ב-happy path, אז שוכחים שדברים יכולים להיכשל.

מה לעשות במקום: תמיד בדקו $? אחרי קריאה ל-Claude, או השתמשו ב-set -e בתחילת הסקריפט כדי שכל כשלון יעצור את ההרצה.

מתחיל 10 דקות מושג חינם

הדגל --bare — מהירות מקסימלית ל-CI/CD

הדגל --bare הוצג בגרסה 2.1.81 (מרץ 2026) ונועד לסביבות אוטומציה שבהן כל שנייה חשובה. כש-Claude Code מתחיל לרוץ, הוא בדרך כלל טוען hooks, מסנכרן plugins, סורק skills, מתחבר ל-MCP servers, וקורא את CLAUDE.md. כל זה לוקח 2-5 שניות. ב-pipeline של CI שרץ מאות פעמים ביום — זה מצטבר.

--bare מדלג על כל האתחול הזה:

רכיברגיל--bare
Hooksנטעןמדולג
LSP (Language Server)נטעןמדולג
Pluginsמסונכרניםמדולג
Skills directoryנסרקמדולג
MCP serversמתחבריםמדולג
Auto-memory (MEMORY.md)נקרא/נכתבמדולג
CLAUDE.mdנטעןנטען (לא מדולג)

שימו לב: CLAUDE.md כן נטען גם ב---bare. ההוראות שלכם לפרויקט עדיין תקפות. מה שמדולג הם רק הרכיבים הדינמיים שלוקחים זמן לאתחל.

עד כמה --bare מהיר יותר? בבדיקות טיפוסיות, ההבדל הוא 2-5 שניות בזמן startup. זה לא נשמע הרבה, אבל חשבו על CI pipeline שמריץ Claude על 30 PRs ביום — זה 60-150 שניות שנחסכות. ב-batch processing של 100 קבצים, זה 200-500 שניות. ככל שהנפח גדל, החיסכון מצטבר.

מגבלת אימות

ב---bare, אימות חייב לבוא מ-ANTHROPIC_API_KEY כמשתנה סביבה או מ-apiKeyHelper. אימות מבוסס OAuth או Keychain לא זמין במצב bare. זה הגיוני — ב-CI אין מישהו שיכול לאשר חלון OAuth.

# שימוש נכון ב---bare
export ANTHROPIC_API_KEY="sk-ant-..."
claude -p "review this PR" --bare

# --bare חייב לבוא עם -p
claude -p "your prompt" --bare  # נכון
claude --bare                    # לא יעבוד — צריך -p
עשו עכשיו 3 דקות

מדדו את ההבדל בזמן: הריצו time claude -p "hello" --bare ואז time claude -p "hello" (בלי --bare). מה ההפרש?

מסגרת החלטה: מתי להשתמש ב---bare?
תרחיש--bare?הסבר
GitHub Actions CI/CDכןכל שנייה חשובה, אין צורך ב-hooks
Cron jobsכןרץ לבד, אין plugins דרושים
Docker containersכןסביבה נקייה, אין מה לדלג
סקריפט שצריך hooksלאhooks לא יטענו ב-bare
סקריפט שצריך MCP serversלאMCP לא יתחבר ב-bare
סקריפט שצריך pluginsלאplugins לא יסונכרנו
טעות נפוצה: להשתמש ב---bare כשצריך hooks

מה קורה: מוסיפים --bare "כי זה יותר מהיר" ושוכחים שיש hooks חשובים (למשל, hook שמוסיף context אוטומטי או hook שמגביל כלים).

למה זה מפתה: --bare חוסך 2-5 שניות, וזה מורגש.

מה לעשות במקום: לפני שמוסיפים --bare, בדקו אם יש hooks או plugins ב-.claude/settings.json שהתהליך שלכם תלוי בהם. אם כן — אל תשתמשו ב---bare.

בינוני 15 דקות כלי חינם

JSON Output — פלט מובנה לאוטומציה

כברירת מחדל, הפלט של -p הוא טקסט חופשי — נהדר לקריאה אנושית, אבל קשה לפירסוק אוטומטי. הדגל --output-format json משנה את זה: במקום טקסט, מקבלים אובייקט JSON מובנה עם שדות מוגדרים.

מבנה הפלט

claude -p "list 3 common bugs" --output-format json

מחזיר אובייקט JSON עם שדות כמו:

{
  "result": "1. Off-by-one errors\n2. Null pointer...",
  "tokens_used": { "input": 150, "output": 200 },
  "cost": 0.0035,
  "model": "claude-sonnet-4-6",
  "duration_ms": 2340
}

פירסוק עם jq

jq הוא כלי שורת הפקודה הסטנדרטי לעיבוד JSON. אם אין לכם אותו — התקינו עכשיו (brew install jq ב-Mac, apt install jq באובונטו).

# חילוץ רק התוצאה
claude -p "list bugs" --output-format json | jq -r '.result'

# חילוץ העלות
claude -p "analyze code" --output-format json | jq '.cost'

# חילוץ מספר הטוקנים
claude -p "review PR" --output-format json | jq '.tokens_used.output'

פירסוק ב-Python

import subprocess, json

result = subprocess.run(
    ["claude", "-p", "list all functions in main.py", "--output-format", "json"],
    capture_output=True, text=True, timeout=120
)

data = json.loads(result.stdout)
print(f"Result: {data['result']}")
print(f"Cost: ${data['cost']:.4f}")
print(f"Tokens: {data['tokens_used']}")

פירסוק ב-TypeScript / Node.js

import { execFile } from 'child_process';
import { promisify } from 'util';

const exec = promisify(execFile);

const { stdout } = await exec('claude', [
  '-p', 'summarize this project',
  '--output-format', 'json'
], { timeout: 120000 });

const data = JSON.parse(stdout);
console.log(`Result: ${data.result}`);
console.log(`Cost: $${data.cost.toFixed(4)}`);

Stream-JSON — פלט בזמן אמת

בנוסף ל-json רגיל, יש גם stream-json שמחזיר chunks בזמן אמת. זה שימושי כשבונים UI שמראה progress, או כשצריכים לעבד פלט ארוך בלי לחכות שהכל יסתיים:

# Stream JSON — כל chunk הוא אירוע נפרד
claude -p "long analysis task" --output-format stream-json | \
    jq -j '.event.delta.text? // empty'

ב-stream-json, כל שורה היא אירוע JSON נפרד עם type (text, tool_use, tool_result, done). אפשר לפלטר אותם ולהגיב בזמן אמת — למשל, להציג "מנתח קובץ X..." כל פעם שClaude משתמש בכלי Read. ב-Python אפשר לעבד stream-json כך:

import subprocess, json

process = subprocess.Popen(
    ["claude", "-p", "analyze codebase", "--output-format", "stream-json"],
    stdout=subprocess.PIPE, text=True
)
for line in process.stdout:
    event = json.loads(line)
    if event.get("type") == "tool_use":
        print(f"Claude is using: {event['tool']}")
    elif event.get("type") == "text":
        print(event.get("text", ""), end="")
process.wait()

stream-json שימושי במיוחד כשבונים dashboard או CLI tool שמראה progress — המשתמש רואה שClaude עובד במקום לחכות בחושך לתשובה.

הגבלת מבנה הפלט עם --json-schema

רוצים שהתוצאה תהיה בפורמט מדויק? השתמשו ב---json-schema כדי לכפות סכמה ספציפית:

claude -p "list 3 bugs" --output-format json \
  --json-schema '{"type":"array","items":{"type":"object","properties":{"file":{"type":"string"},"line":{"type":"integer"},"severity":{"type":"string"}}}}'

הפלט יהיה בדיוק לפי הסכמה שהגדרתם — מושלם לעיבוד אוטומטי ב-downstream pipeline.

שלושה פורמטים — מתי להשתמש בכל אחד

פורמטמתי להשתמשדוגמה
text (ברירת מחדל) כשאדם קורא את הפלט ישירות הרצת review שמודפסת לקונסול
json כשקוד צריך לפרסק את הפלט סקריפט שמחלץ cost ו-result
stream-json כשצריכים progress בזמן אמת UI שמראה "מנתח קובץ X..."

כלל אצבע: אם הפלט מגיע לסקריפט או לקוד — תמיד השתמשו ב-json. פירסוק טקסט חופשי עם regex הוא שברירי ויישבר ברגע שClaude ישנה את הניסוח.

עשו עכשיו 3 דקות

הריצו: claude -p "tell me 3 facts about Israel" --output-format json | jq -r '.result'

ואז הריצו: claude -p "same" --output-format json | jq '.cost' — ראו כמה עלתה הקריאה.

בינוני 20 דקות תרגול חינם

Shell Scripting עם Claude Code

עכשיו שאתם יודעים להריץ Claude ב-headless ולפרסק את הפלט, הגיע הזמן לשלב את זה בסקריפטים אמיתיים. Claude Code משתלב בסקריפטי bash/zsh כמו כל כלי CLI אחר — הוא מקבל קלט, נותן פלט, ואפשר לשרשר אותו עם כלים אחרים.

הכנה חיונית: קובץ .claude-env.sh

הסקריפטים בסעיף הזה משתמשים ב-source ~/.claude-env.sh כדי לטעון משתני סביבה. צרו את הקובץ הזה עכשיו לפני שממשיכים:

# צרו את הקובץ
cat > ~/.claude-env.sh << 'EOF'
#!/bin/bash
export ANTHROPIC_API_KEY="sk-ant-YOUR-KEY-HERE"
# הוסיפו עוד משתנים לפי הצורך (ראו סעיף Environment Variables בהמשך)
EOF

# הגנו על הקובץ
chmod 600 ~/.claude-env.sh

# ודאו שלא יכנס ל-git (חשוב!)
echo ".claude-env.sh" >> ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global

# בדקו שעובד
source ~/.claude-env.sh && echo "API key loaded: ${ANTHROPIC_API_KEY:0:10}..."

סעיף 7 (Environment Variables) מרחיב על משתנים נוספים, סדר קדימויות, ואבטחה. כרגע מספיק רק ה-API key.

שלד הסקריפט (Script Skeleton)

כל סקריפט שמשלב Claude Code צריך את אותו שלד בסיסי. הנה התבנית שתעבוד ל-90% מהמקרים — העתיקו אותה, התאימו את ה-prompt, והוסיפו לוגיקה ספציפית:

מה זה set -euo pipefail?

set -e = הסקריפט עוצר מיד אם פקודה נכשלת (exit code שאינו 0). set -u = שגיאה אם משתמשים במשתנה שלא הוגדר. set -o pipefail = pipe נכשל אם אחת מהפקודות בשרשרת נכשלת (לא רק האחרונה). שלושתם יחד = "strict mode" שתופס באגים מוקדם. אם סקריפט נעצר בלי הודעה — כנראה set -e תפס שגיאה. הוסיפו echo "DEBUG: reached step X" כדי לאתר היכן.

#!/bin/bash
set -euo pipefail  # strict mode: עצור בכל שגיאה (ראו הסבר למעלה)

# 1. טען משתני סביבה (צריך ליצור קודם — ראו ההכנה למעלה)
source ~/.claude-env.sh

# 2. הגדר timeout ופרמטרים
TIMEOUT=120
MODEL="claude-sonnet-4-6"

# 3. הרץ Claude עם timeout
RESULT=$(timeout $TIMEOUT claude -p "$PROMPT" -m $MODEL --bare --output-format json 2>/dev/null)

# 4. בדוק exit code
if [ $? -ne 0 ]; then
    echo "ERROR: Claude call failed" >&2
    exit 1
fi

# 5. פרסק את התוצאה
echo "$RESULT" | jq -r '.result'

# 6. רשום ללוג
echo "$(date): Claude call completed, cost: $(echo $RESULT | jq '.cost')" >> /var/log/claude-runs.log

ארבעת דפוסי הסקריפטים

רוב הסקריפטים שתכתבו נופלים לאחד מארבעה דפוסים:

דפוס 1: The Validator (המאמת)

# בדיקת PR לבעיות אבטחה — התראה רק אם יש CRITICAL
claude -p "review this PR diff for security issues" --bare | grep -q "CRITICAL" \
    && echo "SECURITY ALERT: Critical issue found!" \
    || echo "No critical issues"

דפוס 2: The Generator (המחולל)

# יצירת migration SQL מתיאור
claude -p "generate a migration SQL for adding status column to users table" --bare \
    > migrations/002_add_status.sql

דפוס 3: The Analyzer (המנתח)

# ניתוח שינויים ויצירת release notes
git diff HEAD~5 | claude -p "summarize these changes for release notes" --bare \
    > RELEASE_NOTES.md

דפוס 4: The Decision Maker (מקבל ההחלטות)

# Claude מחליט YES/NO — הסקריפט פועל בהתאם
DECISION=$(claude -p "Should this deploy proceed? Analyze: $(cat deploy-check.txt). Answer only YES or NO" --bare)
if [ "$DECISION" = "YES" ]; then
    ./deploy.sh
else
    echo "Deploy blocked by Claude analysis"
fi

Error Handling מקצועי

הדפוסים למעלה הם הבסיס, אבל בסביבת ייצור צריך error handling מקצועי. הנה הדפוס המלא:

#!/bin/bash
set -euo pipefail

# פונקציית עזר ל-error handling
handle_error() {
    local exit_code=$1
    local line_number=$2
    echo "$(date): ERROR at line $line_number, exit code $exit_code" >> /var/log/claude-errors.log
    # שלחו התראה — email, Slack webhook, או PagerDuty
    curl -s -X POST "$SLACK_WEBHOOK" \
        -d "{\"text\": \"Claude script failed at line $line_number\"}" 2>/dev/null
    exit $exit_code
}
trap 'handle_error $? $LINENO' ERR

# פונקציה שמריצה Claude עם retries
run_claude() {
    local prompt="$1"
    local max_retries=3
    local retry=0

    while [ $retry -lt $max_retries ]; do
        RESULT=$(timeout 120 claude -p "$prompt" --bare --output-format json 2>/dev/null) && break
        retry=$((retry + 1))
        echo "$(date): Retry $retry/$max_retries" >> /var/log/claude-runs.log
        sleep $((retry * 5))  # exponential backoff: 5s, 10s, 15s
    done

    if [ $retry -eq $max_retries ]; then
        echo "$(date): FAILED after $max_retries retries" >> /var/log/claude-runs.log
        return 1
    fi

    echo "$RESULT"
}

# שימוש
ANALYSIS=$(run_claude "analyze error.log and report critical issues")
echo "$ANALYSIS" | jq -r '.result'

שימו לב ל-exponential backoff — כל retry מחכה יותר זמן מהקודם. זה חשוב כי rate limiting הוא הסיבה הנפוצה ביותר לכשלון, ושליחת retry מיידי רק מחמירה את הבעיה.

דפוסי שילוב מתקדמים

כשמשלבים Claude Code בסקריפטים גדולים, שימו לב לכמה דפוסים מתקדמים:

# דפוס Chain — פלט של קריאה אחת הופך לקלט של הבאה
SUMMARY=$(claude -p "summarize this README.md" --bare)
TRANSLATION=$(echo "$SUMMARY" | claude -p "translate this to Hebrew" --bare)
echo "$TRANSLATION" > README.he.md

# דפוס Map-Reduce — עבדו על חלקים במקביל, אחדו בסוף
for module in auth payments notifications; do
    claude -p "review the $module module" --bare > /tmp/review-$module.txt &
done
wait
cat /tmp/review-*.txt | claude -p "synthesize these reviews into a unified report" --bare > final-review.txt

# דפוס Guard — בדיקת תנאי מקדים לפני פעולה
SAFE=$(claude -p "Is it safe to run database migration right now? Check: $(pg_stat_activity). Answer YES or NO only" --bare)
if [ "$SAFE" != "YES" ]; then
    echo "Migration blocked: database is busy"
    exit 1
fi
./run-migration.sh

הזרמת נתונים ל-Claude

אפשר להזרים נתונים לתוך Claude באמצעות pipe. זו אחת הדרכים החזקות ביותר לשלב Claude ב-pipeline — במקום שClaude יקרא קבצים בעצמו, אתם שולחים לו את הנתונים ישירות:

# ניתוח לוג שגיאות
cat error.log | claude -p "analyze these errors and suggest fixes" --bare

# ניתוח diff — Claude מקבל את השינויים ישירות
git diff | claude -p "review this code change" --bare

# ניתוח תוצאות בדיקות
npm test 2>&1 | claude -p "explain these test failures" --bare

# שרשור כלים — grep מסנן, Claude מנתח
grep "ERROR" application.log | tail -50 | claude -p "categorize these errors by root cause" --bare

# בדיקת חולשות אבטחה — npm audit מייצר דוח, Claude מפרש
npm audit --json | claude -p "prioritize these vulnerabilities by risk" --bare

טיפ חשוב: כשמזרימים נתונים דרך pipe, הנתונים הופכים לחלק מה-prompt. אם הקובץ גדול (10,000+ שורות), זה צורך הרבה טוקנים. סננו עם head, tail, או grep לפני ששולחים ל-Claude.

שילוב כלים — Claude כחלק מ-pipeline

הכוח האמיתי של headless mode הוא שClaude הופך לכלי CLI רגיל. בדיוק כמו שמשתמשים ב-grep, sed, awk — אפשר לשלב את claude -p בתוך pipeline:

# Pipeline מלא: מצא שינויים → סנן Python → Claude מנתח → שמור דוח
git diff --name-only HEAD~3 | \
    grep "\.py$" | \
    xargs -I {} sh -c 'echo "=== {} ===" && cat {}' | \
    claude -p "review these Python changes for bugs and suggest fixes" --bare \
    > code-review-report.txt

בדוגמה הזו, ארבעה כלים עובדים ביחד: git diff מוצא שינויים, grep מסנן רק Python, xargs+cat מדפיס את התוכן, ו-Claude מנתח הכל. זה pipeline automation אמיתי.

עוד דפוס חזק: Claude כמתווך בין שני כלים. למשל, npm audit מייצר רשימת חולשות אבטחה בפורמט טכני מסובך. Claude הופך את זה לדוח מסודר עם סדר עדיפויות:

# npm audit מחזיר JSON טכני → Claude ממיר לדוח מובן
npm audit --json 2>/dev/null | \
    claude -p "Analyze this npm audit report. List the top 5 vulnerabilities by severity. For each: package name, severity, recommendation. Format as Markdown." --bare \
    > security-report.md

או דפוס compare-and-decide: שני outputs שונים, Claude מחליט מה עדיף:

# השוואה בין שני branches — Claude ממליץ מה לעשות merge
DIFF_A=$(git diff main...feature-a -- src/)
DIFF_B=$(git diff main...feature-b -- src/)

echo "Branch A changes: $DIFF_A" > /tmp/compare.txt
echo "Branch B changes: $DIFF_B" >> /tmp/compare.txt

RECOMMENDATION=$(cat /tmp/compare.txt | \
    claude -p "Compare these two sets of changes. Which should merge first? Why? Any conflicts?" --bare)

echo "$RECOMMENDATION"
עשו עכשיו 5 דקות

צרו קובץ בשם claude-check.sh עם 6 שורות:

  1. Shebang (#!/bin/bash)
  2. set -euo pipefail
  3. Export של ANTHROPIC_API_KEY
  4. קריאה ל-claude -p "check if this directory has a README" --bare עם timeout
  5. בדיקת exit code
  6. הדפסת התוצאה

הריצו את הסקריפט ובדקו שהוא עובד.

תרגיל מעשי: בניית סקריפט Headless מלא

זמן משוער: 20 דקות

מה תבנו: סקריפט Shell מלא שמריץ Claude ב-headless mode, כולל error handling, timeout, JSON parsing, ו-logging.

  1. צרו קובץ headless-analyzer.sh
  2. הוסיפו strict mode (set -euo pipefail)
  3. טענו משתני סביבה מקובץ (או הגדירו ישירות)
  4. קבלו prompt כ-argument מהשורת פקודה: PROMPT="$1"
  5. הריצו claude -p "$PROMPT" --bare --output-format json עם timeout של 120 שניות
  6. פרסקו את הפלט עם jq — חלצו result ו-cost
  7. בדקו exit code — אם נכשל, הדפיסו שגיאה ל-stderr
  8. כתבו לקובץ לוג: timestamp, prompt (20 תווים ראשונים), cost, status

תוצאה מצופה: סקריפט שניתן להריץ כך: ./headless-analyzer.sh "review main.py" ומקבלים תוצאה מפורסקת + רשומת לוג.

בינוני 20 דקות תרגול freemium

Batch Processing — עיבוד קבצים במקביל

אחד השימושים החזקים ביותר של headless mode הוא עיבוד אצווה — הרצת אותה פעולה על עשרות או מאות קבצים. במקום לפתוח כל קובץ ידנית ב-Claude ולבקש review, אפשר לכתוב לולאה שעוברת על כל הקבצים ומעבדת אותם אוטומטית.

לולאה בסיסית

# עיבוד כל קבצי TypeScript בתיקייה
for f in src/*.ts; do
    echo "Processing: $f"
    claude -p "review $f for type safety issues" --bare >> review-report.txt
    echo "---" >> review-report.txt
done

עיבוד מקבילי עם xargs

# הרצה מקבילית — 4 תהליכים במקביל
find . -name "*.py" | xargs -P 4 -I {} \
    claude -p "add docstrings to all functions in {}" --bare

זהירות: -P 4 אומר 4 תהליכים במקביל. אל תשימו 100 — ה-API יחסום אתכם עם rate limiting. ההמלצה היא להתחיל עם 2-4 תהליכים מקביליים, לבדוק שאין שגיאות 429, ולהעלות בהדרגה רק אם ה-API מאפשר. בתוכניות Enterprise יש לפעמים rate limits גבוהים יותר, אבל תמיד כדאי להתחיל צנוע.

הפקודה /batch

Claude Code מציע גם פקודה מובנית — /batch — שעובדת ברמה גבוהה יותר:

הפעלה: פתחו Claude Code במצב אינטראקטיבי והקלידו:

# בתוך Claude Code interactive session:
/batch add comprehensive JSDoc comments to all exported functions

# Claude יסרוק את הפרויקט, יחלק את העבודה, ויפתח PR נפרד לכל חלק.
# תראו פלט כזה:
# Planning batch operation...
# Found 12 files to process
# Creating 4 worktrees...
# [1/4] Processing src/auth/*.ts → PR #42
# [2/4] Processing src/api/*.ts → PR #43
# ...

ההבדל: /batch מתאים לשינויים מתואמים שצריכים עקביות (למשל, שינוי API signature בכל הקבצים שמשתמשים בו). לולאות ידניות מתאימות לפעולות בלתי תלויות (למשל, review לכל קובץ בנפרד). אם אתם לא בטוחים — השאלה היא: "אם משימה אחת נכשלת, זה משפיע על האחרות?" אם כן — /batch. אם לא — לולאה ידנית.

חישוב עלויות לפני batch

לפני שמריצים batch על 200 קבצים, חשבו על העלות. הנה נוסחה פשוטה:

# עלות משוערת
מספר_קבצים × טוקנים_ממוצעים_לקובץ / 1,000,000 × מחיר_למיליון_טוקנים

# דוגמה: 200 קבצים, 2000 טוקנים בממוצע, Sonnet ($3/M input)
200 × 2000 / 1,000,000 × 3 = $1.20

# אותה עבודה עם Opus ($15/M input)
200 × 2000 / 1,000,000 × 15 = $6.00

ההפרש פי 5 מסביר למה batch processing צריך להשתמש במודל הזול ביותר שנותן תוצאות מספיק טובות. Sonnet מצטיין במשימות שגרתיות כמו docstrings, type hints, ו-code review. שמרו את Opus למשימות שדורשות שיקול דעת עמוק.

דפוס ה-Dry Run

לפני שמעבדים 200 קבצים, תמיד עשו dry run על 3 קבצים ראשונים:

# Dry run — רק 3 קבצים ראשונים
for f in $(ls src/*.ts | head -3); do
    echo "=== DRY RUN: $f ==="
    claude -p "review $f" --bare
done

# אם התוצאות טובות — רוצו על הכל
echo "Dry run complete. Run full batch? (y/n)"
read CONFIRM
if [ "$CONFIRM" = "y" ]; then
    for f in src/*.ts; do
        claude -p "review $f" --bare >> full-review.txt
        sleep 2  # rate limiting
    done
fi

מעקב אחרי עלויות

TOTAL_COST=0
for f in src/*.ts; do
    RESULT=$(claude -p "review $f" --bare --output-format json)
    COST=$(echo $RESULT | jq '.cost')
    TOTAL_COST=$(echo "$TOTAL_COST + $COST" | bc)
    echo "$f: $$COST" >> cost-log.txt
done
echo "Total batch cost: $$TOTAL_COST"
טעות נפוצה: 100 קריאות מקבילות בלי rate limiting

מה קורה: כותבים xargs -P 100 או שולחים מאה קריאות במקביל. ה-API מחזיר 429 (Too Many Requests) וכל הקריאות נכשלות.

למה זה מפתה: "אם 4 מקבילים טוב, 100 בטוח יותר טוב!"

מה לעשות במקום: התחילו עם -P 2-4, הוסיפו sleep 1-2 בין קריאות, ועקבו אחרי ה-rate limit headers. אם יש לכם 200+ קבצים, השתמשו ב-Sonnet או Haiku — העלות נמוכה פי 5-60 מ-Opus.

עשו עכשיו 4 דקות

צרו 3 קבצי טקסט בתיקייה (echo "test content" > file1.txt וכו'). כתבו לולאת for שמעבירה כל אחד ל-claude -p "summarize this file: $(cat $f)" --bare.

תרגיל מעשי: Batch Processor לתיקיית קבצים

זמן משוער: 25 דקות

מה תבנו: סקריפט batch processing מתקדם עם cost tracking ו-dry run mode.

  1. צרו תיקיית test-files עם 5 קבצי טקסט שונים (כל אחד עם תוכן שונה)
  2. כתבו סקריפט batch-processor.sh שמקבל: תיקיית קלט, prompt, ו-flag של --dry-run
  3. במצב dry-run: הסקריפט מעבד רק 2 קבצים ראשונים ומדפיס תוצאות
  4. במצב רגיל: מעבד את כל הקבצים עם sleep 2 בין קריאות
  5. לכל קובץ: שמרו את התוצאה + עלות ב-cost-log.txt
  6. בסוף: הדפיסו סיכום — כמה קבצים עובדו, עלות כוללת, זמן כולל

תוצאה מצופה: סקריפט שניתן להריץ כך: ./batch-processor.sh ./test-files "summarize this file" --dry-run

מתחיל 10 דקות הקמה חינם

Environment Variables והגדרות

כל הרצה של Claude Code ב-headless mode תלויה במשתני סביבה. אם ה-API key לא מוגדר — שום דבר לא ירוץ. אבל יש הרבה יותר משתנים מעבר ל-API key, וסדר הקדימויות שלהם חשוב.

המשתנים החיוניים

משתנהמה הוא עושהחובה?
ANTHROPIC_API_KEYמפתח ה-API של Anthropic — בלעדיו שום דבר לא עובדכן
CLAUDE_MODELמודל ברירת מחדל (למשל claude-sonnet-4-6)לא
CLAUDE_CODE_MAX_OUTPUT_TOKENSמגביל את מספר הטוקנים בפלט — לשליטה בעלויותלא
ANTHROPIC_DEFAULT_SONNET_MODELמגדיר איזה Sonnet ספציפי להשתמשלא
CLAUDE_CODE_USE_BEDROCKניתוב דרך AWS Bedrockלא
CLAUDE_CODE_USE_VERTEXניתוב דרך Google Vertex AIלא

היררכיית הגדרות

Claude Code קורא הגדרות ממספר מקורות, ויש להן סדר קדימויות ברור:

משתני סביבה (הכי גבוה)
    ↓
settings.json ברמת פרויקט (.claude/settings.json)
    ↓
settings.json גלובלי (~/.claude/settings.json)
    ↓
ברירות מחדל (הכי נמוך)

זה אומר שאם הגדרתם CLAUDE_MODEL כמשתנה סביבה, זה ידרוס כל הגדרה ב-settings.json.

הדפוס של .claude-env.sh

במקום להגדיר משתנים בכל סקריפט מחדש, צרו קובץ אחד:

# ~/.claude-env.sh — DON'T commit to git!
export ANTHROPIC_API_KEY="sk-ant-api03-..."
export CLAUDE_MODEL="claude-sonnet-4-6"
export CLAUDE_CODE_MAX_OUTPUT_TOKENS="4096"

ואז בכל סקריפט:

#!/bin/bash
source ~/.claude-env.sh
# ... rest of script

חשוב: הוסיפו את .claude-env.sh ל-.gitignore כדי שהמפתח שלכם לא יגיע ל-git.

apiKeyHelper — עבור סביבות Enterprise

בארגונים גדולים, API keys מתחלפים בקביעות (key rotation). במקום לעדכן כל סקריפט ידנית, אפשר להשתמש ב-apiKeyHelper — סקריפט שמחזיר key טרי בכל קריאה:

# apiKeyHelper הוא סקריפט שמחזיר API key
# Claude Code מריץ אותו לפני כל קריאת API

# דוגמה: סקריפט שקורא key מ-AWS Secrets Manager
#!/bin/bash
aws secretsmanager get-secret-value \
    --secret-id "claude-api-key" \
    --query 'SecretString' \
    --output text

# ב-settings.json:
{
  "apiKeyHelper": "/path/to/get-api-key.sh"
}

זה רלוונטי בעיקר לסביבות שבהן אסור לשמור API keys כטקסט — למשל ארגונים עם תקני אבטחה מחמירים (SOC2, ISO 27001). אם אתם מפתחים יחידים, .claude-env.sh עם .gitignore מספיק.

הגדרות ב-settings.json

מעבר למשתני סביבה, אפשר להגדיר הגדרות קבועות ב-settings.json:

# הגדרות ברמת פרויקט — .claude/settings.json
{
  "model": "claude-sonnet-4-6",
  "permissions": {
    "allow": ["Read", "Grep", "Glob"],
    "deny": ["Write", "Edit", "Bash"]
  },
  "env": {
    "CLAUDE_CODE_MAX_OUTPUT_TOKENS": "4096"
  }
}

# הגדרות גלובליות — ~/.claude/settings.json
{
  "model": "claude-sonnet-4-6",
  "theme": "dark"
}

ההגדרות ברמת פרויקט חשובות במיוחד ל-headless: הן מגדירות אילו כלים Claude מורשה להשתמש בהם כשאין בן אדם שמאשר. אם אתם מריצים Claude על cron job שרק קורא נתונים — הגבילו ל-Read ו-Grep בלבד. זה מונע מצב שבו Claude משנה קבצים בטעות.

טעות נפוצה: שמירת API keys ב-git

מה קורה: שמים את ה-API key ישר בסקריפט, עושים commit, ה-key חשוף לכל מי שיש לו גישה ל-repo.

למה זה מפתה: "זה רק repo פרטי, אף אחד לא יראה"

מה לעשות במקום: השתמשו ב-.claude-env.sh שנמצא ב-.gitignore, או ב-GitHub Secrets ל-CI, או ב-Vault/AWS SSM לייצור. אף פעם אל תשימו API key ישר בקוד.

עשו עכשיו 3 דקות

צרו קובץ ~/.claude-env.sh עם export של ANTHROPIC_API_KEY ו-CLAUDE_MODEL. הוסיפו אותו ל-.gitignore. בדקו שהוא עובד: source ~/.claude-env.sh && echo $CLAUDE_MODEL

בינוני 15 דקות הקמה חינם

Cron Jobs ותהליכים מתוזמנים

עד עכשיו הרצתם Claude ידנית — גם אם זה מסקריפט, עדיין הייתם צריכים להפעיל את הסקריפט. השלב הבא: תהליכים שרצים לבד, על לוח זמנים, בלי שתיגעו בהם. זה מה שהופך אוטומציה מ-"נוחות" ל-"תשתית": ברגע שסקריפט רץ על cron, הוא הופך לחלק מהתשתית של הארגון שלכם — כמו מערכת ניטור, כמו backup, כמו CI. והחלק הכי יפה? Claude Code עובד מעולה בתרחישים כאלה כי הוא מבין הקשר ויכול לזהות דפוסים שכלים מסורתיים מפספסים.

Windows? יש אלטרנטיבות

cron ו-systemd הם כלי Linux/macOS. אם אתם על Windows:

cron — הקלאסיקה

Cron הוא מנגנון התזמון הוותיק ביותר בלינוקס. הוא פשוט, אמין, ועובד על כל מערכת Unix/Linux. כל שורה ב-crontab מגדירה שני דברים: מתי לרוץ ומה להריץ. אם אתם עובדים עם שרתים — cron הוא כנראה מה שתשתמשו בו. אם אתם בענן — יש אלטרנטיבות מודרניות (נגיע אליהן בהמשך).

# פתחו את ה-crontab לעריכה
crontab -e

# הוסיפו שורה — דוגמה: כל יום ב-8 בבוקר
0 8 * * * /usr/local/bin/claude -p "generate daily report for project X" --bare > /var/log/claude-daily.log 2>&1

# כל שעה בימי עבודה (ראשון-חמישי)
0 * * * 0-4 /home/user/scripts/claude-monitor.sh >> /var/log/claude-monitor.log 2>&1

תחביר cron:

דקה  שעה  יום-בחודש  חודש  יום-בשבוע
  0    8       *         *       *        = כל יום ב-8:00
  */5  *       *         *       *        = כל 5 דקות
  0    0       1         *       *        = ה-1 לחודש בחצות
טעות נפוצה: cron job שנשכח ועולה כסף

מה קורה: מגדירים cron job לבדיקה, שוכחים ממנו, והוא רץ כל יום/שעה וצורך טוקנים. אחרי חודש — חשבון API מפתיע.

מה לעשות: אחרי שבדקתם שה-cron job עובד, מחקו אותו מיד: crontab -e ומחקו את השורה (או הוסיפו # בתחילתה). כשתרצו להפעיל לצמיתות — הוסיפו מחדש בכוונה. בדקו מה רץ עכשיו: crontab -l

systemd timers — האלטרנטיבה המודרנית

systemd timers מציעים יתרונות על cron: logging מובנה (אפשר לראות הכל ב-journalctl), מנגנון restart אוטומטי אם הסקריפט קורס, ניהול תלויות (למשל "אל תריץ אם אין רשת"), ואפשרות לראות סטטוס בזמן אמת. ברוב ההתקנות המודרניות של Linux, systemd timers הם הבחירה המועדפת.

# /etc/systemd/system/claude-audit.service
[Unit]
Description=Claude Code Daily Audit
After=network.target

[Service]
Type=oneshot
ExecStart=/home/user/scripts/claude-audit.sh
User=user
Environment=ANTHROPIC_API_KEY=sk-ant-...

# /etc/systemd/system/claude-audit.timer
[Unit]
Description=Run Claude audit daily

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
# הפעלה
sudo systemctl enable --now claude-audit.timer

# בדיקת סטטוס
systemctl status claude-audit.timer
systemctl list-timers

Desktop Scheduled Tasks — תזמון ב-macOS ו-Windows

מגרסת 2.1.81, Claude Code מציע גם Desktop Scheduled Tasks — תזמון שרץ מהאפליקציה הדסקטופית ושורד restarts. זה זמין ב-macOS ו-Windows בלבד (לא Linux). היתרון: לא צריך להגדיר cron ידנית, הממשק גרפי, והמשימות רצות כל עוד האפליקציה פתוחה.

חשוב: Desktop Scheduled Tasks הם אופציה נוחה לפיתוח מקומי, אבל ל-production תמיד העדיפו cron או systemd — הם אמינים יותר, עובדים ב-headless (שרתים בלי GUI), ומשתלבים במערכות ניטור.

Cloud Schedulers

אם ה-infrastructure שלכם בענן, יש אלטרנטיבות מודרניות ל-cron:

שירותספקיתרון
EventBridge SchedulerAWSמשתלב עם Lambda ו-Step Functions
Cloud SchedulerGoogle Cloudממשק ניהול מרכזי עם retry logic
GitHub Actions ScheduleGitHubcron ישירות ב-workflow YAML — בלי שרת
# GitHub Actions scheduled workflow — cron בלי שרת
name: Daily Claude Audit
on:
  schedule:
    - cron: '0 8 * * *'  # כל יום ב-8 בבוקר UTC
jobs:
  audit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: |
          npm install -g @anthropic-ai/claude-code
          claude -p "audit codebase for security issues" --bare > audit-report.txt
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

בפרק הבא נעמיק ב-GitHub Actions, אבל שימו לב — גם תזמון של Claude יכול לרוץ ב-GitHub Actions בלי שום שרת משלכם.

הפקודה /loop — תזמון בתוך session

אם אתם צריכים תזמון בתוך session פעיל (לא headless), יש את /loop:

/loop 5m check deploy status

זה ירוץ כל 5 דקות כל עוד ה-session פתוח. שימושי לניטור deploy בזמן אמת, או לבדיקת CI status כשמחכים ל-build. אבל /loop לא מחליף cron — כי זה מת ברגע שסוגרים את ה-session. חשבו על זה כ-"timer זמני" לשימוש חד-פעמי, לא כ-"שירות מתוזמן".

Idempotency — למה זה חשוב לתזמון

Idempotency (אידמפוטנטיות) אומר שפעולה מייצרת את אותה תוצאה גם אם מריצים אותה פעמיים. זה קריטי ל-cron jobs כי:

פתרון: הוסיפו שכבת validation שבודקת את הפלט לפני שמשתמשים בו. למשל:

#!/bin/bash
# cron job עם validation layer
REPORT=$(claude -p "generate daily security report" --bare --output-format json)

# בדיקות validation
WORD_COUNT=$(echo "$REPORT" | jq -r '.result' | wc -w)
if [ "$WORD_COUNT" -lt 50 ]; then
    echo "$(date): Report too short ($WORD_COUNT words), skipping" >> /var/log/claude-cron.log
    exit 1
fi

# בדיקה שאין שגיאה ב-output
if echo "$REPORT" | jq -r '.result' | grep -qi "error\|unable\|cannot"; then
    echo "$(date): Report contains error indicators, manual review needed" >> /var/log/claude-cron.log
    exit 1
fi

# הכל תקין — שמור את הדוח
echo "$REPORT" | jq -r '.result' > /var/reports/daily-$(date +%Y%m%d).txt
echo "$(date): Report generated successfully" >> /var/log/claude-cron.log

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

ניטור הרצות מתוזמנות

ברגע שיש לכם כמה cron jobs שמריצים Claude, אתם צריכים ניטור. הנה גישה פשוטה:

# בכל סקריפט — כתבו שורת סטטוס סטנדרטית
echo "$(date)|$SCRIPT_NAME|$STATUS|$COST|$DURATION_MS" >> /var/log/claude-monitor.csv

# סקריפט ניטור שבועי — מסכם עלויות וכשלונות
echo "=== Weekly Claude Summary ==="
echo "Total runs: $(wc -l < /var/log/claude-monitor.csv)"
echo "Failures: $(grep "|FAILED|" /var/log/claude-monitor.csv | wc -l)"
echo "Total cost: $(awk -F'|' '{sum+=$4}END{print sum}' /var/log/claude-monitor.csv)"
עשו עכשיו 5 דקות

פתחו crontab -e והוסיפו שורה שמריצה claude -p "what day is it?" --bare >> /tmp/claude-cron-test.log 2>&1 כל 5 דקות (*/5 * * * *). חכו 5 דקות ובדקו את הלוג.

תרגיל מעשי: Cron Job אוטומטי

זמן משוער: 20 דקות

מה תבנו: תהליך מתוזמן שמריץ Claude Code ומייצר דוח יומי.

  1. צרו סקריפט daily-claude-report.sh שמריץ claude -p עם prompt שרלוונטי לפרויקט שלכם
  2. הוסיפו logging עם timestamps: echo "$(date): Starting daily report" >> log.txt
  3. הוסיפו error handling — אם Claude נכשל, כתבו "FAILED" ללוג
  4. הגדירו cron entry שמריץ את הסקריפט כל יום ב-8 בבוקר
  5. הריצו ידנית לבדיקה: ./daily-claude-report.sh
  6. בדקו שה-cron entry נרשם: crontab -l

תוצאה מצופה: Cron job עובד שמריץ Claude Code מדי יום ומתעד הכל בלוג.

מתקדם 10 דקות כלי חינם

Git Worktrees במצב Headless

הדגל -w (worktree) משלב את headless mode עם git worktrees — כלי מבודד שמאפשר לעבוד על כמה branches במקביל בלי לעשות checkout:

# Claude יוצר worktree חדש, עובר ל-branch, מריץ את המשימה
claude -p "implement feature X" -w feature-x --bare

מה קורה מאחורי הקלעים:

  1. נוצר git worktree חדש ב-.claude/worktrees/feature-x
  2. נוצר branch חדש feature-x
  3. Claude רץ ב-worktree המבודד — כל השינויים שלו שם
  4. השינויים נשמרים ב-branch ולא משפיעים על ה-main

עבודה מקבילית

# הרצת 3 features במקביל
for feature in "add-auth" "fix-cache" "update-docs"; do
    claude -p "implement: $feature" -w "$feature" --bare &
done
wait  # חכה לכולם

שילוב worktree עם --bare

השילוב של -w עם --bare נותן ביצועים מקסימליים ב-CI: כל worktree רץ ב-branch נפרד, בלי overhead של hooks:

# CI job שמריץ 3 features במקביל עם bare
for feature in "add-auth" "fix-cache" "update-docs"; do
    claude -p "implement: $feature. Write tests. Commit changes." \
        -w "$feature" --bare &
done
wait  # חכה לכל ה-backgrounds

# אחרי שסיימו — בדוק את ה-branches
for feature in "add-auth" "fix-cache" "update-docs"; do
    echo "=== $feature ==="
    git log "$feature" --oneline -3
done

Sparse Paths — לפרויקטים גדולים

ב-monorepo גדול (למשל, פרויקט עם 50 packages), לא צריך לטעון את כל הקוד לכל worktree. ההגדרה worktree.sparsePaths מגבילה אילו נתיבים נטענים — מה שמאיץ את היצירה ומקטין צריכת דיסק:

# ב-settings.json
{
  "worktree": {
    "sparsePaths": ["packages/auth/", "packages/shared/"]
  }
}

כש-sparsePaths מוגדר, ה-worktree ייצור רק עם הנתיבים האלה — Claude לא יראה את שאר הקוד, וזה גם חוסך context tokens.

ניקוי

Worktrees שנשארים אחרי שהעבודה הסתיימה תופסים מקום בדיסק ומבלבלים. נקו אותם:

git worktree prune  # מנקה worktrees שנמחקו מהדיסק
git worktree list   # רואים מה עדיין קיים

# ניקוי אגרסיבי — מוחק את כל ה-worktrees של Claude
rm -rf .claude/worktrees/*
git worktree prune
טיפ: סקריפט ניקוי אוטומטי ל-Worktrees

הוסיפו את הסקריפט הזה ל-cron יומי כדי לנקות worktrees ישנים מעל 24 שעות:

#!/bin/bash
# cleanup-worktrees.sh — מנקה worktrees שלא השתנו ביום האחרון
find .claude/worktrees -maxdepth 1 -type d -mtime +1 -exec rm -rf {} \; 2>/dev/null
git worktree prune
echo "$(date): Cleaned stale worktrees" >> /tmp/worktree-cleanup.log
עשו עכשיו 3 דקות

הריצו: claude -p "create a file called test.txt with 'hello worktree'" -w test-worktree --bare

בדקו: git worktree list — ראו שנוצר worktree חדש. אחר כך: git worktree prune לניקוי.

בינוני 15 דקות ניתוח חינם

Debugging של הרצות Headless

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

הדגל --verbose

# הרצה עם logging מפורט
claude -p "analyze project" --bare --verbose 2>debug.log

# הפלט הרגיל הולך ל-stdout, ה-debug ל-stderr (שנשמר לקובץ)

--verbose מוסיף מידע על: אילו כלים Claude השתמש, כמה זמן כל שלב לקח, מה ההחלטות שהוא קיבל, ואם היו שגיאות פנימיות.

סולם ה-Debug (Debug Ladder)

כשמשהו לא עובד, תעברו על הסולם הזה מלמעלה למטה:

שלבמה לבדוקאיך
1Exit codeecho $? אחרי ההרצה
2stderrclaude -p "..." --bare 2>error.log && cat error.log
3Verbose outputclaude -p "..." --bare --verbose 2>debug.log
4אותו prompt אינטראקטיביתפתחו claude רגיל, הדביקו את ה-prompt
5CLAUDE.mdאולי יש הוראה ב-CLAUDE.md שמשפיעה
6API key / rate limitsבדקו שה-key תקף ושלא חרגתם מ-limits
מסגרת החלטה: סולם ה-Debug

כשהרצת headless נכשלת, עברו על 6 השלבים לפי הסדר. רוב הבעיות נפתרות בשלבים 1-3. אם הגעתם לשלב 6 — כנראה בעיית authentication או rate limiting.

סימפטוםסיבה סבירהפתרון
Exit code לא-0, אין פלטAPI key חסר או לא תקףבדקו ANTHROPIC_API_KEY
פלט ריקPrompt לא ברור מספיקבדקו אינטראקטיבית
429 Too Many RequestsRate limitingהוסיפו sleep / הפחיתו concurrency
Timeoutמשימה מורכבת מדי ל-headlessפרקו ל-prompt קצר יותר
תוצאה לא צפויהCLAUDE.md משפיעבדקו הוראות פרויקט

ה-Skill /debug

אם אין לכם כוח לעבור על הסולם ידנית, Claude Code מציע skill מובנה: /debug. מריצים אותו ב-mode אינטראקטיבי אחרי הרצת headless שנכשלה, והוא קורא את ה-debug logs ומסביר מה קרה:

# שלב 1: הריצו headless עם verbose log
claude -p "complex task" --bare --verbose 2>debug-$(date +%Y%m%d).log

# שלב 2: אם נכשל — פתחו session אינטראקטיבי
claude
> /debug debug-20260331.log

/debug מנתח את הלוג, מזהה היכן Claude "תקע" או נכשל, ומסביר בשפה ברורה מה לתקן. זה חוסך זמן רב לעומת קריאה ידנית של לוגים.

כשלים נפוצים וטיפול

כשלוןסימפטוםפתרון
Prompt עמום מדי Claude מחזיר תשובה כללית ולא מועילה כתבו prompt ספציפי: מה לעשות, על מה, באיזה פורמט
CLAUDE.md משפיע התנהגות שונה מהצפוי — Claude מתעלם מה-prompt בדקו CLAUDE.md בתיקיית הפרויקט; ב---bare, CLAUDE.md עדיין נטען
אימות פג תוקף Exit code לא-0, שגיאת 401/403 ב-stderr חדשו API key או בדקו credits ב-console.anthropic.com
Rate limiting 429 Too Many Requests הפחיתו concurrency, הוסיפו sleep בין קריאות
Timeout התהליך נהרג אחרי X שניות הגדילו timeout או פרקו את המשימה לprompts קצרים יותר
פלט חתוך התשובה נקטעת באמצע הגדילו MAX_OUTPUT_TOKENS או בקשו פלט מרוכז יותר

דפוס ה-Prompt Test Suite

לפרויקטים רציניים, שמרו קובץ עם prompt-output pairs צפויים ובדקו headless runs מולם:

# prompt-tests.sh — בדיקת regression ל-prompts
TESTS_PASSED=0
TESTS_FAILED=0

# Test 1: Claude יחזיר JSON תקין
RESULT=$(claude -p "return JSON: {\"status\": \"ok\"}" --bare)
if echo "$RESULT" | jq . > /dev/null 2>&1; then
    ((TESTS_PASSED++))
    echo "PASS: JSON output valid"
else
    ((TESTS_FAILED++))
    echo "FAIL: JSON output invalid"
fi

# Test 2: Claude יזהה שפת תכנות
RESULT=$(claude -p "what language is this: print('hello')" --bare)
if echo "$RESULT" | grep -qi "python"; then
    ((TESTS_PASSED++))
else
    ((TESTS_FAILED++))
    echo "FAIL: Language detection"
fi

echo "Results: $TESTS_PASSED passed, $TESTS_FAILED failed"

ה-test suite הזה רץ כחלק מה-CI שלכם — כל פעם שמשנים CLAUDE.md או מעדכנים גרסת Claude Code, מריצים את הבדיקות ומוודאים שהכל עדיין עובד כצפוי. חשוב: הבדיקות צריכות לבדוק מבנה ותוכן כללי, לא טקסט מדויק — כי הפלט של Claude הוא לא דטרמיניסטי ויכול להשתנות בין הרצות. בדקו "האם הפלט מכיל JSON תקין?" במקום "האם הפלט שווה בדיוק למחרוזת X?".

עשו עכשיו 3 דקות

צרו prompt שאתם יודעים שיגרום לClaude לנסות לקרוא קובץ שלא קיים: claude -p "read the file /tmp/nonexistent-file-12345.txt and summarize it" --bare 2>error.log; echo "Exit: $?"; cat error.log

שימו לב ל-exit code ולתוכן של error.log. זה בדיוק מה שה-Debug Ladder מלמד אתכם לעשות.

עשו עכשיו 3 דקות

הריצו: claude -p "test" --bare --verbose 2>debug.log

פתחו את debug.log וראו מה נרשם — אילו כלים Claude השתמש, כמה זמן זה לקח.

תרגיל מעשי: Debug Ladder — תהליך איתור תקלות

זמן משוער: 15 דקות

מה תבנו: תהליך debug מתועד עם דוגמה אמיתית.

  1. צרו prompt שנכשל בכוונה — למשל claude -p "read /nonexistent/file" --bare
  2. בדקו exit code: echo $?
  3. הריצו שוב עם 2>error.log — קראו את השגיאה
  4. הריצו עם --verbose 2>debug.log — ראו מה Claude ניסה לעשות
  5. נסו את אותו prompt אינטראקטיבית — השוו את ההתנהגות
  6. תעדו את כל 5 השלבים בקובץ: מה בדקתם, מה מצאתם, איך תיקנתם

תוצאה מצופה: מסמך debug-ladder.md מתועד עם תהליך שיטתי ודוגמה אמיתית.

מתחיל 5 דקות אסטרטגיה חינם
מתחיל5 דקותמושגחינם

שגרת עבודה — Headless שוטף

שגרת עבודה — Headless Mode
תדירותמשימהכמה זמן
יומיבדקו את לוגי ה-cron jobs שלכם — ודאו שההרצות הצליחו2 דקות
יומיעקבו אחרי עלויות: כמה טוקנים נצרכו? עומדים בתקציב?2 דקות
שבועיסקרו את הסקריפטים הקיימים — האם ה-prompts עדיין רלוונטיים?15 דקות
שבועינקו worktrees ישנים: git worktree prune2 דקות
שבועיבדקו אם יש גרסה חדשה של Claude Code — עדכנו אם צריך5 דקות
חודשיסקרו את cost-log — זהו trends ומקומות לחיסכון (מודל זול יותר?)20 דקות
חודשיבדקו שהAPI key תקף ושיש מספיק credits5 דקות
מתחיל5 דקותתרגולחינם

אם אתם עושים רק דבר אחד מהפרק הזה

אם אתם עושים רק דבר אחד מהפרק הזה 5 דקות

צרו קובץ ~/.claude-env.sh עם ה-API key שלכם, והריצו: source ~/.claude-env.sh && claude -p "hello from headless mode" --bare. ברגע שזה עובד — אתם מוכנים לכל מה שיבוא בקורס הזה.

מתחיל5 דקותתרגולחינם

בדוק את עצמך

בדוק את עצמך — 5 שאלות
  1. למה צריך --bare ב-CI/CD ולא מספיק רק -p? (רמז: חשבו על מה ש---bare מדלג עליו ולמה זה חשוב ב-pipeline)
  2. מה ההבדל בין exit code 0 ל-exit code אחר, ולמה זה קריטי לסקריפטים? (רמז: חשבו על && ו-|| בshell)
  3. למה כדאי להשתמש ב---output-format json במקום בטקסט רגיל כשבונים automation? (רמז: חשבו מה קורה כשצריכים לפרסק את הפלט בקוד)
  4. מה ההבדל בין /loop ל-cron job, ומתי כל אחד מתאים? (רמז: מה קורה כשסוגרים את ה-session?)
  5. למה Idempotency חשוב לתהליכים מתוזמנים שמשתמשים ב-Claude, ואיך מטפלים בזה שהפלט של Claude לא דטרמיניסטי? (רמז: validation layer)

4 מתוך 5 נכונות = עברתם

מתחיל3 דקותמושגחינם

סיכום הפרק

סיכום

הפרק הזה סימן את המעבר מ-"משתמש שמנהל שיחה" ל-"אדריכל שמעצב מערכות אוטומטיות". למדתם שהדגל -p הוא הבסיס לכל דבר — הוא הופך את Claude Code מכלי אינטראקטיבי לרכיב CLI שאפשר לשרשר, לתזמן, ולהריץ במקביל. ראיתם ש---bare מאיץ הרצות ב-CI בכך שמדלג על hooks ו-plugins, ואילו --output-format json מאפשר פירסוק מדויק של התוצאות בקוד. בניתם סקריפטים אמיתיים עם error handling מלא, batch processors עם cost tracking, ו-cron jobs עם logging ו-validation. למדתם גם את תהליך ה-Debug Ladder — שיטה מסודרת לאתר ולתקן תקלות כשהרצת headless לא עובדת כצפוי. כל הכלים האלה ביחד נותנים לכם שליטה מלאה ב-Claude Code כרכיב אוטומציה. בפרק הבא נעבור ל-GitHub Actions — ניקח את כל הכלים האלה ונטמיע אותם ב-CI/CD pipeline שרץ אוטומטית על כל PR, עם code review, security audits, ויצירת release notes.

מתחיל5 דקותתרגולחינם

צ׳קליסט סיום

צ׳קליסט — סמנו מה השלמתם