Skip to content

Commit ced6d9c

Browse files
committed
rebrand: OpenCoven/coven-codes fork of Claurst (GPL-3.0)
Derived from Kuberwastaken/claurst v0.1.4 under GPL-3.0. Full license and copyright preserved in LICENSE.md. Attribution added in ATTRIBUTION.md. User-visible changes only: - Product name: Claurst → Coven Code - Binary: claurst → coven-code - npm package: claurst → @opencoven/coven-code - Data/cache dirs: ~/.local/share/claurst → coven-code - Env var prefix: CLAURST_ → COVEN_CODE_ - User-Agent: Claurst/x.y → CovenCode/x.y - System prompt: removed Anthropic official CLI claim; now identifies as OpenCoven fork of Claurst - System prompt test: updated assertion to match new identity string - Workspace author: Claurst → OpenCoven (based on Claurst by Kuber Mehta) Internal crate names (claurst-core, claurst-tui, etc.) unchanged. Pre-existing keybinding test failures (ctrl+c binding) unchanged from upstream. cargo check: clean (38.77s) cargo test -p claurst-core: 422 passed, 2 failed (pre-existing upstream failures)
1 parent d85747b commit ced6d9c

52 files changed

Lines changed: 392 additions & 368 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

ATTRIBUTION.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Attribution
2+
3+
**Coven Code** is a GPL-3.0 derivative of [Claurst](https://github.com/Kuberwastaken/claurst)
4+
by Kuber Mehta / Kuberwastaken, licensed under the GNU General Public License v3.0.
5+
6+
The original Claurst license is preserved in full in `LICENSE.md`.
7+
8+
## Changes from upstream (Claurst)
9+
10+
- Product name rebranded to **Coven Code** (`coven-code` binary)
11+
- npm package renamed to `@opencoven/coven-code`
12+
- Data/cache directories changed from `claurst/``coven-code/`
13+
- Environment variable prefix changed from `CLAURST_``COVEN_CODE_`
14+
- User-Agent strings updated
15+
- System prompt identity updated to reflect OpenCoven fork
16+
- Repository and homepage URLs updated to reflect OpenCoven fork
17+
18+
All original copyright notices, the GPL-3.0 license text, and upstream attribution
19+
remain intact and unmodified. Source code is available at:
20+
https://github.com/OpenCoven/coven-codes
21+
22+
This fork is maintained by OpenCoven / Valentina (Soul Protocol LLC).

npm/package.json

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,38 @@
11
{
2-
"name": "claurst",
2+
"name": "@opencoven/coven-code",
33
"version": "0.1.4",
4-
"description": "Open-source, multi-provider terminal coding agent built in Rust",
4+
"description": "Open-source, multi-provider agentic coding TUI for the terminal — OpenCoven fork of Claurst",
55
"license": "GPL-3.0-only",
66
"repository": {
77
"type": "git",
8-
"url": "git+https://github.com/Kuberwastaken/claurst.git"
8+
"url": "git+https://github.com/OpenCoven/coven-codes.git"
99
},
10-
"homepage": "https://claurst.kuber.studio",
10+
"homepage": "https://opencoven.ai",
1111
"bugs": {
12-
"url": "https://github.com/kuberwastaken/claurst/issues"
12+
"url": "https://github.com/OpenCoven/coven-codes/issues"
1313
},
1414
"keywords": [
1515
"ai",
1616
"coding-agent",
17-
"claude",
18-
"anthropic",
19-
"terminal",
2017
"tui",
21-
"rust"
18+
"rust",
19+
"coven",
20+
"opencoven",
21+
"terminal",
22+
"agentic"
2223
],
23-
"author": "Kuber Mehta",
24+
"author": "OpenCoven (based on Claurst by Kuber Mehta)",
2425
"bin": {
25-
"claurst": "bin/claurst"
26+
"coven-code": "bin/claurst"
2627
},
2728
"scripts": {
2829
"postinstall": "node install.js"
2930
},
3031
"files": [
3132
"bin/",
3233
"install.js",
33-
"README.md"
34+
"README.md",
35+
"ATTRIBUTION.md"
3436
],
3537
"engines": {
3638
"node": ">=16"

src-rust/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ members = [
1818
[workspace.package]
1919
version = "0.1.4"
2020
edition = "2021"
21-
authors = ["Claurst"]
21+
authors = ["OpenCoven (based on Claurst by Kuber Mehta)"]
2222
license = "GPL-3.0"
2323

2424
[workspace.dependencies]

src-rust/crates/acp/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ fn install_stderr_tracing() {
8484
use tracing_subscriber::{fmt, EnvFilter};
8585
let _ = fmt()
8686
.with_env_filter(
87-
EnvFilter::try_from_env("CLAURST_ACP_LOG").unwrap_or_else(|_| EnvFilter::new("warn")),
87+
EnvFilter::try_from_env("COVEN_CODE_ACP_LOG").unwrap_or_else(|_| EnvFilter::new("warn")),
8888
)
8989
.with_writer(std::io::stderr)
9090
.try_init();

src-rust/crates/api/src/model_registry.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
// (refreshed by `refresh_from_models_dev()` once it has run).
1010
// 4. `refresh_from_models_dev()` fetches the latest catalog from
1111
// `https://models.dev/api.json` (overridable via `MODELS_DEV_URL` /
12-
// `CLAURST_MODELS_URL`) and writes it back to the on-disk cache.
12+
// `COVEN_CODE_MODELS_URL`) and writes it back to the on-disk cache.
1313
//
1414
// **No more hardcoded per-provider model lists.** All metadata —
1515
// modalities, pricing, release date, capability flags, npm SDK package —
@@ -72,7 +72,7 @@ impl ModelStatus {
7272
/// Whether to surface this model in default UI listings.
7373
///
7474
/// Alpha/deprecated models are hidden unless
75-
/// `CLAURST_ENABLE_EXPERIMENTAL_MODELS=1`.
75+
/// `COVEN_CODE_ENABLE_EXPERIMENTAL_MODELS=1`.
7676
pub fn is_listed_by_default(self) -> bool {
7777
matches!(self, ModelStatus::Active | ModelStatus::Beta)
7878
}
@@ -710,10 +710,10 @@ impl ModelRegistry {
710710
/// List models for a provider, filtered to those that should appear in
711711
/// default UI listings (active/beta only — no alpha or deprecated).
712712
///
713-
/// Set the `CLAURST_ENABLE_EXPERIMENTAL_MODELS=1` env var to also include
713+
/// Set the `COVEN_CODE_ENABLE_EXPERIMENTAL_MODELS=1` env var to also include
714714
/// alpha/deprecated entries.
715715
pub fn list_visible_by_provider(&self, provider_id: &str) -> Vec<&ModelEntry> {
716-
let show_all = std::env::var("CLAURST_ENABLE_EXPERIMENTAL_MODELS")
716+
let show_all = std::env::var("COVEN_CODE_ENABLE_EXPERIMENTAL_MODELS")
717717
.map(|v| v == "1" || v.eq_ignore_ascii_case("true"))
718718
.unwrap_or(false);
719719
self.list_by_provider(provider_id)
@@ -856,7 +856,7 @@ impl ModelRegistry {
856856

857857
/// Resolve the models.dev source URL, honoring env-var overrides.
858858
fn source_url() -> String {
859-
std::env::var("CLAURST_MODELS_URL")
859+
std::env::var("COVEN_CODE_MODELS_URL")
860860
.or_else(|_| std::env::var("MODELS_DEV_URL"))
861861
.unwrap_or_else(|_| "https://models.dev/api.json".to_string())
862862
}
@@ -884,11 +884,11 @@ impl ModelRegistry {
884884
/// Attempt to refresh the registry from the models.dev public API.
885885
///
886886
/// Returns `Ok(true)` if new data was fetched, `Ok(false)` if the cache
887-
/// was still fresh. Honors `CLAURST_DISABLE_MODELS_FETCH`. All network
887+
/// was still fresh. Honors `COVEN_CODE_DISABLE_MODELS_FETCH`. All network
888888
/// or parse failures are silenced — the bundled snapshot is always
889889
/// sufficient.
890890
pub async fn refresh_from_models_dev(&mut self) -> anyhow::Result<bool> {
891-
if std::env::var("CLAURST_DISABLE_MODELS_FETCH").is_ok() {
891+
if std::env::var("COVEN_CODE_DISABLE_MODELS_FETCH").is_ok() {
892892
return Ok(false);
893893
}
894894
if self.cache_is_fresh() {

src-rust/crates/bridge/src/lib.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -191,14 +191,14 @@ impl BridgeConfig {
191191
/// Build config from environment variables.
192192
///
193193
/// Recognised variables:
194-
/// - `CLAURST_BRIDGE_URL` — overrides `server_url` and sets `enabled = true`
195-
/// - `CLAURST_BRIDGE_TOKEN` / `CLAUDE_BRIDGE_OAUTH_TOKEN` — sets `session_token`
194+
/// - `COVEN_CODE_BRIDGE_URL` — overrides `server_url` and sets `enabled = true`
195+
/// - `COVEN_CODE_BRIDGE_TOKEN` / `CLAUDE_BRIDGE_OAUTH_TOKEN` — sets `session_token`
196196
/// - `CLAUDE_BRIDGE_BASE_URL` — alternative URL override (ant-only dev override)
197197
pub fn from_env() -> Self {
198198
let mut config = Self::default();
199199

200200
// URL override (sets enabled implicitly)
201-
if let Ok(url) = std::env::var("CLAURST_BRIDGE_URL")
201+
if let Ok(url) = std::env::var("COVEN_CODE_BRIDGE_URL")
202202
.or_else(|_| std::env::var("CLAUDE_BRIDGE_BASE_URL"))
203203
{
204204
if !url.is_empty() {
@@ -208,7 +208,7 @@ impl BridgeConfig {
208208
}
209209

210210
// Token override
211-
if let Ok(token) = std::env::var("CLAURST_BRIDGE_TOKEN")
211+
if let Ok(token) = std::env::var("COVEN_CODE_BRIDGE_TOKEN")
212212
.or_else(|_| std::env::var("CLAUDE_BRIDGE_OAUTH_TOKEN"))
213213
{
214214
if !token.is_empty() {
@@ -908,7 +908,7 @@ pub struct SimpleMessage {
908908
/// # Authentication
909909
///
910910
/// Reads the bearer token from (in order of precedence):
911-
/// 1. `CLAURST_BRIDGE_TOKEN` environment variable
911+
/// 1. `COVEN_CODE_BRIDGE_TOKEN` environment variable
912912
/// 2. `CLAUDE_BRIDGE_OAUTH_TOKEN` environment variable
913913
///
914914
/// If no token is found, returns an informative error.
@@ -935,20 +935,20 @@ pub async fn start_bridge_session(
935935
) -> anyhow::Result<BridgeSessionInfo> {
936936
// Resolve auth token.
937937
let token = token_override
938-
.or_else(|| std::env::var("CLAURST_BRIDGE_TOKEN").ok())
938+
.or_else(|| std::env::var("COVEN_CODE_BRIDGE_TOKEN").ok())
939939
.or_else(|| std::env::var("CLAUDE_BRIDGE_OAUTH_TOKEN").ok())
940940
.filter(|t| !t.is_empty())
941941
.ok_or_else(|| {
942942
anyhow::anyhow!(
943943
"Remote Control requires a session token.\n\
944-
Set CLAURST_BRIDGE_TOKEN=<your-token> to enable.\n\
944+
Set COVEN_CODE_BRIDGE_TOKEN=<your-token> to enable.\n\
945945
Get a token from https://claude.ai (Settings → Remote Control).\n\
946946
Note: Remote Control is only available with claude.ai subscriptions."
947947
)
948948
})?;
949949

950950
// Resolve server base URL.
951-
let server_url = std::env::var("CLAURST_BRIDGE_URL")
951+
let server_url = std::env::var("COVEN_CODE_BRIDGE_URL")
952952
.or_else(|_| std::env::var("CLAUDE_BRIDGE_BASE_URL"))
953953
.unwrap_or_else(|_| "https://claude.ai".to_string());
954954

@@ -1047,7 +1047,7 @@ pub async fn poll_bridge_messages(
10471047
info: &BridgeSessionInfo,
10481048
since_id: Option<&str>,
10491049
) -> anyhow::Result<Vec<SimpleMessage>> {
1050-
let server_url = std::env::var("CLAURST_BRIDGE_URL")
1050+
let server_url = std::env::var("COVEN_CODE_BRIDGE_URL")
10511051
.or_else(|_| std::env::var("CLAUDE_BRIDGE_BASE_URL"))
10521052
.unwrap_or_else(|_| "https://claude.ai".to_string());
10531053

@@ -1125,7 +1125,7 @@ pub async fn post_bridge_response(
11251125
content: &str,
11261126
done: bool,
11271127
) -> anyhow::Result<()> {
1128-
let server_url = std::env::var("CLAURST_BRIDGE_URL")
1128+
let server_url = std::env::var("COVEN_CODE_BRIDGE_URL")
11291129
.or_else(|_| std::env::var("CLAUDE_BRIDGE_BASE_URL"))
11301130
.unwrap_or_else(|_| "https://claude.ai".to_string());
11311131

@@ -1190,7 +1190,7 @@ pub async fn post_bridge_event(
11901190
info: &BridgeSessionInfo,
11911191
payload: String,
11921192
) -> anyhow::Result<()> {
1193-
let server_url = std::env::var("CLAURST_BRIDGE_URL")
1193+
let server_url = std::env::var("COVEN_CODE_BRIDGE_URL")
11941194
.or_else(|_| std::env::var("CLAUDE_BRIDGE_BASE_URL"))
11951195
.unwrap_or_else(|_| "https://claude.ai".to_string());
11961196

src-rust/crates/cli/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ version.workspace = true
44
edition.workspace = true
55

66
[[bin]]
7-
name = "claurst"
7+
name = "coven-code"
88
path = "src/main.rs"
99

1010
[features]

src-rust/crates/cli/src/main.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -259,11 +259,11 @@ struct Cli {
259259
fallback_model: Option<String>,
260260

261261
/// LLM provider to use (default: anthropic). Examples: openai, google, ollama
262-
#[arg(long, env = "CLAURST_PROVIDER")]
262+
#[arg(long, env = "COVEN_CODE_PROVIDER")]
263263
provider: Option<String>,
264264

265265
/// Override the API base URL for the selected provider
266-
#[arg(long, env = "CLAURST_API_BASE")]
266+
#[arg(long, env = "COVEN_CODE_API_BASE")]
267267
api_base: Option<String>,
268268

269269
/// Named agent to use (e.g., build, plan, explore)
@@ -874,18 +874,18 @@ fn build_tools_with_mcp(
874874
fn model_cache_dir() -> PathBuf {
875875
dirs::cache_dir()
876876
.unwrap_or_else(|| PathBuf::from("."))
877-
.join("claurst")
877+
.join("coven-code")
878878
}
879879

880880
/// Resolve the models.dev source URL, honoring env-var overrides.
881881
fn models_source_url() -> String {
882-
std::env::var("CLAURST_MODELS_URL")
882+
std::env::var("COVEN_CODE_MODELS_URL")
883883
.or_else(|_| std::env::var("MODELS_DEV_URL"))
884884
.unwrap_or_else(|_| "https://models.dev/api.json".to_string())
885885
}
886886

887887
/// Default cache filename — derived from the source URL so a custom
888-
/// `CLAURST_MODELS_URL` doesn't stomp the canonical models.dev cache.
888+
/// `COVEN_CODE_MODELS_URL` doesn't stomp the canonical models.dev cache.
889889
fn models_cache_path() -> PathBuf {
890890
let url = models_source_url();
891891
let filename = if url == "https://models.dev/api.json" {
@@ -1085,9 +1085,9 @@ async fn run_models_command(args: &[String]) -> anyhow::Result<()> {
10851085

10861086
fn load_cached_model_registry() -> Arc<claurst_api::ModelRegistry> {
10871087
let mut reg = claurst_api::ModelRegistry::new();
1088-
// CLAURST_MODELS_PATH wins outright — useful for offline dev where you
1088+
// COVEN_CODE_MODELS_PATH wins outright — useful for offline dev where you
10891089
// pin a known-good api.json on disk.
1090-
if let Ok(custom) = std::env::var("CLAURST_MODELS_PATH") {
1090+
if let Ok(custom) = std::env::var("COVEN_CODE_MODELS_PATH") {
10911091
reg.load_cache(&PathBuf::from(custom));
10921092
} else {
10931093
reg.load_cache(&models_cache_path());
@@ -1119,13 +1119,13 @@ fn cache_is_fresh(path: &std::path::Path, ttl: std::time::Duration) -> bool {
11191119
/// Background-refresh the models cache from the configured source URL.
11201120
///
11211121
/// Honors:
1122-
/// * `CLAURST_DISABLE_MODELS_FETCH` — skips the network call entirely.
1123-
/// * `CLAURST_MODELS_URL` / `MODELS_DEV_URL` — overrides the source URL.
1122+
/// * `COVEN_CODE_DISABLE_MODELS_FETCH` — skips the network call entirely.
1123+
/// * `COVEN_CODE_MODELS_URL` / `MODELS_DEV_URL` — overrides the source URL.
11241124
/// * 5-minute mtime-based freshness check — avoids hammering models.dev
11251125
/// on every CLI invocation.
11261126
fn spawn_models_cache_refresh() {
1127-
if std::env::var("CLAURST_DISABLE_MODELS_FETCH").is_ok() {
1128-
tracing::debug!("CLAURST_DISABLE_MODELS_FETCH set — skipping models.dev refresh");
1127+
if std::env::var("COVEN_CODE_DISABLE_MODELS_FETCH").is_ok() {
1128+
tracing::debug!("COVEN_CODE_DISABLE_MODELS_FETCH set — skipping models.dev refresh");
11291129
return;
11301130
}
11311131

@@ -1149,7 +1149,7 @@ fn spawn_models_cache_refresh() {
11491149
let url = models_source_url();
11501150
let resp = match client
11511151
.get(&url)
1152-
.header("User-Agent", concat!("Claurst/", env!("CARGO_PKG_VERSION")))
1152+
.header("User-Agent", concat!("CovenCode/", env!("CARGO_PKG_VERSION")))
11531153
.send()
11541154
.await
11551155
{

src-rust/crates/commands/src/lib.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,7 +1460,7 @@ impl SlashCommand for GoalCommand {
14601460
async fn execute(&self, args: &str, ctx: &mut CommandContext) -> CommandResult {
14611461
if !claurst_core::goals_enabled() {
14621462
return CommandResult::Message(
1463-
"Goals are disabled. Unset CLAURST_GOALS=0 (or remove it) to re-enable.".to_string(),
1463+
"Goals are disabled. Unset COVEN_CODE_GOALS=0 (or remove it) to re-enable.".to_string(),
14641464
);
14651465
}
14661466

@@ -4417,7 +4417,7 @@ impl SlashCommand for ShareCommand {
44174417
viewer URL of the form https://claurst.kuber.studio/session/#<gist-id>.\n\n\
44184418
Requirements:\n \
44194419
- GitHub CLI (gh) installed and logged in (`gh auth login`).\n\n\
4420-
The viewer base URL can be overridden with CLAURST_SHARE_VIEWER_URL.\n\
4420+
The viewer base URL can be overridden with COVEN_CODE_SHARE_VIEWER_URL.\n\
44214421
Secret gists are unlisted but readable by anyone who has the link."
44224422
}
44234423

@@ -4505,9 +4505,9 @@ impl SlashCommand for ShareCommand {
45054505
let viewer = share_viewer_url(gist_id);
45064506

45074507
// Auto-open in the system browser unless the user opted out — saves the
4508-
// copy/paste dance after a /share. Skipped when `CLAURST_SHARE_NO_OPEN`
4508+
// copy/paste dance after a /share. Skipped when `COVEN_CODE_SHARE_NO_OPEN`
45094509
// is set (e.g. on a headless box) or when `open` can't find a handler.
4510-
let opted_out = std::env::var_os("CLAURST_SHARE_NO_OPEN")
4510+
let opted_out = std::env::var_os("COVEN_CODE_SHARE_NO_OPEN")
45114511
.map(|v| !v.is_empty() && v != "0")
45124512
.unwrap_or(false);
45134513
let opened = if opted_out {
@@ -4598,7 +4598,7 @@ impl SlashCommand for LinksCommand {
45984598
/links <N> Open the Nth URL from /links list.\n\
45994599
/links last Same as /links (open most recent).\n\n\
46004600
URLs are detected in user/assistant message text. Set\n\
4601-
CLAURST_SHARE_NO_OPEN=1 to disable the auto-open behavior in /share."
4601+
COVEN_CODE_SHARE_NO_OPEN=1 to disable the auto-open behavior in /share."
46024602
}
46034603

46044604
async fn execute(&self, args: &str, ctx: &mut CommandContext) -> CommandResult {
@@ -5196,10 +5196,10 @@ impl SlashCommand for RemoteControlCommand {
51965196
.map(|h| h.to_string_lossy().into_owned())
51975197
.unwrap_or_else(|_| "(unknown host)".to_string());
51985198

5199-
let bridge_url = std::env::var("CLAURST_BRIDGE_URL")
5199+
let bridge_url = std::env::var("COVEN_CODE_BRIDGE_URL")
52005200
.unwrap_or_else(|_| "https://claude.ai".to_string());
52015201

5202-
let token_status = if std::env::var("CLAURST_BRIDGE_TOKEN").is_ok()
5202+
let token_status = if std::env::var("COVEN_CODE_BRIDGE_TOKEN").is_ok()
52035203
|| std::env::var("CLAUDE_BRIDGE_OAUTH_TOKEN").is_ok()
52045204
{
52055205
"configured via environment variable"
@@ -5249,7 +5249,7 @@ impl SlashCommand for RemoteControlCommand {
52495249
How to connect\n\
52505250
──────────────\n\
52515251
1. Obtain a session token from claude.ai (Settings → Remote Control)\n\
5252-
2. Set it: export CLAURST_BRIDGE_TOKEN=<your-token>\n\
5252+
2. Set it: export COVEN_CODE_BRIDGE_TOKEN=<your-token>\n\
52535253
3. Enable: /remote-control start\n\
52545254
4. Restart Claurst — the bridge will connect automatically\n\
52555255
5. Open {bridge_url}/claude-code in your browser\n\
@@ -5272,9 +5272,9 @@ impl SlashCommand for RemoteControlCommand {
52725272
if let Err(e) = save_settings_mutation(|s| s.remote_control_at_startup = true) {
52735273
return CommandResult::Error(format!("Failed to save settings: {}", e));
52745274
}
5275-
let bridge_url = std::env::var("CLAURST_BRIDGE_URL")
5275+
let bridge_url = std::env::var("COVEN_CODE_BRIDGE_URL")
52765276
.unwrap_or_else(|_| "https://claude.ai".to_string());
5277-
let token_note = if std::env::var("CLAURST_BRIDGE_TOKEN").is_ok()
5277+
let token_note = if std::env::var("COVEN_CODE_BRIDGE_TOKEN").is_ok()
52785278
|| std::env::var("CLAUDE_BRIDGE_OAUTH_TOKEN").is_ok()
52795279
{
52805280
"Session token detected in environment — bridge will connect on next start."
@@ -5283,7 +5283,7 @@ impl SlashCommand for RemoteControlCommand {
52835283
format!(
52845284
"No session token found.\n\
52855285
Get a token from {bridge_url} (Settings → Remote Control)\n\
5286-
then run: export CLAURST_BRIDGE_TOKEN=<token>",
5286+
then run: export COVEN_CODE_BRIDGE_TOKEN=<token>",
52875287
bridge_url = bridge_url
52885288
)
52895289
};

0 commit comments

Comments
 (0)