Agent Skills: CUE (+1)

'CUE: Lattice-based configuration language with unification, constraint

UncategorizedID: plurigrid/asi/cue-lang

Install this agent skill to your local

pnpm dlx add-skill https://github.com/plurigrid/asi/tree/HEAD/skills/cue-lang

Skill Files

Browse the full folder contents for cue-lang.

Download Skill

Loading file tree…

skills/cue-lang/SKILL.md

Skill Metadata

Name
cue-lang
Description
'CUE: Lattice-based configuration language with unification, constraint

CUE (+1)

Configuration, data validation, and code generation via lattice unification.

Trit: +1 (PLUS - generative type lattice) Language: Go Branch: master

Core Insight: Values ARE Types

// In CUE, every value is also a type constraint
name: string        // type constraint
name: "alice"       // concrete value IS a subtype

// Unification: greatest lower bound
a: {x: int, y: string}
b: {x: 1, z: bool}
c: a & b  // → {x: 1, y: string, z: bool}

Lattice Type System

           ⊤ (any)
          / | \
       int str bool
        |   |   |
        1  "a" true
          \ | /
           ⊥ (error)

Unification = Greatest Lower Bound (GLB)
int & 1 → 1
int & string → ⊥ (error)

Key Features

| Feature | CUE | JSON Schema | TypeScript | |---------|-----|-------------|------------| | Values = Types | ✓ | ✗ | ✗ | | Unification | ✓ | ✗ | ✗ | | Constraints | ✓ | Partial | Partial | | Code gen | ✓ | ✗ | ✗ | | Turing-complete | ✗ | ✗ | ✓ |

CUE is intentionally NOT Turing-complete - guarantees termination.

Syntax Essentials

package myconfig

import "list"

// Definitions (templates)
#Person: {
    name:  string
    age:   int & >=0 & <=150
    email: =~"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
}

// Concrete values
alice: #Person & {
    name:  "Alice"
    age:   30
    email: "alice@example.com"
}

// List comprehensions
numbers: [1, 2, 3, 4, 5]
doubled: [for x in numbers {x * 2}]

// Disjunction (sum types)
Status: "pending" | "active" | "complete"

Schema Integration

# CUE → JSON Schema
cue export --out jsonschema schema.cue

# CUE → OpenAPI
cue export --out openapi api.cue

# Go types → CUE
cue get go ./pkg/...

# Validate YAML/JSON against CUE
cue vet data.yaml schema.cue

Comparison with Nickel

| Aspect | CUE | Nickel | |--------|-----|--------| | Type system | Lattice unification | Gradual typing + contracts | | Evaluation | Lazy, no side effects | Lazy, pure | | Turing-complete | No (terminates) | Yes | | Error messages | Structural | Blame tracking | | Primary use | K8s/Cloud config | General config |

Sexp Bridge

// CUE can export to various formats
output: json.Marshal(config)   // → JSON
output: yaml.Marshal(config)   // → YAML

// For sexp, use external tool:
// cue export config.cue | json2sexp

Integration with lispsyntax-acset:

# Julia: parse CUE output, convert to sexp
using JSON3, LispSyntax

cue_json = read(`cue export config.cue`, String)
data = JSON3.read(cue_json)
sexp = json_to_sexp(data)  # Custom bridge

GF(3) Config Triad

CUE (+1)    + Nickel (0)  + Hof (-1)    = 0 ✓
generative   ergodic       extractive
schemas      contracts     code gen

Sexp Neighborhood

| Skill | Trit | Bridge to CUE | |-------|------|---------------| | hof | -1 | Consumes CUE, generates code | | nickel | 0 | Alternative with contracts | | lispsyntax-acset | 0 | CUE → JSON → sexp → ACSet | | geb | +1 | Both use algebraic types | | gay-mcp | +1 | Color CUE schema elements |

Usage

# Install
go install cuelang.org/go/cmd/cue@latest

# Evaluate
cue eval config.cue

# Export to JSON
cue export config.cue

# Validate
cue vet data.yaml schema.cue

# Format
cue fmt *.cue

# Get Go types
cue get go ./...

Kubernetes Example

package k8s

import "k8s.io/api/apps/v1"

#Deployment: v1.#Deployment & {
    apiVersion: "apps/v1"
    kind:       "Deployment"
    metadata: {
        name:      string
        namespace: string | *"default"
    }
    spec: {
        replicas: int & >=1 & <=100 | *3
        selector: matchLabels: app: metadata.name
        template: {
            metadata: labels: app: metadata.name
            spec: containers: [...#Container]
        }
    }
}

#Container: {
    name:  string
    image: string
    ports: [...{containerPort: int}]
}

CLI Commands

# Core commands
cue eval      # Evaluate and print
cue export    # Export to JSON/YAML/etc
cue vet       # Validate data
cue def       # Print definitions
cue fmt       # Format files
cue get       # Import from Go/Proto
cue mod       # Module management
cue trim      # Remove redundant values

End-of-Skill Interface

Related Skills

| Skill | Trit | Relationship | |-------|------|--------------| | hof | -1 | CUE consumer for codegen | | nickel | 0 | Alternative approach | | geb | +1 | Algebraic type sibling | | acsets | 0 | Schema → ACSet bridge |


Trit: +1 (PLUS - generative lattice) Key Property: Unification-based config with guaranteed termination Philosophy: Values ARE types, constraints compose via GLB


Autopoietic Marginalia

The interaction IS the skill improving itself.

Every use of this skill is an opportunity for worlding:

  • MEMORY (-1): Record what was learned
  • REMEMBERING (0): Connect patterns to other skills
  • WORLDING (+1): Evolve the skill based on use

Add Interaction Exemplars here as the skill is used.