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 newlist_skillsMCP 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, andlist_skillsremind you to run it when your rules are out of date. Run it once in every repo for 0.5.0.loop_statusMCP tool: reports the active loop without changing it, and waits for validators that are still running.timeout_secondson each validator in a loop. Defaults to 630 seconds, minimum 60. The limit is passed to the validator asloop_context.timeout_seconds.spec_identity_matches_branch: a new required Spec Loop check that the spec'sbranchis the branch you're on.
Changed
- Validators run in the background with a new
validatingstatus, 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 bundledrun_testsnever 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-prmarks the Release Loop's runcompletebefore it commits, through a newsnapshot_loop_for_prMCP tool, so a merged PR no longer contains a job file stuck atrunning.
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.mdskills 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_definitionmust 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'smemory_updatedcheck 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_advanceandloop_continueno longer fail with an "ambiguous active run" error after thevalidateskill runs. Thevalidation-report.jsonit 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'snamemust be a plain slug and itssubdira relative path. A repo without the file behaves exactly as before. /dmx/syncskill andsync_shared_sourcesMCP tool: clones each declared source at its pinned ref, copies it into.dmx/vendor/{name}/with a.lock.jsonrecording 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'sskills/that is neither{name}.mdnor{name}/SKILL.md.- Collision warnings:
/dmx/syncwarns 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, soreview.mdandreview/SKILL.mdcollide. Collisions don't fail the sync. - Folder-shaped skills: skills in a shared source can be a
{name}/SKILL.mdfolder (the agentskills.io / Claude Code convention, with optionalscripts/,references/,assets/) as well as dmx's flat{name}.md. dmx gives the agent the skill's root path and surfaces any declareddependencies:.
v0.3.4
Fixed
- When a loop run finishes, the runtime now commits its final job state and the
activeContext.mdsession note instead of leaving them uncommitted. The Release Loop's outcome was previously lost whenclose-ticketdeleted the branch. If the commit fails (for example, a pre-commit hook rejects it), the loop's response includes a warning. close-ticketonly 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-notecommits and pushes.dmx/releases/{version}.md, so the notes are included in therelease-mergePR.- 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-pronly.create-pralready syncs and commits the memory bank; runningupdate-memoryafter it left uncommitted changes that never made it into the PR.
Fixed
update-memorycommits its own changes, so it never leaves.dmx/edits uncommitted.check_pr_ready'smemory_updatedcheck fails if.dmx/has uncommitted changes, instead of passing wheneveractiveContext.mdexists.
v0.3.2
Added
require_branchloop config field.require_branch: baserestricts 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.jsonfile 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.jsonno 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.mdleft over from a previously merged ticket (close-ticketdoesn'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_completechains 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
.gitor.dmx, or the tool call fails with an error. This could previously write loop state outside your project./dmx/initstill works on a brand-new project. See Workspace root. - An explicit
workspace_rootmust 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_loopMCP tool: starts a loop by name, initializes job and task state, returns the first skill instructionloop_advanceMCP tool: advances the loop after a skill completes. Persists output, applies human gate, runs validators, chains to next loop.loop_continueMCP tool: resumes a paused loop after human review/dmx/run-loopskill: IDE command to start any loop by name/dmx/loop-continueskill: 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_untilsupport:all_phases_completecondition evaluator readstasks.mdfor unchecked items- Loop chaining:
on_completeblock triggers the next loop automatically on success - Job and task state: persisted to
.dmx/jobs/{job_id}/{loop}-{task_id}.jsonand.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'sqa_answeredcheck now recognizes questions structurally (numbered list orQ:markers) instead of requiring an exact answer label, so it no longer fails against everyspec.mdthe bundledcreate-ticketskill actually generates.
v0.2.0 — Branch-Scoped Memory Bank
Breaking change to the memory bank layout.
Changed
spec.mdandtasks.mdmoved from the nested.dmx/tickets/active/{ref}/path to flat files at.dmx/spec.mdand.dmx/tasks.mdon the feature branch.spec.mdgained a YAML frontmatter block (ticket,branch,summary,ticketing).activeContext.mdrepurposed as a learning inbox with three sections —## Open Learnings,## Open Decisions,## Session Notes— instead of an## Active Ticketpointer. Items are promoted to the durable core files on commit and PR;/dmx/update-memoryperforms a full rebuild.ticket_idargument removed from most skills — ticket context is now derived fromspec.mdfrontmatter or the branch name.- Release, hotfix, and ship skills read a configurable
production_branchandbranch_baseinstead of assumingmaster.
Added
- Three-tier memory sync: light sync on
/dmx/commit, full sync on/dmx/create-pr, deep sync on/dmx/update-memory. production_branchconfig 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_KEYbearer auth,--watchhot-reload.dmx list-skillsand--skills-dir/--rules-diroverrides.- 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.