CtrlK
CommunityDocumentationLog inGet started
Tessl Logo

guidewire-local-dev-loop

tessl install github:jeremylongshore/claude-code-plugins-plus-skills --skill guidewire-local-dev-loop
github.com/jeremylongshore/claude-code-plugins-plus-skills

Configure local Guidewire development workflow with Guidewire Studio, Gosu debugging, and hot reload capabilities. Use when setting up development environment, configuring IDE, or optimizing dev workflow. Trigger with phrases like "guidewire local dev", "guidewire studio setup", "gosu development", "guidewire debugging", "configure guidewire ide".

Review Score

78%

Validation Score

13/16

Implementation Score

65%

Activation Score

90%

Guidewire Local Dev Loop

Overview

Set up an efficient local development workflow with Guidewire Studio, including hot reload, Gosu debugging, and continuous testing.

Prerequisites

  • JDK 17 installed and configured
  • IntelliJ IDEA (Ultimate recommended) or Guidewire Studio
  • Gradle 8.x
  • Git for version control
  • Access to Guidewire Cloud sandbox environment

Instructions

Step 1: Configure IDE Settings

# IntelliJ IDEA settings for Guidewire
# File > Settings > Build, Execution, Deployment > Build Tools > Gradle

# Set Gradle JVM to JDK 17
# Enable auto-import for Gradle projects
# Set test runner to Gradle

IntelliJ Plugins to Install:

  • Gosu Language Support
  • Guidewire Studio Plugin
  • EditorConfig

Step 2: Project Structure Setup

# Standard Guidewire project structure
project-root/
├── build.gradle                 # Main build configuration
├── settings.gradle              # Multi-project settings
├── gradle.properties            # Gradle properties
├── modules/
│   ├── configuration/           # Gosu configuration code
│   │   ├── gsrc/               # Gosu source files
│   │   └── config/             # XML configuration
│   └── integration/             # Integration code
├── database/
│   └── upgrade/                 # Database upgrade scripts
└── build/
    └── idea/                    # IDE-specific files

Step 3: Configure Local Server

// build.gradle - Local server configuration
plugins {
    id 'com.guidewire.gradle' version '10.12.0'
}

guidewire {
    server {
        port = 8080
        debugPort = 5005
        jvmArgs = [
            '-Xmx4g',
            '-XX:+UseG1GC',
            '-Dgw.server.mode=dev'
        ]
    }

    database {
        server = 'localhost'
        port = 5432
        name = 'pc_dev'
        username = 'postgres'
        password = System.getenv('DB_PASSWORD') ?: 'password'
    }
}

// Hot reload configuration
tasks.register('devServer') {
    dependsOn 'classes'
    doLast {
        exec {
            commandLine 'java', '-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005',
                '-jar', 'build/libs/server.jar'
        }
    }
}

Step 4: Database Setup

# Create local development database
createdb -U postgres pc_dev

# Run database upgrade
./gradlew dbUpgrade

# Reset database (caution: destroys data)
./gradlew dbReset

# Generate sample data
./gradlew loadSampleData

Step 5: Start Development Server

# Start server with hot reload
./gradlew runServer

# Start with debugging enabled
./gradlew runServer --debug-jvm

# Start specific application
./gradlew :policycenter:runServer

Step 6: Configure Hot Reload

// Enable Gosu hot swap in development
// config/dev-config.xml
<config>
  <development>
    <hot-swap enabled="true"/>
    <gosu-reload enabled="true"/>
    <pcf-reload enabled="true"/>
  </development>
</config>

IDE Configuration for Hot Reload:

  1. Run > Edit Configurations > Remote JVM Debug
  2. Set port to 5005
  3. Start debug session after server is running

Gosu Development Workflow

Create New Gosu Class

// gsrc/gw/custom/MyService.gs
package gw.custom

uses gw.api.database.Query
uses gw.api.util.Logger

class MyService {
  private static final var LOG = Logger.forCategory("MyService")

  static function processPolicy(policyNumber : String) : Policy {
    LOG.info("Processing policy: ${policyNumber}")

    var policy = Query.make(Policy)
      .compare(Policy#PolicyNumber, Equals, policyNumber)
      .select()
      .AtMostOneRow

    if (policy == null) {
      throw new IllegalArgumentException("Policy not found: ${policyNumber}")
    }

    // Business logic here
    return policy
  }
}

Unit Testing

// test/gsrc/gw/custom/MyServiceTest.gs
package gw.custom

uses gw.testharness.v3.PLTestCase
uses gw.testharness.v3.PLAssert

class MyServiceTest extends PLTestCase {

  function testProcessPolicy() {
    // Setup test data
    var account = createTestAccount()
    var policy = createTestPolicy(account)

    // Execute
    var result = MyService.processPolicy(policy.PolicyNumber)

    // Assert
    PLAssert.assertNotNull(result)
    PLAssert.assertEquals(policy.PolicyNumber, result.PolicyNumber)
  }

  private function createTestAccount() : Account {
    var account = new Account()
    account.AccountNumber = "TEST-" + System.currentTimeMillis()
    account.Bundle.commit()
    return account
  }
}

Run Tests

# Run all tests
./gradlew test

# Run specific test class
./gradlew test --tests "gw.custom.MyServiceTest"

# Run with coverage
./gradlew test jacocoTestReport

# Continuous testing (watch mode)
./gradlew test --continuous

PCF Development

<!-- pcf/AccountDetailScreen.pcf -->
<?xml version="1.0"?>
<PCF
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="pcf.xsd">
  <Screen
    id="AccountDetailScreen"
    editable="true">
    <Require var="account" type="Account"/>

    <Toolbar>
      <ToolbarButton
        action="saveAccount()"
        id="SaveButton"
        label="Save"/>
    </Toolbar>

    <DetailViewPanel>
      <InputColumn>
        <TextInput
          editable="true"
          id="AccountNumber"
          label="Account Number"
          value="account.AccountNumber"/>
        <TextInput
          editable="true"
          id="AccountName"
          label="Account Name"
          value="account.AccountHolderContact.DisplayName"/>
      </InputColumn>
    </DetailViewPanel>

    <Code>
      <![CDATA[
      function saveAccount() {
        account.Bundle.commit()
        util.LocationUtil.addRequestScopedInfoMessage("Account saved")
      }
      ]]>
    </Code>
  </Screen>
</PCF>

Output

  • Running local development server
  • Hot reload enabled for Gosu and PCF changes
  • Debug session attached to IDE
  • Unit tests executing successfully

Error Handling

ErrorCauseSolution
Port already in useServer already runningKill existing process or change port
Database connection failedWrong credentials/missing DBCheck postgres is running
Gosu compilation errorSyntax errorCheck IDE error highlights
Hot reload not workingDebug not attachedReconnect debugger
Out of memoryInsufficient heapIncrease -Xmx in jvmArgs

Development Commands Cheatsheet

# Build
./gradlew clean build

# Run server
./gradlew runServer

# Database operations
./gradlew dbUpgrade
./gradlew dbReset
./gradlew loadSampleData

# Testing
./gradlew test
./gradlew test --tests "ClassName.methodName"
./gradlew test --continuous

# Code quality
./gradlew gosucheck
./gradlew spotlessApply

# Generate API documentation
./gradlew apiDoc

IDE Keyboard Shortcuts

ActionIntelliJ Shortcut
Hot swap codeCtrl+Shift+F9
Run to cursorAlt+F9
Evaluate expressionAlt+F8
Find usagesAlt+F7
Go to declarationCtrl+B
Refactor renameShift+F6

Resources

  • Guidewire Studio Documentation
  • Gosu Language Reference
  • Gradle Plugin Documentation

Next Steps

For SDK and API patterns, see guidewire-sdk-patterns.