All notable changes to devloop will be recorded in this file.
- Added a configurable watcher backend with non-breaking
nativedefault behavior plus apollfallback mode for environments where native filesystem notifications are unreliable. - Added a Rust repeated-edit watch flake smoke test that can be run
locally with
DEVLOOP_RUN_WATCH_FLAKE_SMOKE=1 cargo test --test watch_flake_smoke -- --nocapture. - Added explicit trailing-slash syntax for literal directory watch
targets, for example
content/, so recursive directory intent is preserved even when the directory does not yet exist at startup. - Added a development guide under
docs/development.mdand exposed it in the CLI asdevloop docs development.
devloopnow derives concrete watch targets from configured watch patterns and asks the backend to watch only those files or directories instead of always watching the whole repository root.- The watch flake smoke test is now opt-in instead of running during
every default
cargo testor CI run. The existing runtime smoke test remains in CI.
- Native watch registration now resolves file and directory targets at runtime, so startup no longer depends on those paths already existing when config is parsed.
- Fixed a real watch flake where the debounce batch could be dropped if
another
tokio::select!branch won the race while filesystem events were already buffered. - Test-only environment mutation now lives behind locked helpers with documented safety rationale instead of scattered raw unsafe blocks.
- Added a browser reload event server and a
notify_reloadworkflow action so workflows can explicitly tell downstream browser listeners to refresh after successful rebuild/restart steps. - Added declarative workflow
triggersso downstream orchestration can be expressed directly in config instead of being inferred through secondary file watches.
- Workflow failures such as process-readiness timeouts now log loudly
but do not terminate
devloop, so the watcher stays alive and the next successful edit can recover a broken local build. - Triggered workflows now run as part of the same execution tree,
including when their parent workflow was reached via
run_workflow. - Config validation now rejects ambiguous trigger graphs where a direct
trigger target is also reachable through
run_workflow, and triggered workflows are documented as single-run deduplicated within one execution. - Trigger-overlap validation now walks the full execution tree, so
nested trigger graphs cannot schedule the same workflow once as a
trigger target and again through an inline
run_workflowpath. - Fixed a false positive in that validator so inline workflows with independent trigger targets are allowed.
- Added regression coverage for both the allowed independent-trigger case and the rejected case where a parent workflow and an inline child share the same trigger target.
- Platform-specific release workflows no longer duplicate GitHub release notes when both assets are published to the same tag.
- Runtime requests for missing workflows now fail explicitly instead of being logged and skipped, and external events return
503if their workflow trigger cannot be dispatched. - Watcher callback delivery failures are now surfaced as errors instead of being dropped silently.
- Unexpected watcher and external-event channel disconnects now fail the engine explicitly instead of silently disabling those input paths.
- Accepted macOS
notifyevent paths reported under/private/...for watched roots configured under/var/..., so file changes in temp directories are no longer dropped by the watch classifier. - Made the CI smoke test wait for file watching to start before editing the watched fixture file, and retry the watched write until the state change is observed, avoiding startup races on macOS runners.
- Added a hard wall-clock timeout and bounded shutdown to the CI smoke harness so failed runs die loudly instead of hanging in CI.
- Split Linux and macOS CI into separate badgeable workflows backed by one reusable workflow definition, and limited release archives to the supported Linux x86_64 and macOS Apple Silicon targets.
- Split release publishing into separate Linux and macOS workflows backed by one reusable workflow definition so each platform publishes its asset independently.
- Render
devloop docs <topic>output as terminal-friendly text instead of printing literal Markdown.
- Added observed hooks, allowing a hook to be polled on the runtime maintenance tick and trigger a workflow only when its session-state output changes.
- Added localhost external events with per-run bearer tokens, fixed
event-to-state/workflow mappings, and child-process environment
injection so trusted local clients can push state changes into
devloopwithout polling. - Added dedicated security documentation for external events and the
push-versus-polling tradeoffs in
docs/security.md. - Added
devloop docs <topic>so the configuration, behavior, and security references can be read directly from the CLI without duplicating the source material. - Added a tag-driven GitHub release workflow that verifies the Cargo version, builds release archives for Linux and macOS, and publishes them as GitHub Release assets.
- Moved workflow progression into a pure state/effect core so ordered workflow execution is planned through explicit transition data before the runtime interprets the requested side effects.
- Moved startup orchestration, watch-triggered workflow scheduling, maintain ticks, shutdown handling, and process-supervision decisions into pure runtime/process cores with explicit effect planning.
- Added replaceable adapter boundaries for workflow and runtime effect interpretation so orchestration can be tested against mocks instead of live subprocesses and file watchers.
- Added direct tests for the concrete log-prefix rendering path and mock-based tests for workflow/runtime effect interpreters so output coloring and orchestration changes can be validated without manual runs.
- Removed bright white from inherited output label colors and dimmed source labels alongside dimmed inherited process bodies.
- Restored managed child-process environment inheritance so
devloopand supervised processes read the same ambientRUST_LOGunless repo config explicitly overrides it. - Prefixed internal dependency logs under
devloop, for example[devloop hyper_util ...], and reordered managed-process labels to[executable process-name]so the emitting process is visible first.
- Source-labeled managed process output so mixed logs show which configured process and executable emitted each line.
- Stable per-process label colors and dimmed managed-process bodies so
devloopworkflow and engine logs stand out by contrast. - Source-labeled hook stdout and stderr with dimmed bodies by default so short-lived helper commands remain visible without dominating the main process logs.
- Detailed runtime behavior reference under
docs/behavior.md.
- Preserved UTF-8 multibyte characters in inherited subprocess output
so watch tools render units such as
μscorrectly. - Reapplied dim styling after child ANSI SGR sequences when
output.body_style = "dim"so colored subprocess logs can still recede visually without losing their tint entirely.
- Configurable inherited process body styling via
output.body_style, allowing developers to choose between preserving native subprocess colors and dimming inherited output bodies. - Detailed configuration reference docs under
docs/.
- Routed inherited child stdout and stderr to matching sinks instead of collapsing them into a single output stream.
- Stopped dimming inherited process output bodies so native subprocess colors survive more cleanly.
- Preserved ANSI color escape sequences from inherited subprocess output
so native colored logs such as Rust server tracing output render
correctly under
devloop.
- Restored inherited process output for processes that omit an explicit
outputblock by defaultingoutput.inherittotrueat theProcessSpeclevel as intended.
- Config-driven process supervision with startup workflows, readiness checks, liveness checks, and restart policies.
- Output-derived session state capture for long-running processes such as
cloudflared. - Generic
write_stateinterpolation for composing derived values from session state. - Reusable
run_workflowsteps with validation against missing nested workflows and recursive workflow graphs. - Generic blog example config under [
examples/blog/devloop.toml]. - Human-readable CLI help text for the top-level command and subcommands.
- Moved the real working blog config out of
devloopand into the client repository. - Resolved repo-local hook commands relative to the client repository root.
- Reworked session state ownership to be in-memory and shared across the running engine.
- Avoided redundant state-file writes and released the in-memory state lock before file I/O.
- Initial
devloopbootstrap with config loading, file watching, process management, and workflow execution.