- Changed files aggregation is now cached for improved performance.
- Fixed
moon querycommands not respecting the taskoptions.runInCIsetting, when running in CI. - Fixed an issue where
.gitignorewas not copied into Dockerfile's. - Fixed an issue where previously generated task outputs were cleaned when a hydration fails, resulting in a broken task run.
- Fixed an issue where
SetupEnvironment(and other plugin driven commands) would attempt to locate the executables of every toolchain declared in the workspace, and fail when one of them had not been installed. For example,moon docker setupfor a Python only project would fail on a declared but unused Node.js toolchain. Toolchain executable paths are now only inherited for toolchains that have actually been setup. - Fixed an issue where globbing would unnecessarily traverse into directories that were negated, resulting in reduced performance. Globbing is now about 10% faster for these cases.
- Fixed an issue where globbing would exhaust the internal thread pool, resulting in no results being returned. When the thread pool is now busy, we'll attempt to retry on the main thread.
- Updated Rust to v1.98.0.
- Updated dependencies.
- Bun
- Updated the embedded
buntool to support Windows arm64 (Bun v1.3.10+) and musl based Linux (Bun v1.1.35+).
- Updated the embedded
- Go
- Test binary pseudo-packages are no longer inferred as relationships.
go list -deps -testreports a syntheticpkg.testpackage for each tested package; its.testsuffix kept it from matching the package under test, so it resolved to whatever ancestor project it nested under (typically the module root) as a phantom development edge. It is now reduced to the real package path and recognised as ownership. go.sumis now reported as a project-graph input alongside the module'sgo.mod. As the lock file pinning resolved dependency versions, a change there (a dependency added, upgraded, or dropped) can alter whatgo listresolves for relationship inference, so reporting it keeps a locally cached graph from going stale. Only reported when present, since a module with no dependencies has nogo.sum.
- Test binary pseudo-packages are no longer inferred as relationships.
- JavaScript
- Updated Bun support for the v1.4 release:
- Dependencies are now installed with
bun ciin CI when abun.lockexists (v1.2.20+), as Bun does not enable frozen lockfiles in CI automatically. - Dependencies are now deduped with
bun dedupewhen thededupeOnLockfileChangesetting is enabled (v1.4+). - Focused installs now include workspace dependencies, by passing
...dependency relations to--filter(v1.4+).
- Dependencies are now installed with
- Updated Bun support for the v1.4 release:
- Fixed an issue where a task dependency using the task-tag scope (
~:#tag) was silently dropped when the depending task was defined in an inherited.moon/tasks/*config. Tag scoped dependencies are now preserved, sinceworkspace.inheritedTasksexclude/rename filters can only match tasks by ID (#2687).
- Increased the storage upload timeout from 60 seconds to 300 seconds (5 minutes) to allow more time for background operations to complete.
- Updated CI task runs to respect the
outputStyletask option. Locally, we'll still stream the output for primary targets, ignoring that option. We will be revisiting this in v2.6. - Updated
versionConstraintin.moon/workspace.*to use a range instead of a requirement, which allows for more flexible version constraints.
- Fixed an issue where commands executed by toolchain plugins at the workspace root would receive a
PWDenvironment variable with a trailing slash (an artifact of virtual path conversion). Shells that validatePWDon startup, like nushell, refused to run, failing the command (#2676). - Fixed an issue where combining
--forcewith--affectedwould not pass affected files to theaffectedFilestask option, as arguments or theMOON_AFFECTED_FILESenvironment variable. Forcing now only bypasses the affected selection filter (so unaffected tasks still run), while affected files continue to be tracked and passed to the command. - Fixed an issue where a dependent action could be dispatched (and run to completion) after one of
its required dependencies had failed and aborted the pipeline. For example,
InstallDependenciescould still run its install command afterSetupEnvironmentfailed. The pipeline now aborts before the failed action is marked as completed, and queued actions no longer start once the pipeline has been aborted or cancelled. - Fixed an issue where setting a task's
envvariable tonullwould also prevent that variable from being inherited from an env file (envFile). Anullvalue now only ignores the variable from the system/shell environment, while still allowing an env file to provide a value. - Fixed an issue where default
--summaryformoon ciwas not being respected. - Fixed an issue where resolved lockfile versions were not extracted for a toolchain when a
range/requirement was defined for the toolchain
version.
- Fixed an issue where
--affectedwith--include-relations(-g) would not select a target whose dependency (or dependent) was the task actually affected by the changed files. Only the requested targets were being tracked, but a target is marked through a relation when the task on the other side of it is marked, and that task is quite often not one that was requested. - Fixed an issue where a project that isn't part of a toolchain's dependencies workspace (not the
root, and not a member) would provision its own environment. Since the package manager resolves
upwards to the same root, this would clobber the workspace's environment, and could fail the
pipeline when both ran at the same time. Such projects now only setup the toolchain, so that its
binaries are available on
PATH.
- WASM API
- Reworked the
VirtualPathtype from the ground up. Is no longer an enum, but instead a newtype wrapper aroundPathBuf.- This allows for better interoperability with the Rust ecosystem, and makes it easier to work with virtual paths in general.
- Additionally, because of this change,
VirtualPathnow has access to allPathBufmethods, which was not possible before.
- Removed the
from_virtual_pathandto_virtual_pathextism host functions,into_real_pathandinto_virtual_pathwrapper functions, andreal_path!andvirtual_path!macros. Use the conversion utils instead (below).
- Reworked the
- Action graph
- Added a new mechanism where toolchains can specify requirements (other toolchains to be setup) for the setup environment action.
- CLI
- Added OpenTelemetry (OTEL) support, for exporting traces, metrics, and logs over OTLP.
- Added a
--otelglobal option (MOON_OTEL), for exporting traces and metrics. - Added a
--otel-logsglobal option (MOON_OTEL_LOGS), for exporting log events as OTLP logs. - Added a
--otel-service-nameglobal option (MOON_OTEL_SERVICE_NAME), for the reported service name. - The destination and transport are configured with the standard
OTEL_EXPORTER_OTLP_*environment variables.
- Added a
- Updated the
moon setupaction to also setup the toolchain environment, if their dependency root is the same as the workspace root. Nested dependency roots will not be setup, as they are expected to be setup by their parent project. - Updated the
moon exec(and related pipeline commands) to display action failures in the summary at the bottom, instead of interleaved within all actions.
- Added OpenTelemetry (OTEL) support, for exporting traces, metrics, and logs over OTLP.
- Config
- Added an unstable
cache.unstable_sharedWorktreeCachesetting to.moon/workspace.*, which shares the CAS cache between all VCS worktrees on the same machine. Only blobs and manifests are shared, as they are portable, while hashes, locks, and states remain worktree-specific. The cache is stored in the base checkout's.moon/cachedirectory, or~/.moon/cache/sharedwhen the repository root has no checkout (bare clones). Requires thecasOutputsCacheexperiment. - Added environment variable support for cache settings:
MOON_CACHE_CAS_MAX_SIZE,MOON_CACHE_CAS_VERIFY_INTEGRITY, andMOON_CACHE_SHARED_WORKTREE_CACHE. - Added an
envsetting to.moon/tasks/**/*configs. These environment variables are inherited by all matching projects, and are merged into each project'senvsetting, with project-level variables taking precedence. - Added a
workspace.mergeStrategiessetting tomoon.*config, which controls how project settings are merged with inherited workspace-level settings. Currently supportsenvandfileGroups, using the same merge strategies as task merging (append,prepend,preserve, andreplace). - Project globs can now be configured with a trailing file, allowing more precise project
matching. For example,
apps/*/package.jsonwill only find Node.js projects, andsrc/**/*.csprojwill only find .NET projects. The path without file name will be used as the project identifier (if not defined).- This change does not apply to root-level projects. Use a
.glob or target a moon configuration file.
- This change does not apply to root-level projects. Use a
- Added an unstable
- Daemon
- Added task output archiving and hydrating to the daemon. All of these heavy file system operations will now be offloaded into the background via the daemon. Because of this, you'll need to inspect the daemon server logs to understand when something fails during archiving or hydrating, as the main process will no longer block on these operations.
- Docker
- Improved the scaffolding and pruning workflows, by better handling edge cases, and ensuring its more reliable.
- Experiments
- The
asyncAffectedTracking,asyncGraphBuilding, andnativeFileHashingexperiments are now enabled by default. If you run into issues, please report it, and then disable the experiment to continue.
- The
- Project graph
- Reworked the project graph to validate cycles per dependency scope partition. Production scoped
dependencies (
production,peer) and development scoped dependencies (development,build,root) are now tracked as separate internal graphs, so relationships that cross the boundary no longer fail with a cycle error, or silently drop dependency edges.
- Reworked the project graph to validate cycles per dependency scope partition. Production scoped
dependencies (
- WASM API
- Added a
RealPathtype, which is a newtype wrapper aroundPathBufthat represents a real path on the host file system. This is a sibling to theVirtualPathtype, which represents a virtual path in the guest WASM environment. - Added
convert_to_virtual_pathandconvert_to_real_pathhelper functions for converting between real and virtual paths, using a list of host-to-guest path mappings.- Can also use
VirtualPathExt::to_real_pathandRealPathExt::to_virtual_pathextension traits for the same functionality.
- Can also use
- Added
DefineRequirementsOutput.for_setup_environmentandfor_setup_toolchainfields, which allow toolchains to specify requirements for the setup environment and setup toolchain actions, respectively. - Added
PruneDockerInput.project_dependenciesfield, which allows the toolchain to know about other projects that the focused project(s) depends on, so it can prune their dependencies as well. - Updated
DefineRequirementsInput.toolchain_configto inherit the project-level settings when applicable.
- Added a
- Go
- The
forceoption forbinsentries is now respected, and will always install the binary. - Fixed configured
binsnot being reinstalled when their binaries were uninstalled or deleted outside of moon. - Reworked relationship inference to match package import paths instead of module paths. Each
project now resolves a canonical import path (nearest
go.modmodule path plus the project's relative directory), andgo list -depsresults are matched against those by longest prefix. This makes relationships resolvable in repositories that share a singlego.modacross all projects. - Sibling modules required by version without a
go.workno longer create project relationships, since those builds consume the published module rather than the local source. When thegobinary is unavailable, projects with their owngo.modunder a workspacego.workfall back to resolving relationships from their direct requires. replacedirectives keep their meaning in the new model: a require replaced by a local directory always links to the project at that location (it consumes local source even without ago.work), while a require replaced by another module never links.- Imports within a project's own import path are treated as ownership rather than dependencies.
go list -deps ./...enumerates packages belonging to projects nested inside the scanned project, which previously inferred an edge from the parent to every nested child — forming a cycle whenever a child declareddependsOnon its parent.
- The
- JavaScript
- Added unstable support for Nub as a package manager:
- Natively uses
nub.lock(pnpm lockfile format), but will locate dependency roots using other package manager lockfiles that nub can operate on. - Reads workspace members and catalogs from
pnpm-workspace.yamlwhen present, otherwise frompackage.json. - Does not require the Node.js toolchain, as nub is a standalone binary.
- Natively uses
- Fixed
bun.lockparsing failing on Git/GitHub dependencies that include both package metadata (dependencies,bin, etc) and an integrity hash.
- Added unstable support for Nub as a package manager:
- Node
- Deprecated the
syncVersionManagerConfigsetting (it never worked correctly).
- Deprecated the
- Python
- Ensures that package manager toolchains are installed before setting up the environment.
- Added support to the Docker pruning workflow where we remove
.venvdirectories for non-focused projects (those that were not explicitly scaffolded).
- Rust
- Fixed an issue where Docker scaffolding would leave behind empty
lib.rsormain.rsfiles. - Fixed configured
binsnot being reinstalled when their binaries were uninstalled or deleted outside of moon. Only missing binaries are now installed.
- Fixed an issue where Docker scaffolding would leave behind empty
- Fixed an issue where the
--stackand--sourceoptions ofmoon query projectsdisplayed each other's help text. The filtering behavior itself was correct. - Fixed an issue where toolchain executable paths were not properly applied to all child processes.
- Fixed an issue where project and task graph node lookups could resolve the wrong entry, or fail entirely, after building a partial graph (a subset of projects), as internal node identifiers were not re-synced when placeholder nodes were removed.
- Fixed an issue where the async graph builder would fail with "unknown target" when a task dependency referenced a project by its alias.
- Fixed an issue where the async graph builder would produce differently ordered graphs across runs,
as projects were inserted in completion order instead of a stable order. This could cause unstable
hashes and
--dot/--jsonoutput. - Fixed an issue where a task with
runDepsInParallel: falsewould not be linked to all of its dependencies when a serial ordering edge was skipped to avoid a cycle, allowing the task to run before a dependency had finished. - Fixed an issue where moon would abort on startup with "Failed to load Git submodules" in
repositories without a
.gitmodulesfile, when the git object database was incomplete or unreachable (e.g. partial clones, or--referenceclones whose alternates are inaccessible). Submodule detection is now skipped entirely when no.gitmodulesfile exists. - Fixed an issue where the synchronous affected tracker (
experiments.asyncAffectedTrackingdisabled) would silently skip transitive dependent tasks when running with--downstreamand--include-relations, and could even schedule fewer tasks when the change set grew, as affected marks were accumulated lazily in target iteration order. Affected status is now tracked up front, mirroring the asynchronous tracker. - Fixed an issue on Windows where path variables (
$workspaceRoot,$workingDir,$projectRoot) expanded using the Windows path format (C:\path) based on the shell moon was executed from, instead of the shell the task runs in. When thewindowsShelltask option isbash, they now expand using the Unix path format (/c/path) that bash expects. - Fixed an issue where
--downstream deepwould also expand the dependents of upstream dependencies, running tasks that are not dependents of the requested targets (with a deep enough graph, the entire connected component). Downstream expansion now only flows from the requested targets through their dependent chains, matching how--downstream directalready behaved. - Fixed an issue where a failed proto installation would not abort the pipeline nor surface its
error. Dependent toolchain actions would run in the broken environment and fail with misleading
errors (like a missing
proto-shimbinary) that masked the root cause. Setup proto and setup environment failures now abort the pipeline immediately, and when multiple actions fail, the first failure is reported instead of the last.
- Renamed the
TaskMergeStrategytype toMergeStrategyin@moonrepo/types, as it's no longer exclusive to tasks. - Updated proto to v0.60.2 from 0.58.2.
- Updated Rust to v1.97.0.
- Updated dependencies.
- Updated
MOON_BASEandMOON_HEADto no longer require also passing--affected.
- Fixed an issue in GitLab CI where the wrong
HEADwould be used for merge request pipelines.
- Fixed an issue where HTTP remote cache would deserialize manifests into the wrong shape, resulting in failed caching.
- Fixed an issue where dependency deduping would run on fresh/initial installs.
- Fixed remote caching against backends that validate the Bazel RE contract (like Depot), where every upload was rejected with "client should not populate stdout_raw during upload" or "action digest not found in CAS", leaving the cache permanently empty.
- Fixed cache hits replaying no task output when a remote server returns a stdout/stderr digest without also inlining the raw bytes.
- Fixed an issue where gRPC remote cache uploads would fail with "Failed to store blob" when the
server returned a
RESOURCE_EXHAUSTEDerror, because a blob was too large. We now set the max size to 4MB (the gRPC limit). - Fixed an issue where HTTP remote cache was not respecting the
unstable_remote.cache.localReadOnlysetting.
- Added Renovate support. View the official guide for more information.
- Updated BitBucket codeowners to use the
new syntax & file location.
If you are using the old syntax, you can use
bitbucket-legacyinstead.
- Fixed an issue where
runDepsInParallel: falsewould only serialize direct dependencies, allowing a dependency's own dependencies (grandchildren) to run in parallel with earlier serial dependencies. The entire dependency subtree is now ordered. - Fixed
moon cifailing in certain CI provider pull request builds, where the base branch is provided as a fully-qualifiedrefs/heads/<branch>ref that couldn't be resolved in a detachedHEADcheckout. - Fixed task binaries failing with "command not found" in CI providers like CircleCI, where an
export PATH=...in the$BASH_ENVfile would overwrite thePATHthat moon injects for tasks.BASH_ENVis no longer passed tobashwrapped child processes, unless explicitly set with the taskenvoption. - Fixed an issue where task
outputStylewas being applied to the primary target. It will only apply to transitive targets. - Fixed an issue where captured task output containing non-UTF-8 bytes (for example, Windows
codepage output from Python) was discarded entirely, resulting in empty
stdout.log/stderr.logstate files, cache hits replaying no output, and missing output in run reports. Invalid bytes are now replaced with�instead. - Fixed an issue where a task's dependents would not run when requested with a downstream scope
(
moon ci,--dependents,--downstream), if the task was first added to the action graph as a dependency of another target. For example,moon run app:build lib:build --dependentswould skip the dependents oflib:buildwhenapp:builddepends on it. - Fixed tasks that emit read-only outputs (e.g.
0444files) failing on every cache hit with a "Permission denied" error when thecasOutputsCacheexperiment is enabled. Caches that already contain read-only objects are healed automatically. - Fixed an issue where
moon query changed-fileswould include uncommitted changes from the local index (git status) even when an explicit--headrevision was provided, causing false positives when comparing 2 revisions. This also applies to affected detection with an explicit head, e.g. theMOON_HEADenvironment variable or--affected base:head. Additionally,MOON_BASEandMOON_HEADenvironment variables that are set but empty are now ignored. - Fixed an issue where synced VCS hooks were always written to
.moon/hooks, even when the workspace configuration lived in.config/moon. Hooks are now placed alongside the config, in.config/moon/hooks. - Fixed an issue where a failing task would always exit moon with code
1, instead of propagating the task's actual exit code.
- Reworked the workspace graph caching to avoid plugin calls on cache hits, which can improve performance in large workspaces.
- Go
- Fixed
go list -depsrunning on non-Go projects.
- Fixed
- Fixed an issue where the daemon wouldn't start if the cache directory did not exist.
- Fixed some error messages being swallowed in the logs.
- CLI
- Added a
--update-constraintoption tomoon upgradethat will update the workspace config version constraint to the latest version. - Updated
--loglevel handling.debugshould be used for the most part, as it includes most debug information.tracenow includes a ton of information, which may be too spammy for normal debugging (is meant for agents and deep diagnostics).
- Added a
- CAS
- Further improvements to the content-addressable storage (CAS) cache, including better error handling and performance improvements.
- Added a new storage API for local/remote cache interoperability. This will unlock many improvements in the future, including better cache hit rates and more efficient storage.
- When copying files to/from the CAS, we now use OS reflink's when available, which can improve performance and reduce disk space usage.
- When the local/remote cache is missing a blob, we'll attempt to retrieve it from the other cache, which can improve cache hit rates in some scenarios.
- When a remote cache hit, we'll now warm the local cache with the hydrated manifest and its blobs, so the next run resolves locally instead of round-tripping to the remote.
- Daemon
- Server log files will now rotate up to 7 times. Older log files will be automatically deleted.
- Webhook delivery and task output archiving are now acknowledged immediately and run in the background on the daemon, so a client exiting or hitting a deadline no longer cancels the work mid-flight.
- The daemon now takes exclusive ownership of its workspace through an advisory file lock held for its entire lifetime, replacing PID-liveness checks that could be fooled by zombie processes, reused PIDs, or processes owned by another user. A crashed daemon releases the lock automatically, so a stale socket or state file can no longer block or misdirect the next start.
- Whether the daemon is running is now determined by connecting to it rather than probing a PID,
and its metadata is recorded in a
daemon.jsonstate file (replacingmoond.pid). - Connecting to the daemon and starting it are now a single operation, so a command that needs the daemon will start one itself if the background pre-warm hasn't yet, instead of silently running without it. Concurrent starts still coordinate so only one daemon is spawned.
- When connecting, the client now checks the running daemon's moon and protocol version against
its own and, on a mismatch, restarts it — so a daemon left over from before a
moon upgradeis replaced instead of serving the old binary indefinitely. - The daemon now retires itself after a long idle period (no requests), and exits immediately if its workspace is deleted, so an abandoned workspace no longer leaves a daemon running forever.
- Processes
- Improved our "stream and capture output" child process handling to operate on bytes instead of lines, which should resolve some edge cases with output not being written to the console, or being written out of order.
- Remote cache
- Added compression support for streamed read/writes of blobs (large files).
- Added extensive testing to account for edge cases.
- When the server doesn't support the configured compression, it will now default to "identity" (uncompressed) instead of disabling the cache entirely.
- Tasks
- Added a
checkssetting to tasks that allows you to define shell scripts that execute before the task runs, and depending on their type, different outcomes can be achieved. The following types are supported:fingerprint- if the check fails, the task will fail and not run, otherwise the process output will be included in the task hash.requirement— if the check fails, the task will fail and not run.condition- if all conditions pass, the task will be skipped, otherwise it will run as normal.
- Added a
mergeChecksoption to tasks to control the merge behavior of checks when extending tasks. - Added a top-level
taskOptionssetting tomoon.*that allows you to configure default task options for all tasks within the current project, which can be overridden per task.
- Added a
- Toolchains
- Added caching around executable location lookups to improve performance. Previously, these were running over and over again for each task.
- VCS
- Hardened all executed Git commands: revisions are validated against argument injection, credential prompts now fail immediately instead of hanging, and the fsmonitor daemon is now disabled to avoid it blocking process pipes.
- Reworked merge base resolution to be more accurate and performant. The most recent divergence point is now preferred when local and remote branches are out of sync, and a warning is now logged when a merge base could not be resolved, as diffs may be inaccurate without one.
- Reworked how renames are handled. When diffing between revisions, the old path is now reported as "deleted" and the new path as "added", instead of both being "modified". For statuses, the old path is now reported as "deleted", instead of being omitted entirely. Additionally, type changes and unmerged files are now reported, instead of being omitted.
- Python
- Added Poetry package manager support.
- Can be enabled with
unstable_python.packageManager: 'poetry'in.moon/toolchains.*. - Can be configured with
unstable_poetry.*settings in.moon/toolchains.*. - Supports tiers 1-3.
- Can be enabled with
- Added Poetry package manager support.
- Ruby
- Added unstable Ruby toolchain support!
- Can be configured with
unstable_ruby.*settings in.moon/toolchains.*. - Supports tiers 1-3. Tier 3 requires building from source (which may not be desirable).
- Will use Bundler as the package manager.
- Can be configured with
- Added unstable Ruby toolchain support!
- CLI
- Fixed an issue where moon would silently exit with code 141 (SIGPIPE) when a child process exited before consuming its stdin. Broken pipes are now handled explicitly instead of resetting the SIGPIPE disposition, while piping moon's output to a consumer that closes early still exits quietly with the conventional code.
- Daemon
- Fixed an issue where every daemon RPC was capped by a 1 second client-side timeout, causing slow procedures (webhook delivery, cache cleaning) to be cancelled even though the daemon was healthy. Connection establishment is now bounded separately, and each procedure has an appropriate deadline that is also enforced by the server.
- Fixed an issue where connecting to the daemon while it was still starting up — or being started by another process — would fail immediately with "connection refused", and the run would continue without the daemon. Connection attempts are now retried with a bounded backoff.
- Fixed an issue on Windows where the daemon briefly had no listening pipe instance between client connections, causing sporadic connection failures, and where busy pipe instances were not retried.
- VCS
- Fixed an issue where an explicit head revision was ignored when diffing between revisions, and the current working tree was compared against instead.
- Fixed an issue where diffing against the previous revision would fail in repositories with a single commit.
- Fixed an issue where file names with spaces or special characters were excluded from file tree results.
- Fixed an issue where Git submodules added between 2 revisions were not included when diffing.
- Fixed an issue where Git hooks could not be set up from the primary working tree when other worktrees exist.
- Fixed an issue where moon would take over a hooks directory managed by another tool (husky,
lefthook, etc) when
core.hooksPathwas already configured, overwriting its hook files, and deleting the entire directory when hooks were disabled. - Fixed an issue where Windows hook wrappers would not forward arguments containing spaces correctly, and would arbitrarily cap forwarding at 5 arguments.
- Fixed an issue where PowerShell hooks would mangle user variables that start with
$ARG, like$ARGS.
- Updated proto to v0.58.2 from 0.57.4.
- Updated dependencies.
- Fixed an issue where Git hooks would not work correctly in submodules.
- Fixed an issue where
moon dockercommands may generate non-deterministic output, resulting in invalid Docker layer caching.
- Go
- Fixed
go list -depsrelationship inference not detecting sibling workspace modules imported via subpackages (e.g.example.com/org/a/pkg).
- Fixed
- JavaScript
- Added Deno v2.9 support.
- Fixed an issue where projects with the same name/ID as their underlying toolchain package would cause issues when pruning within Docker.
- Fixed an issue where remote caching wasn't being updated unless the
casOutputsCacheexperiment was enabled.
- Python
- Updated
uv syncto use--no-devwhen installing production only dependencies.
- Updated
- Rust
- Updated
cargo-binstallinstallation to use--locked.
- Updated
- Fixed a security issue where task outputs being hydrated from the remote cache can overwrite files outside the output list, if the manifest in the remote cache has been compromised.
- Go
- Fixed a
go.modparsing regression that failed to parsetool ().
- Fixed a
- Added panic handling to the daemon server, to capture and log unexpected panics.
- Updated the pipeline to continue if the daemon client cannot connect, instead of failing the whole pipeline.
- Potential fix for the daemon client connection refused error. If this problem persists, temporarily disable the daemon and report an issue.
- Fixed an issue with
project:^inputs where resolved files would be excluded when project sources overlap.
- Go
- Added an
inferRelationshipsPackagessetting to customize the package patterns passed togo list --deps. - Updated
go list --depsrelationship inference to scan all packages (./...) by default, so dependencies imported only from subdirectories (internal/,pkg/, ...) are now inferred.
- Added an
- Added in-memory caching to certain toolchain operations, primarily around locating executables.
- Improved daemon startup performance by loading the workspace graph in the background after the server is ready.
- Updated plugin distribution to use ghcr.io instead of raw URLs, which should improve reliability and performance of plugin downloads.
- Reworked the daemon connect/ready logic to possibly fix some Windows connection issues.
- Fixed an issue where the task dependency
cacheStrategyinferrence was not working correctly based on what experiments are enabled. - Fixed an issue where locks created at
.moon/cache/lockswould not be cleaned up.
- Updated proto to v0.57.4 from 0.57.3.
- Cache
- Added a new experiment that stores task outputs in a local content-addressable storage (CAS)
cache, sharing the same format used by the remote cache. Enables deduplicated storage across
tasks and a unified cache shape locally and remotely.
- Enable with the
experiments.casOutputsCachesetting in.moon/workspace.*.
- Enable with the
- Added a new top-level
cachesetting in.moon/workspace.*for tuning the content-addressable storage (CAS) cache.
- Added a new experiment that stores task outputs in a local content-addressable storage (CAS)
cache, sharing the same format used by the remote cache. Enables deduplicated storage across
tasks and a unified cache shape locally and remotely.
- Daemon
- When
pipeline.autoCleanCacheis enabled (by default), the auto-clean will now run in the daemon, instead of at the tail-end of the main process. - When utilizing webhooks, the requests will now be made from the daemon, instead of the main process.
- When
- Git
- Added SHA256 support for commit hashes. This is in preparation for Git's transition to SHA256 as the default hash algorithm.
- Hash
- Added a new experiment that replaces the VCS/Git based file hashing mechanism with a custom
native implementation that runs within our task pool. This can improve performance by 10-50%.
- Enable with the
experiments.nativeFileHashingsetting in.moon/workspace.*.
- Enable with the
- Added a new experiment that replaces the VCS/Git based file hashing mechanism with a custom
native implementation that runs within our task pool. This can improve performance by 10-50%.
- MCP
- Added
get_templateandget_templatestools so AI coding assistants can discover templates and inspect their variable schemas before callinggenerate.
- Added
- Tasks
- Added tags support to tasks through new
tagsandoptions.mergeTagssettings.- Added
taskTagfield support to MQL. - Added
--tagsoption support tomoon query tasks. - Updated targets to support the
#tag syntax in the task scope, allowing you to reference tasks by their tags. For example:app:#quality.
- Added
- Added a
cacheStrategyfield to task dependencies that controls how a dependency's changes invalidate the current task's cache. Supportshash,ignored, andoutputs— the latter mixes in the dependency's output files instead of its hash, so build tasks are only invalidated when upstream outputs change, not when upstream inputs change.- Behavior change: when
cacheStrategyis omitted, the default is nowhashif the dependency declares outputs andignoredif it doesn't, instead of alwayshash. Tasks that depend on output-less tasks (e.g. lint, test) will see fewer cache invalidations. SetcacheStrategy: 'hash'explicitly to restore the previous behavior for a given dependency.
- Behavior change: when
- Added tags support to tasks through new
- Performance
- Reduced task target memory footprint by 50-100%.
- JavaScript
- Added support for Deno v2.8.
- Will use
deno cifor installs in CI whendeno.lockexists and the configured Deno version is >= v2.8. - Will pass
--prodtodeno installfor production installs when the configured Deno version is >= v2.8. - Will resolve
catalog:references inpackage.jsonfiles using catalogs declared in a rootdeno.json.
- Will use
- Added support for Deno v2.8.
- Python
- Added unstable support for
uv pip.- Can be configured using
unstable_python.packageManager: 'uv-pip'in.moon/toolchains.*. - Will inherit install arguments from
unstable_pip.installArgs. - Will inherit sync arguments from
unstable_uv.syncArgs. - Will inherit venv arguments from
unstable_uv.venvArgs.
- Can be configured using
- Added unstable support for
- Fixed a glob regression where unbounded walks could be up to 10x slower.
- Updated proto to v0.57.3 from 0.56.4.
- Updated Rust to v1.96.0.
- Updated dependencies.
- Fixed an issue where the
InstallDependenciesaction would scan manifests within the vendor directory, which could cause issues with some package managers.
- Go
- Added support for Go v1.24
ignoreingo.modandgo.work.
- Added support for Go v1.24
- Fixed an issue where dot folders would be ignored during globs. The
.gitfolder is still always ignored. - Fixed an issue where nested
node_modulesfolders would be ignored during globs. Thenode_modulesfolder at the glob target root is still always ignored. - Fixed an issue where toolchain specific fields, like
versionFromPrototools, were missing from the generated JSON schemas. - Fixed an issue where commands executed during toolchain actions (like setup environment) may trigger a file system deadlock.
- Python
- Updated venv commands to be skipped during environment setup if the directory already exists.
Configure
--clearto force re-initializing.
- Updated venv commands to be skipped during environment setup if the directory already exists.
Configure
- Fixed an issue where proto's
auto-cleanwould remove tools installed by moon as they weren't marked as used. - Fixed a regression where moon would fail with
Failed to execute git and capture outputwhen.gitmodulesreferenced a submodule that hadn't been checked out (e.g.update = none). Uninitialized submodules are now skipped, matching the v1 behavior. - Fixed an issue where toolchain dependency installation would be skipped even when the vendor directory does not exist.
- Fixed an issue where failing actions would not re-run again because their hash would be persisted, even on failure.
- Fixed an issue where
WouldBlockerrors would trigger when attempting to flush buffered output to the console. - Fixed an issue where
--upstream=nonewould error for missing dependencies.
- Python
- Fixed an issue where the wrong arguments were passed to
uv syncdepending on whether proto is managing the Python version. - Fixed an issue where venv paths were not available to commands run through the toolchain, like
uv sync.
- Fixed an issue where the wrong arguments were passed to
- Updated dependencies.
- Fixed a potential deadlock in the action pipeline when running many sync heavy operations.
- Updated the VS Code extension to point to the v2 JSON schemas. If you are still using moon v1, you'll need to pin to an older VS Code extension version until you upgrade to moon v2.
- Fixed a regression in plugin loading that reduced performance of graph operations.
- Fixed an issue where the
unpackextension would trigger a missing plugin locator error.
- Python
- Fixed the Python toolchain depending on pip/uv, when it should be reversed.
- Updated proto to v0.56.4 from 0.56.3.
- Updated dependencies.
- Added request retry support (via proto), that will retry up to 3 times with exponential backoff for transient errors (network issues, rate limits, etc).
- Improved async affected tracking by another 5-10%.
- Updated PowerShell commands to use
-EncodedCommandinstead of-Commandto avoid quoting/escaping issues. Let us know if you run into any issues with this change.
- Fixed
--summarynot being respected inmoon ci. - Fixed issues with graph visualizer commands failing with a JavaScript error after the v2.2 graph changes.
- Fixed an issue where checking the remote cache for an entry before the task execution could cause the task to fail if the remote cache check errored. We now treat remote cache errors as cache misses, and allow the task to execute.
- Fixed an issue where filtered graphs would point to the wrong data because indexes changed.
- JavaScript
- Fixed
pnpm-lock.yamlparsing for pnpm v10's multi-document lockfiles, which are written whenmanagePackageManagerVersionsis enabled (the default).
- Fixed
- TypeScript
- Updated project references to start with
./in preparation for the removal ofbaseUrlin TypeScript v7.
- Updated project references to start with
- Updated proto to v0.56.3 from 0.56.1.
- Updated Rust to v1.95.0.
- Updated dependencies.
- The
--jsonoutput formoon action-graph,moon project-graph, andmoon task-graphcommands has changed. Thegraphnodes are now integers instead of objects, and the node data is instead stored in a separatedataobject.
- Temporarily brought back
x86_64-apple-darwin(Apple Intel) as a supported operating system. - Affected
- Added an experimental asynchronous version of the affected tracker, that is 100-150% faster.
- Enable with the
experiments.asyncAffectedTrackingsetting in.moon/workspace.*.
- Enable with the
- Added an experimental asynchronous version of the affected tracker, that is 100-150% faster.
- Config
- Added
MOON_PIPELINE_AUTO_CLEAN_CACHEenvironment variable support for thepipeline.autoCleanCachesetting. - Added
MOON_PIPELINE_CACHE_LIFETIMEenvironment variable support for thepipeline.cacheLifetimesetting. - Added
MOON_PIPELINE_KILL_PROCESS_THRESHOLDenvironment variable support for thepipeline.killProcessThresholdsetting.
- Added
- 🆕 Daemon
- Added an unstable daemon that will run in the background and process heavy operations. To start, it runs a file watcher on the workspace and invalidates caches.
- Added a
moon daemoncommand withstart,stop, and more subcommands to manage the daemon. - Added an
unstable_daemonsetting to.moon/workspace.*.
- Graphs
- Improved performance of
taskToolchainsandtaskTypefields when querying the project graph. - Greatly reduced memory footprint of the action, project, and task graphs. Nodes in the graph are now integers instead of objects.
- Improved performance of
- Plugin registry
- Improved performance and memory consumption when loading plugins.
- Task runner
- Improved performance of task output archiving, by no longer blocking the main thread pool.
- Toolchains
- Updated the system toolchain to be built-in instead of an external WASM plugin that needs to be downloaded.
- 🆕 Workspace
- Added an experimental asynchronous version of the project and task graph builders, that utilizes
a background thread pool per project to build the graph. This can improve performance by
100-170% in large workspaces.
- Enable with the
experiments.asyncGraphBuildingsetting in.moon/workspace.*. - Unlike the sync version, the async version does not support cycles, and will not cut edges automatically to avoid cycles.
- Enable with the
- Added an experimental asynchronous version of the project and task graph builders, that utilizes
a background thread pool per project to build the graph. This can improve performance by
100-170% in large workspaces.
- Fixed an issue with VCS hooks generation that could leave around stale hooks.
- Fixed an issue where toolchains not managed by proto directly (like Rust) would consistently re-install itself.
- Fixed an issue where OS based tasks would error while executing if they defined
outputs, and you're on a different OS. - Fixed an issue where proto would be installed even when toolchains were disabled with
MOON_TOOLCHAIN_FORCE_GLOBALS.
- Updated proto to v0.56.1 from 0.55.4.
- Updated dependencies.
- Added
moon toolchain downloadandmoon extension downloadcommands that will download all configured toolchain/extension plugins. This allows you to prime the download cache.
- Fixed an "unrecognized subcommand moon" error that can occur when global and local moon binaries exist.
- Fixed an EPIPE error in streaming child processes.
- Fixed trailing
--in task commands being stripped. - Potential fix for graph visualizer commands failing with a JavaScript error.
- Go
- Updated
go listto not requirego.modfile to run.
- Updated
- Go
- Fixed an issue where
go listwas not running in the project root. - Fixed an issue where
go listwould add a project dependency to itself.
- Fixed an issue where
- JavaScript
- Will now remove
node_modulesduring Docker prune, as some package managers don't do this automatically. - Removed
*.config.*files from the Docker scaffold process.
- Will now remove
- npm/pnpm/yarn
- Updated to always include the "shared globals" directory.
- Python
- Fixed install/venv args being passed incorrectly in some situations.
- Updated the affected tracker to mark project/tasks as affected on-demand, instead of everything up front. This allows us to short-circuit early, improving performance for very large repos.
- Updated many commands and call sites to load projects/tasks without expansion, slightly improving performance and memory usage.
- Go
- Added
inferRelationshipsandinferRelationshipsFromTestssettings to controlgo list --depsusage.
- Added
- JavaScript
- Updated
deno.lockandyarn.lockparsing dependencies.
- Updated
- Python
- Fixed an issue where install commands didn't have access to venv bins.
- Fixed an issue where project dependencies were not being inferred correctly when the dependency contains extras metadata.
- Rust
- Updated
Cargo.lockparsing dependencies.
- Updated
- TypeScript
- Added TypeScript v6 support.
- Updated dependencies.
- Fixed an issue with remote caching where the batching max size and limit were not being applied correctly.
- Fixed an issue where exclude/rename for task inheritance applied to tasks other than those in the current project.
- Fixed an issue where toolchains that loaded project/workspace toolchain configuration would not be merged correctly.
- Fixed an issue where task console output may appear out of order.
- Fixed an issue with Git file hashing by temporarily re-enabling Git locks.
- Environment
- Improved our local and remote detection logic. We now also check for common remote devboxes (GitHub Codespaces, Gitpod, etc) in addition to CI environments.
- Projects
- Updated duplicate aliases to no longer be a hard error, and instead will apply to the first encountered project. Duplicates are possible when multiple toolchains all use the same package name (Go, Rust, Node, etc).
- Tasks
- Added 3 new settings to the
affectedFilesoption when using the object syntax:filter- A list of glob patterns to filter the affected files list before passing to the task.ignoreProjectBoundary- When matching affected files, ignore the project boundary and include workspace relative files. Otherwise, only files within the project are matched.passDotWhenNoResults- When there are no affected files after matching and filtering, use.instead of an empty value.
- Added a new option,
runInSyncPhase, that will run the task duringmoon synccommands.
- Added 3 new settings to the
- Toolchains
- Added
inheritAliases(defaulttrue) setting for each toolchain. Can toggle whether to inherit aliases for projects while extending the project graph. - Added
installDependencies(defaulttrue) setting for each toolchain. Can toggle whether to install dependencies (via theInstallDependenciesaction) when running a task.
- Added
- Go
- Will now run
go list --depsto determine project relationships while extending the project graph.
- Will now run
- Python
- Normalized package/dependency names to PEP 503 during graph extending.
- Fixed an issue where package manager toolchain settings were not being inherited correctly.
- TypeScript
- Added a
pruneProjectReferencessetting that prunes non-moon managed project references when syncing.
- Added a
- Fixed invalid JSON schema in MCP
generatetool. - Fixed
$projectTitleand$projectAliasestokens not being substituted. - Fixed an issue where
bashmay not be available (falls back tosh). - Fixed an issue where a task
commandcould not end with--. - Fixed some issues where
.config/moonwas not respected. - Potential fix for tail-end console output not being written.
- Updated dependencies.
- JavaScript
- Added support for
*versions when determining project relationships. - Reworked
pnpm dedupeandyarn dedupedetection logic.
- Added support for
- Python
- Will now read
pyproject.tomldependencies to determine project relationships.
- Will now read
- Updated proto to v0.55.4 from 0.55.2.
- Updated Rust to v1.94.0.
- Updated dependencies.
This is a re-release as the v2.0.0 release workflow failed.
- Temporarily disabled shallow checkouts triggering a hard error in CI until we can implement a better solution. This means that if you have a shallow checkout, you may see incorrect affected results, or Git commands may fail.
- Added more logs to
moon docker pruneto help debug edge cases. - Added
MOON_INCLUDE_RELATIONSenvironment variable support for the--include-relationsCLI option. - Added
.envand.env.*as defaults to thehasher.ignoreMissingPatternssetting.
- Fixed an issue where the graph visualizers would not render correctly in the VS Code extension.
- Fixed an issue where a task with
shell: falsewould be force enabled when a glob/env was detected. We now respect the configured value. - Fixed an issue where "run" type based tasks would not run in CI.
- Updated
moon upgradeto upgrade via proto if we detect that moon is managed by proto. This will runproto install moon latest.
- Fixed some WASM serialization errors.
- Fixed the
moon upgradecommand not handling the new v2 distribution format correctly. If you are on moon v2.0.0, the upgrade command will still be broken until you upgrade to this patch.
View the migration guide for a full list of breaking changes and how to easily migrate!
-
Renamed "touched files" to "changed files".
-
CLI
- Removed canary and nightly releases.
- Removed commands:
moon node,moon migrate from-package-json,moon query hash,moon query hash-diff - Renamed all options and flags to kebab-case instead of camelCase.
- Reworked many commands and their arguments. Refer to the migration guide for details.
- Reworked console output handling. Updated
--summarywith different levels. - Reworked release distribution to use archives instead of direct executables.
-
Configuration
- Renamed, removed, or changed many settings. Refer to the migration guide for details.
- Renamed
.moon/toolchain.ymlto.moon/toolchains.yml(plural).
-
MCP
- Updated protocol version to 2025-11-25.
- Updated
get_projectsandget_tasksto return fragments, to reduce the payload size.
-
Projects
- Reworked how the
languageis detected. - Flattened
projectmetadata structure.
- Reworked how the
-
Tasks
- Task inheritance now deep merges instead of shallow merges when dealing with extends and multi-global.
- Task
commandandargsonly support simple commands now. Usescriptfor compound commands (pipes, redirects, multiple commands, etc). - Removed "watcher" task
preset. - Reworked env var merge order, substitution, and more. Refer to the migration guide for details.
- Reworked
.envhandling.- Moved loading to occur before task execution, instead of creation.
- Can no longer reference task
envvars for substitution.
-
Toolchain
- Removed the old platform system, and replaced it with the new WASM plugin system.
- All old "stable" toolchains have been replaced with the new "unstable" toolchains.
- Removed the old platform system, and replaced it with the new WASM plugin system.
-
VCS
- Reworked the hooks layer for better interoperability.
-
WASM API
- Removed the
/cwdvirtual path. - Renamed
ProjectFragment.aliastoProjectFragment.aliasesand changed its type fromOption<String>toVec<String>. - Removed
RegisterExtensionOutput.config_schemafield. Use the newdefine_extension_configplugin function instead.
- Removed the
View the announcement blog post for all updates, new features, improvements, and much more!
- Action pipeline
- Will now always generate a hash for a task, even if caching is disabled.
- Applies "transitive reduction" to the graph, removing unnecessary edges for better performance.
- Improved console output, logging, and error handling.
- Improved parallelism when running tasks.
- Now resolves and expands targets before partitioning.
- Now partitions after filtering based on affected state.
- CLI
- New commands:
moon exec,moon extension,moon hash,moon projects,moon tasks,moon query affected,moon template - Updated commands
moon check,moon ci, andmoon run:- Now uses
moon execunder the hood. - Added levels to
--summary.
- Now uses
- Updated commands that require an identifier to prompt for it if not provided.
- Stabilized the
moonxbinary (which usesmoon execunder the hood). - Added support for
.config/mooninstead of.moon. - Added support for
...in task targets, which is an alias for**/*. This is similar to how Bazel targets work. - Improved stack memory usage by pushing thread data to the heap. This resolves spurious stack overflow issues.
- New commands:
- Configuration
- Added support for more formats: JSON, TOML, and HCL.
- Improved error messages for union based settings.
.moon/extensions.*- New file for configuring extensions (formerly in
workspace.extensions).
- New file for configuring extensions (formerly in
.moon/tasks.*- Added
inheritedBysetting for configuration based task inheritance.
- Added
.moon/workspace.*- Added
projects.globFormatsetting. - Added
defaultProjectsetting. - Stabilized remote caching.
- Added
moon.*- Added
mergeToolchainstask option. - Added "utility" task
preset. - Added "data"
stack.
- Added
- Docker
- Better toolchain integration.
- Added
--no-setupand--templatesupport tomoon docker file. - Updated project configs to override workspace configs.
- Extensions
- Added a new extension,
unpack, for unpacking archive files. - Added
.moon/extensions.*configuration file. - Added support for new plugin APIs:
define_extension_config,extend_command,extend_project_graph,extend_task_command,extend_task_script,sync_project, andsync_workspace.
- Added a new extension,
- MCP
- Added a
generatetool for running the code generator.
- Added a
- Projects
- Added a default project concept.
- Added path based IDs instead of dir name IDs.
- Updated projects to support multiple aliases (one from each applicable toolchain).
- Remote cache
- Stabilized all settings.
- Enabled gzip/zstd compression for HTTP requests.
- Tasks
- Added deep merging support for task inheritance.
- Updated
commandandargswith better syntax parsing and error handling.- Better handling of quotes, escapes, and spaces.
- Extracts env vars into the task.
- Updated
envvalues to supportnull, which would remove an inherited system env var. - Updated
envFileoption to support token/var substitution. - Improved
.envhandling:- Updated the parser to support more syntax.
- Updated loading to occur before task execution, instead of creation.
- Can now reference system/moon/task env vars for substitution.
- Toolchains
- Stabilized the new WASM plugin system.
- Improved how toolchains extend env vars and paths for commands and scripts.
- Tokens
- Added new tokens:
$projectTitle,$projectAliases,$taskToolchains
- Added new tokens:
- VCS
- Replaced the old v1 Git implementation with a new v2 implementation.
- Improved support for worktrees, submodules, and more.
- WASM API
- Added a
load_extension_config_by_idhost function. - Added
define_extension_config,initialize_extension, andextend_commandplugin functions. - Added
load_extension_config,parse_extension_configandparse_extension_config_schemautility functions. - Added
DefineExtensionConfigOutput,InitializeExtensionInput,InitializeExtensionOutput,ExtendCommandInput, andExtendCommandOutputtypes. - Added
ExtendProjectGraphInput.extension_config,ExtendTaskCommandInput.extension_config,ExtendTaskScriptInput.extension_config,SyncProjectInput.extension_config, andSyncWorkspaceInput.extension_configfields. - Added
RegisterToolchainOutput.languagefield.
- Added a
- Migrate Nx
- Added support for the following
project.jsonfields:targets.*.continuous
- Added support for the following
- Migrate Turborepo
- Added support for the following
turbo.jsonfields:tags,tasks.*.env(wildcards and negation)
- Added support for the following
- Unpack
- Updated to use
unzipandtarcommands.
- Updated to use
- JavaScript
- Added support for Yarn v4.10 catalogs.
- Fixed an issue where implicit dependencies would sometimes not resolve.
- Fixed local executables in
@moonrepopackages not being detected correctly. - Fixed task job parallelism to partition after tasks have been filtered based on affected state.
- Fixed an issue where env var substitution would not process in the order they were defined.
- Fixed an issue where ctrl+c wouldn't exit when a prompt was waiting for input.
- Fixed an issue where
projectbased task inputs would not be reflected internally in the input files/globs list. - Fixed an issue where running a task that triggers a system/moon error wouldn't output the error message. This also aborts the action pipeline correctly now.
- Fixed an issue where errors during project graph building would not be reported correctly.
- Fixed an issue where a negated glob in a file group would not expand properly when used as an argument.