5 בניית יכולות

GitHub Projects — ניהול פרויקטים כמו מקצוען

בפרק הזה תבנו מערכת ניהול פרויקטים מלאה עם GitHub Projects. תיצרו לוח עם שדות מותאמים, שלוש תצוגות שונות (Board, Table, Roadmap), אוטומציות שחוסכות עבודה ידנית, ו-Insights שמראים את המצב האמיתי של הפרויקט. בסוף הפרק תדעו לנהל ספרינטים, לזהות חסמים, ולקבל החלטות מבוססות נתונים.

מה יהיה לך בסוף הפרק הזה
מה תוכלו לעשות בסוף הפרק הזה
דרישות קדם
חוט הפרויקט

הפרק הקודם (פרק 4 — Codespaces): בניתם סביבת פיתוח מלאה בענן. עכשיו יש לכם קוד שרץ, CI/CD שבודק, אתר שמפורסם, וסביבה שמוכנה. מה חסר? ראייה מלמעלה — הכלי שנותן לכם שליטה על כל המשימות, הספרינטים והתקדמות הפרויקט. זה בדיוק מה ש-GitHub Projects עושה.

הפרק הבא (פרק 6 — Packages): אחרי שיש לכם ניהול פרויקט מסודר, תלמדו לפרסם packages — npm, Docker images — עם GitHub Packages. ה-Project board שתבנו כאן ילווה אתכם בניהול הפיצ'רים שתפרסמו.

מילון מונחים
Project (v2)
לוח ניהול פרויקטים גמיש שחי מעל Issues ו-PRs — עם שדות מותאמים, תצוגות מרובות ואוטומציות. הגרסה היחידה הנתמכת מיוני 2025
View
תצוגה של הנתונים בפרויקט — Board, Table או Roadmap — כל אחת עם פילטרים, סידור וקיבוצים משלה
Custom Field
שדה מטא-דאטה שאתם מגדירים: Text, Number, Date, Single Select או Iteration — עד 50 שדות per project
Board View
תצוגת Kanban — עמודות לפי סטטוס (או כל שדה Single Select), גרור ושחרר בין עמודות
Table View
תצוגת spreadsheet — שורות ועמודות עם מיון, פילטרים וקיבוצים
Roadmap View
תצוגת ציר זמן — items מוצגים כפסים אופקיים על timeline לפי תאריכים או iterations
Iteration
מחזור עבודה מוגדר בזמן (ספרינט) — עם תאריך התחלה, משך, ותמיכה בהפסקות בין iterations
Insight
גרף או chart שמציג את מצב הפרויקט — burn-up, התפלגות לפי שדה, מגמות היסטוריות
Draft Issue
פריט בפרויקט שעדיין לא הפך ל-issue אמיתי — טיוטה שקיימת רק בלוח, בלי issue number
Built-in Workflow
אוטומציה מובנית בפרויקט — 6 workflows שמעדכנים status, מוסיפים items, ומארכבים אוטומטית
Sub-issue
issue ילד שמקושר ל-issue הורה — עד 50 sub-issues per parent ו-8 רמות קינון
Issue Type
סיווג סטנדרטי ברמת ארגון: Bug, Task, Initiative — משותף לכל הריפוזיטורים ומאפשר סינון חוצה-repos
Slicing
חלוקה אופקית של תצוגה לפי שדה — סרגל צד שמאפשר לבחור ערך ולראות רק items תואמים

5.1 מה זה GitHub Projects ולמה לא לנהל משימות ב-Issues בלבד

רוב המפתחים מכירים Issues — פותחים issue לכל באג, משימה או feature request. הפותח נכנס, מקליד כותרת, אולי מוסיף label, ובזה נגמר. זה עובד כשיש 10 issues. כשיש 50, 100, או 300 — Issues בלבד הם רשימה שטוחה. אי אפשר לראות מי עמוס, מה דחוף, מה תקוע, ואיפה הפרויקט עומד בכללותו.

חשבו על זה ככה: Issues הם כמו פתקים על השולחן. כל פתק אומר "תעשה X". אבל אף פתק לא אומר "הנה כל מה שצריך לעשות השבוע", "אלו 3 האנשים הכי עמוסים", או "ככה נראית ההתקדמות שלנו ב-4 שבועות אחרונים". בשביל זה צריך שכבת ניהול מעל הפתקים.

GitHub Projects הוא בדיוק השכבה הזו. הוא לא מחליף Issues — הוא מוסיף להם מבנה, ראייה, ואינטליגנציה. Projects חי מעל Issues ו-PRs, ונותן ארבע יכולות שלא קיימות ב-Issues רגילים:

חשוב לדעת: Classic Project Boards (הגרסה הישנה) הוסרו בחלוטין ביוני 2025. כל מה שנלמד בפרק הזה הוא Projects v2 — הגרסה היחידה שנתמכת. אם יש לכם classic boards ישנים, הם הומרו אוטומטית. אם אתם קוראים מדריכים ישנים שמדברים על "Project boards" עם notes ו-columns בלבד — זה Classic, וזה כבר לא קיים.

ההבדלים העיקריים בין Classic ל-v2:

תכונהClassic (הוסר יוני 2025)Projects v2 (נוכחי)
שדותרק note cards ועמודות50 שדות מותאמים: text, number, date, select, iteration
תצוגותרק BoardBoard + Table + Roadmap
היקףברמת repo בלבדrepo-level או org-level (חוצה ריפוזיטורים)
אוטומציהבסיסית מאוד (move column on event)6 built-in workflows + Actions + GraphQL API מלא
InsightsאיןCharts, burn-up, historical tracking, custom reports
פילטריםבסיסייםAND, OR, NOT, סוגריים, grouping, slicing
APIREST מוגבלGraphQL מלא עם mutations לכל שדה
עשו עכשיו

פתחו ריפוזיטורי שלכם ב-GitHub ולחצו על טאב Projects. אם אין לכם projects — מצוין, תיכף ניצור אחד. אם יש — לחצו על אחד ובדקו: האם יש שדות מותאמים? תצוגות? אוטומציות? סביר להניח שלא. בפרק הזה נתקן את זה.

5.2 יצירת Project — מאפס ללוח עובד תוך 5 דקות

יש שתי דרכים עיקריות ליצור Project, ושתיהן לוקחות פחות מדקה. הבחירה ביניהן תלויה בסגנון העבודה שלכם — אם אתם אנשי UI, תלכו על הדרך הראשונה. אם למדתם את פרק 2 על gh CLI, הדרך השנייה תרגיש טבעית יותר.

דרך 1: מה-UI

  1. לכו לפרופיל שלכם (או לעמוד הארגון) → טאב Projects
  2. לחצו New project
  3. בחרו template — Board הוא הנפוץ ביותר להתחלה, אבל יש גם Table, Team backlog, Feature, ו-Roadmap
  4. תנו שם (למשל: "Sprint Board" או "Product Roadmap")
  5. לחצו Create project

org-level vs repo-level — ההבדל הקריטי: Project ברמת ארגון יכול לאגד issues מכמה ריפוזיטורים — למשל, frontend, backend ו-infra בלוח אחד. Project ברמת repo מוגבל לאותו repo. תמיד העדיפו org-level — גם אם יש לכם repo אחד היום, מחר יהיו שניים. אם אתם עובדים עם חשבון אישי (לא ארגון), Project ברמת user עובד כמו org-level ומאפשר issues מכמה repos.

מה ההבדל פרקטי? אם יש לכם repo בשם frontend ועוד repo בשם api, ואתם רוצים לראות את כל המשימות בלוח אחד — אתם חייבים project ברמת org (או user). Project ברמת repo יראה רק issues של אותו repo.

דרך 2: מ-CLI

# ודאו שיש scope לprojects
gh auth refresh -s project

# צרו project חדש
gh project create --owner "@me" --title "Sprint Board"

# או ברמת ארגון
gh project create --owner "my-org" --title "Product Roadmap"

ה-CLI מחזיר את ה-URL של הפרויקט שנוצר — שמרו אותו. תצטרכו את מספר הפרויקט (הספרה האחרונה ב-URL) לפקודות הבאות.

הוספת items ללוח

Project ריק לא שווה כלום. הוסיפו items — ויש שלושה סוגים:

# הוספת issue קיים ללוח (נדרש project number)
gh project item-add 1 --owner "@me" \
  --url https://github.com/user/repo/issues/42

# יצירת draft issue ישירות בלוח
gh project item-create 1 --owner "@me" \
  --title "לחקור אפשרויות caching" --body "draft for now"

# הוספת PR ללוח
gh project item-add 1 --owner "@me" \
  --url https://github.com/user/repo/pull/15

Project Templates

ארגונים יכולים ליצור project templates — תבניות עם תצוגות, שדות, draft issues ו-workflows מוכנים. במקום להגדיר הכל מאפס, בחרו template ותקבלו לוח מוכן. Templates נוצרים מ-Settings של project קיים → Make a template.

זה שימושי במיוחד כשמנהלים כמה צוותות — כל צוות מקבל template אחיד עם אותם שדות, אותם workflows, ואותם views. זה מונע מצב שכל צוות ממציא את הלוח שלו מחדש ואי אפשר להשוות ביניהם.

עשו עכשיו

צרו Project חדש: לכו לפרופיל שלכם → Projects → New project. בחרו Board template. שם: "My Sprint Board". אחרי שהלוח נוצר, הוסיפו 5 draft issues עם שמות ריאליסטיים: "Set up CI pipeline", "Write unit tests for auth", "Deploy to staging", "Fix mobile responsive layout", "Add search API endpoint". עכשיו יש לכם לוח עם 5 פריטים שנעבוד איתם בהמשך הפרק.

5.3 שדות מותאמים — המטא-דאטה שמשנה הכל

שדה Status מובנה כבר בכל Project — אבל Status בלבד לא מספיק. אם כל מה שאתם יודעים על משימה זה "Todo", "In Progress" או "Done", אתם מפספסים מידע קריטי. מה הדחיפות? כמה מאמץ? לאיזה ספרינט? מתי ה-deadline? שדות מותאמים נותנים את התשובות.

חשבו על שדות כמו עמודות ב-Excel — כל עמודה מוסיפה מימד של מידע. Issue בלי שדות מותאמים הוא כמו שורה עם כותרת בלבד. Issue עם שדות הוא שורה מלאה שמספרת את כל הסיפור: מי אחראי, כמה דחוף, כמה מאמץ, לאיזה ספרינט, ומתי ה-deadline.

סוגי שדות

ב-Projects v2 יש 5 סוגי שדות מותאמים, ועוד שדות מובנים שתמיד קיימים:

סוגי שדות מותאמים ב-Projects Text טקסט חופשי דוגמה: הערות, לינקים Number ערך מספרי דוגמה: Effort (1-5) Date תאריך עם לוח שנה דוגמה: Due date, Start Single Select בחירה מרשימה דוגמה: Priority, Team Iteration (ספרינט) מחזור עבודה עם תאריכים דוגמה: Sprint 1, Sprint 2... + שדות מובנים: Status, Assignee, Labels, Milestone, Issue Type מגבלה: עד 50 שדות מותאמים per project

פירוט כל סוג שדה ומתי להשתמש בו:

הוספת שדה מותאם: מתוך תצוגת Table, לחצו על + בכותרת העמודות → New field → בחרו סוג → תנו שם. ב-Single Select, הגדירו אפשרויות עם צבעים. ב-Iteration, הגדירו start date ו-duration.

Issue Types ו-Sub-issues (חדש 2025)

שני פיצ'רים שהגיעו ל-GA באפריל 2025 ומשנים את הדרך שבה מארגנים עבודה:

ההבדל בין Issue Type ל-Label: Labels הם per-repo וכל אחד יכול ליצור מה שהוא רוצה — "bug", "Bug", "BUG". Issue Types הם per-org ומנוהלים מרכזית. כשמסננים Project שמכיל issues מ-10 repos שונים, Issue Types עובדים אחיד. Labels לא.

עשו עכשיו

בפרויקט שיצרתם, הוסיפו 4 שדות מותאמים:

  1. Priority (Single Select) — אפשרויות: Critical (אדום), High (כתום), Medium (צהוב), Low (ירוק)
  2. Effort (Number) — ערכים 1-5 לציון מורכבות (1 = שעה, 5 = שבוע)
  3. Due Date (Date) — תאריך יעד
  4. Team (Single Select) — אפשרויות: Frontend, Backend, DevOps

אחרי שיצרתם, מלאו את הערכים עבור 5 ה-draft issues שהוספתם קודם. ודאו שיש מגוון — לא הכל High priority ולא הכל Effort 5.

Framework: איזה שדות באמת צריך

רוב הפרויקטים צריכים 3-5 שדות מותאמים. ככל שיש יותר שדות, כל item דורש יותר מילוי — ואנשים מפסיקים למלא. הנה הטבלה שתעזור לכם להחליט:

שדהסוגלמה צריךמתי להוסיף
PrioritySingle Selectלדעת מה דחוף — בלי priority הכל נראה חשובתמיד — חובה בכל project
Effort / SizeNumberלאמוד עומס — 5 items של effort 1 שונים מ-5 items של effort 5כשרוצים לאזן עומס בין sprints
SprintIterationלחלק עבודה למחזורים — sprint planningכשעובדים בספרינטים (לפחות שבועיים)
Due DateDateלעקוב אחרי deadlines — ולהשתמש ב-Roadmapכשיש תאריכי יעד חיצוניים
TeamSingle Selectלחלק לפי צוותות — slicing ו-groupingכשיש יותר מצוות אחד
Start DateDateלציין מתי העבודה בפועל מתחילהכשרוצים פסי Roadmap עם אורך

כלל אצבע: אם אף אחד לא ממלא שדה תוך שבועיים — מחקו אותו. שדות ריקים הם רעש שמסתיר אותות. התחילו עם 3 שדות והוסיפו רק כשיש צורך מוכח.

אזהרה: יותר מדי שדות הורגים את הלוח

כל שדה שמוסיפים דורש מילוי ותחזוקה שוטפת. 50 שדות זה המקסימום הטכני, אבל 10 זה כבר הרבה. הנה מה שקורה בפרויקטים עם יותר מדי שדות: אנשים מפסיקים למלא ← שדות ריקים ← הלוח לא מייצג מציאות ← אף אחד לא סומך על הלוח ← חוזרים לנהל ב-Slack ובמייל. הכלל: כל שדה חייב לענות על שאלה שמשפיעה על החלטות. "Priority" עונה על "מה לעשות קודם". "Favorite Color" לא עונה על שום דבר — אל תוסיפו אותו.

5.4 תצוגות — Board, Table, Roadmap

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

שלוש תצוגות — אותם נתונים, פרספקטיבה אחרת Board (Kanban) Todo Task A Task B In Progress Task C Done Task D גרור ושחרר בין עמודות Table (Spreadsheet) Title Status Priority Effort Task ATodoHigh3 Task BTodoMed1 Task CIn ProgHigh5 Task DDoneLow2 מיון, פילטר, וקיבוץ Roadmap (Timeline) Jan Feb Mar Apr Task A Task B Task C Today גרור לשנות תאריכים

Board View (Kanban)

התצוגה הקלאסית: עמודות לפי Status (או כל שדה Single Select). גוררים items בין עמודות. כשגוררים item מ-"Todo" ל-"In Progress", שדה ה-Status מתעדכן אוטומטית. הכי טוב ל: ניהול יומי, stand-up meetings, סקירת סטטוס מהירה. Board נותן תמונת מצב ויזואלית תוך שנייה — רואים כמה items בכל עמודה ואיפה יש צבירה.

טיפ מתקדם: אפשר לשנות את העמודות מ-Status לכל שדה Single Select. למשל, Board grouped by Priority — עמודות Critical, High, Medium, Low. או Board grouped by Team — עמודה לכל צוות. זה Board אחר לגמרי עם אותם נתונים.

Table View

כמו spreadsheet — שורות ועמודות עם כל השדות גלויים. מיון בקליק על כותרת עמודה. ב-Table אפשר לראות את כל המטא-דאטה בבת אחת — Priority, Effort, Due Date, Team, Status — בשורה אחת. הכי טוב ל: מיון לפי priority, סינון מורכב, sprint planning (סידור items ב-sprint לפי effort ו-priority), ועבודה עם הרבה שדות.

טיפ מתקדם: ב-Table, GitHub מציג sum של שדות מספריים בתחתית. אם יש לכם Effort field מספרי, תראו את סך ה-effort של כל ה-items הגלויים. עם פילטר iteration:@current, תראו את total effort של הספרינט הנוכחי — מספר אחד שמספר אם יש עומס.

Roadmap View

ציר זמן שמציג items כפסים אופקיים. דורש שדה Date או Iteration. גוררים פסים לשנות תאריכים, מזיזים items בין sprints. הכי טוב ל: תכנון לטווח ארוך, sprint planning ויזואלי, הצגה למנהלים. Roadmap הוא התצוגה שמנהלים אוהבים — ציר זמן ברור עם milestones.

מה צריך ל-Roadmap: לפחות שדה Date אחד (Due Date), ורצוי שניים (Start Date + Due Date) כדי שה-items יהיו פסים עם אורך ולא רק נקודות על ציר. אם משתמשים ב-Iteration, ה-items ממוקמים אוטומטית בתוך ה-sprint שלהם.

יצירת View חדש: לחצו על + לצד שם ה-View הנוכחי → בחרו layout (Board, Table, או Roadmap) → תנו שם. אפשר ליצור כמה views שרוצים — כל אחד עם פילטרים, sorting, grouping ו-layout שונים. כל view נשמר בנפרד.

עשו עכשיו

בפרויקט שלכם, צרו 3 תצוגות:

  1. "Daily Board" — Board layout, columns by Status
  2. "Priority Table" — Table layout, sorted by Priority (descending), עם כל השדות גלויים
  3. "Timeline" — Roadmap layout, using Due Date field

עברו בין התצוגות ושימו לב שאותם items מופיעים בכולן — רק הפרספקטיבה משתנה. שנו status של item ב-Board (גררו ל-"In Progress"), ועברו ל-Table — הסטטוס השתנה גם שם.

תרגיל 1: בניית Project Board מלא

בנו Project board שמדמה ספרינט של צוות:

  1. צרו 8 draft issues עם שמות משימות ריאליסטיים (למשל: "Fix login timeout bug", "Add search API endpoint", "Write unit tests for auth module", "Redesign user profile page", "Set up monitoring alerts", "Migrate DB to PostgreSQL 16", "Add dark mode support", "Update API documentation")
  2. הוסיפו שדות: Priority (Critical/High/Medium/Low), Effort (1-5), Due Date, Team (Frontend/Backend/DevOps)
  3. מלאו ערכים לכל ה-items — וודאו שיש מגוון: 1-2 Critical, 2-3 High, 2-3 Medium, 1-2 Low. ערכי Effort מ-1 עד 5
  4. צרו 3 תצוגות: Board by Status, Table sorted by Priority desc, Roadmap by Due Date
  5. גררו 2 items ל-"In Progress" ו-1 ל-"Done" בתצוגת Board
  6. עברו ל-Table — האם הסטטוסים מעודכנים? סדרו לפי Priority ובדקו שה-Critical items למעלה

תוצאה צפויה: 3 תצוגות שמציגות את אותם נתונים בדרכים שונות. Board מראה סטטוס ב-glance, Table מראה כל המטא-דאטה, Roadmap מראה timeline. זה בדיוק מה שצוות אמיתי צריך.

5.5 פילטרים, קיבוצים ו-Slicing — למצוא מה שחשוב

עם 8 items, הלוח ברור. עם 80? צריך כלים למצוא מה שחשוב. GitHub Projects תומך בשלושה כלים לארגון מידע — ואפשר לשלב את שלושתם בו-זמנית:

פילטרים (Filters)

לחצו על שורת הפילטר בראש ה-view והקלידו. התחביר דומה ל-GitHub Search אבל ייחודי ל-Projects:

# פילטרים בסיסיים
status:Todo                          # רק items בסטטוס Todo
assignee:username                    # רק של משתמש מסוים
assignee:@me                         # רק שלי
label:bug                            # רק עם label "bug"
is:open                              # רק issues פתוחים
is:closed                            # רק סגורים
milestone:"v2.0"                     # רק של milestone ספציפי

# פילטרים מורכבים (Advanced Search — GA 2025)
(label:bug OR label:critical) AND assignee:@me
priority:High AND status:"In Progress"
NOT status:Done                       # הכל חוץ מ-Done
(team:Frontend OR team:Backend) AND priority:Critical

# פילטרים לפי iteration
iteration:@current                   # רק בספרינט הנוכחי
iteration:@next                      # רק בספרינט הבא
iteration:@previous                  # מה נשאר מהספרינט הקודם

חדש ב-2025: Advanced Search מאפשר שימוש ב-AND, OR, NOT ו-סוגריים לפילטרים מקוננים. לפני כן, היו רק פילטרים פשוטים עם AND מרומז. עכשיו אפשר לכתוב שאילתות מורכבות כמו: "הראה לי כל מה שהוא Critical או High, ששייך לצוות Frontend, ושלא ב-Done".

קיבוצים (Grouping)

קיבוץ מחלק את ה-view לקבוצות לפי שדה. ב-Board, כל קבוצה הופכת לשורת עמודות נפרדת — כלומר שני Boards זה מתחת לזה. ב-Table, כל קבוצה מקבלת כותרת מפרידה עם סיכום (count ו-sum של שדות מספריים).

שימושים נפוצים:

Grouping + Sorting בו-זמנית: אפשר לקבץ לפי Priority ובתוך כל קבוצה לסדר לפי Due Date. זה נותן "תראה לי את כל ה-Critical items, מהדחוף ביותר למאוחר ביותר".

Slicing

Slicing מוסיף סרגל צד (sidebar) שמסנן את ה-view לפי ערך של שדה. למשל, slice by Team — ובצד שמאל מופיעה רשימת הצוותות. לחצו על צוות ותראו רק את ה-items שלו. לחצו על צוות אחר — התצוגה מתעדכנת מיד.

ההבדל בין Slicing ל-Filter: פילטר מסתיר items. Slicing מאפשר לעבור מהר בין תתי-קבוצות בלי לכתוב פילטרים מחדש. זה כמו טאבים — כל לחיצה מראה slice אחר של הנתונים.

הפעלת Slicing: ב-view, לחצו על Slice by → בחרו שדה (Team, Priority, Iteration, או כל Single Select).

עשו עכשיו

בתצוגת Table שלכם:

  1. הפעילו grouping by Priority — שימו לב לכותרות הקבוצות
  2. הקלידו בפילטר: NOT status:Done — ה-Done items נעלמים
  3. הפעילו Slice by Team — סרגל צד מופיע עם Frontend, Backend, DevOps
  4. לחצו על "Frontend" ב-slicer — רק items של Frontend מופיעים, עדיין grouped by Priority

שימו לב איך שלוש היכולות עובדות יחד: פילטר מסנן Done, grouping מחלק לפי priority, slicing מאפשר לבחור צוות.

תרגיל 2: תצוגות מותאמות לתפקידים

צרו 4 saved views שמדמים תפקידים שונים בצוות. לכל view תנו שם, פילטר, sorting ו-layout:

  1. "My Work" — Table layout, filter: assignee:@me AND NOT status:Done, sorted by Priority desc → מה שאני צריך לעשות, לפי דחיפות
  2. "Sprint Overview" — Board layout, grouped by Status, filter: iteration:@current (או NOT status:Done אם אין iteration) → סטטוס הספרינט הנוכחי
  3. "Manager View" — Table layout, grouped by Assignee, columns: Title, Status, Priority, Effort → מי עובד על מה וכמה עמוס
  4. "Blocked Items" — Table layout, filter: label:blocked OR status:"In Review", sorted by Due Date asc → מה תקוע ומה הדחוף ביותר

שימו לב: כל view שומר את הפילטרים, ה-sorting, ה-grouping וה-layout שלו בנפרד. כל חבר צוות יכול לעבור בין views בלחיצה ולראות את הפרספקטיבה שמתאימה לו.

5.6 אוטומציות מובנות — הרובוט שמעדכן בשבילך

הבעיה הגדולה של כל לוח ניהול: אנשים לא מעדכנים סטטוס. issue סגור ב-GitHub, אבל בלוח הוא עדיין "In Progress". PR מורג, אבל ה-item עדיין "In Review". זה יוצר לוח שמשקר — ואם הלוח משקר, אף אחד לא סומך עליו, ואף אחד לא משתמש בו.

אוטומציות פותרות את זה על ידי סנכרון הלוח עם המציאות. כש-issue נסגר — הסטטוס מתעדכן. כש-PR מורג — ה-item עובר ל-Done. אף אחד לא צריך לזכור לעדכן ידנית.

GitHub Projects כולל 6 built-in workflows שאפשר להפעיל בקליק:

#שםTriggerActionברירת מחדל
1Item closedIssue/PR נסגרStatus → Doneמופעל
2Pull request mergedPR מורגStatus → Doneמופעל
3Item added to projectItem מתווסף לפרויקטStatus → Todoכבוי
4Item reopenedIssue/PR נפתח מחדשStatus → Todo (מותאם)כבוי
5Auto-archive itemsItem עומד בקריטריון (למשל Done לפני 14 ימים)Archiveכבוי
6Auto-add to projectIssue/PR חדש ב-repo תואם פילטרAdd to projectכבוי

הפעלה: בפרויקט, לחצו על ... (שלוש נקודות) → Workflows → בחרו workflow → Edit → הפעילו. אפשר לשנות את הסטטוס שנקבע — למשל, "Item added" יעדכן ל-"Todo" או ל-"Backlog".

Workflow 3 (Item added) — למה להפעיל: בלי workflow 3, כל item חדש מגיע בלי Status ומופיע בעמודה "No Status" שנראית כמו ברדק. עם workflow 3, כל item חדש מקבל אוטומטית Status = Todo ונופל לעמודה הנכונה.

Workflow 6 (Auto-add) — הכי חזק: מאפשר להגדיר פילטר כמו label:feature — וכל issue חדש עם label זה יתווסף אוטומטית לפרויקט. זה אומר שאף אחד לא צריך לזכור להוסיף issues ידנית. אפשר גם לסנן לפי repo, assignee, או כל שילוב — למשל, "כל issue עם label bug ב-repo frontend יתווסף אוטומטית".

Workflow 5 (Auto-archive) — ניקיון אוטומטי: items שב-Done כבר שבועיים מסתירים את הנתונים החשובים. Auto-archive מעביר אותם לארכיון אוטומטית. הם לא נמחקים — אפשר לשחזר — אבל הם לא מבלבלים את הלוח. הגדירו את הקריטריון: "Status is Done AND last updated more than 14 days ago".

עשו עכשיו

בפרויקט שלכם, לכו ל-Workflows (דרך תפריט ... בפינה). הפעילו שלושה workflows:

  1. "Item added to project" → Status = Todo
  2. "Item closed" → Status = Done (כנראה כבר מופעל)
  3. "Pull request merged" → Status = Done

עכשיו הוסיפו draft issue חדש — הוא אמור לקבל Status = Todo אוטומטית. בדקו בתצוגת Board שהוא מופיע בעמודת Todo.

Framework: Built-in vs Actions — מתי מה

Built-in workflows מכסים תרחישים פשוטים — בעיקר עדכוני Status. לכל דבר אחר, צריך Actions. הנה טבלת ההחלטה:

תרחישBuilt-in WorkflowActions Workflow
עדכון Status כש-issue נסגרכן — workflow 1לא צריך
הוספה אוטומטית מ-repoכן — workflow 6לא צריך
ארכוב items ישניםכן — workflow 5לא צריך
עדכון שדה Priority לפי labelלא — Built-in מוגבל ל-Status בלבדכן — צריך Actions
שליחת Slack notification כש-item עובר ל-Doneלא — אין integrals חיצונייםכן — צריך Actions
הוספת Date Posted כש-PR נפתחלא — לא יכול לעדכן שדות customכן — צריך Actions
העברת items בין projectsלאכן — צריך Actions

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

5.7 אוטומציה עם Actions — כשה-built-in לא מספיק

Built-in workflows מכסים את הבסיס — עדכון Status אוטומטי. אבל מה אם רוצים יותר? ברגע שצריך לעדכן שדה שאינו Status, לשלב שירות חיצוני, או להריץ לוגיקה מותאמת — צריך Actions workflow שמדבר עם ה-Projects API.

דוגמאות לדברים שרק Actions יכול לעשות:

אזהרה: GITHUB_TOKEN לא עובד עם Projects

GITHUB_TOKEN הרגיל לא יכול לגשת ל-Projects. זו מגבלה מכוונת — token רגיל מוגבל ל-repository scope, ו-Projects חיים ברמת org/user. הפתרון: Personal Access Token (PAT) עם scope project, או GitHub App עם permission Organization projects: Read and write. PAT פשוט יותר לאדם יחיד, GitHub App מתאים לצוותות. אל תשתמשו ב-PAT classic — השתמשו ב-Fine-grained token שמגביל ל-project scope בלבד.

הדרך הפשוטה: actions/add-to-project

ה-action הרשמי של GitHub מוסיף issues ו-PRs לפרויקט. זה כל מה שהוא עושה — אבל הוא עושה את זה טוב:

name: Add to Project
on:
  issues:
    types: [opened]
  pull_request:
    types: [opened]

jobs:
  add-to-project:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/add-to-project@v1
        with:
          project-url: https://github.com/orgs/my-org/projects/1
          github-token: ${{ secrets.PROJECT_PAT }}
          # labeled: bug, feature   # אופציונלי: רק issues עם labels ספציפיים

מתי להשתמש ב-action הזה: כשרוצים שכל issue חדש (או רק issues עם labels מסוימים) יתווסף לפרויקט. זה חלופה ל-built-in workflow 6, עם יותר גמישות — אפשר לסנן לפי כל מאפיין של ה-event, לא רק labels.

הדרך המתקדמת: GraphQL mutations

כש-add-to-project לא מספיק ורוצים לעדכן שדות, עובדים ישירות עם ה-GraphQL API. זה דורש יותר קוד אבל נותן שליטה מלאה:

name: Update Project on PR Merge
on:
  pull_request:
    types: [closed]

jobs:
  update-project:
    if: github.event.pull_request.merged == true
    runs-on: ubuntu-latest
    steps:
      - name: Get Project Item
        env:
          GH_TOKEN: ${{ secrets.PROJECT_PAT }}
        run: |
          # שלב 1: מצא את ה-item בפרויקט
          ITEM_ID=$(gh api graphql -f query='
            query {
              node(id: "${{ github.event.pull_request.node_id }}") {
                ... on PullRequest {
                  projectItems(first: 1) {
                    nodes { id }
                  }
                }
              }
            }' --jq '.data.node.projectItems.nodes[0].id')

          echo "ITEM_ID=$ITEM_ID" >> $GITHUB_ENV

      - name: Update Status to Done
        if: env.ITEM_ID != ''
        env:
          GH_TOKEN: ${{ secrets.PROJECT_PAT }}
        run: |
          # שלב 2: עדכן את השדה Status ל-Done
          gh api graphql -f query='
            mutation {
              updateProjectV2ItemFieldValue(input: {
                projectId: "PROJECT_ID_HERE"
                itemId: "'"$ITEM_ID"'"
                fieldId: "STATUS_FIELD_ID_HERE"
                value: { singleSelectOptionId: "DONE_OPTION_ID_HERE" }
              }) {
                projectV2Item { id }
              }
            }'

איך למצוא את ה-IDs: ה-IDs (project, field, option) הם מחרוזות ייחודיות שצריך לשלוף פעם אחת ולשמור. הנה הפקודות:

# מצא Project ID (החליפו 1 במספר הפרויקט שלכם)
gh api graphql -f query='{ viewer { projectV2(number: 1) { id } } }'

# מצא Field IDs ו-Option IDs
gh api graphql -f query='{
  node(id: "PROJECT_ID") {
    ... on ProjectV2 {
      fields(first: 20) {
        nodes {
          ... on ProjectV2SingleSelectField {
            id name
            options { id name }
          }
          ... on ProjectV2Field { id name }
          ... on ProjectV2IterationField { id name }
        }
      }
    }
  }
}'

שמרו את ה-IDs: אחרי שמצאתם, שמרו אותם כ-repository secrets או כ-environment variables ב-workflow. אל תשימו אותם hardcoded בקוד — IDs יכולים להשתנות אם מוחקים ויוצרים שדה מחדש.

אזהרה: אל תשתפו PAT ב-logs

כש-workflow רץ, הלוגים גלויים לכל מי שיש לו גישה ל-repo. וודאו שה-PAT מוגדר כ-secret (לא כ-environment variable רגיל) ושאתם לא מדפיסים אותו עם echo. GitHub מסנן secrets מ-logs אוטומטית, אבל רק אם הם מוגדרים כ-secrets.

עשו עכשיו

צרו Personal Access Token עם scope project:

  1. Settings → Developer settings → Personal access tokens → Fine-grained tokens → Generate
  2. Permissions: Organization projects: Read and write (או Repository projects אם repo-level)
  3. שמרו את ה-token — הוא מוצג רק פעם אחת
  4. בריפוזיטורי: Settings → Secrets → Actions → New repository secret → שם: PROJECT_PAT → הדביקו את ה-token

עכשיו יש לכם PAT שעובד עם Projects ושמור כ-secret. בתרגיל הבא נשתמש בו.

תרגיל 3: אוטומציה שמעדכנת Project כש-PR מתמזג

בנו Actions workflow שמבצע את הדברים הבאים:

  1. Trigger: pull_request event, type closed
  2. Condition: רק אם ה-PR merged (לא סגירה רגילה) — שימוש ב-if: github.event.pull_request.merged == true
  3. Action: הוסיפו את ה-PR לפרויקט עם actions/add-to-project

שלבים:

  1. צרו PAT עם scope project (אם עוד לא יצרתם ב-"עשו עכשיו" הקודם)
  2. הוסיפו את ה-PAT כ-secret בשם PROJECT_PAT
  3. צרו קובץ .github/workflows/project-sync.yml עם ה-workflow. העתיקו את הדוגמה למעלה ושנו את ה-project-url לפרויקט שלכם
  4. פתחו PR (אפילו PR קטן שמשנה README), עשו merge, ובדקו שה-item הופיע בפרויקט

בונוס: הוסיפו step שמעדכן גם את שדה ה-Status ל-Done באמצעות GraphQL mutation. תצטרכו למצוא את ה-Project ID, ה-Field ID של Status, ואת ה-Option ID של "Done".

5.8 Insights — גרפים שמראים את האמת

הלוח מראה את המצב הנוכחי. Insights מראים את המגמה. האם אתם מתקדמים? האם יש צבירה של issues? האם ספרינט מסוים עמוס מדי? Insights עונים על השאלות שהלוח לא יכול — שאלות על זמן.

לכו לטאב Insights בפרויקט (ליד Settings). תראו שני סוגי charts:

Current Charts

מציגים snapshot של המצב הנוכחי — מה קורה עכשיו:

Historical Charts

מציגים שינוי לאורך זמן — מה קרה בשבועות/חודשים האחרונים:

יצירת custom chart: Insights → New chart → בחרו layout (bar, line, stacked area) → הגדירו X-axis (Time ל-historical, field ל-current) → Group by (Status, Priority, Assignee) → Filter → Save.

שלושה charts ש-כל פרויקט צריך:

  1. Burn-up by Status — ברירת המחדל. מראה אם מתקדמים
  2. Current by Priority — bar chart שמראה כמה Critical יש עכשיו. אם המספר עולה — בעיה
  3. Current by Assignee — bar chart שמראה עומס per person. אם מישהו בולט — צריך לאזן

מגבלה חשובה: Insights לא עוקב אחרי items שארכבתם או מחקתם. אם ארכבתם 50 items, הם נעלמים מהגרפים. ה-burn-up "יזכור" אותם (כי הוא historical), אבל ה-current charts לא יציגו אותם. לכן, אל תארכבו items בזמן sprint — רק אחרי sprint review. אחרת, ה-Insights לא ישקפו את המציאות.

עשו עכשיו

בפרויקט שלכם, לכו ל-Insights (טאב בראש הפרויקט). אם הלוח חדש, ה-burn-up chart יהיה קטן — זה בסדר, הנתונים יצטברו עם הזמן. עכשיו צרו 2 custom charts:

  1. Priority Distribution: New chart → Layout: Bar → X-axis: Priority → Save
  2. Effort by Assignee: New chart → Layout: Stacked bar → X-axis: Assignee → Stacked by: Status → Save

עכשיו יש לכם burn-up + 2 custom charts. ככל שתעבדו עם הפרויקט, הגרפים יתחילו לספר סיפור.

5.9 Iterations ו-Roadmap — ספרינטים ותכנון לטווח ארוך

אם הצוות שלכם עובד בספרינטים (sprints), Iterations הם הפיצ'ר שמחבר את GitHub Projects לעולם ה-Agile. Iteration הוא לא סתם תאריך — הוא מחזור עבודה שלם עם התחלה, סוף, ותמיכה בהפסקות.

הגדרת Iterations

  1. בפרויקט, לכו ל-Settings → Custom fields
  2. לחצו New field → בחרו Iteration
  3. תנו שם (למשל: "Sprint")
  4. הגדירו Start date — תאריך ההתחלה של ה-iteration הראשון
  5. הגדירו Duration — 1 שבוע, 2 שבועות, 3 שבועות, או 4 שבועות
  6. אופציונלי: הוסיפו breaks — הפסקות בין iterations (חגים, חופשות צוות). GitHub ידלג על ההפסקות ויצור iterations רציפים

אחרי שהגדרתם, GitHub יוצר אוטומטית iterations עתידיים. כל iteration מקבל שם (Sprint 1, Sprint 2...) ותאריכים מדויקים. אפשר לשנות שמות ל-sprints ספציפיים — למשל "Sprint 4: Auth Refactor".

Iteration vs Date — ההבדל: Date הוא נקודה על ציר הזמן (30 בינואר). Iteration הוא טווח (Sprint 3: 20 ינואר - 2 פברואר). כש-item מוקצה ל-Iteration, הוא שייך לכל ה-sprint. כש-item מקבל Date, הוא ממוקם בנקודה ספציפית. אם עובדים בספרינטים — תמיד Iteration. אם יש deadlines קשיחים — Date.

שימוש ב-Iterations

Roadmap View עם Iterations

Roadmap — ציר זמן עם Iterations Sprint 1 (Jan 6-19) Sprint 2 (Jan 20-Feb 2) Sprint 3 (Feb 3-16) Break (Feb 17-23) Fix login bug V Build search API Write unit tests Redesign dashboard (cross-sprint) Deploy to staging Today v2.0 Release Done In Progress Todo Cross-sprint Today Milestone

ב-Roadmap, כל item מופיע כפס אופקי על ציר הזמן. אם ל-item יש Date (start + due), הוא ממוקם לפי תאריכים ואורך הפס מייצג את משך הזמן. אם יש Iteration, הוא ממוקם בתוך ה-sprint שלו. אפשר לגרור פסים לשנות תאריכים, להזיז items בין sprints, ולראות קווים אנכיים (vertical markers) ל-milestones ולתאריך הנוכחי.

Vertical markers: הקו הוורוד של "Today" מראה איפה אתם עכשיו על ציר הזמן. אפשר להוסיף markers נוספים — למשל, תאריך release, תאריך demo, או deadline חיצוני. Markers עוזרים לראות מה צריך להיגמר לפני נקודת ציון.

Cross-sprint items: items שנמשכים יותר מ-sprint אחד (למשל "Redesign dashboard") מופיעים כפס שחוצה כמה sprints. זה נורמלי ל-items גדולים — אבל אם רוב ה-items חוצים sprints, כנראה שה-sprints קצרים מדי או שה-items לא מפורקים מספיק.

Sprint Planning Workflow

הנה workflow מעשי לניהול sprints עם GitHub Projects — שלושה שלבים, שלוש תצוגות:

  1. לפני Sprint (Planning) — עברו לתצוגת Table, סננו iteration:@next. ודאו שיש מספיק items ושה-total effort סביר. הוסיפו items מה-backlog, סדרו priorities, וודאו שכל item מוקצה למישהו
  2. בזמן Sprint (Execution) — עברו לתצוגת Board, סננו iteration:@current. זה ה-view לדיילי — גוררים items בין Todo, In Progress, ו-Done. בדקו מה blocked, מה ב-review, מה הושלם
  3. אחרי Sprint (Review) — עברו ל-Insights, בדקו burn-up chart. כמה items הושלמו? כמה נשארו? עברו ל-Table עם iteration:@previous AND NOT status:Done — אלו ה-items שנשארו ושצריך להעביר לספרינט הבא או ל-backlog
עשו עכשיו

הוסיפו Iteration field לפרויקט:

  1. Settings → New field → Iteration → שם: "Sprint"
  2. Start date: היום → Duration: 2 weeks
  3. הקצו 3 items ל-Sprint 1 ו-2 items ל-Sprint 2
  4. עברו לתצוגת Roadmap — תראו את ה-items על ציר הזמן בתוך ה-sprints
  5. גררו item מ-Sprint 1 ל-Sprint 2 ב-Roadmap ובדקו שה-Iteration field התעדכן
תרגיל 4: Sprint Planning מלא

דמו sprint planning session מלא עם כל הכלים שלמדתם:

  1. ודאו שיש Iteration field עם לפחות 3 sprints
  2. הקצו items: 5 ל-Sprint 1, 3 ל-Sprint 2, 2 ל-Sprint 3. ודאו שכל item מוקצה לאדם (assignee)
  3. צרו תצוגת "Sprint 1 Board": Board layout, filter iteration:@current — זו תצוגת העבודה היומית
  4. צרו תצוגת "Sprint Planning": Table layout, grouped by Iteration, sorted by Priority, עם עמודות Effort ו-Due Date — זו תצוגת התכנון
  5. צרו תצוגת "Roadmap": Roadmap layout, grouped by Iteration, with vertical marker ל-today
  6. לכו ל-Insights → צרו chart grouped by Sprint עם stacked bar by Status — בדקו שהעומס מאוזן

שאלה: אם Sprint 1 עמוס מדי (total effort של 20 לעומת 8 ב-Sprint 2), מה הפעולה הנכונה?

תשובה: גררו items ב-Roadmap מ-Sprint 1 ל-Sprint 2. העדיפו להעביר items עם Low priority או High effort. אחרי ההעברה, בדקו ב-Insights שהעומס התאזן — total effort צריך להיות דומה בכל sprint.

5.10 gh CLI — ניהול Projects מהטרמינל

אם למדתם את פרק 2 (GitHub CLI), אתם יודעים שכל דבר שעושים ב-UI אפשר לעשות מהטרמינל — יותר מהר, ועם אפשרות לסקריפט. Projects לא יוצא דופן. כל הפקודות שנראה כאן דורשות project scope — שהוספנו כבר בסעיף 5.7.

Setup: הוספת scope

# ברירת מחדל, gh לא כולל project scope
gh auth status    # בדקו scopes נוכחיים

# הוסיפו project scope (פעם אחת)
gh auth refresh -s project

פקודות בסיסיות — ניהול Projects

# רשימת projects
gh project list                              # של המשתמש שלכם
gh project list --owner "my-org"             # של ארגון

# צפייה בפרויקט (מידע בסיסי + items)
gh project view 1                            # לפי מספר
gh project view 1 --owner "@me" --web        # פתיחה בדפדפן

# יצירת project חדש
gh project create --owner "@me" --title "New Sprint"

# העתקת project (כולל fields ו-views, בלי items)
gh project copy 1 --source-owner "my-org" \
  --target-owner "@me" --title "My Copy"

# מחיקת project
gh project delete 1 --owner "@me"

ניהול Items — הוספה, עריכה, ארכוב

# הוספת issue קיים
gh project item-add 1 --owner "@me" \
  --url https://github.com/user/repo/issues/42

# יצירת draft issue ישירות בלוח
gh project item-create 1 --owner "@me" \
  --title "Research caching options" \
  --body "Look into Redis vs Memcached"

# רשימת items (JSON output לעיבוד)
gh project item-list 1 --owner "@me" --format json

# רשימת items בפורמט טבלה (קריא)
gh project item-list 1 --owner "@me"

# ארכוב item (לא מוחק — מעביר לארכיון)
gh project item-archive 1 --owner "@me" --id ITEM_ID

ניהול Fields — יצירה ומחיקה

# רשימת fields (כולל IDs — חשוב לעריכת items)
gh project field-list 1 --owner "@me"

# יצירת field חדש
gh project field-create 1 --owner "@me" \
  --name "Team" --data-type "SINGLE_SELECT"

# מחיקת field
gh project field-delete --id FIELD_ID

עריכת Items — שינוי ערכי שדות

# עדכון שדה Single Select (כמו Priority)
gh project item-edit \
  --project-id PROJECT_ID \
  --id ITEM_ID \
  --field-id FIELD_ID \
  --single-select-option-id OPTION_ID

# עדכון שדה Date
gh project item-edit \
  --project-id PROJECT_ID \
  --id ITEM_ID \
  --field-id DATE_FIELD_ID \
  --date "2026-04-15"

# עדכון שדה Number
gh project item-edit \
  --project-id PROJECT_ID \
  --id ITEM_ID \
  --field-id NUMBER_FIELD_ID \
  --number 3

# עדכון שדה Text
gh project item-edit \
  --project-id PROJECT_ID \
  --id ITEM_ID \
  --field-id TEXT_FIELD_ID \
  --text "Updated note"

שימו לב: item-edit דורש IDs — לא שמות. השתמשו ב-field-list (לField IDs ו-Option IDs) וב-item-list --format json (ל-Item IDs) כדי למצוא את ה-IDs. זה מרגיש מסורבל בהתחלה, אבל ברגע ששמרתם את ה-IDs — העדכון הוא שורה אחת.

שילוב עם פקודות אחרות

הכוח האמיתי של CLI הוא שילוב עם פקודות gh אחרות:

# הוספת כל ה-issues הפתוחים מ-repo ספציפי לפרויקט
gh issue list --repo user/repo --state open --json url \
  --jq '.[].url' | while read url; do
    gh project item-add 1 --owner "@me" --url "$url"
  done

# מציאת items בלי assignee (שנפלו בין הכיסאות)
gh project item-list 1 --owner "@me" --format json \
  --jq '.[] | select(.assignees == null) | .title'
תרגיל 5: Sprint Triage Script

כתבו סקריפט Bash שמבצע triage אוטומטי — מוסיף issues פתוחים שעדיין לא בפרויקט:

#!/bin/bash
# sprint-triage.sh — מוסיף issues פתוחים חסרים לפרויקט
# שימוש: ./sprint-triage.sh [project_number] [owner] [repo]

PROJECT_NUM=${1:-1}
OWNER=${2:-"@me"}
REPO=${3:-"user/repo"}

echo "=== Sprint Triage ==="
echo "Project: $PROJECT_NUM | Owner: $OWNER | Repo: $REPO"
echo ""

# מצא issues פתוחים ב-repo
OPEN_ISSUES=$(gh issue list --repo "$REPO" --state open \
  --json url --jq '.[].url')

# מצא items שכבר בפרויקט
EXISTING=$(gh project item-list "$PROJECT_NUM" --owner "$OWNER" \
  --format json --jq '.[].content.url' 2>/dev/null)

ADDED=0
for issue_url in $OPEN_ISSUES; do
  if ! echo "$EXISTING" | grep -q "$issue_url"; then
    echo "Adding: $issue_url"
    gh project item-add "$PROJECT_NUM" --owner "$OWNER" \
      --url "$issue_url"
    ADDED=$((ADDED + 1))
  fi
done

echo ""
echo "=== Triage Complete: $ADDED issues added ==="

מה הסקריפט עושה: משווה issues פתוחים ב-repo לעומת items בפרויקט, ומוסיף את החסרים. הריצו ידנית לפני כל sprint planning, או הוסיפו ל-cron job / Actions scheduled workflow.

בונוס: הוסיפו לסקריפט שלב שמדפיס כמה items יש בכל status אחרי ה-triage — gh project item-list עם --jq שמקבץ לפי status.

5.11 Issues vs Projects vs Discussions — מתי מה

שלושה כלים, שלושה שימושים. הטעות הנפוצה: לנסות להשתמש בכלי אחד לכל דבר. "בואו נפתח issue לכל דבר" — ואז יש 500 issues, חלקם באגים, חלקם רעיונות, חלקם שאלות, ואי אפשר למצוא שום דבר. "בואו נשים הכל ב-Project" — ואז הלוח מפוצץ ב-items שחלקם לא באמת משימות.

הפתרון הוא לדעת מתי לפתוח מה:

Framework: Decision Tree — Issues / Projects / Discussions

שאלו את השאלות הבאות לפי סדר. התשובה הראשונה שמתאימה — זה הכלי הנכון:

  1. יש משימה ספציפית שמישהו צריך לעשות?
    • כן → Issue — "Fix login timeout", "Add dark mode support"
    • לא → המשיכו לשאלה 2
  2. צריך ראייה רחבה על קבוצת משימות, ספרינט או roadmap?
    • כן → Project (שאוגד Issues קיימים) — "Q2 Sprint Board", "Product Roadmap 2026"
    • לא → המשיכו לשאלה 3
  3. יש רעיון, שאלה, RFC, או דיון שלא דורש פעולה מיידית?
    • כן → Discussion — "Should we switch to Rust?", "RFC: New auth flow"
    • לא → אולי לא צריך לפתוח כלום. הודעת Slack מספיקה.
כלימתידוגמאותמה לא לעשות
Issueמשימה, באג, feature request"Fix login timeout", "Add dark mode"לא לפתוח issue לשאלה או לדיון
Projectראייה מלמעלה + ניהולSprint board, Product roadmapלא ליצור project עם draft issues בלבד (בלי issues אמיתיים)
Discussionרעיון, שאלה, RFC"Should we migrate?", "Best practices for X"לא להשתמש כ-issue tracker (discussions לא מופיעים ב-Projects)

Anti-patterns נפוצים:

  • Discussions כ-issue tracker — discussions לא מופיעים ב-Projects, אין להם assignee אמיתי, ואין עליהם automation. אם זה משימה — תפתחו issue
  • Project עם draft issues בלבד — draft issues הם טוב לסיעור מוחות, אבל לוח שלם בלי issues אמיתיים לא מקושר לקוד, ל-PRs, או ל-branches. המירו drafts ל-issues ברגע שהחלטתם שזה באמת עבודה
  • Issue לכל שאלה — issue = עבודה שמישהו צריך לעשות. "מה דעתכם על TypeScript?" זה discussion, לא issue. issue היה "Migrate auth module to TypeScript"
  • אותם issues ביותר מ-3 projects — אם issue מופיע ב-5 projects שונים, סימן שה-projects חופפים ויש בלאגן מבני

5.12 סיכום ומבט קדימה

סיכום הפרק
  • GitHub Projects v2 הוא שכבת ניהול פרויקטים מעל Issues ו-PRs — Classic הוסר ביוני 2025, v2 הוא הסטנדרט היחיד
  • שדות מותאמים — Text, Number, Date, Single Select, Iteration — עד 50 per project. הכלל: 3-5 שדות מספיקים, יותר מ-10 זה הרבה
  • Issue Types ו-Sub-issues — סיווג סטנדרטי ברמת ארגון, ומבנה parent-child עם עד 50 sub-issues ו-8 רמות קינון
  • שלוש תצוגות — Board (Kanban לעבודה יומית), Table (spreadsheet לניתוח), Roadmap (timeline לתכנון) — אותם נתונים, פרספקטיבה שונה
  • פילטרים מתקדמים — AND, OR, NOT, סוגריים — plus grouping (חלוקה לקבוצות) ו-slicing (סרגל צד לבחירה מהירה)
  • 6 built-in workflows — auto-status on close/merge/add, auto-archive, auto-add — הפעלה בקליק, אפס קוד
  • Actions integration — GraphQL mutations לעדכון כל שדה, דורש PAT (Fine-grained) או GitHub App
  • Insights — burn-up charts, current distribution, historical tracking — הגרפים שמוכיחים אם מתקדמים או עומדים
  • Iterations — ספרינטים עם תאריכים, הפסקות, filter @current/@next/@previous
  • gh CLI — ניהול מלא מהטרמינל: create, item-add, item-edit, field-create, ואפשרות לסקריפטים אוטומטיים
אם אתם עושים רק דבר אחד מהפרק הזה

הפעילו את 3 ה-built-in workflows: Item added → Todo, Item closed → Done, PR merged → Done. זה לוקח 30 שניות, אפס קוד, ומבטיח שהלוח תמיד מסונכרן עם המציאות. בלי אוטומציה, הלוח משקר תוך יומיים. עם אוטומציה, הוא מקור אמת שכולם יכולים לסמוך עליו. כל השאר — שדות, תצוגות, Insights — הם בונוס שבנוי על הבסיס הזה.

בדקו את עצמכם
  1. Board vs Table vs Roadmap: מה ההבדל בין שלוש התצוגות, ומתי תשתמשו בכל אחת? (רמז: Board לניהול יומי, Table לניתוח מטא-דאטה, Roadmap לתכנון timeline)
  2. GITHUB_TOKEN ו-Projects: למה GITHUB_TOKEN לא עובד עם Projects ב-Actions? מה הפתרון? (רמז: Projects חיים ברמת org/user, לא repo)
  3. Iteration vs Date: מה ההבדל בין Iteration field ל-Date field, ומתי תבחרו כל אחד? (רמז: Iteration = טווח/sprint, Date = נקודה/deadline)
  4. Auto-add workflow: איך הייתם מגדירים built-in workflow שמוסיף רק issues עם label "critical" לפרויקט? (רמז: Workflow 6 — Auto-add to project — עם פילטר לפי label)
  5. Insights וארכוב: מה קורה ל-Insights כשמארכבים items? למה זה חשוב? (רמז: items מאורכבים נעלמים מ-current charts, burn-up ההיסטורי זוכר אותם)
שגרת עבודה מומלצת
  • יומית (2 דקות): פתחו את Board view → עדכנו status של items שעבדתם עליהם (אם אין אוטומציה) → בדקו אם משהו blocked → סגרו issues שהושלמו
  • שבועית (15 דקות): Sprint review: Insights → burn-up chart → האם מתקדמים כמו שתוכנן? Table view → iteration:@previous AND NOT status:Done → מה נשאר? Sprint planning: Table view → iteration:@next → מספיק items? → priorities מסודרים? → effort מאוזן?
  • חודשית (30 דקות): Roadmap review → האם ה-timeline ריאליסטי? יש items בלי תאריכים? ניקיון: ארכבו items שב-Done מעל חודש. בדקו שדות ריקים — אם שדה מסוים ריק ב-80% מה-items, שקלו למחוק אותו. בדקו שה-Insights charts מראים מידע שימושי
צ'קליסט — מה עשינו בפרק הזה
  • ☐ הבנתי את ההבדל בין Issues ל-Projects v2 ומתי כל אחד מתאים
  • ☐ יצרתי Project חדש (מ-UI או CLI)
  • ☐ הוספתי 4+ שדות מותאמים (Priority, Effort, Due Date, Team)
  • ☐ יצרתי Board view עם status columns
  • ☐ יצרתי Table view עם sorting, grouping ופילטרים
  • ☐ יצרתי Roadmap view עם timeline
  • ☐ הפעלתי 3 built-in workflows (added → Todo, closed → Done, merged → Done)
  • ☐ הבנתי מתי צריך Actions workflow ומתי built-in מספיק
  • ☐ יצרתי PAT עם scope project ושמרתי כ-secret
  • ☐ צפיתי ב-Insights ויצרתי 2+ custom charts
  • ☐ הגדרתי Iteration field וניהלתי sprint planning
  • ☐ ניהלתי Projects מ-CLI עם gh project
  • ☐ קראתי את כל 13 מונחי המילון
  • ☐ יודע/ת מתי Issue, מתי Project, ומתי Discussion

בפרק הבא: נלמד לפרסם packages — npm, Docker images — עם GitHub Packages. תגלו שהרגיסטרי הפרטי שלכם כבר קיים, חינמי, ומשולב ישירות ב-GitHub. ה-Project board שבניתם בפרק הזה ילווה אתכם כשתנהלו features ו-releases של ה-packages.