shepherd-core 6.4.5

The harness-agnostic shepherd engine: domain types, configuration schema, and run state. Knows nothing about any CLI, harness, or process.
[package]
build = "build.rs"
description = "The harness-agnostic shepherd engine: domain types, configuration schema, and run state. Knows nothing about any CLI, harness, or process."
name = "shepherd-core"

authors.workspace = true
categories.workspace = true
edition.workspace = true
homepage.workspace = true
keywords.workspace = true
license.workspace = true
readme = "README.md"
repository.workspace = true
rust-version.workspace = true
version.workspace = true

[lib]
bench = false
crate-type = ["rlib"]

[[test]]
name = "default"
required-features = []

[[test]]
name = "guard"
required-features = ["std", "parse", "json"]

[[test]]
name = "dispatch"
required-features = ["std", "json"]

[[test]]
name = "portable_dispatch"
required-features = ["std", "json"]

[[test]]
name = "run_state"
required-features = ["std", "json"]

[package.metadata.docs.rs]
all-features = false
features = ["full"]
rustc-args = ["--cfg", "docsrs"]
version = "v{{version}}"

[package.metadata.release]
no-dev-version = true
tag-name = "v{{version}}"

[dependencies]
# errors — typed only; `anyhow` is a delivery concern and is forbidden here
thiserror = { workspace = true }
# macros & utilities — derive-only, no runtime surface
strum = { workspace = true }
# parsing — the run-id and branch grammars are engine rules, not CLI rules
nom = { optional = true, workspace = true }
# configuration layering parses only already-read TOML strings. Filesystem and
# environment discovery stay on the adapter side; see src/loader.rs.
toml = { optional = true, workspace = true }
# schema generation — feeds the config key universe the validator checks
schemars = { optional = true, workspace = true }
# serialization
serde = { optional = true, workspace = true }
serde_json = { optional = true, workspace = true }
# time — run.json updated_at must round-trip int, float and ISO8601
chrono = { optional = true, workspace = true }
# identifiers — project.json carries a UUIDv7 project id
uuid = { optional = true, workspace = true }
# tracing — the facade only. A library never installs a subscriber.
tracing = { optional = true, workspace = true }

[features]
default = [
  "std",
]

full = [
  "default",
  "chrono",
  "config",
  "json",
  "parse",
  "schema",
  "tracing",
  "uuid",
]

# ********* [FF] Flags *********
config = [
  "dep:toml",
  "json",
  "std",
]

json = [
  "alloc",
  "serde",
  "serde_json",
]

parse = [
  "alloc",
  "dep:nom",
  "dep:toml",
]

schema = [
  "alloc",
  "dep:schemars",
  "serde",
]

# ********* [FF] Targets *********
#
# No target here may enable a host-coupled dependency. That is the whole point
# of this crate; see the boundary rule in src/lib.rs. Note that `wasm` and
# `wasi` deliberately exclude `uuid` and `chrono`: UUIDv7 needs an entropy
# source and chrono's `clock` needs a system timezone, and neither exists on
# `wasm32-unknown-unknown` without a JS shim. An embedder supplies both.
native = ["full"]

nightly = []

wasi = [
  "config",
  "json",
  "parse",
  "schema",
  "std",
]

wasm = [
  "config",
  "json",
  "parse",
  "schema",
  "std",
]

# ********* [FF] Standard Library *********
alloc = [
  "chrono?/alloc",
  "nom?/alloc",
  "serde?/alloc",
  "serde_json?/alloc",
  "uuid?/std",
]

std = [
  "alloc",
  "chrono?/std",
  "nom?/std",
  "schemars?/std",
  "serde?/std",
  "serde_json?/std",
  "strum/std",
  "thiserror/std",
  "toml?/std",
  "tracing?/std",
]

# ********* [FF] Deps *********
#
# Every dep flag pulls in `alloc`. There is no configuration of this crate that
# builds below the allocating floor -- `Error` carries owned strings -- so a
# flag that lets you *select* one is a flag that hands you a compile error and
# blames your feature list. `scripts/check-features.sh` checks each of these in
# isolation, which is how that was found rather than assumed.
chrono = [
  "alloc",
  "dep:chrono",
]

serde = [
  "alloc",
  "dep:serde",
  "chrono?/serde",
  "uuid?/serde",
]

serde_json = [
  "alloc",
  "dep:serde_json",
]

tracing = [
  "alloc",
  "dep:tracing",
]

uuid = [
  "alloc",
  "dep:uuid",
]

[lints]
workspace = true