Guillaume Nodet created CAMEL-23236:
---------------------------------------

             Summary: camel-jbang - Improve beginner UX with interactive init, 
top-level doc, and contextual shell help
                 Key: CAMEL-23236
                 URL: https://issues.apache.org/jira/browse/CAMEL-23236
             Project: Camel
          Issue Type: Improvement
          Components: camel-jbang
            Reporter: Guillaume Nodet


h2. Overview

This is an umbrella improvement to make the Camel JBang CLI more approachable 
for beginners. The current CLI is powerful but assumes users already know what 
they want — component names, template file extensions, command hierarchy. These 
changes reduce the "I don't know where to start" friction without compromising 
the experience for power users.

*Key principles:*
* _Opt-in interactivity_ — interactive features only activate when no arguments 
are given; scripted/CI usage is never affected
* _Don't reinvent_ — build on existing infrastructure (CatalogDoc, 
SuggestSimilarHelper, JLine 4 ShellBuilder, plugin system)
* _Keep commands flat_ — prefer top-level aliases over deeply nested subcommands

h2. Detailed Plan

h3. 1. {{camel doc}} as a top-level alias (trivial)

{{camel catalog doc kafka}} already works and is comprehensive (URI syntax, 
path/query params, dependencies, "did you mean?" fuzzy matching, {{--open-url}} 
for browser). The problem is discoverability — beginners don't think to look 
under {{catalog}}.

*Change:* Register {{CatalogDoc}} as a top-level subcommand {{doc}} in 
{{CamelJBangMain}}, in addition to its existing location under {{catalog}}. 
This is a ~5-line change.

*Optionally:* Add a {{--example}} flag that prints a minimal working route 
snippet for the given component (e.g., a timer-to-log YAML route for the 
{{timer}} component). Data can come from the catalog or curated snippets.

h3. 2. Context-aware shell banner (low effort)

The shell already prints a banner on startup ("Apache Camel JBang Shell 
v4.19.0"). Make it context-aware:

{code}
Apache Camel JBang Shell v4.19.0
No routes found in current directory.
  Quick start:  init MyRoute.yaml && run *
  Templates:    init --list
  Docs:         doc <component>
  Need help?    help
{code}

When routes *are* present, show a different hint:
{code}
Apache Camel JBang Shell v4.19.0
Found 3 routes in current directory.
  Run:   run *
  Watch: run * --dev
{code}

This replaces the idea of a first-run wizard — it's non-blocking, informative, 
and doesn't interrupt experienced users. Implementation lives in 
{{Shell.printBanner()}}.

h3. 3. Interactive {{camel init}} template picker (medium effort)

When {{camel init}} is invoked with *no arguments* in an interactive terminal, 
show an interactive template picker using JLine instead of printing an error.

*Behavior:*
* Present categories (Routes, Kamelets, Pipes, REST) with numbered options
* User picks a category, then a template
* Prompt for filename
* Generate the file and print "Next steps" instructions

*Non-interactive behavior is unchanged:* {{camel init MyRoute.yaml}} works 
exactly as before. The interactive picker is only triggered when: no positional 
arg is given AND stdin is a TTY AND not in CI.

*Consider also:* Recipe-style templates that produce working examples (e.g., 
"timer to log", "REST API with mock data", "file polling to Kafka") rather than 
empty scaffolds. These would be additional {{.tmpl}} files selected through the 
picker.

h3. 4. {{camel run --example}} — zero to running in one command (medium effort)

Allow running built-in examples without creating any files first:

{code}
camel run --example timer-log
camel run --example rest-api
camel run --example file-to-kafka
{code}

This is the absolute fastest on-ramp for beginners. Internally, these are 
bundled route files (YAML or Java) that are extracted to a temp directory and 
run. Combine with {{--dev}} mode for a "playground" experience.

{{camel run --example --list}} would show available examples.

h3. 5. Extend "did you mean?" to more commands (low effort)

{{SuggestSimilarHelper}} is already used in {{CatalogDoc}} for fuzzy matching 
component/kamelet names. Extend its usage to:
* {{camel run}} — when a component fails to resolve at runtime
* {{camel get component <name>}} — when querying a non-existent component
* Any other command that takes component/kamelet names as arguments

h3. 6. {{camel doctor}} diagnostic command (medium effort)

A diagnostic command that checks the environment and reports issues:

{code}
camel doctor

  Java:        21.0.2 (OK)
  JBang:       0.119.0 (OK)
  Camel:       4.19.0
  Maven:       reachable (OK)
  Docker:      running (OK)
  Disk space:  OK
  Known issues: none
{code}

Checks to include:
* Java version (21+ required)
* JBang version
* Maven central reachability
* Docker daemon status (relevant for testcontainers)
* Common port conflicts (8080, etc.)
* Disk space in temp/cache directories

h3. 7. Camel-Kit discoverability (low effort)

camel-kit already works as a plugin ({{camel plugin add kit --gav 
io.github.luigidemasi:camel-jbang-plugin-kit:0.3.1}}). The problem is no one 
knows it exists.

*Changes:*
* Add a mention in {{camel init --help}} footer: "Tip: For AI-assisted project 
scaffolding, try: camel plugin add kit"
* Mention in the shell banner when no routes are detected
* Consider adding {{kit}} to the {{PluginType}} enum so {{camel plugin get 
--all}} shows it as a known plugin

*Do NOT bundle camel-kit* as a built-in dependency — it's an external project. 
Keep the loose coupling via the plugin system.

h2. Implementation Order

||Priority||Item||Effort||Impact||
|1|{{camel doc}} top-level alias|Trivial|High|
|2|Context-aware shell banner|Low|High|
|3|Interactive {{camel init}} picker|Medium|High|
|4|{{camel run --example}}|Medium|Very High|
|5|Extend "did you mean?" suggestions|Low|Medium|
|6|{{camel doctor}} command|Medium|Medium|
|7|Camel-Kit discoverability|Low|Medium|

Items 1-2 can be done in a single PR. Items 3-4 are the highest-impact changes 
and could be separate PRs. Items 5-7 are incremental improvements.

h2. Related

* PR [#22193|https://github.com/apache/camel/pull/22193] — Adds example usage 
snippets to CLI help text (complements this work)
* PR [#22197|https://github.com/apache/camel/pull/22197] — TUI dashboards 
(camel monitor, camel catalog-tui)
* [camel-kit|https://github.com/luigidemasi/camel-kit] — AI-assisted Camel 
development plugin



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to