fix(config,cli): reject --resolved+--show-origin; drop dead ActiveContext.server

config view --resolved --show-origin silently dropped --show-origin; add clap
conflicts_with so the parser rejects the combo loudly. Remove the unused `server`
field from ActiveContext (parsed, always written None, never read) — server-qualified
active context is a V2/V3 concern; don't ship an unfulfilled field.
This commit is contained in:
Ragnor Comerford 2026-06-05 12:46:23 +02:00
parent c7c82beafb
commit 922666fc70
No known key found for this signature in database
3 changed files with 20 additions and 10 deletions

View file

@ -533,7 +533,7 @@ enum ConfigCommand {
#[arg(long)]
config: Option<PathBuf>,
/// Resolve the named graph (or `defaults.graph`) to its typed locator.
#[arg(long)]
#[arg(long, conflicts_with = "show_origin")]
resolved: bool,
/// Annotate each value with the layer (global/project) it came from.
#[arg(long = "show-origin")]
@ -3166,7 +3166,6 @@ async fn main() -> Result<()> {
resolved.resolve_graph(None, Some(&graph))?;
write_active_context(&ActiveContext {
graph: graph.clone(),
server: None,
})?;
println!("active graph set to '{graph}'");
}

View file

@ -371,6 +371,19 @@ fn config_view_resolved_prints_embedded_and_remote_locators() {
assert_eq!(remote["graph_id"], "prod");
}
#[test]
fn config_view_resolved_conflicts_with_show_origin() {
// The two modes are mutually exclusive; the parser rejects the combo loudly
// rather than silently dropping --show-origin.
output_failure(
cli()
.arg("config")
.arg("view")
.arg("--resolved")
.arg("--show-origin"),
);
}
#[test]
fn use_sets_active_graph_targeted_by_bare_commands() {
let graph_dir = tempdir().unwrap();

View file

@ -1072,14 +1072,13 @@ pub fn global_config_file() -> Option<PathBuf> {
}
/// The active context selected by `omnigraph use` — RFC-002 §5. A thin pointer to
/// the default graph (and optionally its server), written to
/// `<global>/state/active.yaml` and read as the `State` layer (between global and
/// project) so a bare command targets the active graph.
/// the default graph, written to `<global>/state/active.yaml` and read as the
/// `State` layer (between global and project) so a bare command targets the active
/// graph. (A default *server* belongs here too once server-qualified selection
/// lands in V2/V3 — not modeled now to avoid an unused field.)
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ActiveContext {
pub graph: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub server: Option<String>,
}
/// Path of the active-context state file (`<global>/state/active.yaml`).
@ -1100,9 +1099,8 @@ pub fn write_active_context(context: &ActiveContext) -> Result<()> {
}
/// Build the synthetic `State` layer config from an active-context file, if it
/// exists: a thin config whose only effect is setting `defaults.graph` (and, when
/// present, the default server). Marked not-loaded-from-file so it raises no
/// version/legacy warnings.
/// exists: a thin config whose only effect is setting `defaults.graph`. Marked
/// not-loaded-from-file so it raises no version/legacy warnings.
fn load_state_layer(path: &Path) -> Result<Option<OmnigraphConfig>> {
if !path.exists() {
return Ok(None);