# Composed consumer This example composes application configuration, PromptKit configuration, PromptKit comparison and catalogs, definition and requirements inspection, and one application-owned command: ```sh 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](../../../../docs/consumers/guide.md#application-owned-aliases) 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](https://gitea.maximumdirect.net/eric/CommandKit/src/branch/main/docs/consumers/guide.md) 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: ```go 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](../../../../docs/cli.md#promptkit-requirements) 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](../../../../docs/development.md#documentation-validation), 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.