[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M70FN9WYSGBEFXQ28BM5F8ES":3,"skill-same:01M70FN9WYSGBEFXQ28BM5F8ES":101},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":50,"ownerDescription":51,"updatedAt":52,"install":53,"resources":66},"01M70FN9WYSGBEFXQ28BM5F8ES","SAI-podcast-rag-index",null,"Atomic SAI skill. Index a directory of transcript .md files (YAML frontmatter, one per episode) into an existing ChromaDB RAG store by delegating to a rag-index-updater-style index.py. Pure mechanism — no operator paths or collection baked in; the caller supplies indexer_scripts \u002F manifest_path directly or via a private config_path. Hash-skips unchanged files. Use whenever you need to index transcripts, add transcripts to a RAG, or embed episodes for semantic lookup.","lutzfinger\u002FSAI-baseversion","lutzfinger","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F2042951?v=4","01M70FMZRX9KAEB1JAP7GGST28","Lutz Finger","01M70FMZSMNSQXME0Z705YQQQG",30,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Flutzfinger\u002FSAI-baseversion\u002Fblob\u002Fmain\u002Fskills\u002Fpodcast-rag-index\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"rag","index","podcast","SAI podcast rag index","scripts","directory","via","style","updater","store","transcript","embed","indexer","collection","you","manifest","Existing","use","files","for","2026-11-10 10:12:30",false,"---\nname: SAI-podcast-rag-index\ndescription: Atomic SAI skill. Index a directory of transcript .md files (YAML frontmatter, one per episode) into an existing ChromaDB RAG store by delegating to a rag-index-updater-style index.py. Pure mechanism — no operator paths or collection baked in; the caller supplies indexer_scripts \u002F manifest_path directly or via a private config_path. Hash-skips unchanged files. Use whenever you need to index transcripts, add transcripts to a RAG, or embed episodes for semantic lookup.\n---\n\n# Trigger manifest — podcast-rag-index (atomic, autonomous)\n\nCode: `skills\u002Fpodcast-rag-index\u002F`\nManifest: `skill.yaml` (3-tier cascade)\nEntry point: `runner.py` → `run(inputs)`\n\n## Cascade plan\n\n```\n1. locate_indexer   (rules) → resolve indexer_scripts (input or config_path); fail-closed if unset\n2. scan_inputs      (rules) → diff input_dir vs manifest (new+changed only)\n3. run_indexer      (rules) → shell to index.py → ChromaDB upsert\n```\n\n## Invocation\n\n```bash\n.venv\u002Fbin\u002Fpython3.12 \\\n  skills\u002Fpodcast-rag-index\u002Frunner.py run \\\n  --inputs-json '{\n    \"input_dir\":   \"~\u002FMedia\u002Ftranscripts\u002F\u003Cshow-slug>\",\n    \"config_path\": \"\u003Cyour-private-overlay>\u002Fconfig\u002Fpodcast_ingest.yaml\"\n  }'\n```\n\n`config_path` supplies operator values (`indexer_scripts`, `manifest_path`) from\nthe private side. Or pass `indexer_scripts` directly. `\"force\": true` re-indexes\neven if hash unchanged. Invoke by absolute path (hyphenated folder name).\n\n## Why a thin wrapper\n\nThe operator's `index.py` owns embed + chunk + upsert + the ChromaDB collection.\nThis skill only scopes the scan to one directory and reuses that indexer — one\nsource of truth, no second codepath to drift.\n\n## Composes with\n\n- Upstream: `SAI-local-transcribe`\n- Companion: a general-purpose `rag-index-updater` (full-tree variant)\n- Downstream consumer: a `rag-content-lookup` (semantic search over results)\n","# Trigger manifest — podcast-rag-index (atomic, autonomous)\n\nCode: `skills\u002Fpodcast-rag-index\u002F`\nManifest: `skill.yaml` (3-tier cascade)\nEntry point: `runner.py` → `run(inputs)`\n\n## Cascade plan\n\n```\n1. locate_indexer   (rules) → resolve indexer_scripts (input or config_path); fail-closed if unset\n2. scan_inputs      (rules) → diff input_dir vs manifest (new+changed only)\n3. run_indexer      (rules) → shell to index.py → ChromaDB upsert\n```\n\n## Invocation\n\n```bash\n.venv\u002Fbin\u002Fpython3.12 \\\n  skills\u002Fpodcast-rag-index\u002Frunner.py run \\\n  --inputs-json '{\n    \"input_dir\":   \"~\u002FMedia\u002Ftranscripts\u002F\u003Cshow-slug>\",\n    \"config_path\": \"\u003Cyour-private-overlay>\u002Fconfig\u002Fpodcast_ingest.yaml\"\n  }'\n```\n\n`config_path` supplies operator values (`indexer_scripts`, `manifest_path`) from\nthe private side. Or pass `indexer_scripts` directly. `\"force\": true` re-indexes\neven if hash unchanged. Invoke by absolute path (hyphenated folder name).\n\n## Why a thin wrapper\n\nThe operator's `index.py` owns embed + chunk + upsert + the ChromaDB collection.\nThis skill only scopes the scan to one directory and reuses that indexer — one\nsource of truth, no second codepath to drift.\n\n## Composes with\n\n- Upstream: `SAI-local-transcribe`\n- Companion: a general-purpose `rag-index-updater` (full-tree variant)\n- Downstream consumer: a `rag-content-lookup` (semantic search over results)\n",{"name":5,"description":7},"main","230c0cbe27ddb69dff12b1fb9dbfff72098be4d8","skills\u002Fpodcast-rag-index",14,"https:\u002F\u002Fgithub.com\u002Flutzfinger\u002FSAI-baseversion","https:\u002F\u002Fgithub.com\u002Flutzfinger","lutzfinger.com","Chief AI Officer · OMMAX \r\nData Scientist in Residence · Cornell SC Johnson College of Business\r\nVenture Partner · Cherry Ventures","2026-07-17 14:56:40",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add lutzfinger\u002FSAI-baseversion --skill SAI-podcast-rag-index",{"tool":59,"command":60},"bunx","bunx skills add lutzfinger\u002FSAI-baseversion --skill SAI-podcast-rag-index",{"tool":62,"command":63},"pnpm","pnpm dlx skills add lutzfinger\u002FSAI-baseversion --skill SAI-podcast-rag-index","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flutzfinger\u002FSAI-baseversion\u002Fblob\u002Fmain\u002Fskills\u002Fpodcast-rag-index\u002FSKILL.md",true,[67,73,77,81,87,93,97],{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"canaries.jsonl","OTHER","其他",325,"https:\u002F\u002Fgithub.com\u002Flutzfinger\u002FSAI-baseversion\u002Fblob\u002Fmain\u002Fskills\u002Fpodcast-rag-index\u002Fcanaries.jsonl",{"path":74,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":75,"sourceHtmlUrl":76},"edge_cases.jsonl",710,"https:\u002F\u002Fgithub.com\u002Flutzfinger\u002FSAI-baseversion\u002Fblob\u002Fmain\u002Fskills\u002Fpodcast-rag-index\u002Fedge_cases.jsonl",{"path":78,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":79,"sourceHtmlUrl":80},"profiles\u002Fclaude_code\u002Fcanaries.jsonl",633,"https:\u002F\u002Fgithub.com\u002Flutzfinger\u002FSAI-baseversion\u002Fblob\u002Fmain\u002Fskills\u002Fpodcast-rag-index\u002Fprofiles\u002Fclaude_code\u002Fcanaries.jsonl",{"path":82,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":85,"sourceHtmlUrl":86},"README.md","REFERENCE","参考文档",2147,"https:\u002F\u002Fgithub.com\u002Flutzfinger\u002FSAI-baseversion\u002Fblob\u002Fmain\u002Fskills\u002Fpodcast-rag-index\u002FREADME.md",{"path":88,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":91,"sourceHtmlUrl":92},"runner.py","SCRIPT","脚本",7294,"https:\u002F\u002Fgithub.com\u002Flutzfinger\u002FSAI-baseversion\u002Fblob\u002Fmain\u002Fskills\u002Fpodcast-rag-index\u002Frunner.py",{"path":94,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":95,"sourceHtmlUrl":96},"skill.yaml",2693,"https:\u002F\u002Fgithub.com\u002Flutzfinger\u002FSAI-baseversion\u002Fblob\u002Fmain\u002Fskills\u002Fpodcast-rag-index\u002Fskill.yaml",{"path":98,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":99,"sourceHtmlUrl":100},"workflow_regression.jsonl",634,"https:\u002F\u002Fgithub.com\u002Flutzfinger\u002FSAI-baseversion\u002Fblob\u002Fmain\u002Fskills\u002Fpodcast-rag-index\u002Fworkflow_regression.jsonl",[102,110,123,145,172],{"skillNo":103,"name":104,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":107,"publishedAt":39},"01M70FNHF7QQ2S5ZGXY379VHGH","sample-glob","https:\u002F\u002Fgithub.com\u002Flutzfinger\u002FSAI-baseversion\u002Fblob\u002Fmain\u002Ftests\u002Fruntime\u002Ffixtures\u002Foverlay_deploy\u002Fskills\u002Fsample-glob\u002FSKILL.md",[],[108,109],"sample glob","sample",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":116,"publishedAt":39},"01M70FNFS1JSPPYWQ3C7AA3KPY","sample-alpha","Synthetic skill for sai-overlay deploy tests. Not a real skill.","https:\u002F\u002Fgithub.com\u002Flutzfinger\u002FSAI-baseversion\u002Fblob\u002Fmain\u002Ftests\u002Fruntime\u002Ffixtures\u002Foverlay_deploy\u002Fskills\u002Fsample-alpha\u002FSKILL.md",[],[117,118,109,119,120,121,38,122],"alpha","sample alpha","tests","deploy","overlay","synthetic",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":129,"publishedAt":39},"01M70FNDBVZRBGMJBX84BS50ZW","sample-incoming","Fixture for PR 7 (scaffold-claude-code-skill). Simulates a Claude-Code\nskill discovered in the plugin-install path with no skill.yaml manifest.\nThe scaffold subcommand reads this dir and emits a starter skill.yaml v2\nwith a single claude_code profile.","https:\u002F\u002Fgithub.com\u002Flutzfinger\u002FSAI-baseversion\u002Fblob\u002Fmain\u002Ftests\u002Fruntime\u002Ffixtures\u002Foverlay_deploy\u002Fscaffold\u002Finput\u002Fsample-incoming\u002FSKILL.md",[],[130,109,131,132,133,134,135,38,136,137,138,139,34,140,141,142,143,144],"sample incoming","with","fixture","starter","plugin","pr","yaml","install","single","code skill","claude-code","code","scaffold","profile","path",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":156,"publishedAt":39},"01M70FN73VGMX7VJ8PAG2VYJCC","SAI-podcast-download","Atomic SAI skill. Download podcast episode audio from an RSS feed or a Spotify show URL (resolved to RSS via the iTunes Search API — Spotify itself blocks audio downloads). Resume-safe, retry-aware. Emits a manifest.json that downstream skills (local-transcribe, podcast-rag-index) consume. Use whenever you need to download a podcast, grab episodes of a show, pull audio for a Spotify show URL, or any workflow needs raw podcast MP3s as input.","https:\u002F\u002Fgithub.com\u002Flutzfinger\u002FSAI-baseversion\u002Fblob\u002Fmain\u002Fskills\u002Fpodcast-download\u002FSKILL.md",[151],{"categoryNo":152,"categoryName":153,"taxonomyType":154,"taxonomyTypeDesc":155},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[157,21,158,159,160,161,162,163,164,165,38,166,167,168,36,169,34,170,33,171],"download","SAI podcast download","spotify","show","pull","as","downloads","Audio","retry","transcribe","search","local","URL","workflow","api",{"skillNo":173,"name":174,"nameZh":6,"description":175,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":176,"categories":177,"keywords":179,"publishedAt":39},"01M70FN4CNMY7TJ90T0G6Q0A9Q","SAI-local-transcribe","Atomic SAI skill. Fully-local audio transcription via Whisper (mlx-whisper on Apple Silicon, faster-whisper fallback elsewhere). No audio leaves the machine; no API keys. Accepts a single audio file, a directory, or a podcast-download manifest.json. Writes one .md per input with YAML frontmatter compatible with a rag-index-updater pipeline. Use whenever you need to transcribe audio, run whisper on a file, transcribe all episodes in a folder, or any workflow needs text from audio.","https:\u002F\u002Fgithub.com\u002Flutzfinger\u002FSAI-baseversion\u002Fblob\u002Fmain\u002Fskills\u002Flocal-transcribe\u002FSKILL.md",[178],{"categoryNo":152,"categoryName":153,"taxonomyType":154,"taxonomyTypeDesc":155},[168,166,180,181,182,183,184,164,33,185,171,186,27,187,131,188,34,36,138,170],"SAI local transcribe","apple silicon","machine","pipeline","api keys","file","mlx","text","whisper"]