plugin-example-external
| Placement | compiled-in (in-process) |
| Source | github.com/opencharly/charly/candy/plugin-example-external |
| Version | 2026.176.1200 |
| Candy | plugin-example-external |
This plugin is listed in charly/charly.yml’s compiled_plugins:, so its providers are compiled into the charly binary and register in-process.
Providers
Section titled “Providers”The reserved words this plugin serves:
externalprobe— verb class
What it does
Section titled “What it does”Reference DUAL-PLACEMENT charly plugin — ONE provider, two placements. Its
importable provider package (NewProvider/NewMeta, serving the externalprobe
check verb + its self-contained CUE schema over the SDK Describe channel) is
COMPILED INTO charly when this candy is listed in charly.yml
compiled_plugins: (the default — registered in-process via
registerCompiledPlugin), and the SAME provider is served OUT-OF-PROCESS over
go-plugin gRPC by the cmd/serve shim (host-built + connected via
LocalTransport) when it is NOT selected. The placement is invisible above the
provider registry — the verb dispatches identically either way, with no
authoring change. The companion of the built-in candy/plugin-example; the
out-of-process build/deploy legs are demonstrated by
candy/plugin-example-step / -builder / -deploy / -command.
Parameter schema
Section titled “Parameter schema”The CUE schema below is the authoritative grammar for this plugin’s input. It is the same single source that generates the plugin’s Go parameter types and answers the runtime Describe RPC, so this page cannot disagree with either.
schema/externalprobe.cue
Section titled “schema/externalprobe.cue”// This out-of-tree plugin's OWN CUE schema — the typed plugin_input for the verbs// it provides. It is the SINGLE SOURCE for this plugin's params, used two ways (the// same contract the built-in exampleprobe and core `spec` use)://// 1. GENERATE the Go param struct — `cue exp gengotypes` (driven by task cue:gen,// which wraps this with `package params` + `@go(params)`) emits// params/cue_types_gen.go, so the plugin decodes plugin_input into a TYPED// struct, never a hand-parsed map[string]any.// 2. VALIDATE authored input AT RUNTIME — the plugin SERVES this source over the// Describe channel (the gRPC schema_cue field via sdk.BuildCapabilities); the// host splices it onto its base (base ++ plugin) and validates every authored// `externalprobe` step's plugin_input against #ExternalprobeInput. The host// NEVER reads this file from disk — the schema travels with the plugin.//// SELF-CONTAINED (carries no package clause and references NO base def): it// compiles standalone (gengotypes + the SDK serve-side check) AND splices onto the// base — the base ++ plugin splice exists to detect a def-name collision with the// base, not to resolve base references. CUE stays the single source: no// hand-written struct, no hand-validation.
// #ExternalprobeInput — the plugin_input shape for the `externalprobe` verb.#ExternalprobeInput: { // marker is a NON-EMPTY string the plugin echoes back as the check result // message (proving the value round-trips author -> wire -> external process // -> result). The `& !=""` constraint is enforced by the host at validate time. marker: string & !="" @go(Marker)}See also the candy reference for this candy’s install surface.