dmx

Changelog

All notable changes to dmx are documented here. dmx follows Semantic Versioning.


v0.5.0 — Skill Discovery

Ask your agent which skills exist, and run custom and shared skills by asking for the task.

Added

  • Skill discovery: ask "which skills can update helm?" and the agent lists matching skills from your repo and every shared source, with where each comes from, plus any matching /dmx/* commands. It runs nothing. Ask for the task itself and it runs the one clear match, or asks which to run when several match. During a loop, the loop still decides what runs. Backed by a new list_skills MCP tool.
  • /dmx/upgrade: refreshes the dmx rule files in your repo to the installed version. It doesn't touch config, the memory bank, or job state, and doesn't commit. run_loop, loop_status, and list_skills remind you to run it when your rules are out of date. Run it once in every repo for 0.5.0.
  • loop_status MCP tool: reports the active loop without changing it, and waits for validators that are still running.
  • timeout_seconds on each validator in a loop. Defaults to 630 seconds, minimum 60. The limit is passed to the validator as loop_context.timeout_seconds.
  • spec_identity_matches_branch: a new required Spec Loop check that the spec's branch is the branch you're on.

Changed

  • Validators run in the background with a new validating status, so a long test suite can't time out your IDE's connection to dmx or block the server.
  • The bundled Dev Loop no longer declares coverage_threshold, which the bundled run_tests never reported. A passing Dev Loop now moves on to the Validate Loop.
  • In a repo without ticketing, each branch gets its own job folder instead of sharing .dmx/jobs/none/. An in-progress run from 0.4.2 moves automatically the first time you run a loop command.
  • create-pr marks the Release Loop's run complete before it commits, through a new snapshot_loop_for_pr MCP tool, so a merged PR no longer contains a job file stuck at running.

Fixed

  • A loop that pauses on a failed check, or finishes with a warning, now names every failed check with its own message, such as the end of the test output or a timeout reason.
  • A timed-out validator or test command no longer leaves the processes it started running.
  • Validators no longer stop after 120 seconds, which could cut a test suite short.
  • A loop whose skills all finished but whose validators never started can be resumed with /dmx/loop-continue.
  • A spec left over from the previous ticket no longer files a new Spec Loop run under that ticket's job folder.
  • The Release Loop's state file is no longer merged as running.
  • dmx no longer commits loop state while your integration or production branch is checked out, and pushes its final loop-state commit only when it's the only unpushed commit on a branch with an open PR.

v0.4.2

Fixed

  • Folder-shaped {name}/SKILL.md skills now resolve from every location, not just shared sources. A folder-shaped skill copied straight into a project's .dmx/skills/ previously failed with "Skill not found".
  • Skill names passed to get_skill_definition must now be plain slugs. A name containing ../ or an absolute path could previously read files outside the skills directories; it now behaves like any other unknown skill.

v0.4.1

Fixed

  • check_pr_ready's memory_updated check no longer fails because of the loop runtime's own state under .dmx/jobs/. The Release Loop's paused job state was being graded as a forgotten memory bank edit, failing the check on an otherwise-good PR.
  • loop_advance and loop_continue no longer fail with an "ambiguous active run" error after the validate skill runs. The validation-report.json it writes to the job folder was mistaken for a second, unfinished loop run; only files that look like task state are considered now.

v0.4.0 — Shared Sources

Org-wide loops, skills, and validators, maintained once and vendored into every repo.

Added

  • Shared sources: declare one or more git repositories in .dmx/shared-sources.yaml, each pinned to a tag, branch, or commit SHA. Their loops, skills, and validators resolve after your repo's own files and before the bundled defaults, in declared order. Each entry's name must be a plain slug and its subdir a relative path. A repo without the file behaves exactly as before.
  • /dmx/sync skill and sync_shared_sources MCP tool: clones each declared source at its pinned ref, copies it into .dmx/vendor/{name}/ with a .lock.json recording the resolved commit SHA, then commits and pushes. Blocked on the integration branch. Clone, missing-ref, and wrong-shape failures are reported per source, as is any entry under a source's skills/ that is neither {name}.md nor {name}/SKILL.md.
  • Collision warnings: /dmx/sync warns when the same loop, skill, or validator name is defined in more than one place (your repo and a source, or two sources), naming which one wins. Skills are compared by logical name, so review.md and review/SKILL.md collide. Collisions don't fail the sync.
  • Folder-shaped skills: skills in a shared source can be a {name}/SKILL.md folder (the agentskills.io / Claude Code convention, with optional scripts/, references/, assets/) as well as dmx's flat {name}.md. dmx gives the agent the skill's root path and surfaces any declared dependencies:.

v0.3.4

Fixed

  • When a loop run finishes, the runtime now commits its final job state and the activeContext.md session note instead of leaving them uncommitted. The Release Loop's outcome was previously lost when close-ticket deleted the branch. If the commit fails (for example, a pre-commit hook rejects it), the loop's response includes a warning.
  • close-ticket only transitions the ticket to Done when it finds a merged PR for the branch. Running it while the PR was still open could previously mark the ticket Done. An already-closed ticket is now treated as done rather than an error.
  • draft-release-note commits and pushes .dmx/releases/{version}.md, so the notes are included in the release-merge PR.
  • Starting the Spec Loop, or running /dmx/create-ticket, in a repository with no commits now gives a clear error telling you to commit and push first.

v0.3.3

Changed

  • The Release Loop now runs create-pr only. create-pr already syncs and commits the memory bank; running update-memory after it left uncommitted changes that never made it into the PR.

Fixed

  • update-memory commits its own changes, so it never leaves .dmx/ edits uncommitted.
  • check_pr_ready's memory_updated check fails if .dmx/ has uncommitted changes, instead of passing whenever activeContext.md exists.

v0.3.2

Added

  • require_branch loop config field. require_branch: base restricts a loop to starting from the integration branch; the bundled Spec Loop uses it.

Fixed

  • Loop state is now isolated per branch/ticket. Previously, a single .dmx/loop-state.json file tracked whichever loop ran most recently, regardless of branch — pausing a loop on one branch and running a different loop on another branch could lose or corrupt the paused run's state. .dmx/loop-state.json no longer exists; the active run is now derived directly from the job's own state files, scoped to the current branch/ticket.
  • The Spec Loop can now only be started from your configured integration branch, and no longer risks adopting a stale spec.md left over from a previously merged ticket (close-ticket doesn't delete it). Starting it from anywhere else, or starting a second one while a prior run hasn't finished creating its ticket yet, is rejected with a clear message instead of silently corrupting job state.
  • When on_complete chains into a loop that can't start from the current branch, the finished loop reports its own outcome and the reason, instead of claiming it's chaining and then failing.

v0.3.1

Fixed

  • dmx no longer falls back to the filesystem root, your home directory, or an unrelated directory when your IDE doesn't report a workspace root. An auto-detected root must contain .git or .dmx, or the tool call fails with an error. This could previously write loop state outside your project. /dmx/init still works on a brand-new project. See Workspace root.
  • An explicit workspace_root must be an absolute path (~ is expanded); relative paths are rejected.

v0.3.0 — Loop Runtime

The foundational release that turns dmx from a command vocabulary into an orchestrated workflow harness.

Added

  • run_loop MCP tool: starts a loop by name, initializes job and task state, returns the first skill instruction
  • loop_advance MCP tool: advances the loop after a skill completes. Persists output, applies human gate, runs validators, chains to next loop.
  • loop_continue MCP tool: resumes a paused loop after human review
  • /dmx/run-loop skill: IDE command to start any loop by name
  • /dmx/loop-continue skill: IDE command to resume a paused loop
  • Loop config schema: Pydantic-validated YAML schema for loop configuration (loop_schema.py)
  • Five bundled loop configs: spec, plan, dev, validate, release (.dmx/loops/*.yaml)
  • Validator runner: subprocess runner with JSON contract, 120s timeout, policy engine for required vs. optional checks
  • Bundled validators: check_spec_complete, check_plan_complete, run_tests, spec_adherence, check_pr_ready
  • repeat_until support: all_phases_complete condition evaluator reads tasks.md for unchecked items
  • Loop chaining: on_complete block triggers the next loop automatically on success
  • Job and task state: persisted to .dmx/jobs/{job_id}/{loop}-{task_id}.json and .dmx/loop-state.json
  • Config resolution: repo-level .dmx/loops/ overrides bundled defaults; repo always wins
  • GitHub Actions workflows: test matrix (Python 3.11/3.12/3.13, Ubuntu/macOS) and OIDC trusted publishing to PyPI

Fixed

  • check_spec_complete's qa_answered check now recognizes questions structurally (numbered list or Q: markers) instead of requiring an exact answer label, so it no longer fails against every spec.md the bundled create-ticket skill actually generates.

v0.2.0 — Branch-Scoped Memory Bank

Breaking change to the memory bank layout.

Changed

  • spec.md and tasks.md moved from the nested .dmx/tickets/active/{ref}/ path to flat files at .dmx/spec.md and .dmx/tasks.md on the feature branch. spec.md gained a YAML frontmatter block (ticket, branch, summary, ticketing).
  • activeContext.md repurposed as a learning inbox with three sections — ## Open Learnings, ## Open Decisions, ## Session Notes — instead of an ## Active Ticket pointer. Items are promoted to the durable core files on commit and PR; /dmx/update-memory performs a full rebuild.
  • ticket_id argument removed from most skills — ticket context is now derived from spec.md frontmatter or the branch name.
  • Release, hotfix, and ship skills read a configurable production_branch and branch_base instead of assuming master.

Added

  • Three-tier memory sync: light sync on /dmx/commit, full sync on /dmx/create-pr, deep sync on /dmx/update-memory.
  • production_branch config field, set by /dmx/init.

Existing projects: re-run /dmx/init to migrate the IDE rule markers and activeContext.md structure.


v0.1.0 — Initial OSS Release

  • 23 SDLC skills as MCP prompts covering the full AI SDLC lifecycle: init, create-ticket, plan, implement, validate, commit, create-pr, release, hotfix, and more.
  • .dmx/ memory bank scaffolding via /dmx/init.
  • dmx serve — stdio and HTTP+SSE transports, REQUIRE_API_KEY + MCP_API_KEY bearer auth, --watch hot-reload.
  • dmx list-skills and --skills-dir / --rules-dir overrides.
  • IDE detection and rule-file generation for Cursor, Claude, Copilot, and Antigravity.
  • CI matrix (Python 3.11/3.12/3.13 × Ubuntu/macOS) and OIDC trusted publishing to PyPI.

For the full commit history, see GitHub.

On this page