You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2026/10/02 20:17:26 UTC

(camel) branch quick-fix/camel-cli-docs-restructure created (now def4e806bc45)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a change to branch quick-fix/camel-cli-docs-restructure
in repository https://gitbox.apache.org/repos/asf/camel.git


      at def4e806bc45 chore: Camel CLI docs - restructure, new pages, plugin command reference

This branch includes the following new commits:

     new def4e806bc45 chore: Camel CLI docs - restructure, new pages, plugin command reference

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(camel) 01/01: chore: Camel CLI docs - restructure, new pages, plugin command reference

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch quick-fix/camel-cli-docs-restructure
in repository https://gitbox.apache.org/repos/asf/camel.git

commit def4e806bc456fe92713860670cd986a26b89e9a
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Oct 2 22:17:04 2026 +0200

    chore: Camel CLI docs - restructure, new pages, plugin command reference
    
    Restructure the Camel CLI documentation:
    
    - Kubernetes plugin page rewritten around deploying an app (run in one
      step, or export a JKube Maven project); trait options, CronJob, Knative,
      Jolokia and mounts moved to a new advanced options page. The old build
      instructions (quarkus.kubernetes.deploy) were stale: all runtimes use JKube.
    - All CLI pages are now in the nav, grouped.
    - New pages: AI Providers and Local Models (one place instead of three
      copies, adds IBM watsonx), Validation (adds validate properties and
      normalize), Diagnostics (get error/activity/inflight/blocked, memory leak,
      heap and thread dumps, startup recorder, SQL, Kafka, vault).
    - Maven settings and running a Maven project moved from Tips to Running;
      container image content merged into one page.
    - Document camel dev, camel dirty, transform dataweave, generate rest and
      the ASF plugins; Camel CLI branding; install via the installer script
      or JBang; TUI Secrets tab.
    - Command reference: plugin commands (kubernetes, test, tui, mcp, validate,
      generate, edit, route-parser) now get generated pages, listed in a
      Plugin commands section; stale generated pages are removed.
    - The startup recorder hints say camel.main.startup-recorder=backlog
      (true is not a valid value), and its help example uses camel get.
    
    Co-Authored-By: Claude Opus 5.5 (1M context) <no...@anthropic.com>
    Signed-off-by: Claus Ibsen <cl...@gmail.com>
---
 docs/user-manual/modules/ROOT/nav.adoc             |  25 +-
 .../ROOT/pages/camel-jbang-ai-providers.adoc       | 142 ++++
 .../modules/ROOT/pages/camel-jbang-ai.adoc         | 122 +---
 .../ROOT/pages/camel-jbang-configuration.adoc      |  12 +-
 .../modules/ROOT/pages/camel-jbang-container.adoc  |  42 +-
 .../modules/ROOT/pages/camel-jbang-debugging.adoc  |   2 -
 .../modules/ROOT/pages/camel-jbang-devtools.adoc   |  86 +--
 .../ROOT/pages/camel-jbang-diagnostics.adoc        | 267 ++++++++
 .../ROOT/pages/camel-jbang-getting-started.adoc    |  30 +-
 .../ROOT/pages/camel-jbang-installation.adoc       |  31 +-
 ...s.adoc => camel-jbang-kubernetes-advanced.adoc} | 588 +++++-----------
 .../modules/ROOT/pages/camel-jbang-kubernetes.adoc | 736 ++++-----------------
 .../modules/ROOT/pages/camel-jbang-managing.adoc   |  23 +-
 .../modules/ROOT/pages/camel-jbang-mcp.adoc        |   2 +-
 .../modules/ROOT/pages/camel-jbang-projects.adoc   |  36 +-
 .../modules/ROOT/pages/camel-jbang-running.adoc    |  64 +-
 .../modules/ROOT/pages/camel-jbang-test.adoc       |   2 +-
 .../modules/ROOT/pages/camel-jbang-tips.adoc       |  46 --
 .../ROOT/pages/camel-jbang-transforming.adoc       |  18 +
 .../modules/ROOT/pages/camel-jbang-tui-ai.adoc     |  12 +-
 .../ROOT/pages/camel-jbang-tui-local-models.adoc   |  53 +-
 .../ROOT/pages/camel-jbang-tui-settings.adoc       |   2 +-
 .../modules/ROOT/pages/camel-jbang-tui.adoc        |   2 +-
 .../modules/ROOT/pages/camel-jbang-validation.adoc | 141 ++++
 .../modules/ROOT/pages/camel-jbang.adoc            |  44 +-
 .../camel-yaml-dsl-validator-maven-plugin.adoc     |   2 +-
 .../camel-jbang-cmd-jfr-old-objects.adoc           |  34 -
 .../pages/jbang-commands/camel-jbang-commands.adoc |  17 +
 .../pages/jbang-commands/camel-jbang-edit.adoc     |  27 +
 .../jbang-commands/camel-jbang-generate-rest.adoc  |  35 +
 .../camel-jbang-generate-schema.adoc               |  33 +
 .../pages/jbang-commands/camel-jbang-generate.adoc |  37 ++
 .../camel-jbang-kubernetes-delete.adoc             |  30 +
 .../camel-jbang-kubernetes-export.adoc             |  97 +++
 .../camel-jbang-kubernetes-logs.adoc               |  33 +
 .../jbang-commands/camel-jbang-kubernetes-run.adoc |  86 +++
 .../jbang-commands/camel-jbang-kubernetes.adoc     |  42 ++
 .../ROOT/pages/jbang-commands/camel-jbang-mcp.adoc |  31 +
 .../jbang-commands/camel-jbang-route-parser.adoc   |  29 +
 .../jbang-commands/camel-jbang-test-init.adoc      |  34 +
 .../pages/jbang-commands/camel-jbang-test.adoc     |  36 +
 .../jbang-commands/camel-jbang-tui-monitor.adoc    |  37 ++
 .../ROOT/pages/jbang-commands/camel-jbang-tui.adoc |  46 ++
 .../camel-jbang-validate-normalize.adoc            |  74 +--
 .../camel-jbang-validate-properties.adoc           |  27 +
 .../camel-jbang-validate-source.adoc               |  36 +
 .../jbang-commands/camel-jbang-validate-yaml.adoc  |  66 +-
 .../pages/jbang-commands/camel-jbang-validate.adoc |   9 +-
 .../modules/ROOT/pages/large-payloads.adoc         |   4 +-
 .../examples/validate-normalize.adoc               |  57 ++
 .../jbang-commands/examples/validate-yaml.adoc     |  36 +
 dsl/camel-jbang/README.md                          |   2 +-
 .../action/CamelStartupRecorderAction.java         |   2 +-
 .../dsl/jbang/core/commands/ai/ToolRegistry.java   |   2 +-
 .../dsl/jbang/core/commands/mcp/RuntimeTools.java  |   2 +-
 dsl/camel-jbang/camel-jbang-plugin-edit/pom.xml    |  20 +
 .../camel-jbang-plugin-commands-metadata.json      |   5 +
 .../camel-jbang-plugin-generate/pom.xml            |  20 +
 .../camel-jbang-plugin-commands-metadata.json      |   5 +
 .../camel-jbang-plugin-kubernetes/pom.xml          |  15 +
 .../camel-jbang-plugin-commands-metadata.json      |   5 +
 dsl/camel-jbang/camel-jbang-plugin-mcp/pom.xml     |  20 +
 .../camel-jbang-plugin-commands-metadata.json      |   5 +
 .../camel-jbang-plugin-route-parser/pom.xml        |  20 +
 .../camel-jbang-plugin-commands-metadata.json      |   5 +
 dsl/camel-jbang/camel-jbang-plugin-test/pom.xml    |  15 +
 .../camel-jbang-plugin-commands-metadata.json      |   5 +
 dsl/camel-jbang/camel-jbang-plugin-tui/pom.xml     |  15 +
 .../camel-jbang-plugin-commands-metadata.json      |   5 +
 .../camel-jbang-plugin-validate/pom.xml            |  20 +
 .../camel-jbang-plugin-commands-metadata.json      |   5 +
 .../camel/tooling/model/JBangCommandModel.java     |  13 +
 .../org/apache/camel/tooling/model/JsonMapper.java |   4 +
 .../PrepareCamelJBangCommandsDocMojo.java          | 101 ++-
 .../packaging/PrepareCamelJBangCommandsMojo.java   | 260 ++++++--
 .../src/main/resources/jbang-command-page.mvel     |   4 +-
 .../src/main/resources/jbang-commands.mvel         |  12 +-
 77 files changed, 2487 insertions(+), 1623 deletions(-)

diff --git a/docs/user-manual/modules/ROOT/nav.adoc b/docs/user-manual/modules/ROOT/nav.adoc
index 08c67e8e6c96..376c02502415 100644
--- a/docs/user-manual/modules/ROOT/nav.adoc
+++ b/docs/user-manual/modules/ROOT/nav.adoc
@@ -5,10 +5,25 @@
 ** link:/community/books/[Books]
 * Tools
 ** xref:camel-jbang.adoc[Camel CLI]
-*** xref:jbang-commands/camel-jbang-commands.adoc[Camel CLI Command Reference]
-*** xref:camel-jbang-launcher.adoc[Camel CLI Launcher]
-*** xref:camel-jbang-launcher-install.adoc[Installing the Camel CLI Launcher]
+*** xref:camel-jbang-getting-started.adoc[Getting Started]
+*** xref:camel-jbang-installation.adoc[Installation Options]
+**** xref:camel-jbang-launcher.adoc[Camel CLI Launcher]
+**** xref:camel-jbang-launcher-install.adoc[Installing the Camel CLI Launcher]
+**** xref:camel-jbang-container.adoc[Container Image]
+*** xref:camel-jbang-running.adoc[Running Camel]
+*** xref:camel-jbang-dev-services.adoc[Dev Services]
+*** xref:camel-jbang-beans.adoc[Java Beans]
+*** xref:camel-jbang-transforming.adoc[Data Transformation]
+*** xref:camel-jbang-validation.adoc[Validation]
+*** xref:camel-jbang-devtools.adoc[Development Tools]
+*** xref:camel-jbang-debugging.adoc[Debugging]
+*** xref:camel-jbang-managing.adoc[Managing Integrations]
+*** xref:camel-jbang-diagnostics.adoc[Diagnostics]
+*** xref:camel-jbang-ai.adoc[AI Tools]
+**** xref:camel-jbang-ai-providers.adoc[AI Providers and Local Models]
+*** xref:camel-jbang-projects.adoc[Export to Maven]
 *** xref:camel-jbang-kubernetes.adoc[Camel Kubernetes Plugin]
+**** xref:camel-jbang-kubernetes-advanced.adoc[Advanced Options]
 *** xref:camel-jbang-test.adoc[Camel Testing Plugin]
 *** xref:camel-jbang-tui.adoc[Camel TUI]
 **** xref:camel-jbang-tui-getting-started.adoc[Camel TUI Getting Started]
@@ -20,7 +35,9 @@
 **** xref:camel-jbang-tui-ai-agents.adoc[Camel TUI and AI Agents]
 **** xref:camel-jbang-tui-settings.adoc[Camel TUI Actions, Settings and Themes]
 *** xref:camel-jbang-mcp.adoc[Camel MCP Server]
-*** xref:camel-jbang-container.adoc[Camel CLI container]
+*** xref:camel-jbang-configuration.adoc[Configuration]
+*** xref:camel-jbang-tips.adoc[Tips and Recipes]
+*** xref:jbang-commands/camel-jbang-commands.adoc[Camel CLI Command Reference]
 ** xref:camel-maven-plugin.adoc[Camel Maven Plugin]
 *** xref:camel-component-maven-plugin.adoc[Camel Component Maven Plugin]
 *** xref:camel-report-maven-plugin.adoc[Camel Maven Report Plugin]
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-ai-providers.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-ai-providers.adoc
new file mode 100644
index 000000000000..c8b78c8ca900
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-ai-providers.adoc
@@ -0,0 +1,142 @@
+= Camel CLI - AI Providers and Local Models
+
+The AI features of the Camel CLI -- `camel ask`, `camel explain`, `camel harden`, `camel overview --ai`,
+and the xref:camel-jbang-tui-ai.adoc[AI panel of the Camel TUI] -- talk to a large language model (LLM).
+This page explains how the provider is chosen, and how to run a model on your own machine.
+
+== Choosing a provider
+
+The provider is detected from the environment. The first match wins:
+
+1. `ANTHROPIC_API_KEY` -> Anthropic API
+2. `CLOUD_ML_REGION` + `ANTHROPIC_VERTEX_PROJECT_ID` -> Anthropic models on Google Vertex AI
+3. `AZURE_OPENAI_API_KEY` + `AZURE_OPENAI_ENDPOINT` -> Azure OpenAI (uses the `api-key` header; optional
+   `AZURE_OPENAI_DEPLOYMENT_NAME` and `AZURE_OPENAI_API_VERSION`)
+4. `GEMINI_API_KEY` -> Google Gemini native API (`generativelanguage.googleapis.com`).
+   With `--api-type=gemini`, `GOOGLE_API_KEY` is also accepted.
+5. `OPENAI_API_KEY` -> OpenAI API (`api.openai.com`)
+6. `LLM_API_KEY` + optional `LLM_BASE_URL` (or `OPENAI_BASE_URL`) -> any OpenAI-compatible API
+7. `WATSONX_APIKEY` + optional `WATSONX_URL` -> IBM watsonx.ai
+8. Ollama started with `camel infra run ollama` -> that Ollama
+9. Ollama at `localhost:11434` -> local Ollama
+
+Override the detection with explicit options:
+
+[source,bash]
+----
+camel ask "check health" --api-type=anthropic --api-key=sk-...
+camel ask "check health" --api-type=openai --model=gpt-4
+camel ask "check health" --api-type=gemini --model=gemini-2.0-flash
+camel ask "check health" --api-type=ollama --model=llama3.1
+----
+
+NOTE: `camel harden` only detects Ollama (from `camel infra` or at `localhost:11434`).
+For another provider, give it the endpoint: `--url=https://api.openai.com --api-type=openai --api-key=sk-...`
+(any OpenAI-compatible API).
+
+In the Camel TUI, press *Ctrl+P* in the AI panel to switch provider or model, or pin them in *F2 -> Settings*
+(`camel.tui.ai.provider`, `camel.tui.ai.model`, `camel.tui.ai.url`).
+See xref:camel-jbang-tui-ai.adoc[Camel TUI AI Panel].
+
+== Running a model locally
+
+=== Ollama
+
+Install Ollama natively for the best performance — the native binary uses GPU acceleration
+(Metal on macOS, CUDA/ROCm on Linux). Running Ollama through Docker (`camel infra run ollama`)
+bypasses the GPU and makes inference much slower.
+
+[source,bash]
+----
+# macOS
+brew install ollama
+
+# Linux
+curl -fsSL https://ollama.com/install.sh | sh
+
+# Pull a model and start asking
+ollama pull qwen3.6:35b-a3b
+camel ask "what routes are running?"
+----
+
+Ollama at `localhost:11434` is auto-detected — no environment variable needed.
+The CLI checks what models are available and auto-selects a suitable one.
+
+==== Model requirements
+
+`camel ask` and the TUI F8 panel rely on tool calling to inspect your running Camel process.
+Models smaller than ~14B do not reliably invoke tools and answer from training knowledge instead.
+Use at least a 14B model. Prefer a mixture-of-experts model such as `qwen3.6:35b-a3b`: with only
+3B parameters active per token it processes the tool-heavy prompt many times faster than a dense
+27B/32B model, so answers start in seconds instead of a minute.
+
+[options="header"]
+|===
+| Model | RAM (Q4) | Notes
+| `qwen3.6:35b-a3b` | ~23 GB | Recommended: fastest prompt processing, needs 32 GB+
+| `qwen2.5:14b` | ~9 GB | Minimum for 16 GB machines
+| `qwen3.6:27b` | ~18 GB | Strong dense model, several times slower prompt processing
+| `qwen2.5:32b` | ~20 GB | Good quality, slow prompt processing
+| `hermes3:70b` | ~43 GB | Excellent tool calling, needs 64 GB+
+| `llama3.3:70b` | ~43 GB | Best open model, needs 64 GB+
+|===
+
+On Apple Silicon, all RAM is unified — a 64 GB M-series Mac can run `llama3.3:70b` comfortably alongside the OS and other dev tools.
+Use the default (GGUF) tags rather than the `-mlx` tags: the Ollama MLX engine cannot yet reuse the
+cached prompt for Qwen 3.x models, so every question re-processes the whole prompt.
+
+==== Context window and keep-alive
+
+Every Ollama request from the CLI (`camel ask`, `camel explain`, `camel harden`) and from the TUI asks
+Ollama to keep the model loaded for 30 minutes, so a follow-up question reuses the cached prompt instead
+of reloading the model, and for a context window (`num_ctx`) chosen once per model:
+
+1. `OLLAMA_CONTEXT_LENGTH` in the environment wins when set.
+2. If Ollama already has the model loaded, its window is adopted (raised to 32k when smaller), so the CLI
+   never makes Ollama reload a model that another client is using. A request with a different `num_ctx`
+   makes Ollama reload the model, which costs a cold start of tens of seconds and throws away the prompt
+   cache of every client.
+3. Otherwise 64k when the model's weights plus the KV cache of a 64k window fit the machine's memory,
+   judged from what `ollama show` reports about the model, else 32k. A window that does not fit makes
+   Ollama move layers to the CPU, which slows generation far more than a smaller window costs.
+
+The tool-calling prompt alone is about 4.5k tokens, which is why 32k is the floor: Ollama's own default
+on machines with less than 24 GB is 4k and would truncate it. Keep all your Ollama clients on the same
+value; if you set `OLLAMA_CONTEXT_LENGTH` for the CLI, set it for `ollama serve` too. The TUI's Ollama
+tab shows the window in use, and xref:camel-jbang-tui-local-models.adoc#_working_with_a_local_ollama_model[Working
+with a local Ollama model] explains how the AI panel manages its history inside it.
+
+=== OpenAI-compatible local servers
+
+Many local LLM servers expose an OpenAI-compatible API. Use `LLM_API_KEY` and `LLM_BASE_URL`
+to point the CLI at any of them:
+
+[source,bash]
+----
+export LLM_API_KEY=any-value      # required but can be any non-empty string
+export LLM_BASE_URL=http://localhost:1234   # your server's base URL
+camel ask "what routes are running?"
+----
+
+`OPENAI_BASE_URL` is accepted as an alternative to `LLM_BASE_URL` (common in other tools).
+
+The first model the server lists on `/v1/models` is used unless `--model` names another one; the
+model must support tool calling.
+
+Common OpenAI-compatible servers:
+
+[options="header"]
+|===
+| Server | Default port | Notes
+| https://lmstudio.ai[LM Studio] | 1234 | GUI app, Mac/Windows/Linux
+| https://github.com/vllm-project/vllm[vLLM] | 8000 | Production-grade, NVIDIA GPU
+| https://github.com/ggerganov/llama.cpp[llama.cpp server] | 8080 | Runs on CPU and GPU
+| https://gpt4all.io[GPT4All] | 4891 | Desktop app
+|===
+
+== See also
+
+* xref:camel-jbang-ai.adoc[AI Tools] -- `camel ask`, `camel explain`, `camel overview --ai` and `camel harden`
+* xref:camel-jbang-tui-local-models.adoc[Camel TUI Local Models] -- the tool set a local model gets in the TUI,
+  what a question costs, and the Ollama tab
+* xref:camel-jbang-mcp.adoc[Camel MCP Server] -- the other way round: your own AI assistant uses Camel tools
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-ai.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-ai.adoc
index 8ce276952788..8b2b87d79e6d 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-ai.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-ai.adoc
@@ -3,8 +3,8 @@
 The Camel CLI includes AI-powered commands that use large language models (LLMs)
 to help you understand, troubleshoot, and secure your integrations.
 
-All three commands work with local models (Ollama) or cloud APIs (OpenAI, Anthropic).
-The CLI auto-detects the LLM provider from environment variables or a locally running Ollama instance.
+The commands work with local models (Ollama) or hosted APIs (Anthropic, OpenAI, Gemini, and others).
+The CLI auto-detects the LLM provider, see xref:camel-jbang-ai-providers.adoc[AI Providers and Local Models].
 
 == Ask — chat with a running integration
 
@@ -192,117 +192,7 @@ NOTE: `camel harden` currently supports Ollama and OpenAI-compatible APIs only (
 
 == Choosing an LLM provider
 
-All commands auto-detect the LLM provider. The detection order is:
-
-1. `ANTHROPIC_API_KEY` environment variable → Anthropic API (`ask` and `explain` only)
-2. `CLOUD_ML_REGION` + `ANTHROPIC_VERTEX_PROJECT_ID` → Vertex AI (`ask` and `explain` only)
-3. `AZURE_OPENAI_API_KEY` + `AZURE_OPENAI_ENDPOINT` → Azure OpenAI (uses the `api-key` header; optional `AZURE_OPENAI_DEPLOYMENT_NAME` and `AZURE_OPENAI_API_VERSION`)
-4. `GEMINI_API_KEY` environment variable → Google Gemini native API (`generativelanguage.googleapis.com`). With `--api-type=gemini`, `GOOGLE_API_KEY` is also accepted.
-5. `OPENAI_API_KEY` → OpenAI API (`api.openai.com`)
-6. `LLM_API_KEY` + optional `LLM_BASE_URL` (or `OPENAI_BASE_URL`) → any OpenAI-compatible API
-7. Ollama running via `camel infra` → local Ollama
-8. Ollama at `localhost:11434` → local Ollama
-
-Override with explicit options:
-
-[source,bash]
-----
-camel ask "check health" --api-type=anthropic --api-key=sk-...
-camel ask "check health" --api-type=openai --model=gpt-4
-camel ask "check health" --api-type=gemini --model=gemini-2.0-flash
-camel ask "check health" --api-type=ollama --model=llama3.1
-----
-
-=== Using a local model with Ollama
-
-Install Ollama natively for the best performance — the native binary uses GPU acceleration
-(Metal on macOS, CUDA/ROCm on Linux). Running Ollama through Docker (`camel infra run ollama`)
-bypasses the GPU and makes inference much slower.
-
-[source,bash]
-----
-# macOS
-brew install ollama
-
-# Linux
-curl -fsSL https://ollama.com/install.sh | sh
-
-# Pull a model and start asking
-ollama pull qwen3.6:35b-a3b
-camel ask "what routes are running?"
-----
-
-Ollama at `localhost:11434` is auto-detected — no environment variable needed.
-The CLI checks what models are available and auto-selects a suitable one.
-
-==== Model requirements
-
-`camel ask` and the TUI F8 panel rely on tool calling to inspect your running Camel process.
-Models smaller than ~14B do not reliably invoke tools and answer from training knowledge instead.
-Use at least a 14B model. Prefer a mixture-of-experts model such as `qwen3.6:35b-a3b`: with only
-3B parameters active per token it processes the tool-heavy prompt many times faster than a dense
-27B/32B model, so answers start in seconds instead of a minute.
-
-[options="header"]
-|===
-| Model | RAM (Q4) | Notes
-| `qwen3.6:35b-a3b` | ~23 GB | Recommended: fastest prompt processing, needs 32 GB+
-| `qwen2.5:14b` | ~9 GB | Minimum for 16 GB machines
-| `qwen3.6:27b` | ~18 GB | Strong dense model, several times slower prompt processing
-| `qwen2.5:32b` | ~20 GB | Good quality, slow prompt processing
-| `hermes3:70b` | ~43 GB | Excellent tool calling, needs 64 GB+
-| `llama3.3:70b` | ~43 GB | Best open model, needs 64 GB+
-|===
-
-On Apple Silicon, all RAM is unified — a 64 GB M-series Mac can run `llama3.3:70b` comfortably alongside the OS and other dev tools.
-Use the default (GGUF) tags rather than the `-mlx` tags: the Ollama MLX engine cannot yet reuse the
-cached prompt for Qwen 3.x models, so every question re-processes the whole prompt.
-
-==== Context window and keep-alive
-
-Every Ollama request from the CLI (`camel ask`, `camel explain`, `camel harden`) and from the TUI asks
-Ollama to keep the model loaded for 30 minutes, so a follow-up question reuses the cached prompt instead
-of reloading the model, and for a context window (`num_ctx`) chosen once per model:
-
-1. `OLLAMA_CONTEXT_LENGTH` in the environment wins when set.
-2. If Ollama already has the model loaded, its window is adopted (raised to 32k when smaller), so the CLI
-   never makes Ollama reload a model that another client is using. A request with a different `num_ctx`
-   makes Ollama reload the model, which costs a cold start of tens of seconds and throws away the prompt
-   cache of every client.
-3. Otherwise 64k when the model's weights plus the KV cache of a 64k window fit the machine's memory,
-   judged from what `ollama show` reports about the model, else 32k. A window that does not fit makes
-   Ollama move layers to the CPU, which slows generation far more than a smaller window costs.
-
-The tool-calling prompt alone is about 4.5k tokens, which is why 32k is the floor: Ollama's own default
-on machines with less than 24 GB is 4k and would truncate it. Keep all your Ollama clients on the same
-value; if you set `OLLAMA_CONTEXT_LENGTH` for the CLI, set it for `ollama serve` too. The TUI's Ollama
-tab shows the window in use, and xref:camel-jbang-tui-local-models.adoc#_working_with_a_local_ollama_model[Working
-with a local Ollama model] explains how the AI panel manages its history inside it.
-
-=== Using an OpenAI-compatible local server
-
-Many local LLM servers expose an OpenAI-compatible API. Use `LLM_API_KEY` and `LLM_BASE_URL`
-to point the CLI at any of them:
-
-[source,bash]
-----
-export LLM_API_KEY=any-value      # required but can be any non-empty string
-export LLM_BASE_URL=http://localhost:1234   # your server's base URL
-camel ask "what routes are running?"
-----
-
-`OPENAI_BASE_URL` is accepted as an alternative to `LLM_BASE_URL` (common in other tools).
-
-The first model the server lists on `/v1/models` is used unless `--model` names another one; the
-model must support tool calling.
-
-Common OpenAI-compatible servers:
-
-[options="header"]
-|===
-| Server | Default port | Notes
-| https://lmstudio.ai[LM Studio] | 1234 | GUI app, Mac/Windows/Linux
-| https://github.com/vllm-project/vllm[vLLM] | 8000 | Production-grade, NVIDIA GPU
-| https://github.com/ggerganov/llama.cpp[llama.cpp server] | 8080 | Runs on CPU and GPU
-| https://gpt4all.io[GPT4All] | 4891 | Desktop app
-|===
+The commands detect the provider from the environment (`ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY`,
+a local Ollama, and others), or take it from `--api-type`, `--model` and `--api-key`.
+See xref:camel-jbang-ai-providers.adoc[AI Providers and Local Models] for the detection order and for
+running a model on your own machine with Ollama or an OpenAI-compatible server.
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-configuration.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-configuration.adoc
index 4818898bf2c7..04a469853182 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-configuration.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-configuration.adoc
@@ -117,5 +117,15 @@ NOTE: Placeholders only work for options that the given command supports. Run `c
 
 == Troubleshooting
 
-JBang stores state and downloaded JARs in `~/.jbang`. Camel CLI downloads dependencies to `~/.m2`.
+The Camel CLI downloads dependencies to the Maven repository in `~/.m2`, and keeps the state of running
+integrations in `~/.camel`. When installed with JBang, JBang also keeps its state and the CLI JARs in `~/.jbang`.
 If you encounter issues with outdated JARs, try deleting the relevant entries in these directories.
+
+An integration that did not terminate gracefully (killed, or the machine crashed) can leave files behind in `~/.camel`.
+List them, and remove the ones no longer in use:
+
+[source,bash]
+----
+camel dirty
+camel dirty --clean
+----
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-container.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-container.adoc
index b9c137892f31..ed7e6ed91d3f 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-container.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-container.adoc
@@ -1,41 +1,45 @@
-= Running Camel JBang in a Container
+= Camel CLI - Container Image
 
-The Camel JBang container provides a convenient way to run Camel integrations without installing Java, Maven, or Camel JBang locally. The official Camel JBang container image is equipped with the `camel` CLI and it is the default entrypoint.
+The Camel CLI is available as a container image on https://hub.docker.com/r/apache/camel-jbang/[Docker Hub],
+with `camel` as its entrypoint. Use it to run Camel integrations without installing Java, Maven or the Camel CLI
+on your machine, for example in CI.
 
-== Verify the version
+NOTE: All examples use `docker`. Replace it with `podman` if you prefer -- the commands are identical.
+The examples use the 4.22.0 release; use the tag of the release you want.
 
-The simplest command you can check is the `camel version` which can be run on the container:
+== Verify the version
 
 [source,bash]
 ----
 $ docker run apache/camel-jbang:4.22.0 version
-
 Camel CLI version: 4.22.0
 ----
 
 == Running a route
 
-You can mount a Camel route file from your host machine into the container and run the resulting Camel DSL directly. For example, given a route definition in `test.yaml` (ie, `camel init test.yaml`):
+Mount your route files into the container and run them. For example, given a route in `test.yaml`
+(created with `camel init test.yaml`):
 
 [source,bash]
 ----
-$ docker run -w /home/ubuntu -v $PWD/test.yaml:/tmp/test.yaml apache/camel-jbang:4.22.0 run /tmp/test.yaml --runtime quarkus
-
-...
-2026-06-15 12:21:13,597 INFO  [org.apache.camel.quarkus.core.CamelBootstrapRecorder] (main) Apache Camel Quarkus 3.31.0 is starting
-...
+docker run -v .:/integrations apache/camel-jbang:4.22.0 run /integrations/test.yaml
 ----
 
-You can use any other parameter available for the run and customize your Camel application.
-
-== Any other `camel` command
+All the options of `camel run` work the same way, for example a different runtime:
 
-The same logic used in the previous example with the `run` command can be also used with any other available command for `camel` CLI.
+[source,bash]
+----
+docker run -w /home/ubuntu -v $PWD/test.yaml:/tmp/test.yaml apache/camel-jbang:4.22.0 run /tmp/test.yaml --runtime quarkus
+----
 
-== Container Image Availability
+== Any other `camel` command
 
-The Camel JBang container image is published with a number of tags that provide different Camel, Java runtime and platform architecture combinations. This allows you to select the image that best matches your requirements and deployment environment.
+Any other command of the Camel CLI runs the same way: put it after the image name, such as
+`docker run apache/camel-jbang:4.22.0 catalog component`.
 
-Available image variants, supported architectures, and Java runtime versions may evolve over time. Before choosing an image, verify the available tags on https://hub.docker.com/r/apache/camel-jbang/tags[Apache Camel Jbang Docker Hub].
+== Image tags
 
-Docker will automatically pull the appropriate image variant for your platform when a multi-architecture image is available. Refer to the Docker Hub tags page for the most up-to-date information about supported platforms and image variants.
+The image is published with tags for different Camel versions, Java versions and platform architectures.
+Docker pulls the variant for your platform when a multi-architecture image is available.
+The available variants change over time; check the https://hub.docker.com/r/apache/camel-jbang/tags[tags on Docker Hub]
+before choosing one.
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-debugging.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-debugging.adoc
index 38da7147b32b..79dc91ec33b1 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-debugging.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-debugging.adoc
@@ -8,8 +8,6 @@ as a waterfall view — useful for understanding message flow and spotting slow
 
 == Camel route debugging
 
-*Available since Camel 4.2*
-
 Debug Camel routes directly from the terminal:
 
 [source,bash]
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-devtools.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-devtools.adoc
index 5b292616a877..6cb4838dbd7b 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-devtools.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-devtools.adoc
@@ -1,13 +1,12 @@
 = Camel CLI - Development Tools
 
-The Camel CLI includes a suite of development tools for sending and receiving messages, managing dependencies, scripting, and configuring beans and data sources.
+The Camel CLI includes a suite of development tools for sending and receiving messages, managing dependencies, scripting, and configuring data sources.
+For Java beans and dependency injection, see xref:camel-jbang-beans.adoc[Java Beans].
 
 For debugging, see xref:camel-jbang-debugging.adoc[Debugging]. For data transformation, see xref:camel-jbang-transforming.adoc[Data Transformation].
 
 == Sending messages via Camel
 
-*Available since Camel 4*
-
 The `camel cmd send` command sends a message through a running Camel integration,
 reusing its existing endpoint configuration — a quick way to test routes without
 setting up external tooling for each protocol.
@@ -124,8 +123,6 @@ Stop the unwanted instance or specify its PID.
 
 === Polling messages
 
-*Available since Camel 4.8*
-
 Use `--poll` to consume a message from a Kafka topic, JMS queue, FTP server, etc.
 (uses Camel consumer instead of producer — no body or headers are sent):
 
@@ -136,8 +133,6 @@ $ camel cmd send --poll --endpoint='activemq:cheese'
 
 == Receiving messages via Camel
 
-*Available since Camel 4.9*
-
 The `camel cmd receive` command consumes messages from a remote endpoint and dumps them
 in the terminal — a quick way to verify what an external system has received.
 
@@ -321,14 +316,6 @@ $ camel dependency update pom.xml
 NOTE: Only adding dependencies is supported (removal is manual).
 Only production code in `src/main` is scanned.
 
-== Dependency Injection
-
-The Camel CLI supports annotation-based dependency injection using Camel-native, Spring Boot,
-or Quarkus annotations — even though the runtime is standalone `camel-main` (no Spring or Quarkus container).
-
-See xref:camel-jbang-beans.adoc[Java Beans] for the full reference
-including XML DSL bean definitions and Spring Beans XML support.
-
 == Configuring JDBC DataSources
 
 Two approaches for JDBC connection pools:
@@ -398,70 +385,7 @@ Enable Hikari debug logging to see the pool configuration:
 logging.level.com.zaxxer.hikari = DEBUG
 ----
 
-== Validate Plugin
-
-*Available since Camel 4.18*
-
-The validate plugin checks whether Camel YAML source files are valid.
-
-[source,bash]
-----
-$ camel plugin add validate
-$ camel validate yaml cheese.yaml bad.yaml
-Validation error detected (errors:1)
-
-	File: bad.yaml
-		/0/from: required property 'steps' not found
-----
-
-When all files pass:
-
-[source,bash]
-----
-$ camel validate yaml cheese.yaml bad.yaml
-Validation success (files:2)
-----
-
-`camel validate yaml` checks the YAML DSL schema, then the endpoint URIs, Simple expressions and bean references
-against the Camel catalog (`--catalog=false` for the schema only); `--canonical` validates against the canonical
-schema and reports the deprecated compact notation. `camel validate source` validates any file `camel run` would
-load: YAML routes, `.properties` files (the `camel.*` keys), Java (compiles it), XSLT and XML. The routes of a Java
-or XML DSL file are also read into the Camel model, without compiling or running them, and checked as YAML routes
-are: the endpoint URIs (with the endpoint DSL and constants resolved), Simple expressions, and a `to` whose URI
-holds `+${...}+` and should be a `toD` - what the compiler cannot see inside the strings. A part of a Java route the
-parser cannot work out (a value computed at runtime) is left unchecked, and `camel_validate_source` lists it.
-As the routes of an application are spread over the files of its directory, `camel validate source` also reports a
-`direct:` or `seda:` endpoint a YAML, Java or XML route sends to that no route consumes, in that file or in the YAML, Java and
-XML route files of its directory and its subdirectories: with `direct:` the route would fail to start, with `seda:`
-the messages would be queued and never read. The check stays quiet when it cannot be certain: an endpoint only known
-at runtime (a property placeholder, an expression), route templates and Kamelets, and a directory that is only a part
-of a Maven or Gradle project, such as `src/main/resources/camel`.
-
-=== Validating against another Camel version or runtime
-
-Both commands validate against the CLI's own Camel version. A project that runs another version, or Camel
-Spring Boot or Camel Quarkus, is validated against the catalog and the YAML DSL schema of that version with
-`--camel-version` and `--runtime`, the same options `camel catalog` and `camel doc` take:
-
-[source,bash]
-----
-$ camel validate yaml --camel-version=4.18.0 orders.yaml
-$ camel validate source --runtime=quarkus --quarkus-version=3.30.1 orders.yaml application.properties
-Validation error detected (errors:1)
-
-	File: orders.yaml
-		line 4: atmosphere-websocket: Camel Quarkus has no extension for this component (no camel-quarkus-atmosphere-websocket); pick a component that has one, camel_catalog_find lists them
-----
-
-The catalog of that version is downloaded as for `camel catalog`, and the schema is read from the
-`camel-yaml-dsl` jar of that version (`--repos` and `--download=false` apply to both). With `--runtime=quarkus`
-the Quarkus platform is resolved from the Camel version through the Quarkus extension registry (cached for a
-day under `~/.camel`), or given with `--quarkus-version`; a component of the route that has no Camel Quarkus
-extension, or no Camel Spring Boot starter with `--runtime=spring-boot`, is an error. `--canonical` needs Camel
-4.22 or later, the first version with the canonical schema.
-
-The Simple expressions are parsed by the CLI's own Simple language (the catalog of the other version supplies
-its functions), and the Java, XSLT and XML checks of `camel validate source` use the CLI's classpath.
+== Validating routes
 
-The `camel_validate_source` tool of the MCP servers (xref:camel-jbang-mcp.adoc[]) does the same when it is
-given a `camelVersion`: the catalog and the schema of that version.
+Check routes, properties and other source files for mistakes before running them with `camel validate`.
+See xref:camel-jbang-validation.adoc[Validation].
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-diagnostics.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-diagnostics.adoc
new file mode 100644
index 000000000000..8ed30eb3de6b
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-diagnostics.adoc
@@ -0,0 +1,267 @@
+= Camel CLI - Diagnostics
+
+When an integration misbehaves -- messages fail, hang, run slowly, or memory keeps growing --
+the Camel CLI can look inside the running process without restarting it or attaching a debugger.
+
+All commands take the name or PID of a running integration (see xref:camel-jbang-managing.adoc[Managing Integrations]).
+The `camel get` commands also accept `--watch` to refresh continuously and `--json` for machine-readable output.
+
+TIP: The xref:camel-jbang-tui.adoc[Camel TUI] shows the same data in tabs, see
+xref:camel-jbang-tui-observe.adoc[Camel TUI Observing Integrations].
+
+== Errors and activity
+
+=== Routing errors
+
+`camel get error` lists the routing errors captured by the xref:error-registry.adoc[Error Registry]:
+
+[source,bash]
+----
+camel get error
+camel get error myApp --route=orders --ago=5m
+camel get error myApp --exception=SQLException --handled=false
+----
+
+Each row shows the route and node where the exchange failed, whether the error was handled, the exception and its message.
+The same failure repeating many times is collapsed: the `COUNT` column says how often it happened,
+and only the newest few exchanges of each kind are kept, so a burst of one failure does not push out every other error.
+
+Show the details of an error:
+
+[source,bash]
+----
+camel get error myApp --last
+camel get error myApp --id=<exchange-id> --show=body,headers,stackTrace
+camel get error myApp --last --diagram
+----
+
+`--last` shows the newest error in full, `--detail` shows every error in full,
+and `--show` picks the sections (`body`, `headers`, `properties`, `variables`, `history`, `stackTrace`, or `all`).
+`--diagram` draws the route with the path of the failed exchange highlighted.
+
+NOTE: The error registry is enabled by the `dev` profile, which `camel run` uses by default.
+For another profile, or for a Spring Boot or Quarkus application, set `camel.errorRegistry.enabled=true`.
+
+=== Recent activity
+
+`camel get activity` lists the most recently completed exchanges, with their route, status, elapsed time,
+the number of messages sent to endpoints, and the endpoint they came from:
+
+[source,bash]
+----
+camel get activity
+camel get activity --filter=route1
+camel get activity --watch
+----
+
+Activity tracking is enabled by the `dev` profile.
+
+=== Inflight and blocked messages
+
+`camel get inflight` lists the exchanges currently being processed, with the route and node they are at
+and how long they have been in flight.
+
+`camel get blocked` lists the exchanges where a thread is blocked waiting for an asynchronous processor to complete,
+and for how long. A message that stays in this list points at a call that never returns.
+
+[source,bash]
+----
+camel get inflight --watch
+camel get blocked
+----
+
+== JVM and memory
+
+=== Memory leaks
+
+`camel cmd memory-leak` uses Java Flight Recorder (JFR) `OldObjectSample` events to find objects that survive
+garbage collection and keep piling up:
+
+[source,bash]
+----
+camel cmd memory-leak myApp --start
+----
+
+By default (`--mode=dual`) it makes two recordings, the second twice as long as the first (`--duration`, default 60 seconds),
+and compares them. Each allocation site gets a trend -- `new`, `gone`, `growing`, `suspicious`, `shrinking` or `stable` --
+so you can tell steady memory use from memory that keeps growing. `--mode=single` makes one recording instead.
+
+The recording runs in the integration; the results are kept there and can be queried again:
+
+[source,bash]
+----
+camel cmd memory-leak myApp --status
+camel cmd memory-leak myApp --query --min-size=1MB --top=20
+camel cmd memory-leak myApp --query --stacktrace
+----
+
+`--stop` ends a recording early and shows the results.
+
+=== Heap histogram
+
+`camel cmd heap-histogram` shows which classes use the most heap memory:
+
+[source,bash]
+----
+camel cmd heap-histogram myApp
+camel cmd heap-histogram myApp --filter=org.apache.camel --top=20
+camel cmd heap-histogram myApp --sort=instances --watch
+----
+
+=== Heap dump
+
+`camel cmd heap-dump` writes a heap dump (`.hprof`) in the working directory of the integration,
+for analysis with tools such as Eclipse MAT or VisualVM:
+
+[source,bash]
+----
+camel cmd heap-dump myApp
+camel cmd heap-dump myApp --dump-name=mydump --live=false
+----
+
+The file is named `heap-dump-<timestamp>.hprof` unless `--dump-name` is given.
+Only live objects are dumped unless `--live=false`. The command prints where the file was written.
+
+=== Garbage collection
+
+Trigger a garbage collection, for instance before taking a heap histogram:
+
+[source,bash]
+----
+camel cmd gc myApp
+----
+
+Without a name, all running integrations are collected.
+
+=== Thread dump
+
+List threads in a running Camel integration:
+
+[source,bash]
+----
+camel cmd thread-dump myApp
+----
+
+By default only Camel-related threads are shown. Use `--filter=all` for all JVM threads,
+or `--state=BLOCKED` to find blocked threads. Add `--trace` to include stack traces (`--depth` sets how many frames):
+
+[source,bash]
+----
+camel cmd thread-dump myApp --filter=all --state=BLOCKED --trace --depth=10
+----
+
+TIP: To profile CPU and allocations with JFR, run with `camel run --jfr`. The TUI JFR tab shows the recording,
+see xref:camel-jbang-tui-observe.adoc#_jfr_runtime_profiling[JFR Runtime Profiling].
+
+== Startup and route structure
+
+=== Startup recording
+
+`camel get startup-recorder` shows the steps Camel took while starting, with how long each took,
+to find what makes startup slow:
+
+[source,bash]
+----
+camel get startup-recorder myApp
+camel get startup-recorder myApp --sort=duration
+----
+
+This needs a startup recorder that keeps the steps: run with `camel.main.startupRecorder=backlog`.
+
+=== Route structure
+
+`camel cmd route-structure` shows the routes as a tree of their EIPs, with the source file and line of each:
+
+[source,bash]
+----
+camel cmd route-structure myApp
+camel cmd route-structure orders.camel.yaml
+camel cmd route-structure myApp --filter=myRoute --brief
+camel cmd route-structure myApp --description
+----
+
+Give a source file instead of a running integration to see the structure without running it.
+`--brief` shortens each node, and `--description` shows the description of each node instead of its code.
+
+=== Route dump
+
+`camel cmd route-dump` dumps the routes of the running integration in YAML (default), XML or Java DSL:
+
+[source,bash]
+----
+camel cmd route-dump myApp
+camel cmd route-dump myApp --format=xml --filter=orders
+----
+
+This shows the routes as the running Camel holds them. To convert route files without running them, use `camel transform route`
+(see xref:camel-jbang-transforming.adoc#_transforming_route_dsl_format[Transforming route DSL format]).
+
+== Data
+
+=== DataSources
+
+`camel get datasource` lists the JDBC DataSources in the registry with their connection pool:
+active, idle and total connections, the maximum pool size, and threads waiting for a connection.
+HikariCP and Agroal pools are recognized.
+
+[source,bash]
+----
+camel get datasource --watch
+----
+
+=== SQL trace
+
+`camel get sql-trace` lists the recent SQL statements run by the `sql` and `jdbc` components,
+with the statement, the route, the duration, the number of rows and whether it failed:
+
+[source,bash]
+----
+camel get sql-trace myApp
+camel get sql-trace myApp --watch
+----
+
+=== Running SQL queries
+
+`camel cmd sql` runs a SQL statement on a DataSource of the running integration, using its connection pool:
+
+[source,bash]
+----
+camel cmd sql myApp --query="SELECT * FROM orders"
+camel cmd sql myApp --query="SELECT * FROM users" --datasource=myDS --max-rows=50
+camel cmd sql myApp --query=file:query.sql
+----
+
+The DataSource is detected when there is only one; otherwise name it with `--datasource`.
+
+WARNING: The statement is executed as given, so an `UPDATE` or `DELETE` changes the database.
+
+=== Kafka consumers
+
+`camel get kafka` lists the Kafka consumers of the routes, with their group id, topic, partition and offset:
+
+[source,bash]
+----
+camel get kafka
+camel get kafka --committed
+----
+
+`--committed` also shows the committed offset, which asks the Kafka brokers and is therefore slower.
+
+== Security
+
+=== Vault secrets
+
+`camel get vault` lists the secrets the integration uses from the supported vaults (AWS Secrets Manager,
+Google Secret Manager, Azure Key Vault, HashiCorp Vault, Kubernetes Secrets and ConfigMaps),
+with when they were last updated and checked for refresh. Only the names of the secrets are shown, not their values.
+
+[source,bash]
+----
+camel get vault
+----
+
+== See Also
+
+* xref:camel-jbang-managing.adoc[Managing Integrations] — listing, stopping, logs, tracing, health checks and metrics
+* xref:camel-jbang-debugging.adoc[Debugging] — stepping through routes with the route debugger
+* xref:camel-jbang-tui-observe.adoc[Camel TUI Observing Integrations] — the same data in the terminal dashboard
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-getting-started.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-getting-started.adoc
index d97406348b16..996ad00194d3 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-getting-started.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-getting-started.adoc
@@ -4,33 +4,43 @@ Three commands. That is all it takes to go from zero to a running integration.
 
 == Install
 
-The Camel CLI runs on https://www.jbang.dev/[JBang].
-Install JBang first (see https://www.jbang.dev/download/[download instructions]),
-then install the Camel CLI:
+Install the Camel CLI with the installer script, which needs only Java 17 or later:
 
 [source,bash]
 ----
-jbang app install camel@apache/camel
+curl -fsSL https://camel.apache.org/install.sh | sh
 ----
 
-Verify that it works:
+On Windows (PowerShell):
+
+[source,powershell]
+----
+irm https://camel.apache.org/install.ps1 | iex
+----
+
+See xref:camel-jbang-launcher-install.adoc[Installing the Camel CLI Launcher] for upgrading and switching versions.
+
+If you use https://www.jbang.dev/[JBang], you can install the Camel CLI with it instead:
 
 [source,bash]
 ----
-camel version
+jbang app install camel@apache/camel
 ----
 
-[source]
+Verify that it works:
+
+[source,bash]
 ----
-Camel CLI version: 4.21.0
+camel version
 ----
 
 That is it. No Maven project, no POM file, no IDE required.
 
 NOTE: The CLI requires internet access to download dependencies on first use.
-If you are behind a proxy, see https://www.jbang.dev/documentation/jbang/latest/configuration.html#proxy-configuration[JBang proxy configuration].
+Configure a proxy and mirrors in your Maven `settings.xml`, see
+xref:camel-jbang-running.adoc#_maven_configuration[Maven configuration].
 
-TIP: For version-pinned installs, offline-safe setups, container images, or installing without JBang,
+TIP: For version-pinned installs, offline-safe setups, or container images,
 see xref:camel-jbang-installation.adoc[Installation Options].
 
 == Create your first route
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-installation.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-installation.adoc
index 742e9f0aff7a..74067f9b8621 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-installation.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-installation.adoc
@@ -85,32 +85,5 @@ that runs without JBang entirely.
 
 == Container image
 
-The Camel CLI is also available as a container image on https://hub.docker.com/r/apache/camel-jbang/[Docker Hub].
-
-NOTE: All examples below use `docker`. Replace with `podman` if you prefer — the commands are identical.
-
-Pull the image:
-
-[source,bash]
-----
-docker pull apache/camel-jbang:4.21.0
-----
-
-Verify it works:
-
-[source,bash]
-----
-docker run apache/camel-jbang:4.21.0 version
-----
-
-[source]
-----
-Camel CLI version: 4.21.0
-----
-
-Run a route by mounting your local directory:
-
-[source,bash]
-----
-docker run -v .:/integrations apache/camel-jbang:4.21.0 run /integrations/example.yaml
-----
+The Camel CLI is also available as a container image (`apache/camel-jbang` on Docker Hub),
+see xref:camel-jbang-container.adoc[Container Image].
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes-advanced.adoc
similarity index 63%
copy from docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes.adoc
copy to docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes-advanced.adoc
index 560c3593992b..773ba395f08e 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes-advanced.adoc
@@ -1,131 +1,30 @@
-= Camel Kubernetes plugin
+= Camel CLI - Kubernetes Plugin Advanced Options
 
-Export, build, push, and deploy Camel integrations to Kubernetes — develop locally with Camel CLI, then promote to any cluster.
+The xref:camel-jbang-kubernetes.adoc[Kubernetes Plugin] page covers what most applications need.
+This page lists the less common settings: the trait options the plugin inherited from Camel K,
+running as a CronJob, Knative, and the Jolokia port.
 
-Prerequisites: https://kubernetes.io/docs/tasks/tools/#kubectl[kubectl] installed, connected to a Kubernetes cluster (remote, https://kind.sigs.k8s.io/docs/user/quick-start/[Kind], or https://minikube.sigs.k8s.io/docs/start/[Minikube]).
+== Trait options
 
-Enable the plugin:
+The Kubernetes manifest is generated by _traits_, a concept from Camel K.
+A trait option is set with `--trait <trait>.<option>=<value>` on `camel kubernetes run` and `camel kubernetes export`,
+and some of them have their own shortcut option (such as `--env`, `--config` or `--volume`).
 
-[source,bash]
-----
-camel plugin add kubernetes
-----
-
-TIP: Run `camel kubernetes --help` to see all subcommands.
+A trait option can be set in several places, in this order of precedence:
 
-== Kubernetes export
-
-Export a Maven project with a Kubernetes manifest (`kubernetes.yml`) containing Deployment, Service, ConfigMap, and other resources:
-
-[source,bash]
-----
-camel kubernetes export route.yaml --dir some/path/to/project
-----
+1. `--trait` command options
+2. Annotations with prefix `trait.camel.apache.org/*` (`--annotation`)
+3. Properties in `application-<profile>.properties` with prefix `camel.jbang.trait.*`
+4. Properties in `application.properties` with prefix `camel.jbang.trait.*`
 
-The default runtime is Quarkus (`--runtime=quarkus`). Build and deploy:
+Setting them in `application.properties` keeps them with the project, so every `run` and `export` uses them:
 
-[source,bash]
+[source,properties]
 ----
-./mvnw package -Dquarkus.container-image.build=true
-./mvnw package -Dquarkus.kubernetes.deploy=true
+camel.jbang.trait.container.request-memory=256Mi
+camel.jbang.trait.service.type=LoadBalancer
 ----
 
-TIP: The `camel kubernetes run` command combines export, build, push, and deploy into a single step.
-
-The export command provides several options to customize the project:
-
-[width="100%",cols="1m,3",options="header",]
-|=======================================================================
-|Option |Description
-
-|--service-account
-|The service account used to run the application.
-
-|--dependency
-|Adds dependency that should be included, use "camel:" prefix for a Camel component, "mvn:org.my:app:1.0" for a Maven dependency.
-
-|--build-property
-|Maven/Gradle build properties (syntax: --build-property=prop1=foo)
-
-|--property
-|Add a runtime property or properties from a file (syntax: [my-key=my-value\|file:/path/to/my-conf.properties,/path/to/my-conf.properties]).
-
-|--config
-|Add a runtime configuration from a ConfigMap or a Secret (syntax: [configmap,secret]:name[/key], where name represents the configmap/secret name and key optionally represents the configmap/secret key to be filtered).
-
-|--resource
-|Add a runtime resource from a Configmap or a Secret (syntax: [configmap,secret]:name[/key][@path], where name represents the configmap/secret name, key optionally represents the configmap/secret key to be filtered and path represents the destination path).
-
-|--open-api
-|Add an OpenAPI spec (syntax: [configmap,file]:name).
-
-|--env
-|Set an environment variable in the integration container, for instance "--env MY_VAR=my-value".
-
-|--volume
-|Mount a volume into the integration container, for instance "--volume pvcname:/container/path".
-
-|--connect
-|A Service that the integration should bind to, specified as [[apigroup/]version:]kind:[namespace/]name.
-
-|--source
-|Add the source file to your integration, this is added to the list of files listed as arguments of the command.
-
-|--annotation
-|Add an annotation to the integration. Use name values pairs like "--annotation my.company=hello".
-
-|--label
-|Add a label to the integration. Use name values pairs like "--label my.company=hello".
-
-|--trait
-|Add a trait configuration to the integration. Use name values pairs like "--trait trait.name.config=hello".
-
-|--image
-|An image built externally (for instance via CI/CD). Enabling it will skip the integration build phase.
-
-|--image-registry
-|The image registry to hold the app container image.
-
-|--image-group
-|The image registry group used to push images to.
-
-|--image-builder
-|The image builder used to build the container image (e.g. docker, jib, s2i).
-
-|--image-platform
-|List of target platforms. Each platform is defined using os and architecture (e.g. linux/amd64).
-
-|--base-image
-|The base image that is used to build the container image from (default is eclipse-temurin:<java-version>).
-
-|--registry-mirror
-|Optional Docker registry mirror where to pull images from when building the container image.
-
-|--cluster-type
-|The target cluster type. Special configurations may be applied to different cluster types such as Kind or Minikube.
-
-|--profile
-|The developer xref:manual::camel-jbang-running.adoc#_using_profiles[profile] to use a specific configuration in configuration files using the naming style `application-<profile>.properties`.
-|=======================================================================
-
-TIP: Run `camel kubernetes export --help` for all options (includes inherited Camel CLI export options).
-
-=== Health probes
-
-The export includes `camel-observability-services` by default, which prefixes health probes with `/observe`:
-
-- Quarkus: `/observe/health/live`, `/observe/health/ready`, `/observe/health/started`
-- Spring Boot: `/observe/health/liveness`, `/observe/health/readiness`
-
-== Kubernetes manifest options
-
-Customize the Kubernetes manifest using traits (from Camel K). Trait configuration precedence:
-
-1. `--trait` command options
-2. Annotations with prefix `trait.camel.apache.org/*`
-3. Properties in `application-<profile>.properties` with prefix `camel.jbang.trait.*`
-4. Properties in `application.properties` with prefix `camel.jbang.trait.*`
-
 === Container trait
 
 Customize the container specification (image, ports, resources):
@@ -191,7 +90,7 @@ Example:
 camel kubernetes export Sample.java --trait container.name=my-container --trait container.port=8088 --trait container.request-cpu=0.005 --trait container.request-memory=100Mi
 ----
 
-=== CronJob trait
+=== CronJob trait (run as a scheduled job)
 
 Generate a https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/[CronJob] instead of a Deployment (requires `enabled=true` and `schedule`):
 
@@ -234,25 +133,6 @@ camel kubernetes export Sample.java --trait=cronjob.enabled=true --trait=cronjob
 
 |===
 
-=== Labels and annotations
-
-By default, resources have the label `app.kubernetes.io/name` set to the project name.
-Add custom labels and annotations:
-
-[source,bash]
-----
-camel kubernetes export Sample.java --annotation project.team=camel-experts --label env=staging
-----
-
-=== Environment variables
-
-Set environment variables with `--trait environment.vars=KEY=VALUE` or the shortcut `--env KEY=VALUE`:
-
-[source,bash]
-----
-camel kubernetes export Sample.java --env MY_ENV=foo --env FOO_ENV=bar
-----
-
 === Service trait
 
 A Service resource is auto-generated when routes expose HTTP endpoints (e.g., `platform-http`). Customize it:
@@ -275,200 +155,6 @@ A Service resource is auto-generated when routes expose HTTP endpoints (e.g., `p
 
 |===
 
-=== Knative service trait
-
-Use https://knative.dev/docs/serving/[Knative serving] for serverless workloads with auto-scaling and scale-to-zero.
-
-NOTE: Disabled by default — enable with `--trait knative-service.enabled=true`.
-
-[cols="2m,1m,5a"]
-|===
-|Property | Type | Description
-
-| knative-service.enabled
-| bool
-| Can be used to enable or disable a trait. All traits share this common property.
-
-| knative-service.annotations
-| map[string]string
-| The annotations added to route.
-This can be used to set knative service-specific annotations
-CLI usage example: -t "knative-service.annotations.'haproxy.router.openshift.io/balance'=true"
-
-| knative-service.class
-| string
-| Configures the Knative autoscaling class property (e.g., to set `hpa.autoscaling.knative.dev` or `kpa.autoscaling.knative.dev` autoscaling).
-
-Refer to the Knative documentation for more information.
-
-| knative-service.autoscaling-metric
-| string
-| Configures the Knative autoscaling metric property (e.g., to set `concurrency` based or `cpu` based autoscaling).
-
-Refer to the Knative documentation for more information.
-
-| knative-service.autoscaling-target
-| int
-| Sets the allowed concurrency level or CPU percentage (depending on the autoscaling metric) for each Pod.
-
-Refer to the Knative documentation for more information.
-
-| knative-service.min-scale
-| int
-| The minimum number of Pods that should be running at any time for the integration. It's **zero** by default, meaning that
-the integration is scaled down to zero when not used for a configured amount of time.
-
-Refer to the Knative documentation for more information.
-
-| knative-service.max-scale
-| int
-| An upper bound for the number of Pods that can be running in parallel for the integration.
-Knative has its own cap value that depends on the installation.
-
-Refer to the Knative documentation for more information.
-
-| knative-service.rollout-duration
-| string
-| Enables to gradually shift traffic to the latest Revision and sets the rollout duration.
-It's disabled by default and must be expressed as a Golang `time.Duration` string representation,
-rounded to a second precision.
-
-| knative-service.visibility
-| string
-| Setting `cluster-local`, Knative service becomes a private service.
-Specifically, this option applies the `networking.knative.dev/visibility` label to Knative service.
-
-Refer to the Knative documentation for more information.
-
-| knative-service.timeout-seconds
-| int
-| The maximum duration in seconds that the request instance is allowed to respond to a request. This field propagates to the integration Pod’s terminationGracePeriodSeconds.
-
-Refer to the Knative documentation for more information.
-
-|===
-
-=== Knative component trait
-
-Configure the Camel Knative component to interact with https://knative.dev/docs/eventing/[Knative eventing] and https://knative.dev/docs/serving/[Knative serving]. The export auto-configures both the component and the Kubernetes manifest.
-
-NOTE: Disabled by default — enable with `--trait knative.enabled=true`.
-
-[cols="2m,1m,5a"]
-|===
-|Property | Type | Description
-
-| knative.enabled
-| bool
-| Can be used to enable or disable a trait. (default: true)
-
-| knative.configuration
-| string
-| Can be used to inject a Knative complete configuration in JSON format
-
-| knative.channel-sinks
-| []string
-| List of channels used as destination of camel routes. Can contain simple channel names or full Camel URIs.
-
-Refer to the Knative documentation for more information.
-
-| knative.channel-sources
-| []string
-| List of channels used as the source of camel routes. Can contain simple channel names or full Camel URIs.
-
-| knative.endpoint-sinks
-| []string
-| List of endpoints used as destination of camel routes. Can contain simple endpoint names or full Camel URIs.
-
-| knative.endpoint-sources
-| []string
-| List of endpoints used as sources of camel routes. Can contain simple endpoint names or full Camel URIs.
-
-| knative.event-sinks
-| []string
-| List of endpoints used as destination of integration routes. Can contain simple endpoint names or full Camel URIs.
-
-| knative.event-sources
-| []string
-| List of event types that the integration will be subscribed to. Can contain simple event types or full Camel URIs (to use a specific broker different from "default").
-
-| knative.sink-binding
-| bool
-| Allows binding the integration to a sink via a Knative SinkBinding resource. This can be used when the integration targets a single sink. It’s enabled by default when the integration targets a single sink (except when the integration is owned by a Knative source).
-
-| knative.filters
-| []string
-| Sets filter attributes on the event stream (such as event type, source, subject and so on). A list of key-value pairs that represent filter attributes and its values. The syntax is KEY=VALUE, e.g., source="my.source". Filter attributes get set on the Knative trigger that is being created as part of this integration.
-
-| knative.filter-event-type
-| bool
-| Enables the default filtering for the Knative trigger using the event type If this is true, the created Knative trigger uses the event type as a filter on the event stream when no other filter criteria is given. (default: true)
-
-|===
-
-
-=== Knative trigger
-
-When a route consumes from `knative:event`, the plugin automatically generates a Knative Trigger in the manifest:
-
-[source,yaml]
-----
-- route:
-    from:
-      uri: knative:event/camel.evt.type
-      parameters:
-        name: my-broker
-      steps:
-        - to:
-            uri: log:info
-----
-
-Export with `camel kubernetes export knative-route.yaml` — the trigger, service, and `knative.json` configuration are all generated automatically.
-
-=== Knative channel subscription
-
-Similarly, routes consuming from `knative:channel/my-channel` automatically generate a Knative Subscription in the manifest. The `knative.json` configuration is auto-generated.
-
-=== Knative sink binding
-
-Routes that produce to `knative:event`, `knative:channel`, or `knative:endpoint` automatically get a `SinkBinding` resource in the manifest. Knative injects the target URL via the `K_SINK` environment variable at deployment time, so the route doesn't need to know the actual URL.
-=== Mount trait
-
-Configure volume mounts from ConfigMaps, Secrets, and PVCs. Shortcuts: `--volume`, `--config`, `--resource`.
-
-[cols="2m,1m,5a"]
-|===
-|Property | Type | Description
-
-| mount.configs
-| []string
-| A list of configuration pointing to configmap/secret.
-The configurations are expected to be UTF-8 resources as they are processed by runtime Camel Context and tried to be parsed as property files.
-They are also made available on the classpath to ease their usage directly from the Route.
-Syntax: [configmap\|secret]:name[/key], where name represents the resource name and key optionally represents the resource key to be filtered
-
-| mount.resources
-| []string
-| A list of resources (text or binary content) pointing to a configmap/secret.
-The resources are expected to be any resource type (text or binary content).
-The destination path can be either a default location or any path specified by the user.
-Syntax: [configmap\|secret]:name[/key][@path], where name represents the resource name, key optionally represents the resource key to be filtered and path represents the destination path
-
-| mount.volumes
-| []string
-| A list of Persistent Volume Claims to be mounted. Syntax: [pvcname:/container/path]
-
-|===
-
-Example:
-
-[source,bash]
-----
-camel kubernetes export Sample.java --config secret:my-credentials --resource configmap:my-data --volume my-pvc:/container/path
-----
-
-Mount paths follow Camel conventions: configs go to `/etc/camel/conf.d/`, resources to `/etc/camel/resources.d/`, and the application is auto-configured to read these paths.
-
 === Ingress trait
 
 Add an Ingress resource to expose the application externally (requires a Service resource):
@@ -615,132 +301,216 @@ camel kubernetes export Sample.java --trait jolokia.enabled=true --trait jolokia
 ----
 
 
-=== OpenAPI trait
+=== Mount trait
 
-Mount OpenAPI specs from ConfigMaps:
+Configure volume mounts from ConfigMaps, Secrets, and PVCs. Shortcuts: `--volume`, `--config`, `--resource`.
+
+[cols="2m,1m,5a"]
+|===
+|Property | Type | Description
+
+| mount.configs
+| []string
+| A list of configuration pointing to configmap/secret.
+The configurations are expected to be UTF-8 resources as they are processed by runtime Camel Context and tried to be parsed as property files.
+They are also made available on the classpath to ease their usage directly from the Route.
+Syntax: [configmap\|secret]:name[/key], where name represents the resource name and key optionally represents the resource key to be filtered
+
+| mount.resources
+| []string
+| A list of resources (text or binary content) pointing to a configmap/secret.
+The resources are expected to be any resource type (text or binary content).
+The destination path can be either a default location or any path specified by the user.
+Syntax: [configmap\|secret]:name[/key][@path], where name represents the resource name, key optionally represents the resource key to be filtered and path represents the destination path
+
+| mount.volumes
+| []string
+| A list of Persistent Volume Claims to be mounted. Syntax: [pvcname:/container/path]
+
+|===
+
+Example:
 
 [source,bash]
 ----
-camel kubernetes export Sample.java --open-api configmap:my-spec
+camel kubernetes export Sample.java --config secret:my-credentials --resource configmap:my-data --volume my-pvc:/container/path
 ----
 
-== Deploy to OpenShift
+Mount paths follow Camel conventions: configs go to `/etc/camel/conf.d/`, resources to `/etc/camel/resources.d/`, and the application is auto-configured to read these paths.
+
+=== OpenAPI trait
 
-Use `--cluster-type=openshift` to generate OpenShift-specific resources (Route, ImageStream, BuildConfig):
+Mount OpenAPI specs from ConfigMaps:
 
 [source,bash]
 ----
-camel kubernetes export Sample.java --cluster-type=openshift
+camel kubernetes export Sample.java --open-api configmap:my-spec
 ----
 
-The default image builder switches to S2I for OpenShift. Override with `--image-builder=jib` to push to an external registry instead.
+=== Environment trait
 
-TIP: With S2I, set `--image-group` to your OpenShift project/namespace name, since S2I uses it as part of the image coordinates: `image-registry.openshift-image-registry.svc:5000/<project>/<name>:<tag>`
+`--env KEY=VALUE` is the shortcut of the environment trait, `--trait environment.vars=KEY=VALUE`.
 
-== Kubernetes run
+== Knative
 
-The `run` command exports, builds, pushes, and deploys in one step:
+https://knative.dev/[Knative] runs the application as a serverless service (Knative serving) and connects it to
+event brokers and channels (Knative eventing). The plugin generates the Knative resources for the
+xref:components::knative-component.adoc[Knative component] used in the routes.
 
-[source,bash]
-----
-camel kubernetes run route.yaml --image-registry=kind
-----
+=== Knative service trait
 
-The command auto-detects local clusters (`kind`, `minikube`, OpenShift) and configures the registry accordingly. Disable with `--disable-auto`.
+Use https://knative.dev/docs/serving/[Knative serving] for serverless workloads with auto-scaling and scale-to-zero.
 
-Customize the image:
+NOTE: Disabled by default — enable with `--trait knative-service.enabled=true`.
 
-[source,bash]
-----
-camel kubernetes run route.yaml --image-registry=kind --image-group camel-experts
-camel kubernetes run route.yaml --image quay.io/camel-experts/demo-app:1.0
-----
+[cols="2m,1m,5a"]
+|===
+|Property | Type | Description
 
-The `run` command supports the same trait options as `export` for customizing the Kubernetes manifest.
+| knative-service.enabled
+| bool
+| Can be used to enable or disable a trait. All traits share this common property.
 
-=== Auto reload with `--dev`
+| knative-service.annotations
+| map[string]string
+| The annotations added to route.
+This can be used to set knative service-specific annotations
+CLI usage example: -t "knative-service.annotations.'haproxy.router.openshift.io/balance'=true"
 
-Watch for source file changes and automatically rebuild/redeploy:
+| knative-service.class
+| string
+| Configures the Knative autoscaling class property (e.g., to set `hpa.autoscaling.knative.dev` or `kpa.autoscaling.knative.dev` autoscaling).
 
-[source,bash]
-----
-camel kubernetes run route.yaml --image-registry=kind --dev
-----
+Refer to the Knative documentation for more information.
 
-Terminate the process to stop dev mode — the deployment is automatically removed on shutdown.
+| knative-service.autoscaling-metric
+| string
+| Configures the Knative autoscaling metric property (e.g., to set `concurrency` based or `cpu` based autoscaling).
 
-NOTE: On macOS, the file watch mechanism is slower due to limited native file operations for Java processes.
+Refer to the Knative documentation for more information.
 
-=== Setting properties and resources at runtime
+| knative-service.autoscaling-target
+| int
+| Sets the allowed concurrency level or CPU percentage (depending on the autoscaling metric) for each Pod.
 
-Set properties inline, from files, or from Kubernetes resources:
+Refer to the Knative documentation for more information.
 
-[source,bash]
-----
-camel kubernetes run route.yaml --property my-key=my-val
-camel kubernetes run route.yaml --property file:/some/directory/file.properties
-----
+| knative-service.min-scale
+| int
+| The minimum number of Pods that should be running at any time for the integration. It's **zero** by default, meaning that
+the integration is scaled down to zero when not used for a configured amount of time.
 
-==== Properties from ConfigMaps and Secrets
+Refer to the Knative documentation for more information.
 
-Use `--config` to mount ConfigMap/Secret data as properties files, automatically configured for Camel property placeholders:
+| knative-service.max-scale
+| int
+| An upper bound for the number of Pods that can be running in parallel for the integration.
+Knative has its own cap value that depends on the installation.
 
-[source,bash]
-----
-camel kubernetes run route.java --config configmap:game-config
-camel kubernetes run route.java --config configmap:game-config/game.properties
-camel kubernetes run route.java --config secret:my-credentials
-----
+Refer to the Knative documentation for more information.
 
-Mount paths: `--config configmap:` maps to `/etc/camel/conf.d/_configmaps/<name>/<key>`, `--config secret:` maps to `/etc/camel/conf.d/_secrets/<name>/<key>`. Each ConfigMap key becomes a file.
+| knative-service.rollout-duration
+| string
+| Enables to gradually shift traffic to the latest Revision and sets the rollout duration.
+It's disabled by default and must be expressed as a Golang `time.Duration` string representation,
+rounded to a second precision.
 
-==== Mounting generic files
+| knative-service.visibility
+| string
+| Setting `cluster-local`, Knative service becomes a private service.
+Specifically, this option applies the `networking.knative.dev/visibility` label to Knative service.
 
-Use `--resource` to mount files without property placeholder configuration. Syntax: `[configmap|secret]:name[/key][@path]`:
+Refer to the Knative documentation for more information.
 
-[source,bash]
-----
-camel kubernetes run route.java --resource configmap:my-data
-camel kubernetes run route.java --resource configmap:my-data/config.xml@/etc/my-config.xml
-----
+| knative-service.timeout-seconds
+| int
+| The maximum duration in seconds that the request instance is allowed to respond to a request. This field propagates to the integration Pod’s terminationGracePeriodSeconds.
 
-Mount paths: `/etc/camel/resources.d/_configmaps/<name>/<key>` (or `_secrets`). Use `@path` to override the destination.
+Refer to the Knative documentation for more information.
 
-== Show logs
+|===
 
-Stream log output from a running deployment:
+=== Knative component trait
 
-[source,bash]
-----
-camel kubernetes logs --name=route
-----
+Configure the Camel Knative component to interact with https://knative.dev/docs/eventing/[Knative eventing] and https://knative.dev/docs/serving/[Knative serving]. The export auto-configures both the component and the Kubernetes manifest.
 
-== Delete deployments
+NOTE: Disabled by default — enable with `--trait knative.enabled=true`.
 
-Remove a deployment and all its resources:
+[cols="2m,1m,5a"]
+|===
+|Property | Type | Description
 
-[source,bash]
-----
-camel kubernetes delete --name=route
-----
+| knative.enabled
+| bool
+| Can be used to enable or disable a trait. (default: true)
 
-== Minikube deployment tips
+| knative.configuration
+| string
+| Can be used to inject a Knative complete configuration in JSON format
 
-Quick start for local development with Minikube (Camel 4.10+):
+| knative.channel-sinks
+| []string
+| List of channels used as destination of camel routes. Can contain simple channel names or full Camel URIs.
 
-[source,bash]
+Refer to the Knative documentation for more information.
+
+| knative.channel-sources
+| []string
+| List of channels used as the source of camel routes. Can contain simple channel names or full Camel URIs.
+
+| knative.endpoint-sinks
+| []string
+| List of endpoints used as destination of camel routes. Can contain simple endpoint names or full Camel URIs.
+
+| knative.endpoint-sources
+| []string
+| List of endpoints used as sources of camel routes. Can contain simple endpoint names or full Camel URIs.
+
+| knative.event-sinks
+| []string
+| List of endpoints used as destination of integration routes. Can contain simple endpoint names or full Camel URIs.
+
+| knative.event-sources
+| []string
+| List of event types that the integration will be subscribed to. Can contain simple event types or full Camel URIs (to use a specific broker different from "default").
+
+| knative.sink-binding
+| bool
+| Allows binding the integration to a sink via a Knative SinkBinding resource. This can be used when the integration targets a single sink. It’s enabled by default when the integration targets a single sink (except when the integration is owned by a Knative source).
+
+| knative.filters
+| []string
+| Sets filter attributes on the event stream (such as event type, source, subject and so on). A list of key-value pairs that represent filter attributes and its values. The syntax is KEY=VALUE, e.g., source="my.source". Filter attributes get set on the Knative trigger that is being created as part of this integration.
+
+| knative.filter-event-type
+| bool
+| Enables the default filtering for the Knative trigger using the event type If this is true, the created Knative trigger uses the event type as a filter on the event stream when no other filter criteria is given. (default: true)
+
+|===
+
+
+=== Knative trigger
+
+When a route consumes from `knative:event`, the plugin automatically generates a Knative Trigger in the manifest:
+
+[source,yaml]
 ----
-minikube start --addons registry --driver=docker
-eval $(minikube -p minikube docker-env)
-camel kubernetes run demo.camel.yaml
+- route:
+    from:
+      uri: knative:event/camel.evt.type
+      parameters:
+        name: my-broker
+      steps:
+        - to:
+            uri: log:info
 ----
 
-== Deployment tips and troubleshooting
+Export with `camel kubernetes export knative-route.yaml` — the trigger, service, and `knative.json` configuration are all generated automatically.
 
-* If there is any error with `camel kubernetes run`, set `--verbose` to display additional logging.
+=== Knative channel subscription
 
-* You may want to examine the generated maven project in `.camel-jbang-run/<name>`.
+Similarly, routes consuming from `knative:channel/my-channel` automatically generate a Knative Subscription in the manifest. The `knative.json` configuration is auto-generated.
 
-* If there are issues building the container image or deploying the kubernetes manifests, consider disabling the kubernetes cluster detection with `--disable-auto`.
+=== Knative sink binding
 
-* Note that Docker multi-platform build is used. It requires to have followed these https://docs.docker.com/build/building/multi-platform/#build-multi-platform-images[Docker requirements].
+Routes that produce to `knative:event`, `knative:channel`, or `knative:endpoint` automatically get a `SinkBinding` resource in the manifest. Knative injects the target URL via the `K_SINK` environment variable at deployment time, so the route doesn't need to know the actual URL.
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes.adoc
index 560c3593992b..38a1b40118f5 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes.adoc
@@ -1,8 +1,12 @@
-= Camel Kubernetes plugin
+= Camel CLI - Kubernetes Plugin
 
-Export, build, push, and deploy Camel integrations to Kubernetes — develop locally with Camel CLI, then promote to any cluster.
+You have Camel routes that run with `camel run`, and you want them running on Kubernetes.
+The Kubernetes plugin builds a Spring Boot, Quarkus or Camel Main application from your route files,
+packages it as a container image, and deploys it to the cluster -- in one command,
+or as a Maven project you hand over to your CI/CD pipeline.
 
-Prerequisites: https://kubernetes.io/docs/tasks/tools/#kubectl[kubectl] installed, connected to a Kubernetes cluster (remote, https://kind.sigs.k8s.io/docs/user/quick-start/[Kind], or https://minikube.sigs.k8s.io/docs/start/[Minikube]).
+Prerequisites: https://kubernetes.io/docs/tasks/tools/#kubectl[kubectl] installed and connected to a cluster
+(remote, https://kind.sigs.k8s.io/docs/user/quick-start/[Kind], or https://minikube.sigs.k8s.io/docs/start/[Minikube]).
 
 Enable the plugin:
 
@@ -13,734 +17,288 @@ camel plugin add kubernetes
 
 TIP: Run `camel kubernetes --help` to see all subcommands.
 
-== Kubernetes export
+== Run on Kubernetes in one step
 
-Export a Maven project with a Kubernetes manifest (`kubernetes.yml`) containing Deployment, Service, ConfigMap, and other resources:
+Given the routes of your application in the current folder:
 
 [source,bash]
 ----
-camel kubernetes export route.yaml --dir some/path/to/project
+camel kubernetes run * --runtime=spring-boot --name=my-app
 ----
 
-The default runtime is Quarkus (`--runtime=quarkus`). Build and deploy:
+This exports a Spring Boot project named `my-app`, builds the container image, pushes it, and deploys it to the cluster
+`kubectl` is connected to. The runtime is one of `spring-boot`, `quarkus` (the default) or `main`.
+
+Local clusters (Kind, Minikube) and OpenShift are detected, and the image registry is configured for them.
+For any other cluster, tell the plugin where to push the image:
 
 [source,bash]
 ----
-./mvnw package -Dquarkus.container-image.build=true
-./mvnw package -Dquarkus.kubernetes.deploy=true
+camel kubernetes run * --runtime=spring-boot --image-registry=quay.io --image-group=my-team
 ----
 
-TIP: The `camel kubernetes run` command combines export, build, push, and deploy into a single step.
-
-The export command provides several options to customize the project:
-
-[width="100%",cols="1m,3",options="header",]
-|=======================================================================
-|Option |Description
-
-|--service-account
-|The service account used to run the application.
-
-|--dependency
-|Adds dependency that should be included, use "camel:" prefix for a Camel component, "mvn:org.my:app:1.0" for a Maven dependency.
-
-|--build-property
-|Maven/Gradle build properties (syntax: --build-property=prop1=foo)
-
-|--property
-|Add a runtime property or properties from a file (syntax: [my-key=my-value\|file:/path/to/my-conf.properties,/path/to/my-conf.properties]).
-
-|--config
-|Add a runtime configuration from a ConfigMap or a Secret (syntax: [configmap,secret]:name[/key], where name represents the configmap/secret name and key optionally represents the configmap/secret key to be filtered).
-
-|--resource
-|Add a runtime resource from a Configmap or a Secret (syntax: [configmap,secret]:name[/key][@path], where name represents the configmap/secret name, key optionally represents the configmap/secret key to be filtered and path represents the destination path).
-
-|--open-api
-|Add an OpenAPI spec (syntax: [configmap,file]:name).
-
-|--env
-|Set an environment variable in the integration container, for instance "--env MY_VAR=my-value".
-
-|--volume
-|Mount a volume into the integration container, for instance "--volume pvcname:/container/path".
-
-|--connect
-|A Service that the integration should bind to, specified as [[apigroup/]version:]kind:[namespace/]name.
-
-|--source
-|Add the source file to your integration, this is added to the list of files listed as arguments of the command.
-
-|--annotation
-|Add an annotation to the integration. Use name values pairs like "--annotation my.company=hello".
-
-|--label
-|Add a label to the integration. Use name values pairs like "--label my.company=hello".
-
-|--trait
-|Add a trait configuration to the integration. Use name values pairs like "--trait trait.name.config=hello".
-
-|--image
-|An image built externally (for instance via CI/CD). Enabling it will skip the integration build phase.
-
-|--image-registry
-|The image registry to hold the app container image.
-
-|--image-group
-|The image registry group used to push images to.
-
-|--image-builder
-|The image builder used to build the container image (e.g. docker, jib, s2i).
-
-|--image-platform
-|List of target platforms. Each platform is defined using os and architecture (e.g. linux/amd64).
-
-|--base-image
-|The base image that is used to build the container image from (default is eclipse-temurin:<java-version>).
+Useful options of `run`:
 
-|--registry-mirror
-|Optional Docker registry mirror where to pull images from when building the container image.
-
-|--cluster-type
-|The target cluster type. Special configurations may be applied to different cluster types such as Kind or Minikube.
-
-|--profile
-|The developer xref:manual::camel-jbang-running.adoc#_using_profiles[profile] to use a specific configuration in configuration files using the naming style `application-<profile>.properties`.
-|=======================================================================
-
-TIP: Run `camel kubernetes export --help` for all options (includes inherited Camel CLI export options).
-
-=== Health probes
-
-The export includes `camel-observability-services` by default, which prefixes health probes with `/observe`:
-
-- Quarkus: `/observe/health/live`, `/observe/health/ready`, `/observe/health/started`
-- Spring Boot: `/observe/health/liveness`, `/observe/health/readiness`
-
-== Kubernetes manifest options
-
-Customize the Kubernetes manifest using traits (from Camel K). Trait configuration precedence:
-
-1. `--trait` command options
-2. Annotations with prefix `trait.camel.apache.org/*`
-3. Properties in `application-<profile>.properties` with prefix `camel.jbang.trait.*`
-4. Properties in `application.properties` with prefix `camel.jbang.trait.*`
-
-=== Container trait
-
-Customize the container specification (image, ports, resources):
-
-[cols="2m,1m,5a"]
+[width="100%",cols="1m,3",options="header"]
 |===
-|Property | Type | Description
-
-| container.port
-| int
-| To configure a different port exposed by the container (default `8080`).
-
-| container.port-name
-| string
-| To configure a different port name for the port exposed by the container. It defaults to `http` only when the `expose` parameter is true.
-
-| container.service-port
-| int
-| To configure under which service port the container port is to be exposed (default `80`).
+| Option | Description
 
-| container.service-port-name
-| string
-| To configure under which service port name the container port is to be exposed (default `http`).
+| --namespace
+| The namespace to deploy to (default: the current namespace of `kubectl`).
 
-| container.name
-| string
-| The application container name.
+| --name
+| The application name, used for the image, the Deployment and all resources. Set it explicitly, otherwise it is derived from the files given.
 
-| container.image
-| string
-| The application container image to use for the Deployment.
+| --wait
+| Wait for the deployment to become ready.
 
-| container.image-pull-policy
-| PullPolicy
-| The pull policy: Always\|Never\|IfNotPresent
+| --logs
+| Print the logs once the application has started.
 
-| container.image-pull-secrets
-| string[]
-| The pull secrets for private registries
-
-| container.request-cpu
-| string
-| The minimum amount of CPU required.
-
-| container.request-memory
-| string
-| The minimum amount of memory required.
-
-| container.limit-cpu
-| string
-| The maximum amount of CPU required.
-
-| container.limit-memory
-| string
-| The maximum amount of memory required.
+| --disable-auto
+| Do not detect the cluster type (Kind, Minikube, OpenShift).
 
+| --verbose
+| Show the output of the Maven build and the deployment.
 |===
 
-Example:
+=== Develop against the cluster with `--dev`
 
-[source,bash]
-----
-camel kubernetes export Sample.java --trait container.name=my-container --trait container.port=8088 --trait container.request-cpu=0.005 --trait container.request-memory=100Mi
-----
-
-=== CronJob trait
-
-Generate a https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/[CronJob] instead of a Deployment (requires `enabled=true` and `schedule`):
+Watch the route files and rebuild and redeploy on every change:
 
 [source,bash]
 ----
-camel kubernetes export Sample.java --trait=cronjob.enabled=true --trait=cronjob.schedule="* * * * 2"
+camel kubernetes run * --runtime=spring-boot --dev
 ----
 
-[cols="2m,1m,5a"]
-|===
-|Property | Type | Description
-
-| cronjob.enabled
-| boolean
-| To generate the CronJob manifest instead of Deployment. (default=false)
-
-| cronjob.schedule
-| string
-| To set the schedule to run the workload following the crontab format.
-
-| cronjob.timezone
-| string
-| To set the timezone to run the workload.
-
-| cronjob.startingDeadlineSeconds
-| integer
-| To set the `StartingDeadlineSeconds` field of the CronJob.
-
-| cronjob.activeDeadlineSeconds
-| integer
-| To set the `ActiveDeadlineSeconds` field of the CronJob.
-
-| cronjob.backoffLimit
-| integer
-| To set the `BackoffLimit` field of the CronJob.
+Stop the command (`Ctrl+C`) to end dev mode -- the deployment is removed on shutdown.
 
-| cronjob.durationMaxIdleSeconds
-| integer
-| To set the `camel.main.duration-max-idle-seconds` property for how long time in seconds Camel can be idle before automatic terminating the JVM. (default 1)
-
-|===
+NOTE: On macOS, the file watch mechanism is slower due to limited native file operations for Java processes.
 
-=== Labels and annotations
+== Export a Maven project
 
-By default, resources have the label `app.kubernetes.io/name` set to the project name.
-Add custom labels and annotations:
+For a real deployment pipeline you want the project in source control.
+`export` writes a regular Maven project with the Kubernetes manifest included:
 
 [source,bash]
 ----
-camel kubernetes export Sample.java --annotation project.team=camel-experts --label env=staging
+camel kubernetes export * --runtime=spring-boot --name=my-app --dir=../my-app
 ----
 
-=== Environment variables
-
-Set environment variables with `--trait environment.vars=KEY=VALUE` or the shortcut `--env KEY=VALUE`:
+The project uses the https://eclipse.dev/jkube/[Eclipse JKube] Maven plugin, for all three runtimes.
+The `package` phase builds the container image, generates the Kubernetes manifest
+(`target/kubernetes/kubernetes.yml`: Deployment, Service, ConfigMaps, ...) and pushes the image.
+Deploy it with:
 
 [source,bash]
 ----
-camel kubernetes export Sample.java --env MY_ENV=foo --env FOO_ENV=bar
+cd ../my-app
+./mvnw package k8s:deploy
 ----
 
-=== Service trait
-
-A Service resource is auto-generated when routes expose HTTP endpoints (e.g., `platform-http`). Customize it:
-
-[cols="2m,1m,5a"]
-|===
-|Property | Type | Description
-
-| service.type
-| string
-| The type of service to be used, either 'ClusterIP', 'NodePort' or 'LoadBalancer'.
-
-| container.service-port
-| int
-| To configure under which service port the container port is to be exposed (default `80`).
-
-| container.service-port-name
-| string
-| To configure under which service port name the container port is to be exposed (default `http`).
-
-|===
+`export` takes the same options as `run` for the image, the configuration and the manifest,
+so the project deploys the same way `camel kubernetes run` would.
 
-=== Knative service trait
+TIP: Run `camel kubernetes export --help` for all options, including the options inherited from `camel export`
+(Camel and Spring Boot versions, `--gav`, `--dep`, and so on).
+See xref:camel-jbang-projects.adoc[Export to Maven] for those.
 
-Use https://knative.dev/docs/serving/[Knative serving] for serverless workloads with auto-scaling and scale-to-zero.
+== Container image
 
-NOTE: Disabled by default — enable with `--trait knative-service.enabled=true`.
+By default the image is built with https://github.com/GoogleContainerTools/jib[Jib], which needs no Docker daemon,
+from the `eclipse-temurin` base image of your Java version.
 
-[cols="2m,1m,5a"]
+[width="100%",cols="1m,3",options="header"]
 |===
-|Property | Type | Description
-
-| knative-service.enabled
-| bool
-| Can be used to enable or disable a trait. All traits share this common property.
-
-| knative-service.annotations
-| map[string]string
-| The annotations added to route.
-This can be used to set knative service-specific annotations
-CLI usage example: -t "knative-service.annotations.'haproxy.router.openshift.io/balance'=true"
-
-| knative-service.class
-| string
-| Configures the Knative autoscaling class property (e.g., to set `hpa.autoscaling.knative.dev` or `kpa.autoscaling.knative.dev` autoscaling).
-
-Refer to the Knative documentation for more information.
-
-| knative-service.autoscaling-metric
-| string
-| Configures the Knative autoscaling metric property (e.g., to set `concurrency` based or `cpu` based autoscaling).
-
-Refer to the Knative documentation for more information.
-
-| knative-service.autoscaling-target
-| int
-| Sets the allowed concurrency level or CPU percentage (depending on the autoscaling metric) for each Pod.
-
-Refer to the Knative documentation for more information.
-
-| knative-service.min-scale
-| int
-| The minimum number of Pods that should be running at any time for the integration. It's **zero** by default, meaning that
-the integration is scaled down to zero when not used for a configured amount of time.
-
-Refer to the Knative documentation for more information.
+| Option | Description
 
-| knative-service.max-scale
-| int
-| An upper bound for the number of Pods that can be running in parallel for the integration.
-Knative has its own cap value that depends on the installation.
+| --image-registry
+| The registry to push the image to, such as `quay.io` or `kind` for a local Kind cluster.
 
-Refer to the Knative documentation for more information.
+| --image-group
+| The group (organization or project) in the registry.
 
-| knative-service.rollout-duration
-| string
-| Enables to gradually shift traffic to the latest Revision and sets the rollout duration.
-It's disabled by default and must be expressed as a Golang `time.Duration` string representation,
-rounded to a second precision.
+| --image
+| Use an image built elsewhere (for instance by your CI/CD pipeline), such as `quay.io/my-team/my-app:1.0`.
+  The image build is skipped.
 
-| knative-service.visibility
-| string
-| Setting `cluster-local`, Knative service becomes a private service.
-Specifically, this option applies the `networking.knative.dev/visibility` label to Knative service.
+| --image-builder
+| How to build the image: `jib` (default), `docker` or `s2i`.
 
-Refer to the Knative documentation for more information.
+| --base-image
+| The base image to build from (default `eclipse-temurin:<java-version>`).
 
-| knative-service.timeout-seconds
-| int
-| The maximum duration in seconds that the request instance is allowed to respond to a request. This field propagates to the integration Pod’s terminationGracePeriodSeconds.
+| --image-platform
+| The target platforms of the image, such as `linux/amd64,linux/arm64`.
 
-Refer to the Knative documentation for more information.
+| --image-push
+| Whether to push the image (default `true`).
 
+| --registry-mirror
+| A registry mirror to pull the base image from.
 |===
 
-=== Knative component trait
-
-Configure the Camel Knative component to interact with https://knative.dev/docs/eventing/[Knative eventing] and https://knative.dev/docs/serving/[Knative serving]. The export auto-configures both the component and the Kubernetes manifest.
-
-NOTE: Disabled by default — enable with `--trait knative.enabled=true`.
-
-[cols="2m,1m,5a"]
-|===
-|Property | Type | Description
-
-| knative.enabled
-| bool
-| Can be used to enable or disable a trait. (default: true)
-
-| knative.configuration
-| string
-| Can be used to inject a Knative complete configuration in JSON format
-
-| knative.channel-sinks
-| []string
-| List of channels used as destination of camel routes. Can contain simple channel names or full Camel URIs.
-
-Refer to the Knative documentation for more information.
-
-| knative.channel-sources
-| []string
-| List of channels used as the source of camel routes. Can contain simple channel names or full Camel URIs.
-
-| knative.endpoint-sinks
-| []string
-| List of endpoints used as destination of camel routes. Can contain simple endpoint names or full Camel URIs.
-
-| knative.endpoint-sources
-| []string
-| List of endpoints used as sources of camel routes. Can contain simple endpoint names or full Camel URIs.
+== Configuration
 
-| knative.event-sinks
-| []string
-| List of endpoints used as destination of integration routes. Can contain simple endpoint names or full Camel URIs.
-
-| knative.event-sources
-| []string
-| List of event types that the integration will be subscribed to. Can contain simple event types or full Camel URIs (to use a specific broker different from "default").
-
-| knative.sink-binding
-| bool
-| Allows binding the integration to a sink via a Knative SinkBinding resource. This can be used when the integration targets a single sink. It’s enabled by default when the integration targets a single sink (except when the integration is owned by a Knative source).
-
-| knative.filters
-| []string
-| Sets filter attributes on the event stream (such as event type, source, subject and so on). A list of key-value pairs that represent filter attributes and its values. The syntax is KEY=VALUE, e.g., source="my.source". Filter attributes get set on the Knative trigger that is being created as part of this integration.
-
-| knative.filter-event-type
-| bool
-| Enables the default filtering for the Knative trigger using the event type If this is true, the created Knative trigger uses the event type as a filter on the event stream when no other filter criteria is given. (default: true)
-
-|===
-
-
-=== Knative trigger
-
-When a route consumes from `knative:event`, the plugin automatically generates a Knative Trigger in the manifest:
-
-[source,yaml]
-----
-- route:
-    from:
-      uri: knative:event/camel.evt.type
-      parameters:
-        name: my-broker
-      steps:
-        - to:
-            uri: log:info
-----
-
-Export with `camel kubernetes export knative-route.yaml` — the trigger, service, and `knative.json` configuration are all generated automatically.
-
-=== Knative channel subscription
-
-Similarly, routes consuming from `knative:channel/my-channel` automatically generate a Knative Subscription in the manifest. The `knative.json` configuration is auto-generated.
-
-=== Knative sink binding
-
-Routes that produce to `knative:event`, `knative:channel`, or `knative:endpoint` automatically get a `SinkBinding` resource in the manifest. Knative injects the target URL via the `K_SINK` environment variable at deployment time, so the route doesn't need to know the actual URL.
-=== Mount trait
-
-Configure volume mounts from ConfigMaps, Secrets, and PVCs. Shortcuts: `--volume`, `--config`, `--resource`.
-
-[cols="2m,1m,5a"]
-|===
-|Property | Type | Description
-
-| mount.configs
-| []string
-| A list of configuration pointing to configmap/secret.
-The configurations are expected to be UTF-8 resources as they are processed by runtime Camel Context and tried to be parsed as property files.
-They are also made available on the classpath to ease their usage directly from the Route.
-Syntax: [configmap\|secret]:name[/key], where name represents the resource name and key optionally represents the resource key to be filtered
-
-| mount.resources
-| []string
-| A list of resources (text or binary content) pointing to a configmap/secret.
-The resources are expected to be any resource type (text or binary content).
-The destination path can be either a default location or any path specified by the user.
-Syntax: [configmap\|secret]:name[/key][@path], where name represents the resource name, key optionally represents the resource key to be filtered and path represents the destination path
-
-| mount.volumes
-| []string
-| A list of Persistent Volume Claims to be mounted. Syntax: [pvcname:/container/path]
-
-|===
-
-Example:
+Your `application.properties` is exported with the routes.
+Set or override properties when deploying:
 
 [source,bash]
 ----
-camel kubernetes export Sample.java --config secret:my-credentials --resource configmap:my-data --volume my-pvc:/container/path
+camel kubernetes run * --property my-key=my-val
+camel kubernetes run * --property file:/some/directory/file.properties
 ----
 
-Mount paths follow Camel conventions: configs go to `/etc/camel/conf.d/`, resources to `/etc/camel/resources.d/`, and the application is auto-configured to read these paths.
-
-=== Ingress trait
-
-Add an Ingress resource to expose the application externally (requires a Service resource):
-
-[cols="2m,1m,5a"]
-|===
-|Property | Type | Description
-
-| ingress.enabled
-| bool
-| Can be used to enable or disable a trait. All traits share this common property (default `false`).
-
-| ingress.annotations
-| map[string]string
-| The annotations added to the ingress. This can be used to set controller-specific annotations, e.g., when using the https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/annotations.md[NGINX Ingress controller].
-
-| ingress.host
-| string
-| To configure the host exposed by the ingress.
-
-| ingress.path
-| string
-| To configure the path exposed by the ingress (default `/`).
-
-| ingress.pathType
-| string
-| To configure the https://kubernetes.io/docs/concepts/services-networking/ingress/#path-types[path type] exposed by the ingress. One of Exact, Prefix, ImplementationSpecific (default to Prefix).
-
-| ingress.auto
-| bool
-| To automatically add an Ingress Resource whenever the route uses an HTTP endpoint consumer (default `true`).
-
-| ingress.tls-hosts
-| []string
-| To configure specific hosts exposed through SNI TLS extension by the ingess.
-
-| ingress.tls-secret-name
-| string
-| To indicate the secret containing the TLS private key and certificate to use for TLS.
-
-|===
-
-Example:
+Use a xref:camel-jbang-running.adoc#_using_profiles[profile] to pick `application-<profile>.properties`:
 
 [source,bash]
 ----
-camel kubernetes export Sample.java --trait ingress.enabled=true --trait ingress.host=example.com --trait ingress.path=/sample
+camel kubernetes run * --profile=prod
 ----
 
-=== Route trait (OpenShift)
-
-Add an OpenShift Route resource to expose the application externally:
-
-[cols="2m,1m,5a"]
-|===
-|Property | Type | Description
-
-| route.enabled
-| bool
-| Can be used to enable or disable a trait. All traits share this common property (default `false`).
-
-| route.annotations
-| map[string]string
-| The annotations added to the route. This can be used to set https://docs.openshift.com/container-platform/4.16/networking/routes/route-configuration.html#nw-route-specific-annotations_route-configuration[openshift route specific annotations] options.
-
-| route.host
-| string
-| To configure the host exposed by the route.
+=== Properties from ConfigMaps and Secrets
 
-| route.tls-termination
-| string
-| The TLS termination type, like `edge`, `passthrough` or `reencrypt`. Refer to the OpenShift route documentation for additional information.
-
-| route.tls-certificate
-| string
-| The TLS certificate contents or file (`file:absolute.path`). Refer to the OpenShift route documentation for additional information.
-
-| route.tls-key
-| string
-| The TLS certificate key contents or file (`file:absolute.path`). Refer to the OpenShift route documentation for additional information.
-
-| route.tls-ca-certificate
-| string
-| The TLS CA certificate contents or file (`file:absolute.path`). Refer to the OpenShift route documentation for additional information.
-
-| route.tls-destination-ca-certificate
-| string
-| The destination CA contents or file (`file:absolute.path`). The destination CA certificate provides the contents of the CA certificate of the final destination. When using reencrypt termination, this file should be provided to have routers use it for health checks on the secure connection. If this field is not specified, the router may provide its own destination CA and perform hostname validation using the short service name (service.namespace.svc), which allows infrastructure generat [...]
-
-
-| route.tls-insecure-edge-termination-policy
-| string
-| To configure how to deal with insecure traffic, e.g. `Allow`, `Disable` or `Redirect` traffic. Refer to the OpenShift route documentation for additional information.
-
-|===
-
-Example:
+Keep cluster-specific configuration and credentials in the cluster.
+`--config` mounts a ConfigMap or Secret as properties files that Camel reads for its property placeholders:
 
 [source,bash]
 ----
-camel kubernetes export Sample.java --cluster-type=openshift --trait route.enabled=true --trait route.host=example.com --trait route.tls-termination=edge
+camel kubernetes run * --config configmap:my-app-config
+camel kubernetes run * --config configmap:my-app-config/app.properties
+camel kubernetes run * --config secret:my-credentials
 ----
 
-=== Jolokia trait
-
-Enable JMX access via Jolokia (requires Jolokia configured in the application):
-
-[cols="2m,1m,5a"]
-|===
-|Property | Type | Description
-
-| jolokia.enabled
-| bool
-| Can be used to enable or disable a trait. All traits share this common property. (default `false`).
-
-| jolokia.container-port
-| int
-| To configure a different jolokia port exposed by the container (default `8778`).
-
-| jolokia.container-port-name
-| string
-| To configure a different port name for the port exposed by the container (default `jolokia`).
-
-| jolokia.expose
-| bool
-| Can be used to enable/disable exposure of jolokia via kubernetes Service. (default `false`).
-
-| jolokia.service-port
-| int
-| To configure a different jolokia port exposed by the service (default `8778`). It is applied only when the expose parameter is true.
+Each key becomes a file, mounted under `/etc/camel/conf.d/_configmaps/<name>/<key>`
+(or `/etc/camel/conf.d/_secrets/<name>/<key>`).
 
-| jolokia.service-port-name
-| string
-| To configure a different port name for the port exposed by the service (default `jolokia`). It is applied only when the expose parameter is true.
+=== Other files
 
-
-|===
-
-Example:
+`--resource` mounts any file (text or binary) from a ConfigMap or Secret, without reading it as properties.
+Syntax: `[configmap|secret]:name[/key][@path]`:
 
 [source,bash]
 ----
-camel kubernetes export Sample.java --trait jolokia.enabled=true --trait jolokia.expose=true
+camel kubernetes run * --resource configmap:my-data
+camel kubernetes run * --resource configmap:my-data/config.xml@/etc/my-config.xml
 ----
 
+The default location is `/etc/camel/resources.d/_configmaps/<name>/<key>` (or `_secrets`); `@path` overrides it.
 
-=== OpenAPI trait
-
-Mount OpenAPI specs from ConfigMaps:
+=== Environment variables and volumes
 
 [source,bash]
 ----
-camel kubernetes export Sample.java --open-api configmap:my-spec
+camel kubernetes run * --env MY_ENV=foo --env OTHER_ENV=bar
+camel kubernetes run * --volume my-pvc:/container/path
 ----
 
-== Deploy to OpenShift
-
-Use `--cluster-type=openshift` to generate OpenShift-specific resources (Route, ImageStream, BuildConfig):
-
-[source,bash]
-----
-camel kubernetes export Sample.java --cluster-type=openshift
-----
+== Health probes
 
-The default image builder switches to S2I for OpenShift. Override with `--image-builder=jib` to push to an external registry instead.
+The application includes `camel-observability-services`, and the Deployment gets liveness and readiness probes for it:
 
-TIP: With S2I, set `--image-group` to your OpenShift project/namespace name, since S2I uses it as part of the image coordinates: `image-registry.openshift-image-registry.svc:5000/<project>/<name>:<tag>`
+- Spring Boot: `/observe/health/liveness`, `/observe/health/readiness`
+- Quarkus: `/observe/health/live`, `/observe/health/ready`, `/observe/health/started`
 
-== Kubernetes run
+== Exposing HTTP endpoints
 
-The `run` command exports, builds, pushes, and deploys in one step:
+When your routes consume HTTP (such as `platform-http` or the REST DSL), a Service is generated for the container port (`8080`)
+on service port `80`. To reach the application from outside the cluster, change the Service type or add an Ingress:
 
 [source,bash]
 ----
-camel kubernetes run route.yaml --image-registry=kind
+camel kubernetes run * --trait service.type=LoadBalancer
+camel kubernetes run * --trait ingress.enabled=true --trait ingress.host=my-app.example.com
 ----
 
-The command auto-detects local clusters (`kind`, `minikube`, OpenShift) and configures the registry accordingly. Disable with `--disable-auto`.
+On OpenShift, use a Route instead (see <<_deploy_to_openshift>>).
+All Service, Ingress and Route settings are listed in
+xref:camel-jbang-kubernetes-advanced.adoc[Kubernetes Plugin Advanced Options].
+
+== CPU and memory
 
-Customize the image:
+Set the resource requests and limits of the container:
 
 [source,bash]
 ----
-camel kubernetes run route.yaml --image-registry=kind --image-group camel-experts
-camel kubernetes run route.yaml --image quay.io/camel-experts/demo-app:1.0
+camel kubernetes run * --trait container.request-memory=256Mi --trait container.limit-memory=512Mi --trait container.request-cpu=0.5
 ----
 
-The `run` command supports the same trait options as `export` for customizing the Kubernetes manifest.
-
-=== Auto reload with `--dev`
+== Labels and annotations
 
-Watch for source file changes and automatically rebuild/redeploy:
+Resources get the label `app.kubernetes.io/name` with the application name. Add your own:
 
 [source,bash]
 ----
-camel kubernetes run route.yaml --image-registry=kind --dev
+camel kubernetes run * --label env=staging --annotation project.team=camel-experts
 ----
 
-Terminate the process to stop dev mode — the deployment is automatically removed on shutdown.
-
-NOTE: On macOS, the file watch mechanism is slower due to limited native file operations for Java processes.
-
-=== Setting properties and resources at runtime
+== Service account
 
-Set properties inline, from files, or from Kubernetes resources:
+Run the application with a specific service account, for instance one allowed to read Secrets:
 
 [source,bash]
 ----
-camel kubernetes run route.yaml --property my-key=my-val
-camel kubernetes run route.yaml --property file:/some/directory/file.properties
+camel kubernetes run * --service-account=my-app
 ----
 
-==== Properties from ConfigMaps and Secrets
+== Show logs
 
-Use `--config` to mount ConfigMap/Secret data as properties files, automatically configured for Camel property placeholders:
+Stream the logs of a deployed application:
 
 [source,bash]
 ----
-camel kubernetes run route.java --config configmap:game-config
-camel kubernetes run route.java --config configmap:game-config/game.properties
-camel kubernetes run route.java --config secret:my-credentials
+camel kubernetes logs --name=my-app
 ----
 
-Mount paths: `--config configmap:` maps to `/etc/camel/conf.d/_configmaps/<name>/<key>`, `--config secret:` maps to `/etc/camel/conf.d/_secrets/<name>/<key>`. Each ConfigMap key becomes a file.
-
-==== Mounting generic files
+== Delete deployments
 
-Use `--resource` to mount files without property placeholder configuration. Syntax: `[configmap|secret]:name[/key][@path]`:
+Remove the application and all its resources:
 
 [source,bash]
 ----
-camel kubernetes run route.java --resource configmap:my-data
-camel kubernetes run route.java --resource configmap:my-data/config.xml@/etc/my-config.xml
+camel kubernetes delete --name=my-app
 ----
 
-Mount paths: `/etc/camel/resources.d/_configmaps/<name>/<key>` (or `_secrets`). Use `@path` to override the destination.
-
-== Show logs
+== Deploy to OpenShift
 
-Stream log output from a running deployment:
+Use `--cluster-type=openshift` (detected automatically by `run`) to build and deploy with the JKube OpenShift plugin
+and to push the image to the internal registry (`image-registry.openshift-image-registry.svc:5000`):
 
 [source,bash]
 ----
-camel kubernetes logs --name=route
+camel kubernetes export * --runtime=spring-boot --cluster-type=openshift
 ----
 
-== Delete deployments
+Deploy the exported project with `./mvnw package oc:deploy`.
 
-Remove a deployment and all its resources:
+Use `--image-builder=s2i` to build the image in the cluster with Source-to-Image.
 
-[source,bash]
-----
-camel kubernetes delete --name=route
-----
+TIP: With S2I, set `--image-group` to your OpenShift project (namespace), since it is part of the image coordinates:
+`image-registry.openshift-image-registry.svc:5000/<project>/<name>:<tag>`. `run` uses the current namespace when it detects OpenShift.
 
-== Minikube deployment tips
+== Minikube
 
-Quick start for local development with Minikube (Camel 4.10+):
+Quick start for local development with Minikube:
 
 [source,bash]
 ----
 minikube start --addons registry --driver=docker
 eval $(minikube -p minikube docker-env)
-camel kubernetes run demo.camel.yaml
+camel kubernetes run * --runtime=spring-boot
 ----
 
-== Deployment tips and troubleshooting
+On Minikube the image is built with Docker straight into the Minikube Docker daemon, so nothing is pushed.
 
-* If there is any error with `camel kubernetes run`, set `--verbose` to display additional logging.
+== Troubleshooting
 
-* You may want to examine the generated maven project in `.camel-jbang-run/<name>`.
+* Add `--verbose` to `camel kubernetes run` to see the Maven build and deployment output.
+* `run` exports the project to `.camel-jbang-run/<name>`; look at the generated `pom.xml` and `src/main/jkube` there.
+* If building the image or deploying fails on a local cluster, try `--disable-auto` to switch off the cluster detection.
+* Building for several platforms (`--image-platform`) needs Docker set up for
+  https://docs.docker.com/build/building/multi-platform/#build-multi-platform-images[multi-platform builds].
 
-* If there are issues building the container image or deploying the kubernetes manifests, consider disabling the kubernetes cluster detection with `--disable-auto`.
+== Advanced options
 
-* Note that Docker multi-platform build is used. It requires to have followed these https://docs.docker.com/build/building/multi-platform/#build-multi-platform-images[Docker requirements].
+xref:camel-jbang-kubernetes-advanced.adoc[Kubernetes Plugin Advanced Options] covers the trait options inherited from Camel K:
+the full container, Service, Ingress and OpenShift Route settings, running as a CronJob, Knative serving and eventing,
+the Jolokia port, mounts, and OpenAPI specs from ConfigMaps.
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-managing.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-managing.adoc
index 67c0068b8780..3ebac3883204 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-managing.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-managing.adoc
@@ -7,6 +7,9 @@ Just type `camel tui` — the plugin auto-installs on first use.
 It shows routes, messages, health, traces, and more in a single terminal view.
 See xref:camel-jbang-tui.adoc[Camel TUI] for details.
 
+For looking deeper into a misbehaving integration -- captured errors, blocked messages, memory leaks, heap and thread dumps,
+startup timing, SQL and Kafka -- see xref:camel-jbang-diagnostics.adoc[Diagnostics].
+
 == Controlling local Camel integrations
 
 List running integrations with `ps`:
@@ -443,8 +446,6 @@ TIP: Omit the integration name to change levels for all running integrations.
 
 === Per-category logging
 
-*Available since Camel 4.6*
-
 Set category-specific levels from the CLI (repeatable):
 
 [source,bash]
@@ -691,24 +692,8 @@ camel jolokia 62506 --stop
 
 TIP: Run `camel hawtio --help` for options.
 
-== Thread dump
-
-List threads in a running Camel integration:
-
-[source,bash]
-----
-camel cmd thread-dump myApp
-----
-
-By default only Camel-related threads are shown. Use `--filter=all` for all JVM threads,
-or `--state=BLOCKED` to find blocked threads. Add `--trace` to include stack traces:
-
-[source,bash]
-----
-camel cmd thread-dump myApp --filter=all --state=BLOCKED --trace
-----
-
 == See Also
 
+* xref:camel-jbang-diagnostics.adoc[Diagnostics] — errors, memory leaks, heap and thread dumps, startup, SQL and Kafka
 * xref:camel-jbang-kubernetes.adoc[Camel Kubernetes Plugin] — deploy and manage Camel integrations on Kubernetes
 * xref:camel-jbang-test.adoc[Camel Testing Plugin] — write and run automated tests with Citrus
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-mcp.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-mcp.adoc
index e5ab97a1ae61..e93680c9af0b 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-mcp.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-mcp.adoc
@@ -813,7 +813,7 @@ process is running).
 | OpenTelemetry spans with trace IDs, durations, route IDs and status (requires `--observe`).
 
 | `camel_runtime_startup_steps`
-| Startup recorder steps with duration, level and type (requires `camel.main.startup-recorder=true`).
+| Startup recorder steps with duration, level and type (requires `camel.main.startup-recorder=backlog`).
 
 | `camel_runtime_route_analysis`
 | Anti-pattern and structure analysis per route: error handling, complexity, component usage.
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-projects.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-projects.adoc
index b924553da6c9..753c1121f5e6 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-projects.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-projects.adoc
@@ -228,6 +228,24 @@ Plugins extend the CLI with additional commands. List available plugins (ASF and
 camel plugin get --all
 ----
 
+The plugins of the Apache Camel project:
+
+[cols="1m,3",options="header"]
+|===
+| Plugin | Commands
+
+| kubernetes | `camel kubernetes`: deploy to Kubernetes, see xref:camel-jbang-kubernetes.adoc[Kubernetes Plugin]
+| test | `camel test`: Citrus tests, see xref:camel-jbang-test.adoc[Testing Plugin]
+| validate | `camel validate`: check source files, see xref:camel-jbang-validation.adoc[Validation]
+| generate | `camel generate`: REST DSL and DTOs from OpenAPI, JSON schemas (see below)
+| tui | `camel tui`: the xref:camel-jbang-tui.adoc[Camel TUI]
+| mcp | `camel mcp`: the xref:camel-jbang-mcp.adoc[Camel MCP Server]
+| edit | `camel edit`: edit a Camel file in the terminal with suggestions and diagnostics
+| route-parser | `camel route-parser`: parse Java routes and dump their structure
+|===
+
+Plugins bundled with the CLI, such as `tui`, are installed on first use.
+
 Add, list installed, and remove plugins:
 
 [source,bash]
@@ -246,7 +264,23 @@ to see how that is done.
 IMPORTANT: The name of the plugin Maven **artifactId** must start with `camel-jbang-plugin-`. For example if the plugin is named `cheese`, then
 the maven artifact must be named `camel-jbang-plugin-cheese`.
 
-== Generate JSON schema plugin
+== Generate plugin
+
+=== REST DSL from OpenAPI
+
+Generate the REST DSL (YAML or XML) from an OpenAPI specification, for contract-first REST development:
+
+[source,bash]
+----
+camel generate rest --input=petstore.yaml --output=petstore-rest.yaml
+camel generate rest --input=petstore.yaml --output=petstore-rest.yaml --routes
+camel generate rest --input=petstore.yaml --dto --runtime=quarkus --package=com.acme.model
+----
+
+`--routes` also generates a route for each operation (YAML only), and `--dto` generates Java data objects
+for the schemas of the specification.
+
+=== JSON schema
 
 Generate JSON Schema definitions from Java objects for use with visual development tools (Kaoto, Karavan):
 
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-running.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-running.adoc
index 2f5337b3e4ba..22d7504d4295 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-running.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-running.adoc
@@ -17,6 +17,15 @@ camel run foo.yaml --dev
 
 This works for all DSLs (YAML, Java, XML).
 
+`camel dev` is a shortcut for `camel run --dev`, and without files it runs the current folder
+(as `--source-dir=.`):
+
+[source,bash]
+----
+camel dev
+camel dev foo.yaml
+----
+
 NOTE: Live reload is for development purposes. If you encounter JVM class loading issues,
 restart the integration. Java files are not live-reloadable in Spring Boot runtime.
 
@@ -235,6 +244,28 @@ NOTE: A custom Camel distribution can provide a baseline for this via the
 `camel.extra.repos` is not set, so setting `camel.extra.repos` replaces that baseline rather than
 adding to it. Apache Camel itself sets neither property.
 
+== Maven configuration
+
+By default, Camel CLI loads `~/.m2/settings.xml` for Maven mirrors, credentials, and repositories.
+
+You can override the settings file location:
+
+[source,bash]
+----
+camel run foo.java --maven-settings=/path/to/settings.xml --maven-settings-security=/path/to/settings-security.xml
+----
+
+Or disable Maven settings entirely:
+
+[source,bash]
+----
+camel run foo.java --maven-settings=false
+----
+
+For encrypted passwords in Maven settings, configure a master password with `mvn -emp`,
+store it in `~/.m2/settings-security.xml`, then encrypt repository passwords with `mvn -ep`.
+See the https://maven.apache.org/guides/mini/guide-encryption.html[Maven encryption guide] for details.
+
 == Downloading JARs over the internet
 
 Camel CLI automatically resolves and downloads dependencies in this order:
@@ -298,11 +329,8 @@ bean whose class Camel CLI would download is not reported as missing, and the MC
 `camel_dependency_for_class` answers the coordinates and the declaration for a class from the same
 mapping, with an optional Maven Central search for the rest.
 
-To add a library to the mapping, add one line to `known-third-party-libraries.properties`
-in `camel-kamelet-main`: the library's own package, its `groupId:artifactId`, and a version
-property of `camel-parent`. The build resolves the version and fails on a property that does
-not exist; with `-Dcamel.known-dependencies.verify=true` it also resolves every JAR and checks
-that the package is in it.
+A library that is missing from the mapping can be added in `known-third-party-libraries.properties` of
+`camel-kamelet-main` in the Camel source; the file explains the format.
 
 == Runtimes
 
@@ -357,7 +385,31 @@ camel run foo.camel.yaml --runtime=quarkus --quarkus-version=3.9.4
 
 When running an existing Maven project (`camel run pom.xml`) the runtime is detected from the
 `pom.xml`, as such a project cannot run in-process. The application logs to a file in `~/.camel`
-so `camel log` and the TUI can read the logs; see xref:camel-jbang-tips.adoc#_running_a_maven_based_project[Running a Maven based project].
+so `camel log` and the TUI can read the logs; see <<_running_a_maven_based_project>>.
+
+== Running a Maven based project
+
+Camel CLI can run an existing Maven-based project:
+
+[source,bash]
+----
+camel run pom.xml
+----
+
+The runtime is detected from the `pom.xml` (Spring Boot, Quarkus, or Camel Main), and the project is
+built and run with Maven (`spring-boot:run`, `quarkus:dev` with `--dev` or `quarkus:run`, and `camel:run`).
+The project itself is not modified: the `camel-cli-connector` dependency is injected into a temporary
+`camel-jbang-run-pom.xml`, so the application shows up in `camel ps`, and the application logs to a file
+in `~/.camel` so `camel log`, the TUI and the MCP server can read the logs the same as for any other
+`camel run`: `<pid>.log` for Spring Boot, and `<name>.log` for Quarkus and Camel Main, whose logging is
+configured before the process id is known (`<name>` is `camel.main.name` from the project's
+`application.properties`, or else the Maven artifactId, and is passed to the application as its name).
+The temporary files are removed when the application stops.
+
+The options `--profile`, `--port`, `--prop`, `--max-seconds`, `--max-messages`, `--max-idle-seconds`,
+`--jvm-args` and `--jfr` are passed to the application (Camel Main runs inside the Maven JVM, so
+`--jvm-args` and `--jfr` are set via `MAVEN_OPTS`). A Camel Main project is expected to use log4j2
+for logging (the same as `camel export --runtime=main` generates).
 
 == Running local Kamelets
 
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-test.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-test.adoc
index e0a474f48f2c..273364e4e1d5 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-test.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-test.adoc
@@ -1,4 +1,4 @@
-= Camel Testing plugin
+= Camel CLI - Testing Plugin
 
 Write and run automated tests for Camel integrations using the https://citrusframework.org/[Citrus] test framework.
 
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-tips.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-tips.adoc
index 970e6ddd8446..a952e564a16a 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-tips.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-tips.adoc
@@ -185,49 +185,3 @@ curl -X DELETE http://0.0.0.0:8080/q/upload/bar.java
 curl -X DELETE http://0.0.0.0:8080/q/upload/*.java
 curl -X DELETE http://0.0.0.0:8080/q/upload/*
 ----
-
-== Maven configuration
-
-By default, Camel CLI loads `~/.m2/settings.xml` for Maven mirrors, credentials, and repositories.
-
-You can override the settings file location:
-
-[source,bash]
-----
-camel run foo.java --maven-settings=/path/to/settings.xml --maven-settings-security=/path/to/settings-security.xml
-----
-
-Or disable Maven settings entirely:
-
-[source,bash]
-----
-camel run foo.java --maven-settings=false
-----
-
-For encrypted passwords in Maven settings, configure a master password with `mvn -emp`,
-store it in `~/.m2/settings-security.xml`, then encrypt repository passwords with `mvn -ep`.
-See the https://maven.apache.org/guides/mini/guide-encryption.html[Maven encryption guide] for details.
-
-== Running a Maven based project
-
-Camel CLI can run an existing Maven-based project:
-
-[source,bash]
-----
-camel run pom.xml
-----
-
-The runtime is detected from the `pom.xml` (Spring Boot, Quarkus, or Camel Main), and the project is
-built and run with Maven (`spring-boot:run`, `quarkus:dev` with `--dev` or `quarkus:run`, and `camel:run`).
-The project itself is not modified: the `camel-cli-connector` dependency is injected into a temporary
-`camel-jbang-run-pom.xml`, so the application shows up in `camel ps`, and the application logs to a file
-in `~/.camel` so `camel log`, the TUI and the MCP server can read the logs the same as for any other
-`camel run`: `<pid>.log` for Spring Boot, and `<name>.log` for Quarkus and Camel Main, whose logging is
-configured before the process id is known (`<name>` is `camel.main.name` from the project's
-`application.properties`, or else the Maven artifactId, and is passed to the application as its name).
-The temporary files are removed when the application stops.
-
-The options `--profile`, `--port`, `--prop`, `--max-seconds`, `--max-messages`, `--max-idle-seconds`,
-`--jvm-args` and `--jfr` are passed to the application (Camel Main runs inside the Maven JVM, so
-`--jvm-args` and `--jfr` are set via `MAVEN_OPTS`). A Camel Main project is expected to use log4j2
-for logging (the same as `camel export --runtime=main` generates).
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-transforming.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-transforming.adoc
index 3e58e7de2e77..e9b56be58d8c 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-transforming.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-transforming.adoc
@@ -404,6 +404,24 @@ $ camel transform message --body=file:daltons.csv --dataformat=csv --option=capt
 
 NOTE: Some data formats require complex options that cannot be set from the command line.
 
+== Converting DataWeave to DataSonnet
+
+Migrating from MuleSoft? `camel transform dataweave` converts DataWeave (`.dwl`) scripts to
+xref:components:languages:datasonnet-language.adoc[DataSonnet], so you can review and keep the result:
+
+[source,bash]
+----
+camel transform dataweave --input=script.dwl --output=script.ds
+camel transform dataweave --input=src/dataweave --output=src/datasonnet
+camel transform dataweave --expression='payload.name'
+----
+
+A directory converts every `.dwl` file in it. Without `--output` the result is printed. Notes about the
+conversion are added as comments (turn them off with `--include-comments=false`).
+
+TIP: Camel can also run `.dwl` scripts as they are, converting them when they are loaded,
+see xref:components:languages:datasonnet-language.adoc#_dataweave_support[DataWeave Support].
+
 == Evaluating expressions
 
 Quickly evaluate a Camel expression without writing a route:
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-tui-ai.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-tui-ai.adoc
index 33eb1244b06e..66c647cce0ff 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-tui-ai.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-tui-ai.adoc
@@ -16,15 +16,9 @@ See xref:camel-jbang-tui.adoc[Camel TUI] for getting started and the other pages
 
 == Choosing an AI provider
 
-Press *F8* to open the built-in AI prompt panel. The panel auto-detects a provider in this order:
-
-1. `ANTHROPIC_API_KEY` → Anthropic Claude
-2. `CLOUD_ML_REGION` + `ANTHROPIC_VERTEX_PROJECT_ID` → Vertex AI
-3. `AZURE_OPENAI_API_KEY` + `AZURE_OPENAI_ENDPOINT` → Azure OpenAI
-4. `GEMINI_API_KEY` → Google Gemini
-5. `OPENAI_API_KEY` → OpenAI
-6. `LLM_API_KEY` + optional `LLM_BASE_URL` → any OpenAI-compatible server
-7. Ollama at `localhost:11434` → local Ollama (auto-detected, no key needed)
+Press *F8* to open the built-in AI prompt panel. The panel detects the provider from the environment
+(`ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY`, a local Ollama, and others) the same way as
+`camel ask`; the order is listed in xref:camel-jbang-ai-providers.adoc#_choosing_a_provider[AI Providers and Local Models].
 
 Press *Ctrl+P* inside the AI panel to switch provider or model at any time.
 
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-tui-local-models.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-tui-local-models.adoc
index aacdf2def9bf..34e91c9360d8 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-tui-local-models.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-tui-local-models.adoc
@@ -16,63 +16,24 @@ See xref:camel-jbang-tui.adoc[Camel TUI] for getting started and the other pages
 
 == Using Ollama (local, no API key)
 
-Install Ollama natively for best performance — the native binary uses GPU acceleration
-(Metal on macOS, CUDA/ROCm on Linux):
+Ollama at `localhost:11434` is auto-detected, so pulling a model is all it takes:
 
 [source,bash]
 ----
-# macOS
-brew install ollama
-
-# Linux
-curl -fsSL https://ollama.com/install.sh | sh
-
-# Pull a model — then open the TUI and press F8
 ollama pull qwen3.6:35b-a3b
 camel tui
 ----
 
-Ollama at `localhost:11434` is auto-detected. No configuration needed.
-
-IMPORTANT: The F8 AI panel works by invoking built-in tools to inspect your running Camel process.
-Models smaller than ~14B do not reliably call tools and answer from training knowledge instead.
-Use at least a 14B model. Prefer a mixture-of-experts model such as `qwen3.6:35b-a3b`: with only
-3B parameters active per token it processes the tool-heavy prompt many times faster than a dense
-27B/32B model, so answers start in seconds instead of a minute.
-
-*Models that work well* (tool-calling capable, ≥14B, default Q4_K_M quantization):
-
-[options="header"]
-|===
-| Model | RAM | Notes
-| `qwen3.6:35b-a3b` | ~23 GB | Recommended: fastest prompt processing, needs 32 GB+
-| `qwen2.5:14b` | ~9 GB | Minimum for 16 GB machines
-| `qwen3.6:27b` | ~18 GB | Strong dense model, several times slower prompt processing
-| `qwen2.5:32b` | ~20 GB | Good quality, slow prompt processing
-| `hermes3:70b` | ~43 GB | Excellent tool calling, needs 64 GB+
-| `llama3.3:70b` | ~43 GB | Best open model, needs 64 GB+
-|===
-
-NOTE: `camel infra run ollama` runs Ollama in Docker and bypasses GPU acceleration,
-making inference significantly slower. Native install is preferred for development.
-
-NOTE: On Apple Silicon, use the default (GGUF) tags rather than the `-mlx` tags. The Ollama MLX
-engine cannot yet reuse the cached prompt for Qwen 3.x models, so every question re-processes the
-whole prompt, while the default engine reuses it and only processes what is new.
+Then press *F8*. How to install Ollama, which models work well (at least 14B, with tool calling; a
+mixture-of-experts model such as `qwen3.6:35b-a3b` is the fastest) and how the context window is chosen
+are described in xref:camel-jbang-ai-providers.adoc#_ollama[AI Providers and Local Models], shared with
+`camel ask` and the other AI commands.
 
 == Using an OpenAI-compatible local server
 
 Set `LLM_API_KEY` and `LLM_BASE_URL` to connect to any OpenAI-compatible server
-(LM Studio, vLLM, llama.cpp, GPT4All, …):
-
-[source,bash]
-----
-export LLM_API_KEY=any-value
-export LLM_BASE_URL=http://localhost:1234
-camel tui
-----
-
-`OPENAI_BASE_URL` is also accepted as an alternative to `LLM_BASE_URL`.
+(LM Studio, vLLM, llama.cpp, GPT4All, ...), see
+xref:camel-jbang-ai-providers.adoc#_openai_compatible_local_servers[OpenAI-compatible local servers].
 
 The panel uses the first model the server lists on `/v1/models`. To use another one, run
 `/model <name>` in the panel (`/model` alone lists what the server offers), set *AI Model* in
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-tui-settings.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-tui-settings.adoc
index ba167fc08492..d786640d8fc8 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-tui-settings.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-tui-settings.adoc
@@ -67,7 +67,7 @@ The Doctor checks your development environment and reports issues:
 
 == Embedded Shell (F6)
 
-Press *F6* to open an embedded Camel JBang shell at the bottom (or top) of the screen. Any `camel`
+Press *F6* to open an embedded Camel CLI shell at the bottom (or top) of the screen. Any `camel`
 command can be run there -- `camel run`, `camel infra run kafka`, `camel cmd send`, `camel get` and
 so on -- without leaving the dashboard, and the tabs keep updating while the command runs. Press
 *F6* again to close the panel, *Shift+F6* to cycle its height, *PgUp*/*PgDn* to scroll the output
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-tui.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-tui.adoc
index 78f90dddee3e..9b35cdf352cc 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-tui.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-tui.adoc
@@ -71,7 +71,7 @@ The *More* menu (key *0*) opens a popup with tabs organized into groups:
 * *Routing* -- Browse Endpoints, Consumers, HTTP, Inflight, Producers, Route Controller
 * *Observability* -- Circuit Breaker, Health, JFR, Metrics, Network Services, Exchange Events, Recovery Tasks, OpenTelemetry Spans
 * *AI* -- Ollama (listed when an Ollama server is detected)
-* *Data* -- JDBC DataSource, Kafka, SQL Query, SQL Trace
+* *Data* -- JDBC DataSource, Kafka, Secrets, SQL Query, SQL Trace
 * *JVM* -- Classpath, Heap Memory Histogram, Memory Usage, Memory Leak, Process, Startup, Threads
 * *Project* -- Beans, Catalog, Configuration, CVE Audit, Maven Dependencies, Type Converters, Data Type Transformers
 
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-validation.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-validation.adoc
new file mode 100644
index 000000000000..b861f804b5d3
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-validation.adoc
@@ -0,0 +1,141 @@
+= Camel CLI - Validation
+
+The `camel validate` commands check Camel source files for mistakes without running them:
+the YAML DSL schema, endpoint URIs, Simple expressions, bean references and `camel.*` configuration keys,
+against the Camel catalog. They are provided by the `validate` plugin:
+
+[source,bash]
+----
+camel plugin add validate
+----
+
+[cols="1m,3",options="header"]
+|===
+| Command | What it checks
+
+| camel validate yaml
+| YAML routes: the YAML DSL schema, and the endpoint URIs, Simple expressions and bean references against the catalog.
+
+| camel validate source
+| Any file `camel run` would load: YAML, Java and XML routes, `.properties` files, XSLT and XML.
+
+| camel validate properties
+| The `camel.*` keys of `.properties` files.
+
+| camel validate normalize
+| Not a check: rewrites YAML routes in the canonical (explicit) form.
+|===
+
+== Validating YAML routes
+
+[source,bash]
+----
+$ camel validate yaml cheese.yaml bad.yaml
+Validation error detected (errors:1)
+
+	File: bad.yaml
+		/0/from: required property 'steps' not found
+----
+
+When all files pass:
+
+[source,bash]
+----
+$ camel validate yaml cheese.yaml
+Validation success (files:1)
+----
+
+After the YAML DSL schema, the endpoint URIs, Simple expressions and bean references are checked against the
+Camel catalog; use `--catalog=false` to check the schema only. `--canonical` validates against the canonical
+schema and reports the deprecated compact notation (see <<_normalizing_yaml_routes>>).
+
+== Validating any source file
+
+`camel validate source` validates any file `camel run` would load: YAML routes, `.properties` files
+(the `camel.*` keys), Java (compiles it), XSLT and XML:
+
+[source,bash]
+----
+camel validate source orders.yaml OrderRoute.java application.properties
+----
+
+=== Java and XML routes
+
+The routes of a Java or XML DSL file are also read into the Camel model, without compiling or running them,
+and checked as YAML routes are:
+
+* the endpoint URIs, with the endpoint DSL and constants resolved;
+* Simple expressions;
+* a `to` whose URI holds `+${...}+` and should be a `toD`.
+
+These are what the Java compiler cannot see inside the strings.
+A part of a Java route the parser cannot work out (a value computed at runtime) is left unchecked.
+
+=== Endpoints no route consumes
+
+As the routes of an application are spread over the files of its directory, `camel validate source` also reports
+a `direct:` or `seda:` endpoint that a route sends to, but that no YAML, Java or XML route in the directory
+(and its subdirectories) consumes. With `direct:` sending a message to it fails; with `seda:` the messages
+would be queued and never read.
+
+The check stays quiet when it cannot be certain: an endpoint only known at runtime (a property placeholder,
+an expression), route templates and Kamelets, and a directory that is only a part of a Maven or Gradle project,
+such as `src/main/resources/camel`.
+
+== Validating configuration properties
+
+`camel validate properties` checks every `camel.*` key of `application.properties` (or any `.properties` file)
+against the Camel catalog. A wrong key, such as `camel.main.log-level` or `camel.main.streamCaching`,
+is reported before the application fails to start:
+
+[source,bash]
+----
+camel validate properties application.properties application-prod.properties
+----
+
+`camel validate source` runs the same check on the `.properties` files it is given.
+
+== Normalizing YAML routes
+
+The YAML DSL accepts compact shorthands, such as `from:` at the top level or an expression without its
+`expression:` wrapper. `camel validate normalize` rewrites YAML routes in the canonical, explicit form,
+which is what the documentation and the canonical schema use:
+
+[source,bash]
+----
+camel validate normalize orders.yaml
+camel validate normalize orders.yaml --output=orders-canonical.yaml
+----
+
+Without `--output` the result is printed. The routes are loaded (not run) to write them, so property
+placeholders are kept as they are. Use `camel validate yaml --canonical` to report the shorthands instead
+of rewriting them.
+
+== Validating against another Camel version or runtime
+
+Both commands validate against the CLI's own Camel version. A project that runs another version, or Camel
+Spring Boot or Camel Quarkus, is validated against the catalog and the YAML DSL schema of that version with
+`--camel-version` and `--runtime`, the same options `camel catalog` and `camel doc` take:
+
+[source,bash]
+----
+$ camel validate yaml --camel-version=4.18.0 orders.yaml
+$ camel validate source --runtime=quarkus --quarkus-version=3.30.1 orders.yaml application.properties
+Validation error detected (errors:1)
+
+	File: orders.yaml
+		line 4: atmosphere-websocket: Camel Quarkus has no extension for this component (no camel-quarkus-atmosphere-websocket); pick a component that has one, camel_catalog_find lists them
+----
+
+The catalog of that version is downloaded as for `camel catalog`, and the schema is read from the
+`camel-yaml-dsl` jar of that version (`--repos` and `--download=false` apply to both). With `--runtime=quarkus`
+the Quarkus platform is resolved from the Camel version through the Quarkus extension registry (cached for a
+day under `~/.camel`), or given with `--quarkus-version`; a component of the route that has no Camel Quarkus
+extension, or no Camel Spring Boot starter with `--runtime=spring-boot`, is an error. `--canonical` needs Camel
+4.22 or later, the first version with the canonical schema.
+
+The Simple expressions are parsed by the CLI's own Simple language (the catalog of the other version supplies
+its functions), and the Java, XSLT and XML checks of `camel validate source` use the CLI's classpath.
+
+The `camel_validate_source` tool of the MCP servers (xref:camel-jbang-mcp.adoc[]) does the same when it is
+given a `camelVersion`: the catalog and the schema of that version.
diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
index feed9929483d..60e5ef883036 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
@@ -42,7 +42,15 @@ Your prototype code becomes your production code.
 
 == Quick Start
 
-Install the CLI (requires https://www.jbang.dev/download/[JBang]):
+Install the CLI with the installer script (Linux and macOS; see
+xref:camel-jbang-launcher-install.adoc[Installing the Camel CLI Launcher] for Windows):
+
+[source,bash]
+----
+curl -fsSL https://camel.apache.org/install.sh | sh
+----
+
+Or, if you use https://www.jbang.dev/download/[JBang]:
 
 [source,bash]
 ----
@@ -64,8 +72,6 @@ Run in dev mode with live reload:
 camel run hello.yaml --dev
 ----
 
-TIP: You can also install without JBang using the xref:camel-jbang-launcher.adoc[Camel CLI Launcher].
-
 == What Can You Do
 
 [cols="1,3",options="header"]
@@ -73,14 +79,14 @@ TIP: You can also install without JBang using the xref:camel-jbang-launcher.adoc
 | Area | What it covers
 
 | xref:camel-jbang-getting-started.adoc[Getting Started]
-| Installation, shell completion, creating and running your first route.
+| Installation, shell completion, creating and running your first route, built-in examples.
 
 | xref:camel-jbang-installation.adoc[Installation Options]
-| Version-pinned installs, offline-safe setups, container images, installing without JBang.
+| Version-pinned installs, offline-safe setups, container images, the Camel CLI Launcher.
 
 | xref:camel-jbang-running.adoc[Running Camel]
-| Dev mode with hot reload, profiles, properties, dependency management,
-  Kamelets, platform-http, Spring Boot and Quarkus runtimes.
+| Dev mode with hot reload, profiles, properties, dependency management, Maven repositories and settings,
+  Kamelets, platform-http, Spring Boot and Quarkus runtimes, running a Maven project.
 
 | xref:camel-jbang-dev-services.adoc[Dev Services]
 | Start and manage local infrastructure services (databases, message brokers, etc.)
@@ -92,10 +98,16 @@ TIP: You can also install without JBang using the xref:camel-jbang-launcher.adoc
 
 | xref:camel-jbang-devtools.adoc[Development Tools]
 | Sending and receiving messages, JDBC configuration,
-  terminal scripting, IDE editing, validate plugin.
+  terminal scripting, IDE editing, updating dependencies.
+
+| xref:camel-jbang-validation.adoc[Validation]
+| Checking routes, properties and other source files before running them, and normalizing YAML routes.
 
 | xref:camel-jbang-ai.adoc[AI Tools]
-| Ask questions about running integrations, explain routes, and get security hardening suggestions — powered by local or cloud LLMs.
+| Ask questions about running integrations, explain routes, a project overview, and security hardening suggestions.
+
+| xref:camel-jbang-ai-providers.adoc[AI Providers and Local Models]
+| How the LLM provider is chosen, and running a model locally with Ollama or an OpenAI-compatible server.
 
 | xref:camel-jbang-debugging.adoc[Debugging]
 | Camel route debugging from the CLI, IDE integration (VSCode, IDEA), Java-level debugging.
@@ -104,13 +116,16 @@ TIP: You can also install without JBang using the xref:camel-jbang-launcher.adoc
 | Listing and stopping processes, route and group control, developer console, message history,
   log tailing, message tracing, health checks, metrics, circuit breaker status, Jolokia and Hawtio.
 
+| xref:camel-jbang-diagnostics.adoc[Diagnostics]
+| Errors and inflight messages, memory leaks, heap and thread dumps, startup, SQL and Kafka, vault secrets.
+
 | xref:camel-jbang-projects.adoc[Export to Maven]
 | Exporting to Spring Boot / Quarkus / Camel Main,
   SBOM generation, plugin management, version management, automated upgrades.
 
 | xref:camel-jbang-tips.adoc[Tips and Recipes]
 | Run from GitHub or clipboard, stub components, inline code, interactive prompts,
-  upload via HTTP, Maven configuration.
+  upload via HTTP.
 
 | xref:camel-jbang-beans.adoc[Java Beans]
 | Writing and wiring Java beans into routes using Camel, Spring Boot, or Quarkus annotations.
@@ -132,7 +147,7 @@ TIP: You can also install without JBang using the xref:camel-jbang-launcher.adoc
 | Self-contained executable JAR -- run the CLI without JBang.
 
 | xref:camel-jbang-kubernetes.adoc[Kubernetes Plugin]
-| Build and deploy Camel integrations to Kubernetes.
+| Build and deploy Camel integrations to Kubernetes and OpenShift.
 
 | xref:camel-jbang-test.adoc[Testing Plugin]
 | Automated testing with the Citrus test framework.
@@ -146,9 +161,10 @@ TIP: You can also install without JBang using the xref:camel-jbang-launcher.adoc
 
 == How It Works
 
-Camel CLI is powered by https://www.jbang.dev/[JBang] under the hood.
-When you run `camel run`, JBang resolves and caches the required Camel JARs, then launches a JVM
-with your route.
+The Camel CLI is a Java application. It is installed either as the self-contained
+xref:camel-jbang-launcher.adoc[Camel CLI Launcher] or through https://www.jbang.dev/[JBang].
+When you run `camel run`, the CLI resolves and caches the Camel JARs your routes need from Maven,
+and runs the routes in a JVM.
 The CLI communicates with running integrations through a local connector, enabling management
 commands (`camel ps`, `camel get`, `camel log`, `camel trace`) to inspect and control them
 from a separate terminal.
diff --git a/docs/user-manual/modules/ROOT/pages/camel-yaml-dsl-validator-maven-plugin.adoc b/docs/user-manual/modules/ROOT/pages/camel-yaml-dsl-validator-maven-plugin.adoc
index 7ef2b1d3a00f..25c6f567d4fd 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-yaml-dsl-validator-maven-plugin.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-yaml-dsl-validator-maven-plugin.adoc
@@ -161,7 +161,7 @@ This goal is used by the Camel build itself, in `camel-jbang-core`, and is not i
 It reads the `[source,yaml]` route examples of the EIP documentation and of the user manual, validates every one of
 them against the YAML DSL JSON Schema, and fails the build when an example does not validate. The examples that pass
 are written to `eip-samples.json`, keyed by the EIP or file entry they show (`split`, `onException`, `rest`, `beans`,
-...), which is what the `camel_catalog_sample` tool of the xref:manual::camel-jbang-mcp.adoc[Camel JBang MCP server]
+...), which is what the `camel_catalog_sample` tool of the xref:manual::camel-jbang-mcp.adoc[Camel MCP server]
 (and of the Camel TUI) returns as the fallback when the catalog in use has no documentation for the name.
 
 The pages are configured in the `pom.xml` of `camel-jbang-core`: the user manual pages whose examples are the samples
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-jfr-old-objects.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-jfr-old-objects.adoc
deleted file mode 100644
index c1f8981580bd..000000000000
--- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-jfr-old-objects.adoc
+++ /dev/null
@@ -1,34 +0,0 @@
-
-// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
-= camel cmd jfr-old-objects
-
-Diagnose memory leaks using JFR OldObjectSample events in a running Camel integration
-
-
-== Usage
-
-[source,bash]
-----
-camel cmd jfr-old-objects [options]
-----
-
-
-
-== Options
-
-[cols="2,5,1,2",options="header"]
-|===
-| Option | Description | Default | Type
-| `--duration` | Recording duration in seconds (auto-stops after this time) | 60 | int
-| `--min-size` | Only show samples with total size above this value (e.g. 1024, 10KB, 1MB). Default 1KB in dual mode to filter noise | 0 | String
-| `--mode` | Recording mode: dual (default, two recordings with trend comparison) or single (one recording) | dual | String
-| `--query` | Query cached results from the last recording |  | boolean
-| `--stacktrace` | Show allocation stack trace for each sample |  | boolean
-| `--start` | Start a JFR recording for OldObjectSample events |  | boolean
-| `--status` | Check recording status |  | boolean
-| `--stop` | Stop the active recording and display results |  | boolean
-| `--top` | Show only the top N samples | 50 | int
-| `-h,--help` | Display the help and sub-commands |  | boolean
-|===
-
-
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-commands.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-commands.adoc
index 4a474a36a9a7..cbf10685bbbd 100644
--- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-commands.adoc
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-commands.adoc
@@ -50,3 +50,20 @@ TIP: You can also use `camel --help` or `camel <command> --help` to see availabl
 | xref:jbang-commands/camel-jbang-version.adoc[camel version] | Manage Camel versions
 | xref:jbang-commands/camel-jbang-wrapper.adoc[camel wrapper] | Install Camel wrapper scripts for version pinning
 |===
+
+== Plugin commands
+
+These commands are provided by plugins. A plugin is installed with `camel plugin add <plugin>`.
+
+[cols="2,1,5",options="header"]
+|===
+| Command | Plugin | Description
+| xref:jbang-commands/camel-jbang-edit.adoc[camel edit] | `edit` | Edit Camel with suggestions and diagnostics
+| xref:jbang-commands/camel-jbang-generate.adoc[camel generate] | `generate` | Generate source code
+| xref:jbang-commands/camel-jbang-kubernetes.adoc[camel kubernetes] | `kubernetes` | Manage Camel applications running on Kubernetes
+| xref:jbang-commands/camel-jbang-mcp.adoc[camel mcp] | `mcp` | MCP server for AI coding assistants
+| xref:jbang-commands/camel-jbang-route-parser.adoc[camel route-parser] | `route-parser` | Parses Java route and dumps route structure
+| xref:jbang-commands/camel-jbang-test.adoc[camel test] | `test` | Manage tests for Camel applications
+| xref:jbang-commands/camel-jbang-tui.adoc[camel tui] | `tui` | Camel TUI
+| xref:jbang-commands/camel-jbang-validate.adoc[camel validate] | `validate` | Validate Camel source code
+|===
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-edit.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-edit.adoc
new file mode 100644
index 000000000000..9ebfdaf950e4
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-edit.adoc
@@ -0,0 +1,27 @@
+
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel edit
+
+Edit Camel with suggestions and diagnostics
+
+NOTE: This command is provided by the `edit` plugin. Install it with `camel plugin add edit`.
+
+
+== Usage
+
+[source,bash]
+----
+camel edit [options]
+----
+
+
+
+== Options
+
+[cols="2,5,1,2",options="header"]
+|===
+| Option | Description | Default | Type
+| `-h,--help` | Display the help and sub-commands |  | boolean
+|===
+
+
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-generate-rest.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-generate-rest.adoc
new file mode 100644
index 000000000000..366b4f121411
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-generate-rest.adoc
@@ -0,0 +1,35 @@
+
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel generate rest
+
+Generate REST DSL source code from OpenApi specification
+
+NOTE: This command is provided by the `generate` plugin. Install it with `camel plugin add generate`.
+
+
+== Usage
+
+[source,bash]
+----
+camel generate rest [options]
+----
+
+
+
+== Options
+
+[cols="2,5,1,2",options="header"]
+|===
+| Option | Description | Default | Type
+| `--dto` | Generate Java Data Objects |  | boolean
+| `--input` | OpenApi specification file name |  | String
+| `--openapi-version` | Openapi specification 3.0 or 3.1 | 3.0 | String
+| `--output` | Output REST DSL file name |  | String
+| `--package` | Package for generated Java models | model | String
+| `--routes` | Generate routes (only in YAML) |  | boolean
+| `--runtime` | Runtime | quarkus | RuntimeType
+| `--type` | REST DSL type (YAML or XML) | yaml | String
+| `-h,--help` | Display the help and sub-commands |  | boolean
+|===
+
+
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-generate-schema.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-generate-schema.adoc
new file mode 100644
index 000000000000..09547728a377
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-generate-schema.adoc
@@ -0,0 +1,33 @@
+
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel generate schema
+
+Create a JSON schema for a given Camel component and Java Object
+
+NOTE: This command is provided by the `generate` plugin. Install it with `camel plugin add generate`.
+
+
+== Usage
+
+[source,bash]
+----
+camel generate schema [options]
+----
+
+
+
+== Options
+
+[cols="2,5,1,2",options="header"]
+|===
+| Option | Description | Default | Type
+| `--camel-version` | Camel version to use |  | String
+| `--download` | Whether to allow automatic downloading JAR dependencies (over the internet) | true | boolean
+| `--fresh` | Make sure we use fresh (i.e. non-cached) resources | false | boolean
+| `--output` | Output file path (default: stdout) |  | String
+| `--repo,--repos` | Additional maven repositories for download on-demand (Use commas to separate multiple repositories) |  | String
+| `--verbose` | Enable verbose logging |  | boolean
+| `-h,--help` | Display the help and sub-commands |  | boolean
+|===
+
+
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-generate.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-generate.adoc
new file mode 100644
index 000000000000..b38803be41e4
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-generate.adoc
@@ -0,0 +1,37 @@
+
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel generate
+
+Generate source code
+
+NOTE: This command is provided by the `generate` plugin. Install it with `camel plugin add generate`.
+
+
+== Usage
+
+[source,bash]
+----
+camel generate [options]
+----
+
+
+== Subcommands
+
+[cols="2,5",options="header"]
+|===
+| Subcommand | Description
+| xref:jbang-commands/camel-jbang-generate-rest.adoc[rest] | Generate REST DSL source code from OpenApi specification
+| xref:jbang-commands/camel-jbang-generate-schema.adoc[schema] | Create a JSON schema for a given Camel component and Java Object
+|===
+
+
+
+== Options
+
+[cols="2,5,1,2",options="header"]
+|===
+| Option | Description | Default | Type
+| `-h,--help` | Display the help and sub-commands |  | boolean
+|===
+
+
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-kubernetes-delete.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-kubernetes-delete.adoc
new file mode 100644
index 000000000000..0e9fcc7f1fc5
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-kubernetes-delete.adoc
@@ -0,0 +1,30 @@
+
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel kubernetes delete
+
+Delete Camel application from Kubernetes. This operation will delete all resources associated to this app, such as: Deployment, Routes, Services, etc. filtering by label app.kubernetes.io/name=<name>.
+
+NOTE: This command is provided by the `kubernetes` plugin. Install it with `camel plugin add kubernetes`.
+
+
+== Usage
+
+[source,bash]
+----
+camel kubernetes delete [options]
+----
+
+
+
+== Options
+
+[cols="2,5,1,2",options="header"]
+|===
+| Option | Description | Default | Type
+| `--kube-config` | Path to the kube config file to initialize Kubernetes client |  | String
+| `--name` | The integration name. Use this when the name should not get derived otherwise. |  | String
+| `--namespace,-n` | Namespace to use for all operations |  | String
+| `-h,--help` | Display the help and sub-commands |  | boolean
+|===
+
+
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-kubernetes-export.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-kubernetes-export.adoc
new file mode 100644
index 000000000000..b00287c3ea49
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-kubernetes-export.adoc
@@ -0,0 +1,97 @@
+
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel kubernetes export
+
+Export as Maven project that contains a Kubernetes deployment manifest
+
+NOTE: This command is provided by the `kubernetes` plugin. Install it with `camel plugin add kubernetes`.
+
+
+== Usage
+
+[source,bash]
+----
+camel kubernetes export [options]
+----
+
+
+
+== Options
+
+[cols="2,5,1,2",options="header"]
+|===
+| Option | Description | Default | Type
+| `--annotation` | Add an annotation to the integration. Use name values pairs like --annotation my.company=hello. |  | String
+| `--base-image` | The base image that is used to build the container image from (default is mirror.gcr.io/library/eclipse-temurin:21-jdk:<java-version>). |  | String
+| `--build-property` | Maven build properties, ex. --build-property=prop1=foo |  | List
+| `--camel-spring-boot-version` | Camel version to use with Spring Boot |  | String
+| `--camel-version` | To export using a different Camel version than the default version. |  | String
+| `--camel-wrapper` | Include Camel Wrapper scripts in exported project for version pinning | false | boolean
+| `--clean-dir` | If exporting to current directory (default) then all existing files are preserved. Enabling this option will force cleaning current directory including all sub dirs (use this with care) | false | boolean
+| `--cluster-type` | The target cluster type . Special configurations may be applied to different cluster types such as Kind or Minikube. |  | String
+| `--config` | Add a runtime configuration from a ConfigMap or a Secret (syntax: [configmap\|secret]:name[/key], where name represents the configmap/secret name and key optionally represents the configmap/secret key to be filtered). |  | String
+| `--connect` | A Service that the integration should bind to, specified as [[apigroup/]version:]kind:[namespace/]name. |  | String
+| `--console` | Developer console on the local HTTP server (port 8080 by default): /q/dev with Camel Main, /actuator/camel with Spring Boot, and /q/camel/dev-console with Quarkus. The exported project only has the console with the dev profile. | false | boolean
+| `--dep,--dependency` | Add additional dependencies |  | List
+| `--dir,--directory` | Directory where the project will be exported | . | String
+| `--docker` | Include Docker files in exported project | true | boolean
+| `--download` | Whether to allow automatic downloading JAR dependencies (over the internet) | true | boolean
+| `--dry-run` | Preview export without writing files | false | boolean
+| `--env` | Set an environment variable in the integration container, for instance --env MY_VAR=my-value. |  | String
+| `--exclude` | Exclude files by name or pattern |  | List
+| `--fresh` | Make sure we use fresh (i.e. non-cached) resources | false | boolean
+| `--gav` | The Maven group:artifact:version |  | String
+| `--groovy-pre-compiled` | Whether to include pre-compiled Groovy classes in the export (only supported with runtime=camel-main) | false | boolean
+| `--hawtio` | Whether to include Hawtio web console (only available for exporting to Spring Boot or Quarkus) | false | boolean
+| `--hawtio-version` | Version of the Hawtio web console | HawtioVersion.HAWTIO_VERSION | String
+| `--ignore-loading-error` | Whether to ignore route loading and compilation errors (use this with care!) | false | boolean
+| `--image` | The image name to be built. |  | String
+| `--image-builder` | The image builder used to build the container image (e.g. docker, jib, s2i). | jib | String
+| `--image-group` | The image registry group used to push images to. |  | String
+| `--image-platform` | List of target platforms. Each platform is defined using os and architecture (e.g. linux/amd64). |  | String
+| `--image-push` | Whether to push the container image to a given image registry. | true | boolean
+| `--image-registry` | The image registry to hold the app container image. |  | String
+| `--java-version,--java` | Java version | 21 | String
+| `--kamelets-version` | Apache Camel Kamelets version (auto-detected from classpath if not set) |  | String
+| `--label` | Add a label to the integration. Use name values pairs like --label my.company=hello. |  | String
+| `--lazy-bean` | Whether to use lazy bean initialization (can help with complex classloading issues | true | boolean
+| `--local-kamelet-dir` | Local directory for loading Kamelets (takes precedence) |  | String
+| `--logging` | Can be used to turn on logging to console (logs by default to file in <user home>/.camel directory) | false | boolean
+| `--logging-level` | Logging level | info | String
+| `--main-classname` | The class name of the Camel Main application class | CamelApplication | String
+| `--management-port` | To use a dedicated port for HTTP management |  | int
+| `--maven-apache-snapshot-enabled` | Whether downloading JARs from ASF Maven Snapshot repository is enabled | true | boolean
+| `--maven-central-enabled` | Whether downloading JARs from Maven Central repository is enabled | true | boolean
+| `--maven-settings` | Optional location of Maven settings.xml file to configure servers, repositories, mirrors and proxies. If set to false, not even the default ~/.m2/settings.xml will be used. |  | String
+| `--maven-settings-security` | Optional location of Maven settings-security.xml file to decrypt settings.xml |  | String
+| `--maven-wrapper` | Include Maven Wrapper files in exported project | true | boolean
+| `--name` | The integration name. Use this when the name should not get derived otherwise. |  | String
+| `--observe` | Enable observability services | false | boolean
+| `--open-api` | Adds an OpenAPI spec from the given file (json or yaml file) |  | String
+| `--package-name` | For Java source files should they have the given package name. By default the package name is computed from the Maven GAV. Use false to turn off and not include package name in the Java source files. |  | String
+| `--package-scan-jars` | Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel CLI | false | boolean
+| `--parent-pom` | The Maven parent POM group:artifact:version |  | String
+| `--port` | Embeds a local HTTP server on this port |  | int
+| `--profile` | Profile to export . |  | String
+| `--prop,--property` | Camel application properties, ex. --property=prop1=foo |  | String
+| `--quarkus-artifact-id` _(deprecated)_ | Deprecated. This value is not used anymore. It is kept only for backwards compatibility and will be removed in Camel 5.x. Camel commands may use either 'quarkus-bom' or 'quarkus-camel-bom' artifactIds depending on the context. | quarkus-bom | String
+| `--quarkus-ext-registry` | The base URI of Quarkus Extension Registry. The default is {@value RuntimeType#QUARKUS_EXTENSION_REGISTRY_BASE_URL} unless camel.jbang.quarkus.platform.url system property is set (the /client/platforms suffix is removed if present). |  | String
+| `--quarkus-group-id` | groupId of Quarkus Platform BOM; honored only if --quarkus-version is set | io.quarkus.platform | String
+| `--quarkus-version` | version of Quarkus Platform BOM; the default value is looked up in Quarkus Extension Registry |  | String
+| `--quiet` | Will be quiet, only print when error occurs | false | boolean
+| `--registry-mirror` | Optional Docker registry mirror where to pull images from when building the container image. |  | String
+| `--repo,--repos` | Additional maven repositories for download on-demand (Use commas to separate multiple repositories) |  | String
+| `--resource` | Add a runtime resource from a Configmap or a Secret (syntax: [configmap\|secret]:name[/key][@path], where name represents the configmap/secret name, key optionally represents the configmap/secret key to be filtered and path represents the destination path). |  | String
+| `--resource-dir,--resource-dirs` | Additional resource directories to include in src/main/resources (recursive, preserving structure) |  | List
+| `--runtime` | Runtime |  | RuntimeType
+| `--service-account` | The service account used to run the application. |  | String
+| `--skip-plugins` | Skip plugins during export | false | boolean
+| `--spring-boot-version` | Spring Boot version | RuntimeType.SPRING_BOOT_VERSION | String
+| `--trait` | Add a trait configuration to the integration. Use name values pairs like --trait trait.name.config=hello. |  | String
+| `--verbose` | Verbose output of startup activity (dependency resolution and downloading | false | boolean
+| `--volume` | Mount a volume into the integration container, for instance --volume pvcname:/container/path. |  | String
+| `--yes,-y` | Automatically answer yes to confirmation prompts (e.g. when using --clean-dir) | false | boolean
+| `-h,--help` | Display the help and sub-commands |  | boolean
+|===
+
+
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-kubernetes-logs.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-kubernetes-logs.adoc
new file mode 100644
index 000000000000..18d300151fd1
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-kubernetes-logs.adoc
@@ -0,0 +1,33 @@
+
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel kubernetes logs
+
+Print the logs of a Kubernetes pod
+
+NOTE: This command is provided by the `kubernetes` plugin. Install it with `camel plugin add kubernetes`.
+
+
+== Usage
+
+[source,bash]
+----
+camel kubernetes logs [options]
+----
+
+
+
+== Options
+
+[cols="2,5,1,2",options="header"]
+|===
+| Option | Description | Default | Type
+| `--container` | Name identifying the pod container to grab the logs from. |  | String
+| `--kube-config` | Path to the kube config file to initialize Kubernetes client |  | String
+| `--label` | Label name and value used as a pod selector. |  | String
+| `--name` | The integration name. Use this when the name should not get derived otherwise. |  | String
+| `--namespace,-n` | Namespace to use for all operations |  | String
+| `--tail` | The number of lines from the end of the logs to show. Defaults to -1 to show all the lines. | -1 | int
+| `-h,--help` | Display the help and sub-commands |  | boolean
+|===
+
+
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-kubernetes-run.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-kubernetes-run.adoc
new file mode 100644
index 000000000000..f9abdf15fbef
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-kubernetes-run.adoc
@@ -0,0 +1,86 @@
+
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel kubernetes run
+
+Run Camel application on Kubernetes
+
+NOTE: This command is provided by the `kubernetes` plugin. Install it with `camel plugin add kubernetes`.
+
+
+== Usage
+
+[source,bash]
+----
+camel kubernetes run [options]
+----
+
+
+
+== Options
+
+[cols="2,5,1,2",options="header"]
+|===
+| Option | Description | Default | Type
+| `--annotation` | Add an annotation to the integration. Use name values pairs like --annotation my.company=hello. |  | String
+| `--base-image` | The base image that is used to build the container image from (default is mirror.gcr.io/library/eclipse-temurin:<java-version>). |  | String
+| `--build-property` | Maven properties, ex. --build-property=prop1=foo |  | List
+| `--camel-spring-boot-version` | Camel version to use with Spring Boot |  | String
+| `--camel-version` | To export using a different Camel version than the default version. |  | String
+| `--cleanup` | Automatically removes deployment when process is stopped. Only in combination with --dev, --reload option. | true | boolean
+| `--cluster-type` | The target cluster type . Special configurations may be applied to different cluster types such as Kind or Minikube. |  | String
+| `--config` | Add a runtime configuration from a ConfigMap or a Secret (syntax: [configmap\|secret]:name[/key], where name represents the configmap/secret name and key optionally represents the configmap/secret key to be filtered). |  | String
+| `--connect` | A Service that the integration should bind to, specified as [[apigroup/]version:]kind:[namespace/]name. |  | String
+| `--dep,--dependency` | Add additional dependencies |  | List
+| `--disable-auto` | Disable automatic cluster type detection and automatic settings for cluster. |  | boolean
+| `--download` | Whether to allow automatic downloading JAR dependencies (over the internet) | true | boolean
+| `--env` | Set an environment variable in the integration container, for instance -e MY_VAR=my-value. |  | String
+| `--exclude` | Exclude files by name or pattern |  | List
+| `--fresh` | Make sure we use fresh (i.e. non-cached) resources | false | boolean
+| `--gav` | The Maven group:artifact:version |  | String
+| `--image` | The image name to be built. |  | String
+| `--image-build` | Whether to build container image as part of the run. | true | boolean
+| `--image-builder` | The image builder used to build the container image (e.g. docker, jib, s2i). | jib | String
+| `--image-group` | The image registry group used to push images to. |  | String
+| `--image-platform` | List of target platforms. Each platform is defined using os and architecture (e.g. linux/amd64). |  | String
+| `--image-push` | Whether to push image to given image registry as part of the run. | true | boolean
+| `--image-registry` | The image registry to hold the app container image. |  | String
+| `--java-version,--java` | Java version | 21 | String
+| `--kamelets-version` | Apache Camel Kamelets version |  | String
+| `--kube-config` | Path to the kube config file to initialize Kubernetes client |  | String
+| `--label` | Add a label to the integration. Use name values pairs like --label my.company=hello. |  | String
+| `--local-kamelet-dir` | Local directory for loading Kamelets (takes precedence) |  | String
+| `--logs` | Print logs after Camel application has been started. |  | boolean
+| `--maven-apache-snapshot-enabled` | Whether downloading JARs from ASF Maven Snapshot repository is enabled |  | boolean
+| `--maven-central-enabled` | Whether downloading JARs from Maven Central repository is enabled |  | boolean
+| `--maven-settings` | Optional location of Maven settings.xml file to configure servers, repositories, mirrors and proxies. If set to false, not even the default ~/.m2/settings.xml will be used. |  | String
+| `--maven-settings-security` | Optional location of Maven settings-security.xml file to decrypt settings.xml |  | String
+| `--name` | The integration name. Use this when the name should not get derived otherwise. |  | String
+| `--namespace,-n` | Namespace to use for all operations |  | String
+| `--open-api` | Add an OpenAPI spec (syntax: [configmap\|file]:name). |  | String
+| `--output` | Just output the generated integration custom resource (supports: yaml or json). |  | String
+| `--package-name` | For Java source files should they have the given package name. By default the package name is computed from the Maven GAV. Use false to turn off and not include package name in the Java source files. |  | String
+| `--package-scan-jars` | Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel CLI | false | boolean
+| `--profile` | Profile to export (dev, test, or prod). |  | String
+| `--prop,--property` | Add a runtime property or properties from a file (syntax: [my-key=my-value\|file:/path/to/my-conf.properties\|/path/to/my-conf.properties]. |  | String
+| `--quarkus-artifact-id` _(deprecated)_ | Deprecated. This value is not used anymore. It is kept only for backwards compatibility and will be removed in Camel 5.x. Camel commands may use either 'quarkus-bom' or 'quarkus-camel-bom' artifactIds depending on the context. | quarkus-bom | String
+| `--quarkus-ext-registry` | The base URI of Quarkus Extension Registry. The default is {@value RuntimeType#QUARKUS_EXTENSION_REGISTRY_BASE_URL} unless camel.jbang.quarkus.platform.url system property is set (the /client/platforms suffix is removed if present). |  | String
+| `--quarkus-group-id` | groupId of Quarkus Platform BOM; honored only if --quarkus-version is set | io.quarkus.platform | String
+| `--quarkus-version` | version of Quarkus Platform BOM; the default value is looked up in Quarkus Extension Registry |  | String
+| `--quiet` | Quiet output - only show errors for build/deploy. |  | boolean
+| `--registry-mirror` | Optional Docker registry mirror where to pull images from when building the container image. |  | String
+| `--reload,--dev` | Enables dev mode (live reload when source files are updated and saved) |  | boolean
+| `--repo,--repos` | Additional maven repositories for download on-demand (Use commas to separate multiple repositories) |  | String
+| `--resource` | Add a runtime resource from a Configmap or a Secret (syntax: [configmap\|secret]:name[/key][@path], where name represents the configmap/secret name, key optionally represents the configmap/secret key to be filtered and path represents the destination path). |  | String
+| `--resource-dir,--resource-dirs` | Additional resource directories to include in src/main/resources (recursive, preserving structure) |  | List
+| `--runtime` | Runtime | quarkus | RuntimeType
+| `--service-account` | The service account used to run the application. |  | String
+| `--skip-plugins` | Skip plugins during export | false | boolean
+| `--spring-boot-version` | Spring Boot version | RuntimeType.SPRING_BOOT_VERSION | String
+| `--trait` | Add a trait configuration to the integration. Use name values pairs like --trait trait.name.config=hello. |  | String
+| `--verbose` | Verbose output of build/deploy progress |  | boolean
+| `--volume` | Mount a volume into the integration container, for instance -v pvcname:/container/path. |  | String
+| `--wait` | Wait for the deployment to become ready. |  | boolean
+| `-h,--help` | Display the help and sub-commands |  | boolean
+|===
+
+
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-kubernetes.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-kubernetes.adoc
new file mode 100644
index 000000000000..d6d2cf436e13
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-kubernetes.adoc
@@ -0,0 +1,42 @@
+
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel kubernetes
+
+Manage Camel applications running on Kubernetes
+
+NOTE: This command is provided by the `kubernetes` plugin. Install it with `camel plugin add kubernetes`.
+
+
+== Usage
+
+[source,bash]
+----
+camel kubernetes [options]
+----
+
+
+== Subcommands
+
+[cols="2,5",options="header"]
+|===
+| Subcommand | Description
+| xref:jbang-commands/camel-jbang-kubernetes-delete.adoc[delete] | Delete Camel application from Kubernetes. This operation will delete all resources associated to this app, such as: Deployment, Routes, Services, etc. filtering by label app.kubernetes.io/name=<name>.
+| xref:jbang-commands/camel-jbang-kubernetes-export.adoc[export] | Export as Maven project that contains a Kubernetes deployment manifest
+| xref:jbang-commands/camel-jbang-kubernetes-logs.adoc[logs] | Print the logs of a Kubernetes pod
+| xref:jbang-commands/camel-jbang-kubernetes-run.adoc[run] | Run Camel application on Kubernetes
+|===
+
+
+
+== Options
+
+[cols="2,5,1,2",options="header"]
+|===
+| Option | Description | Default | Type
+| `--kube-config` | Path to the kube config file to initialize Kubernetes client |  | String
+| `--name` | The integration name. Use this when the name should not get derived otherwise. |  | String
+| `--namespace,-n` | Namespace to use for all operations |  | String
+| `-h,--help` | Display the help and sub-commands |  | boolean
+|===
+
+
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-mcp.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-mcp.adoc
new file mode 100644
index 000000000000..26fb56d334da
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-mcp.adoc
@@ -0,0 +1,31 @@
+
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel mcp
+
+MCP server for AI coding assistants
+
+NOTE: This command is provided by the `mcp` plugin. Install it with `camel plugin add mcp`.
+
+
+== Usage
+
+[source,bash]
+----
+camel mcp [options]
+----
+
+
+
+== Options
+
+[cols="2,5,1,2",options="header"]
+|===
+| Option | Description | Default | Type
+| `--http` | Enable HTTP transport (Streamable HTTP and SSE). Default uses STDIO transport. | false | boolean
+| `--log-level` | Log level (ERROR, WARN, INFO, DEBUG, TRACE) | WARN | String
+| `--port` | HTTP server port (only used with --http) | 8080 | int
+| `--version` | Camel MCP server version to use (default: current Camel version) |  | String
+| `-h,--help` | Display the help and sub-commands |  | boolean
+|===
+
+
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-route-parser.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-route-parser.adoc
new file mode 100644
index 000000000000..2986dc5c5e73
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-route-parser.adoc
@@ -0,0 +1,29 @@
+
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel route-parser
+
+Parses Java route and dumps route structure
+
+NOTE: This command is provided by the `route-parser` plugin. Install it with `camel plugin add route-parser`.
+
+
+== Usage
+
+[source,bash]
+----
+camel route-parser [options]
+----
+
+
+
+== Options
+
+[cols="2,5,1,2",options="header"]
+|===
+| Option | Description | Default | Type
+| `--raw` | To output raw without metadata |  | boolean
+| `--watch` | Execute periodically and showing output fullscreen |  | boolean
+| `-h,--help` | Display the help and sub-commands |  | boolean
+|===
+
+
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-test-init.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-test-init.adoc
new file mode 100644
index 000000000000..788e53487b56
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-test-init.adoc
@@ -0,0 +1,34 @@
+
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel test init
+
+Creates a new Citrus test
+
+NOTE: This command is provided by the `test` plugin. Install it with `camel plugin add test`.
+
+
+== Usage
+
+[source,bash]
+----
+camel test init [options]
+----
+
+
+
+== Options
+
+[cols="2,5,1,2",options="header"]
+|===
+| Option | Description | Default | Type
+| `--clean-dir,--clean-directory` | Whether to clean directory first (deletes all files in directory) |  | boolean
+| `--dir,--directory` | Directory relative path where the new Camel integration will be saved | . | String
+| `--from-kamelet` | To be used when extending an existing Kamelet |  | String
+| `--kamelets-version` | Apache Camel Kamelets version (auto-detected from classpath if not set) |  | String
+| `--list` | List available templates |  | boolean
+| `--pipe` | When creating a yaml file should it be created as a Pipe CR |  | boolean
+| `--repo,--repos` | Additional maven repositories (Use commas to separate multiple repositories) |  | String
+| `-h,--help` | Display the help and sub-commands |  | boolean
+|===
+
+
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-test.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-test.adoc
new file mode 100644
index 000000000000..13a7c0844597
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-test.adoc
@@ -0,0 +1,36 @@
+
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel test
+
+Manage tests for Camel applications
+
+NOTE: This command is provided by the `test` plugin. Install it with `camel plugin add test`.
+
+
+== Usage
+
+[source,bash]
+----
+camel test [options]
+----
+
+
+== Subcommands
+
+[cols="2,5",options="header"]
+|===
+| Subcommand | Description
+| xref:jbang-commands/camel-jbang-test-init.adoc[init] | Creates a new Citrus test
+|===
+
+
+
+== Options
+
+[cols="2,5,1,2",options="header"]
+|===
+| Option | Description | Default | Type
+| `-h,--help` | Display the help and sub-commands |  | boolean
+|===
+
+
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-tui-monitor.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-tui-monitor.adoc
new file mode 100644
index 000000000000..36fc29d9220e
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-tui-monitor.adoc
@@ -0,0 +1,37 @@
+
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel tui monitor
+
+Live dashboard for monitoring Camel integrations
+
+NOTE: This command is provided by the `tui` plugin. Install it with `camel plugin add tui`.
+
+
+== Usage
+
+[source,bash]
+----
+camel tui monitor [options]
+----
+
+
+
+== Options
+
+[cols="2,5,1,2",options="header"]
+|===
+| Option | Description | Default | Type
+| `--mcp` | Enable embedded MCP server for AI agent access to the TUI |  | boolean
+| `--mcp-port` | MCP server port | 8123 | int
+| `--record` | Replay a .tape file inside the TUI and record to an Asciinema .cast file |  | String
+| `--record-duration` | Maximum duration in milliseconds captured by --record | 120000 | int
+| `--record-fps` | Frames per second captured by --record | 10 | int
+| `--record-size` | Size of the recorded terminal for --record, as <cols>x<rows> | 200x50 | String
+| `--refresh` | Refresh interval in milliseconds | 100 | long
+| `--theme` | Color theme (overrides persisted preference for this session) |  | String
+| `--web` | Enable browser-accessible terminal (WebSocket) server |  | boolean
+| `--web-port` | Web terminal server port | 8090 | int
+| `-h,--help` | Display the help and sub-commands |  | boolean
+|===
+
+
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-tui.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-tui.adoc
new file mode 100644
index 000000000000..b21f60019690
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-tui.adoc
@@ -0,0 +1,46 @@
+
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel tui
+
+Camel TUI
+
+NOTE: This command is provided by the `tui` plugin. Install it with `camel plugin add tui`.
+
+
+== Usage
+
+[source,bash]
+----
+camel tui [options]
+----
+
+
+== Subcommands
+
+[cols="2,5",options="header"]
+|===
+| Subcommand | Description
+| xref:jbang-commands/camel-jbang-tui-monitor.adoc[monitor] | Live dashboard for monitoring Camel integrations
+|===
+
+
+
+== Options
+
+[cols="2,5,1,2",options="header"]
+|===
+| Option | Description | Default | Type
+| `--mcp` | Enable embedded MCP server for AI agent access to the TUI |  | boolean
+| `--mcp-port` | MCP server port | 8123 | int
+| `--record` | Replay a .tape file inside the TUI and record to an Asciinema .cast file |  | String
+| `--record-duration` | Maximum duration in milliseconds captured by --record | 120000 | int
+| `--record-fps` | Frames per second captured by --record | 10 | int
+| `--record-size` | Size of the recorded terminal for --record, as <cols>x<rows> | 200x50 | String
+| `--refresh` | Refresh interval in milliseconds | 100 | long
+| `--theme` | Color theme: dark or light (overrides persisted preference for this session) |  | String
+| `--web` | Enable browser-accessible terminal (WebSocket) server |  | boolean
+| `--web-port` | Web terminal server port | 8090 | int
+| `-h,--help` | Display the help and sub-commands |  | boolean
+|===
+
+
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-validate-normalize.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-validate-normalize.adoc
index 5d9ebe06ac5c..d3a9c09b5f01 100644
--- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-validate-normalize.adoc
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-validate-normalize.adoc
@@ -1,88 +1,34 @@
-= camel validate normalize
-
-*Available as of Camel 4.20*
 
-Normalize YAML routes to canonical (explicit) form.
-
-This command parses YAML routes and rewrites them in canonical form, expanding all shorthands and
-implicit expressions. For example, `log: "$\{body}"` becomes `log: { message: "$\{body}" }` and
-`setBody: { simple: "Hello" }` becomes `setBody: { expression: { simple: { expression: "Hello" } } }`.
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel validate normalize
 
-The normalized output is valid against both the classic and canonical schemas.
+Normalize YAML routes to canonical (explicit) form
 
-See the xref:components:others:yaml-dsl.adoc[YAML DSL Schema Variants] documentation for details
-on the differences between the classic and canonical schemas.
+NOTE: This command is provided by the `validate` plugin. Install it with `camel plugin add validate`.
 
 
 == Usage
 
 [source,bash]
 ----
-camel validate normalize [options] <files>
+camel validate normalize [options]
 ----
 
 
+
 == Options
 
 [cols="2,5,1,2",options="header"]
 |===
 | Option | Description | Default | Type
+| `--download` | Whether to allow automatic downloading JAR dependencies (over the internet) | true | boolean
+| `--fresh` | Make sure we use fresh (i.e. non-cached) resources | false | boolean
 | `--output` | File or directory to write normalized output. If not specified, output is printed to console. |  | String
+| `--repo,--repos` | Additional maven repositories for download on-demand (Use commas to separate multiple repositories) |  | String
 | `-h,--help` | Display the help and sub-commands |  | boolean
 |===
 
 
-== Examples
-
-Normalize a YAML route and print to console:
-[source,bash]
-----
-camel validate normalize myroute.yaml
-----
-
-Normalize and write to a file:
-[source,bash]
-----
-camel validate normalize --output normalized.yaml myroute.yaml
-----
-
-Normalize multiple files into a directory:
-[source,bash]
-----
-camel validate normalize --output normalized/ routes/*.yaml
-----
-
-=== Before and after
-
-Given the following YAML route using classic shorthands:
-
-[source,yaml]
-----
-- route:
-    from:
-      uri: timer:yaml
-      steps:
-        - setBody:
-            simple: "Hello Camel from ${routeId}"
-        - log: "${body}"
-----
-
-Running `camel validate normalize myroute.yaml` produces the canonical form:
-
-[source,yaml]
-----
-- route:
-    from:
-      uri: timer:yaml
-      steps:
-        - setBody:
-            expression:
-              simple:
-                expression: "Hello Camel from ${routeId}"
-        - log:
-            message: "${body}"
-----
 
-All shorthands and implicit expressions are expanded to their explicit equivalents.
-The output is valid against both the classic and canonical schemas.
+include::partial$jbang-commands/examples/validate-normalize.adoc[]
 
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-validate-properties.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-validate-properties.adoc
new file mode 100644
index 000000000000..ed9ab7096aa2
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-validate-properties.adoc
@@ -0,0 +1,27 @@
+
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel validate properties
+
+Validate Camel configuration in properties files
+
+NOTE: This command is provided by the `validate` plugin. Install it with `camel plugin add validate`.
+
+
+== Usage
+
+[source,bash]
+----
+camel validate properties [options]
+----
+
+
+
+== Options
+
+[cols="2,5,1,2",options="header"]
+|===
+| Option | Description | Default | Type
+| `-h,--help` | Display the help and sub-commands |  | boolean
+|===
+
+
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-validate-source.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-validate-source.adoc
new file mode 100644
index 000000000000..2122863930d5
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-validate-source.adoc
@@ -0,0 +1,36 @@
+
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel validate source
+
+Validate any Camel source file: YAML, properties, Java, XSLT, XML
+
+NOTE: This command is provided by the `validate` plugin. Install it with `camel plugin add validate`.
+
+
+== Usage
+
+[source,bash]
+----
+camel validate source [options]
+----
+
+
+
+== Options
+
+[cols="2,5,1,2",options="header"]
+|===
+| Option | Description | Default | Type
+| `--camel-version` | Validate against another Camel version than the CLI's own: its catalog and YAML DSL schema |  | String
+| `--download` | Whether to allow automatic downloading JAR dependencies (over the internet) | true | boolean
+| `--fresh` | Make sure we use fresh (i.e. non-cached) resources | false | boolean
+| `--quarkus-artifact-id` _(deprecated)_ | Deprecated. This value is not used anymore. It is kept only for backwards compatibility and will be removed in Camel 5.x. Camel commands may use either 'quarkus-bom' or 'quarkus-camel-bom' artifactIds depending on the context. | quarkus-bom | String
+| `--quarkus-ext-registry` | The base URI of Quarkus Extension Registry. The default is {@value RuntimeType#QUARKUS_EXTENSION_REGISTRY_BASE_URL} unless camel.jbang.quarkus.platform.url system property is set (the /client/platforms suffix is removed if present). |  | String
+| `--quarkus-group-id` | groupId of Quarkus Platform BOM; honored only if --quarkus-version is set | io.quarkus.platform | String
+| `--quarkus-version` | version of Quarkus Platform BOM; the default value is looked up in Quarkus Extension Registry |  | String
+| `--repo,--repos` | Additional maven repositories for download on-demand (Use commas to separate multiple repositories) |  | String
+| `--runtime` | Runtime ; spring-boot and quarkus use the catalog of that runtime, so a component without a starter or extension is an error |  | RuntimeType
+| `-h,--help` | Display the help and sub-commands |  | boolean
+|===
+
+
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-validate-yaml.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-validate-yaml.adoc
index b7ba6a3b0fb2..a77131a3ddeb 100644
--- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-validate-yaml.adoc
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-validate-yaml.adoc
@@ -1,71 +1,41 @@
-= camel validate yaml
 
-Parse and validate YAML routes against the Camel YAML DSL schema.
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
+= camel validate yaml
 
-By default, routes are validated against the classic schema which accepts both shorthand and explicit forms.
-Use the `--canonical` flag to validate against the canonical schema, which rejects shorthands and implicit expressions.
+Parse and validate YAML routes
 
-See the xref:components:others:yaml-dsl.adoc[YAML DSL Schema Variants] documentation for details
-on the differences between the classic and canonical schemas.
+NOTE: This command is provided by the `validate` plugin. Install it with `camel plugin add validate`.
 
 
 == Usage
 
 [source,bash]
 ----
-camel validate yaml [options] <files>
+camel validate yaml [options]
 ----
 
 
+
 == Options
 
 [cols="2,5,1,2",options="header"]
 |===
 | Option | Description | Default | Type
-| `--canonical` | Validate against the canonical schema (rejects shorthands and implicit expressions) | false | boolean
+| `--camel-version` | Validate against another Camel version than the CLI's own: its catalog and YAML DSL schema |  | String
+| `--canonical` | Validate against the canonical schema: reports the deprecated compact notation (string shorthands, implicit expressions) with the canonical form to write | false | boolean
+| `--catalog` | Also check endpoint URIs and simple expressions against the Camel catalog (use --catalog=false for the schema only) | true | boolean
+| `--download` | Whether to allow automatic downloading JAR dependencies (over the internet) | true | boolean
+| `--fresh` | Make sure we use fresh (i.e. non-cached) resources | false | boolean
+| `--quarkus-artifact-id` _(deprecated)_ | Deprecated. This value is not used anymore. It is kept only for backwards compatibility and will be removed in Camel 5.x. Camel commands may use either 'quarkus-bom' or 'quarkus-camel-bom' artifactIds depending on the context. | quarkus-bom | String
+| `--quarkus-ext-registry` | The base URI of Quarkus Extension Registry. The default is {@value RuntimeType#QUARKUS_EXTENSION_REGISTRY_BASE_URL} unless camel.jbang.quarkus.platform.url system property is set (the /client/platforms suffix is removed if present). |  | String
+| `--quarkus-group-id` | groupId of Quarkus Platform BOM; honored only if --quarkus-version is set | io.quarkus.platform | String
+| `--quarkus-version` | version of Quarkus Platform BOM; the default value is looked up in Quarkus Extension Registry |  | String
+| `--repo,--repos` | Additional maven repositories for download on-demand (Use commas to separate multiple repositories) |  | String
+| `--runtime` | Runtime ; spring-boot and quarkus use the catalog of that runtime, so a component without a starter or extension is an error |  | RuntimeType
 | `-h,--help` | Display the help and sub-commands |  | boolean
 |===
 
 
-== Examples
-
-Validate YAML routes against the classic schema:
-[source,bash]
-----
-camel validate yaml myroute.yaml
-----
-
-Validate against the canonical schema (rejects shorthands):
-[source,bash]
-----
-camel validate yaml --canonical myroute.yaml
-----
-
-Validate multiple files:
-[source,bash]
-----
-camel validate yaml routes/*.yaml
-----
-
-=== Sample output
-
-Given a YAML route using the shorthand `log: "$\{body}"`, validating with `--canonical` will report errors
-because the canonical schema requires the explicit object form:
-
-[source,bash]
-----
-$ camel validate yaml --canonical myroute.yaml
-myroute.yaml: INVALID
-  - $.from.steps[0].log: string found, object expected
-----
-
-The same file validates successfully against the classic schema (the default):
-
-[source,bash]
-----
-$ camel validate yaml myroute.yaml
-myroute.yaml: VALID
-----
 
-Use `camel validate normalize` to convert the file to canonical form before re-validating.
+include::partial$jbang-commands/examples/validate-yaml.adoc[]
 
diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-validate.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-validate.adoc
index 059b80e93c0e..1139ebc2a9fd 100644
--- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-validate.adoc
+++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-validate.adoc
@@ -1,7 +1,11 @@
+
+// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
 = camel validate
 
 Validate Camel source code
 
+NOTE: This command is provided by the `validate` plugin. Install it with `camel plugin add validate`.
+
 
 == Usage
 
@@ -16,8 +20,10 @@ camel validate [options]
 [cols="2,5",options="header"]
 |===
 | Subcommand | Description
-| xref:jbang-commands/camel-jbang-validate-yaml.adoc[yaml] | Parse and validate YAML routes
 | xref:jbang-commands/camel-jbang-validate-normalize.adoc[normalize] | Normalize YAML routes to canonical (explicit) form
+| xref:jbang-commands/camel-jbang-validate-properties.adoc[properties] | Validate Camel configuration in properties files
+| xref:jbang-commands/camel-jbang-validate-source.adoc[source] | Validate any Camel source file: YAML, properties, Java, XSLT, XML
+| xref:jbang-commands/camel-jbang-validate-yaml.adoc[yaml] | Parse and validate YAML routes
 |===
 
 
@@ -30,3 +36,4 @@ camel validate [options]
 | `-h,--help` | Display the help and sub-commands |  | boolean
 |===
 
+
diff --git a/docs/user-manual/modules/ROOT/pages/large-payloads.adoc b/docs/user-manual/modules/ROOT/pages/large-payloads.adoc
index a1eed080b73f..a564634a06ef 100644
--- a/docs/user-manual/modules/ROOT/pages/large-payloads.adoc
+++ b/docs/user-manual/modules/ROOT/pages/large-payloads.adoc
@@ -131,14 +131,14 @@ received.
 
 The size of an uploaded request is limited by the runtime:
 
-* Camel Main and Camel JBang: `camel.server.maxBodySize`. When it is not set, the Vert.x default of 10 MB applies.
+* Camel Main and the Camel CLI: `camel.server.maxBodySize`. When it is not set, the Vert.x default of 10 MB applies.
 With `useStreaming=true` this limit does not apply, so limit the size of requests in front of Camel if needed.
 * Quarkus: `quarkus.http.limits.max-body-size`, and the `quarkus.http.body.*` options for file uploads. See the
 Quarkus documentation.
 * Spring Boot: `spring.servlet.multipart.max-file-size` and `spring.servlet.multipart.max-request-size` for
 multipart uploads. See the Spring Boot documentation.
 
-On Camel Main, Camel JBang and Quarkus, `useStreaming=true` does not accept multipart requests; use a separate
+On Camel Main, the Camel CLI and Quarkus, `useStreaming=true` does not accept multipart requests; use a separate
 endpoint for multipart uploads.
 
 == Examples
diff --git a/docs/user-manual/modules/ROOT/partials/jbang-commands/examples/validate-normalize.adoc b/docs/user-manual/modules/ROOT/partials/jbang-commands/examples/validate-normalize.adoc
new file mode 100644
index 000000000000..dc13df72487b
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/partials/jbang-commands/examples/validate-normalize.adoc
@@ -0,0 +1,57 @@
+== Examples
+
+The command parses YAML routes and rewrites them in canonical form, expanding all shorthands and
+implicit expressions. The normalized output is valid against both the classic and canonical schemas.
+See xref:components:others:yaml-dsl.adoc[YAML DSL] for the differences between the classic and canonical schemas.
+
+Normalize a YAML route and print to console:
+
+[source,bash]
+----
+camel validate normalize myroute.yaml
+----
+
+Normalize and write to a file:
+
+[source,bash]
+----
+camel validate normalize --output normalized.yaml myroute.yaml
+----
+
+Normalize multiple files into a directory:
+
+[source,bash]
+----
+camel validate normalize --output normalized/ routes/*.yaml
+----
+
+=== Before and after
+
+Given the following YAML route using classic shorthands:
+
+[source,yaml]
+----
+- route:
+    from:
+      uri: timer:yaml
+      steps:
+        - setBody:
+            simple: "Hello Camel from ${routeId}"
+        - log: "${body}"
+----
+
+Running `camel validate normalize myroute.yaml` produces the canonical form:
+
+[source,yaml]
+----
+- route:
+    from:
+      uri: timer:yaml
+      steps:
+        - setBody:
+            expression:
+              simple:
+                expression: "Hello Camel from ${routeId}"
+        - log:
+            message: "${body}"
+----
diff --git a/docs/user-manual/modules/ROOT/partials/jbang-commands/examples/validate-yaml.adoc b/docs/user-manual/modules/ROOT/partials/jbang-commands/examples/validate-yaml.adoc
new file mode 100644
index 000000000000..b24b67471ac4
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/partials/jbang-commands/examples/validate-yaml.adoc
@@ -0,0 +1,36 @@
+== Examples
+
+By default, routes are validated against the classic schema, which accepts both the shorthand and the explicit forms.
+Use `--canonical` to validate against the canonical schema, which rejects shorthands and implicit expressions.
+See xref:components:others:yaml-dsl.adoc[YAML DSL] for the differences between the classic and canonical schemas.
+
+Validate YAML routes against the classic schema:
+
+[source,bash]
+----
+camel validate yaml myroute.yaml
+----
+
+Validate against the canonical schema (rejects shorthands):
+
+[source,bash]
+----
+camel validate yaml --canonical myroute.yaml
+----
+
+Validate multiple files:
+
+[source,bash]
+----
+camel validate yaml routes/*.yaml
+----
+
+When all files are valid:
+
+[source,bash]
+----
+$ camel validate yaml cheese.yaml orders.yaml
+Validation success (files:2)
+----
+
+Use `camel validate normalize` to convert a file to the canonical form before validating it with `--canonical`.
diff --git a/dsl/camel-jbang/README.md b/dsl/camel-jbang/README.md
index cd3cf2df57b6..1789dac32e83 100644
--- a/dsl/camel-jbang/README.md
+++ b/dsl/camel-jbang/README.md
@@ -1,6 +1,6 @@
 ## Install Camel-JBang
 
-The general process to install Camel-JBang is described [here](https://camel.apache.org/manual/camel-jbang.html#_installation)
+The general process to install the Camel CLI is described [here](https://camel.apache.org/manual/camel-jbang-getting-started.html#_install)
 
 ```shell
 jbang app install camel@apache/camel
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStartupRecorderAction.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStartupRecorderAction.java
index 4de82847eb46..0334e5e915af 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStartupRecorderAction.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStartupRecorderAction.java
@@ -39,7 +39,7 @@ import picocli.CommandLine;
                      description = "Display startup recording", sortOptions = false, showDefaultValues = true,
                      footer = {
                              "%nExamples:",
-                             "  camel cmd startup-recorder" })
+                             "  camel get startup-recorder" })
 public class CamelStartupRecorderAction extends ActionWatchCommand {
 
     @CommandLine.Parameters(description = "Name or pid of running Camel integration", arity = "0..1")
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ai/ToolRegistry.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ai/ToolRegistry.java
index 0d493a50d94e..7b6fdad92057 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ai/ToolRegistry.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ai/ToolRegistry.java
@@ -503,7 +503,7 @@ public final class ToolRegistry {
                 "Get startup recorder steps showing component initialization timing. "
                                            + "Shows each startup step with duration, level, and type. "
                                            + "Useful for diagnosing slow application startup. "
-                                           + "Requires startup recording to be enabled (camel.main.startup-recorder=true).")
+                                           + "Requires startup recording to be enabled (camel.main.startup-recorder=backlog).")
                 .executor((ctx, args) -> ctx.executeAction("startup-recorder", null)));
 
         register(tool("get_datasources",
diff --git a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/RuntimeTools.java b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/RuntimeTools.java
index 2432e3a5212e..01ebc047c158 100644
--- a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/RuntimeTools.java
+++ b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/RuntimeTools.java
@@ -346,7 +346,7 @@ public class RuntimeTools {
     @Tool(annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint = false, openWorldHint = false),
           description = """
                   Get the startup recorder steps of the running Camel application: each step with duration, level \
-                  and type, for diagnosing a slow startup. Requires camel.main.startup-recorder=true.""")
+                  and type, for diagnosing a slow startup. Requires camel.main.startup-recorder=backlog.""")
     public JsonObject camel_runtime_startup_steps(
             @ToolArg(description = NAME_OR_PID_DESC, required = false) String nameOrPid) {
         return delegateToRegistry("get_startup_steps", nameOrPid, Map.of());
diff --git a/dsl/camel-jbang/camel-jbang-plugin-edit/pom.xml b/dsl/camel-jbang/camel-jbang-plugin-edit/pom.xml
index bee7c0b08695..6bcc51d961b8 100644
--- a/dsl/camel-jbang/camel-jbang-plugin-edit/pom.xml
+++ b/dsl/camel-jbang/camel-jbang-plugin-edit/pom.xml
@@ -88,4 +88,24 @@
             <version>${juniversalchardet-version}</version>
         </dependency>
     </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <!-- the command reference of the plugin commands in the user manual -->
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-package-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>prepare-jbang-commands</id>
+                        <goals>
+                            <goal>prepare-jbang-commands</goal>
+                            <goal>prepare-jbang-commands-doc</goal>
+                        </goals>
+                        <phase>process-classes</phase>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
 </project>
diff --git a/dsl/camel-jbang/camel-jbang-plugin-edit/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json b/dsl/camel-jbang/camel-jbang-plugin-edit/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json
new file mode 100644
index 000000000000..b57b4713c0fe
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-plugin-edit/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json
@@ -0,0 +1,5 @@
+{
+  "commands": [
+    { "name": "edit", "fullName": "edit", "description": "Edit Camel with suggestions and diagnostics", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.edit.EditCommand", "plugin": "edit", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }
+  ]
+}
diff --git a/dsl/camel-jbang/camel-jbang-plugin-generate/pom.xml b/dsl/camel-jbang/camel-jbang-plugin-generate/pom.xml
index 553c55e85a7b..ba0bcaa8d898 100644
--- a/dsl/camel-jbang/camel-jbang-plugin-generate/pom.xml
+++ b/dsl/camel-jbang/camel-jbang-plugin-generate/pom.xml
@@ -106,4 +106,24 @@
 
     </dependencies>
 
+
+    <build>
+        <plugins>
+            <plugin>
+                <!-- the command reference of the plugin commands in the user manual -->
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-package-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>prepare-jbang-commands</id>
+                        <goals>
+                            <goal>prepare-jbang-commands</goal>
+                            <goal>prepare-jbang-commands-doc</goal>
+                        </goals>
+                        <phase>process-classes</phase>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
 </project>
diff --git a/dsl/camel-jbang/camel-jbang-plugin-generate/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json b/dsl/camel-jbang/camel-jbang-plugin-generate/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json
new file mode 100644
index 000000000000..46e0bec5c10c
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-plugin-generate/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json
@@ -0,0 +1,5 @@
+{
+  "commands": [
+    { "name": "generate", "fullName": "generate", "description": "Generate source code", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.generate.CodeGenerator", "plugin": "generate", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "rest", "fullName": "generate rest", "description": "Generate REST DSL source code from OpenApi specification", "sourceClass": "org.apach [...]
+  ]
+}
diff --git a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/pom.xml b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/pom.xml
index 467e4bbfe392..6481988cfd85 100644
--- a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/pom.xml
+++ b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/pom.xml
@@ -269,6 +269,21 @@
 
     <build>
         <plugins>
+            <plugin>
+                <!-- the command reference of the plugin commands in the user manual -->
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-package-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>prepare-jbang-commands</id>
+                        <goals>
+                            <goal>prepare-jbang-commands</goal>
+                            <goal>prepare-jbang-commands-doc</goal>
+                        </goals>
+                        <phase>process-classes</phase>
+                    </execution>
+                </executions>
+            </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
diff --git a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json
new file mode 100644
index 000000000000..3af001de5e32
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json
@@ -0,0 +1,5 @@
+{
+  "commands": [
+    { "name": "kubernetes", "fullName": "kubernetes", "description": "Manage Camel applications running on Kubernetes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.kubernetes.KubernetesCommand", "plugin": "kubernetes", "options": [ { "names": "--kube-config", "description": "Path to the kube config file to initialize Kubernetes client", "javaType": "java.lang.String", "type": "string" }, { "names": "--name", "description": "The integration name. Use this when the name should [...]
+  ]
+}
diff --git a/dsl/camel-jbang/camel-jbang-plugin-mcp/pom.xml b/dsl/camel-jbang/camel-jbang-plugin-mcp/pom.xml
index 3bf0ff19aa60..0a0232810906 100644
--- a/dsl/camel-jbang/camel-jbang-plugin-mcp/pom.xml
+++ b/dsl/camel-jbang/camel-jbang-plugin-mcp/pom.xml
@@ -47,4 +47,24 @@
         </dependency>
     </dependencies>
 
+
+    <build>
+        <plugins>
+            <plugin>
+                <!-- the command reference of the plugin commands in the user manual -->
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-package-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>prepare-jbang-commands</id>
+                        <goals>
+                            <goal>prepare-jbang-commands</goal>
+                            <goal>prepare-jbang-commands-doc</goal>
+                        </goals>
+                        <phase>process-classes</phase>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
 </project>
diff --git a/dsl/camel-jbang/camel-jbang-plugin-mcp/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json b/dsl/camel-jbang/camel-jbang-plugin-mcp/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json
new file mode 100644
index 000000000000..4395e4ed5e9c
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-plugin-mcp/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json
@@ -0,0 +1,5 @@
+{
+  "commands": [
+    { "name": "mcp", "fullName": "mcp", "description": "MCP server for AI coding assistants", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.mcp.McpCommand", "plugin": "mcp", "options": [ { "names": "--http", "description": "Enable HTTP transport (Streamable HTTP and SSE). Default uses STDIO transport.", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--log-level", "description": "Log level (ERROR, WARN, INFO, DEBUG, TRACE)", "defaultValue": "WA [...]
+  ]
+}
diff --git a/dsl/camel-jbang/camel-jbang-plugin-route-parser/pom.xml b/dsl/camel-jbang/camel-jbang-plugin-route-parser/pom.xml
index 5b4424a95bd4..641fc277d4d1 100644
--- a/dsl/camel-jbang/camel-jbang-plugin-route-parser/pom.xml
+++ b/dsl/camel-jbang/camel-jbang-plugin-route-parser/pom.xml
@@ -55,4 +55,24 @@
             <version>${roaster-version}</version>
         </dependency>
     </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <!-- the command reference of the plugin commands in the user manual -->
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-package-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>prepare-jbang-commands</id>
+                        <goals>
+                            <goal>prepare-jbang-commands</goal>
+                            <goal>prepare-jbang-commands-doc</goal>
+                        </goals>
+                        <phase>process-classes</phase>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
 </project>
diff --git a/dsl/camel-jbang/camel-jbang-plugin-route-parser/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json b/dsl/camel-jbang/camel-jbang-plugin-route-parser/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json
new file mode 100644
index 000000000000..8c9c1d0ea4b6
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-plugin-route-parser/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json
@@ -0,0 +1,5 @@
+{
+  "commands": [
+    { "name": "route-parser", "fullName": "route-parser", "description": "Parses Java route and dumps route structure", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.parser.RouteParserCommand", "plugin": "route-parser", "options": [ { "names": "--raw", "description": "To output raw without metadata", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" },  [...]
+  ]
+}
diff --git a/dsl/camel-jbang/camel-jbang-plugin-test/pom.xml b/dsl/camel-jbang/camel-jbang-plugin-test/pom.xml
index c0040c3b69df..d7454eb49c5e 100644
--- a/dsl/camel-jbang/camel-jbang-plugin-test/pom.xml
+++ b/dsl/camel-jbang/camel-jbang-plugin-test/pom.xml
@@ -80,6 +80,21 @@
 
     <build>
         <plugins>
+            <plugin>
+                <!-- the command reference of the plugin commands in the user manual -->
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-package-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>prepare-jbang-commands</id>
+                        <goals>
+                            <goal>prepare-jbang-commands</goal>
+                            <goal>prepare-jbang-commands-doc</goal>
+                        </goals>
+                        <phase>process-classes</phase>
+                    </execution>
+                </executions>
+            </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
diff --git a/dsl/camel-jbang/camel-jbang-plugin-test/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json b/dsl/camel-jbang/camel-jbang-plugin-test/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json
new file mode 100644
index 000000000000..f90720a6d5bd
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-plugin-test/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json
@@ -0,0 +1,5 @@
+{
+  "commands": [
+    { "name": "test", "fullName": "test", "description": "Manage tests for Camel applications", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.test.TestCommand", "plugin": "test", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "init", "fullName": "test init", "description": "Creates a new Citrus test", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.test.T [...]
+  ]
+}
diff --git a/dsl/camel-jbang/camel-jbang-plugin-tui/pom.xml b/dsl/camel-jbang/camel-jbang-plugin-tui/pom.xml
index 9882e20e78a9..c108766e09ec 100644
--- a/dsl/camel-jbang/camel-jbang-plugin-tui/pom.xml
+++ b/dsl/camel-jbang/camel-jbang-plugin-tui/pom.xml
@@ -145,6 +145,21 @@
 
     <build>
         <plugins>
+            <plugin>
+                <!-- the command reference of the plugin commands in the user manual -->
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-package-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>prepare-jbang-commands</id>
+                        <goals>
+                            <goal>prepare-jbang-commands</goal>
+                            <goal>prepare-jbang-commands-doc</goal>
+                        </goals>
+                        <phase>process-classes</phase>
+                    </execution>
+                </executions>
+            </plugin>
             <plugin>
                 <artifactId>maven-resources-plugin</artifactId>
                 <executions>
diff --git a/dsl/camel-jbang/camel-jbang-plugin-tui/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json b/dsl/camel-jbang/camel-jbang-plugin-tui/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json
new file mode 100644
index 000000000000..280ee0d05414
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-plugin-tui/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json
@@ -0,0 +1,5 @@
+{
+  "commands": [
+    { "name": "tui", "fullName": "tui", "description": "Camel TUI", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.tui.TuiCommand", "plugin": "tui", "options": [ { "names": "--mcp", "description": "Enable embedded MCP server for AI agent access to the TUI", "javaType": "boolean", "type": "boolean" }, { "names": "--mcp-port", "description": "MCP server port", "defaultValue": "8123", "javaType": "int", "type": "integer" }, { "names": "--record", "description": "Replay a .tape fil [...]
+  ]
+}
diff --git a/dsl/camel-jbang/camel-jbang-plugin-validate/pom.xml b/dsl/camel-jbang/camel-jbang-plugin-validate/pom.xml
index d108e6dfdf2b..8f75bd5beb4b 100644
--- a/dsl/camel-jbang/camel-jbang-plugin-validate/pom.xml
+++ b/dsl/camel-jbang/camel-jbang-plugin-validate/pom.xml
@@ -62,4 +62,24 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <!-- the command reference of the plugin commands in the user manual -->
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-package-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>prepare-jbang-commands</id>
+                        <goals>
+                            <goal>prepare-jbang-commands</goal>
+                            <goal>prepare-jbang-commands-doc</goal>
+                        </goals>
+                        <phase>process-classes</phase>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
 </project>
diff --git a/dsl/camel-jbang/camel-jbang-plugin-validate/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json b/dsl/camel-jbang/camel-jbang-plugin-validate/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json
new file mode 100644
index 000000000000..b881cb6fe2f0
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-plugin-validate/src/generated/resources/META-INF/camel-jbang-plugin-commands-metadata.json
@@ -0,0 +1,5 @@
+{
+  "commands": [
+    { "name": "validate", "fullName": "validate", "description": "Validate Camel source code", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.validate.ValidateCommand", "plugin": "validate", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "normalize", "fullName": "validate normalize", "description": "Normalize YAML routes to canonical (explicit) form", "sourceClass" [...]
+  ]
+}
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JBangCommandModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JBangCommandModel.java
index 257c924ce210..15bc22526608 100644
--- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JBangCommandModel.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JBangCommandModel.java
@@ -46,6 +46,7 @@ public class JBangCommandModel {
         private String deprecationNote;
         private String sourceClass;
         private String examples;
+        private String plugin;
         private final List<JBangCommandOption> options = new ArrayList<>();
         private final List<JBangCommand> subcommands = new ArrayList<>();
 
@@ -113,6 +114,18 @@ public class JBangCommandModel {
             this.examples = examples;
         }
 
+        /**
+         * The name of the plugin that provides this command (as used with {@code camel plugin add}), or null for a
+         * built-in command.
+         */
+        public String getPlugin() {
+            return plugin;
+        }
+
+        public void setPlugin(String plugin) {
+            this.plugin = plugin;
+        }
+
         public boolean hasExamples() {
             return examples != null && !examples.isBlank();
         }
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java
index 9233db0fceb0..8921f15869fc 100644
--- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java
@@ -1230,6 +1230,7 @@ public final class JsonMapper {
         command.setDeprecationNote(obj.getString("deprecationNote"));
         command.setSourceClass(obj.getString("sourceClass"));
         command.setExamples(obj.getString("examples"));
+        command.setPlugin(obj.getString("plugin"));
 
         JsonArray options = (JsonArray) obj.get("options");
         if (options != null) {
@@ -1299,6 +1300,9 @@ public final class JsonMapper {
         if (cmd.getExamples() != null) {
             json.put("examples", cmd.getExamples());
         }
+        if (cmd.getPlugin() != null) {
+            json.put("plugin", cmd.getPlugin());
+        }
 
         if (cmd.hasOptions()) {
             JsonArray options = new JsonArray();
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelJBangCommandsDocMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelJBangCommandsDocMojo.java
index b1897647cf1a..708c9f494353 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelJBangCommandsDocMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelJBangCommandsDocMojo.java
@@ -21,9 +21,14 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
@@ -44,6 +49,10 @@ import org.mvel2.templates.TemplateRuntime;
 
 /**
  * Generates documentation for camel-jbang commands.
+ * <p>
+ * Each module (camel-jbang-core and every camel-jbang plugin) generates the pages of its own commands. The index page
+ * lists the commands of camel-jbang-core and of all plugins, read from the metadata of the sibling modules, so it is
+ * the same whichever module generates it.
  */
 @Mojo(name = "prepare-jbang-commands-doc", defaultPhase = LifecyclePhase.PROCESS_CLASSES, threadSafe = true,
       requiresDependencyResolution = ResolutionScope.COMPILE)
@@ -64,6 +73,12 @@ public class PrepareCamelJBangCommandsDocMojo extends AbstractGeneratorMojo {
     @Parameter(defaultValue = "${project.basedir}/src/generated/resources/META-INF/camel-jbang-commands-metadata.json")
     protected File commandsJsonFile;
 
+    /**
+     * The directory with camel-jbang-core and the camel-jbang plugin modules
+     */
+    @Parameter(defaultValue = "${project.basedir}/..")
+    protected File jbangDir;
+
     @Inject
     public PrepareCamelJBangCommandsDocMojo(MavenProjectHelper projectHelper, BuildContext buildContext) {
         super(projectHelper, buildContext);
@@ -73,13 +88,20 @@ public class PrepareCamelJBangCommandsDocMojo extends AbstractGeneratorMojo {
     public void execute(MavenProject project) throws MojoFailureException, MojoExecutionException {
         docDir = new File(
                 project.getBasedir().getParentFile().getParentFile().getParent(), "docs/user-manual/modules/ROOT/pages");
-        commandsJsonFile
-                = new File(project.getBasedir(), "src/generated/resources/META-INF/camel-jbang-commands-metadata.json");
+        commandsJsonFile = new File(
+                project.getBasedir(), "src/generated/resources/" + PrepareCamelJBangCommandsMojo.CORE_METADATA_FILE);
+        jbangDir = project.getBasedir().getParentFile();
         super.execute(project);
     }
 
     @Override
     public void execute() throws MojoExecutionException, MojoFailureException {
+        if (!commandsJsonFile.exists()) {
+            // a camel-jbang plugin has its own metadata file
+            commandsJsonFile = new File(
+                    commandsJsonFile.getParentFile(),
+                    PrepareCamelJBangCommandsMojo.PLUGIN_METADATA_FILE.substring("META-INF/".length()));
+        }
         if (!commandsJsonFile.exists()) {
             getLog().debug("Commands metadata file not found: " + commandsJsonFile);
             return;
@@ -95,7 +117,7 @@ public class PrepareCamelJBangCommandsDocMojo extends AbstractGeneratorMojo {
             }
 
             // Generate index page
-            generateIndexPage(model);
+            generateIndexPage();
 
             // Generate individual command pages (including subcommands recursively)
             int totalPages = 0;
@@ -109,7 +131,75 @@ public class PrepareCamelJBangCommandsDocMojo extends AbstractGeneratorMojo {
         }
     }
 
-    private void generateIndexPage(JBangCommandModel model) throws MojoExecutionException {
+    private void generateIndexPage() throws MojoExecutionException {
+        List<JBangCommand> commands = new ArrayList<>();
+        List<JBangCommand> pluginCommands = new ArrayList<>();
+        try {
+            File core = new File(
+                    jbangDir, "camel-jbang-core/src/generated/resources/"
+                              + PrepareCamelJBangCommandsMojo.CORE_METADATA_FILE);
+            if (core.exists()) {
+                commands.addAll(loadModel(core).getCommands());
+            }
+            try (Stream<Path> modules = Files.list(jbangDir.toPath())) {
+                List<Path> plugins = modules
+                        .filter(p -> p.getFileName().toString().startsWith("camel-jbang-plugin-"))
+                        .map(p -> p.resolve("src/generated/resources/" + PrepareCamelJBangCommandsMojo.PLUGIN_METADATA_FILE))
+                        .filter(Files::exists)
+                        .toList();
+                for (Path plugin : plugins) {
+                    pluginCommands.addAll(loadModel(plugin.toFile()).getCommands());
+                }
+            }
+        } catch (IOException e) {
+            throw new MojoExecutionException("Error loading JBang commands metadata", e);
+        }
+        pluginCommands.sort((a, b) -> a.getName().compareToIgnoreCase(b.getName()));
+        generateIndexPage(commands, pluginCommands);
+        removeOrphanPages(commands, pluginCommands);
+    }
+
+    /**
+     * Removes the generated pages of commands that no longer exist (such as a renamed command). Pages without the
+     * auto-generated marker are written by hand and kept.
+     */
+    private void removeOrphanPages(List<JBangCommand> commands, List<JBangCommand> pluginCommands)
+            throws MojoExecutionException {
+        Set<String> pages = new HashSet<>();
+        pages.add("camel-jbang-commands.adoc");
+        collectDocFileNames(commands, pages);
+        collectDocFileNames(pluginCommands, pages);
+
+        Path dir = docDir.toPath().resolve("jbang-commands");
+        if (!Files.isDirectory(dir)) {
+            return;
+        }
+        try (Stream<Path> files = Files.list(dir)) {
+            for (Path file : files.filter(f -> f.getFileName().toString().endsWith(".adoc")).toList()) {
+                if (!pages.contains(file.getFileName().toString())
+                        && Files.readString(file).contains(AUTO_GENERATED_MARKER)) {
+                    Files.delete(file);
+                    getLog().info("Removed page of a command that no longer exists: " + file);
+                }
+            }
+        } catch (IOException e) {
+            throw new MojoExecutionException("Error removing orphan command pages", e);
+        }
+    }
+
+    private static void collectDocFileNames(List<JBangCommand> commands, Set<String> pages) {
+        for (JBangCommand cmd : commands) {
+            pages.add(cmd.getDocFileName());
+            collectDocFileNames(cmd.getSubcommands(), pages);
+        }
+    }
+
+    private static JBangCommandModel loadModel(File file) throws IOException {
+        return JsonMapper.generateJBangCommandModel(PackageHelper.loadText(file));
+    }
+
+    private void generateIndexPage(List<JBangCommand> commands, List<JBangCommand> pluginCommands)
+            throws MojoExecutionException {
         try (InputStream templateStream = getClass().getClassLoader().getResourceAsStream("jbang-commands.mvel")) {
             if (templateStream == null) {
                 throw new MojoExecutionException("Template jbang-commands.mvel not found");
@@ -117,7 +207,8 @@ public class PrepareCamelJBangCommandsDocMojo extends AbstractGeneratorMojo {
 
             String template = PackageHelper.loadText(templateStream);
             Map<String, Object> ctx = new HashMap<>();
-            ctx.put("commands", model.getCommands());
+            ctx.put("commands", commands);
+            ctx.put("pluginCommands", pluginCommands);
 
             String content
                     = (String) TemplateRuntime.eval(template, ctx, Collections.singletonMap("util", MvelHelper.INSTANCE));
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelJBangCommandsMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelJBangCommandsMojo.java
index 8a829c39e4c6..3e111e3a33b5 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelJBangCommandsMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelJBangCommandsMojo.java
@@ -52,14 +52,33 @@ import org.jboss.forge.roaster.model.source.JavaSource;
 
 /**
  * Prepares camel-jbang by scanning command classes and generating command metadata for documentation.
+ * <p>
+ * In camel-jbang-core the command hierarchy is read from {@code CamelJBangMain}, and in a camel-jbang plugin module
+ * from the {@code customize} method of the class annotated with {@code @CamelJBangPlugin}. A plugin writes its metadata
+ * to {@link #PLUGIN_METADATA_FILE}, so it does not shadow the metadata of camel-jbang-core on the classpath.
  */
 @Mojo(name = "prepare-jbang-commands", defaultPhase = LifecyclePhase.PROCESS_CLASSES, threadSafe = true,
       requiresDependencyResolution = ResolutionScope.COMPILE)
 public class PrepareCamelJBangCommandsMojo extends AbstractGeneratorMojo {
 
-    // Pattern to match .addSubcommand("name", new CommandLine(new ClassName(main)) or (this))
+    public static final String CORE_METADATA_FILE = "META-INF/camel-jbang-commands-metadata.json";
+    public static final String PLUGIN_METADATA_FILE = "META-INF/camel-jbang-plugin-commands-metadata.json";
+
+    // Pattern to match .addSubcommand("name", new CommandLine(new ClassName(main)) (with any constructor arguments)
     private static final Pattern SUBCOMMAND_PATTERN = Pattern.compile(
-            "\\.addSubcommand\\(\\s*\"([^\"]+)\"\\s*,\\s*new\\s+CommandLine\\(\\s*new\\s+([A-Za-z0-9_]+)\\s*\\(\\s*(?:main|this)\\s*\\)\\s*\\)");
+            "\\.addSubcommand\\(\\s*\"([^\"]+)\"\\s*,\\s*new\\s+CommandLine\\(\\s*new\\s+([A-Za-z0-9_]+)\\s*\\([^()]*\\)\\s*\\)");
+
+    // Pattern to match the plugin root command: commandLine.addSubcommand("name", ...)
+    private static final Pattern PLUGIN_ROOT_PATTERN = Pattern.compile(
+            "commandLine\\.addSubcommand\\(\\s*\"([^\"]+)\"\\s*,\\s*(.+)$");
+
+    // Pattern to match a command class created inline: new CommandLine(new ClassName(...)) or new ClassName(...)
+    private static final Pattern NEW_COMMAND_PATTERN = Pattern.compile(
+            "^new\\s+(?:CommandLine\\(\\s*new\\s+)?([A-Za-z0-9_]+)\\s*\\(");
+
+    // Pattern to match the name of a plugin: @CamelJBangPlugin(name = "camel-jbang-plugin-xxx"
+    private static final Pattern PLUGIN_NAME_PATTERN = Pattern.compile(
+            "@CamelJBangPlugin\\(\\s*name\\s*=\\s*\"camel-jbang-plugin-([^\"]+)\"");
 
     @Parameter(defaultValue = "${project.basedir}/src/generated/resources")
     protected File outFolder;
@@ -67,6 +86,12 @@ public class PrepareCamelJBangCommandsMojo extends AbstractGeneratorMojo {
     @Parameter(defaultValue = "${project.basedir}/src/main/java/org/apache/camel/dsl/jbang/core/commands")
     protected File commandsDir;
 
+    /**
+     * The commands of camel-jbang-core, where a plugin command may inherit its options from.
+     */
+    @Parameter(defaultValue = "${project.basedir}/../camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands")
+    protected File coreCommandsDir;
+
     @Inject
     public PrepareCamelJBangCommandsMojo(MavenProjectHelper projectHelper, BuildContext buildContext) {
         super(projectHelper, buildContext);
@@ -76,6 +101,9 @@ public class PrepareCamelJBangCommandsMojo extends AbstractGeneratorMojo {
     public void execute(MavenProject project) throws MojoFailureException, MojoExecutionException {
         outFolder = new File(project.getBasedir(), "src/generated/resources");
         commandsDir = new File(project.getBasedir(), "src/main/java/org/apache/camel/dsl/jbang/core/commands");
+        coreCommandsDir = new File(
+                project.getBasedir().getParentFile(),
+                "camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands");
         super.execute(project);
     }
 
@@ -91,12 +119,19 @@ public class PrepareCamelJBangCommandsMojo extends AbstractGeneratorMojo {
             Map<String, CommandInfo> commandsByClassName = new HashMap<>();
             scanCommandClasses(commandsDir, commandsByClassName);
 
-            // Step 2: Parse CamelJBangMain.java to get command hierarchy
+            // Step 2: Parse CamelJBangMain.java (core) or the plugin class to get command hierarchy
             File mainFile = new File(commandsDir, "CamelJBangMain.java");
             JBangCommandModel model = new JBangCommandModel();
+            String metadataFile = CORE_METADATA_FILE;
 
             if (mainFile.exists()) {
                 parseCommandHierarchy(mainFile, commandsByClassName, model);
+            } else {
+                File pluginFile = findPluginFile(commandsDir);
+                if (pluginFile != null) {
+                    parsePluginHierarchy(pluginFile, commandsByClassName, model);
+                    metadataFile = PLUGIN_METADATA_FILE;
+                }
             }
 
             if (!model.getCommands().isEmpty()) {
@@ -104,7 +139,7 @@ public class PrepareCamelJBangCommandsMojo extends AbstractGeneratorMojo {
                 sortCommandsRecursively(model.getCommands());
 
                 String json = JsonMapper.createJsonSchema(model);
-                updateResource(outFolder.toPath(), "META-INF/camel-jbang-commands-metadata.json", json);
+                updateResource(outFolder.toPath(), metadataFile, json);
                 getLog().info("Generated JBang commands metadata with " + countCommands(model) + " commands");
             }
         } catch (Exception e) {
@@ -180,76 +215,175 @@ public class PrepareCamelJBangCommandsMojo extends AbstractGeneratorMojo {
         Stack<ParentInfo> parentStack = new Stack<>();
 
         for (int i = startLine; i < lines.size(); i++) {
-            String line = lines.get(i);
-            String trimmedLine = line.trim();
+            String trimmedLine = lines.get(i).trim();
 
             // Check if we've reached the end of the chain
             if (trimmedLine.startsWith(".setParameterExceptionHandler") || trimmedLine.equals(";")) {
                 break;
             }
 
-            // Look for .addSubcommand pattern
-            Matcher matcher = SUBCOMMAND_PATTERN.matcher(trimmedLine);
-            if (matcher.find()) {
-                String cmdName = matcher.group(1);
-                String className = matcher.group(2);
+            processSubcommandLine(lines.get(i), parentStack, commandsByClassName, model, null);
+        }
+    }
 
-                CommandInfo info = commandsByClassName.get(className);
-                if (info == null) {
-                    getLog().debug("Command class not found: " + className);
-                    continue;
+    private void parsePluginHierarchy(
+            File pluginFile, Map<String, CommandInfo> commandsByClassName,
+            JBangCommandModel model)
+            throws IOException {
+
+        String source = Files.readString(pluginFile.toPath());
+        Matcher nameMatcher = PLUGIN_NAME_PATTERN.matcher(source);
+        if (!nameMatcher.find()) {
+            getLog().debug("No plugin name found in: " + pluginFile);
+            return;
+        }
+        String plugin = nameMatcher.group(1);
+
+        List<String> lines = Files.readAllLines(pluginFile.toPath());
+        for (String line : lines) {
+            Matcher matcher = PLUGIN_ROOT_PATTERN.matcher(line.trim());
+            if (!matcher.find()) {
+                continue;
+            }
+            String cmdName = matcher.group(1);
+            String target = matcher.group(2).trim();
+
+            Matcher newMatcher = NEW_COMMAND_PATTERN.matcher(target);
+            if (newMatcher.find()) {
+                // a command without subcommands: commandLine.addSubcommand("name", new Command(main))
+                CommandInfo info = commandsByClassName.get(newMatcher.group(1));
+                if (info != null && !info.hidden) {
+                    JBangCommand cmd = createCommand(info, cmdName, "");
+                    cmd.setPlugin(plugin);
+                    model.addCommand(cmd);
                 }
+                continue;
+            }
 
-                // Calculate indentation level (number of leading spaces)
-                int indent = 0;
-                for (char c : line.toCharArray()) {
-                    if (c == ' ') {
-                        indent++;
-                    } else if (c == '\t') {
-                        indent += 4;
-                    } else {
+            // a command with subcommands built as a variable: var cmd = new CommandLine(new Command(main))
+            String variable = target.replaceAll("[^A-Za-z0-9_].*$", "");
+            Pattern declaration = Pattern.compile(
+                    "\\b" + Pattern.quote(variable) + "\\s*=\\s*new\\s+CommandLine\\(\\s*new\\s+([A-Za-z0-9_]+)\\s*\\(");
+            for (int i = 0; i < lines.size(); i++) {
+                Matcher declMatcher = declaration.matcher(lines.get(i));
+                if (!declMatcher.find()) {
+                    continue;
+                }
+                CommandInfo info = commandsByClassName.get(declMatcher.group(1));
+                if (info == null || info.hidden) {
+                    break;
+                }
+                JBangCommand root = createCommand(info, cmdName, "");
+                root.setPlugin(plugin);
+                model.addCommand(root);
+
+                // the subcommands are chained to the declaration until the statement ends
+                Stack<ParentInfo> parentStack = new Stack<>();
+                parentStack.push(new ParentInfo(root, -1));
+                for (int j = i + 1; j < lines.size(); j++) {
+                    processSubcommandLine(lines.get(j), parentStack, commandsByClassName, model, plugin);
+                    if (lines.get(j).trim().endsWith(";")) {
                         break;
                     }
                 }
+                break;
+            }
+        }
+    }
 
-                // Pop parents that are at same or deeper indentation level
-                // This handles transitioning from subcommands back to parent level
-                while (!parentStack.isEmpty() && parentStack.peek().indent >= indent) {
-                    parentStack.pop();
-                }
-
-                // Determine parent path
-                String parentPath = "";
-                if (!parentStack.isEmpty()) {
-                    parentPath = parentStack.peek().command.getFullName();
-                }
+    private void processSubcommandLine(
+            String line, Stack<ParentInfo> parentStack, Map<String, CommandInfo> commandsByClassName,
+            JBangCommandModel model, String plugin) {
 
-                JBangCommand cmd = createCommand(info, cmdName, parentPath);
+        String trimmedLine = line.trim();
+        Matcher matcher = SUBCOMMAND_PATTERN.matcher(trimmedLine);
+        if (!matcher.find()) {
+            return;
+        }
+        String cmdName = matcher.group(1);
+        String className = matcher.group(2);
+
+        // Calculate indentation level (number of leading spaces)
+        int indent = 0;
+        for (char c : line.toCharArray()) {
+            if (c == ' ') {
+                indent++;
+            } else if (c == '\t') {
+                indent += 4;
+            } else {
+                break;
+            }
+        }
 
-                // Add to parent or model
-                if (parentStack.isEmpty()) {
-                    model.addCommand(cmd);
-                } else {
-                    parentStack.peek().command.addSubcommand(cmd);
-                }
+        // Pop parents that are at same or deeper indentation level
+        // This handles transitioning from subcommands back to parent level
+        while (!parentStack.isEmpty() && parentStack.peek().indent >= indent) {
+            parentStack.pop();
+        }
 
-                // Check if this command has subcommands by looking at the line ending
-                // Count closing parens at end of line
-                String lineEnd = trimmedLine.replaceAll("\\s+", "");
-                int closingParens = 0;
-                for (int j = lineEnd.length() - 1; j >= 0 && lineEnd.charAt(j) == ')'; j--) {
-                    closingParens++;
-                }
+        // Check if this command has subcommands by looking at the line ending
+        // Count closing parens at end of line
+        String lineEnd = trimmedLine.replaceAll("\\s+", "");
+        if (lineEnd.endsWith(";")) {
+            lineEnd = lineEnd.substring(0, lineEnd.length() - 1);
+        }
+        int closingParens = 0;
+        for (int j = lineEnd.length() - 1; j >= 0 && lineEnd.charAt(j) == ')'; j--) {
+            closingParens++;
+        }
+        // Pattern: .addSubcommand("x", new CommandLine(new X(main))
+        // - Ends with 2 parens ()) = has subcommands (CommandLine not closed)
+        // - Ends with 3 parens ())) = leaf command (closes CommandLine + addSubcommand)
+        boolean hasSubcommands = closingParens == 2;
 
-                // Pattern: .addSubcommand("x", new CommandLine(new X(main))
-                // - Ends with 2 parens ()) = has subcommands (CommandLine not closed)
-                // - Ends with 3 parens ())) = leaf command (closes CommandLine + addSubcommand)
-                if (closingParens == 2) {
-                    // This command may have subcommands - push onto stack
-                    parentStack.push(new ParentInfo(cmd, indent));
-                }
-                // If closingParens >= 3, it's a leaf command and doesn't have subcommands
+        CommandInfo info = commandsByClassName.get(className);
+        boolean parentSkipped = !parentStack.isEmpty() && parentStack.peek().command == null;
+        if (info == null || info.hidden || parentSkipped) {
+            if (info == null) {
+                getLog().debug("Command class not found: " + className);
+            }
+            if (hasSubcommands) {
+                // keep its subcommands out of the documentation as well
+                parentStack.push(new ParentInfo(null, indent));
             }
+            return;
+        }
+
+        // Determine parent path
+        String parentPath = "";
+        if (!parentStack.isEmpty()) {
+            parentPath = parentStack.peek().command.getFullName();
+        }
+
+        JBangCommand cmd = createCommand(info, cmdName, parentPath);
+        cmd.setPlugin(plugin);
+
+        // Add to parent or model
+        if (parentStack.isEmpty()) {
+            model.addCommand(cmd);
+        } else {
+            parentStack.peek().command.addSubcommand(cmd);
+        }
+
+        if (hasSubcommands) {
+            // This command may have subcommands - push onto stack
+            parentStack.push(new ParentInfo(cmd, indent));
+        }
+    }
+
+    private File findPluginFile(File dir) throws IOException {
+        try (Stream<Path> paths = Files.walk(dir.toPath())) {
+            return paths.filter(p -> p.toString().endsWith(".java"))
+                    .filter(p -> {
+                        try {
+                            return Files.readString(p).contains("@CamelJBangPlugin(");
+                        } catch (IOException e) {
+                            return false;
+                        }
+                    })
+                    .map(Path::toFile)
+                    .findFirst()
+                    .orElse(null);
         }
     }
 
@@ -330,6 +464,11 @@ public class PrepareCamelJBangCommandsMojo extends AbstractGeneratorMojo {
             info.deprecated = true;
         }
 
+        // Check for hidden
+        if ("true".equals(commandAnn.getStringValue("hidden"))) {
+            info.hidden = true;
+        }
+
         // Parse options from this class AND parent classes
         info.options = new ArrayList<>();
         parseOptionsFromClassHierarchy(clazz, info.options, file.getParentFile());
@@ -436,7 +575,13 @@ public class PrepareCamelJBangCommandsMojo extends AbstractGeneratorMojo {
         }
 
         // Search recursively from commands root
-        return findClassFileRecursive(commandsRoot, className);
+        File found = findClassFileRecursive(commandsRoot, className);
+        if (found == null && coreCommandsDir != null && coreCommandsDir.isDirectory()
+                && !coreCommandsDir.equals(commandsDir)) {
+            // a plugin command may extend a command of camel-jbang-core
+            found = findClassFileRecursive(coreCommandsDir, className);
+        }
+        return found;
     }
 
     private File findClassFileRecursive(File dir, String className) {
@@ -673,6 +818,7 @@ public class PrepareCamelJBangCommandsMojo extends AbstractGeneratorMojo {
         String name;
         String description;
         boolean deprecated;
+        boolean hidden;
         List<OptionInfo> options;
     }
 
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/resources/jbang-command-page.mvel b/tooling/maven/camel-package-maven-plugin/src/main/resources/jbang-command-page.mvel
index 527b64f7d894..f58923f0585f 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/resources/jbang-command-page.mvel
+++ b/tooling/maven/camel-package-maven-plugin/src/main/resources/jbang-command-page.mvel
@@ -17,7 +17,9 @@
 // AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE
 = camel @{command.fullName}
 
-@if{command.description != null}@{command.description}@end{}
+@if{command.description != null}@{command.description}@end{}@if{command.plugin != null}
+
+NOTE: This command is provided by the `@{command.plugin}` plugin. Install it with `camel plugin add @{command.plugin}`.@end{}
 @if{command.deprecated}
 
 CAUTION: This command is deprecated.@if{command.deprecationNote != null} @{command.deprecationNote}@end{}
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/resources/jbang-commands.mvel b/tooling/maven/camel-package-maven-plugin/src/main/resources/jbang-commands.mvel
index 264248f3a7e0..b91d090694d4 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/resources/jbang-commands.mvel
+++ b/tooling/maven/camel-package-maven-plugin/src/main/resources/jbang-commands.mvel
@@ -27,4 +27,14 @@ TIP: You can also use `camel --help` or `camel <command> --help` to see availabl
 |===
 | Command | Description
 @foreach{cmd : commands}| xref:@{cmd.docXref}[camel @{cmd.name}] | @if{cmd.description != null}@{cmd.description}@end{}
-@end{}|===
+@end{}|===@if{!pluginCommands.isEmpty()}
+
+== Plugin commands
+
+These commands are provided by plugins. A plugin is installed with `camel plugin add <plugin>`.
+
+[cols="2,1,5",options="header"]
+|===
+| Command | Plugin | Description
+@foreach{cmd : pluginCommands}| xref:@{cmd.docXref}[camel @{cmd.name}] | `@{cmd.plugin}` | @if{cmd.description != null}@{cmd.description}@end{}
+@end{}|===@end{}