[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69918HZCYZHD7K9Y9ZSD287":3,"skill-same:01M69918HZCYZHD7K9Y9ZSD287":72},{"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":23,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":51,"repositoryHtmlUrl":52,"repositoryHomepageUrl":53,"ownerHtmlUrl":54,"ownerBlogUrl":55,"ownerDescription":56,"updatedAt":57,"install":58,"resources":71},"01M69918HZCYZHD7K9Y9ZSD287","routines",null,"Use for a recurring unattended task (cron; pull data, open a PR, post a digest), or to test\u002Fdry-run a routine first. Explains authoring and testing via the routine tool.","google\u002Fadk-recipes","google","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1342004?v=4","01M698VYEFDM0VJBZDYYJ2T83S","Google","01M6990124CWS5627VKGSKJXRD",10603,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fadk-recipes\u002Fblob\u002Fmain\u002Fcore\u002Fpython\u002Flong-horizon-harness\u002Fhorizon\u002Fbuiltin_skills\u002Froutines\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[5,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"routine","testing","for","post","via","dry","authoring","digest","task","use","recurring","tool","open","first","data","pull","run","pr","test","2026-11-10 10:12:30",false,"---\nname: routines\ndescription: Use for a recurring unattended task (cron; pull data, open a PR, post a digest), or to test\u002Fdry-run a routine first. Explains authoring and testing via the routine tool.\n---\n\n# Scheduling routines\n\nA **routine** is a recurring task that runs **unattended** on a cron schedule, in\na **fresh sandbox isolated from the user's workspace**, holding **only the secrets\nthe routine declares**. Use it for \"every morning, summarize X and report\" \u002F\n\"weekly, bump deps and open a PR\" — work that should happen without the user\npresent. There is no one-off reminder tool: it cannot ask the user anything\nmid-run, so it is the wrong fit for a plain \"remind me at 9pm\" ping.\n\n## The isolation model (why this is safe)\n\n- The routine runs in its OWN sandbox (`lhart-\u003Cid>`), never the user's — so it\n  cannot see their workspace, other projects, or undeclared secrets.\n- It receives ONLY the secret env vars listed in `secrets:` — that list IS the\n  blast-radius boundary. Declare the minimum the task needs (check the \"Available\n  secret env vars\" line for the names).\n- It is **headless** (nobody to approve mid-run): shell commands run normally in\n  the isolated sandbox — `git clone`, `pip install`, build, `commit`\u002F`push` all\n  work, since the sandbox is the blast radius. Secret-exfiltration and\n  known-destructive commands are still refused, and any *non-shell* action that\n  would need approval is auto-denied — design the task to avoid those, or do an\n  irreversible external step as a draft for the user to confirm later.\n- Outputs come back as artifacts in the routine's session — it cannot write into\n  the user's workspace.\n\n## How to author one\n\nCall `routine(action=\"create\", name=..., schedule=..., task=..., secrets=[...])`:\n- `schedule`: a 5-field cron expression (`\"0 8 * * *\"` = daily 08:00 UTC).\n- `task`: a self-contained instruction — the routine has no memory of this chat\n  and no access to the user's files, so state everything it needs.\n- `secrets`: the exact secret env names the task requires (e.g.\n  `[\"GITHUB_PAT\"]`), or omit for none.\n\n## Test it before scheduling\n\nALWAYS dry-run a routine before you create it:\n\n```\nroutine(action=\"test\", name=..., task=..., secrets=[...])\n```\n\nThis runs the task ONCE right now under the routine's real isolation — its own\n`lhart-` sandbox, headless (shell runs; non-shell approvals denied), only the declared `secrets` —\nand blocks until it finishes, returning `{success, status, output, ...}`. Read the\n`output`: if the task didn't work (missing secret, needed an approval, wrong\nassumption), fix `task`\u002F`secrets` and test again. A test schedules nothing (no\nschedule row, no chat session) — but it does provision the routine's real\n`lhart-` sandbox, which the scheduled routine then reuses, so pass the same `name`\nyou'll `create` with. Then `create`.\n\n## Scheduling it\n\nThe tool **asks the user to confirm** before scheduling. On the first call it\nreturns `status: \"awaiting_user_response\"` — stop, let the user decide, and do\nNOT claim the routine is scheduled until you get `success: true` with an `id`.\n\nUse `routine(action=\"list\")` to show scheduled routines and\n`routine(action=\"cancel\", id=...)` to remove one (the user can also type\n`\u002Froutines` \u002F `\u002Froutines remove \u003Cid>`).\n","# Scheduling routines\n\nA **routine** is a recurring task that runs **unattended** on a cron schedule, in\na **fresh sandbox isolated from the user's workspace**, holding **only the secrets\nthe routine declares**. Use it for \"every morning, summarize X and report\" \u002F\n\"weekly, bump deps and open a PR\" — work that should happen without the user\npresent. There is no one-off reminder tool: it cannot ask the user anything\nmid-run, so it is the wrong fit for a plain \"remind me at 9pm\" ping.\n\n## The isolation model (why this is safe)\n\n- The routine runs in its OWN sandbox (`lhart-\u003Cid>`), never the user's — so it\n  cannot see their workspace, other projects, or undeclared secrets.\n- It receives ONLY the secret env vars listed in `secrets:` — that list IS the\n  blast-radius boundary. Declare the minimum the task needs (check the \"Available\n  secret env vars\" line for the names).\n- It is **headless** (nobody to approve mid-run): shell commands run normally in\n  the isolated sandbox — `git clone`, `pip install`, build, `commit`\u002F`push` all\n  work, since the sandbox is the blast radius. Secret-exfiltration and\n  known-destructive commands are still refused, and any *non-shell* action that\n  would need approval is auto-denied — design the task to avoid those, or do an\n  irreversible external step as a draft for the user to confirm later.\n- Outputs come back as artifacts in the routine's session — it cannot write into\n  the user's workspace.\n\n## How to author one\n\nCall `routine(action=\"create\", name=..., schedule=..., task=..., secrets=[...])`:\n- `schedule`: a 5-field cron expression (`\"0 8 * * *\"` = daily 08:00 UTC).\n- `task`: a self-contained instruction — the routine has no memory of this chat\n  and no access to the user's files, so state everything it needs.\n- `secrets`: the exact secret env names the task requires (e.g.\n  `[\"GITHUB_PAT\"]`), or omit for none.\n\n## Test it before scheduling\n\nALWAYS dry-run a routine before you create it:\n\n```\nroutine(action=\"test\", name=..., task=..., secrets=[...])\n```\n\nThis runs the task ONCE right now under the routine's real isolation — its own\n`lhart-` sandbox, headless (shell runs; non-shell approvals denied), only the declared `secrets` —\nand blocks until it finishes, returning `{success, status, output, ...}`. Read the\n`output`: if the task didn't work (missing secret, needed an approval, wrong\nassumption), fix `task`\u002F`secrets` and test again. A test schedules nothing (no\nschedule row, no chat session) — but it does provision the routine's real\n`lhart-` sandbox, which the scheduled routine then reuses, so pass the same `name`\nyou'll `create` with. Then `create`.\n\n## Scheduling it\n\nThe tool **asks the user to confirm** before scheduling. On the first call it\nreturns `status: \"awaiting_user_response\"` — stop, let the user decide, and do\nNOT claim the routine is scheduled until you get `success: true` with an `id`.\n\nUse `routine(action=\"list\")` to show scheduled routines and\n`routine(action=\"cancel\", id=...)` to remove one (the user can also type\n`\u002Froutines` \u002F `\u002Froutines remove \u003Cid>`).\n",{"name":5,"description":7},"main","665f7b2a181686f2ba3c6c942e9b30a084b12ec3","core\u002Fpython\u002Flong-horizon-harness\u002Fhorizon\u002Fbuiltin_skills\u002Froutines",2956,"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fadk-recipes","https:\u002F\u002Fadk.dev","https:\u002F\u002Fgithub.com\u002Fgoogle","https:\u002F\u002Fopensource.google\u002F","Google ❤️ Open Source","2026-11-11 03:19:25",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add google\u002Fadk-recipes --skill routines",{"tool":64,"command":65},"bunx","bunx skills add google\u002Fadk-recipes --skill routines",{"tool":67,"command":68},"pnpm","pnpm dlx skills add google\u002Fadk-recipes --skill routines","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fadk-recipes\u002Fblob\u002Fmain\u002Fcore\u002Fpython\u002Flong-horizon-harness\u002Fhorizon\u002Fbuiltin_skills\u002Froutines\u002FSKILL.md",true,[],[73,94,127,144,165,184],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":86,"publishedAt":43},"01M6991EKEG8XEM3VWW4VGV0ZQ","retail-virtual-tryon","Creates virtual try-on agents supporting image and video (catwalk animation) try-ons on Google Cloud (Gemini image models and Veo on Gemini Enterprise Agent Platform). Handles resource setup, user photo uploading, image\u002Fvideo generation pipelines, local testing, and evaluation.","https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fadk-recipes\u002Fblob\u002Fmain\u002Fplugins\u002Fretail\u002Fskills\u002Fvirtual-tryon\u002FSKILL.md",[79,80,83],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":81,"categoryName":82,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":84,"categoryName":85,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[87,88,89,90,91,9,92,25,93],"retail virtual tryon","gemini enterprise agent platform","adk","google cloud","gemini","image","genai",{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":109,"publishedAt":43},"01M6991ABTZW7FCPREXY8GD4RG","retail-product-search","Creates product search agents with semantic search and RAG on Google Cloud (Vector Search on Gemini Enterprise Agent Platform, BigQuery, embeddings). Use when the user wants to \"build a product search agent\", \"create an e-commerce search\", \"make a shopping assistant\", \"set up semantic catalog discovery\", \"ingest products into Vector Search\", or \"deploy a retail RAG agent\". Handles the full pipeline: catalog data ingestion to BigQuery, Gemini Enterprise Agent Platform Vector Search collection setup, ADK agent scaffolding, evaluation, and Cloud Run deployment.","https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fadk-recipes\u002Fblob\u002Fmain\u002Fplugins\u002Fretail\u002Fskills\u002Fproduct-search\u002FSKILL.md",[100,103,104],{"categoryNo":101,"categoryName":102,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":84,"categoryName":85,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":105,"categoryName":106,"taxonomyType":107,"taxonomyTypeDesc":108},"01JBSEEDCAT000000000000031","产品经理","PROFESSION","适用职业",[110,111,112,88,89,91,113,9,114,115,116,117,118,119,90,120,121,122,123,124,40,125,126],"retail product search","product","search","assistant","when","commerce","scaffolding","shopping","up","ingestion","collection","SET","pipeline","vector","apache","create","rag",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":133,"publishedAt":43},"01M699178ZDFDXEZ11DG1Y9CTF","policy","Inspect the per-workspace tool-policy overlay (.lha\u002Fpolicies.jsonl) that gates destructive or sensitive tool calls, and tell the user what to change if they want a rule added or removed.","https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fadk-recipes\u002Fblob\u002Fmain\u002Fcore\u002Fpython\u002Flong-horizon-harness\u002Fhorizon\u002Fbuiltin_skills\u002Fpolicy\u002FSKILL.md",[],[129,134,135,136,137,138,139,140,141,142,35,143],"overlay","tool calls","inspect","calls","jsonl","rule","gates","user","workspace","change",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":43},"01M69915F8591SQBA1ZHK6NDA7","google-workspace","Read\u002Fwrite Google Drive, Docs, Sheets, Gmail, Calendar, Chat, Tasks, Slides via the `gws` CLI. Needs an OAuth client or service account configured first. Use for any Google Workspace task.","https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fadk-recipes\u002Fblob\u002Fmain\u002Fcore\u002Fpython\u002Flong-horizon-harness\u002Fhorizon\u002Fbuiltin_skills\u002Fgoogle-workspace\u002FSKILL.md",[],[142,151,9,152,153,154,155,28,156,32,157,33,158,159,26,37,160,161,162,163,164],"google workspace","chat","slides","sheets","client","gws","calendar","write","read","OAuth","tasks","docs","cli","gmail",{"skillNo":166,"name":167,"nameZh":6,"description":168,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":169,"categories":170,"keywords":172,"publishedAt":43},"01M69914416KTZ6Z0WD425YYJ0","find-skills","Discover\u002Finstall NEW agent skills from external sources (skills.sh). Use for capabilities you lack, e.g. \"find a skill for X\". Do NOT use to list skills you already have; see `\u003Cavailable_skills>`.","https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fadk-recipes\u002Fblob\u002Fmain\u002Fcore\u002Fpython\u002Flong-horizon-harness\u002Fhorizon\u002Fbuiltin_skills\u002Ffind-skills\u002FSKILL.md",[171],{"categoryNo":84,"categoryName":85,"taxonomyType":21,"taxonomyTypeDesc":22},[173,174,175,33,176,177,178,179,180,26,181,182,183],"find","find skills","do","install","list","list skills","capabilities","new agent","you","sources","discover",{"skillNo":185,"name":186,"nameZh":6,"description":187,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":188,"categories":189,"keywords":191,"publishedAt":43},"01M6991292FVYS3XR3WE7VXZJD","bootstrap-google-tools","Install\u002Fauth CLIs the sandbox lacks - `gws` (Drive, Gmail, Sheets, Calendar), `gcloud`, `agents-cli`, `mcp-cli` (MCP servers). Use on \"command not found\" or before GCP\u002FWorkspace\u002FMCP work.","https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fadk-recipes\u002Fblob\u002Fmain\u002Fcore\u002Fpython\u002Flong-horizon-harness\u002Fhorizon\u002Fbuiltin_skills\u002Fbootstrap-google-tools\u002FSKILL.md",[190],{"categoryNo":84,"categoryName":85,"taxonomyType":21,"taxonomyTypeDesc":22},[192,193,194,9,33,195,154,156,157,176,196,197,142,198,199,200,201,163,164,202],"Tools","bootstrap google tools","bootstrap","servers","command","work","gcp","auth","sandbox","gcloud","MCP"]