sdd-layer 0.21.3

Spec-Driven Development CLI and agent harness
//! Núcleo durável do Orquestrador Autônomo de Demandas (Fase 1 — planejamento).
//!
//! Contém o domínio determinístico do motor: modelo de demanda, fila durável e
//! estado durável por demanda. Camadas seguintes (`tick`, gate, aprovação)
//! entram nas tasks SDD-OAD-005+ deste mesmo módulo. A geração headless é reuso
//! de `tui::runner` (extração na SDD-OAD-002); efeitos de rede vivem em
//! `runtime::adapters`.

use std::fs;
use std::path::Path;

use anyhow::{anyhow, Result};

pub mod approval;
pub mod block_gate;
pub mod demand;
pub mod driver;
pub mod engine;
pub mod queue;
pub mod settings;
pub mod state;

/// Escrita atômica compartilhada (write-temp + rename). Mantém o domínio
/// independente de `tui::persist` (camada de apresentação).
pub(crate) fn write_atomic(path: &Path, bytes: &[u8]) -> Result<()> {
    let parent = path
        .parent()
        .ok_or_else(|| anyhow!("caminho sem diretório pai: {}", path.display()))?;
    fs::create_dir_all(parent)?;
    let tmp = path.with_extension("tmp");
    fs::write(&tmp, bytes)?;
    fs::rename(&tmp, path)?;
    Ok(())
}