mirror of
https://github.com/openai/codex.git
synced 2026-04-28 16:45:54 +00:00
## Summary - Port marketplace source support into the shared core marketplace-add flow - Support local marketplace directory sources - Support direct `marketplace.json` URL sources - Persist the new source types in config/schema and cover them in CLI and app-server tests ## Validation - `cargo test -p codex-core marketplace_add` - `cargo test -p codex-cli marketplace_add` - `cargo test -p codex-app-server marketplace_add` - `just write-config-schema` - `just fmt` - `just fix -p codex-core` - `just fix -p codex-cli` ## Context Current `main` moved marketplace-add behavior into shared core code and still assumed only git-backed sources. This change keeps that structure but restores support for local directories and direct manifest URLs in the shared path.
62 lines
2.0 KiB
Rust
62 lines
2.0 KiB
Rust
use anyhow::Result;
|
|
use app_test_support::McpProcess;
|
|
use app_test_support::to_response;
|
|
use codex_app_server_protocol::JSONRPCResponse;
|
|
use codex_app_server_protocol::MarketplaceAddParams;
|
|
use codex_app_server_protocol::MarketplaceAddResponse;
|
|
use codex_app_server_protocol::RequestId;
|
|
use pretty_assertions::assert_eq;
|
|
use tempfile::TempDir;
|
|
use tokio::time::Duration;
|
|
use tokio::time::timeout;
|
|
|
|
const DEFAULT_TIMEOUT: Duration = Duration::from_secs(10);
|
|
|
|
#[tokio::test]
|
|
async fn marketplace_add_local_directory_source() -> Result<()> {
|
|
let codex_home = TempDir::new()?;
|
|
let source = codex_home.path().join("marketplace");
|
|
std::fs::create_dir_all(source.join(".agents/plugins"))?;
|
|
std::fs::create_dir_all(source.join("plugins/sample/.codex-plugin"))?;
|
|
std::fs::write(
|
|
source.join(".agents/plugins/marketplace.json"),
|
|
r#"{"name":"debug","plugins":[]}"#,
|
|
)?;
|
|
std::fs::write(
|
|
source.join("plugins/sample/.codex-plugin/plugin.json"),
|
|
r#"{"name":"sample"}"#,
|
|
)?;
|
|
std::fs::write(source.join("plugins/sample/marker.txt"), "local ref")?;
|
|
let mut mcp = McpProcess::new(codex_home.path()).await?;
|
|
timeout(DEFAULT_TIMEOUT, mcp.initialize()).await??;
|
|
|
|
let request_id = mcp
|
|
.send_marketplace_add_request(MarketplaceAddParams {
|
|
source: "./marketplace".to_string(),
|
|
ref_name: None,
|
|
sparse_paths: None,
|
|
})
|
|
.await?;
|
|
|
|
let response: JSONRPCResponse = timeout(
|
|
DEFAULT_TIMEOUT,
|
|
mcp.read_stream_until_response_message(RequestId::Integer(request_id)),
|
|
)
|
|
.await??;
|
|
let MarketplaceAddResponse {
|
|
marketplace_name,
|
|
installed_root,
|
|
already_added,
|
|
} = to_response(response)?;
|
|
let expected_root = source.canonicalize()?;
|
|
|
|
assert_eq!(marketplace_name, "debug");
|
|
assert_eq!(installed_root.as_path(), expected_root.as_path());
|
|
assert!(!already_added);
|
|
assert_eq!(
|
|
std::fs::read_to_string(installed_root.as_path().join("plugins/sample/marker.txt"))?,
|
|
"local ref"
|
|
);
|
|
Ok(())
|
|
}
|