op

package
v0.1.0-dev.20260305044717 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 5, 2026 License: MIT Imports: 21 Imported by: 0

Documentation

Overview

Package op owns the concrete graph data model types shared by the execution engine, Starlark layer, and CLI tools.

Core Types

  • Graph: A directed graph of nodes and edges representing work to be done
  • Node: A single unit of work with an action to execute
  • Edge: A dependency relationship between nodes

Graph Lifecycle

The Graph represents both plans (before execution) and receipts (after execution):

  • Before Run(): State is "pending", nodes describe what will happen
  • After Run(): State is "executed", nodes describe what happened
  • Serialized before execution: "dry-run" or "purchase order"
  • Serialized after execution: "receipt"

Index

Constants

View Source
const (
	SchemeFile    = "file"
	SchemeGit     = "git"
	SchemePackage = "pkg"
	SchemeService = "svc"
	SchemeMem     = "mem"
)

URI scheme constants.

View Source
const GraphFormatVersion = "6"

GraphFormatVersion is the current graph serialization format version.

Variables

View Source
var ErrDrifted = errors.New("state has drifted: compensation unsafe")

ErrDrifted indicates that a reconcile check detected external modification, making compensation unsafe. The entry is skipped during Unwind.

View Source
var ErrNotCompensable = errors.New("action is not compensable")

ErrNotCompensable signals that an action acknowledges rollback but cannot undo its effect. The executor logs a warning and continues unwinding.

Functions

func AnyToStarlarkValue

func AnyToStarlarkValue(v any) starlark.Value

AnyToStarlarkValue converts a Go any that carries a starlark.Value to a starlark.Value. Returns starlark.None if nil.

func Construct

func Construct[T any](value any) (T, error)

Construct uses the constructor registry to convert value to type T. Returns an error if no constructor is registered for T or if the constructor rejects the value.

func FillSlot

func FillSlot(node *Node, graph *Graph, slotName string, value starlark.Value) error

FillSlot fills a slot in a node from a Starlark value.

Any slot accepts:

  • A promise (Output): creates an edge, value flows at runtime
  • A gather (Gather): creates edges from all members (parallel execution)
  • An immediate value: stored directly, known at analysis time

func GenerateNodeID

func GenerateNodeID(prefix string, components ...string) string

GenerateNodeID creates a unique node ID with the given prefix and components.

func GitStyleChecksum

func GitStyleChecksum(objectType, basename string, content []byte) string

GitStyleChecksum computes a git-style checksum. Format: SHA256("<type> <basename> <len>\0<content>") Returns format "sha256:<hex>".

func GoToStarlarkValue

func GoToStarlarkValue(v any) (starlark.Value, error)

GoToStarlarkValue converts a native Go value to a Starlark value.

func HydrateGraph

func HydrateGraph(g *Graph, reg *ActionRegistry) error

HydrateGraph replaces stub actions on graph nodes with real actions from the registry. This enables loaded/deserialized graphs to be executed. Nodes with no action name (e.g., nodes that were never serialized with an action) are skipped.

func MakeAttr

func MakeAttr(name string, fn builtinFunc) starlark.Value

MakeAttr creates a starlark.Builtin from a receiver method.

func NoSuchAttrError

func NoSuchAttrError(receiver, attr string) error

NoSuchAttrError returns an error for an unknown attribute.

func RegisterAllProviders

func RegisterAllProviders(reg *ActionRegistry)

RegisterAllProviders calls ActionRegistrar for every registered provider binding. Used by consumers that only need action registration without Starlark globals (tests, migrate, execution engine).

func RegisterBinding

func RegisterBinding(b *ProviderBinding)

RegisterBinding merges a partial ProviderBinding into the registry. Multiple init() functions may register for the same provider name; non-nil fields are merged into the existing entry.

func RegisterConstructor

func RegisterConstructor[T any](fn func(any) (T, error))

RegisterConstructor registers a function that constructs a Go value from a simpler representation (e.g., string → Blob via NewBlob).

func RegisterPlanTimeConstructor

func RegisterPlanTimeConstructor[T any](fn func(any) (T, error))

RegisterPlanTimeConstructor registers a function that constructs a URI-only resource from a simpler representation (e.g., string → Resource). Unlike RegisterConstructor, the plan-time constructor must not perform I/O.

func RegisterReceiverParams

func RegisterReceiverParams[T any](name string, params MethodParams)

RegisterReceiverParams registers a Go struct type as a Starlark receiver. When marshalReflect encounters *T, it wraps it with WrapReceiver using the given name and params instead of flattening to a field-only struct.

func RegisterReflectedActions

func RegisterReflectedActions(reg *ActionRegistry, name string, provider any, params MethodParams)

RegisterReflectedActions registers all action methods on a provider. Methods must return error as their last value to qualify as actions. Methods without error returns (e.g., Exists, IsDir) are skipped — they are immediate-only, not graph actions.

Arity determines action type:

  • 1 return (error) → Action (error-only, no result)
  • 2 returns (result, error) → Action
  • 3 returns (result, undo, error) → CompensableAction

Every CompensableAction (3 returns) must have a Compensate<GoName> companion method. Missing pairs panic at registration time.

func StarlarkDictToMap

func StarlarkDictToMap(dict *starlark.Dict) (map[string]any, error)

StarlarkDictToMap converts a Starlark dict to a Go map[string]any.

func StarlarkListToSlice

func StarlarkListToSlice(list *starlark.List) (any, error)

StarlarkListToSlice converts a Starlark list to a Go slice. Returns []string if all elements are strings, []any otherwise.

func StarlarkValueToGo

func StarlarkValueToGo(v starlark.Value) (any, error)

StarlarkValueToGo converts a Starlark value to a native Go value.

func StringSliceToList

func StringSliceToList(s []string) *starlark.List

StringSliceToList converts a Go []string to a Starlark list of strings.

Types

type AccessType

type AccessType string

AccessType defines when a provider's methods are available.

const (
	AccessImmediate AccessType = "immediate" // direct call during plan construction
	AccessPlanned   AccessType = "planned"   // graph node only — executed at runtime
	AccessBoth      AccessType = "both"      // available in both projections
)

Access level constants define when a provider method is available.

type Action

type Action interface {

	// Name returns the action identifier (e.g., "file.link", "template.render").
	Name() string

	// Do executes the action with the given context and resolved slot values.
	//
	// Parameters:
	//   - ctx: execution context
	//   - slots: resolved slot values
	//
	// Returns:
	//   - result: A result for downstream nodes
	//   - undo: undo state for saga rollback
	//   - err: any error encountered during execution
	Do(ctx *Context, slots map[string]any) (Result, UndoState, error)
}

Action is the forward-only interface. All executable actions implement this. Actions receive resolved slots — they never touch *Node. The executor resolves all promise slots before calling Do.

func StubAction

func StubAction(name string) Action

StubAction creates a named action stub for testing and receipt deserialization. The stub is not executable — the executor replaces stubs via HydrateGraph.

type ActionRegistry

type ActionRegistry struct {
	// contains filtered or unexported fields
}

ActionRegistry maps action names to their implementations. Each tool registers its actions before calling GraphExecutor.Run().

func NewActionRegistry

func NewActionRegistry() *ActionRegistry

NewActionRegistry creates an empty action registry.

func (*ActionRegistry) Get

func (r *ActionRegistry) Get(name string) (Action, bool)

Get returns the action registered under the given name.

func (*ActionRegistry) MustGet

func (r *ActionRegistry) MustGet(name string) Action

MustGet returns the action registered under the given name. Panics if the action is not registered (safe: all actions are pre-registered before any builder runs).

func (*ActionRegistry) Names

func (r *ActionRegistry) Names() []string

Names returns all registered action names.

func (*ActionRegistry) Register

func (r *ActionRegistry) Register(action Action)

Register adds an action to the registry. If an action with the same name already exists, it is replaced.

type Attempt

type Attempt struct {
	// Number is the 1-based attempt number.
	Number int `json:"number" yaml:"number"`

	// Status is "completed" or "failed".
	Status string `json:"status" yaml:"status"`

	// Error is the error message if the attempt failed.
	Error string `json:"error,omitempty" yaml:"error,omitempty"`

	// Timestamp is when this attempt completed (RFC3339).
	Timestamp string `json:"timestamp" yaml:"timestamp"`
}

Attempt records one execution attempt of a phase.

type BackoffStrategy

type BackoffStrategy string

BackoffStrategy defines how delays increase between retries.

const (
	// BackoffNone applies no delay between retries.
	BackoffNone BackoffStrategy = "none"
	// BackoffLinear increases delay linearly between retries.
	BackoffLinear BackoffStrategy = "linear"
	// BackoffExponential doubles the delay between each retry.
	BackoffExponential BackoffStrategy = "exponential"
)

BackoffStrategy constants define the available retry backoff strategies.

type BindingConfig

type BindingConfig struct {
	// Writer is the output destination for immediate receivers (e.g., ui.note).
	Writer io.Writer

	// ProgramName identifies the running tool (e.g., "lore", "writ").
	ProgramName string

	// Color enables ANSI color codes in output.
	Color bool

	// WorkDir is the working directory for providers that operate on files.
	// If empty, providers should default to the current working directory.
	WorkDir string
}

BindingConfig holds configuration for constructing Starlark bindings. Passed to ImmediateFactory functions so immediate receivers can write output and identify the running program.

type Collision

type Collision struct {
	Target            string `json:"target" yaml:"target"`
	Winner            string `json:"winner" yaml:"winner"`
	WinnerLayer       string `json:"winner_layer,omitempty" yaml:"winner_layer,omitempty"`
	WinnerSpecificity int    `json:"winner_specificity,omitempty" yaml:"winner_specificity,omitempty"`
	Loser             string `json:"loser" yaml:"loser"`
	LoserLayer        string `json:"loser_layer,omitempty" yaml:"loser_layer,omitempty"`
	LoserSpecificity  int    `json:"loser_specificity,omitempty" yaml:"loser_specificity,omitempty"`
}

Collision records a source conflict resolved during tree building (writ-specific).

type CompensableAction

type CompensableAction interface {
	Action

	// Undo performs the compensating action using the state captured by Do.
	//
	// Parameters:
	//   - ctx: execution context
	//   - state: undo state captured by Do
	//
	// Returns:
	//   - err: any error encountered during compensation
	Undo(ctx *Context, undo UndoState) error
}

CompensableAction is the backward-only interface.

All actions that can be undone implement this.

type Context

type Context struct {
	context.Context // https://pkg.go.dev/context

	// Catalog is the resource catalog for the current execution session.
	// The action layer uses it to shadow Resource results after dispatch.
	// Nil when running without catalog integration (e.g., tests).
	Catalog *ResourceCatalog

	// Data holds tool-provided context: template variables, SOPS config,
	// identities, segment maps, etc. Each tool populates this before
	// calling GraphExecutor.Run().
	Data map[string]any

	// DryRun prevents filesystem modifications when true.
	DryRun bool

	// Graph is the graph being executed. Flow actions use this to look up
	// phases referenced by their slots (e.g., gather body, choose branch).
	Graph *Graph

	// NodeID is the ID of the currently executing node. Flow actions use
	// this to identify themselves (e.g., gather uses it for proxy context).
	NodeID string

	// Platform provides platform abstractions (package manager, service
	// manager) to action providers. Nil when running in environments
	// where host access is not needed (e.g., pure data transforms).
	Platform *Platform

	// Writer receives user-facing output messages.
	Writer io.Writer
}

Context provides execution context to actions.

type Edge

type Edge struct {
	From string `json:"from" yaml:"from"`
	To   string `json:"to" yaml:"to"`
}

Edge represents a dependency relationship between two nodes. From must complete before To can begin execution.

type Encoder

type Encoder interface {
	Encode(v any) error
}

Encoder is the interface for graph serialization. Both *json.Encoder and *yaml.Encoder satisfy this interface.

type Gather

type Gather struct {
	// contains filtered or unexported fields
}

Gather represents a collection of outputs that can run in parallel. When used as a slot input, it creates edges from ALL members to the consumer, enabling parallel execution of the gathered nodes.

Usage in Starlark:

a = plan.file.copy(src1, dst1)
b = plan.file.copy(src2, dst2)
c = plan.file.copy(src3, dst3)
group = plan.gather(a, b, c)
d = plan.whatever(group)  # d waits for a, b, c (which run in parallel)

func NewGather

func NewGather(graph *Graph, outputs ...*Output) *Gather

NewGather creates a new Gather from multiple outputs.

func (*Gather) FillSlot

func (g *Gather) FillSlot(consumer *Node, slotName string)

FillSlot fills a slot in the consumer node with all gathered promises, creating edges from each member. This enables parallel execution.

func (*Gather) Freeze

func (g *Gather) Freeze()

Freeze implements starlark.Value.

func (*Gather) Hash

func (g *Gather) Hash() (uint32, error)

Hash implements starlark.Value.

func (*Gather) Outputs

func (g *Gather) Outputs() []*Output

Outputs returns the gathered outputs.

func (*Gather) String

func (g *Gather) String() string

String implements starlark.Value.

func (*Gather) Truth

func (g *Gather) Truth() starlark.Bool

Truth implements starlark.Value.

func (*Gather) Type

func (g *Gather) Type() string

Type implements starlark.Value.

type Graph

type Graph struct {
	// Version is the graph format version.
	Version string `json:"version" yaml:"version"`

	// Tool identifies which tool created this graph ("writ" or "lore").
	Tool string `json:"tool" yaml:"tool"`

	// Timestamp is when the graph was created/executed.
	Timestamp time.Time `json:"timestamp" yaml:"timestamp"`

	// State is the execution state (pending, executed, failed).
	State GraphState `json:"state" yaml:"state"`

	// Platform records the OS and architecture.
	Platform Platform `json:"platform" yaml:"platform"`

	// Context contains tool-specific metadata.
	Context GraphContext `json:"context" yaml:"context"`

	// Nodes are the actions to perform/performed.
	Nodes []*Node `json:"nodes" yaml:"nodes"`

	// Edges are the dependencies between nodes.
	Edges []Edge `json:"edges,omitempty" yaml:"edges,omitempty"`

	// Phases defines the ordered lifecycle phases (nil for non-phased graphs).
	// When present, the executor uses phase-aware execution with retry and rollback.
	// When nil, the executor falls back to flat node execution.
	Phases []*Phase `json:"phases,omitempty" yaml:"phases,omitempty"`

	// Collisions records source conflicts resolved during tree building (writ-specific).
	Collisions []Collision `json:"collisions,omitempty" yaml:"collisions,omitempty"`

	// Summary contains execution statistics (populated after Run).
	Summary Summary `json:"summary,omitempty" yaml:"summary,omitempty"`

	// Rollback records compensating actions executed during rollback (populated on failure).
	Rollback []RollbackEntry `json:"rollback,omitempty" yaml:"rollback,omitempty"`

	// Checksum is the git-style integrity hash.
	Checksum string `json:"checksum,omitempty" yaml:"checksum,omitempty"`

	// Signature contains the cryptographic signature (optional).
	Signature *Signature `json:"signature,omitempty" yaml:"signature,omitempty"`

	// Catalog is the append-only resource catalog for planning.
	// One per Graph. Not serialized — planning-only state.
	Catalog *ResourceCatalog `json:"-" yaml:"-"`
}

Graph represents an execution graph containing nodes and edges. This is THE graph used by both writ and lore - they differ only in content.

Before Run(): State is "pending", represents the plan After Run(): State is "executed", represents the receipt

func NewGraph

func NewGraph(tool string) *Graph

NewGraph creates a Graph with common metadata populated. Tool identifies which tool created the graph ("writ" or "lore"). Callers populate Context and add Nodes/Edges after creation.

func (*Graph) CanonicalContent

func (g *Graph) CanonicalContent() ([]byte, error)

CanonicalContent returns the graph serialized as YAML without checksum and signature. This is used for computing checksums and verifying signatures.

func (*Graph) CollectPhaseNodes

func (g *Graph) CollectPhaseNodes(phase *Phase) ([]*Node, []Edge)

CollectPhaseNodes returns the nodes and intra-phase edges for the given phase. Nodes are returned in graph order; edges are filtered to only those between phase-internal nodes.

func (*Graph) ComputeSummary

func (g *Graph) ComputeSummary()

ComputeSummary calculates summary statistics from nodes. For phased graphs, node statuses reflect the phase execution outcome (nodes in rolled-back phases may show as completed from before rollback).

func (*Graph) Filename

func (g *Graph) Filename() string

Filename returns the standard filename for this graph. Format: "<tool>-<timestamp>.yaml"

func (*Graph) PhaseByID

func (g *Graph) PhaseByID(id string) *Phase

PhaseByID returns the phase with the given ID, or nil if not found.

func (*Graph) Serialize

func (g *Graph) Serialize(enc Encoder) error

Serialize writes the graph to the given encoder. The checksum is computed before encoding.

Usage:

enc := yaml.NewEncoder(file)
enc.SetIndent(2)
defer enc.Close()
g.Serialize(enc)

type GraphContext

type GraphContext struct {
	// SourceRoot is the source directory (writ: repo path, lore: registry cache).
	SourceRoot string `json:"source_root,omitempty" yaml:"source_root,omitempty"`

	// TargetRoot is the target directory (typically $HOME).
	TargetRoot string `json:"target_root,omitempty" yaml:"target_root,omitempty"`

	// Projects lists the projects included (writ-specific).
	Projects []string `json:"projects,omitempty" yaml:"projects,omitempty"`

	// Packages lists the packages included (lore-specific).
	Packages []string `json:"packages,omitempty" yaml:"packages,omitempty"`

	// Segments contains platform segment values (writ-specific).
	Segments map[string]string `json:"segments,omitempty" yaml:"segments,omitempty"`

	// Layers lists repository layers used (writ-specific).
	Layers []string `json:"layers,omitempty" yaml:"layers,omitempty"`

	// Platform is the target platform string (lore-specific, e.g., "Darwin", "Linux.Debian").
	TargetPlatform string `json:"target_platform,omitempty" yaml:"target_platform,omitempty"`

	// Features enabled for package installation (lore-specific).
	Features []string `json:"features,omitempty" yaml:"features,omitempty"`

	// Settings for package installation (lore-specific).
	Settings map[string]string `json:"settings,omitempty" yaml:"settings,omitempty"`
}

GraphContext contains tool-specific metadata stored in the graph. Both writ and lore populate this with their relevant context.

type GraphState

type GraphState string

GraphState represents the execution state of the graph.

const (
	// StatePending indicates the graph has not yet been executed.
	StatePending GraphState = "pending"
	// StateExecuted indicates the graph executed successfully.
	StateExecuted GraphState = "executed"
	// StateFailed indicates the graph failed during execution.
	StateFailed GraphState = "failed"
)

GraphState constants define the possible states of a graph.

type HostProvider

type HostProvider interface {
	// PackageManager returns the preferred package manager.
	PackageManager() PackageManagerProvider

	// InstalledBy returns the PM that installed the named package (nil if not installed).
	InstalledBy(name string) PackageManagerProvider

	// AllInstalledBy returns all PMs that have the package installed.
	AllInstalledBy(name string) []PackageManagerProvider

	// GetPackageManager returns a specific PM by name (nil if unavailable).
	GetPackageManager(name string) PackageManagerProvider

	// ServiceManager returns the service manager for this platform.
	ServiceManager() ServiceManagerProvider
}

HostProvider exposes platform abstractions to action providers. Implemented by the adapter in internal/execution wrapping pkg/op/provider/host.Host.

type ImmediateFactory

type ImmediateFactory func(cfg BindingConfig) starlark.Value

ImmediateFactory creates an immediate receiver (e.g., ui) for direct calls during plan construction. Returned by generated immediate_gen.go init() functions.

type MethodParams

type MethodParams map[string][]string

MethodParams maps Go method names (CamelCase) to Starlark parameter name lists. Optional params use the "name?" suffix.

type NoResult

type NoResult struct{}

NoResult signals that a provider method produces no output. Used by CompensableAction methods like Remove and RemoveAll that can be undone but produce no result for downstream nodes. classifyActionReturn maps NoResult to nil Result; classifyReturn maps it to starlark.None.

type Node

type Node struct {
	// ID is the unique identifier (typically relative target path or package name).
	ID string `json:"id" yaml:"id"`

	// Action to perform. Serialized as the action name string; deserialized
	// as a stubAction. The executor calls Do directly via the Action interface.
	Action Action `json:"-" yaml:"-"`

	// Status of this node: pending, completed, skipped, failed.
	Status NodeStatus `json:"status" yaml:"status"`

	// Timestamp is when this action completed.
	Timestamp string `json:"timestamp,omitempty" yaml:"timestamp,omitempty"`

	// Slots holds input values for this node. Each slot can be:
	// - Immediate: value known at analysis time
	// - Promise: reference to another node's output (creates edge)
	Slots map[string]SlotValue `json:"slots,omitempty" yaml:"slots,omitempty"`

	// Project this node belongs to.
	Project string `json:"project,omitempty" yaml:"project,omitempty"`

	// Layer is the repository layer (base, team, personal).
	Layer string `json:"layer,omitempty" yaml:"layer,omitempty"`

	// Error message if status is failed.
	Error string `json:"error,omitempty" yaml:"error,omitempty"`

	// Retry is the retry policy for this node (nil = no retry).
	Retry *RetryPolicy `json:"retry,omitempty" yaml:"retry,omitempty"`

	// Annotations holds extensible metadata (serialized to receipts).
	Annotations map[string]string `json:"annotations,omitempty" yaml:"annotations,omitempty"`
}

Node represents a single unit of work in an execution graph.

func (*Node) ActionName

func (n *Node) ActionName() string

ActionName returns the action name. Works for both live nodes (Action set by executor) and deserialized receipt nodes (stubAction).

func (*Node) GetID

func (n *Node) GetID() string

GetID returns the node's unique identifier.

func (*Node) GetProject

func (n *Node) GetProject() string

GetProject returns the project name.

func (*Node) GetSlot

func (n *Node) GetSlot(name string) any

GetSlot returns the resolved value of a slot. If the slot is a promise, returns nil (must be resolved by executor).

func (Node) MarshalJSON

func (n Node) MarshalJSON() ([]byte, error)

MarshalJSON serializes the node with Action as its name string.

func (Node) MarshalYAML

func (n Node) MarshalYAML() (any, error)

MarshalYAML serializes the node with Action as its name string. Note: we cannot use the nodeJSONWire embedding pattern here because yaml.v3 panics on unexported concrete types behind interfaces in shadowed embedded fields, and fails to decode embedded fields when names collide (unlike encoding/json which handles both correctly). We round-trip through JSON instead.

func (*Node) RequireStringSlot

func (n *Node) RequireStringSlot(name string) (string, error)

RequireStringSlot returns the string value of a required slot. Returns an error if the slot is not set, or holds a non-string value. An empty string is valid — use GetSlot for optional slots where zero value is acceptable.

func (*Node) ResolvedSlots

func (n *Node) ResolvedSlots(results map[string]any, proxyCtx ...map[string]any) map[string]any

ResolvedSlots returns all slot values as a flat map. Promise slots are resolved from the results map; immediate slots are returned directly. Proxy slots are resolved from the optional proxyCtx map (used by gather for per-iteration item binding). Pass nil for results when all slots are immediate (e.g., in tests).

func (*Node) SetSlotImmediate

func (n *Node) SetSlotImmediate(name string, value any)

SetSlotImmediate sets a slot to an immediate value.

func (*Node) SetSlotPromise

func (n *Node) SetSlotPromise(name, nodeRef, slot string)

SetSlotPromise sets a slot to a promise (reference to another node).

func (*Node) SetSlotProxy

func (n *Node) SetSlotProxy(name, gatherRef, field string)

SetSlotProxy sets a slot to a gather proxy reference.

func (*Node) UnmarshalJSON

func (n *Node) UnmarshalJSON(data []byte) error

UnmarshalJSON deserializes a node, creating a stubAction from the action name.

func (*Node) UnmarshalYAML

func (n *Node) UnmarshalYAML(value *yaml.Node) error

UnmarshalYAML deserializes a node, creating a stubAction from the action name. Like MarshalYAML, we avoid the embedded struct pattern and decode manually.

type NodeStatus

type NodeStatus string

NodeStatus represents the execution status of a node.

const (
	// StatusPending indicates the node has not yet been executed.
	StatusPending NodeStatus = "pending"
	// StatusCompleted indicates the node executed successfully.
	StatusCompleted NodeStatus = "completed"
	// StatusSkipped indicates the node was skipped.
	StatusSkipped NodeStatus = "skipped"
	// StatusFailed indicates the node failed during execution.
	StatusFailed NodeStatus = "failed"
)

NodeStatus constants define the possible statuses of a node.

type Output

type Output struct {
	// contains filtered or unexported fields
}

Output represents a promise - a handle to a node's output that can flow through the graph to fill slots in other nodes.

When passed to a plan function's slot, it creates an edge in the graph. The same promise can flow to multiple slots (fan-out).

func NewOutput

func NewOutput(node *Node, graph *Graph, slot string) *Output

NewOutput creates a new Output (promise) representing a node's output.

func ResolveInput

func ResolveInput(value starlark.Value) (*Output, error)

ResolveInput extracts an *Output from a Starlark value. Returns an error if the value is not an Output.

func (*Output) Attr

func (o *Output) Attr(name string) (starlark.Value, error)

Attr implements starlark.HasAttrs.

func (*Output) AttrNames

func (o *Output) AttrNames() []string

AttrNames implements starlark.HasAttrs.

func (*Output) DependOn

func (o *Output) DependOn(consumer *Node)

DependOn creates an edge making the given node depend on this output's node.

func (*Output) FillSlot

func (o *Output) FillSlot(consumer *Node, slotName string)

FillSlot fills a slot in the consumer node with this promise, creating an edge. This is called when a promise is passed to a plan function.

func (*Output) Freeze

func (o *Output) Freeze()

Freeze implements starlark.Value.

func (*Output) Graph

func (o *Output) Graph() *Graph

Graph returns the execution graph.

func (*Output) Hash

func (o *Output) Hash() (uint32, error)

Hash implements starlark.Value.

func (*Output) Node

func (o *Output) Node() *Node

Node returns the node that produces this output.

func (*Output) Path

func (o *Output) Path() string

Path returns a path from the node's slots.

func (*Output) Slot

func (o *Output) Slot() string

Slot returns which output slot this represents.

func (*Output) String

func (o *Output) String() string

String implements starlark.Value.

func (*Output) Truth

func (o *Output) Truth() starlark.Bool

Truth implements starlark.Value.

func (*Output) Type

func (o *Output) Type() string

Type implements starlark.Value.

type PackageManager

type PackageManager interface {
	Name() string
	Installed(name string) bool
	Version(name string) string
	Available(name string) bool
	Search(query string, limit int) []SearchResult
	Install(packages ...string) PlatformResult
	Remove(name string) PlatformResult
	Update() PlatformResult
	AddRepo(url, keyURL, name string) PlatformResult
	NeedsSudo() bool
}

PackageManager abstracts package manager operations.

type PackageManagerProvider

type PackageManagerProvider interface {
	// Name returns the package manager identifier (e.g., "brew", "apt").
	Name() string

	// Installed checks if a package is installed.
	Installed(name string) bool

	// Version returns the installed version of a package.
	Version(name string) string

	// Available checks if a package exists in the repositories.
	Available(name string) bool

	// Install installs one or more packages.
	Install(packages ...string) error

	// Remove removes a package.
	Remove(name string) error

	// Update refreshes the package index.
	Update() error

	// NeedsSudo returns true if operations require privilege elevation.
	NeedsSudo() bool
}

PackageManagerProvider abstracts package manager operations.

type Phase

type Phase struct {
	// ID is the unique identifier (e.g., "phase.install").
	ID string `json:"id" yaml:"id"`

	// Name is the phase name (e.g., "install").
	Name string `json:"name" yaml:"name"`

	// Status of this phase: pending, completed, failed, rolled_back, skipped.
	Status PhaseStatus `json:"status" yaml:"status"`

	// Retry governs retry behavior when inner nodes fail.
	Retry *RetryPolicy `json:"retry,omitempty" yaml:"retry,omitempty"`

	// NodeIDs lists the IDs of inner nodes belonging to this phase.
	NodeIDs []string `json:"nodes,omitempty" yaml:"nodes,omitempty"`

	// Compensate is the ID of the compensating action for rollback.
	Compensate string `json:"compensate,omitempty" yaml:"compensate,omitempty"`

	// Attempts records retry history (populated during execution).
	Attempts []Attempt `json:"attempts,omitempty" yaml:"attempts,omitempty"`

	// State holds execution metadata captured during the forward action.
	// The compensating action reads this to know what to undo.
	State map[string]any `json:"state,omitempty" yaml:"state,omitempty"`
}

Phase represents a lifecycle phase in the execution graph. Each phase owns a set of inner nodes and acts as an error boundary with retry and compensating action support (the Saga Pattern).

type PhaseStatus

type PhaseStatus string

PhaseStatus represents the execution state of a phase.

const (
	// PhasePending indicates the phase has not yet been executed.
	PhasePending PhaseStatus = "pending"
	// PhaseCompleted indicates the phase executed successfully.
	PhaseCompleted PhaseStatus = "completed"
	// PhaseFailed indicates the phase failed during execution.
	PhaseFailed PhaseStatus = "failed"
	// PhaseRolledBack indicates the phase was rolled back after failure.
	PhaseRolledBack PhaseStatus = "rolled_back"
	// PhaseSkipped indicates the phase was skipped.
	PhaseSkipped PhaseStatus = "skipped"
)

PhaseStatus constants define the possible states of a phase.

type PlannedFactory

type PlannedFactory func(graph *Graph, project string, reg *ActionRegistry) starlark.Value

PlannedFactory creates a plan sub-namespace (e.g., plan.file) for a given graph context. Returned by generated planned_gen.go init() functions.

type Platform

type Platform struct {
	// Serializable info (used by Graph)
	OS       string `json:"os" yaml:"os"`
	Arch     string `json:"arch" yaml:"arch"`
	Distro   string `json:"distro,omitempty" yaml:"distro,omitempty"`
	Version  string `json:"version,omitempty" yaml:"version,omitempty"`
	Hostname string `json:"hostname,omitempty" yaml:"hostname,omitempty"`

	// Runtime — not serialized
	PackageManager  PackageManager            `json:"-" yaml:"-"`
	PackageManagers map[string]PackageManager `json:"-" yaml:"-"`
	ServiceManager  ServiceManager            `json:"-" yaml:"-"`
}

Platform carries platform info plus runtime package/service managers. Serializable fields are stored in graphs; runtime fields are injected at execution time by platform.New().

func (*Platform) AllInstalledBy

func (p *Platform) AllInstalledBy(name string) []PackageManager

AllInstalledBy returns all package managers that have the package installed.

func (*Platform) GetPackageManager

func (p *Platform) GetPackageManager(name string) PackageManager

GetPackageManager returns a specific package manager by name. Returns nil if unavailable.

func (*Platform) InstalledBy

func (p *Platform) InstalledBy(name string) PackageManager

InstalledBy returns the package manager that installed the named package. Returns nil if not installed by any known manager.

type PlatformResult

type PlatformResult struct {
	OK     bool
	Stdout string
	Stderr string
	Code   int
}

PlatformResult represents a command execution result.

type Provider

type Provider interface {
	Context() Context
	// contains filtered or unexported methods
}

Provider is an interface for objects that can supply an execution Context.

Actions that need access to the execution environment implement this interface to receive the Context during graph execution. The Context includes execution parameters, platform abstractions, and runtime state.

Types should satisfy this interface by embedding ProviderBase.

type ProviderBase

type ProviderBase struct {
	// contains filtered or unexported fields
}

ProviderBase provides a standardized implementation of the Provider interface.

It must be embedded in all domain-specific providers to ensure they adhere to the execution graph's strictly enforced lifetime.

ProviderBase should only be instantiated by authorized builders using [New].

func NewProviderBase

func NewProviderBase(ctx Context) ProviderBase

NewProviderBase returns a new ProviderBase provider instance with the given Context.

func (ProviderBase) Context

func (b ProviderBase) Context() Context

Context returns the context associated with this provider's lifetime.

type ProviderBinding

type ProviderBinding struct {
	// Name is the provider identifier (e.g., "file", "ui", "host").
	Name string

	// Access defines when this provider's methods are available.
	Access AccessType

	// Lifetime declares the provider's lifecycle semantics for caching and cleanup.
	Lifetime ProviderLifetime

	// ActionRegistrar registers graph actions from actions_gen.go.
	ActionRegistrar ProviderRegistrar

	// PlannedFactory creates the plan sub-namespace from planned_gen.go.
	PlannedFactory PlannedFactory

	// ImmediateFactory creates the immediate receiver from immediate_gen.go.
	ImmediateFactory ImmediateFactory
}

ProviderBinding collects all registration data for a single provider. Each generated file's init() calls RegisterBinding with its subset of fields; the registry merges them by Name.

func AllBindings

func AllBindings() []*ProviderBinding

AllBindings returns all registered provider bindings, sorted by name.

func BindingByName

func BindingByName(name string) (*ProviderBinding, bool)

BindingByName returns the provider binding for the given name.

type ProviderLifetime

type ProviderLifetime string

ProviderLifetime declares a provider's lifecycle semantics. The value is set via a "// +devlore:lifetime=" directive on the Provider struct and emitted by the code generator into ProviderBinding registrations.

const (
	LifetimeStateless ProviderLifetime = "stateless" // safe to cache indefinitely and share across threads
	LifetimePhase     ProviderLifetime = "phase"     // fresh instance per phase; Close() at phase boundary
	LifetimeSession   ProviderLifetime = "session"   // single instance for the session; Close() at session end
)

Lifetime constants define caching, sharing, and cleanup behavior.

type ProviderRegistrar

type ProviderRegistrar func(*ActionRegistry)

ProviderRegistrar registers a provider's actions with an ActionRegistry.

type Receiver

type Receiver struct {
	// contains filtered or unexported fields
}

Receiver provides common implementations for Starlark binding namespaces. Embed this in concrete types to satisfy starlark.Value. Concrete types must implement starlark.HasAttrs (Attr and AttrNames) themselves.

func (Receiver) Freeze

func (r Receiver) Freeze()

Freeze implements starlark.Value.

func (Receiver) Hash

func (r Receiver) Hash() (uint32, error)

Hash implements starlark.Value.

func (Receiver) String

func (r Receiver) String() string

String implements starlark.Value.

func (Receiver) Truth

func (r Receiver) Truth() starlark.Bool

Truth implements starlark.Value.

func (Receiver) Type

func (r Receiver) Type() string

Type implements starlark.Value.

type RecoveryEntry

type RecoveryEntry struct {
	// contains filtered or unexported fields
}

RecoveryEntry captures a single compensable operation with its undo and reconcile state.

type RecoveryStack

type RecoveryStack struct {
	// contains filtered or unexported fields
}

RecoveryStack accumulates compensable operations in LIFO order. On Unwind, each entry is reconciled (if a reconcile function was provided) and then compensated in reverse order.

func NewRecoveryStack

func NewRecoveryStack() *RecoveryStack

NewRecoveryStack creates an empty RecoveryStack.

func (*RecoveryStack) Discard

func (s *RecoveryStack) Discard()

Discard drops all entries without unwinding.

func (*RecoveryStack) Do

func (s *RecoveryStack) Do(
	invoke func() (undoState any, reconcileState any, err error),
	compensate func(any) error,
	reconcile func(any) (bool, error),
) error

Do invokes a closure and, if it succeeds, pushes a recovery entry onto the stack. If invoke returns an error, the stack is unchanged and the error is returned without unwinding.

func (*RecoveryStack) Len

func (s *RecoveryStack) Len() int

Len returns the number of entries on the stack.

func (*RecoveryStack) Push

func (s *RecoveryStack) Push(
	compensate func(any) error,
	reconcile func(any) (bool, error),
	undoState any,
	reconcileState any,
)

Push manually adds a recovery entry to the stack.

func (*RecoveryStack) Unwind

func (s *RecoveryStack) Unwind() error

Unwind compensates all entries in LIFO order. For each entry:

  1. If reconcile is non-nil, it is called first. If reconcile returns false (drifted), the entry is skipped and an ErrDrifted is collected.
  2. If reconcile is nil or returns true (safe), compensate is called.

All entries are attempted regardless of individual failures. Errors are joined via errors.Join.

type ReflectedPlanned

type ReflectedPlanned struct {
	Receiver
	// contains filtered or unexported fields
}

ReflectedPlanned wraps a provider's method signatures for planned-mode Starlark use. Each call creates a graph Node instead of executing the method directly.

func WrapPlanned

func WrapPlanned(
	name string,
	providerType reflect.Type,
	graph *Graph,
	project string,
	reg *ActionRegistry,
	params MethodParams,
) *ReflectedPlanned

WrapPlanned wraps a provider for planned-mode use. Only methods with a corresponding registered action in reg are exposed.

func (*ReflectedPlanned) Attr

func (p *ReflectedPlanned) Attr(name string) (starlark.Value, error)

Attr implements starlark.HasAttrs.

func (*ReflectedPlanned) AttrNames

func (p *ReflectedPlanned) AttrNames() []string

AttrNames implements starlark.HasAttrs.

func (*ReflectedPlanned) Override

func (p *ReflectedPlanned) Override(name string, fn builtinFunc)

Override replaces a method's auto-generated planned bridge with a custom one.

type ReflectedReceiver

type ReflectedReceiver struct {
	Receiver
	// contains filtered or unexported fields
}

ReflectedReceiver wraps a Go struct for immediate-mode Starlark use. Exported methods become Starlark builtins; method dispatch, argument unpacking, and return value marshaling are handled by reflection.

Optional catalog and stack fields enable resource management integration. When set, Resource results are shadowed in the catalog after successful dispatch.

func WrapReceiver

func WrapReceiver(name string, provider any, params MethodParams) *ReflectedReceiver

WrapReceiver wraps a Go struct for immediate-mode Starlark use. Only methods listed in params are exposed. Compensate* methods are excluded automatically.

func (*ReflectedReceiver) Attr

func (r *ReflectedReceiver) Attr(name string) (starlark.Value, error)

Attr implements starlark.HasAttrs.

func (*ReflectedReceiver) AttrNames

func (r *ReflectedReceiver) AttrNames() []string

AttrNames implements starlark.HasAttrs.

func (*ReflectedReceiver) Override

func (r *ReflectedReceiver) Override(name string, fn builtinFunc)

Override replaces a method's auto-generated bridge with a custom one. Used for methods with unusual signatures (Callable params, variadic args, non-zero defaults).

func (*ReflectedReceiver) SetCatalog

func (r *ReflectedReceiver) SetCatalog(c *ResourceCatalog)

SetCatalog sets the resource catalog for immediate-mode dispatch. When set, Resource results are shadowed in the catalog after each successful method call.

func (*ReflectedReceiver) SetStack

func (r *ReflectedReceiver) SetStack(s *RecoveryStack)

SetStack sets the recovery stack for immediate-mode dispatch.

type Resource

type Resource interface {
	URI() string
	Scheme() string
	Host() string
	Path() string
	// contains filtered or unexported methods
}

Resource is the interface for all resource types.

Every provider-specific resource (e.g., file.Resource) must embed ResourceBase to satisfy it. The unexported resourceBase method seals the interface to package op. Only types embedding ResourceBase can implement Resource.

Concrete types must implement [Scheme], [Host], and [Path] to provide URI components. [URI] should be implemented as a one-liner delegating to ResourceBase.NewURI:

func (r *Resource) URI() string { return r.NewURI(r) }

ResourceBase provides default implementations of all four methods by parsing the stored uri field. Concrete types shadow these with efficient, component-based implementations.

type ResourceBase

type ResourceBase struct {
	// contains filtered or unexported fields
}

ResourceBase holds the identity fields common to all resources. Provider- specific resource types must embed it by value.

The uri field is set at construction via NewResourceBase. The id and originID fields are stamped by the ResourceCatalog when the resource is cataloged; they are not a concern of the resource itself.

func NewResourceBase

func NewResourceBase(uri string) ResourceBase

NewResourceBase creates a ResourceBase with the given URI.

func (ResourceBase) Host

func (b ResourceBase) Host() string

Host returns the URI host by parsing the stored uri. Concrete types should shadow this with their authority component (often empty).

func (ResourceBase) MarshalStarvalue

func (b ResourceBase) MarshalStarvalue() (starlark.Value, error)

MarshalStarvalue implements starvalue.Marshaler. It serializes the private identity fields (uri, id, originID) so they survive the Go → Starlark → Go round-trip used by FillSlot.

func (*ResourceBase) NewURI

func (b *ResourceBase) NewURI(r Resource) string

NewURI builds a canonical URI from a concrete Resource's component methods. Concrete types call this to implement URI():

func (r *Resource) URI() string { return r.NewURI(r) }

func (ResourceBase) Path

func (b ResourceBase) Path() string

Path returns the URI path by parsing the stored uri. Concrete types should shadow this with their provider-specific identifier.

func (ResourceBase) Scheme

func (b ResourceBase) Scheme() string

Scheme returns the URI scheme by parsing the stored uri. Concrete types should shadow this with a constant (e.g., "file").

func (ResourceBase) URI

func (b ResourceBase) URI() string

URI returns the canonical URI of this resource. Concrete types should shadow this with: func (r *Resource) URI() string { return r.NewURI(r) }

type ResourceCatalog

type ResourceCatalog struct {
	// contains filtered or unexported fields
}

ResourceCatalog is the append-only catalog of all resources created during a single planning session. One per Graph. It owns the ledger (the log of all resource versions) and the namespace (URI → current resource ID).

func NewResourceCatalog

func NewResourceCatalog() *ResourceCatalog

NewResourceCatalog creates an empty catalog.

func (*ResourceCatalog) Current

func (c *ResourceCatalog) Current(uri string) string

Current returns the current resource ID for a URI, or "".

func (*ResourceCatalog) DiscoveryURIs

func (c *ResourceCatalog) DiscoveryURIs() []string

DiscoveryURIs returns the URIs of catalog entries that were discovered (created by Resolve) but not yet shadowed. These are inputs that should exist on the target machine before execution begins. URIs whose current entry has been superseded by Shadow are excluded.

func (*ResourceCatalog) Len

func (c *ResourceCatalog) Len() int

Len returns the count of resources in the catalog.

func (*ResourceCatalog) Lookup

func (c *ResourceCatalog) Lookup(id string) (Resource, bool)

Lookup returns the resource with the given ID, or false if not found.

func (*ResourceCatalog) Resolve

func (c *ResourceCatalog) Resolve(uri string) string

Resolve returns the current resource ID for a URI. If the URI has never been seen, a discovery entry (ResourceBase with URI only, no origin) is created and cataloged.

func (*ResourceCatalog) Shadow

func (c *ResourceCatalog) Shadow(r Resource, originID string) string

Shadow catalogs a new resource version, updates the namespace to point to it, and returns the new resource ID. The resource must embed ResourceBase with its URI already set via NewResourceBase.

type Result

type Result = any

Result is data that flows to downstream nodes via edges (e.g., file content, a rendered template, a query result). The executor stores this keyed by node ID and resolves promise slots from stored Results before calling downstream Do.

type RetryPolicy

type RetryPolicy struct {
	// MaxAttempts is the maximum number of retries (0 = no retry, fail immediately).
	MaxAttempts int `json:"max_attempts" yaml:"max_attempts"`

	// Backoff is the delay strategy: none, linear, exponential.
	Backoff BackoffStrategy `json:"backoff" yaml:"backoff"`

	// InitialDelay is the delay before the first retry (Go duration string, e.g. "1s").
	InitialDelay string `json:"initial_delay,omitempty" yaml:"initial_delay,omitempty"`

	// MaxDelay caps the delay between retries (Go duration string, e.g. "30s").
	MaxDelay string `json:"max_delay,omitempty" yaml:"max_delay,omitempty"`
}

RetryPolicy configures retry behavior for a phase.

func (*RetryPolicy) ComputeDelay

func (r *RetryPolicy) ComputeDelay(attempt int) time.Duration

ComputeDelay returns the delay for a given attempt number (0-based).

func (*RetryPolicy) ParseInitialDelay

func (r *RetryPolicy) ParseInitialDelay() time.Duration

ParseInitialDelay parses the InitialDelay string into a time.Duration. Returns 0 if the string is empty or unparseable.

func (*RetryPolicy) ParseMaxDelay

func (r *RetryPolicy) ParseMaxDelay() time.Duration

ParseMaxDelay parses the MaxDelay string into a time.Duration. Returns 0 if the string is empty or unparseable.

type RollbackEntry

type RollbackEntry struct {
	// Phase is the phase name that was rolled back.
	Phase string `json:"phase" yaml:"phase"`

	// Compensate is the ID of the compensating action.
	Compensate string `json:"compensate" yaml:"compensate"`

	// Status is "completed" or "failed".
	Status string `json:"status" yaml:"status"`

	// Error is the error message if the compensating action failed.
	Error string `json:"error,omitempty" yaml:"error,omitempty"`
}

RollbackEntry records a compensating action executed during rollback.

type SearchResult

type SearchResult struct {
	Name        string
	Version     string
	Description string
}

SearchResult represents a package found by search.

type ServiceManager

type ServiceManager interface {
	Exists(name string) bool
	IsRunning(name string) bool
	IsEnabled(name string) bool
	Status(name string) string
	Start(name string) PlatformResult
	Stop(name string) PlatformResult
	Enable(name string) PlatformResult
	Disable(name string) PlatformResult
	NeedsSudo() bool
}

ServiceManager abstracts service management operations.

type ServiceManagerProvider

type ServiceManagerProvider interface {
	// Exists checks if a service exists.
	Exists(name string) bool

	// IsRunning returns true if the named service is currently running.
	IsRunning(name string) bool

	// IsEnabled returns true if the named service is enabled to start at boot.
	IsEnabled(name string) bool

	// Start starts a service.
	Start(name string) error

	// Stop stops a service.
	Stop(name string) error

	// Enable enables a service at boot.
	Enable(name string) error

	// Disable disables a service at boot.
	Disable(name string) error
}

ServiceManagerProvider abstracts service management operations.

type Signature

type Signature struct {
	// Method is the signing method used (gpg, aws_kms, gcp_kms, azure_kv).
	Method string `json:"method" yaml:"method"`

	// Value is the signature data (base64-encoded).
	Value string `json:"value" yaml:"value"`

	// KeyID identifies the key used for signing.
	// For GPG: fingerprint, for KMS: key ARN/ID/URL.
	KeyID string `json:"key_id" yaml:"key_id"`
}

Signature contains the cryptographic signature of a graph.

type SlotValue

type SlotValue struct {
	// Immediate is the direct value (any type, known at analysis time).
	Immediate any `json:"immediate,omitempty" yaml:"immediate,omitempty"`

	// NodeRef is the ID of the node that produces this value (promise).
	NodeRef string `json:"node_ref,omitempty" yaml:"node_ref,omitempty"`

	// Slot is which output slot of the referenced node (empty = default output).
	Slot string `json:"slot,omitempty" yaml:"slot,omitempty"`

	// GatherRef is the gather node ID for proxy resolution.
	GatherRef string `json:"gather_ref,omitempty" yaml:"gather_ref,omitempty"`

	// Field is the field name to access on the proxy item.
	Field string `json:"field,omitempty" yaml:"field,omitempty"`
}

SlotValue represents a value that fills a slot in a node. Three variants, mutually exclusive:

  • Immediate: value known at analysis time
  • Promise: reference to another node's output (NodeRef)
  • Proxy: reference to a gather iteration item (GatherRef + Field)

func (SlotValue) IsImmediate

func (s SlotValue) IsImmediate() bool

IsImmediate returns true if this slot value is an immediate value.

func (SlotValue) IsPromise

func (s SlotValue) IsPromise() bool

IsPromise returns true if this slot value is a promise (reference to another node).

func (SlotValue) IsProxy

func (s SlotValue) IsProxy() bool

IsProxy returns true if this slot value is a gather proxy reference.

type Summary

type Summary struct {
	TotalFiles int `json:"total_files,omitempty" yaml:"total_files,omitempty"`
	Links      int `json:"links,omitempty" yaml:"links,omitempty"`
	Copies     int `json:"copies,omitempty" yaml:"copies,omitempty"`
	Templates  int `json:"templates,omitempty" yaml:"templates,omitempty"`
	Secrets    int `json:"secrets,omitempty" yaml:"secrets,omitempty"`
	Packages   int `json:"packages,omitempty" yaml:"packages,omitempty"`
	Skipped    int `json:"skipped,omitempty" yaml:"skipped,omitempty"`
	Failed     int `json:"failed,omitempty" yaml:"failed,omitempty"`
}

Summary contains execution statistics.

func (Summary) String

func (s Summary) String() string

String returns a human-readable summary.

type Tombstone

type Tombstone interface {
	Resource() Resource
	// contains filtered or unexported methods
}

Tombstone is the interface for all compensation state types.

Every provider-specific tombstone (e.g., file.Tombstone) must embed TombstoneBase to satisfy it. The unexported tombstoneBase method seals the interface to types that embed TombstoneBase.

type TombstoneBase

type TombstoneBase struct {
	// contains filtered or unexported fields
}

TombstoneBase holds the resource that was affected by a compensable action. Provider-specific tombstone types must embed it by value.

The embedded Resource reflects post-operation state: its identity fields (e.g., SourcePath for file resources) point to where the data physically IS after the operation, not where it was before. Provider-specific fields on the tombstone (e.g., file.Tombstone.OriginalPath) record where the data came from — the restoration target.

func NewTombstoneBase

func NewTombstoneBase(resource Resource) TombstoneBase

NewTombstoneBase creates a TombstoneBase anchored to the given resource.

func (TombstoneBase) Resource

func (b TombstoneBase) Resource() Resource

Resource returns the resource affected by the compensable action.

type UndoState

type UndoState = any

UndoState is the state captured by Do and passed to Undo during saga rollback. Each action defines its own state shape. Actions with no rollback return nil from Do; their Undo ignores the state parameter.

Directories

Path Synopsis
Package provider registers all operation graph providers.
Package provider registers all operation graph providers.
archive
Package archive provides archive extraction actions for the operation graph.
Package archive provides archive extraction actions for the operation graph.
encryption
Package encryption provides encryption and decryption actions for the operation graph.
Package encryption provides encryption and decryption actions for the operation graph.
file
Package file provides filesystem actions for the operation graph.
Package file provides filesystem actions for the operation graph.
file/gitignore
Package gitignore provides gitignore-aware file filtering using go-git's gitignore package.
Package gitignore provides gitignore-aware file filtering using go-git's gitignore package.
git
json
Package json provides JSON encoding and decoding for the operation graph.
Package json provides JSON encoding and decoding for the operation graph.
net
Package net provides network actions for the operation graph.
Package net provides network actions for the operation graph.
pkg
Package pkg provides package management actions for the operation graph.
Package pkg provides package management actions for the operation graph.
platform
Package platform is a data provider — the Starlark surface for op.Context.Platform.
Package platform is a data provider — the Starlark surface for op.Context.Platform.
regexp
Package regexp provides regular expression operations for the operation graph.
Package regexp provides regular expression operations for the operation graph.
service
Package service provides platform-agnostic service management actions.
Package service provides platform-agnostic service management actions.
shell
Package shell provides shell command execution actions for the operation graph.
Package shell provides shell command execution actions for the operation graph.
staranalysis
Package staranalysis provides combined analysis of Starlark source files, combining stats, complexity scoring, indexing, and hotspot detection.
Package staranalysis provides combined analysis of Starlark source files, combining stats, complexity scoring, indexing, and hotspot detection.
starcode
Package starcode provides Starlark source file capture with glob pattern matching, .gitignore awareness, and optional .bzl file inclusion.
Package starcode provides Starlark source file capture with glob pattern matching, .gitignore awareness, and optional .bzl file inclusion.
starcomplexity
Package starcomplexity computes cyclomatic and cognitive complexity metrics for Starlark source files.
Package starcomplexity computes cyclomatic and cognitive complexity metrics for Starlark source files.
starindex
Package starindex provides AST-based indexing of Starlark source files, extracting functions, loads, globals, and line statistics.
Package starindex provides AST-based indexing of Starlark source files, extracting functions, loads, globals, and line statistics.
starsources
Package starsources holds a captured set of Starlark source files and provides delegation methods for indexing, stats, and analysis.
Package starsources holds a captured set of Starlark source files and provides delegation methods for indexing, stats, and analysis.
starstats
Package starstats computes line and byte statistics for Starlark source files.
Package starstats computes line and byte statistics for Starlark source files.
template
Package template provides template expansion actions for the operation graph.
Package template provides template expansion actions for the operation graph.
ui
Package ui provides user-facing terminal messaging for the operation graph.
Package ui provides user-facing terminal messaging for the operation graph.
yaml
Package yaml provides YAML encoding and decoding for the operation graph.
Package yaml provides YAML encoding and decoding for the operation graph.
Package starvalue defines interfaces for custom Starlark value serialization.
Package starvalue defines interfaces for custom Starlark value serialization.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL