v0.5.0 — Agent ergonomics
This release makes a DWE project legible to an AI coding agent working inside it, and adds the engine features that came out of that work.
Highlights
🤖 Navigation for agents
dwe docs llms-txtis a real briefing — project context, services, commands, builtin and predicate inventories, docs pointers. Project-aware inside a project, generic outside one.dwe docs searchis tokenized and ranked, with snippets and a resolvabletopic#anchoron every hit.dwe docs show --anchors/--toc/--anchoraddress a document's sections directly.dwe test list --output jsongainedcost_profile— host steps, isolation findings, shared volumes — so the cost of running the suite is knowable before running it.
🧩 Pipeline primitives
argv_append_from— build extra argv elements from a host command's output, one per line, no shell re-parse.check: auto— derive a step'scheck:by inverting its shellwhen:instead of writing the condition twice.source_clone— a self-gating clone builtin, with path containment and symlink checks on the destination.
🔤 ${vars.*} inside pipelines
Pipeline cmd:, with:, check:, timeout: and shell when: render at resolve time, so a deploy step can read project vars — and dwe deploy plan shows the command that will actually run. An unrecognized head (${HOME}, a typo) stays literal instead of collapsing to an empty string. Adds dwe deploy plan --output json.
✅ dwe validate
Three new checks — config.template_refs (a ${...} whose path doesn't resolve), config.container_name, config.ports_exports — and less noise: implicit defaults no longer report as findings. The summary and JSON now name the active scope.
🐚 Command surface
${args}pass-through — forwarded as positional parameters, never interpolated into the command text.dwe shell --tty/--no-tty,dwe services list, and a named diagnosis when a container lacks the configured shell.
🏗 Scaffold and tables
dwe init ships service defaults, a pipeline skeleton, an AI pack, and a starter test scenario. Every CLI table now adapts to terminal width — fits, shrinks, then breaks into record blocks; piped output is byte-identical to before.
Upgrade notes
[a-z0-9][a-z0-9_-]* while project.name / project.prefix / docker.yml's project_name are free-form, so cueBreaker now resolves to dwe-cuebreaker — and container names, the volume prefix, and the compose project label follow. If your project name carries uppercase, stop the stack with v0.4.1 before upgrading: the old containers and volumes belong to a different project as far as Compose is concerned, and would be orphaned rather than adopted. Already-lowercase projects are unaffected.
One-time full re-run. vars: is now part of the config hashes — it has to be, since a step's command can depend on it — so the first dwe deploy run after upgrading re-runs every step. Steps are idempotent and gated, so this is safe; it just isn't silent.
Everything else is additive and activates only when used.
Full changelog: v0.4.1...v0.5.0