[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F752PD60P6AXN77AM22GDC":3,"skill-same:01M6F752PD60P6AXN77AM22GDC":79},{"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":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":56,"commitSha":57,"skillDirectory":58,"forksCount":59,"repositoryHtmlUrl":60,"repositoryHomepageUrl":6,"ownerHtmlUrl":61,"ownerBlogUrl":62,"ownerDescription":63,"updatedAt":64,"install":65,"resources":78},"01M6F752PD60P6AXN77AM22GDC","guidewire-deploy-integration",null,"Deploy Guidewire InsuranceSuite integrations to Guidewire Cloud Platform.\nUse when deploying configuration packages, managing releases,\nor implementing blue-green deployments.\nTrigger with phrases like \"deploy guidewire\", \"guidewire cloud deployment\",\n\"release management\", \"configuration deployment\", \"guidewire promotion\".","Dicklesworthstone\u002Fpi_agent_rust","Dicklesworthstone","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F35050222?v=4","01M6CG26AR942CSVMN1M5E3DSE","Jeff Emanuel","01M6CG26EPP71PSHW1VDS71121",1979,"MIT","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fguidewire-pack\u002Fskills\u002Fguidewire-deploy-integration\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"integration","guidewire deploy integration","deploy","release management","when","implementing","blue-green","promotion","trigger","io","platform","gradle","green","releases","deployments","edit","write","read","integrations","Bash","release","packages","deployment","2026-11-10 10:12:30",false,"---\nname: guidewire-deploy-integration\ndescription: |\n  Deploy Guidewire InsuranceSuite integrations to Guidewire Cloud Platform.\n  Use when deploying configuration packages, managing releases,\n  or implementing blue-green deployments.\n  Trigger with phrases like \"deploy guidewire\", \"guidewire cloud deployment\",\n  \"release management\", \"configuration deployment\", \"guidewire 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 Deploy Integration\n\n## Overview\n\nDeploy Guidewire InsuranceSuite configurations and integrations to Guidewire Cloud Platform using proper release management practices.\n\n## Prerequisites\n\n- Guidewire Cloud Console access\n- Service account with deployment permissions\n- Configuration package built and tested\n- Approval for target environment\n\n## Deployment Architecture\n\n```\n+------------------+      +------------------+      +------------------+\n|                  |      |                  |      |                  |\n|   Development    |----->|    Sandbox       |----->|   Production     |\n|   Environment    |      |    Environment   |      |   Environment    |\n|                  |      |                  |      |                  |\n+------------------+      +------------------+      +------------------+\n        |                         |                         |\n        v                         v                         v\n   Build Package            Deploy & Test             Deploy & Verify\n   Run Unit Tests           Integration Tests         Production Tests\n   Code Review              UAT Approval              Go-Live Approval\n```\n\n## Instructions\n\n### Step 1: Prepare Configuration Package\n\n```groovy\n\u002F\u002F build.gradle - Configuration package creation\ntasks.register('createConfigPackage', Zip) {\n    description = 'Creates configuration package for Guidewire Cloud deployment'\n    group = 'deployment'\n\n    archiveFileName = \"config-${project.version}-${new Date().format('yyyyMMddHHmmss')}.zip\"\n    destinationDirectory = file(\"$buildDir\u002Fpackages\")\n\n    from('modules\u002Fconfiguration') {\n        include 'gsrc\u002F**'\n        include 'config\u002F**'\n        exclude '**\u002F*.swp'\n        exclude '**\u002Ftest\u002F**'\n    }\n\n    from('modules\u002Fintegration') {\n        include 'gsrc\u002F**'\n        exclude '**\u002F*Test.gs'\n    }\n\n    \u002F\u002F Include metadata\n    from('.') {\n        include 'version.properties'\n        include 'deployment-manifest.json'\n    }\n}\n\ntasks.register('validatePackage') {\n    description = 'Validates configuration package before deployment'\n    dependsOn 'createConfigPackage'\n\n    doLast {\n        def packageFile = file(\"$buildDir\u002Fpackages\").listFiles().find { it.name.endsWith('.zip') }\n\n        \u002F\u002F Validate package size\n        def sizeMB = packageFile.length() \u002F (1024 * 1024)\n        if (sizeMB > 100) {\n            throw new GradleException(\"Package too large: ${sizeMB}MB (max 100MB)\")\n        }\n\n        \u002F\u002F Validate required files\n        def zipFile = new java.util.zip.ZipFile(packageFile)\n        def requiredFiles = ['deployment-manifest.json', 'version.properties']\n        requiredFiles.each { required ->\n            if (!zipFile.entries().any { it.name == required }) {\n                throw new GradleException(\"Missing required file: ${required}\")\n            }\n        }\n        zipFile.close()\n\n        println \"Package validation passed: ${packageFile.name} (${sizeMB}MB)\"\n    }\n}\n```\n\n### Step 2: Deployment Manifest\n\n```json\n{\n  \"manifestVersion\": \"2.0\",\n  \"packageInfo\": {\n    \"name\": \"policycenter-custom-config\",\n    \"version\": \"1.5.0\",\n    \"description\": \"Custom PolicyCenter configuration with integration extensions\",\n    \"buildNumber\": \"${BUILD_NUMBER}\",\n    \"buildTimestamp\": \"${BUILD_TIMESTAMP}\"\n  },\n  \"targetApplications\": [\n    {\n      \"application\": \"PolicyCenter\",\n      \"minimumVersion\": \"202503\",\n      \"maximumVersion\": \"202507\"\n    }\n  ],\n  \"components\": [\n    {\n      \"type\": \"gosu\",\n      \"path\": \"gsrc\u002Fgw\u002Fcustom\u002F**\",\n      \"description\": \"Custom Gosu business logic\"\n    },\n    {\n      \"type\": \"pcf\",\n      \"path\": \"config\u002Fpcf\u002F**\",\n      \"description\": \"Custom UI screens\"\n    },\n    {\n      \"type\": \"product\",\n      \"path\": \"config\u002Fproducts\u002F**\",\n      \"description\": \"Product model customizations\"\n    },\n    {\n      \"type\": \"integration\",\n      \"path\": \"config\u002Fintegration\u002F**\",\n      \"description\": \"Integration configurations\"\n    }\n  ],\n  \"preDeploymentChecks\": [\n    {\n      \"name\": \"database-compatibility\",\n      \"type\": \"schema-validation\"\n    },\n    {\n      \"name\": \"api-compatibility\",\n      \"type\": \"api-version-check\"\n    }\n  ],\n  \"postDeploymentActions\": [\n    {\n      \"name\": \"clear-cache\",\n      \"type\": \"cache-invalidation\"\n    },\n    {\n      \"name\": \"reload-products\",\n      \"type\": \"product-reload\"\n    }\n  ]\n}\n```\n\n### Step 3: Deployment API Client\n\n```typescript\n\u002F\u002F Guidewire Cloud Deployment Client\ninterface DeploymentStatus {\n  id: string;\n  status: 'PENDING' | 'IN_PROGRESS' | 'COMPLETED' | 'FAILED' | 'ROLLED_BACK';\n  startTime: string;\n  endTime?: string;\n  progress: number;\n  message?: string;\n  logs?: string[];\n}\n\ninterface DeploymentRequest {\n  environment: string;\n  packagePath: string;\n  rollbackOnFailure: boolean;\n  validationMode?: 'STRICT' | 'LENIENT';\n}\n\nclass GuidewireDeploymentClient {\n  private baseUrl: string;\n  private tokenManager: TokenManager;\n\n  constructor(baseUrl: string, tokenManager: TokenManager) {\n    this.baseUrl = baseUrl;\n    this.tokenManager = tokenManager;\n  }\n\n  async deploy(request: DeploymentRequest): Promise\u003Cstring> {\n    const token = await this.tokenManager.getToken();\n\n    \u002F\u002F Upload package\n    const packageBuffer = await fs.readFile(request.packagePath);\n    const uploadResponse = await fetch(`${this.baseUrl}\u002Fdeployment\u002Fv1\u002Fpackages`, {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${token}`,\n        'Content-Type': 'application\u002Fzip',\n        'X-Environment': request.environment,\n        'X-Rollback-On-Failure': String(request.rollbackOnFailure),\n        'X-Validation-Mode': request.validationMode || 'STRICT'\n      },\n      body: packageBuffer\n    });\n\n    if (!uploadResponse.ok) {\n      const error = await uploadResponse.json();\n      throw new Error(`Deployment failed: ${error.message}`);\n    }\n\n    const result = await uploadResponse.json();\n    return result.deploymentId;\n  }\n\n  async getStatus(deploymentId: string): Promise\u003CDeploymentStatus> {\n    const token = await this.tokenManager.getToken();\n\n    const response = await fetch(\n      `${this.baseUrl}\u002Fdeployment\u002Fv1\u002Fdeployments\u002F${deploymentId}`,\n      {\n        headers: { 'Authorization': `Bearer ${token}` }\n      }\n    );\n\n    return response.json();\n  }\n\n  async waitForCompletion(\n    deploymentId: string,\n    timeoutMs: number = 1800000,\n    pollIntervalMs: number = 10000\n  ): Promise\u003CDeploymentStatus> {\n    const startTime = Date.now();\n\n    while (Date.now() - startTime \u003C timeoutMs) {\n      const status = await this.getStatus(deploymentId);\n\n      console.log(`Deployment ${deploymentId}: ${status.status} (${status.progress}%)`);\n\n      if (status.status === 'COMPLETED') {\n        return status;\n      }\n\n      if (status.status === 'FAILED' || status.status === 'ROLLED_BACK') {\n        throw new Error(`Deployment failed: ${status.message}`);\n      }\n\n      await sleep(pollIntervalMs);\n    }\n\n    throw new Error(`Deployment timed out after ${timeoutMs}ms`);\n  }\n\n  async rollback(deploymentId: string): Promise\u003Cvoid> {\n    const token = await this.tokenManager.getToken();\n\n    const response = await fetch(\n      `${this.baseUrl}\u002Fdeployment\u002Fv1\u002Fdeployments\u002F${deploymentId}\u002Frollback`,\n      {\n        method: 'POST',\n        headers: { 'Authorization': `Bearer ${token}` }\n      }\n    );\n\n    if (!response.ok) {\n      throw new Error('Rollback failed');\n    }\n  }\n}\n```\n\n### Step 4: Blue-Green Deployment\n\n```typescript\n\u002F\u002F Blue-Green deployment strategy\ninterface EnvironmentSlot {\n  name: 'blue' | 'green';\n  status: 'active' | 'standby';\n  version: string;\n  healthUrl: string;\n}\n\nclass BlueGreenDeployment {\n  private deploymentClient: GuidewireDeploymentClient;\n  private loadBalancer: LoadBalancerClient;\n\n  async deploy(packagePath: string): Promise\u003Cvoid> {\n    \u002F\u002F Step 1: Identify current active and standby slots\n    const slots = await this.getSlotStatus();\n    const activeSlot = slots.find(s => s.status === 'active')!;\n    const standbySlot = slots.find(s => s.status === 'standby')!;\n\n    console.log(`Current active: ${activeSlot.name} (${activeSlot.version})`);\n    console.log(`Deploying to: ${standbySlot.name}`);\n\n    \u002F\u002F Step 2: Deploy to standby slot\n    const deploymentId = await this.deploymentClient.deploy({\n      environment: standbySlot.name,\n      packagePath,\n      rollbackOnFailure: true\n    });\n\n    await this.deploymentClient.waitForCompletion(deploymentId);\n\n    \u002F\u002F Step 3: Run health checks on standby\n    const healthy = await this.runHealthChecks(standbySlot.healthUrl);\n    if (!healthy) {\n      throw new Error('Health checks failed on standby slot');\n    }\n\n    \u002F\u002F Step 4: Run smoke tests\n    const smokeTestsPassed = await this.runSmokeTests(standbySlot.name);\n    if (!smokeTestsPassed) {\n      throw new Error('Smoke tests failed');\n    }\n\n    \u002F\u002F Step 5: Switch traffic\n    console.log('Switching traffic to new deployment...');\n    await this.loadBalancer.switchTraffic(standbySlot.name);\n\n    \u002F\u002F Step 6: Verify switch\n    const newActive = await this.verifyActiveSlot();\n    if (newActive !== standbySlot.name) {\n      throw new Error('Traffic switch verification failed');\n    }\n\n    console.log(`Deployment complete. Active slot: ${standbySlot.name}`);\n  }\n\n  async rollback(): Promise\u003Cvoid> {\n    const slots = await this.getSlotStatus();\n    const standbySlot = slots.find(s => s.status === 'standby')!;\n\n    console.log(`Rolling back to ${standbySlot.name}...`);\n    await this.loadBalancer.switchTraffic(standbySlot.name);\n    console.log('Rollback complete');\n  }\n\n  private async runHealthChecks(healthUrl: string): Promise\u003Cboolean> {\n    for (let i = 0; i \u003C 5; i++) {\n      try {\n        const response = await fetch(healthUrl);\n        const health = await response.json();\n        if (health.status === 'healthy') {\n          return true;\n        }\n      } catch (error) {\n        console.log(`Health check attempt ${i + 1} failed`);\n      }\n      await sleep(10000);\n    }\n    return false;\n  }\n}\n```\n\n### Step 5: Environment Promotion\n\n```typescript\n\u002F\u002F Promote deployments between environments\ninterface PromotionRequest {\n  sourceEnvironment: string;\n  targetEnvironment: string;\n  packageId: string;\n  approver: string;\n  changeTicket: string;\n}\n\nclass EnvironmentPromotion {\n  async promote(request: PromotionRequest): Promise\u003Cstring> {\n    \u002F\u002F Validate promotion path\n    const validPaths = [\n      ['dev', 'sandbox'],\n      ['sandbox', 'staging'],\n      ['staging', 'production']\n    ];\n\n    const isValidPath = validPaths.some(\n      ([from, to]) => from === request.sourceEnvironment && to === request.targetEnvironment\n    );\n\n    if (!isValidPath) {\n      throw new Error(`Invalid promotion path: ${request.sourceEnvironment} -> ${request.targetEnvironment}`);\n    }\n\n    \u002F\u002F Verify package exists in source\n    const sourcePackage = await this.getPackage(request.sourceEnvironment, request.packageId);\n    if (!sourcePackage) {\n      throw new Error('Package not found in source environment');\n    }\n\n    \u002F\u002F Check prerequisites for target environment\n    await this.checkPromotionPrerequisites(request);\n\n    \u002F\u002F Create promotion record\n    const promotionId = await this.createPromotionRecord(request);\n\n    \u002F\u002F Execute deployment to target\n    const deploymentId = await this.deploymentClient.deploy({\n      environment: request.targetEnvironment,\n      packagePath: sourcePackage.packagePath,\n      rollbackOnFailure: true\n    });\n\n    \u002F\u002F Wait for completion\n    await this.deploymentClient.waitForCompletion(deploymentId);\n\n    \u002F\u002F Update promotion record\n    await this.updatePromotionRecord(promotionId, 'COMPLETED');\n\n    return promotionId;\n  }\n\n  private async checkPromotionPrerequisites(request: PromotionRequest): Promise\u003Cvoid> {\n    \u002F\u002F Check approval\n    if (request.targetEnvironment === 'production') {\n      const approval = await this.getApproval(request.changeTicket);\n      if (!approval.approved) {\n        throw new Error('Production deployment requires approval');\n      }\n    }\n\n    \u002F\u002F Check no active deployments\n    const activeDeployments = await this.getActiveDeployments(request.targetEnvironment);\n    if (activeDeployments.length > 0) {\n      throw new Error('Another deployment is in progress');\n    }\n\n    \u002F\u002F Check maintenance window (for production)\n    if (request.targetEnvironment === 'production') {\n      const inWindow = await this.isInMaintenanceWindow();\n      if (!inWindow) {\n        throw new Error('Production deployments only allowed during maintenance windows');\n      }\n    }\n  }\n}\n```\n\n### Step 6: Deployment Verification\n\n```gosu\n\u002F\u002F Post-deployment verification tests\npackage gw.deployment.verify\n\nuses gw.api.util.Logger\nuses gw.api.database.Query\n\nclass DeploymentVerification {\n  private static final var LOG = Logger.forCategory(\"DeploymentVerification\")\n\n  static function runVerification() : VerificationResult {\n    var result = new VerificationResult()\n\n    \u002F\u002F Check database connectivity\n    result.addCheck(\"Database\", verifyDatabaseConnection())\n\n    \u002F\u002F Check product model loaded\n    result.addCheck(\"ProductModel\", verifyProductModel())\n\n    \u002F\u002F Check integrations configured\n    result.addCheck(\"Integrations\", verifyIntegrations())\n\n    \u002F\u002F Check custom Gosu classes loaded\n    result.addCheck(\"CustomCode\", verifyCustomCode())\n\n    return result\n  }\n\n  private static function verifyDatabaseConnection() : boolean {\n    try {\n      var count = Query.make(Account).select().Count\n      LOG.info(\"Database check passed: ${count} accounts found\")\n      return true\n    } catch (e : Exception) {\n      LOG.error(\"Database check failed\", e)\n      return false\n    }\n  }\n\n  private static function verifyProductModel() : boolean {\n    try {\n      var products = gw.api.productmodel.ProductLookup.getAll()\n      LOG.info(\"Product model check passed: ${products.Count} products loaded\")\n      return products.Count > 0\n    } catch (e : Exception) {\n      LOG.error(\"Product model check failed\", e)\n      return false\n    }\n  }\n\n  private static function verifyIntegrations() : boolean {\n    try {\n      \u002F\u002F Verify integration endpoints are configured\n      var endpoints = IntegrationConfig.getAllEndpoints()\n      LOG.info(\"Integration check passed: ${endpoints.Count} endpoints configured\")\n      return true\n    } catch (e : Exception) {\n      LOG.error(\"Integration check failed\", e)\n      return false\n    }\n  }\n\n  private static function verifyCustomCode() : boolean {\n    try {\n      \u002F\u002F Try to instantiate custom classes\n      var instance = new gw.custom.MyCustomClass()\n      LOG.info(\"Custom code check passed\")\n      return true\n    } catch (e : Exception) {\n      LOG.error(\"Custom code check failed\", e)\n      return false\n    }\n  }\n}\n```\n\n## Output\n\n- Configuration package created and validated\n- Deployment manifest with dependencies\n- Blue-green deployment capability\n- Environment promotion workflow\n- Post-deployment verification\n\n## Error Handling\n\n| Error | Cause | Solution |\n|-------|-------|----------|\n| Package validation failed | Missing required files | Check manifest and include all files |\n| Deployment timeout | Large package or slow network | Increase timeout, optimize package |\n| Health check failed | Application errors | Check logs, fix issues, redeploy |\n| Rollback failed | State inconsistency | Manual intervention required |\n\n## Resources\n\n- [Guidewire Cloud Deployment Guide](https:\u002F\u002Fdocs.guidewire.com\u002Fcloud\u002F)\n- [Configuration Package Reference](https:\u002F\u002Fdocs.guidewire.com\u002Feducation\u002F)\n\n## Next Steps\n\nFor webhook and event handling, see `guidewire-webhooks-events`.\n","# Guidewire Deploy Integration\n\n## Overview\n\nDeploy Guidewire InsuranceSuite configurations and integrations to Guidewire Cloud Platform using proper release management practices.\n\n## Prerequisites\n\n- Guidewire Cloud Console access\n- Service account with deployment permissions\n- Configuration package built and tested\n- Approval for target environment\n\n## Deployment Architecture\n\n```\n+------------------+      +------------------+      +------------------+\n|                  |      |                  |      |                  |\n|   Development    |----->|    Sandbox       |----->|   Production     |\n|   Environment    |      |    Environment   |      |   Environment    |\n|                  |      |                  |      |                  |\n+------------------+      +------------------+      +------------------+\n        |                         |                         |\n        v                         v                         v\n   Build Package            Deploy & Test             Deploy & Verify\n   Run Unit Tests           Integration Tests         Production Tests\n   Code Review              UAT Approval              Go-Live Approval\n```\n\n## Instructions\n\n### Step 1: Prepare Configuration Package\n\n```groovy\n\u002F\u002F build.gradle - Configuration package creation\ntasks.register('createConfigPackage', Zip) {\n    description = 'Creates configuration package for Guidewire Cloud deployment'\n    group = 'deployment'\n\n    archiveFileName = \"config-${project.version}-${new Date().format('yyyyMMddHHmmss')}.zip\"\n    destinationDirectory = file(\"$buildDir\u002Fpackages\")\n\n    from('modules\u002Fconfiguration') {\n        include 'gsrc\u002F**'\n        include 'config\u002F**'\n        exclude '**\u002F*.swp'\n        exclude '**\u002Ftest\u002F**'\n    }\n\n    from('modules\u002Fintegration') {\n        include 'gsrc\u002F**'\n        exclude '**\u002F*Test.gs'\n    }\n\n    \u002F\u002F Include metadata\n    from('.') {\n        include 'version.properties'\n        include 'deployment-manifest.json'\n    }\n}\n\ntasks.register('validatePackage') {\n    description = 'Validates configuration package before deployment'\n    dependsOn 'createConfigPackage'\n\n    doLast {\n        def packageFile = file(\"$buildDir\u002Fpackages\").listFiles().find { it.name.endsWith('.zip') }\n\n        \u002F\u002F Validate package size\n        def sizeMB = packageFile.length() \u002F (1024 * 1024)\n        if (sizeMB > 100) {\n            throw new GradleException(\"Package too large: ${sizeMB}MB (max 100MB)\")\n        }\n\n        \u002F\u002F Validate required files\n        def zipFile = new java.util.zip.ZipFile(packageFile)\n        def requiredFiles = ['deployment-manifest.json', 'version.properties']\n        requiredFiles.each { required ->\n            if (!zipFile.entries().any { it.name == required }) {\n                throw new GradleException(\"Missing required file: ${required}\")\n            }\n        }\n        zipFile.close()\n\n        println \"Package validation passed: ${packageFile.name} (${sizeMB}MB)\"\n    }\n}\n```\n\n### Step 2: Deployment Manifest\n\n```json\n{\n  \"manifestVersion\": \"2.0\",\n  \"packageInfo\": {\n    \"name\": \"policycenter-custom-config\",\n    \"version\": \"1.5.0\",\n    \"description\": \"Custom PolicyCenter configuration with integration extensions\",\n    \"buildNumber\": \"${BUILD_NUMBER}\",\n    \"buildTimestamp\": \"${BUILD_TIMESTAMP}\"\n  },\n  \"targetApplications\": [\n    {\n      \"application\": \"PolicyCenter\",\n      \"minimumVersion\": \"202503\",\n      \"maximumVersion\": \"202507\"\n    }\n  ],\n  \"components\": [\n    {\n      \"type\": \"gosu\",\n      \"path\": \"gsrc\u002Fgw\u002Fcustom\u002F**\",\n      \"description\": \"Custom Gosu business logic\"\n    },\n    {\n      \"type\": \"pcf\",\n      \"path\": \"config\u002Fpcf\u002F**\",\n      \"description\": \"Custom UI screens\"\n    },\n    {\n      \"type\": \"product\",\n      \"path\": \"config\u002Fproducts\u002F**\",\n      \"description\": \"Product model customizations\"\n    },\n    {\n      \"type\": \"integration\",\n      \"path\": \"config\u002Fintegration\u002F**\",\n      \"description\": \"Integration configurations\"\n    }\n  ],\n  \"preDeploymentChecks\": [\n    {\n      \"name\": \"database-compatibility\",\n      \"type\": \"schema-validation\"\n    },\n    {\n      \"name\": \"api-compatibility\",\n      \"type\": \"api-version-check\"\n    }\n  ],\n  \"postDeploymentActions\": [\n    {\n      \"name\": \"clear-cache\",\n      \"type\": \"cache-invalidation\"\n    },\n    {\n      \"name\": \"reload-products\",\n      \"type\": \"product-reload\"\n    }\n  ]\n}\n```\n\n### Step 3: Deployment API Client\n\n```typescript\n\u002F\u002F Guidewire Cloud Deployment Client\ninterface DeploymentStatus {\n  id: string;\n  status: 'PENDING' | 'IN_PROGRESS' | 'COMPLETED' | 'FAILED' | 'ROLLED_BACK';\n  startTime: string;\n  endTime?: string;\n  progress: number;\n  message?: string;\n  logs?: string[];\n}\n\ninterface DeploymentRequest {\n  environment: string;\n  packagePath: string;\n  rollbackOnFailure: boolean;\n  validationMode?: 'STRICT' | 'LENIENT';\n}\n\nclass GuidewireDeploymentClient {\n  private baseUrl: string;\n  private tokenManager: TokenManager;\n\n  constructor(baseUrl: string, tokenManager: TokenManager) {\n    this.baseUrl = baseUrl;\n    this.tokenManager = tokenManager;\n  }\n\n  async deploy(request: DeploymentRequest): Promise\u003Cstring> {\n    const token = await this.tokenManager.getToken();\n\n    \u002F\u002F Upload package\n    const packageBuffer = await fs.readFile(request.packagePath);\n    const uploadResponse = await fetch(`${this.baseUrl}\u002Fdeployment\u002Fv1\u002Fpackages`, {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${token}`,\n        'Content-Type': 'application\u002Fzip',\n        'X-Environment': request.environment,\n        'X-Rollback-On-Failure': String(request.rollbackOnFailure),\n        'X-Validation-Mode': request.validationMode || 'STRICT'\n      },\n      body: packageBuffer\n    });\n\n    if (!uploadResponse.ok) {\n      const error = await uploadResponse.json();\n      throw new Error(`Deployment failed: ${error.message}`);\n    }\n\n    const result = await uploadResponse.json();\n    return result.deploymentId;\n  }\n\n  async getStatus(deploymentId: string): Promise\u003CDeploymentStatus> {\n    const token = await this.tokenManager.getToken();\n\n    const response = await fetch(\n      `${this.baseUrl}\u002Fdeployment\u002Fv1\u002Fdeployments\u002F${deploymentId}`,\n      {\n        headers: { 'Authorization': `Bearer ${token}` }\n      }\n    );\n\n    return response.json();\n  }\n\n  async waitForCompletion(\n    deploymentId: string,\n    timeoutMs: number = 1800000,\n    pollIntervalMs: number = 10000\n  ): Promise\u003CDeploymentStatus> {\n    const startTime = Date.now();\n\n    while (Date.now() - startTime \u003C timeoutMs) {\n      const status = await this.getStatus(deploymentId);\n\n      console.log(`Deployment ${deploymentId}: ${status.status} (${status.progress}%)`);\n\n      if (status.status === 'COMPLETED') {\n        return status;\n      }\n\n      if (status.status === 'FAILED' || status.status === 'ROLLED_BACK') {\n        throw new Error(`Deployment failed: ${status.message}`);\n      }\n\n      await sleep(pollIntervalMs);\n    }\n\n    throw new Error(`Deployment timed out after ${timeoutMs}ms`);\n  }\n\n  async rollback(deploymentId: string): Promise\u003Cvoid> {\n    const token = await this.tokenManager.getToken();\n\n    const response = await fetch(\n      `${this.baseUrl}\u002Fdeployment\u002Fv1\u002Fdeployments\u002F${deploymentId}\u002Frollback`,\n      {\n        method: 'POST',\n        headers: { 'Authorization': `Bearer ${token}` }\n      }\n    );\n\n    if (!response.ok) {\n      throw new Error('Rollback failed');\n    }\n  }\n}\n```\n\n### Step 4: Blue-Green Deployment\n\n```typescript\n\u002F\u002F Blue-Green deployment strategy\ninterface EnvironmentSlot {\n  name: 'blue' | 'green';\n  status: 'active' | 'standby';\n  version: string;\n  healthUrl: string;\n}\n\nclass BlueGreenDeployment {\n  private deploymentClient: GuidewireDeploymentClient;\n  private loadBalancer: LoadBalancerClient;\n\n  async deploy(packagePath: string): Promise\u003Cvoid> {\n    \u002F\u002F Step 1: Identify current active and standby slots\n    const slots = await this.getSlotStatus();\n    const activeSlot = slots.find(s => s.status === 'active')!;\n    const standbySlot = slots.find(s => s.status === 'standby')!;\n\n    console.log(`Current active: ${activeSlot.name} (${activeSlot.version})`);\n    console.log(`Deploying to: ${standbySlot.name}`);\n\n    \u002F\u002F Step 2: Deploy to standby slot\n    const deploymentId = await this.deploymentClient.deploy({\n      environment: standbySlot.name,\n      packagePath,\n      rollbackOnFailure: true\n    });\n\n    await this.deploymentClient.waitForCompletion(deploymentId);\n\n    \u002F\u002F Step 3: Run health checks on standby\n    const healthy = await this.runHealthChecks(standbySlot.healthUrl);\n    if (!healthy) {\n      throw new Error('Health checks failed on standby slot');\n    }\n\n    \u002F\u002F Step 4: Run smoke tests\n    const smokeTestsPassed = await this.runSmokeTests(standbySlot.name);\n    if (!smokeTestsPassed) {\n      throw new Error('Smoke tests failed');\n    }\n\n    \u002F\u002F Step 5: Switch traffic\n    console.log('Switching traffic to new deployment...');\n    await this.loadBalancer.switchTraffic(standbySlot.name);\n\n    \u002F\u002F Step 6: Verify switch\n    const newActive = await this.verifyActiveSlot();\n    if (newActive !== standbySlot.name) {\n      throw new Error('Traffic switch verification failed');\n    }\n\n    console.log(`Deployment complete. Active slot: ${standbySlot.name}`);\n  }\n\n  async rollback(): Promise\u003Cvoid> {\n    const slots = await this.getSlotStatus();\n    const standbySlot = slots.find(s => s.status === 'standby')!;\n\n    console.log(`Rolling back to ${standbySlot.name}...`);\n    await this.loadBalancer.switchTraffic(standbySlot.name);\n    console.log('Rollback complete');\n  }\n\n  private async runHealthChecks(healthUrl: string): Promise\u003Cboolean> {\n    for (let i = 0; i \u003C 5; i++) {\n      try {\n        const response = await fetch(healthUrl);\n        const health = await response.json();\n        if (health.status === 'healthy') {\n          return true;\n        }\n      } catch (error) {\n        console.log(`Health check attempt ${i + 1} failed`);\n      }\n      await sleep(10000);\n    }\n    return false;\n  }\n}\n```\n\n### Step 5: Environment Promotion\n\n```typescript\n\u002F\u002F Promote deployments between environments\ninterface PromotionRequest {\n  sourceEnvironment: string;\n  targetEnvironment: string;\n  packageId: string;\n  approver: string;\n  changeTicket: string;\n}\n\nclass EnvironmentPromotion {\n  async promote(request: PromotionRequest): Promise\u003Cstring> {\n    \u002F\u002F Validate promotion path\n    const validPaths = [\n      ['dev', 'sandbox'],\n      ['sandbox', 'staging'],\n      ['staging', 'production']\n    ];\n\n    const isValidPath = validPaths.some(\n      ([from, to]) => from === request.sourceEnvironment && to === request.targetEnvironment\n    );\n\n    if (!isValidPath) {\n      throw new Error(`Invalid promotion path: ${request.sourceEnvironment} -> ${request.targetEnvironment}`);\n    }\n\n    \u002F\u002F Verify package exists in source\n    const sourcePackage = await this.getPackage(request.sourceEnvironment, request.packageId);\n    if (!sourcePackage) {\n      throw new Error('Package not found in source environment');\n    }\n\n    \u002F\u002F Check prerequisites for target environment\n    await this.checkPromotionPrerequisites(request);\n\n    \u002F\u002F Create promotion record\n    const promotionId = await this.createPromotionRecord(request);\n\n    \u002F\u002F Execute deployment to target\n    const deploymentId = await this.deploymentClient.deploy({\n      environment: request.targetEnvironment,\n      packagePath: sourcePackage.packagePath,\n      rollbackOnFailure: true\n    });\n\n    \u002F\u002F Wait for completion\n    await this.deploymentClient.waitForCompletion(deploymentId);\n\n    \u002F\u002F Update promotion record\n    await this.updatePromotionRecord(promotionId, 'COMPLETED');\n\n    return promotionId;\n  }\n\n  private async checkPromotionPrerequisites(request: PromotionRequest): Promise\u003Cvoid> {\n    \u002F\u002F Check approval\n    if (request.targetEnvironment === 'production') {\n      const approval = await this.getApproval(request.changeTicket);\n      if (!approval.approved) {\n        throw new Error('Production deployment requires approval');\n      }\n    }\n\n    \u002F\u002F Check no active deployments\n    const activeDeployments = await this.getActiveDeployments(request.targetEnvironment);\n    if (activeDeployments.length > 0) {\n      throw new Error('Another deployment is in progress');\n    }\n\n    \u002F\u002F Check maintenance window (for production)\n    if (request.targetEnvironment === 'production') {\n      const inWindow = await this.isInMaintenanceWindow();\n      if (!inWindow) {\n        throw new Error('Production deployments only allowed during maintenance windows');\n      }\n    }\n  }\n}\n```\n\n### Step 6: Deployment Verification\n\n```gosu\n\u002F\u002F Post-deployment verification tests\npackage gw.deployment.verify\n\nuses gw.api.util.Logger\nuses gw.api.database.Query\n\nclass DeploymentVerification {\n  private static final var LOG = Logger.forCategory(\"DeploymentVerification\")\n\n  static function runVerification() : VerificationResult {\n    var result = new VerificationResult()\n\n    \u002F\u002F Check database connectivity\n    result.addCheck(\"Database\", verifyDatabaseConnection())\n\n    \u002F\u002F Check product model loaded\n    result.addCheck(\"ProductModel\", verifyProductModel())\n\n    \u002F\u002F Check integrations configured\n    result.addCheck(\"Integrations\", verifyIntegrations())\n\n    \u002F\u002F Check custom Gosu classes loaded\n    result.addCheck(\"CustomCode\", verifyCustomCode())\n\n    return result\n  }\n\n  private static function verifyDatabaseConnection() : boolean {\n    try {\n      var count = Query.make(Account).select().Count\n      LOG.info(\"Database check passed: ${count} accounts found\")\n      return true\n    } catch (e : Exception) {\n      LOG.error(\"Database check failed\", e)\n      return false\n    }\n  }\n\n  private static function verifyProductModel() : boolean {\n    try {\n      var products = gw.api.productmodel.ProductLookup.getAll()\n      LOG.info(\"Product model check passed: ${products.Count} products loaded\")\n      return products.Count > 0\n    } catch (e : Exception) {\n      LOG.error(\"Product model check failed\", e)\n      return false\n    }\n  }\n\n  private static function verifyIntegrations() : boolean {\n    try {\n      \u002F\u002F Verify integration endpoints are configured\n      var endpoints = IntegrationConfig.getAllEndpoints()\n      LOG.info(\"Integration check passed: ${endpoints.Count} endpoints configured\")\n      return true\n    } catch (e : Exception) {\n      LOG.error(\"Integration check failed\", e)\n      return false\n    }\n  }\n\n  private static function verifyCustomCode() : boolean {\n    try {\n      \u002F\u002F Try to instantiate custom classes\n      var instance = new gw.custom.MyCustomClass()\n      LOG.info(\"Custom code check passed\")\n      return true\n    } catch (e : Exception) {\n      LOG.error(\"Custom code check failed\", e)\n      return false\n    }\n  }\n}\n```\n\n## Output\n\n- Configuration package created and validated\n- Deployment manifest with dependencies\n- Blue-green deployment capability\n- Environment promotion workflow\n- Post-deployment verification\n\n## Error Handling\n\n| Error | Cause | Solution |\n|-------|-------|----------|\n| Package validation failed | Missing required files | Check manifest and include all files |\n| Deployment timeout | Large package or slow network | Increase timeout, optimize package |\n| Health check failed | Application errors | Check logs, fix issues, redeploy |\n| Rollback failed | State inconsistency | Manual intervention required |\n\n## Resources\n\n- [Guidewire Cloud Deployment Guide](https:\u002F\u002Fdocs.guidewire.com\u002Fcloud\u002F)\n- [Configuration Package Reference](https:\u002F\u002Fdocs.guidewire.com\u002Feducation\u002F)\n\n## Next Steps\n\nFor webhook and event handling, see `guidewire-webhooks-events`.\n",{"name":5,"author":52,"license":15,"version":53,"description":54,"allowed-tools":55},"Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Deploy Guidewire InsuranceSuite integrations to Guidewire Cloud Platform.\nUse when deploying configuration packages, managing releases,\nor implementing blue-green deployments.\nTrigger with phrases like \"deploy guidewire\", \"guidewire cloud deployment\",\n\"release management\", \"configuration deployment\", \"guidewire 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-deploy-integration",231,"https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust","https:\u002F\u002Fgithub.com\u002FDicklesworthstone","https:\u002F\u002Fwww.jeffreyemanuel.com\u002F","Building in NY","2026-11-11 01:23:40",{"source":8,"skillName":5,"commands":66,"prompt":76,"zipAvailable":77},[67,70,73],{"tool":68,"command":69},"npx","npx skills add Dicklesworthstone\u002Fpi_agent_rust --skill guidewire-deploy-integration",{"tool":71,"command":72},"bunx","bunx skills add Dicklesworthstone\u002Fpi_agent_rust --skill guidewire-deploy-integration",{"tool":74,"command":75},"pnpm","pnpm dlx skills add Dicklesworthstone\u002Fpi_agent_rust --skill guidewire-deploy-integration","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fguidewire-pack\u002Fskills\u002Fguidewire-deploy-integration\u002FSKILL.md",true,[],[80,119,144,170,196,218],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":84,"licenseFileUrl":85,"sourceHtmlUrl":86,"categories":87,"keywords":91,"publishedAt":47},"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",[88],{"categoryNo":89,"categoryName":90,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118],"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","multi","for","jsx","suite",{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":84,"licenseFileUrl":123,"sourceHtmlUrl":124,"categories":125,"keywords":130,"publishedAt":47},"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",[126,129],{"categoryNo":127,"categoryName":128,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":89,"categoryName":90,"taxonomyType":21,"taxonomyTypeDesc":22},[131,132,133,97,134,135,93,136,137,138,107,139,140,141,142,143,116],"testing","webapp testing","webapp","screenshots","playwright","debugging","toolkit","browser","logs","applications","behavior","local","with",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":148,"sourceHtmlUrl":149,"categories":150,"keywords":151,"publishedAt":47},"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",[],[152,153,154,155,156,157,158,159,110,160,161,162,163,164,165,166,143,167,168,169,116,28],"analysis","neuropixels analysis","spike","metrics","data","open","quality","user","recordings","Neural","motion","visual","quality metrics","unit","sorting","curation","recording","load",{"skillNo":171,"name":172,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":84,"licenseFileUrl":174,"sourceHtmlUrl":175,"categories":176,"keywords":180,"publishedAt":47},"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",[177],{"categoryNo":178,"categoryName":179,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[181,182,183,184,185,186,187,188,42,189,190,191,192,193,143,116,194,28,195],"skill creator","creator","workflows","create","update","capabilities","knowledge","tool","specialized","guide","new skill","existing skill","users","Existing","new",{"skillNo":197,"name":198,"nameZh":6,"description":199,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":200,"sourceHtmlUrl":201,"categories":202,"keywords":204,"publishedAt":47},"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",[203],{"categoryNo":178,"categoryName":179,"taxonomyType":21,"taxonomyTypeDesc":22},[198,205,206,207,208,209,210,138,211,212,110,213,214,215,216,116,217],"google","browser automation","gemini","automation","auth","code","library","management","only","document","query","Citation","source",{"skillNo":219,"name":220,"nameZh":6,"description":221,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":84,"licenseFileUrl":222,"sourceHtmlUrl":223,"categories":224,"keywords":231,"publishedAt":47},"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",[225,228],{"categoryNo":226,"categoryName":227,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":229,"categoryName":230,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[232,233,234,182,235,108,236,237,187,110,238,193,239,240,241,116,242,28],"slack gif creator","slack","gif","validation","constraints","Animation","me","make","Utilities","concepts","request"]