Skip to content

Latest commit

 

History

History
1217 lines (1003 loc) · 58.9 KB

File metadata and controls

1217 lines (1003 loc) · 58.9 KB

Changelog

2.5.5

🚀 Updates

  • Changed files aggregation is now cached for improved performance.

🐞 Fixes

  • Fixed moon query commands not respecting the task options.runInCI setting, when running in CI.
  • Fixed an issue where .gitignore was 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.

2.5.4

🐞 Fixes

  • 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 setup for 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.

⚙️ Internal

  • Updated Rust to v1.98.0.
  • Updated dependencies.

2.5.3

🧰 Toolchains

  • Bun
    • Updated the embedded bun tool to support Windows arm64 (Bun v1.3.10+) and musl based Linux (Bun v1.1.35+).
  • Go
    • Test binary pseudo-packages are no longer inferred as relationships. go list -deps -test reports a synthetic pkg.test package for each tested package; its .test suffix 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.sum is now reported as a project-graph input alongside the module's go.mod. As the lock file pinning resolved dependency versions, a change there (a dependency added, upgraded, or dropped) can alter what go list resolves 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 no go.sum.
  • JavaScript
    • Updated Bun support for the v1.4 release:
      • Dependencies are now installed with bun ci in CI when a bun.lock exists (v1.2.20+), as Bun does not enable frozen lockfiles in CI automatically.
      • Dependencies are now deduped with bun dedupe when the dedupeOnLockfileChange setting is enabled (v1.4+).
      • Focused installs now include workspace dependencies, by passing ... dependency relations to --filter (v1.4+).

🐞 Fixes

  • 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, since workspace.inheritedTasks exclude/rename filters can only match tasks by ID (#2687).

2.5.2

🚀 Updates

  • 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 outputStyle task option. Locally, we'll still stream the output for primary targets, ignoring that option. We will be revisiting this in v2.6.
  • Updated versionConstraint in .moon/workspace.* to use a range instead of a requirement, which allows for more flexible version constraints.

🐞 Fixes

  • Fixed an issue where commands executed by toolchain plugins at the workspace root would receive a PWD environment variable with a trailing slash (an artifact of virtual path conversion). Shells that validate PWD on startup, like nushell, refused to run, failing the command (#2676).
  • Fixed an issue where combining --force with --affected would not pass affected files to the affectedFiles task option, as arguments or the MOON_AFFECTED_FILES environment 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, InstallDependencies could still run its install command after SetupEnvironment failed. 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 env variable to null would also prevent that variable from being inherited from an env file (envFile). A null value 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 --summary for moon ci was 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.

2.5.1

🐞 Fixes

  • Fixed an issue where --affected with --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.

2.5.0

💥 Breaking

  • WASM API
    • Reworked the VirtualPath type from the ground up. Is no longer an enum, but instead a newtype wrapper around PathBuf.
      • 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, VirtualPath now has access to all PathBuf methods, which was not possible before.
    • Removed the from_virtual_path and to_virtual_path extism host functions, into_real_path and into_virtual_path wrapper functions, and real_path! and virtual_path! macros. Use the conversion utils instead (below).

🚀 Updates

  • 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 --otel global option (MOON_OTEL), for exporting traces and metrics.
      • Added a --otel-logs global option (MOON_OTEL_LOGS), for exporting log events as OTLP logs.
      • Added a --otel-service-name global option (MOON_OTEL_SERVICE_NAME), for the reported service name.
      • The destination and transport are configured with the standard OTEL_EXPORTER_OTLP_* environment variables.
    • Updated the moon setup action 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.
  • Config
    • Added an unstable cache.unstable_sharedWorktreeCache setting 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/cache directory, or ~/.moon/cache/shared when the repository root has no checkout (bare clones). Requires the casOutputsCache experiment.
    • Added environment variable support for cache settings: MOON_CACHE_CAS_MAX_SIZE, MOON_CACHE_CAS_VERIFY_INTEGRITY, and MOON_CACHE_SHARED_WORKTREE_CACHE.
    • Added an env setting to .moon/tasks/**/* configs. These environment variables are inherited by all matching projects, and are merged into each project's env setting, with project-level variables taking precedence.
    • Added a workspace.mergeStrategies setting to moon.* config, which controls how project settings are merged with inherited workspace-level settings. Currently supports env and fileGroups, using the same merge strategies as task merging (append, prepend, preserve, and replace).
    • Project globs can now be configured with a trailing file, allowing more precise project matching. For example, apps/*/package.json will only find Node.js projects, and src/**/*.csproj will 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.
  • 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, and nativeFileHashing experiments are now enabled by default. If you run into issues, please report it, and then disable the experiment to continue.
  • 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.
  • WASM API
    • Added a RealPath type, which is a newtype wrapper around PathBuf that represents a real path on the host file system. This is a sibling to the VirtualPath type, which represents a virtual path in the guest WASM environment.
    • Added convert_to_virtual_path and convert_to_real_path helper functions for converting between real and virtual paths, using a list of host-to-guest path mappings.
      • Can also use VirtualPathExt::to_real_path and RealPathExt::to_virtual_path extension traits for the same functionality.
    • Added DefineRequirementsOutput.for_setup_environment and for_setup_toolchain fields, which allow toolchains to specify requirements for the setup environment and setup toolchain actions, respectively.
    • Added PruneDockerInput.project_dependencies field, 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_config to inherit the project-level settings when applicable.

🧰 Toolchains

  • Go
    • The force option for bins entries is now respected, and will always install the binary.
    • Fixed configured bins not 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.mod module path plus the project's relative directory), and go list -deps results are matched against those by longest prefix. This makes relationships resolvable in repositories that share a single go.mod across all projects.
    • Sibling modules required by version without a go.work no longer create project relationships, since those builds consume the published module rather than the local source. When the go binary is unavailable, projects with their own go.mod under a workspace go.work fall back to resolving relationships from their direct requires.
    • replace directives 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 a go.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 declared dependsOn on its parent.
  • 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.yaml when present, otherwise from package.json.
      • Does not require the Node.js toolchain, as nub is a standalone binary.
    • Fixed bun.lock parsing failing on Git/GitHub dependencies that include both package metadata (dependencies, bin, etc) and an integrity hash.
  • Node
    • Deprecated the syncVersionManagerConfig setting (it never worked correctly).
  • Python
    • Ensures that package manager toolchains are installed before setting up the environment.
    • Added support to the Docker pruning workflow where we remove .venv directories for non-focused projects (those that were not explicitly scaffolded).
  • Rust
    • Fixed an issue where Docker scaffolding would leave behind empty lib.rs or main.rs files.
    • Fixed configured bins not being reinstalled when their binaries were uninstalled or deleted outside of moon. Only missing binaries are now installed.

🐞 Fixes

  • Fixed an issue where the --stack and --source options of moon query projects displayed 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/--json output.
  • Fixed an issue where a task with runDepsInParallel: false would 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 .gitmodules file, when the git object database was incomplete or unreachable (e.g. partial clones, or --reference clones whose alternates are inaccessible). Submodule detection is now skipped entirely when no .gitmodules file exists.
  • Fixed an issue where the synchronous affected tracker (experiments.asyncAffectedTracking disabled) would silently skip transitive dependent tasks when running with --downstream and --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 the windowsShell task option is bash, they now expand using the Unix path format (/c/path) that bash expects.
  • Fixed an issue where --downstream deep would 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 direct already 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-shim binary) 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.

⚙️ Internal

  • Renamed the TaskMergeStrategy type to MergeStrategy in @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.

2.4.6

🚀 Updates

  • Updated MOON_BASE and MOON_HEAD to no longer require also passing --affected.

🐞 Fixes

  • Fixed an issue in GitLab CI where the wrong HEAD would be used for merge request pipelines.

2.4.5

🐞 Fixes

  • 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.

2.4.4

🐞 Fixes

  • 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_EXHAUSTED error, 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.localReadOnly setting.

2.4.3

🚀 Updates

  • 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-legacy instead.

🐞 Fixes

  • Fixed an issue where runDepsInParallel: false would 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 ci failing in certain CI provider pull request builds, where the base branch is provided as a fully-qualified refs/heads/<branch> ref that couldn't be resolved in a detached HEAD checkout.
  • Fixed task binaries failing with "command not found" in CI providers like CircleCI, where an export PATH=... in the $BASH_ENV file would overwrite the PATH that moon injects for tasks. BASH_ENV is no longer passed to bash wrapped child processes, unless explicitly set with the task env option.
  • Fixed an issue where task outputStyle was 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.log state 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 --dependents would skip the dependents of lib:build when app:build depends on it.
  • Fixed tasks that emit read-only outputs (e.g. 0444 files) failing on every cache hit with a "Permission denied" error when the casOutputsCache experiment is enabled. Caches that already contain read-only objects are healed automatically.
  • Fixed an issue where moon query changed-files would include uncommitted changes from the local index (git status) even when an explicit --head revision was provided, causing false positives when comparing 2 revisions. This also applies to affected detection with an explicit head, e.g. the MOON_HEAD environment variable or --affected base:head. Additionally, MOON_BASE and MOON_HEAD environment 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.

2.4.2

🚀 Updates

  • Reworked the workspace graph caching to avoid plugin calls on cache hits, which can improve performance in large workspaces.

🧰 Toolchains

  • Go
    • Fixed go list -deps running on non-Go projects.

2.4.1

🐞 Fixes

  • 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.

2.4.0

🚀 Updates

  • CLI
    • Added a --update-constraint option to moon upgrade that will update the workspace config version constraint to the latest version.
    • Updated --log level handling. debug should be used for the most part, as it includes most debug information. trace now includes a ton of information, which may be too spammy for normal debugging (is meant for agents and deep diagnostics).
  • 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.json state file (replacing moond.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 upgrade is 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 checks setting 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 mergeChecks option to tasks to control the merge behavior of checks when extending tasks.
    • Added a top-level taskOptions setting to moon.* that allows you to configure default task options for all tasks within the current project, which can be overridden per task.
  • 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.

🧰 Toolchains

  • 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.
  • 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.

🐞 Fixes

  • 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.hooksPath was 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.

⚙️ Internal

  • Updated proto to v0.58.2 from 0.57.4.
  • Updated dependencies.

2.3.5

🐞 Fixes

  • Fixed an issue where Git hooks would not work correctly in submodules.
  • Fixed an issue where moon docker commands may generate non-deterministic output, resulting in invalid Docker layer caching.

🧰 Toolchains

  • Go
    • Fixed go list -deps relationship inference not detecting sibling workspace modules imported via subpackages (e.g. example.com/org/a/pkg).
  • JavaScript
    • Added Deno v2.9 support.

2.3.4

🐞 Fixes

  • 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 casOutputsCache experiment was enabled.

🧰 Toolchains

  • Python
    • Updated uv sync to use --no-dev when installing production only dependencies.
  • Rust
    • Updated cargo-binstall installation to use --locked.

2.3.3

🛡️ Security

  • 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.

🧰 Toolchains

  • Go
    • Fixed a go.mod parsing regression that failed to parse tool ().

2.3.2

🚀 Updates

  • 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.

🐞 Fixes

  • 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.

🧰 Toolchains

  • Go
    • Added an inferRelationshipsPackages setting to customize the package patterns passed to go list --deps.
    • Updated go list --deps relationship inference to scan all packages (./...) by default, so dependencies imported only from subdirectories (internal/, pkg/, ...) are now inferred.

2.3.1

🚀 Updates

  • 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.

🐞 Fixes

  • Reworked the daemon connect/ready logic to possibly fix some Windows connection issues.
  • Fixed an issue where the task dependency cacheStrategy inferrence was not working correctly based on what experiments are enabled.
  • Fixed an issue where locks created at .moon/cache/locks would not be cleaned up.

⚙️ Internal

  • Updated proto to v0.57.4 from 0.57.3.

2.3.0

🚀 Updates

  • 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.casOutputsCache setting in .moon/workspace.*.
    • Added a new top-level cache setting in .moon/workspace.* for tuning the content-addressable storage (CAS) cache.
  • Daemon
    • When pipeline.autoCleanCache is 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.
  • 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.nativeFileHashing setting in .moon/workspace.*.
  • MCP
    • Added get_template and get_templates tools so AI coding assistants can discover templates and inspect their variable schemas before calling generate.
  • Tasks
    • Added tags support to tasks through new tags and options.mergeTags settings.
      • Added taskTag field support to MQL.
      • Added --tags option support to moon 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 a cacheStrategy field to task dependencies that controls how a dependency's changes invalidate the current task's cache. Supports hash, ignored, and outputs — 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 cacheStrategy is omitted, the default is now hash if the dependency declares outputs and ignored if it doesn't, instead of always hash. Tasks that depend on output-less tasks (e.g. lint, test) will see fewer cache invalidations. Set cacheStrategy: 'hash' explicitly to restore the previous behavior for a given dependency.
  • Performance
    • Reduced task target memory footprint by 50-100%.

🧰 Toolchains

  • JavaScript
    • Added support for Deno v2.8.
      • Will use deno ci for installs in CI when deno.lock exists and the configured Deno version is >= v2.8.
      • Will pass --prod to deno install for production installs when the configured Deno version is >= v2.8.
      • Will resolve catalog: references in package.json files using catalogs declared in a root deno.json.
  • 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.

🐞 Fixes

  • Fixed a glob regression where unbounded walks could be up to 10x slower.

⚙️ Internal

  • Updated proto to v0.57.3 from 0.56.4.
  • Updated Rust to v1.96.0.
  • Updated dependencies.

2.2.6

🐞 Fixes

  • Fixed an issue where the InstallDependencies action would scan manifests within the vendor directory, which could cause issues with some package managers.

🧰 Toolchains

  • Go
    • Added support for Go v1.24 ignore in go.mod and go.work.

2.2.5

🐞 Fixes

  • Fixed an issue where dot folders would be ignored during globs. The .git folder is still always ignored.
  • Fixed an issue where nested node_modules folders would be ignored during globs. The node_modules folder 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.

🧰 Toolchains

  • Python
    • Updated venv commands to be skipped during environment setup if the directory already exists. Configure --clear to force re-initializing.

2.2.4

🐞 Fixes

  • Fixed an issue where proto's auto-clean would 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 output when .gitmodules referenced 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 WouldBlock errors would trigger when attempting to flush buffered output to the console.
  • Fixed an issue where --upstream=none would error for missing dependencies.

🧰 Toolchains

  • Python
    • Fixed an issue where the wrong arguments were passed to uv sync depending 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.

⚙️ Internal

  • Updated dependencies.

2.2.3

🐞 Fixes

  • Fixed a potential deadlock in the action pipeline when running many sync heavy operations.

2.2.2

🚀 Updates

  • 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.

🐞 Fixes

  • Fixed a regression in plugin loading that reduced performance of graph operations.
  • Fixed an issue where the unpack extension would trigger a missing plugin locator error.

🧰 Toolchains

  • Python
    • Fixed the Python toolchain depending on pip/uv, when it should be reversed.

⚙️ Internal

  • Updated proto to v0.56.4 from 0.56.3.
  • Updated dependencies.

2.2.1

🚀 Updates

  • 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 -EncodedCommand instead of -Command to avoid quoting/escaping issues. Let us know if you run into any issues with this change.

🐞 Fixes

  • Fixed --summary not being respected in moon 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.

🧰 Toolchains

  • JavaScript
    • Fixed pnpm-lock.yaml parsing for pnpm v10's multi-document lockfiles, which are written when managePackageManagerVersions is enabled (the default).
  • TypeScript
    • Updated project references to start with ./ in preparation for the removal of baseUrl in TypeScript v7.

⚙️ Internal

  • Updated proto to v0.56.3 from 0.56.1.
  • Updated Rust to v1.95.0.
  • Updated dependencies.

2.2.0

💥 Breaking

  • The --json output for moon action-graph, moon project-graph, and moon task-graph commands has changed. The graph nodes are now integers instead of objects, and the node data is instead stored in a separate data object.

🚀 Updates

  • 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.asyncAffectedTracking setting in .moon/workspace.*.
  • Config
    • Added MOON_PIPELINE_AUTO_CLEAN_CACHE environment variable support for the pipeline.autoCleanCache setting.
    • Added MOON_PIPELINE_CACHE_LIFETIME environment variable support for the pipeline.cacheLifetime setting.
    • Added MOON_PIPELINE_KILL_PROCESS_THRESHOLD environment variable support for the pipeline.killProcessThreshold setting.
  • 🆕 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 daemon command with start, stop, and more subcommands to manage the daemon.
    • Added an unstable_daemon setting to .moon/workspace.*.
  • Graphs
    • Improved performance of taskToolchains and taskType fields 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.
  • 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.asyncGraphBuilding setting in .moon/workspace.*.
      • Unlike the sync version, the async version does not support cycles, and will not cut edges automatically to avoid cycles.

🐞 Fixes

  • 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.

⚙️ Internal

  • Updated proto to v0.56.1 from 0.55.4.
  • Updated dependencies.

2.1.4

🚀 Updates

  • Added moon toolchain download and moon extension download commands that will download all configured toolchain/extension plugins. This allows you to prime the download cache.

🐞 Fixes

  • 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.

🧰 Toolchains

  • Go
    • Updated go list to not require go.mod file to run.

2.1.3

🧰 Toolchains

  • Go
    • Fixed an issue where go list was not running in the project root.
    • Fixed an issue where go list would add a project dependency to itself.
  • JavaScript
    • Will now remove node_modules during Docker prune, as some package managers don't do this automatically.
    • Removed *.config.* files from the Docker scaffold process.
  • npm/pnpm/yarn
    • Updated to always include the "shared globals" directory.
  • Python
    • Fixed install/venv args being passed incorrectly in some situations.

2.1.2

🚀 Updates

  • 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.

🧰 Toolchains

  • Go
    • Added inferRelationships and inferRelationshipsFromTests settings to control go list --deps usage.
  • JavaScript
    • Updated deno.lock and yarn.lock parsing dependencies.
  • 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.lock parsing dependencies.
  • TypeScript
    • Added TypeScript v6 support.

⚙️ Internal

  • Updated dependencies.

2.1.1

🐞 Fixes

  • 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.

2.1.0

🚀 Updates

  • 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 affectedFiles option 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 during moon sync commands.
  • Toolchains
    • Added inheritAliases (default true) setting for each toolchain. Can toggle whether to inherit aliases for projects while extending the project graph.
    • Added installDependencies (default true) setting for each toolchain. Can toggle whether to install dependencies (via the InstallDependencies action) when running a task.

🧰 Toolchains

  • Go
    • Will now run go list --deps to determine project relationships while extending the project graph.
  • 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 pruneProjectReferences setting that prunes non-moon managed project references when syncing.

🐞 Fixes

  • Fixed invalid JSON schema in MCP generate tool.
  • Fixed $projectTitle and $projectAliases tokens not being substituted.
  • Fixed an issue where bash may not be available (falls back to sh).
  • Fixed an issue where a task command could not end with --.
  • Fixed some issues where .config/moon was not respected.
  • Potential fix for tail-end console output not being written.

⚙️ Internal

  • Updated dependencies.

2.0.4

🧰 Toolchains

  • JavaScript
    • Added support for * versions when determining project relationships.
    • Reworked pnpm dedupe and yarn dedupe detection logic.
  • Python
    • Will now read pyproject.toml dependencies to determine project relationships.

⚙️ Internal

  • Updated proto to v0.55.4 from 0.55.2.
  • Updated Rust to v1.94.0.
  • Updated dependencies.

2.0.3

This is a re-release as the v2.0.0 release workflow failed.

2.0.2

🚀 Updates

  • 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 prune to help debug edge cases.
  • Added MOON_INCLUDE_RELATIONS environment variable support for the --include-relations CLI option.
  • Added .env and .env.* as defaults to the hasher.ignoreMissingPatterns setting.

🐞 Fixes

  • Fixed an issue where the graph visualizers would not render correctly in the VS Code extension.
  • Fixed an issue where a task with shell: false would 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.

2.0.1

🚀 Updates

  • Updated moon upgrade to upgrade via proto if we detect that moon is managed by proto. This will run proto install moon latest.

🐞 Fixes

  • Fixed some WASM serialization errors.
  • Fixed the moon upgrade command 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.

2.0.0

💥 Breaking

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 --summary with 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.yml to .moon/toolchains.yml (plural).
  • MCP

    • Updated protocol version to 2025-11-25.
    • Updated get_projects and get_tasks to return fragments, to reduce the payload size.
  • Projects

    • Reworked how the language is detected.
    • Flattened project metadata structure.
  • Tasks

    • Task inheritance now deep merges instead of shallow merges when dealing with extends and multi-global.
    • Task command and args only support simple commands now. Use script for 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 .env handling.
      • Moved loading to occur before task execution, instead of creation.
      • Can no longer reference task env vars 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.
  • VCS

    • Reworked the hooks layer for better interoperability.
  • WASM API

    • Removed the /cwd virtual path.
    • Renamed ProjectFragment.alias to ProjectFragment.aliases and changed its type from Option<String> to Vec<String>.
    • Removed RegisterExtensionOutput.config_schema field. Use the new define_extension_config plugin function instead.

🚀 Updates

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, and moon run:
      • Now uses moon exec under the hood.
      • Added levels to --summary.
    • Updated commands that require an identifier to prompt for it if not provided.
    • Stabilized the moonx binary (which uses moon exec under the hood).
    • Added support for .config/moon instead 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.
  • 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).
    • .moon/tasks.*
      • Added inheritedBy setting for configuration based task inheritance.
    • .moon/workspace.*
      • Added projects.globFormat setting.
      • Added defaultProject setting.
      • Stabilized remote caching.
    • moon.*
      • Added mergeToolchains task option.
      • Added "utility" task preset.
      • Added "data" stack.
  • Docker
    • Better toolchain integration.
    • Added --no-setup and --template support to moon 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, and sync_workspace.
  • MCP
    • Added a generate tool for running the code generator.
  • 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 command and args with better syntax parsing and error handling.
      • Better handling of quotes, escapes, and spaces.
      • Extracts env vars into the task.
    • Updated env values to support null, which would remove an inherited system env var.
    • Updated envFile option to support token/var substitution.
    • Improved .env handling:
      • 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
  • 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_id host function.
    • Added define_extension_config, initialize_extension, and extend_command plugin functions.
    • Added load_extension_config, parse_extension_config and parse_extension_config_schema utility functions.
    • Added DefineExtensionConfigOutput, InitializeExtensionInput, InitializeExtensionOutput, ExtendCommandInput, and ExtendCommandOutput types.
    • Added ExtendProjectGraphInput.extension_config, ExtendTaskCommandInput.extension_config, ExtendTaskScriptInput.extension_config, SyncProjectInput.extension_config, and SyncWorkspaceInput.extension_config fields.
    • Added RegisterToolchainOutput.language field.

🧩 Extensions

  • Migrate Nx
    • Added support for the following project.json fields: targets.*.continuous
  • Migrate Turborepo
    • Added support for the following turbo.json fields: tags, tasks.*.env (wildcards and negation)
  • Unpack
    • Updated to use unzip and tar commands.

🧰 Toolchains

  • JavaScript
    • Added support for Yarn v4.10 catalogs.
    • Fixed an issue where implicit dependencies would sometimes not resolve.

🐞 Fixes

  • Fixed local executables in @moonrepo packages 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 project based 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.

⚙️ Internal

  • Updated proto to v0.55.2 from 0.53.2 (view v0.54 changes).
  • Updated wasmtime to v37.
  • Updated Rust to v1.93.0.
  • Updated dependencies.