[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F75YH7YD55P3GYTY0G4HDP":3,"skill-same:01M6F75YH7YD55P3GYTY0G4HDP":76},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":53,"commitSha":54,"skillDirectory":55,"forksCount":56,"repositoryHtmlUrl":57,"repositoryHomepageUrl":6,"ownerHtmlUrl":58,"ownerBlogUrl":59,"ownerDescription":60,"updatedAt":61,"install":62,"resources":75},"01M6F75YH7YD55P3GYTY0G4HDP","guidewire-multi-env-setup",null,"Configure multi-environment setup for Guidewire InsuranceSuite including development,\nstaging, and production environments with proper isolation and promotion workflows.\nTrigger with phrases like \"guidewire environments\", \"multi-environment\",\n\"dev staging production\", \"environment configuration\", \"environment promotion\".","Dicklesworthstone\u002Fpi_agent_rust","Dicklesworthstone","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F35050222?v=4","01M6CG26AR942CSVMN1M5E3DSE","Jeff Emanuel","01M6CG26EPP71PSHW1VDS71121",1992,"MIT","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fguidewire-pack\u002Fskills\u002Fguidewire-multi-env-setup\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"setup","guidewire multi env setup","multi","env setup","env","for","workflows","environments","environment setup","promotion","with","trigger","io","isolation","gradle","multi-environment","environment","edit","write","read","curl","configure","Bash","dev","development","2026-11-10 10:12:30",false,"---\nname: guidewire-multi-env-setup\ndescription: |\n  Configure multi-environment setup for Guidewire InsuranceSuite including development,\n  staging, and production environments with proper isolation and promotion workflows.\n  Trigger with phrases like \"guidewire environments\", \"multi-environment\",\n  \"dev staging production\", \"environment configuration\", \"environment promotion\".\nallowed-tools: Read, Write, Edit, Bash(curl:*), Bash(gradle:*), Grep\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\n---\n\n# Guidewire Multi-Environment Setup\n\n## Overview\n\nConfigure and manage multiple Guidewire InsuranceSuite environments with proper isolation, configuration management, and promotion workflows.\n\n## Prerequisites\n\n- Guidewire Cloud Console access for all environments\n- Understanding of environment promotion workflows\n- Git-based configuration management\n- CI\u002FCD pipeline infrastructure\n\n## Environment Topology\n\n```\n┌─────────────────────────────────────────────────────────────────────────────────┐\n│                           Environment Landscape                                  │\n├─────────────────────────────────────────────────────────────────────────────────┤\n│                                                                                  │\n│  ┌───────────┐    ┌───────────┐    ┌───────────┐    ┌───────────┐              │\n│  │    DEV    │───▶│    QA     │───▶│    UAT    │───▶│   PROD    │              │\n│  │           │    │           │    │           │    │           │              │\n│  │ Feature   │    │ Integration│   │ Acceptance│    │ Production│              │\n│  │ Development│   │ Testing   │    │ Testing   │    │           │              │\n│  └───────────┘    └───────────┘    └───────────┘    └───────────┘              │\n│       │                │                │                │                      │\n│       ▼                ▼                ▼                ▼                      │\n│  ┌─────────────────────────────────────────────────────────────────────────┐   │\n│  │                    Shared Infrastructure                                 │   │\n│  │  • Identity Provider (Guidewire Hub)                                    │   │\n│  │  • Document Storage                                                      │   │\n│  │  • Monitoring\u002FLogging                                                    │   │\n│  └─────────────────────────────────────────────────────────────────────────┘   │\n│                                                                                  │\n└─────────────────────────────────────────────────────────────────────────────────┘\n```\n\n## Instructions\n\n### Step 1: Environment Configuration Files\n\n```bash\n# Project structure for multi-environment config\nconfig\u002F\n├── environments\u002F\n│   ├── base\u002F                    # Shared configuration\n│   │   ├── database.properties\n│   │   ├── logging.properties\n│   │   └── integration.properties\n│   ├── dev\u002F\n│   │   ├── env.properties\n│   │   └── secrets.encrypted\n│   ├── qa\u002F\n│   │   ├── env.properties\n│   │   └── secrets.encrypted\n│   ├── uat\u002F\n│   │   ├── env.properties\n│   │   └── secrets.encrypted\n│   └── prod\u002F\n│       ├── env.properties\n│       └── secrets.encrypted\n└── gradle.properties           # Build properties\n```\n\n### Step 2: Environment-Specific Properties\n\n```properties\n# config\u002Fenvironments\u002Fdev\u002Fenv.properties\nenvironment=development\nenvironment.code=DEV\n\n# Guidewire Cloud endpoints\ngw.tenant.id=your-tenant-dev\ngw.hub.url=https:\u002F\u002Fhub-dev.guidewire.com\ngw.api.base.url=https:\u002F\u002Fyour-tenant-dev.cloud.guidewire.com\n\n# Application URLs\npolicycenter.url=${gw.api.base.url}\u002Fpc\u002Frest\nclaimcenter.url=${gw.api.base.url}\u002Fcc\u002Frest\nbillingcenter.url=${gw.api.base.url}\u002Fbc\u002Frest\n\n# Database (Guidewire managed)\ndatabase.readonly.enabled=false\n\n# Logging\nlogging.level.root=DEBUG\nlogging.level.gw.api=DEBUG\nlogging.level.gw.custom=DEBUG\n\n# Features\nfeature.debug.enabled=true\nfeature.sample.data.enabled=true\nfeature.mock.integrations=true\n\n# Integration endpoints (mocked in dev)\nintegration.rating.url=http:\u002F\u002Flocalhost:8081\u002Fmock\u002Frating\nintegration.mvr.url=http:\u002F\u002Flocalhost:8081\u002Fmock\u002Fmvr\nintegration.credit.url=http:\u002F\u002Flocalhost:8081\u002Fmock\u002Fcredit\n```\n\n```properties\n# config\u002Fenvironments\u002Fprod\u002Fenv.properties\nenvironment=production\nenvironment.code=PROD\n\n# Guidewire Cloud endpoints\ngw.tenant.id=your-tenant-prod\ngw.hub.url=https:\u002F\u002Fhub.guidewire.com\ngw.api.base.url=https:\u002F\u002Fyour-tenant.cloud.guidewire.com\n\n# Application URLs\npolicycenter.url=${gw.api.base.url}\u002Fpc\u002Frest\nclaimcenter.url=${gw.api.base.url}\u002Fcc\u002Frest\nbillingcenter.url=${gw.api.base.url}\u002Fbc\u002Frest\n\n# Database\ndatabase.readonly.enabled=false\n\n# Logging\nlogging.level.root=WARN\nlogging.level.gw.api=INFO\nlogging.level.gw.custom=INFO\n\n# Features\nfeature.debug.enabled=false\nfeature.sample.data.enabled=false\nfeature.mock.integrations=false\n\n# Integration endpoints (production)\nintegration.rating.url=https:\u002F\u002Frating.production.com\u002Fapi\nintegration.mvr.url=https:\u002F\u002Fmvr.production.com\u002Fapi\nintegration.credit.url=https:\u002F\u002Fcredit.production.com\u002Fapi\n```\n\n### Step 3: Gradle Environment Configuration\n\n```groovy\n\u002F\u002F build.gradle\nplugins {\n    id 'com.guidewire.gradle' version '10.12.0'\n}\n\n\u002F\u002F Environment-specific configuration\next {\n    environment = project.findProperty('env') ?: 'dev'\n    envConfigDir = file(\"config\u002Fenvironments\u002F${environment}\")\n}\n\n\u002F\u002F Load environment properties\ndef loadEnvProperties() {\n    def props = new Properties()\n\n    \u002F\u002F Load base properties\n    file('config\u002Fenvironments\u002Fbase').eachFile { f ->\n        if (f.name.endsWith('.properties')) {\n            props.load(f.newReader())\n        }\n    }\n\n    \u002F\u002F Load environment-specific properties (override base)\n    envConfigDir.eachFile { f ->\n        if (f.name.endsWith('.properties')) {\n            props.load(f.newReader())\n        }\n    }\n\n    return props\n}\n\next.envProps = loadEnvProperties()\n\n\u002F\u002F Configure Guidewire plugin with environment\nguidewire {\n    server {\n        environment = project.ext.environment\n        properties = project.ext.envProps\n    }\n}\n\n\u002F\u002F Tasks for each environment\n['dev', 'qa', 'uat', 'prod'].each { env ->\n    tasks.register(\"deploy${env.capitalize()}\") {\n        description = \"Deploy to ${env} environment\"\n        group = 'deployment'\n\n        doLast {\n            println \"Deploying to ${env}...\"\n            \u002F\u002F Deployment logic here\n        }\n    }\n}\n\n\u002F\u002F Validate environment configuration\ntasks.register('validateEnvConfig') {\n    description = 'Validate environment configuration'\n    doLast {\n        def requiredProps = [\n            'gw.tenant.id',\n            'gw.hub.url',\n            'gw.api.base.url'\n        ]\n\n        requiredProps.each { prop ->\n            if (!project.ext.envProps.containsKey(prop)) {\n                throw new GradleException(\"Missing required property: ${prop}\")\n            }\n        }\n\n        println \"Environment configuration valid for: ${project.ext.environment}\"\n    }\n}\n```\n\n### Step 4: Environment Manager\n\n```typescript\n\u002F\u002F Multi-environment configuration manager\ninterface EnvironmentConfig {\n  name: string;\n  code: string;\n  tenantId: string;\n  hubUrl: string;\n  apiBaseUrl: string;\n  features: Record\u003Cstring, boolean>;\n  integrations: Record\u003Cstring, string>;\n}\n\nclass EnvironmentManager {\n  private configs: Map\u003Cstring, EnvironmentConfig> = new Map();\n\n  constructor() {\n    this.loadConfigurations();\n  }\n\n  private loadConfigurations(): void {\n    this.configs.set('dev', {\n      name: 'Development',\n      code: 'DEV',\n      tenantId: process.env.GW_TENANT_DEV!,\n      hubUrl: 'https:\u002F\u002Fhub-dev.guidewire.com',\n      apiBaseUrl: `https:\u002F\u002F${process.env.GW_TENANT_DEV}.cloud.guidewire.com`,\n      features: {\n        debug: true,\n        sampleData: true,\n        mockIntegrations: true\n      },\n      integrations: {\n        rating: 'http:\u002F\u002Flocalhost:8081\u002Fmock\u002Frating',\n        mvr: 'http:\u002F\u002Flocalhost:8081\u002Fmock\u002Fmvr'\n      }\n    });\n\n    this.configs.set('prod', {\n      name: 'Production',\n      code: 'PROD',\n      tenantId: process.env.GW_TENANT_PROD!,\n      hubUrl: 'https:\u002F\u002Fhub.guidewire.com',\n      apiBaseUrl: `https:\u002F\u002F${process.env.GW_TENANT_PROD}.cloud.guidewire.com`,\n      features: {\n        debug: false,\n        sampleData: false,\n        mockIntegrations: false\n      },\n      integrations: {\n        rating: 'https:\u002F\u002Frating.production.com\u002Fapi',\n        mvr: 'https:\u002F\u002Fmvr.production.com\u002Fapi'\n      }\n    });\n  }\n\n  getConfig(env: string): EnvironmentConfig {\n    const config = this.configs.get(env);\n    if (!config) {\n      throw new Error(`Unknown environment: ${env}`);\n    }\n    return config;\n  }\n\n  getCurrentEnvironment(): string {\n    return process.env.GW_ENVIRONMENT || 'dev';\n  }\n\n  isFeatureEnabled(feature: string): boolean {\n    const config = this.getConfig(this.getCurrentEnvironment());\n    return config.features[feature] ?? false;\n  }\n}\n\n\u002F\u002F Environment-aware API client\nclass EnvironmentAwareClient {\n  private envManager: EnvironmentManager;\n  private tokenManager: TokenManager;\n\n  constructor() {\n    this.envManager = new EnvironmentManager();\n    const config = this.envManager.getConfig(this.envManager.getCurrentEnvironment());\n\n    this.tokenManager = new TokenManager({\n      clientId: this.getClientId(),\n      clientSecret: this.getClientSecret(),\n      hubUrl: config.hubUrl\n    });\n  }\n\n  private getClientId(): string {\n    const env = this.envManager.getCurrentEnvironment();\n    return process.env[`GW_CLIENT_ID_${env.toUpperCase()}`]!;\n  }\n\n  private getClientSecret(): string {\n    const env = this.envManager.getCurrentEnvironment();\n    return process.env[`GW_CLIENT_SECRET_${env.toUpperCase()}`]!;\n  }\n\n  async request\u003CT>(path: string, options?: RequestOptions): Promise\u003CT> {\n    const config = this.envManager.getConfig(this.envManager.getCurrentEnvironment());\n    const token = await this.tokenManager.getToken();\n\n    const response = await fetch(`${config.apiBaseUrl}${path}`, {\n      ...options,\n      headers: {\n        ...options?.headers,\n        'Authorization': `Bearer ${token}`,\n        'X-GW-Environment': config.code\n      }\n    });\n\n    return response.json();\n  }\n}\n```\n\n### Step 5: Secrets Management\n\n```typescript\n\u002F\u002F Secure secrets management for multiple environments\nimport { SecretManagerServiceClient } from '@google-cloud\u002Fsecret-manager';\n\ninterface EnvironmentSecrets {\n  clientId: string;\n  clientSecret: string;\n  webhookSecret: string;\n  encryptionKey: string;\n}\n\nclass SecretsManager {\n  private client: SecretManagerServiceClient;\n  private projectId: string;\n\n  constructor(projectId: string) {\n    this.client = new SecretManagerServiceClient();\n    this.projectId = projectId;\n  }\n\n  async getSecrets(environment: string): Promise\u003CEnvironmentSecrets> {\n    const prefix = `gw-${environment}`;\n\n    const [clientId, clientSecret, webhookSecret, encryptionKey] = await Promise.all([\n      this.getSecret(`${prefix}-client-id`),\n      this.getSecret(`${prefix}-client-secret`),\n      this.getSecret(`${prefix}-webhook-secret`),\n      this.getSecret(`${prefix}-encryption-key`)\n    ]);\n\n    return {\n      clientId,\n      clientSecret,\n      webhookSecret,\n      encryptionKey\n    };\n  }\n\n  private async getSecret(secretName: string): Promise\u003Cstring> {\n    const name = `projects\u002F${this.projectId}\u002Fsecrets\u002F${secretName}\u002Fversions\u002Flatest`;\n\n    const [response] = await this.client.accessSecretVersion({ name });\n    return response.payload?.data?.toString() || '';\n  }\n\n  async rotateSecret(environment: string, secretName: string, newValue: string): Promise\u003Cvoid> {\n    const fullName = `gw-${environment}-${secretName}`;\n    const parent = `projects\u002F${this.projectId}\u002Fsecrets\u002F${fullName}`;\n\n    \u002F\u002F Add new version\n    await this.client.addSecretVersion({\n      parent,\n      payload: {\n        data: Buffer.from(newValue)\n      }\n    });\n\n    console.log(`Rotated secret: ${fullName}`);\n  }\n}\n```\n\n### Step 6: Environment Promotion Workflow\n\n```typescript\n\u002F\u002F Environment promotion automation\ninterface PromotionRequest {\n  sourceEnv: string;\n  targetEnv: string;\n  packageVersion: string;\n  approver: string;\n  changeTicket: string;\n}\n\nclass EnvironmentPromotion {\n  private allowedPromotionPaths = [\n    ['dev', 'qa'],\n    ['qa', 'uat'],\n    ['uat', 'prod']\n  ];\n\n  async promote(request: PromotionRequest): Promise\u003CPromotionResult> {\n    \u002F\u002F Validate promotion path\n    this.validatePromotionPath(request.sourceEnv, request.targetEnv);\n\n    \u002F\u002F Pre-promotion checks\n    await this.runPrePromotionChecks(request);\n\n    \u002F\u002F Get package from source\n    const package = await this.getPackageFromEnvironment(\n      request.sourceEnv,\n      request.packageVersion\n    );\n\n    \u002F\u002F Deploy to target\n    const deploymentId = await this.deployToEnvironment(\n      request.targetEnv,\n      package\n    );\n\n    \u002F\u002F Wait for deployment\n    await this.waitForDeployment(deploymentId);\n\n    \u002F\u002F Run post-promotion validation\n    await this.runPostPromotionValidation(request.targetEnv);\n\n    \u002F\u002F Record promotion\n    return await this.recordPromotion(request, deploymentId);\n  }\n\n  private validatePromotionPath(source: string, target: string): void {\n    const isValid = this.allowedPromotionPaths.some(\n      ([from, to]) => from === source && to === target\n    );\n\n    if (!isValid) {\n      throw new Error(`Invalid promotion path: ${source} -> ${target}`);\n    }\n  }\n\n  private async runPrePromotionChecks(request: PromotionRequest): Promise\u003Cvoid> {\n    \u002F\u002F Check change ticket is approved\n    if (request.targetEnv === 'prod') {\n      const ticketApproved = await this.checkChangeTicketApproved(request.changeTicket);\n      if (!ticketApproved) {\n        throw new Error('Change ticket not approved for production promotion');\n      }\n    }\n\n    \u002F\u002F Check source environment is stable\n    const sourceHealth = await this.checkEnvironmentHealth(request.sourceEnv);\n    if (!sourceHealth.healthy) {\n      throw new Error(`Source environment unhealthy: ${sourceHealth.issues.join(', ')}`);\n    }\n\n    \u002F\u002F Check target environment is available\n    const targetAvailable = await this.checkEnvironmentAvailable(request.targetEnv);\n    if (!targetAvailable) {\n      throw new Error('Target environment not available for deployment');\n    }\n  }\n\n  private async runPostPromotionValidation(environment: string): Promise\u003Cvoid> {\n    \u002F\u002F Run smoke tests\n    const smokeResults = await this.runSmokeTests(environment);\n    if (!smokeResults.passed) {\n      throw new Error(`Smoke tests failed: ${smokeResults.failures.join(', ')}`);\n    }\n\n    \u002F\u002F Verify critical integrations\n    const integrationResults = await this.verifyIntegrations(environment);\n    if (!integrationResults.allHealthy) {\n      console.warn('Some integrations unhealthy:', integrationResults.unhealthy);\n    }\n  }\n}\n```\n\n### Step 7: Environment Health Dashboard\n\n```typescript\n\u002F\u002F Environment health monitoring\ninterface EnvironmentHealth {\n  environment: string;\n  status: 'healthy' | 'degraded' | 'unhealthy';\n  components: ComponentHealth[];\n  lastUpdated: Date;\n}\n\ninterface ComponentHealth {\n  name: string;\n  status: 'up' | 'down' | 'degraded';\n  latency?: number;\n  errorRate?: number;\n}\n\nclass EnvironmentHealthMonitor {\n  private environments = ['dev', 'qa', 'uat', 'prod'];\n\n  async checkAllEnvironments(): Promise\u003CMap\u003Cstring, EnvironmentHealth>> {\n    const results = new Map\u003Cstring, EnvironmentHealth>();\n\n    await Promise.all(\n      this.environments.map(async (env) => {\n        const health = await this.checkEnvironment(env);\n        results.set(env, health);\n      })\n    );\n\n    return results;\n  }\n\n  async checkEnvironment(env: string): Promise\u003CEnvironmentHealth> {\n    const envManager = new EnvironmentManager();\n    const config = envManager.getConfig(env);\n\n    const components = await Promise.all([\n      this.checkPolicyCenter(config),\n      this.checkClaimCenter(config),\n      this.checkBillingCenter(config),\n      this.checkIntegrations(config)\n    ]);\n\n    const unhealthyCount = components.filter(c => c.status === 'down').length;\n    const degradedCount = components.filter(c => c.status === 'degraded').length;\n\n    let status: EnvironmentHealth['status'] = 'healthy';\n    if (unhealthyCount > 0) {\n      status = 'unhealthy';\n    } else if (degradedCount > 0) {\n      status = 'degraded';\n    }\n\n    return {\n      environment: env,\n      status,\n      components,\n      lastUpdated: new Date()\n    };\n  }\n\n  private async checkPolicyCenter(config: EnvironmentConfig): Promise\u003CComponentHealth> {\n    const startTime = Date.now();\n    try {\n      const response = await fetch(`${config.apiBaseUrl}\u002Fpc\u002Frest\u002Fcommon\u002Fv1\u002Fsystem-info`);\n      return {\n        name: 'PolicyCenter',\n        status: response.ok ? 'up' : 'degraded',\n        latency: Date.now() - startTime\n      };\n    } catch {\n      return { name: 'PolicyCenter', status: 'down' };\n    }\n  }\n}\n```\n\n## Environment Matrix\n\n| Aspect | DEV | QA | UAT | PROD |\n|--------|-----|-----|-----|------|\n| Purpose | Development | Integration Testing | Acceptance | Live |\n| Data | Synthetic | Anonymized | Prod-like | Production |\n| Integrations | Mocked | Sandbox | Sandbox | Production |\n| Access | Developers | QA Team | Business Users | Restricted |\n| Refresh Cycle | On-demand | Weekly | Monthly | N\u002FA |\n| Monitoring | Basic | Standard | Standard | Comprehensive |\n\n## Output\n\n- Environment configuration structure\n- Gradle multi-environment build\n- Secrets management integration\n- Promotion workflow automation\n- Health monitoring dashboard\n\n## Resources\n\n- [Guidewire Cloud Console](https:\u002F\u002Fgcc.guidewire.com\u002F)\n- [Environment Management](https:\u002F\u002Fdocs.guidewire.com\u002Fcloud\u002F)\n\n## Next Steps\n\nFor monitoring and observability, see `guidewire-observability`.\n","# Guidewire Multi-Environment Setup\n\n## Overview\n\nConfigure and manage multiple Guidewire InsuranceSuite environments with proper isolation, configuration management, and promotion workflows.\n\n## Prerequisites\n\n- Guidewire Cloud Console access for all environments\n- Understanding of environment promotion workflows\n- Git-based configuration management\n- CI\u002FCD pipeline infrastructure\n\n## Environment Topology\n\n```\n┌─────────────────────────────────────────────────────────────────────────────────┐\n│                           Environment Landscape                                  │\n├─────────────────────────────────────────────────────────────────────────────────┤\n│                                                                                  │\n│  ┌───────────┐    ┌───────────┐    ┌───────────┐    ┌───────────┐              │\n│  │    DEV    │───▶│    QA     │───▶│    UAT    │───▶│   PROD    │              │\n│  │           │    │           │    │           │    │           │              │\n│  │ Feature   │    │ Integration│   │ Acceptance│    │ Production│              │\n│  │ Development│   │ Testing   │    │ Testing   │    │           │              │\n│  └───────────┘    └───────────┘    └───────────┘    └───────────┘              │\n│       │                │                │                │                      │\n│       ▼                ▼                ▼                ▼                      │\n│  ┌─────────────────────────────────────────────────────────────────────────┐   │\n│  │                    Shared Infrastructure                                 │   │\n│  │  • Identity Provider (Guidewire Hub)                                    │   │\n│  │  • Document Storage                                                      │   │\n│  │  • Monitoring\u002FLogging                                                    │   │\n│  └─────────────────────────────────────────────────────────────────────────┘   │\n│                                                                                  │\n└─────────────────────────────────────────────────────────────────────────────────┘\n```\n\n## Instructions\n\n### Step 1: Environment Configuration Files\n\n```bash\n# Project structure for multi-environment config\nconfig\u002F\n├── environments\u002F\n│   ├── base\u002F                    # Shared configuration\n│   │   ├── database.properties\n│   │   ├── logging.properties\n│   │   └── integration.properties\n│   ├── dev\u002F\n│   │   ├── env.properties\n│   │   └── secrets.encrypted\n│   ├── qa\u002F\n│   │   ├── env.properties\n│   │   └── secrets.encrypted\n│   ├── uat\u002F\n│   │   ├── env.properties\n│   │   └── secrets.encrypted\n│   └── prod\u002F\n│       ├── env.properties\n│       └── secrets.encrypted\n└── gradle.properties           # Build properties\n```\n\n### Step 2: Environment-Specific Properties\n\n```properties\n# config\u002Fenvironments\u002Fdev\u002Fenv.properties\nenvironment=development\nenvironment.code=DEV\n\n# Guidewire Cloud endpoints\ngw.tenant.id=your-tenant-dev\ngw.hub.url=https:\u002F\u002Fhub-dev.guidewire.com\ngw.api.base.url=https:\u002F\u002Fyour-tenant-dev.cloud.guidewire.com\n\n# Application URLs\npolicycenter.url=${gw.api.base.url}\u002Fpc\u002Frest\nclaimcenter.url=${gw.api.base.url}\u002Fcc\u002Frest\nbillingcenter.url=${gw.api.base.url}\u002Fbc\u002Frest\n\n# Database (Guidewire managed)\ndatabase.readonly.enabled=false\n\n# Logging\nlogging.level.root=DEBUG\nlogging.level.gw.api=DEBUG\nlogging.level.gw.custom=DEBUG\n\n# Features\nfeature.debug.enabled=true\nfeature.sample.data.enabled=true\nfeature.mock.integrations=true\n\n# Integration endpoints (mocked in dev)\nintegration.rating.url=http:\u002F\u002Flocalhost:8081\u002Fmock\u002Frating\nintegration.mvr.url=http:\u002F\u002Flocalhost:8081\u002Fmock\u002Fmvr\nintegration.credit.url=http:\u002F\u002Flocalhost:8081\u002Fmock\u002Fcredit\n```\n\n```properties\n# config\u002Fenvironments\u002Fprod\u002Fenv.properties\nenvironment=production\nenvironment.code=PROD\n\n# Guidewire Cloud endpoints\ngw.tenant.id=your-tenant-prod\ngw.hub.url=https:\u002F\u002Fhub.guidewire.com\ngw.api.base.url=https:\u002F\u002Fyour-tenant.cloud.guidewire.com\n\n# Application URLs\npolicycenter.url=${gw.api.base.url}\u002Fpc\u002Frest\nclaimcenter.url=${gw.api.base.url}\u002Fcc\u002Frest\nbillingcenter.url=${gw.api.base.url}\u002Fbc\u002Frest\n\n# Database\ndatabase.readonly.enabled=false\n\n# Logging\nlogging.level.root=WARN\nlogging.level.gw.api=INFO\nlogging.level.gw.custom=INFO\n\n# Features\nfeature.debug.enabled=false\nfeature.sample.data.enabled=false\nfeature.mock.integrations=false\n\n# Integration endpoints (production)\nintegration.rating.url=https:\u002F\u002Frating.production.com\u002Fapi\nintegration.mvr.url=https:\u002F\u002Fmvr.production.com\u002Fapi\nintegration.credit.url=https:\u002F\u002Fcredit.production.com\u002Fapi\n```\n\n### Step 3: Gradle Environment Configuration\n\n```groovy\n\u002F\u002F build.gradle\nplugins {\n    id 'com.guidewire.gradle' version '10.12.0'\n}\n\n\u002F\u002F Environment-specific configuration\next {\n    environment = project.findProperty('env') ?: 'dev'\n    envConfigDir = file(\"config\u002Fenvironments\u002F${environment}\")\n}\n\n\u002F\u002F Load environment properties\ndef loadEnvProperties() {\n    def props = new Properties()\n\n    \u002F\u002F Load base properties\n    file('config\u002Fenvironments\u002Fbase').eachFile { f ->\n        if (f.name.endsWith('.properties')) {\n            props.load(f.newReader())\n        }\n    }\n\n    \u002F\u002F Load environment-specific properties (override base)\n    envConfigDir.eachFile { f ->\n        if (f.name.endsWith('.properties')) {\n            props.load(f.newReader())\n        }\n    }\n\n    return props\n}\n\next.envProps = loadEnvProperties()\n\n\u002F\u002F Configure Guidewire plugin with environment\nguidewire {\n    server {\n        environment = project.ext.environment\n        properties = project.ext.envProps\n    }\n}\n\n\u002F\u002F Tasks for each environment\n['dev', 'qa', 'uat', 'prod'].each { env ->\n    tasks.register(\"deploy${env.capitalize()}\") {\n        description = \"Deploy to ${env} environment\"\n        group = 'deployment'\n\n        doLast {\n            println \"Deploying to ${env}...\"\n            \u002F\u002F Deployment logic here\n        }\n    }\n}\n\n\u002F\u002F Validate environment configuration\ntasks.register('validateEnvConfig') {\n    description = 'Validate environment configuration'\n    doLast {\n        def requiredProps = [\n            'gw.tenant.id',\n            'gw.hub.url',\n            'gw.api.base.url'\n        ]\n\n        requiredProps.each { prop ->\n            if (!project.ext.envProps.containsKey(prop)) {\n                throw new GradleException(\"Missing required property: ${prop}\")\n            }\n        }\n\n        println \"Environment configuration valid for: ${project.ext.environment}\"\n    }\n}\n```\n\n### Step 4: Environment Manager\n\n```typescript\n\u002F\u002F Multi-environment configuration manager\ninterface EnvironmentConfig {\n  name: string;\n  code: string;\n  tenantId: string;\n  hubUrl: string;\n  apiBaseUrl: string;\n  features: Record\u003Cstring, boolean>;\n  integrations: Record\u003Cstring, string>;\n}\n\nclass EnvironmentManager {\n  private configs: Map\u003Cstring, EnvironmentConfig> = new Map();\n\n  constructor() {\n    this.loadConfigurations();\n  }\n\n  private loadConfigurations(): void {\n    this.configs.set('dev', {\n      name: 'Development',\n      code: 'DEV',\n      tenantId: process.env.GW_TENANT_DEV!,\n      hubUrl: 'https:\u002F\u002Fhub-dev.guidewire.com',\n      apiBaseUrl: `https:\u002F\u002F${process.env.GW_TENANT_DEV}.cloud.guidewire.com`,\n      features: {\n        debug: true,\n        sampleData: true,\n        mockIntegrations: true\n      },\n      integrations: {\n        rating: 'http:\u002F\u002Flocalhost:8081\u002Fmock\u002Frating',\n        mvr: 'http:\u002F\u002Flocalhost:8081\u002Fmock\u002Fmvr'\n      }\n    });\n\n    this.configs.set('prod', {\n      name: 'Production',\n      code: 'PROD',\n      tenantId: process.env.GW_TENANT_PROD!,\n      hubUrl: 'https:\u002F\u002Fhub.guidewire.com',\n      apiBaseUrl: `https:\u002F\u002F${process.env.GW_TENANT_PROD}.cloud.guidewire.com`,\n      features: {\n        debug: false,\n        sampleData: false,\n        mockIntegrations: false\n      },\n      integrations: {\n        rating: 'https:\u002F\u002Frating.production.com\u002Fapi',\n        mvr: 'https:\u002F\u002Fmvr.production.com\u002Fapi'\n      }\n    });\n  }\n\n  getConfig(env: string): EnvironmentConfig {\n    const config = this.configs.get(env);\n    if (!config) {\n      throw new Error(`Unknown environment: ${env}`);\n    }\n    return config;\n  }\n\n  getCurrentEnvironment(): string {\n    return process.env.GW_ENVIRONMENT || 'dev';\n  }\n\n  isFeatureEnabled(feature: string): boolean {\n    const config = this.getConfig(this.getCurrentEnvironment());\n    return config.features[feature] ?? false;\n  }\n}\n\n\u002F\u002F Environment-aware API client\nclass EnvironmentAwareClient {\n  private envManager: EnvironmentManager;\n  private tokenManager: TokenManager;\n\n  constructor() {\n    this.envManager = new EnvironmentManager();\n    const config = this.envManager.getConfig(this.envManager.getCurrentEnvironment());\n\n    this.tokenManager = new TokenManager({\n      clientId: this.getClientId(),\n      clientSecret: this.getClientSecret(),\n      hubUrl: config.hubUrl\n    });\n  }\n\n  private getClientId(): string {\n    const env = this.envManager.getCurrentEnvironment();\n    return process.env[`GW_CLIENT_ID_${env.toUpperCase()}`]!;\n  }\n\n  private getClientSecret(): string {\n    const env = this.envManager.getCurrentEnvironment();\n    return process.env[`GW_CLIENT_SECRET_${env.toUpperCase()}`]!;\n  }\n\n  async request\u003CT>(path: string, options?: RequestOptions): Promise\u003CT> {\n    const config = this.envManager.getConfig(this.envManager.getCurrentEnvironment());\n    const token = await this.tokenManager.getToken();\n\n    const response = await fetch(`${config.apiBaseUrl}${path}`, {\n      ...options,\n      headers: {\n        ...options?.headers,\n        'Authorization': `Bearer ${token}`,\n        'X-GW-Environment': config.code\n      }\n    });\n\n    return response.json();\n  }\n}\n```\n\n### Step 5: Secrets Management\n\n```typescript\n\u002F\u002F Secure secrets management for multiple environments\nimport { SecretManagerServiceClient } from '@google-cloud\u002Fsecret-manager';\n\ninterface EnvironmentSecrets {\n  clientId: string;\n  clientSecret: string;\n  webhookSecret: string;\n  encryptionKey: string;\n}\n\nclass SecretsManager {\n  private client: SecretManagerServiceClient;\n  private projectId: string;\n\n  constructor(projectId: string) {\n    this.client = new SecretManagerServiceClient();\n    this.projectId = projectId;\n  }\n\n  async getSecrets(environment: string): Promise\u003CEnvironmentSecrets> {\n    const prefix = `gw-${environment}`;\n\n    const [clientId, clientSecret, webhookSecret, encryptionKey] = await Promise.all([\n      this.getSecret(`${prefix}-client-id`),\n      this.getSecret(`${prefix}-client-secret`),\n      this.getSecret(`${prefix}-webhook-secret`),\n      this.getSecret(`${prefix}-encryption-key`)\n    ]);\n\n    return {\n      clientId,\n      clientSecret,\n      webhookSecret,\n      encryptionKey\n    };\n  }\n\n  private async getSecret(secretName: string): Promise\u003Cstring> {\n    const name = `projects\u002F${this.projectId}\u002Fsecrets\u002F${secretName}\u002Fversions\u002Flatest`;\n\n    const [response] = await this.client.accessSecretVersion({ name });\n    return response.payload?.data?.toString() || '';\n  }\n\n  async rotateSecret(environment: string, secretName: string, newValue: string): Promise\u003Cvoid> {\n    const fullName = `gw-${environment}-${secretName}`;\n    const parent = `projects\u002F${this.projectId}\u002Fsecrets\u002F${fullName}`;\n\n    \u002F\u002F Add new version\n    await this.client.addSecretVersion({\n      parent,\n      payload: {\n        data: Buffer.from(newValue)\n      }\n    });\n\n    console.log(`Rotated secret: ${fullName}`);\n  }\n}\n```\n\n### Step 6: Environment Promotion Workflow\n\n```typescript\n\u002F\u002F Environment promotion automation\ninterface PromotionRequest {\n  sourceEnv: string;\n  targetEnv: string;\n  packageVersion: string;\n  approver: string;\n  changeTicket: string;\n}\n\nclass EnvironmentPromotion {\n  private allowedPromotionPaths = [\n    ['dev', 'qa'],\n    ['qa', 'uat'],\n    ['uat', 'prod']\n  ];\n\n  async promote(request: PromotionRequest): Promise\u003CPromotionResult> {\n    \u002F\u002F Validate promotion path\n    this.validatePromotionPath(request.sourceEnv, request.targetEnv);\n\n    \u002F\u002F Pre-promotion checks\n    await this.runPrePromotionChecks(request);\n\n    \u002F\u002F Get package from source\n    const package = await this.getPackageFromEnvironment(\n      request.sourceEnv,\n      request.packageVersion\n    );\n\n    \u002F\u002F Deploy to target\n    const deploymentId = await this.deployToEnvironment(\n      request.targetEnv,\n      package\n    );\n\n    \u002F\u002F Wait for deployment\n    await this.waitForDeployment(deploymentId);\n\n    \u002F\u002F Run post-promotion validation\n    await this.runPostPromotionValidation(request.targetEnv);\n\n    \u002F\u002F Record promotion\n    return await this.recordPromotion(request, deploymentId);\n  }\n\n  private validatePromotionPath(source: string, target: string): void {\n    const isValid = this.allowedPromotionPaths.some(\n      ([from, to]) => from === source && to === target\n    );\n\n    if (!isValid) {\n      throw new Error(`Invalid promotion path: ${source} -> ${target}`);\n    }\n  }\n\n  private async runPrePromotionChecks(request: PromotionRequest): Promise\u003Cvoid> {\n    \u002F\u002F Check change ticket is approved\n    if (request.targetEnv === 'prod') {\n      const ticketApproved = await this.checkChangeTicketApproved(request.changeTicket);\n      if (!ticketApproved) {\n        throw new Error('Change ticket not approved for production promotion');\n      }\n    }\n\n    \u002F\u002F Check source environment is stable\n    const sourceHealth = await this.checkEnvironmentHealth(request.sourceEnv);\n    if (!sourceHealth.healthy) {\n      throw new Error(`Source environment unhealthy: ${sourceHealth.issues.join(', ')}`);\n    }\n\n    \u002F\u002F Check target environment is available\n    const targetAvailable = await this.checkEnvironmentAvailable(request.targetEnv);\n    if (!targetAvailable) {\n      throw new Error('Target environment not available for deployment');\n    }\n  }\n\n  private async runPostPromotionValidation(environment: string): Promise\u003Cvoid> {\n    \u002F\u002F Run smoke tests\n    const smokeResults = await this.runSmokeTests(environment);\n    if (!smokeResults.passed) {\n      throw new Error(`Smoke tests failed: ${smokeResults.failures.join(', ')}`);\n    }\n\n    \u002F\u002F Verify critical integrations\n    const integrationResults = await this.verifyIntegrations(environment);\n    if (!integrationResults.allHealthy) {\n      console.warn('Some integrations unhealthy:', integrationResults.unhealthy);\n    }\n  }\n}\n```\n\n### Step 7: Environment Health Dashboard\n\n```typescript\n\u002F\u002F Environment health monitoring\ninterface EnvironmentHealth {\n  environment: string;\n  status: 'healthy' | 'degraded' | 'unhealthy';\n  components: ComponentHealth[];\n  lastUpdated: Date;\n}\n\ninterface ComponentHealth {\n  name: string;\n  status: 'up' | 'down' | 'degraded';\n  latency?: number;\n  errorRate?: number;\n}\n\nclass EnvironmentHealthMonitor {\n  private environments = ['dev', 'qa', 'uat', 'prod'];\n\n  async checkAllEnvironments(): Promise\u003CMap\u003Cstring, EnvironmentHealth>> {\n    const results = new Map\u003Cstring, EnvironmentHealth>();\n\n    await Promise.all(\n      this.environments.map(async (env) => {\n        const health = await this.checkEnvironment(env);\n        results.set(env, health);\n      })\n    );\n\n    return results;\n  }\n\n  async checkEnvironment(env: string): Promise\u003CEnvironmentHealth> {\n    const envManager = new EnvironmentManager();\n    const config = envManager.getConfig(env);\n\n    const components = await Promise.all([\n      this.checkPolicyCenter(config),\n      this.checkClaimCenter(config),\n      this.checkBillingCenter(config),\n      this.checkIntegrations(config)\n    ]);\n\n    const unhealthyCount = components.filter(c => c.status === 'down').length;\n    const degradedCount = components.filter(c => c.status === 'degraded').length;\n\n    let status: EnvironmentHealth['status'] = 'healthy';\n    if (unhealthyCount > 0) {\n      status = 'unhealthy';\n    } else if (degradedCount > 0) {\n      status = 'degraded';\n    }\n\n    return {\n      environment: env,\n      status,\n      components,\n      lastUpdated: new Date()\n    };\n  }\n\n  private async checkPolicyCenter(config: EnvironmentConfig): Promise\u003CComponentHealth> {\n    const startTime = Date.now();\n    try {\n      const response = await fetch(`${config.apiBaseUrl}\u002Fpc\u002Frest\u002Fcommon\u002Fv1\u002Fsystem-info`);\n      return {\n        name: 'PolicyCenter',\n        status: response.ok ? 'up' : 'degraded',\n        latency: Date.now() - startTime\n      };\n    } catch {\n      return { name: 'PolicyCenter', status: 'down' };\n    }\n  }\n}\n```\n\n## Environment Matrix\n\n| Aspect | DEV | QA | UAT | PROD |\n|--------|-----|-----|-----|------|\n| Purpose | Development | Integration Testing | Acceptance | Live |\n| Data | Synthetic | Anonymized | Prod-like | Production |\n| Integrations | Mocked | Sandbox | Sandbox | Production |\n| Access | Developers | QA Team | Business Users | Restricted |\n| Refresh Cycle | On-demand | Weekly | Monthly | N\u002FA |\n| Monitoring | Basic | Standard | Standard | Comprehensive |\n\n## Output\n\n- Environment configuration structure\n- Gradle multi-environment build\n- Secrets management integration\n- Promotion workflow automation\n- Health monitoring dashboard\n\n## Resources\n\n- [Guidewire Cloud Console](https:\u002F\u002Fgcc.guidewire.com\u002F)\n- [Environment Management](https:\u002F\u002Fdocs.guidewire.com\u002Fcloud\u002F)\n\n## Next Steps\n\nFor monitoring and observability, see `guidewire-observability`.\n",{"name":5,"author":49,"license":15,"version":50,"description":51,"allowed-tools":52},"Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Configure multi-environment setup for Guidewire InsuranceSuite including development,\nstaging, and production environments with proper isolation and promotion workflows.\nTrigger with phrases like \"guidewire environments\", \"multi-environment\",\n\"dev staging production\", \"environment configuration\", \"environment promotion\".\n","Read, Write, Edit, Bash(curl:*), Bash(gradle:*), Grep","main","90b50ed0778745a80fd5bfb13b1843d45b9e82f7","tests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fguidewire-pack\u002Fskills\u002Fguidewire-multi-env-setup",233,"https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust","https:\u002F\u002Fgithub.com\u002FDicklesworthstone","https:\u002F\u002Fwww.jeffreyemanuel.com\u002F","Building in NY","2026-11-15 01:54:15",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add Dicklesworthstone\u002Fpi_agent_rust --skill guidewire-multi-env-setup",{"tool":68,"command":69},"bunx","bunx skills add Dicklesworthstone\u002Fpi_agent_rust --skill guidewire-multi-env-setup",{"tool":71,"command":72},"pnpm","pnpm dlx skills add Dicklesworthstone\u002Fpi_agent_rust --skill guidewire-multi-env-setup","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fguidewire-pack\u002Fskills\u002Fguidewire-multi-env-setup\u002FSKILL.md",true,[],[77,116,140,167,193,215],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":81,"licenseFileUrl":82,"sourceHtmlUrl":83,"categories":84,"keywords":90,"publishedAt":44},"01M6FEGPPK0ZTKCCM0R3E3KS33","web-artifacts-builder","Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn\u002Fui). Use for complex artifacts requiring state management, routing, or shadcn\u002Fui components - not for simple single-file HTML\u002FJSX artifacts.","Apache-2.0","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Futilities\u002Fweb-artifacts-builder\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Futilities\u002Fweb-artifacts-builder\u002FSKILL.md",[85],{"categoryNo":86,"categoryName":87,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,21,24,114,115],"web artifacts builder","web","artifacts","artifacts builder","builder","frontend","css","components","react","component","routing","state management","state","shadcn","file","ui","Tools","Tailwind","use","html","single-file","simple","ui components","jsx","suite",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":81,"licenseFileUrl":120,"sourceHtmlUrl":121,"categories":122,"keywords":127,"publishedAt":44},"01M6FEE9VTK1W4GY21AKREJXRG","webapp-testing","Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fsecurity\u002Fwebapp-testing\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fsecurity\u002Fwebapp-testing\u002FSKILL.md",[123,126],{"categoryNo":124,"categoryName":125,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":86,"categoryName":87,"taxonomyType":88,"taxonomyTypeDesc":89},[128,129,130,96,131,132,92,133,134,135,106,136,137,138,139,29,24],"testing","webapp testing","webapp","screenshots","playwright","debugging","toolkit","browser","logs","applications","behavior","local",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":144,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":44},"01M6FE20F7ZTQBFWKF4MPJ2SBX","neuropixels-analysis","Neuropixels neural recording analysis. Load SpikeGLX\u002FOpenEphys data, preprocess, motion correction, Kilosort4 spike sorting, quality metrics, Allen\u002FIBL curation, AI-assisted visual analysis, for Neuropixels 1.0\u002F2.0 extracellular electrophysiology. Use when working with neural recordings, spike sorting, extracellular electrophysiology, or when the user mentions Neuropixels, SpikeGLX, Open Ephys, Kilosort, quality metrics, or unit curation.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fneuropixels-analysis\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fneuropixels-analysis\u002FSKILL.md",[],[148,149,150,151,152,153,154,155,109,156,157,158,159,160,161,162,29,163,164,165,24,166],"analysis","neuropixels analysis","spike","metrics","data","open","quality","user","recordings","Neural","motion","visual","quality metrics","unit","sorting","curation","recording","load","when",{"skillNo":168,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":81,"licenseFileUrl":171,"sourceHtmlUrl":172,"categories":173,"keywords":177,"publishedAt":44},"01M6FDP0PDK6F1GGX395C7625Z","skill-creator","Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fskill-creator\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fskill-creator\u002FSKILL.md",[174],{"categoryNo":175,"categoryName":176,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000023","Skill与智能体开发",[178,179,25,180,181,182,183,184,185,186,187,188,189,190,29,24,191,166,192],"skill creator","creator","create","update","capabilities","knowledge","tool","integrations","specialized","guide","new skill","existing skill","users","Existing","new",{"skillNo":194,"name":195,"nameZh":6,"description":196,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":197,"sourceHtmlUrl":198,"categories":199,"keywords":201,"publishedAt":44},"01M6FDM8Y7VK7NYG9SM7QPA3PW","notebooklm","Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-grounded, citation-backed answers from Gemini. Browser automation, library management, persistent auth. Drastically reduced hallucinations through document-only responses.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fnotebooklm\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fnotebooklm\u002FSKILL.md",[200],{"categoryNo":175,"categoryName":176,"taxonomyType":88,"taxonomyTypeDesc":89},[195,202,203,204,205,206,207,135,208,209,109,210,211,212,213,24,214],"google","browser automation","gemini","automation","auth","code","library","management","only","document","query","Citation","source",{"skillNo":216,"name":217,"nameZh":6,"description":218,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":81,"licenseFileUrl":219,"sourceHtmlUrl":220,"categories":221,"keywords":228,"publishedAt":44},"01M6FDHPXE10J3XGTCH5HBHS1M","slack-gif-creator","Knowledge and utilities for creating animated GIFs optimized for Slack. Provides constraints, validation tools, and animation concepts. Use when users request animated GIFs for Slack like \"make me a GIF of X doing Y for Slack.\"","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fenterprise-communication\u002Fslack-gif-creator\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fenterprise-communication\u002Fslack-gif-creator\u002FSKILL.md",[222,225],{"categoryNo":223,"categoryName":224,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":226,"categoryName":227,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000016","图像与多媒体",[229,230,231,179,232,107,233,234,183,109,235,190,236,237,238,24,239,166],"slack gif creator","slack","gif","validation","constraints","Animation","me","make","Utilities","concepts","request"]