Claus Ibsen created CAMEL-25388:
-----------------------------------
Summary: camel-jbang - Make the Camel CLI reliable for AI agents
and scripts (exit codes, stderr, JSON, timeouts)
Key: CAMEL-25388
URL: https://issues.apache.org/jira/browse/CAMEL-25388
Project: Camel
Issue Type: Improvement
Components: camel-jbang
Reporter: Claus Ibsen
Assignee: Claus Ibsen
Fix For: 4.24.0
Attachments: camel-cli-agent-readiness-analysis.md
The Camel CLI is increasingly driven by AI agents, MCP tools, the TUI and
scripts. Today many commands exit 0 when they fail (no matching integration,
timeout waiting for the running integration, action rejected by the
integration), print errors to stdout (which corrupts {{--json}} output), and
hang forever without a TTY ({{--watch}}, {{log}}, {{receive}}, ...). Callers
work around this by scraping log/console text.
This umbrella makes the CLI reliable and machine-friendly.
h3. Agreed contract
||Exit code||Meaning||
|0|Success|
|1|Command ran, outcome negative (validation errors, doctor check failed,
integration rejected the action)|
|2|Usage error (picocli), or interactive-only command without a TTY|
|3|Not found: no matching integration/route/component/service, or ambiguous
match (message lists the matches)|
|4|Timeout: no reply from integration, background run still starting, process
did not stop|
|70|Internal error: unexpected exception (stack trace on stderr)|
|n|Child exit code passed through (run via mvn/jbang/java)|
* stdout carries data only; errors, warnings, tips and banners go to stderr.
* With {{--json}} stdout is exactly one JSON document: {{[]}} when empty,
{{\{"status":"error","code":N,"message":"..."\}}} on error (plus the same exit
code).
* No command blocks on stdin without a TTY.
* Behaviour changes are documented in the 4.24 upgrade guide.
h3. Root causes
* No central exception/exit-code mapping in {{CamelJBangMain}}.
* {{Printer.printErr}} writes to stdout.
* {{FileCliConnectorTransport}} drops action errors (the WebSocket transport
handles them).
* CLI uses the legacy shared {{<pid>-action.json}} file; timeouts return null
and exit 0.
* "No match" is not an error; numeric pids are trusted without a Camel status
file.
* Watch/follow loops only stop on a console line, so they never end without a
TTY.
* {{findPids}} exists in 6 diverged copies.
The sub-tasks are ordered; tech-debt work comes after the behaviour work.
_Claude Code on behalf of davsclaus (Claus Ibsen)_
--
This message was sent by Atlassian Jira
(v8.20.10#820010)