From c1122522946ae422ad6828c24dec948579dec450 Mon Sep 17 00:00:00 2001 From: JeremyDev87 Date: Sat, 9 May 2026 10:30:49 +0900 Subject: [PATCH] =?UTF-8?q?feat(cli):=20=EB=B2=84=EC=A0=84=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EA=B3=84=EC=95=BD=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 루트 CLI에서 --version/-V를 처리하고 npm package version 기준 출력 계약을 테스트합니다. Closes #82 --- crates/kratos-cli/src/lib.rs | 16 ++++++++++++++++ crates/kratos-cli/tests/cli_smoke.rs | 24 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/crates/kratos-cli/src/lib.rs b/crates/kratos-cli/src/lib.rs index b2fb669..7c823fe 100644 --- a/crates/kratos-cli/src/lib.rs +++ b/crates/kratos-cli/src/lib.rs @@ -31,6 +31,10 @@ fn run( let argv = &args[1..]; match command.as_str() { + "--version" | "-V" => { + commands::write_output(stdout, &format!("kratos {}", package_version()))?; + Ok(0) + } "--help" | "-h" | "help" => { commands::write_output(stdout, &commands::format_root_help())?; Ok(0) @@ -42,3 +46,15 @@ fn run( } } } + +fn package_version() -> String { + serde_json::from_str::(include_str!("../../../package.json")) + .ok() + .and_then(|manifest| { + manifest + .get("version") + .and_then(serde_json::Value::as_str) + .map(str::to_owned) + }) + .unwrap_or_else(|| env!("CARGO_PKG_VERSION").to_string()) +} diff --git a/crates/kratos-cli/tests/cli_smoke.rs b/crates/kratos-cli/tests/cli_smoke.rs index 602499c..e5fafca 100644 --- a/crates/kratos-cli/tests/cli_smoke.rs +++ b/crates/kratos-cli/tests/cli_smoke.rs @@ -14,6 +14,30 @@ fn root_help_matches_expected_shape() { ); } +#[test] +fn root_version_flags_print_package_version() { + for flag in ["--version", "-V"] { + let output = run_cli(&[flag]); + + assert!(output.status.success(), "{flag} should exit successfully"); + assert_eq!( + String::from_utf8_lossy(&output.stdout), + format!("kratos {}\n", package_version()) + ); + assert!(output.stderr.is_empty(), "{flag} should not print stderr"); + } +} + +fn package_version() -> String { + let manifest: serde_json::Value = + serde_json::from_str(include_str!("../../../package.json")).expect("valid package.json"); + manifest + .get("version") + .and_then(serde_json::Value::as_str) + .expect("package.json version") + .to_string() +} + #[test] fn command_help_matches_korean_policy() { let output = run_cli(&["clean", "--help"]);