Merge pull request #19 from Hmbown/codex/release-0.4.7

release: deepseek-tui 0.4.7 + Devin .env empty-key fix
This commit is contained in:
Hunter Bown
2026-04-25 08:04:10 -05:00
5 changed files with 53 additions and 18 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
# DeepSeek API (default provider) # DeepSeek API (default provider)
# Get an API key from DeepSeek, then keep it local in `.env`. # Get an API key from DeepSeek, then keep it local in `.env`.
DEEPSEEK_API_KEY= # DEEPSEEK_API_KEY=
# Global endpoint: # Global endpoint:
# DEEPSEEK_BASE_URL=https://api.deepseek.com # DEEPSEEK_BASE_URL=https://api.deepseek.com
Generated
+13 -13
View File
@@ -806,7 +806,7 @@ dependencies = [
[[package]] [[package]]
name = "deepseek-agent" name = "deepseek-agent"
version = "0.4.6" version = "0.4.7"
dependencies = [ dependencies = [
"deepseek-config", "deepseek-config",
"serde", "serde",
@@ -814,7 +814,7 @@ dependencies = [
[[package]] [[package]]
name = "deepseek-app-server" name = "deepseek-app-server"
version = "0.4.6" version = "0.4.7"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"axum", "axum",
@@ -837,7 +837,7 @@ dependencies = [
[[package]] [[package]]
name = "deepseek-config" name = "deepseek-config"
version = "0.4.6" version = "0.4.7"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"dirs", "dirs",
@@ -848,7 +848,7 @@ dependencies = [
[[package]] [[package]]
name = "deepseek-core" name = "deepseek-core"
version = "0.4.6" version = "0.4.7"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"chrono", "chrono",
@@ -867,7 +867,7 @@ dependencies = [
[[package]] [[package]]
name = "deepseek-execpolicy" name = "deepseek-execpolicy"
version = "0.4.6" version = "0.4.7"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"deepseek-protocol", "deepseek-protocol",
@@ -876,7 +876,7 @@ dependencies = [
[[package]] [[package]]
name = "deepseek-hooks" name = "deepseek-hooks"
version = "0.4.6" version = "0.4.7"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async-trait", "async-trait",
@@ -890,7 +890,7 @@ dependencies = [
[[package]] [[package]]
name = "deepseek-mcp" name = "deepseek-mcp"
version = "0.4.6" version = "0.4.7"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"deepseek-protocol", "deepseek-protocol",
@@ -900,7 +900,7 @@ dependencies = [
[[package]] [[package]]
name = "deepseek-protocol" name = "deepseek-protocol"
version = "0.4.6" version = "0.4.7"
dependencies = [ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
@@ -908,7 +908,7 @@ dependencies = [
[[package]] [[package]]
name = "deepseek-state" name = "deepseek-state"
version = "0.4.6" version = "0.4.7"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"chrono", "chrono",
@@ -920,7 +920,7 @@ dependencies = [
[[package]] [[package]]
name = "deepseek-tools" name = "deepseek-tools"
version = "0.4.6" version = "0.4.7"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async-trait", "async-trait",
@@ -933,7 +933,7 @@ dependencies = [
[[package]] [[package]]
name = "deepseek-tui" name = "deepseek-tui"
version = "0.4.6" version = "0.4.7"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"arboard", "arboard",
@@ -987,7 +987,7 @@ dependencies = [
[[package]] [[package]]
name = "deepseek-tui-cli" name = "deepseek-tui-cli"
version = "0.4.6" version = "0.4.7"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"chrono", "chrono",
@@ -1005,7 +1005,7 @@ dependencies = [
[[package]] [[package]]
name = "deepseek-tui-core" name = "deepseek-tui-core"
version = "0.4.6" version = "0.4.7"
[[package]] [[package]]
name = "deranged" name = "deranged"
+1 -1
View File
@@ -18,7 +18,7 @@ default-members = ["crates/cli", "crates/app-server", "crates/tui"]
resolver = "2" resolver = "2"
[workspace.package] [workspace.package]
version = "0.4.6" version = "0.4.7"
edition = "2024" edition = "2024"
license = "MIT" license = "MIT"
repository = "https://github.com/Hmbown/DeepSeek-TUI" repository = "https://github.com/Hmbown/DeepSeek-TUI"
+36 -1
View File
@@ -728,7 +728,9 @@ fn apply_env_overrides(config: &mut Config) {
if let Ok(value) = std::env::var("DEEPSEEK_PROVIDER") { if let Ok(value) = std::env::var("DEEPSEEK_PROVIDER") {
config.provider = Some(value); config.provider = Some(value);
} }
if let Ok(value) = std::env::var("DEEPSEEK_API_KEY") { if let Ok(value) = std::env::var("DEEPSEEK_API_KEY")
&& !value.trim().is_empty()
{
config.api_key = Some(value); config.api_key = Some(value);
} }
if let Ok(value) = std::env::var("DEEPSEEK_BASE_URL") { if let Ok(value) = std::env::var("DEEPSEEK_BASE_URL") {
@@ -1554,6 +1556,39 @@ mod tests {
Ok(()) Ok(())
} }
#[test]
fn apply_env_overrides_ignores_empty_api_key() -> Result<()> {
let _lock = lock_test_env();
let nanos = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_nanos();
let temp_root = env::temp_dir().join(format!(
"deepseek-tui-empty-key-{}-{}",
std::process::id(),
nanos
));
fs::create_dir_all(&temp_root)?;
let _guard = EnvGuard::new(&temp_root);
// Simulate a fresh user who copied .env.example to .env without
// filling in DEEPSEEK_API_KEY: dotenv loads it as the empty string.
// Safety: test-only environment mutation guarded by a global mutex.
unsafe {
env::set_var("DEEPSEEK_API_KEY", "");
}
let mut config = Config {
api_key: Some("from-config-file".to_string()),
..Default::default()
};
apply_env_overrides(&mut config);
assert_eq!(config.api_key.as_deref(), Some("from-config-file"));
config.validate()?;
Ok(())
}
#[test] #[test]
fn normalize_model_name_handles_aliases_and_future_ids() { fn normalize_model_name_handles_aliases_and_future_ids() {
assert_eq!( assert_eq!(
+2 -2
View File
@@ -1,7 +1,7 @@
{ {
"name": "deepseek-tui", "name": "deepseek-tui",
"version": "0.4.6", "version": "0.4.7",
"deepseekBinaryVersion": "0.4.6", "deepseekBinaryVersion": "0.4.7",
"description": "Install and run deepseek and deepseek-tui binaries from GitHub release artifacts.", "description": "Install and run deepseek and deepseek-tui binaries from GitHub release artifacts.",
"author": "Hmbown", "author": "Hmbown",
"license": "MIT", "license": "MIT",