Skip to content

Commit c6dc23e

Browse files
committed
feat: split secrets into secret.toml
1 parent 51244d6 commit c6dc23e

3 files changed

Lines changed: 16 additions & 17 deletions

File tree

src/config/loader.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,20 +51,33 @@ fn load_providers_data() -> anyhow::Result<HashMap<String, ProviderBaseUrl>> {
5151
pub fn load_config() -> anyhow::Result<PieConfig> {
5252
let global_home = pie_home();
5353
let global = global_home.join("pie.toml");
54+
let secrets = global_home.join("secrets.toml");
5455
let project_root = git_repo_root().map(PathBuf::from);
5556
let project_pie = project_root
5657
.as_ref()
5758
.map(|root| root.join(".pie").join("pie.toml"));
5859

5960
let mut figment = Figment::new().merge(Toml::file_exact(global));
61+
if secrets.exists() {
62+
figment = figment.merge(Toml::file_exact(secrets));
63+
}
6064
if let Some(p) = project_pie.filter(|p| p.exists()) {
6165
figment = figment.merge(Toml::file_exact(p));
6266
}
6367

64-
let pie_config: PieConfig = figment
68+
let mut pie_config: PieConfig = figment
6569
.extract()
6670
.map_err(|e| anyhow::anyhow!("config parse error: {e}"))?;
6771

72+
for provider in pie_config.provider.values_mut() {
73+
if let Some(ref api_key) = provider.api_key {
74+
let secret_str = api_key.expose_secret();
75+
if let Some(val) = pie_config.secrets.get(secret_str) {
76+
provider.api_key = Some(val.clone());
77+
}
78+
}
79+
}
80+
6881
Ok(pie_config)
6982
}
7083

src/config/types.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ pub struct PieConfig {
141141
#[serde(default)]
142142
pub provider: HashMap<String, ProviderConfig>,
143143
#[serde(default)]
144+
pub secrets: HashMap<String, Secret<String>>,
145+
#[serde(default)]
144146
pub model: HashMap<String, ModelTier>,
145147
pub agent: Option<GlobalAgentConfig>,
146148
pub sandbox: Option<SandboxConfig>,

src/prompt.rs

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -325,22 +325,6 @@ mod tests {
325325
assert!(result.contains("/test/project"), "pwd must appear");
326326
}
327327

328-
#[tokio::test]
329-
async fn json_output_mode_injected_when_enabled() {
330-
let with = render_main(&[], OutputMode::Json).await;
331-
let without = render_main(&[], OutputMode::Md).await;
332-
assert!(
333-
with.contains("JSON Output Mode"),
334-
"json output mode must appear when enabled"
335-
);
336-
assert!(
337-
!without.contains("JSON Output Mode"),
338-
"json output mode must not appear when disabled"
339-
);
340-
}
341-
342-
// ── Template integrity ─────────────────────────────────────────
343-
344328
#[tokio::test]
345329
async fn all_template_variables_resolve() {
346330
let result = render_main(&[skill("bash", "commands", "content")], OutputMode::Md).await;

0 commit comments

Comments
 (0)