mirror of
https://github.com/DeusData/codebase-memory-mcp.git
synced 2026-11-04 18:58:00 +00:00
feat(cli): accept flags, stdin, and --args-file for tools + per-tool --help (#680)
The CLI only accepted a single inline JSON argument (cbm cli <tool> '<json>'),
which PowerShell mangles on Windows and which made `cli <tool> --help` return
"repo_path is required" -- the "--help" token was parsed as the JSON args, and
there was no per-tool help at all.
run_cli now resolves tool arguments by precedence: --args-file <path>, a raw
JSON object (back-compat), --flag / --flag=value / bare-boolean flags, piped
stdin, then empty {}. Flags are converted to a JSON object via the tool's
input_schema: kebab-case keys map to snake_case, values are typed
(string/integer/boolean), and repeated flags accumulate into array-typed
properties (--semantic-query a --semantic-query b -> ["a","b"]). stdin and
--args-file are UTF-8-clean and bypass shell quoting entirely (the robust path
on Windows). `cli <tool> --help` prints usage + the tool's flags, generated
from the same input_schema the MCP tools/list advertises -- no hand-maintained
table.
cbm_mcp_tool_input_schema() exposes a tool's schema; cbm_cli_build_args_json()
and cbm_cli_print_tool_help() do the conversion and help.
Reproduce-first: 8 cli tests (string / integer-not-string / bare-boolean /
repeated-array / kebab->snake / --key=value with spaces / bad-positional-errors
/ help) -- RED on a stub, GREEN after. Full suite 5730/0.
Note: true CJK-path support on Windows still needs a UTF-8/wmain entry point
(argv is ANSI-codepage-mangled upstream of parsing); stdin/--args-file mitigate
it and are tracked separately.
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
This commit is contained in:
1 parent
f957dffa80
commit
3c2c12006f
6 files changed
+511
-1
No files matched your search
@@ -19,6 +19,22 @@ void cbm_cli_set_version(const char *ver);
|
||||
/* Get the version string. */
|
||||
const char *cbm_cli_get_version(void);
|
||||
|
||||
/* ── CLI tool arguments (flags / --args-file / --help) ────────── */
|
||||
|
||||
/* Convert `--flag value` / `--flag=value` / bare-boolean `--flag` arguments for
|
||||
* a tool into a JSON arguments object string, using the tool's input_schema to
|
||||
* type values (string/integer/boolean) and to collect repeated flags into
|
||||
* array-typed properties. kebab-case flags map to snake_case keys
|
||||
* (--repo-path -> repo_path). A bare `--` ends flag parsing. On error returns
|
||||
* NULL and, if err_out is non-NULL, sets *err_out to a heap message the caller
|
||||
* must free. Caller frees the returned JSON string. */
|
||||
char *cbm_cli_build_args_json(const char *tool_name, int argc, char **argv, char **err_out);
|
||||
|
||||
/* Print per-tool help (usage + the tool's flags with type/description/required)
|
||||
* derived from its input_schema, to stdout. Returns 0 if the tool is known,
|
||||
* non-zero (and prints nothing) if it is not. */
|
||||
int cbm_cli_print_tool_help(const char *tool_name);
|
||||
|
||||
/* ── Self-update: version comparison ──────────────────────────── */
|
||||
|
||||
/* Compare two semver strings (e.g. "0.2.1" vs "0.2.0").
|
||||
|
||||
Reference in new issue
Block a user