[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-automattic-refresh-cache":3,"mdc-7uog9-key":32,"related-repo-automattic-refresh-cache":1192,"related-org-automattic-refresh-cache":1281},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":22,"topics":26,"repo":27,"sourceUrl":30,"mdContent":31},"refresh-cache","clear and rebuild local data cache","Blow away the local data cache and rebuild it. Use when the user asks to refresh the cache, rebuild the cache, clear cached data, start clean, recover from a bad pull, or says reports are returning stale or weird-looking numbers. Leaves config alone. Offers the lighter update-cache flow as an alternative before deleting anything.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"automattic","Automattic","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fautomattic.png",[12,16,19],{"name":13,"slug":14,"type":15},"Performance","performance","tag",{"name":17,"slug":18,"type":15},"Caching","caching",{"name":20,"slug":21,"type":15},"Debugging","debugging",1,"https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fagentic-analytics","2026-07-24T05:42:07.032844",null,[],{"repoUrl":23,"stars":22,"forks":22,"topics":28,"description":29},[],"Claude Code plugin for analytics across Parse.ly, GA, and your own data.","https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fagentic-analytics\u002Ftree\u002FHEAD\u002Fskills\u002Frefresh-cache","---\nname: refresh-cache\ndescription: Blow away the local data cache and rebuild it. Use when the user asks to refresh the cache, rebuild the cache, clear cached data, start clean, recover from a bad pull, or says reports are returning stale or weird-looking numbers. Leaves config alone. Offers the lighter update-cache flow as an alternative before deleting anything.\n---\n\n# Refresh the data cache\n\nClears the configured customer's local data lake, then re-pulls a fresh 60-day window so the next report runs against clean data. Before deleting anything, this flow always offers the lighter update-cache alternative – most people who reach for \"refresh\" actually just want the newest data, not a full wipe.\n\nTwo steps once a full refresh is confirmed:\n\n1. **Delete** (`refresh_cache.py`) is stdlib-only and offline-safe – it never touches the network, so it can't fail on auth lapses, network errors, or S3 hiccups. It clears the lake root and the catalog; it will exit non-zero if `bucket.json` is missing (nothing to scope the deletion to); that's the only failure mode.\n2. **Re-pull** (`pull_parsely_dpl.py`) requires fresh AWS SSO. Splitting the steps means a stale auth at re-pull time doesn't leave the user in a half-state – the lake is cleared either way, and the next report run (or a retry of this flow) will fill it back in. The pull also rebuilds the `dpl_events` catalog view.\n\nIf config itself looks broken (wrong bucket, missing profile), use the clear-configs skill instead and re-run the init flow.\n\n## Output discipline\n\nThis is housekeeping, with one exception: because deletion is destructive and irreversible, always confirm before running it (see step 2 below). Past that checkpoint, be terse – announce, run, stop. Don't narrate the script output line-by-line – the scripts print their own progress.\n\n## Steps\n\n0. **Resolve the plugin root.** Every bash snippet below assumes `$plugin_root` is set in that shell invocation; re-run this line whenever you start a new shell:\n\n   ```bash\n   plugin_root=\"${CLAUDE_PLUGIN_ROOT:-${CURSOR_PLUGIN_ROOT:-\u003Cplugin-root>}}\"\n   plugin_python=\"${AGENTIC_ANALYTICS_VENV:-${AGENTIC_ANALYTICS_DATA_DIR:-$HOME\u002F.local\u002Fshare\u002Fagentic-analytics}\u002Fvenv}\u002Fbin\u002Fpython\"\n   [ -x \"$plugin_python\" ] || plugin_python=\"python3\"\n   ```\n\n   `\u003Cplugin-root>` is the plugin's install directory – the directory two levels above this SKILL.md file. In a dev checkout of the source repo that's `plugin\u002F`. `$plugin_python` is the plugin's isolated venv (created by the init flow at `$AGENTIC_ANALYTICS_DATA_DIR\u002Fvenv`, default `~\u002F.local\u002Fshare\u002Fagentic-analytics\u002Fvenv`); it falls back to `python3` if the venv doesn't exist yet.\n\n1. **Load bucket config.** Read `${XDG_CONFIG_HOME:-~\u002F.config}\u002Fagentic-analytics\u002Fbucket.json`. It contains:\n\n   - `bucket` – S3 bucket holding the customer's DPL events.\n   - `profile` – AWS profile to authenticate with.\n   - `cache_dir` – a slug identifying the customer's data (e.g. `acme`).\n\n   If the file is missing, tell the user to run the init flow first (`\u002Fagentic-analytics:init` on harnesses with slash commands, or \"set up agentic analytics\" in chat) and stop. Do not guess values.\n\n2. **Offer the lighter alternative, every time.** Before deleting anything, explain the trade-off and ask which the user wants. Always ask – don't skip this because the user's phrasing sounds decisive (\"wipe it\", \"start over\"); the cost of asking is one message, the cost of an unnecessary multi-gigabyte wipe-and-re-pull is real. Say something like:\n\n   > Refreshing the cache for '`\u003Ccache_dir>`' deletes **everything** currently cached and re-pulls the full 60-day window from S3 – can take a while. If you just want the newest data without losing what's already cached, `update-cache` does that instead and is much faster.\n   >\n   > Full refresh (delete + re-pull) – use this for stale\u002Fcorrupt data, schema drift, or a bad prior pull. Or: update only (no deletion, just top up).\n\n   - If the user picks **update only**: follow the update-cache skill's steps in this same turn (announce, then run `pull_parsely_dpl.py` incrementally with no delete step, then report) using the `bucket`\u002F`profile`\u002F`cache_dir` already loaded in step 1. Stop here – do not continue to step 3.\n   - If the user picks **full refresh**: continue to step 3.\n\n3. **Announce.** Output verbatim:\n\n   > Refreshing the local cache. Config (bucket.json, AWS profile) will be left alone.\n\n4. **Delete the cache.** Runs the deletion script. Reports which dirs it cleared and the bytes freed, or `(nothing to clear)`:\n\n   ```bash\n   \"$plugin_python\" \"$plugin_root\u002Fscripts\u002Frefresh_cache.py\"\n   ```\n\n5. **Re-pull a fresh 60 days.** Same window the staircase report targets. `pull_parsely_dpl.py` is incremental and idempotent; after a wipe it pulls the full window once and also rebuilds the `dpl_events` catalog view.\n\n   ```bash\n   read target_start target_end \u003C \u003C(python3 -c \"\n   from datetime import date, timedelta\n   start = date.today() - timedelta(days=60)\n   end = date.today() - timedelta(days=1)\n   print(start.strftime('%Y-%m-%d'), end.strftime('%Y-%m-%d'))\n   \")\n   \"$plugin_python\" \"$plugin_root\u002Fscripts\u002Fdb\u002Fpull_parsely_dpl.py\" \\\n     --bucket \u003Cbucket> [--site \u003Csite>] \\\n     --start \"$target_start\" --end \"$target_end\" \\\n     [--profile \u003Cprofile>]\n   ```\n\n   Substitute `\u003Cbucket>` and `\u003Cprofile>` with the values held from step 1. Omit `--site` to refresh all sites; pass `--site \u003Csite>` to limit the pull to one site. Do NOT add `|| true` here – unlike the report path, a failed re-pull is the headline result of this flow; surface it.\n\n6. **Report done.** One short line: \"Cache rebuilt. Next report run uses fresh data.\"\n\n   If the re-pull failed (auth lapse, S3 error, no events for the window), say so plainly and tell the user the lake is now empty – the next report run will try to pull again, or they can re-run this flow once auth is fresh.\n\n## Notes\n\n- Only the **currently configured** customer's DPL data is affected. The lake root holds all sources\u002Fsites pooled under `$AGENTIC_ANALYTICS_DATA_DIR` (default `~\u002F.local\u002Fshare\u002Fagentic-analytics`); deletion is scoped to the `dpl\u002Fevents\u002F` subtree and the catalog, so other data you may later land in the lake is untouched. To work with a different customer, switch `bucket.json` first.\n- Deletion is **not** scoped to a single site even when the re-pull afterward is – `refresh_cache.py` always clears the whole `dpl\u002Fevents\u002F` subtree (every site\u002Fapikey under the configured bucket). Passing `--site \u003Csite>` to step 5 only limits what gets re-pulled, not what got deleted. If you only want to top up or repair one site's data without touching the rest, use update-cache instead – it never deletes.\n- The DuckDB catalog (`catalog.duckdb` and its `.wal` sidecar) is cleared too. It's derived state any report can regenerate by re-running `pull_parsely_dpl.py`.\n- **Legacy gz cache sweep:** if you're upgrading from a pre-lake version, this flow also clears the old gz-JSON cache at `~\u002F.cache\u002Fagentic-analytics\u002Fdpl\u002F\u003Ccache_dir>\u002F` and the `duckdb-tmp\u002F` working dir (scoped to your `cache_dir`). The lake code never reads them; sweeping just reclaims the orphaned disk. No-op for fresh installs.\n",{"data":33,"body":34},{"name":4,"description":6},{"type":35,"children":36},"root",[37,46,52,57,115,120,127,132,138,1041,1047,1186],{"type":38,"tag":39,"props":40,"children":42},"element","h1",{"id":41},"refresh-the-data-cache",[43],{"type":44,"value":45},"text","Refresh the data cache",{"type":38,"tag":47,"props":48,"children":49},"p",{},[50],{"type":44,"value":51},"Clears the configured customer's local data lake, then re-pulls a fresh 60-day window so the next report runs against clean data. Before deleting anything, this flow always offers the lighter update-cache alternative – most people who reach for \"refresh\" actually just want the newest data, not a full wipe.",{"type":38,"tag":47,"props":53,"children":54},{},[55],{"type":44,"value":56},"Two steps once a full refresh is confirmed:",{"type":38,"tag":58,"props":59,"children":60},"ol",{},[61,90],{"type":38,"tag":62,"props":63,"children":64},"li",{},[65,71,73,80,82,88],{"type":38,"tag":66,"props":67,"children":68},"strong",{},[69],{"type":44,"value":70},"Delete",{"type":44,"value":72}," (",{"type":38,"tag":74,"props":75,"children":77},"code",{"className":76},[],[78],{"type":44,"value":79},"refresh_cache.py",{"type":44,"value":81},") is stdlib-only and offline-safe – it never touches the network, so it can't fail on auth lapses, network errors, or S3 hiccups. It clears the lake root and the catalog; it will exit non-zero if ",{"type":38,"tag":74,"props":83,"children":85},{"className":84},[],[86],{"type":44,"value":87},"bucket.json",{"type":44,"value":89}," is missing (nothing to scope the deletion to); that's the only failure mode.",{"type":38,"tag":62,"props":91,"children":92},{},[93,98,99,105,107,113],{"type":38,"tag":66,"props":94,"children":95},{},[96],{"type":44,"value":97},"Re-pull",{"type":44,"value":72},{"type":38,"tag":74,"props":100,"children":102},{"className":101},[],[103],{"type":44,"value":104},"pull_parsely_dpl.py",{"type":44,"value":106},") requires fresh AWS SSO. Splitting the steps means a stale auth at re-pull time doesn't leave the user in a half-state – the lake is cleared either way, and the next report run (or a retry of this flow) will fill it back in. The pull also rebuilds the ",{"type":38,"tag":74,"props":108,"children":110},{"className":109},[],[111],{"type":44,"value":112},"dpl_events",{"type":44,"value":114}," catalog view.",{"type":38,"tag":47,"props":116,"children":117},{},[118],{"type":44,"value":119},"If config itself looks broken (wrong bucket, missing profile), use the clear-configs skill instead and re-run the init flow.",{"type":38,"tag":121,"props":122,"children":124},"h2",{"id":123},"output-discipline",[125],{"type":44,"value":126},"Output discipline",{"type":38,"tag":47,"props":128,"children":129},{},[130],{"type":44,"value":131},"This is housekeeping, with one exception: because deletion is destructive and irreversible, always confirm before running it (see step 2 below). Past that checkpoint, be terse – announce, run, stop. Don't narrate the script output line-by-line – the scripts print their own progress.",{"type":38,"tag":121,"props":133,"children":135},{"id":134},"steps",[136],{"type":44,"value":137},"Steps",{"type":38,"tag":58,"props":139,"children":141},{"start":140},0,[142,443,519,618,636,694,1026],{"type":38,"tag":62,"props":143,"children":144},{},[145,150,152,158,160,393,397,403,405,411,413,418,420,426,428,434,436,441],{"type":38,"tag":66,"props":146,"children":147},{},[148],{"type":44,"value":149},"Resolve the plugin root.",{"type":44,"value":151}," Every bash snippet below assumes ",{"type":38,"tag":74,"props":153,"children":155},{"className":154},[],[156],{"type":44,"value":157},"$plugin_root",{"type":44,"value":159}," is set in that shell invocation; re-run this line whenever you start a new shell:",{"type":38,"tag":161,"props":162,"children":167},"pre",{"className":163,"code":164,"language":165,"meta":166,"style":166},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","plugin_root=\"${CLAUDE_PLUGIN_ROOT:-${CURSOR_PLUGIN_ROOT:-\u003Cplugin-root>}}\"\nplugin_python=\"${AGENTIC_ANALYTICS_VENV:-${AGENTIC_ANALYTICS_DATA_DIR:-$HOME\u002F.local\u002Fshare\u002Fagentic-analytics}\u002Fvenv}\u002Fbin\u002Fpython\"\n[ -x \"$plugin_python\" ] || plugin_python=\"python3\"\n","bash","",[168],{"type":38,"tag":74,"props":169,"children":170},{"__ignoreMap":166},[171,234,332],{"type":38,"tag":172,"props":173,"children":175},"span",{"class":174,"line":22},"line",[176,182,188,193,198,203,208,213,219,224,229],{"type":38,"tag":172,"props":177,"children":179},{"style":178},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[180],{"type":44,"value":181},"plugin_root",{"type":38,"tag":172,"props":183,"children":185},{"style":184},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[186],{"type":44,"value":187},"=",{"type":38,"tag":172,"props":189,"children":190},{"style":184},[191],{"type":44,"value":192},"\"${",{"type":38,"tag":172,"props":194,"children":195},{"style":178},[196],{"type":44,"value":197},"CLAUDE_PLUGIN_ROOT",{"type":38,"tag":172,"props":199,"children":200},{"style":184},[201],{"type":44,"value":202},":-${",{"type":38,"tag":172,"props":204,"children":205},{"style":178},[206],{"type":44,"value":207},"CURSOR_PLUGIN_ROOT",{"type":38,"tag":172,"props":209,"children":210},{"style":184},[211],{"type":44,"value":212},":-",{"type":38,"tag":172,"props":214,"children":216},{"style":215},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[217],{"type":44,"value":218},"\u003C",{"type":38,"tag":172,"props":220,"children":221},{"style":178},[222],{"type":44,"value":223},"plugin-root",{"type":38,"tag":172,"props":225,"children":226},{"style":215},[227],{"type":44,"value":228},">",{"type":38,"tag":172,"props":230,"children":231},{"style":184},[232],{"type":44,"value":233},"}}\"\n",{"type":38,"tag":172,"props":235,"children":237},{"class":174,"line":236},2,[238,243,247,251,256,260,265,269,274,279,284,289,293,298,302,307,312,317,322,327],{"type":38,"tag":172,"props":239,"children":240},{"style":178},[241],{"type":44,"value":242},"plugin_python",{"type":38,"tag":172,"props":244,"children":245},{"style":184},[246],{"type":44,"value":187},{"type":38,"tag":172,"props":248,"children":249},{"style":184},[250],{"type":44,"value":192},{"type":38,"tag":172,"props":252,"children":253},{"style":178},[254],{"type":44,"value":255},"AGENTIC_ANALYTICS_VENV",{"type":38,"tag":172,"props":257,"children":258},{"style":184},[259],{"type":44,"value":202},{"type":38,"tag":172,"props":261,"children":262},{"style":178},[263],{"type":44,"value":264},"AGENTIC_ANALYTICS_DATA_DIR",{"type":38,"tag":172,"props":266,"children":267},{"style":184},[268],{"type":44,"value":212},{"type":38,"tag":172,"props":270,"children":271},{"style":178},[272],{"type":44,"value":273},"$HOME",{"type":38,"tag":172,"props":275,"children":276},{"style":184},[277],{"type":44,"value":278},"\u002F",{"type":38,"tag":172,"props":280,"children":281},{"style":215},[282],{"type":44,"value":283},".",{"type":38,"tag":172,"props":285,"children":286},{"style":178},[287],{"type":44,"value":288},"local",{"type":38,"tag":172,"props":290,"children":291},{"style":184},[292],{"type":44,"value":278},{"type":38,"tag":172,"props":294,"children":295},{"style":178},[296],{"type":44,"value":297},"share",{"type":38,"tag":172,"props":299,"children":300},{"style":184},[301],{"type":44,"value":278},{"type":38,"tag":172,"props":303,"children":304},{"style":178},[305],{"type":44,"value":306},"agentic-analytics",{"type":38,"tag":172,"props":308,"children":309},{"style":184},[310],{"type":44,"value":311},"}\u002F",{"type":38,"tag":172,"props":313,"children":314},{"style":178},[315],{"type":44,"value":316},"venv",{"type":38,"tag":172,"props":318,"children":319},{"style":184},[320],{"type":44,"value":321},"}",{"type":38,"tag":172,"props":323,"children":324},{"style":215},[325],{"type":44,"value":326},"\u002Fbin\u002Fpython",{"type":38,"tag":172,"props":328,"children":329},{"style":184},[330],{"type":44,"value":331},"\"\n",{"type":38,"tag":172,"props":333,"children":335},{"class":174,"line":334},3,[336,341,346,351,356,361,366,371,376,380,384,389],{"type":38,"tag":172,"props":337,"children":338},{"style":184},[339],{"type":44,"value":340},"[",{"type":38,"tag":172,"props":342,"children":343},{"style":184},[344],{"type":44,"value":345}," -x",{"type":38,"tag":172,"props":347,"children":348},{"style":184},[349],{"type":44,"value":350}," \"",{"type":38,"tag":172,"props":352,"children":353},{"style":178},[354],{"type":44,"value":355},"$plugin_python",{"type":38,"tag":172,"props":357,"children":358},{"style":184},[359],{"type":44,"value":360},"\"",{"type":38,"tag":172,"props":362,"children":363},{"style":184},[364],{"type":44,"value":365}," ]",{"type":38,"tag":172,"props":367,"children":368},{"style":184},[369],{"type":44,"value":370}," ||",{"type":38,"tag":172,"props":372,"children":373},{"style":178},[374],{"type":44,"value":375}," plugin_python",{"type":38,"tag":172,"props":377,"children":378},{"style":184},[379],{"type":44,"value":187},{"type":38,"tag":172,"props":381,"children":382},{"style":184},[383],{"type":44,"value":360},{"type":38,"tag":172,"props":385,"children":386},{"style":215},[387],{"type":44,"value":388},"python3",{"type":38,"tag":172,"props":390,"children":391},{"style":184},[392],{"type":44,"value":331},{"type":38,"tag":394,"props":395,"children":396},"br",{},[],{"type":38,"tag":74,"props":398,"children":400},{"className":399},[],[401],{"type":44,"value":402},"\u003Cplugin-root>",{"type":44,"value":404}," is the plugin's install directory – the directory two levels above this SKILL.md file. In a dev checkout of the source repo that's ",{"type":38,"tag":74,"props":406,"children":408},{"className":407},[],[409],{"type":44,"value":410},"plugin\u002F",{"type":44,"value":412},". ",{"type":38,"tag":74,"props":414,"children":416},{"className":415},[],[417],{"type":44,"value":355},{"type":44,"value":419}," is the plugin's isolated venv (created by the init flow at ",{"type":38,"tag":74,"props":421,"children":423},{"className":422},[],[424],{"type":44,"value":425},"$AGENTIC_ANALYTICS_DATA_DIR\u002Fvenv",{"type":44,"value":427},", default ",{"type":38,"tag":74,"props":429,"children":431},{"className":430},[],[432],{"type":44,"value":433},"~\u002F.local\u002Fshare\u002Fagentic-analytics\u002Fvenv",{"type":44,"value":435},"); it falls back to ",{"type":38,"tag":74,"props":437,"children":439},{"className":438},[],[440],{"type":44,"value":388},{"type":44,"value":442}," if the venv doesn't exist yet.",{"type":38,"tag":62,"props":444,"children":445},{},[446,451,453,459,461,506,509,511,517],{"type":38,"tag":66,"props":447,"children":448},{},[449],{"type":44,"value":450},"Load bucket config.",{"type":44,"value":452}," Read ",{"type":38,"tag":74,"props":454,"children":456},{"className":455},[],[457],{"type":44,"value":458},"${XDG_CONFIG_HOME:-~\u002F.config}\u002Fagentic-analytics\u002Fbucket.json",{"type":44,"value":460},". It contains:",{"type":38,"tag":462,"props":463,"children":464},"ul",{},[465,476,487],{"type":38,"tag":62,"props":466,"children":467},{},[468,474],{"type":38,"tag":74,"props":469,"children":471},{"className":470},[],[472],{"type":44,"value":473},"bucket",{"type":44,"value":475}," – S3 bucket holding the customer's DPL events.",{"type":38,"tag":62,"props":477,"children":478},{},[479,485],{"type":38,"tag":74,"props":480,"children":482},{"className":481},[],[483],{"type":44,"value":484},"profile",{"type":44,"value":486}," – AWS profile to authenticate with.",{"type":38,"tag":62,"props":488,"children":489},{},[490,496,498,504],{"type":38,"tag":74,"props":491,"children":493},{"className":492},[],[494],{"type":44,"value":495},"cache_dir",{"type":44,"value":497}," – a slug identifying the customer's data (e.g. ",{"type":38,"tag":74,"props":499,"children":501},{"className":500},[],[502],{"type":44,"value":503},"acme",{"type":44,"value":505},").",{"type":38,"tag":394,"props":507,"children":508},{},[],{"type":44,"value":510},"If the file is missing, tell the user to run the init flow first (",{"type":38,"tag":74,"props":512,"children":514},{"className":513},[],[515],{"type":44,"value":516},"\u002Fagentic-analytics:init",{"type":44,"value":518}," on harnesses with slash commands, or \"set up agentic analytics\" in chat) and stop. Do not guess values.",{"type":38,"tag":62,"props":520,"children":521},{},[522,527,529,566],{"type":38,"tag":66,"props":523,"children":524},{},[525],{"type":44,"value":526},"Offer the lighter alternative, every time.",{"type":44,"value":528}," Before deleting anything, explain the trade-off and ask which the user wants. Always ask – don't skip this because the user's phrasing sounds decisive (\"wipe it\", \"start over\"); the cost of asking is one message, the cost of an unnecessary multi-gigabyte wipe-and-re-pull is real. Say something like:",{"type":38,"tag":530,"props":531,"children":532},"blockquote",{},[533,561],{"type":38,"tag":47,"props":534,"children":535},{},[536,538,544,546,551,553,559],{"type":44,"value":537},"Refreshing the cache for '",{"type":38,"tag":74,"props":539,"children":541},{"className":540},[],[542],{"type":44,"value":543},"\u003Ccache_dir>",{"type":44,"value":545},"' deletes ",{"type":38,"tag":66,"props":547,"children":548},{},[549],{"type":44,"value":550},"everything",{"type":44,"value":552}," currently cached and re-pulls the full 60-day window from S3 – can take a while. If you just want the newest data without losing what's already cached, ",{"type":38,"tag":74,"props":554,"children":556},{"className":555},[],[557],{"type":44,"value":558},"update-cache",{"type":44,"value":560}," does that instead and is much faster.",{"type":38,"tag":47,"props":562,"children":563},{},[564],{"type":44,"value":565},"Full refresh (delete + re-pull) – use this for stale\u002Fcorrupt data, schema drift, or a bad prior pull. Or: update only (no deletion, just top up).",{"type":38,"tag":462,"props":567,"children":568},{},[569,607],{"type":38,"tag":62,"props":570,"children":571},{},[572,574,579,581,586,588,593,594,599,600,605],{"type":44,"value":573},"If the user picks ",{"type":38,"tag":66,"props":575,"children":576},{},[577],{"type":44,"value":578},"update only",{"type":44,"value":580},": follow the update-cache skill's steps in this same turn (announce, then run ",{"type":38,"tag":74,"props":582,"children":584},{"className":583},[],[585],{"type":44,"value":104},{"type":44,"value":587}," incrementally with no delete step, then report) using the ",{"type":38,"tag":74,"props":589,"children":591},{"className":590},[],[592],{"type":44,"value":473},{"type":44,"value":278},{"type":38,"tag":74,"props":595,"children":597},{"className":596},[],[598],{"type":44,"value":484},{"type":44,"value":278},{"type":38,"tag":74,"props":601,"children":603},{"className":602},[],[604],{"type":44,"value":495},{"type":44,"value":606}," already loaded in step 1. Stop here – do not continue to step 3.",{"type":38,"tag":62,"props":608,"children":609},{},[610,611,616],{"type":44,"value":573},{"type":38,"tag":66,"props":612,"children":613},{},[614],{"type":44,"value":615},"full refresh",{"type":44,"value":617},": continue to step 3.",{"type":38,"tag":62,"props":619,"children":620},{},[621,626,628],{"type":38,"tag":66,"props":622,"children":623},{},[624],{"type":44,"value":625},"Announce.",{"type":44,"value":627}," Output verbatim:",{"type":38,"tag":530,"props":629,"children":630},{},[631],{"type":38,"tag":47,"props":632,"children":633},{},[634],{"type":44,"value":635},"Refreshing the local cache. Config (bucket.json, AWS profile) will be left alone.",{"type":38,"tag":62,"props":637,"children":638},{},[639,644,646,652,654],{"type":38,"tag":66,"props":640,"children":641},{},[642],{"type":44,"value":643},"Delete the cache.",{"type":44,"value":645}," Runs the deletion script. Reports which dirs it cleared and the bytes freed, or ",{"type":38,"tag":74,"props":647,"children":649},{"className":648},[],[650],{"type":44,"value":651},"(nothing to clear)",{"type":44,"value":653},":",{"type":38,"tag":161,"props":655,"children":657},{"className":163,"code":656,"language":165,"meta":166,"style":166},"\"$plugin_python\" \"$plugin_root\u002Fscripts\u002Frefresh_cache.py\"\n",[658],{"type":38,"tag":74,"props":659,"children":660},{"__ignoreMap":166},[661],{"type":38,"tag":172,"props":662,"children":663},{"class":174,"line":22},[664,669,673,677,681,685,690],{"type":38,"tag":172,"props":665,"children":667},{"style":666},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[668],{"type":44,"value":360},{"type":38,"tag":172,"props":670,"children":671},{"style":178},[672],{"type":44,"value":355},{"type":38,"tag":172,"props":674,"children":675},{"style":666},[676],{"type":44,"value":360},{"type":38,"tag":172,"props":678,"children":679},{"style":184},[680],{"type":44,"value":350},{"type":38,"tag":172,"props":682,"children":683},{"style":178},[684],{"type":44,"value":157},{"type":38,"tag":172,"props":686,"children":687},{"style":215},[688],{"type":44,"value":689},"\u002Fscripts\u002Frefresh_cache.py",{"type":38,"tag":172,"props":691,"children":692},{"style":184},[693],{"type":44,"value":331},{"type":38,"tag":62,"props":695,"children":696},{},[697,702,704,709,711,716,717,981,984,986,992,994,1000,1002,1008,1010,1016,1018,1024],{"type":38,"tag":66,"props":698,"children":699},{},[700],{"type":44,"value":701},"Re-pull a fresh 60 days.",{"type":44,"value":703}," Same window the staircase report targets. ",{"type":38,"tag":74,"props":705,"children":707},{"className":706},[],[708],{"type":44,"value":104},{"type":44,"value":710}," is incremental and idempotent; after a wipe it pulls the full window once and also rebuilds the ",{"type":38,"tag":74,"props":712,"children":714},{"className":713},[],[715],{"type":44,"value":112},{"type":44,"value":114},{"type":38,"tag":161,"props":718,"children":720},{"className":163,"code":719,"language":165,"meta":166,"style":166},"read target_start target_end \u003C \u003C(python3 -c \"\nfrom datetime import date, timedelta\nstart = date.today() - timedelta(days=60)\nend = date.today() - timedelta(days=1)\nprint(start.strftime('%Y-%m-%d'), end.strftime('%Y-%m-%d'))\n\")\n\"$plugin_python\" \"$plugin_root\u002Fscripts\u002Fdb\u002Fpull_parsely_dpl.py\" \\\n  --bucket \u003Cbucket> [--site \u003Csite>] \\\n  --start \"$target_start\" --end \"$target_end\" \\\n  [--profile \u003Cprofile>]\n",[721],{"type":38,"tag":74,"props":722,"children":723},{"__ignoreMap":166},[724,766,774,782,791,800,809,847,906,950],{"type":38,"tag":172,"props":725,"children":726},{"class":174,"line":22},[727,733,738,743,748,753,757,762],{"type":38,"tag":172,"props":728,"children":730},{"style":729},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[731],{"type":44,"value":732},"read",{"type":38,"tag":172,"props":734,"children":735},{"style":215},[736],{"type":44,"value":737}," target_start",{"type":38,"tag":172,"props":739,"children":740},{"style":215},[741],{"type":44,"value":742}," target_end",{"type":38,"tag":172,"props":744,"children":745},{"style":184},[746],{"type":44,"value":747}," \u003C",{"type":38,"tag":172,"props":749,"children":750},{"style":184},[751],{"type":44,"value":752}," \u003C(",{"type":38,"tag":172,"props":754,"children":755},{"style":666},[756],{"type":44,"value":388},{"type":38,"tag":172,"props":758,"children":759},{"style":215},[760],{"type":44,"value":761}," -c ",{"type":38,"tag":172,"props":763,"children":764},{"style":184},[765],{"type":44,"value":331},{"type":38,"tag":172,"props":767,"children":768},{"class":174,"line":236},[769],{"type":38,"tag":172,"props":770,"children":771},{"style":215},[772],{"type":44,"value":773},"from datetime import date, timedelta\n",{"type":38,"tag":172,"props":775,"children":776},{"class":174,"line":334},[777],{"type":38,"tag":172,"props":778,"children":779},{"style":215},[780],{"type":44,"value":781},"start = date.today() - timedelta(days=60)\n",{"type":38,"tag":172,"props":783,"children":785},{"class":174,"line":784},4,[786],{"type":38,"tag":172,"props":787,"children":788},{"style":215},[789],{"type":44,"value":790},"end = date.today() - timedelta(days=1)\n",{"type":38,"tag":172,"props":792,"children":794},{"class":174,"line":793},5,[795],{"type":38,"tag":172,"props":796,"children":797},{"style":215},[798],{"type":44,"value":799},"print(start.strftime('%Y-%m-%d'), end.strftime('%Y-%m-%d'))\n",{"type":38,"tag":172,"props":801,"children":803},{"class":174,"line":802},6,[804],{"type":38,"tag":172,"props":805,"children":806},{"style":184},[807],{"type":44,"value":808},"\")\n",{"type":38,"tag":172,"props":810,"children":812},{"class":174,"line":811},7,[813,817,821,825,829,833,838,842],{"type":38,"tag":172,"props":814,"children":815},{"style":666},[816],{"type":44,"value":360},{"type":38,"tag":172,"props":818,"children":819},{"style":178},[820],{"type":44,"value":355},{"type":38,"tag":172,"props":822,"children":823},{"style":666},[824],{"type":44,"value":360},{"type":38,"tag":172,"props":826,"children":827},{"style":184},[828],{"type":44,"value":350},{"type":38,"tag":172,"props":830,"children":831},{"style":178},[832],{"type":44,"value":157},{"type":38,"tag":172,"props":834,"children":835},{"style":215},[836],{"type":44,"value":837},"\u002Fscripts\u002Fdb\u002Fpull_parsely_dpl.py",{"type":38,"tag":172,"props":839,"children":840},{"style":184},[841],{"type":44,"value":360},{"type":38,"tag":172,"props":843,"children":844},{"style":178},[845],{"type":44,"value":846}," \\\n",{"type":38,"tag":172,"props":848,"children":850},{"class":174,"line":849},8,[851,856,860,865,870,874,879,883,888,893,897,902],{"type":38,"tag":172,"props":852,"children":853},{"style":215},[854],{"type":44,"value":855},"  --bucket",{"type":38,"tag":172,"props":857,"children":858},{"style":184},[859],{"type":44,"value":747},{"type":38,"tag":172,"props":861,"children":862},{"style":215},[863],{"type":44,"value":864},"bucke",{"type":38,"tag":172,"props":866,"children":867},{"style":178},[868],{"type":44,"value":869},"t",{"type":38,"tag":172,"props":871,"children":872},{"style":184},[873],{"type":44,"value":228},{"type":38,"tag":172,"props":875,"children":876},{"style":178},[877],{"type":44,"value":878}," [--site ",{"type":38,"tag":172,"props":880,"children":881},{"style":184},[882],{"type":44,"value":218},{"type":38,"tag":172,"props":884,"children":885},{"style":215},[886],{"type":44,"value":887},"sit",{"type":38,"tag":172,"props":889,"children":890},{"style":178},[891],{"type":44,"value":892},"e",{"type":38,"tag":172,"props":894,"children":895},{"style":184},[896],{"type":44,"value":228},{"type":38,"tag":172,"props":898,"children":899},{"style":215},[900],{"type":44,"value":901},"]",{"type":38,"tag":172,"props":903,"children":904},{"style":178},[905],{"type":44,"value":846},{"type":38,"tag":172,"props":907,"children":909},{"class":174,"line":908},9,[910,915,919,924,928,933,937,942,946],{"type":38,"tag":172,"props":911,"children":912},{"style":215},[913],{"type":44,"value":914},"  --start",{"type":38,"tag":172,"props":916,"children":917},{"style":184},[918],{"type":44,"value":350},{"type":38,"tag":172,"props":920,"children":921},{"style":178},[922],{"type":44,"value":923},"$target_start",{"type":38,"tag":172,"props":925,"children":926},{"style":184},[927],{"type":44,"value":360},{"type":38,"tag":172,"props":929,"children":930},{"style":215},[931],{"type":44,"value":932}," --end",{"type":38,"tag":172,"props":934,"children":935},{"style":184},[936],{"type":44,"value":350},{"type":38,"tag":172,"props":938,"children":939},{"style":178},[940],{"type":44,"value":941},"$target_end",{"type":38,"tag":172,"props":943,"children":944},{"style":184},[945],{"type":44,"value":360},{"type":38,"tag":172,"props":947,"children":948},{"style":178},[949],{"type":44,"value":846},{"type":38,"tag":172,"props":951,"children":953},{"class":174,"line":952},10,[954,959,963,968,972,976],{"type":38,"tag":172,"props":955,"children":956},{"style":178},[957],{"type":44,"value":958},"  [--profile ",{"type":38,"tag":172,"props":960,"children":961},{"style":184},[962],{"type":44,"value":218},{"type":38,"tag":172,"props":964,"children":965},{"style":215},[966],{"type":44,"value":967},"profil",{"type":38,"tag":172,"props":969,"children":970},{"style":178},[971],{"type":44,"value":892},{"type":38,"tag":172,"props":973,"children":974},{"style":184},[975],{"type":44,"value":228},{"type":38,"tag":172,"props":977,"children":978},{"style":215},[979],{"type":44,"value":980},"]\n",{"type":38,"tag":394,"props":982,"children":983},{},[],{"type":44,"value":985},"Substitute ",{"type":38,"tag":74,"props":987,"children":989},{"className":988},[],[990],{"type":44,"value":991},"\u003Cbucket>",{"type":44,"value":993}," and ",{"type":38,"tag":74,"props":995,"children":997},{"className":996},[],[998],{"type":44,"value":999},"\u003Cprofile>",{"type":44,"value":1001}," with the values held from step 1. Omit ",{"type":38,"tag":74,"props":1003,"children":1005},{"className":1004},[],[1006],{"type":44,"value":1007},"--site",{"type":44,"value":1009}," to refresh all sites; pass ",{"type":38,"tag":74,"props":1011,"children":1013},{"className":1012},[],[1014],{"type":44,"value":1015},"--site \u003Csite>",{"type":44,"value":1017}," to limit the pull to one site. Do NOT add ",{"type":38,"tag":74,"props":1019,"children":1021},{"className":1020},[],[1022],{"type":44,"value":1023},"|| true",{"type":44,"value":1025}," here – unlike the report path, a failed re-pull is the headline result of this flow; surface it.",{"type":38,"tag":62,"props":1027,"children":1028},{},[1029,1034,1036,1039],{"type":38,"tag":66,"props":1030,"children":1031},{},[1032],{"type":44,"value":1033},"Report done.",{"type":44,"value":1035}," One short line: \"Cache rebuilt. Next report run uses fresh data.\"",{"type":38,"tag":394,"props":1037,"children":1038},{},[],{"type":44,"value":1040},"If the re-pull failed (auth lapse, S3 error, no events for the window), say so plainly and tell the user the lake is now empty – the next report run will try to pull again, or they can re-run this flow once auth is fresh.",{"type":38,"tag":121,"props":1042,"children":1044},{"id":1043},"notes",[1045],{"type":44,"value":1046},"Notes",{"type":38,"tag":462,"props":1048,"children":1049},{},[1050,1093,1126,1153],{"type":38,"tag":62,"props":1051,"children":1052},{},[1053,1055,1060,1062,1068,1070,1076,1078,1084,1086,1091],{"type":44,"value":1054},"Only the ",{"type":38,"tag":66,"props":1056,"children":1057},{},[1058],{"type":44,"value":1059},"currently configured",{"type":44,"value":1061}," customer's DPL data is affected. The lake root holds all sources\u002Fsites pooled under ",{"type":38,"tag":74,"props":1063,"children":1065},{"className":1064},[],[1066],{"type":44,"value":1067},"$AGENTIC_ANALYTICS_DATA_DIR",{"type":44,"value":1069}," (default ",{"type":38,"tag":74,"props":1071,"children":1073},{"className":1072},[],[1074],{"type":44,"value":1075},"~\u002F.local\u002Fshare\u002Fagentic-analytics",{"type":44,"value":1077},"); deletion is scoped to the ",{"type":38,"tag":74,"props":1079,"children":1081},{"className":1080},[],[1082],{"type":44,"value":1083},"dpl\u002Fevents\u002F",{"type":44,"value":1085}," subtree and the catalog, so other data you may later land in the lake is untouched. To work with a different customer, switch ",{"type":38,"tag":74,"props":1087,"children":1089},{"className":1088},[],[1090],{"type":44,"value":87},{"type":44,"value":1092}," first.",{"type":38,"tag":62,"props":1094,"children":1095},{},[1096,1098,1103,1105,1110,1112,1117,1119,1124],{"type":44,"value":1097},"Deletion is ",{"type":38,"tag":66,"props":1099,"children":1100},{},[1101],{"type":44,"value":1102},"not",{"type":44,"value":1104}," scoped to a single site even when the re-pull afterward is – ",{"type":38,"tag":74,"props":1106,"children":1108},{"className":1107},[],[1109],{"type":44,"value":79},{"type":44,"value":1111}," always clears the whole ",{"type":38,"tag":74,"props":1113,"children":1115},{"className":1114},[],[1116],{"type":44,"value":1083},{"type":44,"value":1118}," subtree (every site\u002Fapikey under the configured bucket). Passing ",{"type":38,"tag":74,"props":1120,"children":1122},{"className":1121},[],[1123],{"type":44,"value":1015},{"type":44,"value":1125}," to step 5 only limits what gets re-pulled, not what got deleted. If you only want to top up or repair one site's data without touching the rest, use update-cache instead – it never deletes.",{"type":38,"tag":62,"props":1127,"children":1128},{},[1129,1131,1137,1139,1145,1147,1152],{"type":44,"value":1130},"The DuckDB catalog (",{"type":38,"tag":74,"props":1132,"children":1134},{"className":1133},[],[1135],{"type":44,"value":1136},"catalog.duckdb",{"type":44,"value":1138}," and its ",{"type":38,"tag":74,"props":1140,"children":1142},{"className":1141},[],[1143],{"type":44,"value":1144},".wal",{"type":44,"value":1146}," sidecar) is cleared too. It's derived state any report can regenerate by re-running ",{"type":38,"tag":74,"props":1148,"children":1150},{"className":1149},[],[1151],{"type":44,"value":104},{"type":44,"value":283},{"type":38,"tag":62,"props":1154,"children":1155},{},[1156,1161,1163,1169,1171,1177,1179,1184],{"type":38,"tag":66,"props":1157,"children":1158},{},[1159],{"type":44,"value":1160},"Legacy gz cache sweep:",{"type":44,"value":1162}," if you're upgrading from a pre-lake version, this flow also clears the old gz-JSON cache at ",{"type":38,"tag":74,"props":1164,"children":1166},{"className":1165},[],[1167],{"type":44,"value":1168},"~\u002F.cache\u002Fagentic-analytics\u002Fdpl\u002F\u003Ccache_dir>\u002F",{"type":44,"value":1170}," and the ",{"type":38,"tag":74,"props":1172,"children":1174},{"className":1173},[],[1175],{"type":44,"value":1176},"duckdb-tmp\u002F",{"type":44,"value":1178}," working dir (scoped to your ",{"type":38,"tag":74,"props":1180,"children":1182},{"className":1181},[],[1183],{"type":44,"value":495},{"type":44,"value":1185},"). The lake code never reads them; sweeping just reclaims the orphaned disk. No-op for fresh installs.",{"type":38,"tag":1187,"props":1188,"children":1189},"style",{},[1190],{"type":44,"value":1191},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1193,"total":811},[1194,1210,1226,1240,1252,1258,1270],{"slug":1195,"name":1195,"fn":1196,"description":1197,"org":1198,"tags":1199,"stars":22,"repoUrl":23,"updatedAt":1209},"clear-configs","remove local agentic analytics configuration files","Remove the local config files written by first-time setup (bucket.json and the agentic-analytics AWS profile). Leaves the events cache alone. Use when the user wants to start setup over, entered the wrong bucket name, or asks to reset\u002Fclear the plugin's configuration.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1200,1203,1206],{"name":1201,"slug":1202,"type":15},"AWS","aws",{"name":1204,"slug":1205,"type":15},"Configuration","configuration",{"name":1207,"slug":1208,"type":15},"Operations","operations","2026-07-24T06:08:49.942979",{"slug":1211,"name":1211,"fn":1212,"description":1213,"org":1214,"tags":1215,"stars":22,"repoUrl":23,"updatedAt":1225},"conversions-report","generate conversion attribution reports","Seed for a future standalone conversions report. Currently holds conversion-attribution code lifted out of the staircase report (PR B of the staircase climbing revision); not yet runnable end-to-end. Use when the user asks to build out the standalone conversions report; do not invoke for \"run the conversions report\" until the file is reshaped.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1216,1219,1222],{"name":1217,"slug":1218,"type":15},"Analytics","analytics",{"name":1220,"slug":1221,"type":15},"Reporting","reporting",{"name":1223,"slug":1224,"type":15},"Sales","sales","2026-05-23T06:06:37.112153",{"slug":1227,"name":1227,"fn":1228,"description":1229,"org":1230,"tags":1231,"stars":22,"repoUrl":23,"updatedAt":1239},"getting-started","set up agentic-analytics plugin","Walk the user through first-time setup of the agentic-analytics plugin. Use when the user asks how to get started, how to set up the plugin, where to put their credentials, what the plugin can do for them, or any variant of \"first run\" \u002F \"onboarding\" \u002F \"walk me through this.\"",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1232,1233,1236],{"name":1217,"slug":1218,"type":15},{"name":1234,"slug":1235,"type":15},"Documentation","documentation",{"name":1237,"slug":1238,"type":15},"Reference","reference","2026-07-24T05:42:05.056763",{"slug":1241,"name":1241,"fn":1242,"description":1243,"org":1244,"tags":1245,"stars":22,"repoUrl":23,"updatedAt":1251},"identify-employees","filter internal employee traffic from reports","Detect whether the configured customer's tracker tags employee\u002Finternal pageviews via `extra_data`, and if so, save the filter so reports exclude that traffic. Use when the user asks to identify employees, exclude employee traffic, filter internal users, or says results look skewed by their own staff.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1246,1247,1250],{"name":1217,"slug":1218,"type":15},{"name":1248,"slug":1249,"type":15},"Data Cleaning","data-cleaning",{"name":1207,"slug":1208,"type":15},"2026-07-24T05:42:07.991328",{"slug":4,"name":4,"fn":5,"description":6,"org":1253,"tags":1254,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1255,1256,1257],{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"slug":1259,"name":1259,"fn":1260,"description":1261,"org":1262,"tags":1263,"stars":22,"repoUrl":23,"updatedAt":1269},"staircase-report","generate staircase audience relationship reports","Run the staircase audience-relationship report for a customer. Use when the user asks to run the staircase report, requests it for a specific site, or asks for an audience-tier or relationship-intelligence report.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1264,1265,1268],{"name":1217,"slug":1218,"type":15},{"name":1266,"slug":1267,"type":15},"Customer Success","customer-success",{"name":1220,"slug":1221,"type":15},"2026-07-24T05:42:06.016457",{"slug":558,"name":558,"fn":1271,"description":1272,"org":1273,"tags":1274,"stars":22,"repoUrl":23,"updatedAt":1280},"update local agentic analytics data cache","Top up the local data cache with new data, without deleting anything. Use when the user wants to bring the cache up to date, pull the latest days, sync recent data, or top up the cache. The lighter, non-destructive sibling of refresh-cache – offered as an alternative there.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1275,1276,1279],{"name":17,"slug":18,"type":15},{"name":1277,"slug":1278,"type":15},"Data Analysis","data-analysis",{"name":1207,"slug":1208,"type":15},"2026-07-24T06:08:50.338585",{"items":1282,"total":1464},[1283,1304,1323,1335,1352,1365,1379,1394,1411,1422,1435,1451],{"slug":1284,"name":1284,"fn":1285,"description":1286,"org":1287,"tags":1288,"stars":1301,"repoUrl":1302,"updatedAt":1303},"annotate","collect visual feedback with browser annotation tools","Open a browser with visual annotation tools. The user clicks elements on their site and leaves feedback — the agent reads annotations and makes changes. Use this when the user wants to point at specific elements to fix, tweak, or redesign.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1289,1292,1295,1298],{"name":1290,"slug":1291,"type":15},"Frontend","frontend",{"name":1293,"slug":1294,"type":15},"Productivity","productivity",{"name":1296,"slug":1297,"type":15},"UX Copy","ux-copy",{"name":1299,"slug":1300,"type":15},"UX Design","ux-design",484,"https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fstudio","2026-05-06T05:40:01.516544",{"slug":1305,"name":1305,"fn":1306,"description":1307,"org":1308,"tags":1309,"stars":1301,"repoUrl":1302,"updatedAt":1322},"block-content","write editable WordPress block markup","Write editable WordPress block markup for local Studio sites, including core\u002Fhtml limits, block-theme layout rules, full-width sections, validation, and skeleton-first page\u002FCSS recipes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1310,1313,1316,1319],{"name":1311,"slug":1312,"type":15},"Block Editor","block-editor",{"name":1314,"slug":1315,"type":15},"CSS","css",{"name":1317,"slug":1318,"type":15},"HTML","html",{"name":1320,"slug":1321,"type":15},"WordPress","wordpress","2026-05-27T07:01:55.629681",{"slug":1324,"name":1324,"fn":1325,"description":1326,"org":1327,"tags":1328,"stars":1301,"repoUrl":1302,"updatedAt":1334},"hosting-plans-helper","provide WordPress.com hosting plan information","Answer WordPress.com plan, pricing, upgrade, and feature-tier questions (plan names, what each tier unlocks — plugins, themes, custom code, SSH, hosting — and current prices) from authoritative live data. Load before answering ANY plan, pricing, or feature-gating question; never answer these from memory.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1329,1332,1333],{"name":1330,"slug":1331,"type":15},"Pricing","pricing",{"name":1237,"slug":1238,"type":15},{"name":1320,"slug":1321,"type":15},"2026-07-02T07:42:33.654791",{"slug":1336,"name":1336,"fn":1337,"description":1338,"org":1339,"tags":1340,"stars":1301,"repoUrl":1302,"updatedAt":1351},"liberate","migrate websites to WordPress","Import and rebuild a website from a closed platform (Wix, Squarespace, Webflow, Shopify, GoDaddy, Hostinger, HubSpot, Weebly) into a Studio WordPress site. Extracts pages\u002Fposts\u002Fproducts + media, then reconstructs the design as editable blocks + WooCommerce OR as a high-fidelity replica theme. Invoke when the user wants to migrate, import, liberate, or rebuild a site from one of these platforms.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1341,1344,1347,1350],{"name":1342,"slug":1343,"type":15},"CMS","cms",{"name":1345,"slug":1346,"type":15},"Migration","migration",{"name":1348,"slug":1349,"type":15},"Web Development","web-development",{"name":1320,"slug":1321,"type":15},"2026-07-09T06:47:33.454311",{"slug":1353,"name":1353,"fn":1354,"description":1355,"org":1356,"tags":1357,"stars":1301,"repoUrl":1302,"updatedAt":1364},"need-for-speed","run frontend performance audits for WordPress sites","Run a frontend performance audit on a WordPress site and get actionable optimization recommendations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1358,1361,1362,1363],{"name":1359,"slug":1360,"type":15},"Audit","audit",{"name":1290,"slug":1291,"type":15},{"name":13,"slug":14,"type":15},{"name":1320,"slug":1321,"type":15},"2026-05-06T05:40:06.433267",{"slug":1366,"name":1366,"fn":1367,"description":1368,"org":1369,"tags":1370,"stars":1301,"repoUrl":1302,"updatedAt":1378},"plugin-recommendations","recommend WordPress plugins for site features","Choose recommended plugins and plugin-provided blocks for features core WordPress blocks do not cover - ecommerce (WooCommerce), forms and newsletters (Jetpack), online courses and quizzes (Sensei LMS), polls, surveys and ratings (Crowdsignal), spam protection (Akismet) - while keeping generated content editable and avoiding raw HTML fallbacks. Any request to sell products or build a shop, store, or storefront requires WooCommerce with products.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1371,1374,1377],{"name":1372,"slug":1373,"type":15},"Content Creation","content-creation",{"name":1375,"slug":1376,"type":15},"Plugin Development","plugin-development",{"name":1320,"slug":1321,"type":15},"2026-05-27T07:01:58.249105",{"slug":1380,"name":1380,"fn":1381,"description":1382,"org":1383,"tags":1384,"stars":1301,"repoUrl":1302,"updatedAt":1393},"rank-me-up","run on-page SEO audits for WordPress sites","Run an on-page SEO audit on a WordPress site and get actionable recommendations to improve search visibility.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1385,1386,1389,1392],{"name":1359,"slug":1360,"type":15},{"name":1387,"slug":1388,"type":15},"Marketing","marketing",{"name":1390,"slug":1391,"type":15},"SEO","seo",{"name":1320,"slug":1321,"type":15},"2026-05-06T05:40:05.196367",{"slug":1395,"name":1395,"fn":1396,"description":1397,"org":1398,"tags":1399,"stars":1301,"repoUrl":1302,"updatedAt":1410},"site-spec","gather specifications for new WordPress sites","Gather the site name and layout preference before building a WordPress site. Run this before creating any new site.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1400,1403,1406,1409],{"name":1401,"slug":1402,"type":15},"Design","design",{"name":1404,"slug":1405,"type":15},"Product Management","product-management",{"name":1407,"slug":1408,"type":15},"Specs","specs",{"name":1320,"slug":1321,"type":15},"2026-05-06T05:40:02.739409",{"slug":1412,"name":1412,"fn":1413,"description":1414,"org":1415,"tags":1416,"stars":1301,"repoUrl":1302,"updatedAt":1421},"studio-cli","manage local WordPress sites with Studio CLI","Use the Studio CLI to manage local WordPress sites, authentication, and preview sites. Invoke this skill when you need to run Studio CLI commands, manage sites, or troubleshoot site issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1417,1420],{"name":1418,"slug":1419,"type":15},"CLI","cli",{"name":1320,"slug":1321,"type":15},"2026-04-06T18:02:57.150231",{"slug":1423,"name":1423,"fn":1424,"description":1425,"org":1426,"tags":1427,"stars":1301,"repoUrl":1302,"updatedAt":1434},"taxonomist","optimize WordPress category taxonomy","Analyze and optimize a WordPress site's category taxonomy. Exports all posts, uses AI to suggest an improved category structure — merging duplicates, retiring dead categories, creating missing ones, writing descriptions, and re-categorizing posts. Run this when the user wants to clean up or improve their categories.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1428,1431,1432,1433],{"name":1429,"slug":1430,"type":15},"Content Strategy","content-strategy",{"name":1248,"slug":1249,"type":15},{"name":1390,"slug":1391,"type":15},{"name":1320,"slug":1321,"type":15},"2026-05-06T05:40:03.966799",{"slug":1436,"name":1436,"fn":1437,"description":1438,"org":1439,"tags":1440,"stars":1301,"repoUrl":1302,"updatedAt":1450},"visual-design","plan and execute visual design direction","Plan and execute high-quality visual direction for site creation, redesign, layout, typography, color, motion, and visual polish.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1441,1444,1445,1448],{"name":1442,"slug":1443,"type":15},"Animation","animation",{"name":1401,"slug":1402,"type":15},{"name":1446,"slug":1447,"type":15},"Typography","typography",{"name":1449,"slug":1436,"type":15},"Visual Design","2026-07-24T05:40:57.887452",{"slug":1452,"name":1452,"fn":1453,"description":1454,"org":1455,"tags":1456,"stars":1301,"repoUrl":1302,"updatedAt":1463},"visual-polish","verify and polish website visual design","Verify and polish a built or redesigned site by diagnosing rendered-DOM issues against intent and fixing them in a planned, batched screenshot-and-fix loop.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1457,1458,1459,1462],{"name":20,"slug":21,"type":15},{"name":1290,"slug":1291,"type":15},{"name":1460,"slug":1461,"type":15},"Screenshots","screenshots",{"name":1449,"slug":1436,"type":15},"2026-06-06T07:09:59.809812",81]