ryu-workspace 0.1.14

Git-native workspace primitive for Ryu: the git/worktree engine that shells `git`/`gh` for a caller-supplied cwd. Owns per-run worktrees (create → isolated `ryu/run-<id>` branch → `Drop`-on-completion cleanup), the aggregate run diff (committed + staged/untracked, numstat + name-status), whole-tree apply (commit → merge-into-base OR commit → push → `gh pr create`), and the read-only git status/branches/checkout/create-branch/commit-push helpers. An extracted Core capability crate; in-process by default and consumed as a NON-optional path dependency (the ACP chat loop opens a worktree per isolated run). ZERO dependency on apps/core: the only kernel coupling is the Windows console-suppression `NoWindow` util, vendored verbatim (a `Command`-builder extension trait with no shared crate home — the same UTIL-duplication call `ryu-webhook-ingress` made). The chat-cwd threading (ChatStreamRequest → conversations.rs) stays kernel; only the git engine moves here.
Documentation
//! Suppress the console window that Windows attaches to spawned child processes.
//!
//! Copied from `apps/core/src/win_process.rs` (a ~40-LoC pure `#[cfg(windows)]`
//! utility), keeping only the `std::process::Command` impl this crate needs (the
//! git/worktree engine shells `git`/`gh` synchronously; it never spawns a tokio
//! `Command`). A `Command`-builder extension trait is the wrong shape to invert
//! through a host, and it has no shared crate home, so a small UTIL duplication
//! is the right call — the same adjudication `ryu-webhook-ingress` made.
//!
//! Call `.no_window()` on any `std` `Command` before `spawn()`/`output()`.

/// Windows `CREATE_NO_WINDOW` process creation flag.
#[cfg(windows)]
pub const CREATE_NO_WINDOW: u32 = 0x0800_0000;

/// Extension adding `.no_window()` to the `std` `Command` builder.
pub trait NoWindow {
    /// Spawn the child without a console window on Windows (no-op elsewhere).
    fn no_window(&mut self) -> &mut Self;
}

impl NoWindow for std::process::Command {
    fn no_window(&mut self) -> &mut Self {
        #[cfg(windows)]
        {
            use std::os::windows::process::CommandExt;
            self.creation_flags(CREATE_NO_WINDOW);
        }
        self
    }
}