Composed consumer
This example composes application configuration, PromptKit configuration, PromptKit comparison and catalogs, definition and requirements inspection, and one application-owned command:
go run . config scopes
go run . config validate --scope all --campaign spring --limit=0
go run . config diff --scope app --config fixtures/before.yml --against-config fixtures/after.yml
go run . config diff --scope app --config fixtures/before.yml --against-config fixtures/after.yml --campaign spring --limit=0
go run . config diff --scope promptkit --config fixtures/before.yml --against-config fixtures/after.yml --campaign spring
go run . promptkit list prompts --config fixtures/before.yml --campaign spring
go run . promptkit list profiles --config fixtures/after.yml --campaign autumn --format yaml
go run . promptkit list backends --campaign spring
go run . promptkit list namespaces --campaign spring
go run . promptkit list collections --campaign spring
go run . list collections --campaign spring
go run . pk list bundles --campaign spring
go run . promptkit list prompts --namespace field-notes --campaign spring
go run . promptkit show prompt briefing --campaign spring --format yaml
go run . pk show prompt briefing --campaign spring --fmt yaml
go run . promptkit show profile spring --campaign spring
go run . promptkit requirements show briefing --campaign spring
go run . promptkit requirements show briefing --campaign spring --var mode=full --format yaml
go run . promptkit requirements validate briefing --campaign spring --input topic=fixtures/topic.txt
go run . promptkit requirements validate briefing --campaign spring --input topic=fixtures/topic.txt --var mode=full --input notes=fixtures/notes.txt --format yaml
go run . promptkit requirements validate briefing --campaign spring
go run . promptkit test text_inference --campaign spring --prompt briefing --profile spring
go run . smoke text_inference --campaign spring --prompt briefing --profile spring
go run . promptkit test all --campaign spring --prompt briefing --profile spring
go run . pk --hlep
go run . session restore session-42 --campaign spring
newApp installs application-owned command and flag aliases alongside the
complete ckconfig and ckprompt declarations. list collections and
promptkit list bundles both reach the canonical collection command; pk
shortens the PromptKit group. --fmt is scoped to named prompt inspection and
--hlep is available globally. The smoke shortcut retains the canonical
promptkit test KIND operand, including the special all aggregate.
The composition calls ckconfig.Command(suite) and ckprompt.Command(definitions)
directly in a []commandkit.Declaration with root-installed routing rules.
Group children remain canonical Command values. For command-only slices,
convert each Command to Declaration before appending aliases. The
consumer guide
includes minimal direct-call and slice-conversion examples; this README documents
the maintained complete consumer.
The sources and session store are small in-memory fixtures. --campaign is a
typed selector shared by the app and PromptKit configuration scopes. Their
ckconfig.Suite[*inspectionInput, *runCache] uses NewInput to initialize each
selected scope's input separately and NewState to create one cache shared by
that invocation's acquisitions. Prompt/profile inspection prepares its input and
cache independently for its invocation, using the same application and engine
loader functions. See the
consumer guide
and the suites' GoDoc for initialization timing and ownership.
The application-scope comparison reports the changed default campaign and the
updated campaigns.spring.model. The PromptKit-scope comparison selects spring
on both sides and reports the native engine change under the spring profile.
The application input check requires --limit=0 when --campaign is supplied.
Catalogs use the same selection-aware loader: the prompt catalog includes
briefing version 1, and the profile catalog includes the selected autumn
profile. Prompt inspection uses an ID only; its optional version is descriptive
metadata in the report, not a selector. The synthetic field-notes collection
provides one backend, profile, and prompt for collection discovery and native
namespace filtering. The example's shared run cache keys successful results by
the complete supplied configuration/overlay selection and the supplied
campaign, including presence. The campaign override is applied through ConfigKit
before loading. These are choices for this example's loader and do not define a
CommandKit cache policy.
Smoke testing is explicitly wired with ckprompt.WithSmokeTesting and its
optional request builder is nil, so CommandKit forwards the selected native
request. Applications that need to adjust the request can provide a typed
builder that starts with the seed and returns the chosen native request:
definitions = ckprompt.WithSmokeTesting(definitions, loadEngine,
func(ctx context.Context, seed ckprompt.SmokeRequest, input *inspectionInput, state *runCache) (promptkit.SmokeTestRequest, error) {
request := seed.Request
request.ProfileID = "spring"
return request, nil
})
The example injects a small in-memory promptkit.LLMClient through its shared
run state. Catalog, inspection, and requirements commands do not call it;
inference smoke commands do. No model service or credentials are required.
Native HTTP checks may retain unsupported or not-applicable observations because
the example does not configure a network probe. An aggregate smoke command can
return an operational outcome for a native diagnostic while still delivering
the complete aggregate report.
The first requirements command reports incomplete discovery: PromptKit records
the conditional notes input and a missing mode issue. Supplying mode=full
selects that branch, classifies the undeclared notes input as required, and
completes discovery. Both commands return successful reports; the result does
not execute the prompt or establish input, credential, or execution readiness.
See the CLI reference for the
command and report contract.
The validation commands exercise concrete PromptKit request preparation.
The first uses the builder's campaign-specific default topic variable and the
operator's topic file. The second also selects the notes branch and supplies its
file. Both succeed and report only prompt_id and valid: true; they do not
execute the prompt. The final command intentionally fails because the prompt's
required topic artifact is not supplied. The builder defaults variables from
the selected campaign but leaves artifact bindings to the operator. The
requirements show commands remain discovery reports: partial discovery can
succeed even when a concrete request would fail validation.
The alias examples use the local CommandKit source because the composed
module's published core dependency, v0.2.0, predates alias declarations. From
the repository root, add the three local modules to go.work as described in
the developer guide,
then run go test ./... from this example directory. This checks the example
against the current local core and integration sources; it does not claim that
published v0.2.0 supports aliases. The next core dependency adoption is handled
after the core release is prepared.