[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F8PM69TNT2063PDJK85BP7":3,"skill-same:01M6F8PM69TNT2063PDJK85BP7":80},{"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":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":57,"commitSha":58,"skillDirectory":59,"forksCount":60,"repositoryHtmlUrl":61,"repositoryHomepageUrl":62,"ownerHtmlUrl":63,"ownerBlogUrl":6,"ownerDescription":64,"updatedAt":65,"install":66,"resources":79},"01M6F8PM69TNT2063PDJK85BP7","clickup-multi-env-setup",null,"Configure ClickUp API access across dev, staging, and production environments\nwith per-environment tokens and workspace isolation.\nTrigger: \"clickup environments\", \"clickup staging\", \"clickup dev prod\",\n\"clickup environment setup\", \"clickup config by env\", \"clickup multi-env\".","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fclickup-multi-env-setup\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"setup","clickup multi env setup","multi","env setup","env","clickup","configure","access","read","write","edit","environment","across","isolation","Bash","io","api","code","environments","config","2026-11-10 10:12:30",false,"---\nname: clickup-multi-env-setup\ndescription: |\n  Configure ClickUp API access across dev, staging, and production environments\n  with per-environment tokens and workspace isolation.\n  Trigger: \"clickup environments\", \"clickup staging\", \"clickup dev prod\",\n  \"clickup environment setup\", \"clickup config by env\", \"clickup multi-env\".\nallowed-tools: Read, Write, Edit, Bash(aws:*), Bash(gcloud:*), Bash(vault:*)\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\ntags: [saas, productivity, clickup]\ncompatible-with: claude-code\n---\n\n# ClickUp Multi-Environment Setup\n\n## Overview\n\nConfigure separate ClickUp workspaces and API tokens for development, staging, and production. ClickUp does not have sandbox environments, so the recommended approach is separate workspaces with separate tokens per environment.\n\n## Environment Strategy\n\n| Environment | Workspace | Token | Rate Limit | Purpose |\n|-------------|-----------|-------|-----------|---------|\n| Development | Dev workspace | Personal token | 100 req\u002Fmin | Local development, testing |\n| Staging | Staging workspace | Service token | 100 req\u002Fmin | Integration testing, QA |\n| Production | Production workspace | Service token | Per plan | Live traffic |\n\n**Key point:** All ClickUp API calls go to `https:\u002F\u002Fapi.clickup.com\u002Fapi\u002Fv2\u002F` regardless of environment. Environment isolation comes from using different tokens that are authorized for different workspaces.\n\n## Configuration\n\n```typescript\n\u002F\u002F src\u002Fconfig\u002Fclickup.ts\ninterface ClickUpEnvConfig {\n  token: string;\n  teamId: string;\n  defaultListId?: string;\n  timeout: number;\n  retries: number;\n  cacheEnabled: boolean;\n  cacheTtlMs: number;\n}\n\nfunction getClickUpConfig(): ClickUpEnvConfig {\n  const env = process.env.NODE_ENV ?? 'development';\n\n  const base = {\n    timeout: 30000,\n    retries: 3,\n    cacheEnabled: true,\n    cacheTtlMs: 60000,\n  };\n\n  switch (env) {\n    case 'production':\n      return {\n        ...base,\n        token: requireEnv('CLICKUP_API_TOKEN_PROD'),\n        teamId: requireEnv('CLICKUP_TEAM_ID_PROD'),\n        retries: 5,          \u002F\u002F More retries in prod\n        cacheTtlMs: 300000,  \u002F\u002F 5 min cache in prod\n      };\n    case 'staging':\n      return {\n        ...base,\n        token: requireEnv('CLICKUP_API_TOKEN_STAGING'),\n        teamId: requireEnv('CLICKUP_TEAM_ID_STAGING'),\n      };\n    default:\n      return {\n        ...base,\n        token: requireEnv('CLICKUP_API_TOKEN'),\n        teamId: process.env.CLICKUP_TEAM_ID ?? '',\n        cacheEnabled: false,  \u002F\u002F No cache in dev for fresh data\n      };\n  }\n}\n\nfunction requireEnv(key: string): string {\n  const value = process.env[key];\n  if (!value) throw new Error(`Missing required env var: ${key}`);\n  return value;\n}\n```\n\n## Environment Files\n\n```bash\n# .env.development (local dev, git-ignored)\nCLICKUP_API_TOKEN=pk_dev_12345_ABCDEF\nCLICKUP_TEAM_ID=1111111\n\n# .env.staging (CI\u002FCD only, git-ignored)\nCLICKUP_API_TOKEN_STAGING=pk_stg_67890_GHIJKL\nCLICKUP_TEAM_ID_STAGING=2222222\n\n# .env.production (secrets manager only, NEVER in files)\n# CLICKUP_API_TOKEN_PROD=pk_prod_... (stored in Vault\u002FAWS\u002FGCP)\n# CLICKUP_TEAM_ID_PROD=3333333\n```\n\n```bash\n# .env.example (commit this as template)\nCLICKUP_API_TOKEN=pk_your_token_here\nCLICKUP_TEAM_ID=your_team_id_here\n```\n\n## Secrets by Platform\n\n```bash\n# GitHub Actions\ngh secret set CLICKUP_API_TOKEN_STAGING --body \"pk_stg_...\"\ngh secret set CLICKUP_API_TOKEN_PROD --body \"pk_prod_...\"\n\n# AWS Secrets Manager\naws secretsmanager create-secret \\\n  --name clickup\u002Fproduction\u002Fapi-token \\\n  --secret-string \"pk_prod_...\"\n\n# GCP Secret Manager\necho -n \"pk_prod_...\" | gcloud secrets create clickup-api-token-prod --data-file=-\n\n# HashiCorp Vault\nvault kv put secret\u002Fclickup\u002Fproduction api_token=\"pk_prod_...\"\n```\n\n## Environment Guards\n\n```typescript\n\u002F\u002F Prevent destructive operations in production\nfunction guardDestructiveOp(operation: string): void {\n  const config = getClickUpConfig();\n  const env = process.env.NODE_ENV ?? 'development';\n\n  \u002F\u002F In production, require explicit confirmation\n  if (env === 'production' && !process.env.CLICKUP_ALLOW_DESTRUCTIVE) {\n    throw new Error(\n      `${operation} blocked in production. Set CLICKUP_ALLOW_DESTRUCTIVE=true to override.`\n    );\n  }\n}\n\n\u002F\u002F Usage: prevent bulk delete in prod\nasync function deleteCompletedTasks(listId: string) {\n  guardDestructiveOp('deleteCompletedTasks');\n\n  const { tasks } = await clickupRequest(\n    `\u002Flist\u002F${listId}\u002Ftask?statuses[]=complete`\n  );\n  for (const task of tasks) {\n    await clickupRequest(`\u002Ftask\u002F${task.id}`, { method: 'DELETE' });\n  }\n}\n```\n\n## Verify Environment Setup\n\n```bash\n#!\u002Fbin\u002Fbash\n# verify-clickup-env.sh\necho \"=== ClickUp Environment Verification ===\"\necho \"NODE_ENV: ${NODE_ENV:-development}\"\n\nfor ENV_SUFFIX in \"\" \"_STAGING\" \"_PROD\"; do\n  TOKEN_VAR=\"CLICKUP_API_TOKEN${ENV_SUFFIX}\"\n  TOKEN=\"${!TOKEN_VAR}\"\n\n  if [ -z \"$TOKEN\" ]; then\n    echo \"${TOKEN_VAR}: NOT SET\"\n    continue\n  fi\n\n  echo -n \"${TOKEN_VAR}: \"\n  RESULT=$(curl -sf https:\u002F\u002Fapi.clickup.com\u002Fapi\u002Fv2\u002Fuser \\\n    -H \"Authorization: $TOKEN\" 2>\u002Fdev\u002Fnull)\n  if [ $? -eq 0 ]; then\n    USERNAME=$(echo \"$RESULT\" | python3 -c \"import sys,json; print(json.load(sys.stdin)['user']['username'])\" 2>\u002Fdev\u002Fnull)\n    echo \"OK (user: $USERNAME)\"\n  else\n    echo \"FAILED\"\n  fi\ndone\n```\n\n## Error Handling\n\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| Wrong workspace in prod | Using dev token | Verify CLICKUP_TEAM_ID matches token's workspace |\n| Missing env var | Not configured | Check .env file or secrets manager |\n| Cross-env data leak | Shared token | Use separate tokens per environment |\n| Destructive op in prod | Missing guard | Implement environment guards |\n\n## Resources\n\n- [ClickUp Authentication](https:\u002F\u002Fdeveloper.clickup.com\u002Fdocs\u002Fauthentication)\n- [12-Factor App Config](https:\u002F\u002F12factor.net\u002Fconfig)\n\n## Next Steps\n\nFor observability setup, see `clickup-observability`.\n\n","# ClickUp Multi-Environment Setup\n\n## Overview\n\nConfigure separate ClickUp workspaces and API tokens for development, staging, and production. ClickUp does not have sandbox environments, so the recommended approach is separate workspaces with separate tokens per environment.\n\n## Environment Strategy\n\n| Environment | Workspace | Token | Rate Limit | Purpose |\n|-------------|-----------|-------|-----------|---------|\n| Development | Dev workspace | Personal token | 100 req\u002Fmin | Local development, testing |\n| Staging | Staging workspace | Service token | 100 req\u002Fmin | Integration testing, QA |\n| Production | Production workspace | Service token | Per plan | Live traffic |\n\n**Key point:** All ClickUp API calls go to `https:\u002F\u002Fapi.clickup.com\u002Fapi\u002Fv2\u002F` regardless of environment. Environment isolation comes from using different tokens that are authorized for different workspaces.\n\n## Configuration\n\n```typescript\n\u002F\u002F src\u002Fconfig\u002Fclickup.ts\ninterface ClickUpEnvConfig {\n  token: string;\n  teamId: string;\n  defaultListId?: string;\n  timeout: number;\n  retries: number;\n  cacheEnabled: boolean;\n  cacheTtlMs: number;\n}\n\nfunction getClickUpConfig(): ClickUpEnvConfig {\n  const env = process.env.NODE_ENV ?? 'development';\n\n  const base = {\n    timeout: 30000,\n    retries: 3,\n    cacheEnabled: true,\n    cacheTtlMs: 60000,\n  };\n\n  switch (env) {\n    case 'production':\n      return {\n        ...base,\n        token: requireEnv('CLICKUP_API_TOKEN_PROD'),\n        teamId: requireEnv('CLICKUP_TEAM_ID_PROD'),\n        retries: 5,          \u002F\u002F More retries in prod\n        cacheTtlMs: 300000,  \u002F\u002F 5 min cache in prod\n      };\n    case 'staging':\n      return {\n        ...base,\n        token: requireEnv('CLICKUP_API_TOKEN_STAGING'),\n        teamId: requireEnv('CLICKUP_TEAM_ID_STAGING'),\n      };\n    default:\n      return {\n        ...base,\n        token: requireEnv('CLICKUP_API_TOKEN'),\n        teamId: process.env.CLICKUP_TEAM_ID ?? '',\n        cacheEnabled: false,  \u002F\u002F No cache in dev for fresh data\n      };\n  }\n}\n\nfunction requireEnv(key: string): string {\n  const value = process.env[key];\n  if (!value) throw new Error(`Missing required env var: ${key}`);\n  return value;\n}\n```\n\n## Environment Files\n\n```bash\n# .env.development (local dev, git-ignored)\nCLICKUP_API_TOKEN=pk_dev_12345_ABCDEF\nCLICKUP_TEAM_ID=1111111\n\n# .env.staging (CI\u002FCD only, git-ignored)\nCLICKUP_API_TOKEN_STAGING=pk_stg_67890_GHIJKL\nCLICKUP_TEAM_ID_STAGING=2222222\n\n# .env.production (secrets manager only, NEVER in files)\n# CLICKUP_API_TOKEN_PROD=pk_prod_... (stored in Vault\u002FAWS\u002FGCP)\n# CLICKUP_TEAM_ID_PROD=3333333\n```\n\n```bash\n# .env.example (commit this as template)\nCLICKUP_API_TOKEN=pk_your_token_here\nCLICKUP_TEAM_ID=your_team_id_here\n```\n\n## Secrets by Platform\n\n```bash\n# GitHub Actions\ngh secret set CLICKUP_API_TOKEN_STAGING --body \"pk_stg_...\"\ngh secret set CLICKUP_API_TOKEN_PROD --body \"pk_prod_...\"\n\n# AWS Secrets Manager\naws secretsmanager create-secret \\\n  --name clickup\u002Fproduction\u002Fapi-token \\\n  --secret-string \"pk_prod_...\"\n\n# GCP Secret Manager\necho -n \"pk_prod_...\" | gcloud secrets create clickup-api-token-prod --data-file=-\n\n# HashiCorp Vault\nvault kv put secret\u002Fclickup\u002Fproduction api_token=\"pk_prod_...\"\n```\n\n## Environment Guards\n\n```typescript\n\u002F\u002F Prevent destructive operations in production\nfunction guardDestructiveOp(operation: string): void {\n  const config = getClickUpConfig();\n  const env = process.env.NODE_ENV ?? 'development';\n\n  \u002F\u002F In production, require explicit confirmation\n  if (env === 'production' && !process.env.CLICKUP_ALLOW_DESTRUCTIVE) {\n    throw new Error(\n      `${operation} blocked in production. Set CLICKUP_ALLOW_DESTRUCTIVE=true to override.`\n    );\n  }\n}\n\n\u002F\u002F Usage: prevent bulk delete in prod\nasync function deleteCompletedTasks(listId: string) {\n  guardDestructiveOp('deleteCompletedTasks');\n\n  const { tasks } = await clickupRequest(\n    `\u002Flist\u002F${listId}\u002Ftask?statuses[]=complete`\n  );\n  for (const task of tasks) {\n    await clickupRequest(`\u002Ftask\u002F${task.id}`, { method: 'DELETE' });\n  }\n}\n```\n\n## Verify Environment Setup\n\n```bash\n#!\u002Fbin\u002Fbash\n# verify-clickup-env.sh\necho \"=== ClickUp Environment Verification ===\"\necho \"NODE_ENV: ${NODE_ENV:-development}\"\n\nfor ENV_SUFFIX in \"\" \"_STAGING\" \"_PROD\"; do\n  TOKEN_VAR=\"CLICKUP_API_TOKEN${ENV_SUFFIX}\"\n  TOKEN=\"${!TOKEN_VAR}\"\n\n  if [ -z \"$TOKEN\" ]; then\n    echo \"${TOKEN_VAR}: NOT SET\"\n    continue\n  fi\n\n  echo -n \"${TOKEN_VAR}: \"\n  RESULT=$(curl -sf https:\u002F\u002Fapi.clickup.com\u002Fapi\u002Fv2\u002Fuser \\\n    -H \"Authorization: $TOKEN\" 2>\u002Fdev\u002Fnull)\n  if [ $? -eq 0 ]; then\n    USERNAME=$(echo \"$RESULT\" | python3 -c \"import sys,json; print(json.load(sys.stdin)['user']['username'])\" 2>\u002Fdev\u002Fnull)\n    echo \"OK (user: $USERNAME)\"\n  else\n    echo \"FAILED\"\n  fi\ndone\n```\n\n## Error Handling\n\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| Wrong workspace in prod | Using dev token | Verify CLICKUP_TEAM_ID matches token's workspace |\n| Missing env var | Not configured | Check .env file or secrets manager |\n| Cross-env data leak | Shared token | Use separate tokens per environment |\n| Destructive op in prod | Missing guard | Implement environment guards |\n\n## Resources\n\n- [ClickUp Authentication](https:\u002F\u002Fdeveloper.clickup.com\u002Fdocs\u002Fauthentication)\n- [12-Factor App Config](https:\u002F\u002F12factor.net\u002Fconfig)\n\n## Next Steps\n\nFor observability setup, see `clickup-observability`.\n\n",{"name":5,"tags":49,"author":52,"license":15,"version":53,"description":54,"allowed-tools":55,"compatible-with":56},[50,51,29],"saas","productivity","Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Configure ClickUp API access across dev, staging, and production environments\nwith per-environment tokens and workspace isolation.\nTrigger: \"clickup environments\", \"clickup staging\", \"clickup dev prod\",\n\"clickup environment setup\", \"clickup config by env\", \"clickup multi-env\".\n","Read, Write, Edit, Bash(aws:*), Bash(gcloud:*), Bash(vault:*)","claude-code","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fclickup-multi-env-setup",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":67,"prompt":77,"zipAvailable":78},[68,71,74],{"tool":69,"command":70},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill clickup-multi-env-setup",{"tool":72,"command":73},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill clickup-multi-env-setup",{"tool":75,"command":76},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill clickup-multi-env-setup","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fclickup-multi-env-setup\u002FSKILL.md",true,[],[81,95,105,114,120,127],{"skillNo":82,"name":83,"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":84,"categories":85,"keywords":91,"publishedAt":44},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[86],{"categoryNo":87,"categoryName":88,"taxonomyType":89,"taxonomyTypeDesc":90},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[92,93,94],"model","model hierarchy","model hierarchy skill",{"skillNo":96,"name":97,"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":98,"categories":99,"keywords":101,"publishedAt":44},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[100],{"categoryNo":87,"categoryName":88,"taxonomyType":89,"taxonomyTypeDesc":90},[102,103,104],"MCP","zoom","zoom mcp",{"skillNo":106,"name":107,"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":108,"categories":109,"keywords":110,"publishedAt":44},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[111,112,113,103],"sdk","zoom apps sdk","apps",{"skillNo":115,"name":116,"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":117,"categories":118,"keywords":119,"publishedAt":44},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[116],{"skillNo":121,"name":122,"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":123,"categories":124,"keywords":126,"publishedAt":44},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[125],{"categoryNo":87,"categoryName":88,"taxonomyType":89,"taxonomyTypeDesc":90},[122],{"skillNo":128,"name":129,"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":130,"categories":131,"keywords":132,"publishedAt":44},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[129]]