לתשאל את הריפו כמו מסד נתונים
הבעיה
בריפו היו מעל 100 קבצי תוכן. טיוטות LinkedIn, שרשורי X, ניוזלטרים של Substack, פוסטים ב-Reddit, רשומות בלוג לאתר, תסריטי TikTok. פרוסים על פני 6 פלטפורמות, מחולקים בין שלבי טיוטה וסופי. מבנה התיקיות היה נקי, אבל הנתונים היו אטומים. לא יכולתי לענות על שאלות בסיסיות בלי לסרוק קבצים ידנית.
כמה פוסטים של LinkedIn הגיעו לסופי השבוע? לאיזה תוכן יש אחים חוצי-פלטפורמות? מה סך ספירת המילים לפברואר? אילו נכסים פרוסים ואילו יושבים במקור?
מערכת הקבצים מעולה לארגון. היא נוראית לשאילתות.
הפתרון: מסד נתונים נגזר של SQLite
scripts/build_index.py עובר על הריפו, מפרסר כל קובץ תוכן, וטוען את התוצאות למסד נתונים SQLite בן 9 טבלאות ב-data/index.db. אפס תלויות חיצוניות - רק ספריה סטנדרטית. json, sqlite3, pathlib, re. זהו.
האינדקס הוא נתונים נגזרים. הוא נבנה מחדש מקבצים עוקבים ב-git בכל הרצה. מחקו את מסד הנתונים, הריצו את הסקריפט, קבלו את אותה תוצאה. מקור האמת הוא תמיד הריפו. מסד הנתונים הוא רק שכבת שאילתות מעליו.
$ python3 scripts/build_index.py
Building index: data/index.db
Content: 80 files indexed
Daily logs: 11 days indexed
Skills: 54 indexed
Assets: 522 visual assets indexed
Videos: 3 video files indexed
Content links: 75 series-sibling pairs detected
הסכמה
תשע טבלאות. כל אחת מאנדקסת סוג תוכן שונה.
content - הטבלה המרכזית. כל טיוטה וסופי בכל הפלטפורמות. שדות כוללים פלטפורמה, שלב, כותרת, slug, תאריך, עמוד תווך, קשת, סדרה, ספירת מילים. מטא-דאטה מפורסר משני פורמטים: תחביר ציטוט (> **Key**: Value) לרוב הפלטפורמות, YAML frontmatter לפוסטים באתר.
daily_logs - מדדי ביצועים מהמעקב היומי. ציון פלט, ציון אות, ספירת מילים, כמות שנשלחה, עלות סוכן, מכפיל ROI, commits.
sessions - היסטוריית העברות הקשר. הטבלה הזו היא append-only ושורדת בניות מחדש של האינדקס. כל טבלה אחרת נמחקת ונוצרת מחדש. sessions נשמרת כי אלה רשומות היסטוריות, לא נתונים נגזרים.
skills - רישום הכישורים של Claude ו-Cursor. 54 כישורים מאונדקסים עם שם, תיאור, נתיב קובץ, קטגוריה.
content_links - גרף הקשרים. שני סוגי קישורים: series_sibling (אותו תאריך ו-slug בין פלטפורמות, מזוהה אוטומטית) ו-cross_platform_note (הפניות מפורשות מפורסרות ממקטעי Cross-Platform Notes).
assets - 522 נכסים ויזואליים לאורך מערכת ההתקדמות. אווטארים לפי דרגה, תגי מחלקה, אייקוני כלים, וריאנטים של Nio, גיליונות ספרייטים. דפוסי שמות קבצים מפורסרים לנתונים מובנים: tier-3-idle-256.gif הופך ל-asset_type=tier, tier=3, variant=idle, size_px=256.
videos - קטלוג קבצי וידאו עם מותג, יחס גובה-רוחב, פורמט, סטטוס פריסה.
thumbnails - מלאי תמונות ממוזערות לפי מותג ווריאנט.
ה-CLI לשאילתות
scripts/query_index.py הוא הממשק לקריאה בלבד. שמונה תת-פקודות עם סינון.
$ python3 scripts/query_index.py content --platform linkedin --since 2026-02-15
$ python3 scripts/query_index.py stats --latest 3
$ python3 scripts/query_index.py skills --category claude
$ python3 scripts/query_index.py links --date 2026-02-17
$ python3 scripts/query_index.py assets --site shawnos --type tier --tier 3
$ python3 scripts/query_index.py videos --brand gtmos --source-only
מצבי פלט: טבלה (ברירת מחדל), JSON (--json), ספירת שורות (--count). פלט הטבלה קריא לבני אדם. פלט ה-JSON מתחבר לסקריפטים אחרים.
זיהוי קישורים חוצי-פלטפורמות
כאן זה נהיה מעניין. האינדקס לא רק מקטלג קבצים - הוא מגלה קשרים ביניהם.
זיהוי אחים מרומז: קבצים עם (תאריך, slug) זהים בין פלטפורמות מקושרים כ-series_sibling. אם יש לכם linkedin/final/2026-02-17_build-your-own-os.md ו-substack/final/2026-02-17_build-your-own-os.md, האינדקס יודע שהם קשורים בלי שתגידו לו.
זיהוי הצלבות מפורש: הסקריפט מפרסר מקטעי ## Cross-Platform Notes, מחפש מילות מפתח של פלטפורמות עם כינויים (LinkedIn, X/Twitter, Reddit), ומתאים אותן לתוכן קיים לפי תאריך ופלטפורמה.
75 זוגות אחים ו-4 הצלבות מפורשות באינדקס הנוכחי. גרף התוכן הוא אמיתי וניתן לשאילתות.
זיהוי דפים מתים
בגלל זה הפוסט הזה קיים. האינדקס חשף את הפער שלו עצמו.
שאלו את טבלת ה-content על קבצים עם אפס קישורים נכנסים מ-content_links. אלה יתומים - תוכן שקיים אבל שום דבר לא מצביע אליו. שאלו על קבצים עם אפס קישורים יוצאים. אלה מבויים סתומים - תוכן שלא מתחבר לשום דבר אחר.
הרצתי את השאילתות האלה וגיליתי ששלוש מערכות מרכזיות יצאו לאוויר עם אפס כיסוי בלוגי: מערכת הווידאו של Remotion, אינדקס ה-SQLite הזה עצמו, וטופולוגיית אשכולות התוכן. הכלי שמוצא פערי תוכן חשף פערי תוכן על הכלי.
המטא הרקורסיבי
הפוסט הזה הוא תוצאה ישירה של המערכת שהוא מתאר. אינדקס ה-SQLite הפך את הריפו לניתן לשאילתות. שאילתה חשפה שאין תוכן שמכסה את האינדקס. אז כתבתי את הפוסט הזה. כשאני בונה מחדש את האינדקס, הפוסט הזה מופיע בו. המערכת מתעדת את עצמה.
זה לא גימיק. זו התזה של הנדסת תוכן. המערכת מייצרת את התוכן שמתאר את המערכת. כל יכולת חדשה הופכת לפיסת תוכן חדשה. כל פיסת תוכן חדשה מחזקת את גרף הידע. הלולאה מצטברת.
$ python3 scripts/query_index.py content --platform website --stage final