[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6H43AJZVFDMB0X2GVHPR49Y":3,"skill-same:01M6H43AJZVFDMB0X2GVHPR49Y":90},{"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":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":47,"commitSha":48,"skillDirectory":49,"forksCount":50,"repositoryHtmlUrl":51,"repositoryHomepageUrl":52,"ownerHtmlUrl":53,"ownerBlogUrl":54,"ownerDescription":6,"updatedAt":55,"install":56,"resources":69},"01M6H43AJZVFDMB0X2GVHPR49Y","cleanup",null,"Tidy Downloads after a release is fully processed: move its ZIPs (or loose single-track files) to processed\u002F and delete its extraction folders, after showing the list and getting confirmation. Use when the user is done with an album and wants its leftovers cleared (\"tidy up my downloads for X\", \"remove the extracted folders\"), not for general Downloads housekeeping.","eyelock\u002Fassistants","eyelock","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1277325?v=4","01M6H423MGYJ0P316VZ2MMH75N","David Collie","01M6H423RR18QA9N8S2F3J8S8X",1,"MIT","https:\u002F\u002Fgithub.com\u002Feyelock\u002Fassistants\u002Fblob\u002Fdevelop\u002Fplugins\u002Fmedia-management\u002Fskills\u002Fcleanup\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"use","when","single","track","for","my","with","move","done","general","files","up","remove","user","list","read","confirmation","Bash","tidy","downloads","release","delete","2026-11-10 10:12:30",false,"---\nname: cleanup\ndescription: >-\n  Tidy Downloads after a release is fully processed: move its ZIPs (or loose\n  single-track files) to processed\u002F and delete its extraction folders, after\n  showing the list and getting confirmation. Use when the user is done with an\n  album and wants its leftovers cleared (\"tidy up my downloads for X\", \"remove\n  the extracted folders\"), not for general Downloads housekeeping.\nallowed-tools: Bash Read\n---\n\n## Setup\n\nResolve paths with the setup skill's checker, which applies the plugin's one\nresolution order (the `MEDIA_MGMT_*` env var first, then config.json at\n`$MEDIA_MGMT_CONFIG_PATH`, default `~\u002F.config\u002Fmedia-management\u002Fconfig.json`):\n\n```bash\nbash ..\u002Fsetup\u002Fscripts\u002Fcheck-config.sh\n```\n\nThis skill needs `downloads`, plus `processed` if it is set (where archived ZIPs\ngo; default `\u003Cdownloads>\u002Fprocessed`): use each item's `value` from the JSON. If\na key it needs is `missing`, stop and run the `setup` skill rather than guessing\na path. When the user names a folder explicitly, use that folder.\n\nScripts are in `scripts\u002F` relative to this skill directory.\n\n## Scripts\n\n- **`find-release-artifacts.sh \u003Cdownloads_folder> \u003Crelease_name> [--zip \u003Cpath>]... [--folder \u003Cpath>]...`** — Find all ZIPs, loose audio files, and extraction folders related to a release. Run `--help` for details.\n- **`cleanup-release.sh \u003Cdownloads_folder> \u003Crelease_name> [--zip \u003Cpath>]... [--folder \u003Cpath>]...`** — Move ZIPs and loose audio files to processed\u002F, remove extraction folders. Run `--help` for details.\n\n## Argument format\n\n```\n\u003CArtist - Album> [--zip \u003Cpath>]... [--folder \u003Cpath>]...\n```\n\n`release_name` (`\u003CArtist - Album>`) drives glob matching against `$DOWNLOADS` — use this for\nad hoc\u002Fmanual cleanup requests where you don't already have exact paths.\n\n**Prefer `--zip`\u002F`--folder` with exact paths whenever the caller already knows them** — most\nnotably `process-album`, which tracked the original ZIP\u002Ffile paths (Step 1) and extraction\nfolder paths (Steps 2 and 11) all along. Glob matching by name alone is unreliable: a vendor\nZIP's filename frequently does NOT match the clean release name used for the extraction folder\n— e.g. a Various Artists compilation ZIP named after all 10 contributing artists\n(`Artist One- Artist Two- ... - keep it deep (pre-order).zip`), extracted into a folder simply called\n`keep it deep`. Matching on `\"keep it deep\"` alone finds the folder but misses the ZIP (and vice\nversa for the vendor name). Passing the exact paths sidesteps this entirely. `release_name` can\nbe `\"\"` in that case — it's used only as a display label.\n\nExplicit and glob-matched results are merged and deduplicated by path, so it's safe to pass both.\n\n## Workflow\n\n### Step 1: Find items to clean\n\nRun the find script to locate all related artifacts. If exact paths are known, pass them\nexplicitly instead of relying on `$RELEASE_NAME` alone:\n```bash\nbash scripts\u002Ffind-release-artifacts.sh \"$DOWNLOADS\" \"$RELEASE_NAME\" \\\n  --zip \"$MP3_SOURCE_PATH\" --zip \"$WAV_SOURCE_PATH\" \\\n  --folder \"$EXTRACTION_FOLDER\" --folder \"$WAV_EXTRACTION_FOLDER\"\n```\n\nParse the JSON output and present to user:\n\n> **Files to archive:**\n> - `Artist - Album.zip` → move to `processed\u002F`\n> - `Artist - Album-2.zip` → move to `processed\u002F`\n> - `Artist - Track.mp3` → move to `processed\u002F` (loose single-track file)\n>\n> **Folders to remove:**\n> - `Artist - Album\u002F`\n> - `Artist - Album-wav\u002F`\n\nOnly items whose name is the release name plus a store or browser duplicate\nsuffix (`-2`, `-wav`, ` (1)`, ` (pre-order)`) match. Anything else that merely\nstarts with the same words, such as `Artist - Album (Remixes).zip`, is a\ndifferent release: leave it alone, and mention it only so the user knows it was\nnot touched.\n\nIf nothing is found, report this and exit without moving or deleting anything.\nIf nothing matches but similarly named items exist (the user said\n`Artist - Album` and Downloads holds `Artist - Album EP.zip`), list them and\nask which release they meant. Never clean up a near match on your own, even\nwhen the request says to go ahead.\n\n### Step 2: Ask for confirmation\n\n> **Shall I proceed with cleanup?** (This will move ZIPs\u002Faudio files to processed\u002F and delete extraction folders)\n\n**DO NOT PROCEED without explicit user confirmation.** Explicit means the user\nsaid yes to this cleanup: in a reply, or in the request itself when it plainly\nauthorizes it without a further check (\"go ahead, no need to confirm\"). A\nrequest that only asks you to tidy up is not confirmation: present the list and\nstop.\n\n### Step 3: Execute cleanup\n\nRun the cleanup script, passing the same `--zip`\u002F`--folder` arguments used in Step 1 if any:\n```bash\nbash scripts\u002Fcleanup-release.sh \"$DOWNLOADS\" \"$RELEASE_NAME\" \\\n  --zip \"$MP3_SOURCE_PATH\" --zip \"$WAV_SOURCE_PATH\" \\\n  --folder \"$EXTRACTION_FOLDER\" --folder \"$WAV_EXTRACTION_FOLDER\"\n```\n\nThe script moves ZIPs and loose audio files to `processed\u002F`, removes extraction folders, and outputs JSON with results.\n\n### Step 4: Report\n\nPresent the JSON results: how many ZIPs\u002Faudio files archived and folders removed.\n","## Setup\n\nResolve paths with the setup skill's checker, which applies the plugin's one\nresolution order (the `MEDIA_MGMT_*` env var first, then config.json at\n`$MEDIA_MGMT_CONFIG_PATH`, default `~\u002F.config\u002Fmedia-management\u002Fconfig.json`):\n\n```bash\nbash ..\u002Fsetup\u002Fscripts\u002Fcheck-config.sh\n```\n\nThis skill needs `downloads`, plus `processed` if it is set (where archived ZIPs\ngo; default `\u003Cdownloads>\u002Fprocessed`): use each item's `value` from the JSON. If\na key it needs is `missing`, stop and run the `setup` skill rather than guessing\na path. When the user names a folder explicitly, use that folder.\n\nScripts are in `scripts\u002F` relative to this skill directory.\n\n## Scripts\n\n- **`find-release-artifacts.sh \u003Cdownloads_folder> \u003Crelease_name> [--zip \u003Cpath>]... [--folder \u003Cpath>]...`** — Find all ZIPs, loose audio files, and extraction folders related to a release. Run `--help` for details.\n- **`cleanup-release.sh \u003Cdownloads_folder> \u003Crelease_name> [--zip \u003Cpath>]... [--folder \u003Cpath>]...`** — Move ZIPs and loose audio files to processed\u002F, remove extraction folders. Run `--help` for details.\n\n## Argument format\n\n```\n\u003CArtist - Album> [--zip \u003Cpath>]... [--folder \u003Cpath>]...\n```\n\n`release_name` (`\u003CArtist - Album>`) drives glob matching against `$DOWNLOADS` — use this for\nad hoc\u002Fmanual cleanup requests where you don't already have exact paths.\n\n**Prefer `--zip`\u002F`--folder` with exact paths whenever the caller already knows them** — most\nnotably `process-album`, which tracked the original ZIP\u002Ffile paths (Step 1) and extraction\nfolder paths (Steps 2 and 11) all along. Glob matching by name alone is unreliable: a vendor\nZIP's filename frequently does NOT match the clean release name used for the extraction folder\n— e.g. a Various Artists compilation ZIP named after all 10 contributing artists\n(`Artist One- Artist Two- ... - keep it deep (pre-order).zip`), extracted into a folder simply called\n`keep it deep`. Matching on `\"keep it deep\"` alone finds the folder but misses the ZIP (and vice\nversa for the vendor name). Passing the exact paths sidesteps this entirely. `release_name` can\nbe `\"\"` in that case — it's used only as a display label.\n\nExplicit and glob-matched results are merged and deduplicated by path, so it's safe to pass both.\n\n## Workflow\n\n### Step 1: Find items to clean\n\nRun the find script to locate all related artifacts. If exact paths are known, pass them\nexplicitly instead of relying on `$RELEASE_NAME` alone:\n```bash\nbash scripts\u002Ffind-release-artifacts.sh \"$DOWNLOADS\" \"$RELEASE_NAME\" \\\n  --zip \"$MP3_SOURCE_PATH\" --zip \"$WAV_SOURCE_PATH\" \\\n  --folder \"$EXTRACTION_FOLDER\" --folder \"$WAV_EXTRACTION_FOLDER\"\n```\n\nParse the JSON output and present to user:\n\n> **Files to archive:**\n> - `Artist - Album.zip` → move to `processed\u002F`\n> - `Artist - Album-2.zip` → move to `processed\u002F`\n> - `Artist - Track.mp3` → move to `processed\u002F` (loose single-track file)\n>\n> **Folders to remove:**\n> - `Artist - Album\u002F`\n> - `Artist - Album-wav\u002F`\n\nOnly items whose name is the release name plus a store or browser duplicate\nsuffix (`-2`, `-wav`, ` (1)`, ` (pre-order)`) match. Anything else that merely\nstarts with the same words, such as `Artist - Album (Remixes).zip`, is a\ndifferent release: leave it alone, and mention it only so the user knows it was\nnot touched.\n\nIf nothing is found, report this and exit without moving or deleting anything.\nIf nothing matches but similarly named items exist (the user said\n`Artist - Album` and Downloads holds `Artist - Album EP.zip`), list them and\nask which release they meant. Never clean up a near match on your own, even\nwhen the request says to go ahead.\n\n### Step 2: Ask for confirmation\n\n> **Shall I proceed with cleanup?** (This will move ZIPs\u002Faudio files to processed\u002F and delete extraction folders)\n\n**DO NOT PROCEED without explicit user confirmation.** Explicit means the user\nsaid yes to this cleanup: in a reply, or in the request itself when it plainly\nauthorizes it without a further check (\"go ahead, no need to confirm\"). A\nrequest that only asks you to tidy up is not confirmation: present the list and\nstop.\n\n### Step 3: Execute cleanup\n\nRun the cleanup script, passing the same `--zip`\u002F`--folder` arguments used in Step 1 if any:\n```bash\nbash scripts\u002Fcleanup-release.sh \"$DOWNLOADS\" \"$RELEASE_NAME\" \\\n  --zip \"$MP3_SOURCE_PATH\" --zip \"$WAV_SOURCE_PATH\" \\\n  --folder \"$EXTRACTION_FOLDER\" --folder \"$WAV_EXTRACTION_FOLDER\"\n```\n\nThe script moves ZIPs and loose audio files to `processed\u002F`, removes extraction folders, and outputs JSON with results.\n\n### Step 4: Report\n\nPresent the JSON results: how many ZIPs\u002Faudio files archived and folders removed.\n",{"name":5,"description":7,"allowed-tools":46},"Bash Read","develop","5f79513fe27520bf03af784e8df568a04931c48d","plugins\u002Fmedia-management\u002Fskills\u002Fcleanup",0,"https:\u002F\u002Fgithub.com\u002Feyelock\u002Fassistants","https:\u002F\u002Feyelock.github.io\u002Fassistants\u002F","https:\u002F\u002Fgithub.com\u002Feyelock","http:\u002F\u002Fwww.eyelock.net\u002Fblog","2026-11-14 00:30:01",{"source":8,"skillName":5,"commands":57,"prompt":67,"zipAvailable":68},[58,61,64],{"tool":59,"command":60},"npx","npx skills add eyelock\u002Fassistants --skill cleanup",{"tool":62,"command":63},"bunx","bunx skills add eyelock\u002Fassistants --skill cleanup",{"tool":65,"command":66},"pnpm","pnpm dlx skills add eyelock\u002Fassistants --skill cleanup","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Feyelock\u002Fassistants\u002Fblob\u002Fdevelop\u002Fplugins\u002Fmedia-management\u002Fskills\u002Fcleanup\u002FSKILL.md",true,[70,76,80,86],{"path":71,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":74,"sourceHtmlUrl":75},"evals\u002Feval_queries.json","REFERENCE","参考文档",1377,"https:\u002F\u002Fgithub.com\u002Feyelock\u002Fassistants\u002Fblob\u002Fdevelop\u002Fplugins\u002Fmedia-management\u002Fskills\u002Fcleanup\u002Fevals\u002Feval_queries.json",{"path":77,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":78,"sourceHtmlUrl":79},"evals\u002Fevals.json",5021,"https:\u002F\u002Fgithub.com\u002Feyelock\u002Fassistants\u002Fblob\u002Fdevelop\u002Fplugins\u002Fmedia-management\u002Fskills\u002Fcleanup\u002Fevals\u002Fevals.json",{"path":81,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":84,"sourceHtmlUrl":85},"scripts\u002Fcleanup-release.sh","SCRIPT","脚本",7595,"https:\u002F\u002Fgithub.com\u002Feyelock\u002Fassistants\u002Fblob\u002Fdevelop\u002Fplugins\u002Fmedia-management\u002Fskills\u002Fcleanup\u002Fscripts\u002Fcleanup-release.sh",{"path":87,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":88,"sourceHtmlUrl":89},"scripts\u002Ffind-release-artifacts.sh",8126,"https:\u002F\u002Fgithub.com\u002Feyelock\u002Fassistants\u002Fblob\u002Fdevelop\u002Fplugins\u002Fmedia-management\u002Fskills\u002Fcleanup\u002Fscripts\u002Ffind-release-artifacts.sh",[91,97,120,137,149,162],{"skillNo":92,"name":93,"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":94,"categories":95,"keywords":96,"publishedAt":41},"01M6H46CHAJFE20J3Q118P9PW9","doctor","https:\u002F\u002Fgithub.com\u002Feyelock\u002Fassistants\u002Fblob\u002Fdevelop\u002Fplugins\u002Fwheelhouse\u002Fskills\u002Fdoctor\u002FSKILL.md",[],[93],{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":103,"publishedAt":41},"01M6H45X8QJZTQAPN56WZ8V111","add-seat","Add a named seat to a Wheelhouse - a crew member, a standing role (such as a dispatcher) or a worker - as a ynh harness with its charter, standing orders and only the tools its job needs, named from the Wheelhouse's roster. Use when asked to add, create or set up a seat, role, worker or agent in a Wheelhouse (a release manager, a PR watcher, a dispatcher, a designer, more workers), or to give a role a name, or to start on a Wheelhouse's team (its starter team), one role at a time. Also use to trial, make official or drop a seat.","https:\u002F\u002Fgithub.com\u002Feyelock\u002Fassistants\u002Fblob\u002Fdevelop\u002Fplugins\u002Fwheelhouse\u002Fskills\u002Fadd-seat\u002FSKILL.md",[],[104,105,106,107,108,19,109,110,111,25,112,113,114,20,115,116,30,117,118,119],"add","add seat","harness","SET","roster","release manager","workers","team","create","watcher","starter","more","worker","only","pr","as",{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":126,"publishedAt":41},"01M6H4BWCVR2YJVP8RW878NYDP","voice","How voices work - what a voice skill contains, how to write a new one, and how several voices compose into one reply. Use whenever drafting a reply in a named voice, or when asked to create or change a voice.","https:\u002F\u002Fgithub.com\u002Feyelock\u002Fassistants\u002Fblob\u002Fdevelop\u002Fskills\u002Fvoice\u002Fskills\u002Fvoice\u002FSKILL.md",[],[122,112,127,128,129,130,19,131,132,133,134,135,20,136],"how to","work","change","voice skill","compose","how","write","reply","new","drafting",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":143,"publishedAt":41},"01M6H4BRVA87C6T495HCFNDQ7Z","voice-warm","A friendly voice that acknowledges the person and their effort. Compose with direct for friendly but brief.","https:\u002F\u002Fgithub.com\u002Feyelock\u002Fassistants\u002Fblob\u002Fdevelop\u002Fskills\u002Fvoice\u002Fskills\u002Fvoice-warm\u002FSKILL.md",[],[144,122,145,25,146,131,147,23,148],"voice warm","person","brief","direct","but",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":155,"publishedAt":41},"01M6H4BNFQ64X65YZDM9QMD61B","voice-formal","A careful, complete voice for people outside the team - customers, partners, senior stakeholders.","https:\u002F\u002Fgithub.com\u002Feyelock\u002Fassistants\u002Fblob\u002Fdevelop\u002Fskills\u002Fvoice\u002Fskills\u002Fvoice-formal\u002FSKILL.md",[],[156,122,111,157,158,159,160,161,23],"voice formal","complete","senior","careful","partners","people",{"skillNo":163,"name":164,"nameZh":6,"description":165,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":168,"publishedAt":41},"01M6H4BHXE6KSNBY92TBFZY7QD","voice-direct","A plain, brief voice that leads with the answer. The default when no voice is named.","https:\u002F\u002Fgithub.com\u002Feyelock\u002Fassistants\u002Fblob\u002Fdevelop\u002Fskills\u002Fvoice\u002Fskills\u002Fvoice-direct\u002FSKILL.md",[],[169,147,122,25,146,170,171,172,20,173],"voice direct","leads","answer","default","plain"]