Compare commits
14
Commits
sketch-grid
...
v0.13.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
66d13059dd | ||
|
|
800ea40c0d | ||
|
|
20442eecd3 | ||
|
|
22d1cd7032 | ||
|
|
6a0dc18655 | ||
|
|
e006dbf1af | ||
|
|
8241a750fa | ||
|
|
41779cf7bb | ||
|
|
b01b9689c8 | ||
|
|
4426da6f5d | ||
|
|
5ead82e627 | ||
|
|
c29b0d2f13 | ||
|
|
480fd8d517 | ||
|
|
4c09fa5355 |
No files matched your search
Generated
+15
-15
@@ -3704,7 +3704,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solidcraft"
|
name = "solidcraft"
|
||||||
version = "0.13.0"
|
version = "0.13.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"block2 0.6.2",
|
"block2 0.6.2",
|
||||||
"eframe",
|
"eframe",
|
||||||
@@ -3733,7 +3733,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solidcraft-cli"
|
name = "solidcraft-cli"
|
||||||
version = "0.13.0"
|
version = "0.13.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"solidcraft-engine",
|
"solidcraft-engine",
|
||||||
@@ -3742,7 +3742,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solidcraft-derive"
|
name = "solidcraft-derive"
|
||||||
version = "0.13.0"
|
version = "0.13.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@@ -3751,7 +3751,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solidcraft-doc"
|
name = "solidcraft-doc"
|
||||||
version = "0.13.0"
|
version = "0.13.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"log",
|
"log",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -3768,7 +3768,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solidcraft-engine"
|
name = "solidcraft-engine"
|
||||||
version = "0.13.0"
|
version = "0.13.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"log",
|
"log",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -3784,7 +3784,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solidcraft-geom"
|
name = "solidcraft-geom"
|
||||||
version = "0.13.0"
|
version = "0.13.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
@@ -3793,7 +3793,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solidcraft-gpu"
|
name = "solidcraft-gpu"
|
||||||
version = "0.13.0"
|
version = "0.13.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"log",
|
"log",
|
||||||
"naga",
|
"naga",
|
||||||
@@ -3806,7 +3806,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solidcraft-io"
|
name = "solidcraft-io"
|
||||||
version = "0.13.0"
|
version = "0.13.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"quick-xml",
|
"quick-xml",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -3821,7 +3821,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solidcraft-kernel"
|
name = "solidcraft-kernel"
|
||||||
version = "0.13.0"
|
version = "0.13.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"log",
|
"log",
|
||||||
"rayon",
|
"rayon",
|
||||||
@@ -3839,7 +3839,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solidcraft-mcp"
|
name = "solidcraft-mcp"
|
||||||
version = "0.13.0"
|
version = "0.13.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"solidcraft-engine",
|
"solidcraft-engine",
|
||||||
@@ -3847,7 +3847,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solidcraft-render"
|
name = "solidcraft-render"
|
||||||
version = "0.13.0"
|
version = "0.13.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"image",
|
"image",
|
||||||
"moxcms",
|
"moxcms",
|
||||||
@@ -3860,7 +3860,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solidcraft-sketch"
|
name = "solidcraft-sketch"
|
||||||
version = "0.13.0"
|
version = "0.13.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
@@ -3871,7 +3871,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solidcraft-ui-egui"
|
name = "solidcraft-ui-egui"
|
||||||
version = "0.13.0"
|
version = "0.13.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"egui",
|
"egui",
|
||||||
"egui-wgpu",
|
"egui-wgpu",
|
||||||
@@ -3892,7 +3892,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solidcraft-web"
|
name = "solidcraft-web"
|
||||||
version = "0.13.0"
|
version = "0.13.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"eframe",
|
"eframe",
|
||||||
"egui",
|
"egui",
|
||||||
@@ -5381,7 +5381,7 @@ checksum = "e450f9b2ed1dff33c94c12589a87338689467b9c4f5d8a5710bd09a847d2c8a7"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "xtask"
|
name = "xtask"
|
||||||
version = "0.13.0"
|
version = "0.13.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"sha2",
|
"sha2",
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@ members = ["crates/*", "apps/*", "xtask"]
|
|||||||
exclude = ["vendor"]
|
exclude = ["vendor"]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "0.13.0"
|
version = "0.13.1"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
rust-version = "1.95"
|
rust-version = "1.95"
|
||||||
|
|||||||
@@ -184,13 +184,30 @@ pub fn search_dirs() -> Vec<PathBuf> {
|
|||||||
dirs
|
dirs
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The first `program` in `dirs` (on Windows also with `.exe`/`.cmd`).
|
/// The first `program` in `dirs` (on Windows with `.exe`/`.cmd`/`.bat`).
|
||||||
pub fn find_in(program: &str, dirs: &[PathBuf]) -> Option<PathBuf> {
|
pub fn find_in(program: &str, dirs: &[PathBuf]) -> Option<PathBuf> {
|
||||||
let names: Vec<String> =
|
let names = names_for(program, cfg!(windows));
|
||||||
if cfg!(windows) { ["", ".exe", ".cmd", ".bat"].iter().map(|e| format!("{program}{e}")).collect() } else { vec![program.to_string()] };
|
|
||||||
dirs.iter().flat_map(|d| names.iter().map(move |n| d.join(n))).find(|p| p.is_file())
|
dirs.iter().flat_map(|d| names.iter().map(move |n| d.join(n))).find(|p| p.is_file())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The file names `program` can have. On Windows only ones it can run: npm puts a Unix shell
|
||||||
|
/// script with the bare name next to the `.cmd` shim, and starting that fails with "not a valid
|
||||||
|
/// Win32 application".
|
||||||
|
fn names_for(program: &str, windows: bool) -> Vec<String> {
|
||||||
|
if windows { [".exe", ".cmd", ".bat"].iter().map(|e| format!("{program}{e}")).collect() } else { vec![program.to_string()] }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A Windows command saved without an extension (`…\npm\codex-acp`, from an older version's
|
||||||
|
/// lookup): the `.exe`/`.cmd`/`.bat` beside it, if there is one.
|
||||||
|
pub fn runnable_sibling(program: &Path) -> Option<PathBuf> {
|
||||||
|
if program.extension().is_some() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
let dir = program.parent()?;
|
||||||
|
let name = program.file_name()?.to_str()?;
|
||||||
|
names_for(name, true).into_iter().map(|n| dir.join(n)).find(|p| p.is_file())
|
||||||
|
}
|
||||||
|
|
||||||
/// `program --version`'s first line, or `None` after `limit` (the probe is then stopped).
|
/// `program --version`'s first line, or `None` after `limit` (the probe is then stopped).
|
||||||
fn version(program: &Path, limit: Duration) -> Option<String> {
|
fn version(program: &Path, limit: Duration) -> Option<String> {
|
||||||
let mut cmd = if cfg!(windows) && program.extension().is_some_and(|e| e.eq_ignore_ascii_case("cmd") || e.eq_ignore_ascii_case("bat")) {
|
let mut cmd = if cfg!(windows) && program.extension().is_some_and(|e| e.eq_ignore_ascii_case("cmd") || e.eq_ignore_ascii_case("bat")) {
|
||||||
@@ -279,6 +296,25 @@ mod tests {
|
|||||||
let _ = std::fs::remove_dir_all(root);
|
let _ = std::fs::remove_dir_all(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn on_windows_only_runnable_shims_are_candidates() {
|
||||||
|
// npm's bare `codex-acp` is a shell script; Windows can't start it (os error 193).
|
||||||
|
assert_eq!(names_for("codex-acp", true), ["codex-acp.exe", "codex-acp.cmd", "codex-acp.bat"]);
|
||||||
|
assert_eq!(names_for("codex-acp", false), ["codex-acp"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn a_saved_bare_npm_path_runs_its_cmd_shim() {
|
||||||
|
let root = std::env::temp_dir().join(format!("sc-agent-shim-{}", std::process::id()));
|
||||||
|
std::fs::create_dir_all(&root).unwrap();
|
||||||
|
std::fs::write(root.join("codex-acp"), "#!/bin/sh").unwrap();
|
||||||
|
std::fs::write(root.join("codex-acp.cmd"), "@echo off").unwrap();
|
||||||
|
assert_eq!(runnable_sibling(&root.join("codex-acp")), Some(root.join("codex-acp.cmd")));
|
||||||
|
assert_eq!(runnable_sibling(&root.join("codex-acp.cmd")), None);
|
||||||
|
assert_eq!(runnable_sibling(&root.join("gemini")), None);
|
||||||
|
let _ = std::fs::remove_dir_all(root);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn the_version_number_is_picked_out_of_the_line() {
|
fn the_version_number_is_picked_out_of_the_line() {
|
||||||
assert_eq!(version_of("@agentclientprotocol/codex-acp 2.2.2"), "2.2.2");
|
assert_eq!(version_of("@agentclientprotocol/codex-acp 2.2.2"), "2.2.2");
|
||||||
|
|||||||
@@ -51,8 +51,11 @@ impl ProcessHandle {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// On Windows, npm installs `.cmd` shims, which only `cmd.exe` runs.
|
/// On Windows, npm installs `.cmd` shims, which only `cmd.exe` runs. A command saved as the bare
|
||||||
|
/// npm path (a shell script there) runs the shim beside it.
|
||||||
fn command_for(program: &str) -> Command {
|
fn command_for(program: &str) -> Command {
|
||||||
|
let shim = if cfg!(windows) { super::discover::runnable_sibling(std::path::Path::new(program)) } else { None };
|
||||||
|
let program = shim.as_deref().and_then(|p| p.to_str()).unwrap_or(program);
|
||||||
let lower = program.to_ascii_lowercase();
|
let lower = program.to_ascii_lowercase();
|
||||||
if cfg!(windows) && (lower.ends_with(".cmd") || lower.ends_with(".bat")) {
|
if cfg!(windows) && (lower.ends_with(".cmd") || lower.ends_with(".bat")) {
|
||||||
let mut c = Command::new("cmd");
|
let mut c = Command::new("cmd");
|
||||||
|
|||||||
Reference in new issue
Block a user