diff --git a/crates/aura-cli/src/research_docs.rs b/crates/aura-cli/src/research_docs.rs index 44b4912..8b4cb02 100644 --- a/crates/aura-cli/src/research_docs.rs +++ b/crates/aura-cli/src/research_docs.rs @@ -250,6 +250,15 @@ fn validate_process_file(file: &PathBuf) -> Result<(), String> { } fn register_process(file: &PathBuf, env: &Env) -> Result<(), String> { + if env.provenance().is_none() { + let cwd = std::env::current_dir() + .map(|d| d.display().to_string()) + .unwrap_or_default(); + return Err(format!( + "process register needs a project: the document store lives under the \ + project store root (no Aura.toml found up from {cwd})" + )); + } let doc = parse_valid_process(file) .map_err(|m| format!("refusing to register: {m}"))?; let canonical = process_to_json(&doc); @@ -580,6 +589,15 @@ fn validate_campaign_file(file: &PathBuf, env: &Env) -> Result<(), String> { } fn register_campaign(file: &PathBuf, env: &Env) -> Result<(), String> { + if env.provenance().is_none() { + let cwd = std::env::current_dir() + .map(|d| d.display().to_string()) + .unwrap_or_default(); + return Err(format!( + "campaign register needs a project: the document store lives under the \ + project store root (no Aura.toml found up from {cwd})" + )); + } let doc = parse_valid_campaign(file) .map_err(|m| format!("refusing to register: {m}"))?; let canonical = campaign_to_json(&doc); diff --git a/crates/aura-cli/tests/research_docs.rs b/crates/aura-cli/tests/research_docs.rs index 7b4ef46..a251532 100644 --- a/crates/aura-cli/tests/research_docs.rs +++ b/crates/aura-cli/tests/research_docs.rs @@ -282,7 +282,8 @@ fn process_introspect_metrics_plus_another_mode_is_usage_exit_2() { #[test] fn process_register_stores_content_addressed_under_runs_root() { - let dir = temp_cwd("process-register"); + // #305: register needs a project (the show/runs guard family). + let (dir, _fixture) = fresh_project(); write_doc(&dir, "p.process.json", PROCESS_DOC); let (out, code) = run_code_in(&dir, &["process", "register", "p.process.json"]); assert_eq!(code, Some(0), "stdout/stderr: {out}"); @@ -1067,7 +1068,8 @@ fn campaign_introspect_content_id_prints_hash() { #[test] fn campaign_register_stores_content_addressed_under_runs_root() { - let dir = temp_cwd("campaign-register"); + // #305: register needs a project (the show/runs guard family). + let (dir, _fixture) = fresh_project(); write_doc(&dir, "c.campaign.json", CAMPAIGN_DOC); let (out, code) = run_code_in(&dir, &["campaign", "register", "c.campaign.json"]); assert_eq!(code, Some(0), "stdout/stderr: {out}"); @@ -1202,7 +1204,8 @@ fn wrong_kind_refusal_names_the_kind_key() { /// have already made. #[test] fn campaign_register_refuses_invalid_document_and_writes_nothing() { - let dir = temp_cwd("campaign-register-invalid"); + // #305: register needs a project (the show/runs guard family). + let (dir, _fixture) = fresh_project(); let bad = CAMPAIGN_DOC.replacen(r#""values": [8]"#, r#""values": []"#, 1); write_doc(&dir, "bad.campaign.json", &bad); let (out, code) = run_code_in(&dir, &["campaign", "register", "bad.campaign.json"]); @@ -1223,7 +1226,8 @@ fn campaign_register_refuses_invalid_document_and_writes_nothing() { /// would silently persist an unenforceable risk regime. #[test] fn campaign_register_refuses_invalid_risk_section_and_writes_nothing() { - let dir = temp_cwd("campaign-register-invalid-risk"); + // #305: register needs a project (the show/runs guard family). + let (dir, _fixture) = fresh_project(); let bad = CAMPAIGN_DOC.replacen( "\"seed\": 1,", "\"seed\": 1,\n \"risk\": [ { \"vol\": { \"length\": 0, \"k\": 2.0 } } ],", @@ -1250,7 +1254,8 @@ fn campaign_register_refuses_invalid_risk_section_and_writes_nothing() { /// precedent). #[test] fn campaign_register_refuses_invalid_cost_section_and_writes_nothing() { - let dir = temp_cwd("campaign-register-invalid-cost"); + // #305: register needs a project (the show/runs guard family). + let (dir, _fixture) = fresh_project(); let bad = CAMPAIGN_DOC.replacen( "\"seed\": 1,", "\"seed\": 1,\n \"cost\": [ { \"constant\": { \"cost_per_trade\": -2.0 } } ],",