home / skills / windmill-labs / windmill / write-script-go
This skill helps you write Go scripts for Windmill workflows, returning JSON-serializable results and proper error handling.
npx playbooks add skill windmill-labs/windmill --skill write-script-goReview the files below or copy the command above to add this skill to your agents.
---
name: write-script-go
description: MUST use when writing Go scripts.
---
## CLI Commands
Place scripts in a folder. After writing, run:
- `wmill script generate-metadata` - Generate .script.yaml and .lock files
- `wmill sync push` - Deploy to Windmill
Use `wmill resource-type list --schema` to discover available resource types.
# Go
## Structure
The file package must be `inner` and export a function called `main`:
```go
package inner
func main(param1 string, param2 int) (map[string]interface{}, error) {
return map[string]interface{}{
"result": param1,
"count": param2,
}, nil
}
```
**Important:**
- Package must be `inner`
- Return type must be `({return_type}, error)`
- Function name is `main` (lowercase)
## Return Types
The return type can be any Go type that can be serialized to JSON:
```go
package inner
type Result struct {
Name string `json:"name"`
Count int `json:"count"`
}
func main(name string, count int) (Result, error) {
return Result{
Name: name,
Count: count,
}, nil
}
```
## Error Handling
Return errors as the second return value:
```go
package inner
import "errors"
func main(value int) (string, error) {
if value < 0 {
return "", errors.New("value must be positive")
}
return "success", nil
}
```
This skill guides writing Go scripts that run inside the platform and become webhooks, workflows, or UI actions. It enforces the required package, function signature, and JSON-serializable return types so scripts integrate reliably. Follow the CLI steps to generate metadata and deploy scripts to the platform.
It inspects Go source files to ensure the package is named inner and that a function called main exists with a (T, error) return signature. It validates that return types are JSON-serializable and that errors are returned as the second value. After coding, it helps generate .script.yaml/.lock metadata and push the script to the platform using the CLI.
What must my Go package be named?
Package must be named inner exactly.
How should my function be declared?
Export a function named main that returns (T, error), where T is any JSON-serializable type.