mirror of
https://github.com/ultraworkers/claw-code.git
synced 2026-05-30 03:35:20 +08:00
fix: suppress config deprecation stderr in JSON mode globally (#824)
Add SUPPRESS_CONFIG_WARNINGS_STDERR AtomicBool flag in runtime/config.rs and expose suppress_config_warnings_for_json_mode() via runtime crate. In main.rs, scan raw argv for --output-format json before parse_args and activate the flag so no settings-load warnings reach stderr on any JSON-mode surface (status, sandbox, system-prompt, mcp list, skills list, agents list, --resume /config*, etc.). Text-mode surfaces are unaffected; prose deprecation warnings continue to appear on stderr. All 572+ tests pass (one pre-existing worker_boot failure unrelated).
This commit is contained in:
parent
f0e6671538
commit
de7edd5bb1
@ -10,7 +10,22 @@ use std::sync::Mutex;
|
|||||||
static EMITTED_CONFIG_WARNINGS: std::sync::OnceLock<Mutex<HashSet<String>>> =
|
static EMITTED_CONFIG_WARNINGS: std::sync::OnceLock<Mutex<HashSet<String>>> =
|
||||||
std::sync::OnceLock::new();
|
std::sync::OnceLock::new();
|
||||||
|
|
||||||
|
/// When set to `true`, `emit_config_warning_once` silently drops all prose
|
||||||
|
/// deprecation warnings instead of writing them to stderr. Set this flag
|
||||||
|
/// before any settings load when `--output-format json` is active so that
|
||||||
|
/// JSON-mode machine consumers see empty stderr on success. (#824)
|
||||||
|
static SUPPRESS_CONFIG_WARNINGS_STDERR: std::sync::atomic::AtomicBool =
|
||||||
|
std::sync::atomic::AtomicBool::new(false);
|
||||||
|
|
||||||
|
/// Call this once at startup when `--output-format json` is active.
|
||||||
|
pub fn suppress_config_warnings_for_json_mode() {
|
||||||
|
SUPPRESS_CONFIG_WARNINGS_STDERR.store(true, std::sync::atomic::Ordering::Relaxed);
|
||||||
|
}
|
||||||
|
|
||||||
fn emit_config_warning_once(warning: &str) {
|
fn emit_config_warning_once(warning: &str) {
|
||||||
|
if SUPPRESS_CONFIG_WARNINGS_STDERR.load(std::sync::atomic::Ordering::Relaxed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
let set = EMITTED_CONFIG_WARNINGS.get_or_init(|| Mutex::new(HashSet::new()));
|
let set = EMITTED_CONFIG_WARNINGS.get_or_init(|| Mutex::new(HashSet::new()));
|
||||||
let mut guard = set.lock().unwrap_or_else(|e| e.into_inner());
|
let mut guard = set.lock().unwrap_or_else(|e| e.into_inner());
|
||||||
if guard.insert(warning.to_string()) {
|
if guard.insert(warning.to_string()) {
|
||||||
|
|||||||
@ -65,12 +65,12 @@ pub use compact::{
|
|||||||
get_compact_continuation_message, should_compact, CompactionConfig, CompactionResult,
|
get_compact_continuation_message, should_compact, CompactionConfig, CompactionResult,
|
||||||
};
|
};
|
||||||
pub use config::{
|
pub use config::{
|
||||||
ConfigEntry, ConfigError, ConfigLoader, ConfigSource, McpConfigCollection,
|
suppress_config_warnings_for_json_mode, ConfigEntry, ConfigError, ConfigLoader, ConfigSource,
|
||||||
McpManagedProxyServerConfig, McpOAuthConfig, McpRemoteServerConfig, McpSdkServerConfig,
|
McpConfigCollection, McpManagedProxyServerConfig, McpOAuthConfig, McpRemoteServerConfig,
|
||||||
McpServerConfig, McpStdioServerConfig, McpTransport, McpWebSocketServerConfig, OAuthConfig,
|
McpSdkServerConfig, McpServerConfig, McpStdioServerConfig, McpTransport,
|
||||||
ProviderFallbackConfig, ResolvedPermissionMode, RuntimeConfig, RuntimeFeatureConfig,
|
McpWebSocketServerConfig, OAuthConfig, ProviderFallbackConfig, ResolvedPermissionMode,
|
||||||
RuntimeHookConfig, RuntimePermissionRuleConfig, RuntimePluginConfig, ScopedMcpServerConfig,
|
RuntimeConfig, RuntimeFeatureConfig, RuntimeHookConfig, RuntimePermissionRuleConfig,
|
||||||
CLAW_SETTINGS_SCHEMA_NAME,
|
RuntimePluginConfig, ScopedMcpServerConfig, CLAW_SETTINGS_SCHEMA_NAME,
|
||||||
};
|
};
|
||||||
pub use config_validate::{
|
pub use config_validate::{
|
||||||
check_unsupported_format, format_diagnostics, validate_config_file, ConfigDiagnostic,
|
check_unsupported_format, format_diagnostics, validate_config_file, ConfigDiagnostic,
|
||||||
|
|||||||
@ -532,6 +532,16 @@ fn plugin_load_failure_json(failure: &plugins::PluginLoadFailure) -> Value {
|
|||||||
|
|
||||||
fn run() -> Result<(), Box<dyn std::error::Error>> {
|
fn run() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let args: Vec<String> = env::args().skip(1).collect();
|
let args: Vec<String> = env::args().skip(1).collect();
|
||||||
|
// #824: suppress config deprecation prose warnings to stderr when JSON
|
||||||
|
// output mode is active. Scan the raw argv before parse_args so the
|
||||||
|
// suppression is in place before any settings file is loaded.
|
||||||
|
let json_mode = args
|
||||||
|
.windows(2)
|
||||||
|
.any(|w| w[0] == "--output-format" && w[1] == "json")
|
||||||
|
|| args.iter().any(|a| a == "--output-format=json");
|
||||||
|
if json_mode {
|
||||||
|
runtime::suppress_config_warnings_for_json_mode();
|
||||||
|
}
|
||||||
match parse_args(&args)? {
|
match parse_args(&args)? {
|
||||||
CliAction::DumpManifests {
|
CliAction::DumpManifests {
|
||||||
output_format,
|
output_format,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user