[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6JDSYV9WRM8HWE40VBDBG2B":3,"skill-same:01M6JDSYV9WRM8HWE40VBDBG2B":73},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":25,"publishedAt":46,"linkOnly":47,"markdownContent":48,"markdownBody":49,"frontMatter":50,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":56,"ownerHtmlUrl":57,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":58,"install":59,"resources":72},"01M6JDSYV9WRM8HWE40VBDBG2B","drive-knowledge-ingestion",null,"Vijf-fase knowledge pipeline: Drive scanning → document text extraction → SQLite FTS5 knowledge base → entity extraction (heuristics) → knowledge graph → Neo4j export → Cognify memory integration → realtime dashboard. Disk-safe: media wordt alleen metadata, documenten download naar temp en verwijderen direct. Ontworpen voor 8GB+ constraints.","S3YED\u002Fappie-kit","S3YED","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F62743867?v=4","01M6JBKBRRVP6KMS0VWZ27T3R6","01M6JBKBX0KG30284PW1DBYJT1",14,"MIT","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fintegrations\u002Fdrive-knowledge-ingestion\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000021","资料检索与研究","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"drive knowledge ingestion","drive","ingestion","knowledge","text","cognify","fts5","knowledge base","scanning","export","direct","safe","disk","sqlite","Media","heuristics","pipeline","knowledge graph","dashboard","memory","2026-11-10 10:12:30",false,"---\nname: drive-knowledge-ingestion\ndescription: >-\n  Vijf-fase knowledge pipeline: Drive scanning → document text extraction\n  → SQLite FTS5 knowledge base → entity extraction (heuristics) →\n  knowledge graph → Neo4j export → Cognify memory integration →\n  realtime dashboard. Disk-safe: media wordt alleen metadata, documenten\n  download naar temp en verwijderen direct. Ontworpen voor 8GB+ constraints.\n---\n\n# Knowledge Base Engineering — Full Pipeline\n\nClass-level umbrella for ingesting, indexing, enriching, and visualizing\nknowledge from Google Drive. Three stages: **Extract** → **Index** →\n**Enrich & Visualize**.\n\n## When to load\n\n- User says \"scan my entire Drive\" or \"build a knowledge base\"\n- User asks for a dashboard of Drive\u002Fbusiness data\n- You need to understand a client's full document landscape\n- User says \"build an entity graph\" or \"prepare for Neo4j\"\n\n## Triggers not to load\n\n- Quick one-off file lookup (use google-workspace instead)\n- Sending email or calendar ops (use google-workspace)\n\n---\n\n## Stage 1: Drive Scanning & Document Extraction\n\n### Full recursive scan\n\nUse `gog drive ls --all` with pagination to list every file in the Drive:\n\n```bash\ngog drive ls --json --all --max 1000 --client \u003Cclient>\n# Check nextPageToken, paginate if present\n```\n\nRebuild folder hierarchy from the `parents` field:\n```python\nparent_map = {}\nfor f in all_files:\n    for p in f.get('parents', []):\n        parent_map.setdefault(p, []).append(f)\n```\n\n### Type breakdown\n\n```python\nfrom collections import Counter\ntypes = Counter()\nfor f in all_files:\n    mt = f['mimeType']\n    if 'folder' in mt: types['folder'] += 1\n    elif 'video' in mt or 'quicktime' in mt: types['video'] += 1\n    elif any(x in mt for x in ['image','jpeg','png','heic','arw']): types['image'] += 1\n    elif 'document' in mt or 'wordprocessing' in mt: types['document'] += 1\n    elif 'pdf' in mt: types['pdf'] += 1\n    elif 'presentation' in mt or 'slides' in mt: types['presentation'] += 1\n    elif 'spreadsheet' in mt or 'sheet' in mt: types['spreadsheet'] += 1\n    elif 'audio' in mt: types['audio'] += 1\n    else: types['other'] += 1\n```\n\n### Document text extraction\n\nUse `gog drive download --format \u003Cfmt>` to export Google-native docs:\n\n| Google type | Export format | Tool |\n|---|---|---|\n| Google Doc | `txt` | `gog drive download --format txt` |\n| Google Slides | `pptx` | `gog drive download --format pptx` |\n| Google Sheets | `csv` | `gog drive download --format csv` |\n| PDFs (native) | — | `gog drive download` → `pdftotext` |\n\n**Disk management:** download to temp, extract text, delete temp immediately.\nNever store media files (video\u002Faudio\u002Fimages >500KB) locally.\n\n---\n\n## Stage 2: SQLite Knowledge Base\n\n### Schema\n\n```sql\nCREATE TABLE files (\n    id TEXT PRIMARY KEY,\n    name TEXT, mime_type TEXT, size INTEGER,\n    modified TEXT, parents TEXT, web_link TEXT, category TEXT,\n    ingested INTEGER DEFAULT 0, ingested_at TEXT\n);\nCREATE TABLE documents (\n    id TEXT PRIMARY KEY, file_id TEXT,\n    content TEXT, word_count INTEGER, char_count INTEGER, summary TEXT\n);\nCREATE VIRTUAL TABLE docs_fts USING fts5(content, content='documents', content_rowid='rowid');\nCREATE TABLE document_tags (id INTEGER PRIMARY KEY, file_id TEXT, tag TEXT);\n```\n\n### FTS5 Search\n\n```sql\n-- Full-text search across all document text\nSELECT f.name, snippet(docs_fts, -1, '**', '**', '...', 32)\nFROM docs_fts JOIN files f ON f.id = docs_fts.file_id\nWHERE docs_fts MATCH 'search query';\n```\n\n### Scripts\n\n- **`scripts\u002Fknowledge-ingest.py`** — `\u002Froot\u002F.hermes\u002Ftools\u002Fknowledge-ingest.py`\n  Runs Stage 1 + 2. Idempotent (skips already-processed files).\n- **Cron job:** `drive-kennisbank-update` (weekly auto-refresh)\n\n---\n\n## Stage 3: Entity Extraction & Knowledge Graph\n\n### Heuristics-based approach (no LLM needed)\n\nUses regex + known-person lists + keyword patterns instead of LLM calls.\nThis is **disk-safe, free, and fast** — suitable for 5,000+ file Drives.\n\n**Entity types:** person, project, company, location\n\n**Person matching:** regex for capitalized names + a KNOWN_PEOPLE list.\n**Project matching:** regex for known brand\u002Fproject names.\n**Location matching:** known locations from the client's context.\n**Topics:** keyword-based classification (coaching, finance, legal, marketing, etc.)\n\n### Graph schema (SQLite)\n\n```sql\nCREATE TABLE entities (\n    id INTEGER PRIMARY KEY, name TEXT, entity_type TEXT,\n    mention_count INTEGER DEFAULT 1, first_seen TEXT\n);\nCREATE TABLE relationships (\n    id INTEGER PRIMARY KEY,\n    source_entity_id INTEGER, target_entity_id INTEGER,\n    relationship_type TEXT, document_id TEXT, confidence REAL\n);\n```\n\n### Neo4j export\n\nExport entities + relationships as CSV + Cypher script:\n\n```bash\n# Produces in \u002Froot\u002F.hermes\u002Fneo4j-export\u002F:\n#   entities.csv  — nodes\n#   documents.csv — document nodes\n#   relationships.csv — edges\n#   import.cypher — run against Neo4j\n```\n\n### Scripts\n\n- **`scripts\u002Fentity-pipeline.py`** — `\u002Froot\u002F.hermes\u002Ftools\u002Fentity-pipeline.py`\n  Runs Stage 3. Heuristics-only, no API calls.\n- **Neo4j export:** auto-generated at `\u002Froot\u002F.hermes\u002Fneo4j-export\u002F`\n\n---\n\n## Stage 4: Dashboard\n\n### Architecture\n\n```\ndata collector (cron 30m) → dashboard-data.json → HTTP server → HTML + Chart.js\n                                                         → Vercel (static deploy)\n```\n\n**Data collector:** `\u002Froot\u002F.hermes\u002Ftools\u002Fdashboard-collector.py`\nGathers: Drive stats, system health, session activity, skills, GitHub PRs.\n\n**Dashboard HTML:** `\u002Froot\u002F.hermes\u002Fdashboard.html`\nSingle-page app, dark mode, Chart.js visualizations.\n\n**Server:** `\u002Froot\u002F.hermes\u002Ftools\u002Fdashboard-server.py [port]`\nServes HTML + JSON API endpoint at `\u002Fdata`.\n\n**Cron:** `dashboard-data-refresh` (every 30 min) — runs collector, copies data.json to\nVercel project dir, and auto-deploys via `vercel deploy --prod --yes`.\n\n### Branding the dashboard\n\nEvery dashboard should carry the client's own visual identity. The workflow:\n\n1. **Find brand assets** in Google Drive (search for logos, brand guidelines files)\n2. **Extract brand colors** from SVG logos — download via gog, read `fill` attributes for exact hex\n3. **Inline the logo SVG** directly in HTML (no external loads, no CORS)\n4. **Build a CSS custom-property token system** (primary, secondary, accent, greys)\n5. **Design deliberately** — use the client's existing visual language, not generic dark-mode\n6. **Dual-mode fetch** so HTML works both locally and on Vercel:\n   ```js\n   let res = await fetch('\u002Fdata').catch(() => fetch('data.json'));\n   ```\n7. **Auto-refresh pipeline**: cron → collector → copy → vercel deploy\n\nSee `references\u002Fdashboard-branding-guide.md` for the full step-by-step.\n\n### Vercel deployment\n\nThe static dashboard + data.json can be deployed to Vercel:\n`vercel deploy --prod --yes` from the project dir.\nSee `references\u002Fdashboard-vercel-deployment.md` for the full workflow.\n\nCron job `dashboard-data-refresh` should copy both the HTML and data.json to the Vercel\nproject directory before deploying, so branding changes propagate automatically.\n\n---\n\n## Stage 5: Cognify Memory Integration\n\nAfter the SQLite knowledge base is built, **ingest into Cognify** (Clark's LLM-powered\nknowledge-graph memory). This bridges the raw document index with typed entity\u002Frelation\nextraction, vector search, and hybrid recall.\n\n### Why\n\nThe SQLite FTS5 knowledge base is a text search index. Cognify adds:\n- Typed entity extraction (Person, Organization, Project) via LLM\n- Relation extraction (WORKS_AT, OWNS, PART_OF) between entities\n- Vector embeddings for semantic search\n- Graph traversal for multi-hop recall\n\n### Workflow\n\n```\nSQLite knowledge DB → filter by business domain → export .md files → Cognify ingest-dir\n```\n\n### Step-by-step\n\n1. **Query the knowledge DB** for documents with extracted text:\n   ```sql\n   SELECT f.id, f.name, d.content FROM files f\n   JOIN documents d ON d.file_id = f.id\n   WHERE d.content IS NOT NULL AND d.char_count > 100\n   ```\n\n2. **Filter by business domain** — exclude unrelated businesses.\n   For Solaiman: include TGE\u002Finfobusiness, exclude Wethlete\u002FWheatleet.\n   See `references\u002Ftge-cognify-export-guide.md` for keyword lists.\n\n3. **Export as .md with YAML frontmatter**:\n   ```python\n   frontmatter = f\"---\\nname: {name}\\ntags: [{categories}]\\ntype: {mime}\\n---\\n\\n\"\n   ```\n\n4. **Batch ingest into Cognify** — use background mode for 50+ files\n   (LLM entity extraction per chunk is slow):\n   ```bash\n   python3 \u002Froot\u002F.hermes\u002Fscripts\u002Fcognify-cli.py \\\n     --tenant solaiman ingest-dir \u002Fpath\u002Fto\u002Fexport\u002Fdir --glob \"*.md\"\n   ```\n\n5. **Verify**:\n   ```bash\n   cognify --tenant solaiman stats\n   cognify --tenant solaiman recall \"Wat zijn de coaching pakketten?\"\n   ```\n\n### Pitfalls\n\n- **Deduplicate first.** The knowledge DB often has duplicate versions of the same doc.\n  Group by normalized name and keep highest `char_count`.\n- **Filter businesses.** Multiple businesses in one Drive = always keyword-filter\n  to avoid polluting the knowledge graph.\n- **LLM cost.** Every chunk triggers entity extraction. Expected and correct.\n- **`--tenant` before subcommand** — required by argparse.\n\n### Related\n\n- `cognify` skill — Core Cognify commands\n- `references\u002Ftge-cognify-export-guide.md` — TGE filter keywords and patterns\n\n---\n\n## Disk-Safe Design Principles (8GB constraint)\n\n| Rule | Why |\n|---|---|\n| Never store media locally | Video (2.5K files) + images (1.8K) = 500+ GB in Drive |\n| Download docs to \u002Ftmp, extract, delete | Each doc is \u003C1MB, temp footprint stays under 50MB |\n| SQLite instead of heavy vector DB | FTS5 fits in 2MB vs ChromaDB+Torch = 2GB+ |\n| Heuristics over LLM for entity extraction | 0 API cost, 0 disk, 0 latency per file |\n| Single-page HTML dashboard | No build step, no node_modules, no framework |\n\n## References\n\n- `references\u002Fdrive-research-workflow.md` — Systematic Drive exploration steps\n  (in google-workspace skill, shared reference)\n- `references\u002Fentity-extraction-methodology.md` — Known person lists,\n  keyword maps, and extraction patterns for this client's ecosystem\n\n## Related skills\n\n- `google-workspace` — Raw Drive\u002FGmail\u002FCalendar CLI ops (pre-pipeline)\n- `srt-subtitles` — Parsing .srt subtitle files from Drive===ME:drive-knowledge-ingestion","# Knowledge Base Engineering — Full Pipeline\n\nClass-level umbrella for ingesting, indexing, enriching, and visualizing\nknowledge from Google Drive. Three stages: **Extract** → **Index** →\n**Enrich & Visualize**.\n\n## When to load\n\n- User says \"scan my entire Drive\" or \"build a knowledge base\"\n- User asks for a dashboard of Drive\u002Fbusiness data\n- You need to understand a client's full document landscape\n- User says \"build an entity graph\" or \"prepare for Neo4j\"\n\n## Triggers not to load\n\n- Quick one-off file lookup (use google-workspace instead)\n- Sending email or calendar ops (use google-workspace)\n\n---\n\n## Stage 1: Drive Scanning & Document Extraction\n\n### Full recursive scan\n\nUse `gog drive ls --all` with pagination to list every file in the Drive:\n\n```bash\ngog drive ls --json --all --max 1000 --client \u003Cclient>\n# Check nextPageToken, paginate if present\n```\n\nRebuild folder hierarchy from the `parents` field:\n```python\nparent_map = {}\nfor f in all_files:\n    for p in f.get('parents', []):\n        parent_map.setdefault(p, []).append(f)\n```\n\n### Type breakdown\n\n```python\nfrom collections import Counter\ntypes = Counter()\nfor f in all_files:\n    mt = f['mimeType']\n    if 'folder' in mt: types['folder'] += 1\n    elif 'video' in mt or 'quicktime' in mt: types['video'] += 1\n    elif any(x in mt for x in ['image','jpeg','png','heic','arw']): types['image'] += 1\n    elif 'document' in mt or 'wordprocessing' in mt: types['document'] += 1\n    elif 'pdf' in mt: types['pdf'] += 1\n    elif 'presentation' in mt or 'slides' in mt: types['presentation'] += 1\n    elif 'spreadsheet' in mt or 'sheet' in mt: types['spreadsheet'] += 1\n    elif 'audio' in mt: types['audio'] += 1\n    else: types['other'] += 1\n```\n\n### Document text extraction\n\nUse `gog drive download --format \u003Cfmt>` to export Google-native docs:\n\n| Google type | Export format | Tool |\n|---|---|---|\n| Google Doc | `txt` | `gog drive download --format txt` |\n| Google Slides | `pptx` | `gog drive download --format pptx` |\n| Google Sheets | `csv` | `gog drive download --format csv` |\n| PDFs (native) | — | `gog drive download` → `pdftotext` |\n\n**Disk management:** download to temp, extract text, delete temp immediately.\nNever store media files (video\u002Faudio\u002Fimages >500KB) locally.\n\n---\n\n## Stage 2: SQLite Knowledge Base\n\n### Schema\n\n```sql\nCREATE TABLE files (\n    id TEXT PRIMARY KEY,\n    name TEXT, mime_type TEXT, size INTEGER,\n    modified TEXT, parents TEXT, web_link TEXT, category TEXT,\n    ingested INTEGER DEFAULT 0, ingested_at TEXT\n);\nCREATE TABLE documents (\n    id TEXT PRIMARY KEY, file_id TEXT,\n    content TEXT, word_count INTEGER, char_count INTEGER, summary TEXT\n);\nCREATE VIRTUAL TABLE docs_fts USING fts5(content, content='documents', content_rowid='rowid');\nCREATE TABLE document_tags (id INTEGER PRIMARY KEY, file_id TEXT, tag TEXT);\n```\n\n### FTS5 Search\n\n```sql\n-- Full-text search across all document text\nSELECT f.name, snippet(docs_fts, -1, '**', '**', '...', 32)\nFROM docs_fts JOIN files f ON f.id = docs_fts.file_id\nWHERE docs_fts MATCH 'search query';\n```\n\n### Scripts\n\n- **`scripts\u002Fknowledge-ingest.py`** — `\u002Froot\u002F.hermes\u002Ftools\u002Fknowledge-ingest.py`\n  Runs Stage 1 + 2. Idempotent (skips already-processed files).\n- **Cron job:** `drive-kennisbank-update` (weekly auto-refresh)\n\n---\n\n## Stage 3: Entity Extraction & Knowledge Graph\n\n### Heuristics-based approach (no LLM needed)\n\nUses regex + known-person lists + keyword patterns instead of LLM calls.\nThis is **disk-safe, free, and fast** — suitable for 5,000+ file Drives.\n\n**Entity types:** person, project, company, location\n\n**Person matching:** regex for capitalized names + a KNOWN_PEOPLE list.\n**Project matching:** regex for known brand\u002Fproject names.\n**Location matching:** known locations from the client's context.\n**Topics:** keyword-based classification (coaching, finance, legal, marketing, etc.)\n\n### Graph schema (SQLite)\n\n```sql\nCREATE TABLE entities (\n    id INTEGER PRIMARY KEY, name TEXT, entity_type TEXT,\n    mention_count INTEGER DEFAULT 1, first_seen TEXT\n);\nCREATE TABLE relationships (\n    id INTEGER PRIMARY KEY,\n    source_entity_id INTEGER, target_entity_id INTEGER,\n    relationship_type TEXT, document_id TEXT, confidence REAL\n);\n```\n\n### Neo4j export\n\nExport entities + relationships as CSV + Cypher script:\n\n```bash\n# Produces in \u002Froot\u002F.hermes\u002Fneo4j-export\u002F:\n#   entities.csv  — nodes\n#   documents.csv — document nodes\n#   relationships.csv — edges\n#   import.cypher — run against Neo4j\n```\n\n### Scripts\n\n- **`scripts\u002Fentity-pipeline.py`** — `\u002Froot\u002F.hermes\u002Ftools\u002Fentity-pipeline.py`\n  Runs Stage 3. Heuristics-only, no API calls.\n- **Neo4j export:** auto-generated at `\u002Froot\u002F.hermes\u002Fneo4j-export\u002F`\n\n---\n\n## Stage 4: Dashboard\n\n### Architecture\n\n```\ndata collector (cron 30m) → dashboard-data.json → HTTP server → HTML + Chart.js\n                                                         → Vercel (static deploy)\n```\n\n**Data collector:** `\u002Froot\u002F.hermes\u002Ftools\u002Fdashboard-collector.py`\nGathers: Drive stats, system health, session activity, skills, GitHub PRs.\n\n**Dashboard HTML:** `\u002Froot\u002F.hermes\u002Fdashboard.html`\nSingle-page app, dark mode, Chart.js visualizations.\n\n**Server:** `\u002Froot\u002F.hermes\u002Ftools\u002Fdashboard-server.py [port]`\nServes HTML + JSON API endpoint at `\u002Fdata`.\n\n**Cron:** `dashboard-data-refresh` (every 30 min) — runs collector, copies data.json to\nVercel project dir, and auto-deploys via `vercel deploy --prod --yes`.\n\n### Branding the dashboard\n\nEvery dashboard should carry the client's own visual identity. The workflow:\n\n1. **Find brand assets** in Google Drive (search for logos, brand guidelines files)\n2. **Extract brand colors** from SVG logos — download via gog, read `fill` attributes for exact hex\n3. **Inline the logo SVG** directly in HTML (no external loads, no CORS)\n4. **Build a CSS custom-property token system** (primary, secondary, accent, greys)\n5. **Design deliberately** — use the client's existing visual language, not generic dark-mode\n6. **Dual-mode fetch** so HTML works both locally and on Vercel:\n   ```js\n   let res = await fetch('\u002Fdata').catch(() => fetch('data.json'));\n   ```\n7. **Auto-refresh pipeline**: cron → collector → copy → vercel deploy\n\nSee `references\u002Fdashboard-branding-guide.md` for the full step-by-step.\n\n### Vercel deployment\n\nThe static dashboard + data.json can be deployed to Vercel:\n`vercel deploy --prod --yes` from the project dir.\nSee `references\u002Fdashboard-vercel-deployment.md` for the full workflow.\n\nCron job `dashboard-data-refresh` should copy both the HTML and data.json to the Vercel\nproject directory before deploying, so branding changes propagate automatically.\n\n---\n\n## Stage 5: Cognify Memory Integration\n\nAfter the SQLite knowledge base is built, **ingest into Cognify** (Clark's LLM-powered\nknowledge-graph memory). This bridges the raw document index with typed entity\u002Frelation\nextraction, vector search, and hybrid recall.\n\n### Why\n\nThe SQLite FTS5 knowledge base is a text search index. Cognify adds:\n- Typed entity extraction (Person, Organization, Project) via LLM\n- Relation extraction (WORKS_AT, OWNS, PART_OF) between entities\n- Vector embeddings for semantic search\n- Graph traversal for multi-hop recall\n\n### Workflow\n\n```\nSQLite knowledge DB → filter by business domain → export .md files → Cognify ingest-dir\n```\n\n### Step-by-step\n\n1. **Query the knowledge DB** for documents with extracted text:\n   ```sql\n   SELECT f.id, f.name, d.content FROM files f\n   JOIN documents d ON d.file_id = f.id\n   WHERE d.content IS NOT NULL AND d.char_count > 100\n   ```\n\n2. **Filter by business domain** — exclude unrelated businesses.\n   For Solaiman: include TGE\u002Finfobusiness, exclude Wethlete\u002FWheatleet.\n   See `references\u002Ftge-cognify-export-guide.md` for keyword lists.\n\n3. **Export as .md with YAML frontmatter**:\n   ```python\n   frontmatter = f\"---\\nname: {name}\\ntags: [{categories}]\\ntype: {mime}\\n---\\n\\n\"\n   ```\n\n4. **Batch ingest into Cognify** — use background mode for 50+ files\n   (LLM entity extraction per chunk is slow):\n   ```bash\n   python3 \u002Froot\u002F.hermes\u002Fscripts\u002Fcognify-cli.py \\\n     --tenant solaiman ingest-dir \u002Fpath\u002Fto\u002Fexport\u002Fdir --glob \"*.md\"\n   ```\n\n5. **Verify**:\n   ```bash\n   cognify --tenant solaiman stats\n   cognify --tenant solaiman recall \"Wat zijn de coaching pakketten?\"\n   ```\n\n### Pitfalls\n\n- **Deduplicate first.** The knowledge DB often has duplicate versions of the same doc.\n  Group by normalized name and keep highest `char_count`.\n- **Filter businesses.** Multiple businesses in one Drive = always keyword-filter\n  to avoid polluting the knowledge graph.\n- **LLM cost.** Every chunk triggers entity extraction. Expected and correct.\n- **`--tenant` before subcommand** — required by argparse.\n\n### Related\n\n- `cognify` skill — Core Cognify commands\n- `references\u002Ftge-cognify-export-guide.md` — TGE filter keywords and patterns\n\n---\n\n## Disk-Safe Design Principles (8GB constraint)\n\n| Rule | Why |\n|---|---|\n| Never store media locally | Video (2.5K files) + images (1.8K) = 500+ GB in Drive |\n| Download docs to \u002Ftmp, extract, delete | Each doc is \u003C1MB, temp footprint stays under 50MB |\n| SQLite instead of heavy vector DB | FTS5 fits in 2MB vs ChromaDB+Torch = 2GB+ |\n| Heuristics over LLM for entity extraction | 0 API cost, 0 disk, 0 latency per file |\n| Single-page HTML dashboard | No build step, no node_modules, no framework |\n\n## References\n\n- `references\u002Fdrive-research-workflow.md` — Systematic Drive exploration steps\n  (in google-workspace skill, shared reference)\n- `references\u002Fentity-extraction-methodology.md` — Known person lists,\n  keyword maps, and extraction patterns for this client's ecosystem\n\n## Related skills\n\n- `google-workspace` — Raw Drive\u002FGmail\u002FCalendar CLI ops (pre-pipeline)\n- `srt-subtitles` — Parsing .srt subtitle files from Drive===ME:drive-knowledge-ingestion",{"name":5,"description":7},"master","8ec37df6d71fb664ea19d32c079e7d3ff931a8e0","skills\u002Fintegrations\u002Fdrive-knowledge-ingestion",3,"https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit","https:\u002F\u002Fweblyfe.ai","https:\u002F\u002Fgithub.com\u002FS3YED","2026-08-27 01:54:02",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add S3YED\u002Fappie-kit --skill drive-knowledge-ingestion",{"tool":65,"command":66},"bunx","bunx skills add S3YED\u002Fappie-kit --skill drive-knowledge-ingestion",{"tool":68,"command":69},"pnpm","pnpm dlx skills add S3YED\u002Fappie-kit --skill drive-knowledge-ingestion","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fintegrations\u002Fdrive-knowledge-ingestion\u002FSKILL.md",true,[],[74,106,140,166,197,222],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":87,"publishedAt":46},"01M6JFD4M6N4DSGC7TXEJ5R3J2","ai-music","AI music generation and audio tools: HeartMuLa lyrics-to-music generation, songwriting craft (+ Suno prompts), and audio spectrogram\u002Ffeature visualization.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fwethlete\u002Fai-music\u002FSKILL.md",[80,83,86],{"categoryNo":81,"categoryName":82,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000013","分析与可视化",{"categoryNo":84,"categoryName":85,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105],"music","ai music","humanizer","visualization","Tools","Audio","hermes","hermes agent","songwriting","suno","lyrics","prompts","heartmula","craft","generation","feature","ai music generation","music generation",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":120,"publishedAt":46},"01M6JFCZE4XNFQFMNZDHKHT5V5","agentic-webdesign-design-system-ingestion","Use v0 Design Systems 2.0, Bolt Design System Agents, or Lovable to generate production UI from a client's real design system components — not generic Tailwind. Use when building a client website where brand consistency matters.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fweb-design\u002Fagentic-webdesign-design-system-ingestion\u002FSKILL.md",[112,115],{"categoryNo":113,"categoryName":114,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":116,"categoryName":117,"taxonomyType":118,"taxonomyTypeDesc":119},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[121,122,123,124,28,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139],"design","agentic","design system","system","webdesign","agentic webdesign design system ingestion","components","generate","design systems","website","ui","Tailwind","bolt","lovable","v0","design-system","wed","design system components","appie",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":148,"publishedAt":46},"01M6JFCVPX3913CFAS6QQJ33ZB","agentic-webdesign-agent-elements","Use 21st.dev Agent Elements — 25 shadcn\u002Fui components purpose-built for AI agent UIs. Tool cards (Bash, Edit, Search, Plan, Subagent, MCP), chat, input, streaming. Open source, shadcn-registry install, no runtime lock-in.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fweb-design\u002Fagentic-webdesign-agent-elements\u002FSKILL.md",[146,147],{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":116,"categoryName":117,"taxonomyType":118,"taxonomyTypeDesc":119},[122,149,125,150,151,152,127,153,154,155,156,157,158,159,160,161,162,163,164,165],"elements","agentic webdesign agent elements","MCP","ai agent","registry","search","streaming","open source","open","Bash","plan","subagent","edit","install","input","lock","source",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":170,"categories":171,"keywords":176,"publishedAt":46},"01M6JFCQC7H65M9QJ6TRE71BS1","vercel-deployment","Deploy static sites and frontends to Vercel — handles both CLI and REST API paths, including the CLI token sanitization workaround.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fsoftware-development\u002Fvercel-deployment\u002FSKILL.md",[172,175],{"categoryNo":173,"categoryName":174,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196],"deployment","vercel deployment","vercel","macos","cli","linux","windows","deploy","vercel deploy","REST","api","site","deploy to vercel","token","rest api","host","sites","paths","sanitization","static site",{"skillNo":198,"name":199,"nameZh":6,"description":200,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":201,"categories":202,"keywords":204,"publishedAt":46},"01M6JFCM4SMTXBM5A01BK2YQG1","software-quality-workflows","Umbrella workflow for TDD, debugging, code simplification, spikes, pre-commit review, and debugger-assisted investigation.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fsoftware-development\u002Fsoftware-quality-workflows\u002FSKILL.md",[203],{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221],"workflows","quality","software","software quality workflows","review","tdd","workflow","commit","debugging","code","debugger","pre-commit","investigation","code simplification","user","simplification","for",{"skillNo":223,"name":224,"nameZh":6,"description":225,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":226,"categories":227,"keywords":235,"publishedAt":46},"01M6JFCGD0M6CEATY01W7YN6DB","react-component-refactoring","Safely refactor large React components into smaller, maintainable pieces using proven patterns","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fsoftware-development\u002Freact-component-refactoring\u002FSKILL.md",[228,231,234],{"categoryNo":229,"categoryName":230,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":232,"categoryName":233,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[236,237,238,239,240,241,242,243,180,37,244,127,245,183,246,214,247,248,249,250],"react","component","refactoring","component refactoring","react component","react component refactoring","frontend","writing","typescript","react components","modular","refactor","simplify","patterns","test-driven-development"]