{"id":"b96c4c26-3ad4-4ca0-a3d1-d72814582011","shortId":"vuThv8","kind":"skill","title":"gcp","tagline":"Use when managing Google Cloud resources, editing .gcloudignore or app.yaml, scripting gcloud commands, configuring IAM, service accounts, Cloud Storage, Pub/Sub, BigQuery, Vertex AI, or GCP services.","description":"# Google Cloud Platform (GCP) Skill\n\n## Service Overview\n\nUse the dedicated `terraform` skill when the question is primarily about Terraform layout, state boundaries, brownfield import/export, workspaces, or CI-driven plan/apply workflows. Keep this `gcp` skill focused on Google Cloud services and `gcloud`-centric operations.\n\n### Core Services\n\n- **Compute**:\n  - **Cloud Run**: Serverless containers (default choice for stateless apps).\n  - **GKE**: Managed Kubernetes for complex orchestrations.\n  - **Compute Engine**: Raw VMs for specific OS/kernel needs.\n- **Data & Storage**:\n  - **Cloud Storage (GCS)**: Object storage.\n  - **Cloud SQL**: Managed PostgreSQL/MySQL/SQL Server.\n  - **BigQuery**: Serverless data warehouse (analytics).\n  - **Firestore**: NoSQL document database.\n- **AI/ML**:\n  - **Vertex AI**: Unified platform for models (Gemini, PaLM), training, and deployment.\n\n<workflow>\n\n## `gcloud` CLI & Scripting\n\n### Configuration & Auth\n\n<guardrails>\n\nAvoid interactive prompts in scripts.\n\n</guardrails>\n\n<example>\n\n```bash\n# Production/CI: Use Service Account Key or Workload Identity\ngcloud auth activate-service-account --key-file=key.json\n\n# Local Dev: User Login\ngcloud auth login\ngcloud config set project MY_PROJECT_ID\n```\n\n</example>\n\n### Scripting Best Practices\n\n#### 1. Structured Output\n\nNever parse default text output. Use `--format` (json/yaml) and `--filter`.\n\n<example>\n\n```bash\n# Bad\ngcloud compute instances list | grep RUNNING\n\n# Good (Parseable JSON)\ngcloud compute instances list --format=\"json\"\n\n# Good (Filter + Specific Value)\ngcloud run services list \\\n  --filter=\"status.conditions.status=True AND metadata.name:my-service\" \\\n  --format=\"value(status.url)\"\n```\n\n</example>\n\n#### 2. Deterministic Filters\n\nFlatten complex resources to find what you need.\n\n<example>\n\n```bash\n# Find latest revision of a service\ngcloud run revisions list \\\n  --service=my-service \\\n  --sort-by=\"~metadata.creationTimestamp\" \\\n  --limit=1 \\\n  --format=\"value(metadata.name)\"\n```\n\n</example>\n\n#### 3. Quiet Mode\n\nSuppress \"updates available\" warnings and prompts.\n\n<example>\n\n```bash\nexport CLOUDSDK_CORE_DISABLE_PROMPTS=1\ngcloud ... --quiet\n```\n\n</example>\n\n## Automation Patterns\n\n### 1. Cloud Run Deployment\n\nStandard pattern for deploying containers.\n\n<example>\n\n```bash\ngcloud run deploy my-service \\\n  --image gcr.io/my-project/my-image:tag \\\n  --platform managed \\\n  --region us-central1 \\\n  --allow-unauthenticated \\\n  --set-env-vars=\"DEBUG=true,DB_HOST=10.0.0.2\"\n```\n\n</example>\n\n### 2. Secret Management\n\n<guardrails>\n\nAccess secrets securely (requires Secret Manager API).\n\n</guardrails>\n\n<example>\n\n```bash\n# Mount as volume in Cloud Run (Preferred)\ngcloud run deploy ... --set-secrets=\"/secrets/db=my-db-secret:latest\"\n\n# Access via CLI (for ops scripts)\ngcloud secrets versions access latest --secret=\"my-secret\"\n```\n\n</example>\n\n</workflow>\n\n## AlloyDB\n\nAlloyDB is a fully managed PostgreSQL-compatible database with columnar engine and ML-assisted auto-vacuum.\n\n### Cluster / Instance Model\n\n- **Cluster**: regional resource containing one primary and optional read pool instances.\n- **Primary instance**: read-write; choose machine type and vCPUs.\n- **Read pool**: horizontally scalable read-only replicas within the same cluster.\n\n```bash\n# Create a cluster\ngcloud alloydb clusters create my-cluster \\\n  --region=us-central1 \\\n  --password=SECRET \\\n  --network=projects/MY_PROJECT/global/networks/default\n\n# Create primary instance\ngcloud alloydb instances create my-primary \\\n  --cluster=my-cluster \\\n  --region=us-central1 \\\n  --instance-type=PRIMARY \\\n  --cpu-count=4\n```\n\n### PSA Networking Requirement\n\nAlloyDB requires **Private Service Access (PSA)** — a peered VPC range allocated for Google-managed services. Client VMs must be in the same VPC (or a connected VPC) to reach the instance IP.\n\n```bash\n# Allocate PSA range (one-time per VPC)\ngcloud compute addresses create google-managed-services-default \\\n  --global \\\n  --purpose=VPC_PEERING \\\n  --prefix-length=20 \\\n  --network=default\n\n# Create the peering\ngcloud services vpc-peerings connect \\\n  --service=servicenetworking.googleapis.com \\\n  --ranges=google-managed-services-default \\\n  --network=default\n```\n\n### AlloyDB vs Cloud SQL\n\n| Aspect | AlloyDB | Cloud SQL |\n|--------|---------|-----------|\n| Engine | PostgreSQL-compatible only | PostgreSQL, MySQL, SQL Server |\n| Performance | ~4× higher throughput (columnar engine, shared memory cache) | Standard managed RDBMS |\n| HA | Auto-failover < 60 s, cross-zone | Regional replica, ~60 s failover |\n| Pricing | Higher; compute + storage separate | Instance + storage (simpler) |\n| Best for | High-throughput OLTP, mixed OLTP/OLAP | General-purpose managed SQL |\n\n---\n\n## Secret Manager Patterns\n\n### Diff-Based Updates\n\nAvoid creating unnecessary secret versions. Compare the current value before adding a new version.\n\n```bash\n# Read existing value\nCURRENT=$(gcloud secrets versions access latest --secret=\"my-secret\" 2>/dev/null || echo \"\")\n\nNEW_VALUE=\"new-password-here\"\n\nif [ \"$CURRENT\" != \"$NEW_VALUE\" ]; then\n  echo -n \"$NEW_VALUE\" | gcloud secrets versions add my-secret --data-file=-\n  echo \"Secret updated.\"\nelse\n  echo \"Secret unchanged, skipping version creation.\"\nfi\n```\n\n### Common Access Patterns\n\n```bash\n# Access the latest version\ngcloud secrets versions access latest --secret=\"my-secret\"\n\n# Access a specific version\ngcloud secrets versions access 3 --secret=\"my-secret\"\n\n# List versions\ngcloud secrets versions list my-secret\n\n# Create a new secret\necho -n \"my-value\" | gcloud secrets create my-secret \\\n  --data-file=- \\\n  --replication-policy=automatic\n```\n\n---\n\n## IAM Workload Identity\n\nWorkload Identity lets GKE or Cloud Run workloads impersonate a GCP service account without key files.\n\n### Annotation + Binding Chain\n\n```bash\n# 1. Create a GCP Service Account (GSA)\ngcloud iam service-accounts create my-app-sa \\\n  --display-name=\"My App SA\"\n\n# 2. Grant required roles to the GSA\ngcloud projects add-iam-policy-binding MY_PROJECT \\\n  --member=\"serviceAccount:my-app-sa@MY_PROJECT.iam.gserviceaccount.com\" \\\n  --role=\"roles/secretmanager.secretAccessor\"\n\n# 3. Allow the Kubernetes Service Account (KSA) to impersonate the GSA\ngcloud iam service-accounts add-iam-policy-binding \\\n  my-app-sa@MY_PROJECT.iam.gserviceaccount.com \\\n  --role=\"roles/iam.workloadIdentityUser\" \\\n  --member=\"serviceAccount:MY_PROJECT.svc.id.goog[NAMESPACE/KSA_NAME]\"\n\n# 4. Annotate the KSA\nkubectl annotate serviceaccount KSA_NAME \\\n  --namespace=NAMESPACE \\\n  iam.gke.io/gcp-service-account=my-app-sa@MY_PROJECT.iam.gserviceaccount.com\n```\n\n### Service Account Impersonation (CLI)\n\n```bash\n# Impersonate a GSA from a user or another SA\ngcloud storage ls \\\n  --impersonate-service-account=my-app-sa@MY_PROJECT.iam.gserviceaccount.com\n\n# Generate a short-lived token\ngcloud auth print-access-token \\\n  --impersonate-service-account=my-app-sa@MY_PROJECT.iam.gserviceaccount.com\n```\n\n---\n\n## VPC Networking\n\n### PSA Ranges\n\nSee AlloyDB section above. PSA is also required for Cloud SQL private IP and Memorystore.\n\n### Cloud NAT / Router\n\nCloud NAT allows VMs without external IPs to reach the internet.\n\n```bash\n# Create a Cloud Router\ngcloud compute routers create my-router \\\n  --region=us-central1 \\\n  --network=default\n\n# Attach Cloud NAT\ngcloud compute routers nats create my-nat \\\n  --router=my-router \\\n  --region=us-central1 \\\n  --auto-allocate-nat-external-ips \\\n  --nat-all-subnet-ip-ranges\n```\n\n### Firewall Rules\n\n```bash\n# IAP TCP tunneling (SSH/RDP via IAP)\ngcloud compute firewall-rules create allow-iap-ssh \\\n  --network=default \\\n  --allow=tcp:22 \\\n  --source-ranges=35.235.240.0/20 \\\n  --description=\"Allow SSH via IAP\"\n\n# GCP load balancer health checks\ngcloud compute firewall-rules create allow-health-checks \\\n  --network=default \\\n  --allow=tcp \\\n  --source-ranges=130.211.0.0/22,35.191.0.0/16 \\\n  --description=\"Allow GCP health check probers\"\n```\n\n| Purpose | CIDR |\n|---------|------|\n| IAP TCP forwarding | `35.235.240.0/20` |\n| GCP health check probers | `130.211.0.0/22`, `35.191.0.0/16` |\n\n---\n\n## Cloud Batch\n\nCloud Batch is a fully managed service for batch and HPC workloads. It provisions, schedules, and autoscales VMs (including Spot/preemptible) without managing a cluster.\n\n**When to use Cloud Batch vs GKE:**\n\n| Aspect | Cloud Batch | GKE |\n|--------|-------------|-----|\n| Workload type | Batch jobs, array jobs, MPI | Long-running services, microservices |\n| Cluster management | None (fully managed) | Cluster lifecycle managed by operator |\n| Spot/preemptible | Built-in, first-class | Node pool configuration |\n| GPU / HPC support | A100/H100, HPC VM families | Any accelerator, custom node pools |\n| Scheduling | Queue-based, job arrays | Kubernetes scheduler |\n\n```bash\n# Submit a simple batch job from JSON spec\ngcloud batch jobs submit my-job \\\n  --location=us-central1 \\\n  --config=job.json\n```\n\n---\n\n## References Index\n\n- **[IAM Guide](references/iam.md)** - Service accounts, role bindings, Workload Identity, and IAM best practices.\n\n## Cross-References\n\n- **Gemini CLI Extensions org**: <https://github.com/gemini-cli-extensions> — community-built Gemini CLI extensions for GCP services and tooling.\n\n## Documentation & References\n\n- **SDK Cheat Sheet**: `gcloud cheat-sheet`\n- **Core Services List**: [Google Cloud Products](https://cloud.google.com/products)\n- **CLI Reference**: [gcloud CLI docs](https://cloud.google.com/sdk/gcloud/reference)\n\n## Official References\n\n- <https://docs.cloud.google.com/>\n- <https://docs.cloud.google.com/sdk/gcloud/reference>\n- <https://cloud.google.com/sdk/gcloud/reference/run/deploy>\n- <https://docs.cloud.google.com/sdk/docs/authorizing>\n- <https://cloud.google.com/artifact-registry/docs/transition/transition-from-gcr>\n- <https://cloud.google.com/vertex-ai/generative-ai/docs/migrate/migrate-palm-to-gemini>\n\n## Shared Styleguide Baseline\n\n- Use shared styleguides for generic language/framework rules to reduce duplication in this skill.\n- [General Principles](https://github.com/cofin/flow/blob/main/templates/styleguides/general.md)\n- [GCP Scripting](https://github.com/cofin/flow/blob/main/templates/styleguides/cloud/gcp_scripting.md)\n- [Bash](https://github.com/cofin/flow/blob/main/templates/styleguides/languages/bash.md)\n- Keep this skill focused on tool-specific workflows, edge cases, and integration details.\n\n<validation>\n## Validation\n\nAdd validation instructions here.\n</validation>","tags":["gcp","flow","cofin","agent-skills","ai-agents","beads","claude-code","codex","cursor","developer-tools","gemini-cli","opencode"],"capabilities":["skill","source-cofin","skill-gcp","topic-agent-skills","topic-ai-agents","topic-beads","topic-claude-code","topic-codex","topic-cursor","topic-developer-tools","topic-gemini-cli","topic-opencode","topic-plugin","topic-slash-commands","topic-spec-driven-development"],"categories":["flow"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/cofin/flow/gcp","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add cofin/flow","source_repo":"https://github.com/cofin/flow","install_from":"skills.sh"}},"qualityScore":"0.455","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 11 github stars · SKILL.md body (10,460 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:07:37.196Z","embedding":null,"createdAt":"2026-04-23T13:03:59.328Z","updatedAt":"2026-05-18T19:07:37.196Z","lastSeenAt":"2026-05-18T19:07:37.196Z","tsv":"'/16':1036,1057 '/20':1005,1049 '/22':1034,1055 '/artifact-registry/docs/transition/transition-from-gcr':1245 '/cofin/flow/blob/main/templates/styleguides/cloud/gcp_scripting.md)':1274 '/cofin/flow/blob/main/templates/styleguides/general.md)':1269 '/cofin/flow/blob/main/templates/styleguides/languages/bash.md)':1278 '/dev/null':648 '/gcp-service-account=my-app-sa@my_project.iam.gserviceaccount.com':855 '/gemini-cli-extensions':1193 '/my-project/my-image:tag':300 '/products)':1222 '/sdk/docs/authorizing':1242 '/sdk/gcloud/reference':1236 '/sdk/gcloud/reference)':1230 '/sdk/gcloud/reference/run/deploy':1239 '/secrets/db':343 '/vertex-ai/generative-ai/docs/migrate/migrate-palm-to-gemini':1248 '1':177,257,276,281,770 '10.0.0.2':318 '130.211.0.0':1033,1054 '2':226,319,647,793 '20':526 '22':1000 '3':261,711,814 '35.191.0.0':1035,1056 '35.235.240.0':1004,1048 '4':464,566,842 '60':581,588 'a100/h100':1130 'acceler':1135 'access':322,349,358,472,641,687,690,697,703,710,888 'account':18,145,155,762,775,781,819,829,857,876,893,1175 'activ':153 'activate-service-account':152 'ad':629 'add':668,803,831,1294 'add-iam-policy-bind':802,830 'address':512 'ai':24,121 'ai/ml':119 'alloc':478,502,967 'allow':308,815,919,993,998,1007,1023,1028,1038 'allow-health-check':1022 'allow-iap-ssh':992 'allow-unauthent':307 'alloydb':364,365,425,443,468,548,553,900 'also':905 'analyt':114 'annot':766,843,847 'anoth':868 'api':328 'app':83,785,791 'app.yaml':11 'array':1099,1144 'aspect':552,1091 'assist':380 'attach':946 'auth':135,151,165,885 'auto':382,579,966 'auto-allocate-nat-external-ip':965 'auto-failov':578 'auto-vacuum':381 'autom':279 'automat':746 'autoscal':1076 'avail':266 'avoid':136,619 'bad':191 'balanc':1013 'base':617,1142 'baselin':1251 'bash':141,190,237,270,290,329,420,501,633,689,769,860,928,979,1147,1275 'batch':1059,1061,1068,1088,1093,1097,1151,1157 'best':175,599,1182 'bigqueri':22,110 'bind':767,806,834,1177 'boundari':49 'brownfield':50 'built':1119,1196 'built-in':1118 'cach':573 'case':1289 'central1':306,434,456,943,964,1166 'centric':70 'chain':768 'cheat':1208,1212 'cheat-sheet':1211 'check':1015,1025,1041,1052 'choic':80 'choos':403 'ci':55 'ci-driven':54 'cidr':1044 'class':1123 'cli':132,351,859,1188,1198,1223,1226 'client':484 'cloud':6,19,29,66,75,100,105,282,334,550,554,755,908,914,917,931,947,1058,1060,1087,1092,1218 'cloud.google.com':1221,1229,1238,1244,1247 'cloud.google.com/artifact-registry/docs/transition/transition-from-gcr':1243 'cloud.google.com/products)':1220 'cloud.google.com/sdk/gcloud/reference)':1228 'cloud.google.com/sdk/gcloud/reference/run/deploy':1237 'cloud.google.com/vertex-ai/generative-ai/docs/migrate/migrate-palm-to-gemini':1246 'cloudsdk':272 'cluster':384,387,419,423,426,430,449,452,1083,1107,1112 'columnar':375,569 'command':14 'common':686 'communiti':1195 'community-built':1194 'compar':624 'compat':372,559 'complex':88,230 'comput':74,90,193,202,511,593,934,950,987,1017 'config':168,1167 'configur':15,134,1126 'connect':494,537 'contain':78,289,390 'core':72,273,1214 'count':463 'cpu':462 'cpu-count':461 'creat':421,427,439,445,513,529,620,725,736,771,782,929,936,953,991,1021 'creation':684 'cross':584,1185 'cross-refer':1184 'cross-zon':583 'current':626,637,657 'custom':1136 'data':98,112,673,741 'data-fil':672,740 'databas':118,373 'db':316,346 'debug':314 'dedic':37 'default':79,182,518,528,545,547,945,997,1027 'deploy':130,284,288,293,339 'descript':1006,1037 'detail':1292 'determinist':227 'dev':161 'diff':616 'diff-bas':615 'disabl':274 'display':788 'display-nam':787 'doc':1227 'docs.cloud.google.com':1233,1235,1241 'docs.cloud.google.com/sdk/docs/authorizing':1240 'docs.cloud.google.com/sdk/gcloud/reference':1234 'document':117,1205 'driven':56 'duplic':1261 'echo':649,661,675,679,729 'edg':1288 'edit':8 'els':678 'engin':91,376,556,570 'env':312 'exist':635 'export':271 'extens':1189,1199 'extern':922,969 'failov':580,590 'famili':1133 'fi':685 'file':158,674,742,765 'filter':189,208,215,228 'find':233,238 'firestor':115 'firewal':977,989,1019 'firewall-rul':988,1018 'first':1122 'first-class':1121 'flatten':229 'focus':63,1282 'format':186,205,223,258 'forward':1047 'fulli':368,1064,1110 'gcloud':13,69,131,150,164,167,192,201,211,244,277,291,337,355,424,442,510,532,638,665,694,707,718,734,777,800,825,870,884,933,949,986,1016,1156,1210,1225 'gcloudignor':9 'gcp':1,26,31,61,760,773,1011,1039,1050,1201,1270 'gcr.io':299 'gcr.io/my-project/my-image:tag':298 'gcs':102 'gemini':126,1187,1197 'general':608,1265 'general-purpos':607 'generat':878 'generic':1256 'github.com':1192,1268,1273,1277 'github.com/cofin/flow/blob/main/templates/styleguides/cloud/gcp_scripting.md)':1272 'github.com/cofin/flow/blob/main/templates/styleguides/general.md)':1267 'github.com/cofin/flow/blob/main/templates/styleguides/languages/bash.md)':1276 'github.com/gemini-cli-extensions':1191 'gke':84,753,1090,1094 'global':519 'good':198,207 'googl':5,28,65,481,515,542,1217 'google-manag':480 'google-managed-services-default':514,541 'gpu':1127 'grant':794 'grep':196 'gsa':776,799,824,863 'guid':1172 'ha':577 'health':1014,1024,1040,1051 'high':602 'high-throughput':601 'higher':567,592 'horizont':410 'host':317 'hpc':1070,1128,1131 'iam':16,747,778,804,826,832,1171,1181 'iam.gke.io':854 'iam.gke.io/gcp-service-account=my-app-sa@my_project.iam.gserviceaccount.com':853 'iap':980,985,994,1010,1045 'id':173 'ident':149,749,751,1179 'imag':297 'imperson':758,822,858,861,874,891 'impersonate-service-account':873,890 'import/export':51 'includ':1078 'index':1170 'instanc':194,203,385,397,399,441,444,458,499,596 'instance-typ':457 'instruct':1296 'integr':1291 'interact':137 'internet':927 'ip':500,911,923,970,975 'job':1098,1100,1143,1152,1158,1162 'job.json':1168 'json':200,206,1154 'json/yaml':187 'keep':59,1279 'key':146,157,764 'key-fil':156 'key.json':159 'ksa':820,845,849 'kubectl':846 'kubernet':86,817,1145 'language/framework':1257 'latest':239,348,359,642,692,698 'layout':47 'length':525 'let':752 'lifecycl':1113 'limit':256 'list':195,204,214,247,716,721,1216 'live':882 'load':1012 'local':160 'locat':1163 'login':163,166 'long':1103 'long-run':1102 'ls':872 'machin':404 'manag':4,85,107,302,321,327,369,482,516,543,575,610,613,1065,1081,1108,1111,1114 'member':809,838 'memori':572 'memorystor':913 'metadata.creationtimestamp':255 'metadata.name':219,260 'microservic':1106 'mix':605 'ml':379 'ml-assist':378 'mode':263 'model':125,386 'mount':330 'mpi':1101 'must':486 'my-app-sa':783 'my-app-sa@my_project.iam.gserviceaccount.com':811,835,877,894 'my-clust':428,450 'my-db-secret':344 'my-job':1160 'my-nat':954 'my-primari':446 'my-rout':937,958 'my-secret':361,644,669,700,713,722,737 'my-servic':220,249,294 'my-valu':731 'my_project.svc.id.goog':840 'mysql':562 'n':662,730 'name':789,850 'namespac':851,852 'namespace/ksa_name':841 'nat':915,918,948,952,956,968,972 'nat-all-subnet-ip-rang':971 'need':97,236 'network':437,466,527,546,896,944,996,1026 'never':180 'new':631,650,653,658,663,727 'new-password-her':652 'node':1124,1137 'none':1109 'nosql':116 'object':103 'offici':1231 'oltp':604 'oltp/olap':606 'one':391,506 'one-tim':505 'op':353 'oper':71,1116 'option':394 'orchestr':89 'org':1190 'os/kernel':96 'output':179,184 'overview':34 'palm':127 'pars':181 'parseabl':199 'password':435,654 'pattern':280,286,614,688 'peer':475,522,531,536 'per':508 'perform':565 'plan/apply':57 'platform':30,123,301 'polici':745,805,833 'pool':396,409,1125,1138 'postgresql':371,558,561 'postgresql-compat':370,557 'postgresql/mysql/sql':108 'practic':176,1183 'prefer':336 'prefix':524 'prefix-length':523 'price':591 'primari':392,398,440,448,460 'primarili':44 'principl':1266 'print':887 'print-access-token':886 'privat':470,910 'prober':1042,1053 'product':1219 'production/ci':142 'project':170,172,801,808 'projects/my_project/global/networks/default':438 'prompt':138,269,275 'provis':1073 'psa':465,473,503,897,903 'pub/sub':21 'purpos':520,609,1043 'question':42 'queue':1141 'queue-bas':1140 'quiet':262,278 'rang':477,504,540,898,976,1003,1032 'raw':92 'rdbms':576 'reach':497,925 'read':395,401,408,413,634 'read-on':412 'read-writ':400 'reduc':1260 'refer':1169,1186,1206,1224,1232 'references/iam.md':1173 'region':303,388,431,453,586,940,961 'replic':744 'replica':415,587 'replication-polici':743 'requir':325,467,469,795,906 'resourc':7,231,389 'revis':240,246 'role':796,812,836,1176 'roles/iam.workloadidentityuser':837 'roles/secretmanager.secretaccessor':813 'router':916,932,935,939,951,957,960 'rule':978,990,1020,1258 'run':76,197,212,245,283,292,335,338,756,1104 'sa':786,792,869 'scalabl':411 'schedul':1074,1139,1146 'script':12,133,140,174,354,1271 'sdk':1207 'secret':320,323,326,342,347,356,360,363,436,612,622,639,643,646,666,671,676,680,695,699,702,708,712,715,719,724,728,735,739 'section':901 'secur':324 'see':899 'separ':595 'server':109,564 'serverless':77,111 'servic':17,27,33,67,73,144,154,213,222,243,248,251,296,471,483,517,533,538,544,761,774,780,818,828,856,875,892,1066,1105,1174,1202,1215 'service-account':779,827 'serviceaccount':810,839,848 'servicenetworking.googleapis.com':539 'set':169,311,341 'set-env-var':310 'set-secret':340 'share':571,1249,1253 'sheet':1209,1213 'short':881 'short-liv':880 'simpl':1150 'simpler':598 'skill':32,39,62,1264,1281 'skill-gcp' 'skip':682 'sort':253 'sort-bi':252 'sourc':1002,1031 'source-cofin' 'source-rang':1001,1030 'spec':1155 'specif':95,209,705,1286 'spot/preemptible':1079,1117 'sql':106,551,555,563,611,909 'ssh':995,1008 'ssh/rdp':983 'standard':285,574 'state':48 'stateless':82 'status.conditions.status':216 'status.url':225 'storag':20,99,101,104,594,597,871 'structur':178 'styleguid':1250,1254 'submit':1148,1159 'subnet':974 'support':1129 'suppress':264 'tcp':981,999,1029,1046 'terraform':38,46 'text':183 'throughput':568,603 'time':507 'token':883,889 'tool':1204,1285 'tool-specif':1284 'topic-agent-skills' 'topic-ai-agents' 'topic-beads' 'topic-claude-code' 'topic-codex' 'topic-cursor' 'topic-developer-tools' 'topic-gemini-cli' 'topic-opencode' 'topic-plugin' 'topic-slash-commands' 'topic-spec-driven-development' 'train':128 'true':217,315 'tunnel':982 'type':405,459,1096 'unauthent':309 'unchang':681 'unifi':122 'unnecessari':621 'updat':265,618,677 'us':305,433,455,942,963,1165 'us-central1':304,432,454,941,962,1164 'use':2,35,143,185,1086,1252 'user':162,866 'vacuum':383 'valid':1293,1295 'valu':210,224,259,627,636,651,659,664,733 'var':313 'vcpus':407 'version':357,623,632,640,667,683,693,696,706,709,717,720 'vertex':23,120 'via':350,984,1009 'vm':1132 'vms':93,485,920,1077 'volum':332 'vpc':476,491,495,509,521,535,895 'vpc-peer':534 'vs':549,1089 'warehous':113 'warn':267 'within':416 'without':763,921,1080 'workflow':58,1287 'workload':148,748,750,757,1071,1095,1178 'workspac':52 'write':402 'zone':585","prices":[{"id":"f3cf3ab3-52ba-40e5-8b90-9e7c456569c7","listingId":"b96c4c26-3ad4-4ca0-a3d1-d72814582011","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"cofin","category":"flow","install_from":"skills.sh"},"createdAt":"2026-04-23T13:03:59.328Z"}],"sources":[{"listingId":"b96c4c26-3ad4-4ca0-a3d1-d72814582011","source":"github","sourceId":"cofin/flow/gcp","sourceUrl":"https://github.com/cofin/flow/tree/main/skills/gcp","isPrimary":false,"firstSeenAt":"2026-04-23T13:03:59.328Z","lastSeenAt":"2026-05-18T19:07:37.196Z"}],"details":{"listingId":"b96c4c26-3ad4-4ca0-a3d1-d72814582011","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"cofin","slug":"gcp","github":{"repo":"cofin/flow","stars":11,"topics":["agent-skills","ai-agents","beads","claude-code","codex","context-driven-development","cursor","developer-tools","gemini-cli","opencode","plugin","slash-commands","spec-driven-development","subagents","tdd","workflow"],"license":"apache-2.0","html_url":"https://github.com/cofin/flow","pushed_at":"2026-04-27T19:07:26Z","description":"Context-Driven Development toolkit for AI agents — spec-first planning, TDD workflow, and Beads integration.","skill_md_sha":"a14db7af6542cf3421be61c121d05f756d30be8b","skill_md_path":"skills/gcp/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/cofin/flow/tree/main/skills/gcp"},"layout":"multi","source":"github","category":"flow","frontmatter":{"name":"gcp","description":"Use when managing Google Cloud resources, editing .gcloudignore or app.yaml, scripting gcloud commands, configuring IAM, service accounts, Cloud Storage, Pub/Sub, BigQuery, Vertex AI, or GCP services."},"skills_sh_url":"https://skills.sh/cofin/flow/gcp"},"updatedAt":"2026-05-18T19:07:37.196Z"}}