<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>moonrepo Blog</title>
        <link>https://moonrepo.dev/blog</link>
        <description>moonrepo Blog</description>
        <lastBuildDate>Mon, 13 Apr 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[moon v2.2 - Daemon, AI skills, async graph building, async affected tracking, and more]]></title>
            <link>https://moonrepo.dev/blog/moon-v2.2</link>
            <guid>https://moonrepo.dev/blog/moon-v2.2</guid>
            <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In this release, we focused entirely on performance improvements, with the introduction of a daemon,]]></description>
            <content:encoded><![CDATA[<p>In this release, we focused entirely on performance improvements, with the introduction of a daemon,
and refactoring core components to be asynchronous.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="new-debug-task-ai-agent-skill">New <code>debug-task</code> AI agent skill<a href="https://moonrepo.dev/blog/moon-v2.2#new-debug-task-ai-agent-skill" class="hash-link" aria-label="Direct link to new-debug-task-ai-agent-skill" title="Direct link to new-debug-task-ai-agent-skill" translate="no">​</a></h2>
<p>We're shipping a new AI agent skill called <code>debug-task</code> that helps you systematically diagnose
failing or misbehaving moon tasks. If you've ever spent time hunting down why a task is producing
stale results, getting unexpected cache misses, or behaving differently in CI, this skill is for
you.</p>
<p>To install this skill, run the following command:</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ npx skills </span><span class="token function" style="color:#ff94ff;font-weight:bold">add</span><span class="token plain"> moonrepo/moon </span><span class="token parameter variable" style="color:#fef9c3">--skill</span><span class="token plain"> debug-task</span><br></span></code></pre></div></div>
<p>The skill walks you through a 5-step diagnostic workflow:</p>
<ol>
<li class="">Inspect the resolved task configuration (after inheritance merging)</li>
<li class="">Run with maximum verbosity to see exactly what moon is doing</li>
<li class="">Inspect cache state and hash manifests</li>
<li class="">Match symptoms to root causes using a built-in decision tree</li>
<li class="">Validate that the fix actually resolves the issue</li>
</ol>
<p>It covers 15+ specific problem types across cache issues, configuration mistakes, execution
problems, and CI vs local discrepancies. Most issues resolve by step 3, with deeper reference
material available on demand.</p>
<p>To use it, simply describe your task problem in Claude Code, Codex, OpenCode, or another compatible
AI agent — mention the task target, what you expected, and what actually happened. The skill will
take it from there.</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token plain">/debug-task Help me debug why the </span><span class="token variable" style="color:#fef9c3">`</span><span class="token variable" style="color:#fef9c3">app:build</span><span class="token variable" style="color:#fef9c3">`</span><span class="token plain"> task is not being cached</span><br></span></code></pre></div></div>
<blockquote>
<p>Thanks to <a href="https://github.com/Yuzu02" target="_blank" rel="noopener noreferrer" class="">Yuzu02</a> for the amazing contribution!</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="unstable-daemon">Unstable daemon<a href="https://moonrepo.dev/blog/moon-v2.2#unstable-daemon" class="hash-link" aria-label="Direct link to Unstable daemon" title="Direct link to Unstable daemon" translate="no">​</a></h2>
<p>Continuing the theme of performance, this release introduces an unstable background daemon. The
daemon is a long-lived server process that keeps the workspace graph hot in memory and watches for
file system changes, rebuilding the graph asynchronously only when configuration files change. This
means that after the first <code>moon</code> invocation, subsequent commands can skip graph building entirely
and connect to the running daemon instead.</p>
<p>To try it out by enabling it in your workspace configuration:</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/workspace.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">unstable_daemon</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><br></span></code></pre></div></div>
<p>Or test it with an environment variable first:</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token assign-left variable" style="color:#fef9c3">MOON_DAEMON</span><span class="token operator" style="color:#b7a9f9">=</span><span class="token plain">true moon run :build</span><br></span></code></pre></div></div>
<p>When enabled, the daemon starts automatically on the first CLI command and stays running in the
background. You can manage it with <a class="" href="https://moonrepo.dev/docs/commands/daemon/start"><code>moon daemon start</code></a>,
<a class="" href="https://moonrepo.dev/docs/commands/daemon/stop"><code>stop</code></a>, <a class="" href="https://moonrepo.dev/docs/commands/daemon/restart"><code>restart</code></a>,
<a class="" href="https://moonrepo.dev/docs/commands/daemon/status"><code>status</code></a>, and <a class="" href="https://moonrepo.dev/docs/commands/daemon/logs"><code>logs</code></a> commands. If the
daemon is unavailable for any reason, the CLI falls back to building graphs in-process — so there's
no risk in enabling it.</p>
<p>Since this is unstable, behavior and configuration may change in future releases. Check out the
<a class="" href="https://moonrepo.dev/docs/guides/daemon">daemon guide</a> for full details on how it works, what files are watched, and
troubleshooting tips.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="experimental-async-graph-building">Experimental async graph building<a href="https://moonrepo.dev/blog/moon-v2.2#experimental-async-graph-building" class="hash-link" aria-label="Direct link to Experimental async graph building" title="Direct link to Experimental async graph building" translate="no">​</a></h2>
<p>Project and task building is a critical piece of moon. In previous versions, graph building was
implemented synchronously, which could lead to performance issues in larger workspaces, but was
unnoticeable in smaller workspaces. With this release, graph building is now available with an
experimental async implementation, which must be enabled.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/workspace.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">experiments</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">asyncGraphBuilding</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><br></span></code></pre></div></div>
<p>To demonstrate the performance improvements, take the following benchmark results for example. For
every benchmark, we had N projects with 4 tasks per project, iterated 100 times. The "average time"
columns show the average time taken across all iterations, while the "total suite time" columns show
the total time taken for all iterations. The "speedup" column shows the percentage improvement of
the async builder compared to the sync builder.</p>
<p>As you can clearly see, as the number of projects and tasks increase, the performance improvement
becomes more significant, with a speedup of 40-170%. Over time, and with the introducion of the
daemon, this will only get better!</p>
<table><tbody><tr><th>Benchmark</th><th colspan="2">Average time</th><th colspan="2">Total suite time</th><th>Speedup</th></tr><tr><td></td><td>Sync</td><td>Async</td><td>Sync</td><td>Async</td><td></td></tr><tr><td>100 projects / 400 tasks</td><td>78ms</td><td>51ms</td><td>9.7s</td><td>5.1s</td><td>41.8%</td></tr><tr><td>1,000 projects / 4,000 tasks</td><td>514.5ms</td><td>119ms</td><td>57.4s</td><td>12s</td><td>125%</td></tr><tr><td>5,000 projects / 20,000 tasks</td><td>5.7s</td><td>457ms</td><td>602.6s</td><td>46s</td><td>170%</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="caveats">Caveats<a href="https://moonrepo.dev/blog/moon-v2.2#caveats" class="hash-link" aria-label="Direct link to Caveats" title="Direct link to Caveats" translate="no">​</a></h3>
<p>While the async graph builder is faster, there are some caveats to be aware of.</p>
<ul>
<li class="">Since this is experimental, it is not enabled by default. You must enable it in your workspace
configuration to take advantage of the performance improvements.</li>
<li class="">The async graph builder does not cache the built graph as this time, so it will be built from
scratch every <code>moon</code> invocation. This is a temporary limitation that we plan to address in the
future, as caching is a critical piece of the puzzle for performance. With that said, even without
caching, the async builder is still significantly faster than the sync builder, especially for
larger workspaces.</li>
<li class="">The async graph builder does not support cycles, and will hard error if a cycle is detected. In
the sync builder, we would attempt to cut edges between nodes when a cycle was detected, which
could lead to incorrect results, but would not error.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="experimental-async-affected-tracker">Experimental async affected tracker<a href="https://moonrepo.dev/blog/moon-v2.2#experimental-async-affected-tracker" class="hash-link" aria-label="Direct link to Experimental async affected tracker" title="Direct link to Experimental async affected tracker" translate="no">​</a></h2>
<p>The affected tracker is a core component of moon that determines which projects and tasks are
affected by changes in the codebase. In previous versions, the tracker was implemented
synchronously, which could lead to performance issues for larger projects with many tasks. With this
release, the affected tracker is now available with an experimental async implementation. This new
version is designed to be faster and more efficient (up to 150%), especially for large repositories
with many tasks.</p>
<p>Since this is experimental, it is not enabled by default. To enable the async tracker, you can
configure the following in <code>.moon/workspace.yml</code>.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/workspace.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">experiments</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">asyncAffectedTracking</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><br></span></code></pre></div></div>
<p>To demonstrate the performance improvements, take the following benchmark results for example. For
every benchmark, we had N projects with 3 tasks per project, iterated 100 times. The "average time"
columns show the average time taken across all iterations, while the "total suite time" columns show
the total time taken for all iterations. The "speedup" column shows the percentage improvement of
the async tracker compared to the sync tracker.</p>
<p>If you'll notice, the improvement for projects is negligible, which is expected as project tracking
is very simple. However, for tasks, the async tracker shows significant improvements as the number
of tasks increases, with a speedup of 50-150%. With that said, we believe that after 5,000 tasks,
the increments diminish, as we're most likely hitting the upper limits of how much we can
parallelize the work.</p>
<table><tbody><tr><th>Benchmark</th><th colspan="2">Average time</th><th colspan="2">Total suite time</th><th>Speedup</th></tr><tr><td></td><td>Sync</td><td>Async</td><td>Sync</td><td>Async</td><td></td></tr><tr><td>10 projects</td><td>47.9ms</td><td>47.3ms</td><td>4.2s</td><td>4.2s</td><td>0%</td></tr><tr><td>30 tasks</td><td>105.08ms</td><td>61.75ms</td><td>10.4s</td><td>5.6s</td><td>+51.9%</td></tr><tr><td>100 projects</td><td>60.02ms</td><td>60.41ms</td><td>6s</td><td>6s</td><td>0%</td></tr><tr><td>300 tasks</td><td>585.62ms</td><td>131.43ms</td><td>58.6s</td><td>13.1s</td><td>+126.6%</td></tr><tr><td>1,000 projects</td><td>202.14ms</td><td>199.52ms</td><td>21.6s</td><td>20s</td><td>+1.3%</td></tr><tr><td>3,000 tasks</td><td>5.5s</td><td>901ms</td><td>553.4s</td><td>88.5s</td><td>+143.75%</td></tr><tr><td>5,000 projects</td><td>1.1s</td><td>1s</td><td>127.8s</td><td>111.3s</td><td>+13.8%</td></tr><tr><td>15,000 tasks</td><td>29s</td><td>4.5s</td><td>2,866s (47m)</td><td>476s (7.9m)</td><td>+146%</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other changes<a href="https://moonrepo.dev/blog/moon-v2.2#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<p>View the <a href="https://github.com/moonrepo/moon/releases/tag/v2.2.0" target="_blank" rel="noopener noreferrer" class="">official release</a> for a full list of
changes.</p>
<ul>
<li class="">Temporarily brought back <code>x86_64-apple-darwin</code> (Apple Intel) as a supported operating system.</li>
<li class="">Greatly reduced memory footprint of the action, project, and task graphs. Nodes in the graph are
now integers instead of objects.</li>
<li class="">Improved plugin registry performance and memory consumption when loading plugins.</li>
<li class="">Improved performance of <code>taskToolchains</code> and <code>taskType</code> fields when querying the project graph.</li>
<li class="">Improved performance of task output archiving, by no longer blocking the main thread pool.</li>
<li class="">Updated the system toolchain to be built-in instead of an external WASM plugin that needs to be
downloaded.</li>
</ul>]]></content:encoded>
            <category>daemon</category>
            <category>performance</category>
            <category>async</category>
            <category>graph</category>
            <category>affected</category>
            <category>workspace</category>
            <category>ai</category>
            <category>agent</category>
            <category>skill</category>
            <category>debug</category>
            <category>tasks</category>
        </item>
        <item>
            <title><![CDATA[moon v2.1 - Execution plans, target deps scopes, toolchain/task settings, and more]]></title>
            <link>https://moonrepo.dev/blog/moon-v2.1</link>
            <guid>https://moonrepo.dev/blog/moon-v2.1</guid>
            <pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[It's been about a month since our major v2.0 release, and we're back with a smaller, but still]]></description>
            <content:encoded><![CDATA[<p>It's been about a month since our major v2.0 release, and we're back with a smaller, but still
impactful, v2.1 release! This release includes a new execution plan feature for <code>moon exec</code>, the
ability to target project dependencies by scope, new common toolchain settings for aliases and
dependency installation, new task options for <a class="" href="https://moonrepo.dev/docs/config/project#affectedfiles"><code>affectedFiles</code></a>,
and more.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="execution-plans">Execution plans<a href="https://moonrepo.dev/blog/moon-v2.1#execution-plans" class="hash-link" aria-label="Direct link to Execution plans" title="Direct link to Execution plans" translate="no">​</a></h2>
<p>The <a class="" href="https://moonrepo.dev/docs/commands/exec"><code>moon exec</code></a> command is powerful, but complex invocations can mean long
CLI commands that are hard to read and easy to get wrong. In v2.1, you can now define an <strong>execution
plan</strong> — a JSON file that declaratively configures targets, affected filtering, graph traversal, and
pipeline behavior — and pass it with a single flag:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">plan.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token punctuation" style="color:#cad4e2">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token property" style="color:#b7a9f9">"pipeline"</span><span class="token operator" style="color:#b7a9f9">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token property" style="color:#b7a9f9">"jobTotal"</span><span class="token operator" style="color:#b7a9f9">:</span><span class="token plain"> </span><span class="token number" style="color:#94dded">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token punctuation" style="color:#cad4e2">}</span><span class="token punctuation" style="color:#cad4e2">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token property" style="color:#b7a9f9">"targets"</span><span class="token operator" style="color:#b7a9f9">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token property" style="color:#b7a9f9">"jobs"</span><span class="token operator" style="color:#b7a9f9">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">"app:build"</span><span class="token punctuation" style="color:#cad4e2">,</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"app:test"</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token punctuation" style="color:#cad4e2">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">"lib:build"</span><span class="token punctuation" style="color:#cad4e2">,</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"lib:test"</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token punctuation" style="color:#cad4e2">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">"docs:build"</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token punctuation" style="color:#cad4e2">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token punctuation" style="color:#cad4e2">}</span><br></span></code></pre></div></div>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token comment" style="color:#97a1af;font-style:italic"># Runs docs:build only!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moon </span><span class="token builtin class-name" style="color:#ff94ff;font-weight:bold">exec</span><span class="token plain"> </span><span class="token parameter variable" style="color:#fef9c3">--plan</span><span class="token plain"> plan.json </span><span class="token parameter variable" style="color:#fef9c3">--job</span><span class="token plain"> </span><span class="token number" style="color:#94dded">2</span><br></span></code></pre></div></div>
<p>This is especially useful for CI pipelines where you need partitioned jobs, affected-only runs, or
specific failure handling. Instead of stitching together a dozen flags, drop a <code>plan.json</code> into your
repo and version-control your execution strategy.</p>
<p>Check out the <a class="" href="https://moonrepo.dev/docs/guides/exec-plan">execution plan guide</a> for the full structure and examples.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="target-project-dependencies-by-scope">Target project dependencies by scope<a href="https://moonrepo.dev/blog/moon-v2.1#target-project-dependencies-by-scope" class="hash-link" aria-label="Direct link to Target project dependencies by scope" title="Direct link to Target project dependencies by scope" translate="no">​</a></h2>
<p>moon has always allowed you to reference dependencies of a project (external projects) within a task
using <code>^</code> syntax, for both <a class="" href="https://moonrepo.dev/docs/config/project#inputs"><code>inputs</code></a> and
<a class="" href="https://moonrepo.dev/docs/config/project#deps"><code>deps</code></a>. However, it was quite restrictive in that it referenced <em>all</em>
project dependencies, regardless of scope (production, development, etc).</p>
<p>We felt it was time to change this, and in v2.1 we're introducing a new syntax that allows you to
target dependencies by scope. By default, the <code>^</code> syntax will still reference all dependencies, but
you can now specify a scope by suffixing the <code>^</code> with one of the following:</p>
<ul>
<li class=""><code>development</code> / <code>dev</code></li>
<li class=""><code>production</code> / <code>prod</code></li>
<li class=""><code>build</code></li>
<li class=""><code>peer</code></li>
</ul>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">tasks</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">build</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">command</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'tsc'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">deps</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token comment" style="color:#97a1af;font-style:italic"># Depend on build tasks in production level project dependencies</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'^production:build'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">inputs</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token comment" style="color:#97a1af;font-style:italic"># Source files of all production level project dependencies</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'project:^production'</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="new-common-toolchain-settings">New common toolchain settings<a href="https://moonrepo.dev/blog/moon-v2.1#new-common-toolchain-settings" class="hash-link" aria-label="Direct link to New common toolchain settings" title="Direct link to New common toolchain settings" translate="no">​</a></h2>
<p>Going forward, we want to provide more customization for toolchains, enabling you to curate the
experience you want. The first step in this process is introducing 2 new settings that are common
across all toolchains.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="inheritaliases"><code>inheritAliases</code><a href="https://moonrepo.dev/blog/moon-v2.1#inheritaliases" class="hash-link" aria-label="Direct link to inheritaliases" title="Direct link to inheritaliases" translate="no">​</a></h3>
<p>Aliases are a feature of projects that allow for alternate names to be used when referencing them.
Aliases cannot be configured manually and instead are inferred from toolchains, typically by
extracting the <code>name</code> field from a manifest file (<code>package.json</code>, <code>Cargo.toml</code>, <code>pyproject.toml</code>,
etc).</p>
<p>This happens automatically, but what if you don't want to use aliases? Or there are conflicting
aliases across projects? In v2.1, we're introducing a new common toolchain setting called
<a class="" href="https://moonrepo.dev/docs/config/toolchain#inheritaliases"><code>inheritAliases</code></a> that allows you to disable this feature.
When set to <code>false</code>, no aliases will be inferred for any projects using that toolchain.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/toolchains.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">javascript</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">inheritAliases</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">false</span><br></span></code></pre></div></div>
<blockquote>
<p>We've also updated duplicate aliases to no longer be a hard error, and instead will apply to the
first encountered project.</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="installdependencies"><code>installDependencies</code><a href="https://moonrepo.dev/blog/moon-v2.1#installdependencies" class="hash-link" aria-label="Direct link to installdependencies" title="Direct link to installdependencies" translate="no">​</a></h3>
<p>When you run a task, all toolchains associated with the task will automatically install dependencies
if they've determined that they need to (lockfile changes, dependency updates, etc). This is a great
feature for ensuring that your environment is always up to date, especially when switching branches,
but it can be a bit too much for some use cases.</p>
<p>In v2.1, we're introducing another common toolchain setting called
<a class="" href="https://moonrepo.dev/docs/config/toolchain#installdependencies"><code>installDependencies</code></a> that allows you to disable this
feature. When set to <code>false</code>, toolchains will not automatically install dependencies before running
a task.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/toolchains.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">python</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">installDependencies</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">false</span><br></span></code></pre></div></div>
<blockquote>
<p>Not all toolchains support this tier 2 feature.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="new-task-affectedfiles-settings">New task <code>affectedFiles</code> settings<a href="https://moonrepo.dev/blog/moon-v2.1#new-task-affectedfiles-settings" class="hash-link" aria-label="Direct link to new-task-affectedfiles-settings" title="Direct link to new-task-affectedfiles-settings" translate="no">​</a></h2>
<p>In <a class="" href="https://moonrepo.dev/blog/moon-v2.0">v2</a> we introduced an object form for the the task option
<a class="" href="https://moonrepo.dev/docs/config/project#affectedfiles"><code>affectedFiles</code></a>, allowing you to further customize this
feature. Based on feedback from the community, we're introducing 3 new settings to this object:</p>
<ul>
<li class=""><code>filter</code> - A list of glob patterns to filter the affected files list before passing to the task.</li>
<li class=""><code>ignoreProjectBoundary</code> - When matching affected files, ignore the project boundary and include
workspace relative files. Otherwise, only files within the project are matched.</li>
<li class=""><code>passDotWhenNoResults</code> - When there are no affected files after matching and filtering, use <code>.</code>
instead of an empty value.</li>
</ul>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">tasks</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">lint</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">command</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'eslint'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">inputs</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'src/**/*.{ts,tsx}'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'**/*.json'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'eslint.config.*'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">options</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token key atrule">affectedFiles</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">        </span><span class="token key atrule">filter</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">'**/*.tsx?'</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">        </span><span class="token key atrule">ignoreProjectBoundary</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">        </span><span class="token key atrule">passDotWhenNoResults</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">false</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other changes<a href="https://moonrepo.dev/blog/moon-v2.1#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<p>View the <a href="https://github.com/moonrepo/moon/releases/tag/v2.1.0" target="_blank" rel="noopener noreferrer" class="">official release</a> for a full list of
changes.</p>
<ul>
<li class="">Improved our local and remote detection logic. We now also check for common remote devboxes
(GitHub Codespaces, Gitpod, etc) in addition to CI environments.</li>
<li class="">Added a new task option, <a class="" href="https://moonrepo.dev/docs/config/project#runinsyncphase"><code>runInSyncPhase</code></a>, that will run
the task during <code>moon sync</code> commands.</li>
<li class=""><strong>Go</strong>
<ul>
<li class="">Will now run <code>go list --deps</code> to determine project relationships while extending the project
graph.</li>
</ul>
</li>
<li class=""><strong>Python</strong>
<ul>
<li class="">Normalized package/dependency names to PEP 503 during graph extending.</li>
<li class="">Fixed an issue where package manager toolchain settings were not being inherited correctly.</li>
</ul>
</li>
<li class=""><strong>TypeScript</strong>
<ul>
<li class="">Added a <code>pruneProjectReferences</code> setting that prunes non-moon managed project references when
syncing.</li>
</ul>
</li>
</ul>]]></content:encoded>
            <category>exec</category>
            <category>plan</category>
            <category>task</category>
            <category>affected</category>
            <category>dependencies</category>
            <category>toolchain</category>
        </item>
        <item>
            <title><![CDATA[moon v2.0 - Official "Phobos" release!]]></title>
            <link>https://moonrepo.dev/blog/moon-v2.0</link>
            <guid>https://moonrepo.dev/blog/moon-v2.0</guid>
            <pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[We're very excited to announce the release of moon v2.0, codenamed "Phobos", after one of Mars']]></description>
            <content:encoded><![CDATA[<p>We're very excited to announce the release of moon v2.0, codenamed "Phobos", after one of Mars'
moons! This is our biggest release yet, with a ton of new features, improvements, and breaking
changes.</p>
<p>We've been working on this release for years, and we're thrilled to finally share it with the world.
We also want to thank everyone in the community who has contributed to this release, whether it's
through code, documentation, testing, or just providing feedback and support. We couldn't have done
this without you!</p>
<p>To start using moon v2, you can install it with one of the following commands!</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token comment" style="color:#97a1af;font-style:italic"># proto</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">proto </span><span class="token function" style="color:#ff94ff;font-weight:bold">install</span><span class="token plain"> moon </span><span class="token number" style="color:#94dded">2.0</span><span class="token plain">.0</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token comment" style="color:#97a1af;font-style:italic"># Unix</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token function" style="color:#ff94ff;font-weight:bold">bash</span><span class="token plain"> </span><span class="token operator" style="color:#b7a9f9">&lt;</span><span class="token punctuation" style="color:#cad4e2">(</span><span class="token function" style="color:#ff94ff;font-weight:bold">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#fef9c3">-fsSL</span><span class="token plain"> https://moonrepo.dev/install/moon.sh</span><span class="token punctuation" style="color:#cad4e2">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token comment" style="color:#97a1af;font-style:italic"># Windows</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">irm https://moonrepo.dev/install/moon.ps1 </span><span class="token operator" style="color:#b7a9f9">|</span><span class="token plain"> iex</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>If you are moon v1, the <code>moon upgrade</code> command <em>will not work</em>, as the distribution format has
changed significantly. Instead, please use one of the installation methods above.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes">Breaking changes<a href="https://moonrepo.dev/blog/moon-v2.0#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no">​</a></h2>
<p>Since this is our first major release after v1, there are quite a few breaking changes, far too many
to list here! Please refer to the <a class="" href="https://moonrepo.dev/docs/migrate/2.0">official migration guide</a> and
<a href="https://github.com/moonrepo/moon/blob/master/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">changelog</a> for a comprehensive list of
breaking changes and how to address them.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="cli">CLI<a href="https://moonrepo.dev/blog/moon-v2.0#cli" class="hash-link" aria-label="Direct link to CLI" title="Direct link to CLI" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-and-improved-commands">New and improved commands<a href="https://moonrepo.dev/blog/moon-v2.0#new-and-improved-commands" class="hash-link" aria-label="Direct link to New and improved commands" title="Direct link to New and improved commands" translate="no">​</a></h3>
<p>As part of this release, we went through every CLI command and made improvements to their usability,
functionality, and rendered output. On top of this, we're also introducing a handful of new commands
to fill some missing gaps. Here are some highlights:</p>
<ul>
<li class=""><a class="" href="https://moonrepo.dev/docs/commands/exec"><code>moon exec</code></a> - Low-level command for running tasks. Read more below!</li>
<li class=""><a class="" href="https://moonrepo.dev/docs/commands/extension"><code>moon extension</code></a> - Top-level command to
<a href="https://moonrepo.dev/blog/moon-v2.0#management-commands" class="">manage extensions</a> in the workspace.</li>
<li class=""><a class="" href="https://moonrepo.dev/docs/commands/hash"><code>moon hash</code></a> - Inspect a hash, or diff two hashes.</li>
<li class=""><a class="" href="https://moonrepo.dev/docs/commands/projects"><code>moon projects</code></a> - Display a table of all projects.</li>
<li class=""><a class="" href="https://moonrepo.dev/docs/commands/query/affected"><code>moon query affected</code></a> - Query affected status for projects and
tasks.</li>
<li class=""><a class="" href="https://moonrepo.dev/docs/commands/tasks"><code>moon tasks</code></a> - Display a table of all tasks or for a specific project.</li>
<li class=""><a class="" href="https://moonrepo.dev/docs/commands/template"><code>moon template</code></a> - Display information about a template.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-exec-command">New <code>exec</code> command<a href="https://moonrepo.dev/blog/moon-v2.0#new-exec-command" class="hash-link" aria-label="Direct link to new-exec-command" title="Direct link to new-exec-command" translate="no">​</a></h3>
<p>To simplify running tasks and improve consistency across commands, we've introduced a new low-level
<a class="" href="https://moonrepo.dev/docs/commands/exec"><code>moon exec</code></a> command. This command is now used under the hood by
<a class="" href="https://moonrepo.dev/docs/commands/check"><code>moon check</code></a>, <a class="" href="https://moonrepo.dev/docs/commands/ci"><code>moon ci</code></a>, and
<a class="" href="https://moonrepo.dev/docs/commands/run"><code>moon run</code></a>, with some arguments/options pre-filled. This allows us to have a
single command that is responsible for executing tasks, while still providing higher-level commands
for specific use cases.</p>
<p>This paves the way for future commands that can leverage <a class="" href="https://moonrepo.dev/docs/commands/exec"><code>moon exec</code></a>, such as
a potential <code>moon deploy</code> or <code>moon watch</code> command.</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moon </span><span class="token builtin class-name" style="color:#ff94ff;font-weight:bold">exec</span><span class="token plain"> app:build </span><span class="token parameter variable" style="color:#fef9c3">--dependents</span><span class="token plain"> direct</span><br></span></code></pre></div></div>
<p>Additionally, it allows these other commands to inherit functionality they didn't support
previously, like job parallelization, affected filtering, and more.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="updated-ci-check-and-run-commands">Updated <code>ci</code>, <code>check</code>, and <code>run</code> commands<a href="https://moonrepo.dev/blog/moon-v2.0#updated-ci-check-and-run-commands" class="hash-link" aria-label="Direct link to updated-ci-check-and-run-commands" title="Direct link to updated-ci-check-and-run-commands" translate="no">​</a></h3>
<p>As mentioned previously, all of these commands have been reworked to use
<a class="" href="https://moonrepo.dev/docs/commands/exec"><code>moon exec</code></a> under the hood. This means that they now share the same core
functionality and behavior, while still providing their own unique features and options.</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moon ci</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moon check app</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moon run app:dev </span><span class="token parameter variable" style="color:#fef9c3">--affected</span><br></span></code></pre></div></div>
<p>These commands will now pre-fill certain <a class="" href="https://moonrepo.dev/docs/commands/exec"><code>moon exec</code></a> options for a curated
experience. These options cannot be overridden, but the <a class="" href="https://moonrepo.dev/docs/commands/exec"><code>moon exec</code></a> command
can be used directly for more control.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="dynamic-identifier--target-selection">Dynamic identifier &amp; target selection<a href="https://moonrepo.dev/blog/moon-v2.0#dynamic-identifier--target-selection" class="hash-link" aria-label="Direct link to Dynamic identifier &amp; target selection" title="Direct link to Dynamic identifier &amp; target selection" translate="no">​</a></h3>
<p>For some commands that require a project, task, or template identifier/target, we've added an
interactive selection prompt if no value is provided. This makes it easier to explore and use the
CLI without needing to know specific identifiers ahead of time. The following commands now support
this:</p>
<ul>
<li class=""><a class="" href="https://moonrepo.dev/docs/commands/check"><code>moon check</code></a></li>
<li class=""><a class="" href="https://moonrepo.dev/docs/commands/ci"><code>moon ci</code></a></li>
<li class=""><a class="" href="https://moonrepo.dev/docs/commands/exec"><code>moon exec</code></a></li>
<li class=""><a class="" href="https://moonrepo.dev/docs/commands/generate"><code>moon generate</code></a></li>
<li class=""><a class="" href="https://moonrepo.dev/docs/commands/project"><code>moon project</code></a></li>
<li class=""><a class="" href="https://moonrepo.dev/docs/commands/run"><code>moon run</code></a></li>
<li class=""><a class="" href="https://moonrepo.dev/docs/commands/task"><code>moon task</code></a></li>
<li class=""><a class="" href="https://moonrepo.dev/docs/commands/template"><code>moon template</code></a></li>
</ul>
<p>To demonstrate this, here we are running <a class="" href="https://moonrepo.dev/docs/commands/project"><code>moon project</code></a> without an
identifier:</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moon project</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">│ Which project to view?</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">│</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">│ ❯ report</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">│   runtime</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">│   types</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">│   visualizer</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">│   website - A static website.</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">│</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">│ ⎵ </span><span class="token keyword" style="color:#b7a9f9">select</span><span class="token plain"> ⁃ ↕ cycle ⁃ ↵ submit</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="stabilized-moonx">Stabilized <code>moonx</code><a href="https://moonrepo.dev/blog/moon-v2.0#stabilized-moonx" class="hash-link" aria-label="Direct link to stabilized-moonx" title="Direct link to stabilized-moonx" translate="no">​</a></h3>
<p>The <code>moonx</code> executable, sibling to <code>moon</code>, has been stabilized, and is no longer a shim, but a
proper standalone binary. This executable is simply a shorthand for
<a class="" href="https://moonrepo.dev/docs/commands/exec"><code>moon exec</code></a>, and <em>replaces</em> the shorthand syntax that previously existed with
<code>moon &lt;target&gt;</code>.</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token comment" style="color:#97a1af;font-style:italic"># Before</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moon run app:build</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moon </span><span class="token builtin class-name" style="color:#ff94ff;font-weight:bold">exec</span><span class="token plain"> app:build</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moon app:build</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token comment" style="color:#97a1af;font-style:italic"># After</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moonx app:build</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="support-for-config">Support for <code>.config</code><a href="https://moonrepo.dev/blog/moon-v2.0#support-for-config" class="hash-link" aria-label="Direct link to support-for-config" title="Direct link to support-for-config" translate="no">​</a></h3>
<p>The <code>.moon</code> directory denotes the root of the workspace, but if you don't like clutter, this may
feel overwhelming. To help with this, we've introduced support for the
<a href="https://dot-config.github.io/" target="_blank" rel="noopener noreferrer" class=""><code>.config</code> directory pattern</a>, allowing you to define your workspace
configuration in a more organized manner.</p>
<p>Simply use <code>.config/moon</code> instead of <code>.moon</code>! The workspace root will now be the directory that
contains the <code>.config</code> directory.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="configuration">Configuration<a href="https://moonrepo.dev/blog/moon-v2.0#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-file-formats">New file formats<a href="https://moonrepo.dev/blog/moon-v2.0#new-file-formats" class="hash-link" aria-label="Direct link to New file formats" title="Direct link to New file formats" translate="no">​</a></h3>
<p>We've been pretty strict about only supporting YAML based configuration for quite some time, but we
understand that people have different preferences (many of you hate YAML, which is fair). We've
experimented in the past a bit by adding support for <a href="https://pkl-lang.org/" target="_blank" rel="noopener noreferrer" class="">Pkl</a>, which is a
programmable configuration, but it required a learning curve.</p>
<p>Over time, we've come to loosen our stance on YAML, and are now introducing support for not just
one, but many additional formats! The following file formats are now supported for all moon
configuration files:</p>
<ul>
<li class="">JSON (<code>.json</code>)</li>
<li class="">JSON with comments (<code>.jsonc</code>)</li>
<li class=""><a href="https://github.com/hashicorp/hcl" target="_blank" rel="noopener noreferrer" class="">HCL</a> (<code>.hcl</code>)</li>
<li class=""><a href="https://pkl-lang.org/" target="_blank" rel="noopener noreferrer" class="">Pkl</a> (<code>.pkl</code>)</li>
<li class=""><a href="https://toml.io/en/" target="_blank" rel="noopener noreferrer" class="">TOML</a> (<code>.toml</code>)</li>
<li class="">YAML (<code>.yml</code>, <code>.yaml</code>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="toolchains">Toolchains<a href="https://moonrepo.dev/blog/moon-v2.0#toolchains" class="hash-link" aria-label="Direct link to Toolchains" title="Direct link to Toolchains" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="plugin-based-system">Plugin based system<a href="https://moonrepo.dev/blog/moon-v2.0#plugin-based-system" class="hash-link" aria-label="Direct link to Plugin based system" title="Direct link to Plugin based system" translate="no">​</a></h3>
<p>The new toolchain system replaces the legacy platform system and is the biggest change in moon v2.
Toolchains are now powered by WASM plugins, instead of being hard-coded in core, allowing for more
flexibility, extensibility, and the ability for the community to create their own toolchains!</p>
<p>Moving to a plugin based system enables us to support more languages, more features, deeper
integration, as well as more complex workflows. For example, in the future we can now easily support
release workflows (changelogs, versioning, publishing) as part of a toolchain.</p>
<p>Just to demonstrate how powerful the plugin system is, it currently supports all the following
features:</p>
<ul>
<li class="">Extending the project graph with project dependencies and aliases</li>
<li class="">Extending task commands and scripts before they're executed</li>
<li class="">Integrates with our Docker flow for pruning and scaffolding</li>
<li class="">Runs operations during the project/workspace sync processes</li>
<li class="">Locates a root dependencies directory for package manager workspaces</li>
<li class="">Parses manifest and lock files to extract dependencies and metadata</li>
<li class="">Sets up the environment and auto-installs dependencies</li>
<li class="">Hook into the task hashing process</li>
<li class="">Manages downloading and installing tools (via proto)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="improved-path-handling">Improved <code>PATH</code> handling<a href="https://moonrepo.dev/blog/moon-v2.0#improved-path-handling" class="hash-link" aria-label="Direct link to improved-path-handling" title="Direct link to improved-path-handling" translate="no">​</a></h3>
<p>Toolchain (and extension) plugins have the ability to modify the <code>PATH</code> environment variable for
most child processes that occur during task execution, but the way we handled this has been improved
significantly. Previously, there were some inconsistencies around when and how the <code>PATH</code> was
modified, leading to unexpected behavior in certain scenarios. Going forward, we inherit paths using
a strict order of operations:</p>
<ul>
<li class="">Inherit for all commands using <code>extend_command</code> extension and toolchain calls</li>
<li class="">Inherit for task commands using <code>extend_task_command</code> or <code>extend_task_script</code> toolchain calls</li>
<li class="">Inherit toolchain executable directories</li>
<li class="">Inherit proto shims and bins directories</li>
<li class="">Inherit proto and moon store directories</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="extensions">Extensions<a href="https://moonrepo.dev/blog/moon-v2.0#extensions" class="hash-link" aria-label="Direct link to Extensions" title="Direct link to Extensions" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="stand-alone-configuration">Stand-alone configuration<a href="https://moonrepo.dev/blog/moon-v2.0#stand-alone-configuration" class="hash-link" aria-label="Direct link to Stand-alone configuration" title="Direct link to Stand-alone configuration" translate="no">​</a></h3>
<p>Extensions are a WASM plugin based system that has existed for some time now, but they only
supported a single functionality: custom execution through the <a class="" href="https://moonrepo.dev/docs/commands/ext"><code>moon ext</code></a>
command. With the introduction of toolchain plugins, we wanted to expand the extension system to
allow for more flexibility and use cases.</p>
<p>To start, we're intoducing a new <a class="" href="https://moonrepo.dev/docs/config/extensions"><code>.moon/extensions.*</code></a> configuration file,
that will contain all extensions, similar to how toolchains are configured in
<a class="" href="https://moonrepo.dev/docs/config/toolchain"><code>.moon/toolchains.*</code></a>. Because of this change, the <code>extensions</code> setting has
been removed from the workspace configuration.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-plugin-apis">New plugin APIs<a href="https://moonrepo.dev/blog/moon-v2.0#new-plugin-apis" class="hash-link" aria-label="Direct link to New plugin APIs" title="Direct link to New plugin APIs" translate="no">​</a></h3>
<p>With extensions now being first-class citizens in moon, we've expanded the PDK API to allow for more
functionality. Extensions can now utilize the following API functions, similar to toolchains:</p>
<ul>
<li class=""><code>define_extension_config</code> - Define the configuration schema for the extension.</li>
<li class=""><code>initialize_extension</code> - Initialize the extension with user prompts.</li>
<li class=""><code>extend_project_graph</code> - Extend projects with aliases, dependencies, and tasks.</li>
<li class=""><code>extend_task_command</code> - Extend the task command before it's executed.</li>
<li class=""><code>extend_task_script</code> - Extend the task script before it's executed.</li>
<li class=""><code>sync_project</code> - Run operations during the project sync process.</li>
<li class=""><code>sync_workspace</code> - Run operations during the workspace sync process.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="management-commands">Management commands<a href="https://moonrepo.dev/blog/moon-v2.0#management-commands" class="hash-link" aria-label="Direct link to Management commands" title="Direct link to Management commands" translate="no">​</a></h3>
<p>To easily manage extensions, we've added new commands under the
<a class="" href="https://moonrepo.dev/docs/commands/extension"><code>moon extension</code></a> namespace:</p>
<ul>
<li class=""><a class="" href="https://moonrepo.dev/docs/commands/extension/add"><code>moon extension add</code></a> - Add a new extension to the workspace.</li>
<li class=""><a class="" href="https://moonrepo.dev/docs/commands/extension/info"><code>moon extension info</code></a> - Display information about an extension.</li>
</ul>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moon extension info migrate-nx</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">Extension ─────────────────────────────────────────────────────────────────</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  Migrate an Nx repository to moon by converting all nx.json and</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  project.json files into moon configuration files.</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  ID: migrate-nx</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  Title: Migrate Nx</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  Version: </span><span class="token number" style="color:#94dded">0.0</span><span class="token plain">.11</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">APIs ──────────────────────────────────────────────────────────────────────</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  🟢 register_extension </span><span class="token punctuation" style="color:#cad4e2">(</span><span class="token plain">required</span><span class="token punctuation" style="color:#cad4e2">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  ⚫️ define_extension_config</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  ⚫️ initialize_extension</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  🟢 execute_extension</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  ⚫️ sync_project</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  ⚫️ sync_workspace</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  ⚫️ extend_project_graph</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  ⚫️ extend_task_command</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  ⚫️ extend_task_script</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="projects">Projects<a href="https://moonrepo.dev/blog/moon-v2.0#projects" class="hash-link" aria-label="Direct link to Projects" title="Direct link to Projects" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="default-project">Default project<a href="https://moonrepo.dev/blog/moon-v2.0#default-project" class="hash-link" aria-label="Direct link to Default project" title="Direct link to Default project" translate="no">​</a></h3>
<p>By request from the community, we've added a new
<a class="" href="https://moonrepo.dev/docs/config/workspace#defaultproject"><code>defaultProject</code></a> setting to the workspace configuration.
This setting allows you to specify a default project that will be used when running tasks that
require a project identifier, but none was provided. This is especially useful for workspaces with a
single project, or when you have a primary project that you work on most of the time.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/workspace.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">defaultProject</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'app'</span><br></span></code></pre></div></div>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token comment" style="color:#97a1af;font-style:italic"># Before</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moon run app:build</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token comment" style="color:#97a1af;font-style:italic"># After</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moon run build</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moonx build</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="path-based-ids">Path based IDs<a href="https://moonrepo.dev/blog/moon-v2.0#path-based-ids" class="hash-link" aria-label="Direct link to Path based IDs" title="Direct link to Path based IDs" translate="no">​</a></h3>
<p>When locating projects with globs via the <a class="" href="https://moonrepo.dev/docs/config/workspace#projects"><code>projects</code></a> workspace
configuration, we would historically use the directory name as the project ID. While this works in
most cases, it can lead to issues when the directory name collides with another project, or is not
descriptive enough. For example, <code>packages/server/utils</code> would become <code>utils</code>. What if you also had
<code>packages/client/utils</code>?</p>
<p>To solve this, we've introduced a new
<a class="" href="https://moonrepo.dev/docs/config/workspace#using-a-map-and-globs"><code>projects.globFormat</code></a> setting, which can be
configured as <code>source-path</code> and will use the full relative source path as the project ID.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/workspace.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">projects</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">globFormat</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'source-path'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">globs</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'packages/**/moon.yml'</span><br></span></code></pre></div></div>
<p>Using the examples above, the resulting project IDs would now be <code>packages/server/utils</code> and
<code>packages/client/utils</code>, respectively.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="multiple-aliases">Multiple aliases<a href="https://moonrepo.dev/blog/moon-v2.0#multiple-aliases" class="hash-link" aria-label="Direct link to Multiple aliases" title="Direct link to Multiple aliases" translate="no">​</a></h3>
<p>In addition to identifiers, projects also support aliases, which are toolchain specific names
derived from manifest files, for example, the <code>name</code> field in <code>package.json</code> or <code>Cargo.toml</code>. This
allows you to refer to projects by their native names on the command line, in configuration, and
more.</p>
<p>Previously, projects only supported a single alias, but now they support multiple aliases, one from
each applicable toolchain. In addition, we have added a new <code>$projectAliases</code> token, which is a
comma-separated list of all aliases. The existing <code>$projectAlias</code> token now returns the first alias,
if it exists.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-data-stack">New <code>data</code> stack<a href="https://moonrepo.dev/blog/moon-v2.0#new-data-stack" class="hash-link" aria-label="Direct link to new-data-stack" title="Direct link to new-data-stack" translate="no">​</a></h3>
<p>Our stack system represents all aspects of a development stack, except one, the database/data layer!
To give you more control around categorization, we've added a new <code>data</code> stack type, which can be
used to represent projects that are primarily focused on data storage. This includes databases, ETL
pipelines, and other data-centric use cases.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">moon.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">stack</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'data'</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="tasks">Tasks<a href="https://moonrepo.dev/blog/moon-v2.0#tasks" class="hash-link" aria-label="Direct link to Tasks" title="Direct link to Tasks" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="strict-commands">Strict commands<a href="https://moonrepo.dev/blog/moon-v2.0#strict-commands" class="hash-link" aria-label="Direct link to Strict commands" title="Direct link to Strict commands" translate="no">​</a></h3>
<p>We've reworked the task <a class="" href="https://moonrepo.dev/docs/config/project#command"><code>command</code></a> and
<a class="" href="https://moonrepo.dev/docs/config/project#args"><code>args</code></a> parser, when a string is provided, to be more strict and
accurate. Previously, we used a simple shell-like parser that would split on spaces, but this led to
issues with quoted strings, escaped characters, and other edge cases.</p>
<p>Related to this change, these fields will now <em>only support</em> simple commands and arguments, and will
<em>not</em> support complex syntax like pipes, redirects, and conditionals. This is a breaking change, but
you can use <a class="" href="https://moonrepo.dev/docs/config/project#script"><code>script</code></a> instead for complex commands.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="inheritance-via-configuration">Inheritance via configuration<a href="https://moonrepo.dev/blog/moon-v2.0#inheritance-via-configuration" class="hash-link" aria-label="Direct link to Inheritance via configuration" title="Direct link to Inheritance via configuration" translate="no">​</a></h3>
<p>Our task inheritance system is quite powerful, and one of moon's most compelling features. However,
it can be rather restrictive as inheritance is based entirely on file naming conventions. To provide
more flexibility, we've reworked task inheritance to be configuration based, by introducing a new
<a class="" href="https://moonrepo.dev/docs/config/tasks#inheritedby"><code>inheritedBy</code></a> setting for all
<a class="" href="https://moonrepo.dev/docs/config/tasks"><code>.moon/tasks/**/*</code></a> files.</p>
<p>For example, if you had a tasks file named <code>.moon/tasks/node-frontend-library.yml</code>, it would now be
configured like so:</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/tasks/node-frontend-library.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">inheritedBy</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">toolchain</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'node'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">stack</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'frontend'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">layer</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'library'</span><br></span></code></pre></div></div>
<p>This new system is very powerful, as you can now mix-and-match different criteria to control how
tasks are inherited. The following conditions are supported out of the box, providing granular
control:</p>
<ul>
<li class=""><code>files</code> (NEW) - Inherit for projects that contain specific files (no glob support).</li>
<li class=""><code>languages</code> (NEW) - Inherit for projects that belong to specific
<a class="" href="https://moonrepo.dev/docs/config/project#language"><code>language</code></a>s.</li>
<li class=""><code>layers</code> - Inherit for projects that belong to specific <a class="" href="https://moonrepo.dev/docs/config/project#layer"><code>layer</code></a>s.</li>
<li class=""><code>stacks</code> - Inherit for projects that belong to specific <a class="" href="https://moonrepo.dev/docs/config/project#stack"><code>stack</code></a>s.</li>
<li class=""><code>tags</code> - Inherit for projects that have specific <a class="" href="https://moonrepo.dev/docs/config/project#tags"><code>tags</code></a>.</li>
<li class=""><code>toolchains</code> - Inherit for projects that belong to specific toolchains.</li>
</ul>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">inheritedBy</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token comment" style="color:#97a1af;font-style:italic"># Project belongs to either javascript or typescript toolchain, but not the ruby toolchain</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">toolchains</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">or</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">'javascript'</span><span class="token punctuation" style="color:#cad4e2">,</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'typescript'</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">not</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">'ruby'</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token comment" style="color:#97a1af;font-style:italic"># And project is either a frontend or backend stack</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">stacks</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">'frontend'</span><span class="token punctuation" style="color:#cad4e2">,</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'backend'</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token comment" style="color:#97a1af;font-style:italic"># And project is either a library or tool layer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">layers</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">'library'</span><span class="token punctuation" style="color:#cad4e2">,</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'tool'</span><span class="token punctuation" style="color:#cad4e2">]</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="toolchain-merging">Toolchain merging<a href="https://moonrepo.dev/blog/moon-v2.0#toolchain-merging" class="hash-link" aria-label="Direct link to Toolchain merging" title="Direct link to Toolchain merging" translate="no">​</a></h3>
<p>A task can now be associated with multiple toolchains (javascript, node, npm), unlike the previous
platform system which only allowed for 1 platform (node). This change allows for more flexibility
but also requires more granular control over how toolchains are inherited. To accommodate this,
we've added a <a class="" href="https://moonrepo.dev/docs/config/project#mergetoolchains"><code>mergeToolchains</code></a> task option:</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">moon.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">tasks</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">build</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token comment" style="color:#97a1af;font-style:italic"># ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">toolchains</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">'javascript'</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">options</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token key atrule">mergeToolchains</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'replace'</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="robust-env-files">Robust env files<a href="https://moonrepo.dev/blog/moon-v2.0#robust-env-files" class="hash-link" aria-label="Direct link to Robust env files" title="Direct link to Robust env files" translate="no">​</a></h3>
<p>Tasks have supported <code>.env</code> files for a while now, but the implementation has been somewhat limited.
We only supported the <code>.env</code> file with the ability for you to customize with an explicit list of
files. This was cumbersome and didn't allow for much flexibility.</p>
<p>Going forward, when using <code>envFile: true</code>, moon will now automatically look for the following files
in order, and load them if they exist:</p>
<ul>
<li class=""><code>/.env</code></li>
<li class=""><code>/.env.local</code></li>
<li class=""><code>.env</code></li>
<li class=""><code>.env.local</code></li>
<li class=""><code>.env.&lt;task_id&gt;</code></li>
<li class=""><code>.env.&lt;task_id&gt;.local</code></li>
</ul>
<p>Additionally, the following changes and improvements have been made.</p>
<ul>
<li class="">Added support for <code>*.local</code> files, which will only be loaded locally and not in CI environments.</li>
<li class="">Deferred loading of env files until task execution time, instead of during task creation (breaking
change).</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-utility-preset">New <code>utility</code> preset<a href="https://moonrepo.dev/blog/moon-v2.0#new-utility-preset" class="hash-link" aria-label="Direct link to new-utility-preset" title="Direct link to new-utility-preset" translate="no">​</a></h3>
<p>Task presets are helpful as the provide a set of default options and behaviors for common task
types. However, we haven't fully utilized (pun intended) this feature yet, so are adding a new
preset called <code>utility</code>. This preset is designed for simple one-off tasks that primarily run
locally, like running a migration, or validating data.</p>
<p>This preset configures the following options:</p>
<ul>
<li class=""><a class="" href="https://moonrepo.dev/docs/config/project#cache"><code>cache</code></a> disabled</li>
<li class=""><a class="" href="https://moonrepo.dev/docs/config/project#interactive"><code>interactive</code></a> enabled</li>
<li class=""><a class="" href="https://moonrepo.dev/docs/config/project#persistent"><code>persistent</code></a> disabled</li>
<li class=""><a class="" href="https://moonrepo.dev/docs/config/project#outputstyle"><code>outputStyle</code></a> as <code>stream</code></li>
<li class=""><a class="" href="https://moonrepo.dev/docs/config/project#runinci"><code>runInCI</code></a> as <code>skip</code></li>
</ul>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">moon.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">tasks</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">validate-schema</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token comment" style="color:#97a1af;font-style:italic"># ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">preset</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'utility'</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="docker">Docker<a href="https://moonrepo.dev/blog/moon-v2.0#docker" class="hash-link" aria-label="Direct link to Docker" title="Direct link to Docker" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="defaults-with-overrides">Defaults with overrides<a href="https://moonrepo.dev/blog/moon-v2.0#defaults-with-overrides" class="hash-link" aria-label="Direct link to Defaults with overrides" title="Direct link to Defaults with overrides" translate="no">​</a></h3>
<p>To improve customizability of <code>Dockerfile</code> generation, and to allow for more flexibility during the
scaffolding process, we've updated the <a class="" href="https://moonrepo.dev/docs/config/workspace#docker"><code>docker</code></a> settings in
<a class="" href="https://moonrepo.dev/docs/config/workspace"><code>.moon/workspace.*</code></a> to act as defaults, and the
<a class="" href="https://moonrepo.dev/docs/config/project#docker"><code>docker</code></a> settings in <a class="" href="https://moonrepo.dev/docs/config/project"><code>moon.*</code></a> to act as
overrides on a per-project basis. Because of this, we've also updated <code>docker.file</code> and
<code>docker.scaffold</code> settings to be the same across both files.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/workspace.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token comment" style="color:#97a1af;font-style:italic"># Inherited by all projects</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key atrule">docker</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">file</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">buildTask</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'build'</span><br></span></code></pre></div></div>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">moon.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token comment" style="color:#97a1af;font-style:italic"># Overridden per project</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key atrule">docker</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">file</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">buildTask</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'compile'</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="dockerfile-templates">Dockerfile templates<a href="https://moonrepo.dev/blog/moon-v2.0#dockerfile-templates" class="hash-link" aria-label="Direct link to Dockerfile templates" title="Direct link to Dockerfile templates" translate="no">​</a></h3>
<p>To further expand the customizability of <code>Dockerfile</code> generation, we've added support for custom
templates to be used during the rendering process. The template can be provided with the
<code>--template</code> option when running <a class="" href="https://moonrepo.dev/docs/commands/docker/file"><code>moon docker file</code></a>, or configured
with the new <code>docker.file.template</code> setting. Template rendering is powered by
<a href="https://keats.github.io/tera/" target="_blank" rel="noopener noreferrer" class="">Tera</a>.</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moon </span><span class="token function" style="color:#ff94ff;font-weight:bold">docker</span><span class="token plain"> </span><span class="token function" style="color:#ff94ff;font-weight:bold">file</span><span class="token plain"> app </span><span class="token parameter variable" style="color:#fef9c3">--template</span><span class="token plain"> ./Dockerfile.tera</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="vcs">VCS<a href="https://moonrepo.dev/blog/moon-v2.0#vcs" class="hash-link" aria-label="Direct link to VCS" title="Direct link to VCS" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-implementation">New implementation<a href="https://moonrepo.dev/blog/moon-v2.0#new-implementation" class="hash-link" aria-label="Direct link to New implementation" title="Direct link to New implementation" translate="no">​</a></h3>
<p>In moon v1 we were running an experiment that utilizes a new Git implementation, which we dubbed Git
v2. We've made this the default implementation and removed the legacy implementation. This new
implementation is faster, more reliable, and has better support for complex repositories (worktrees,
submodules, etc). The <code>experiments.gitV2</code> setting should now be removed.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="worktree-compatible-hooks">Worktree compatible hooks<a href="https://moonrepo.dev/blog/moon-v2.0#worktree-compatible-hooks" class="hash-link" aria-label="Direct link to Worktree compatible hooks" title="Direct link to Worktree compatible hooks" translate="no">​</a></h3>
<p>We've rewritten our Git hooks system to be compatible with Git worktrees, and to better handle the
<code>core.hooksPath</code> Git configuration. Previously hooks were written to <code>.git/hooks</code> at the repository
root, but we now don't write to <code>.git</code> at all, and entirely rely on <code>.moon/hooks</code> in each tree.</p>
<blockquote>
<p>You may need to enable the <code>extensions.worktreeConfig</code> Git setting for this to work properly.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other changes<a href="https://moonrepo.dev/blog/moon-v2.0#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<p>View the <a href="https://github.com/moonrepo/moon/releases/tag/v2.0.0" target="_blank" rel="noopener noreferrer" class="">official release</a> for a full list of
changes.</p>]]></content:encoded>
            <category>release</category>
            <category>major</category>
            <category>wasm</category>
            <category>plugins</category>
            <category>toolchains</category>
            <category>extensions</category>
            <category>breaking</category>
            <category>changes</category>
        </item>
        <item>
            <title><![CDATA[Release Candidate of moon v2 now available!]]></title>
            <link>https://moonrepo.dev/blog/moon-v2-rc</link>
            <guid>https://moonrepo.dev/blog/moon-v2-rc</guid>
            <pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[About two weeks ago we announced the beta release of moon v2, and today we]]></description>
            <content:encoded><![CDATA[<p>About two weeks ago we announced the <a class="" href="https://moonrepo.dev/blog/moon-v2-alpha">beta release of moon v2</a>, and today we
are excited to share that the first release candidate is now available! With this RC, we're one step
closer to an official v2 release.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="how-to-use">How to use<a href="https://moonrepo.dev/blog/moon-v2-rc#how-to-use" class="hash-link" aria-label="Direct link to How to use" title="Direct link to How to use" translate="no">​</a></h2>
<p>You can install the beta with proto (&gt;= 0.54.1), or download it directly from the
<a href="https://github.com/moonrepo/moon/releases/tag/v2.0.0-rc.4" target="_blank" rel="noopener noreferrer" class="">GitHub release page</a>.</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ proto </span><span class="token function" style="color:#ff94ff;font-weight:bold">install</span><span class="token plain"> moon </span><span class="token number" style="color:#94dded">2.0</span><span class="token plain">.0-rc.4</span><br></span></code></pre></div></div>
<p>Alternatively, you can try using the new shell install scripts.</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token comment" style="color:#97a1af;font-style:italic"># Unix</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token function" style="color:#ff94ff;font-weight:bold">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#fef9c3">--proto</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'=https'</span><span class="token plain"> </span><span class="token parameter variable" style="color:#fef9c3">--tlsv1.2</span><span class="token plain"> </span><span class="token parameter variable" style="color:#fef9c3">-LsSf</span><span class="token plain"> https://github.com/moonrepo/moon/releases/download/v2.0.0-rc.4/moon_cli-installer.sh </span><span class="token operator" style="color:#b7a9f9">|</span><span class="token plain"> </span><span class="token function" style="color:#ff94ff;font-weight:bold">sh</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token comment" style="color:#97a1af;font-style:italic"># Windows</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">powershell </span><span class="token parameter variable" style="color:#fef9c3">-ExecutionPolicy</span><span class="token plain"> Bypass </span><span class="token parameter variable" style="color:#fef9c3">-c</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"irm https://github.com/moonrepo/moon/releases/download/v2.0.0-rc.4/moon_cli-installer.ps1 | iex"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="whats-changed-since-beta">What's changed since beta?<a href="https://moonrepo.dev/blog/moon-v2-rc#whats-changed-since-beta" class="hash-link" aria-label="Direct link to What's changed since beta?" title="Direct link to What's changed since beta?" translate="no">​</a></h2>
<p>Besides a handful of bug fixes and performance improvements (thanks to all for testing), the biggest
change this release is <a href="https://github.com/moonrepo/plugins/pull/101" target="_blank" rel="noopener noreferrer" class="">Python toolchain</a> support.</p>
<p>Unlike other toolchains, the Python toolchain will be marked as unstable for a little while longer
as we work through some final issues (as we are not Python experts). However, you can now use Python
projects in moon v2!</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/toolchains.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">unstable_python</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">packageManager</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'pip'</span><span class="token plain"> </span><span class="token comment" style="color:#97a1af;font-style:italic"># or 'uv'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key atrule">unstable_pip</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">{</span><span class="token punctuation" style="color:#cad4e2">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token comment" style="color:#97a1af;font-style:italic"># unstable_uv: {}</span><br></span></code></pre></div></div>
<p>When using the Python toolchain, please note the following conventions (subject to change):</p>
<ul>
<li class="">A <code>pyproject.toml</code> is preferred, but not a requirement. However, we haven't tested without one.</li>
<li class="">Use either <code>pip</code> or <code>uv</code> as the package manager.</li>
<li class="">When using <code>pip</code>, a <code>requirements.txt</code> is considered a lockfile, while <code>requirements.in</code> is a
manifest.</li>
<li class="">Virtual environments are supported, but are created in the package root (uv workspace root, pip
package) by default. We know this is not ideal for all workflows, and are looking into options to
improve this.</li>
</ul>
<blockquote>
<p>As mentioned above, we are not Python experts, and don't have the requisite knowledge to implement
Python developer workflows. We'd appreciate any help from the community to improve this toolchain!</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="whats-next">What's next?<a href="https://moonrepo.dev/blog/moon-v2-rc#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?" translate="no">​</a></h2>
<p>Now that Python has landed, we are focused on wrapping up any remaining issues and PRs before the
stable release, which we are aiming for next week, February 2nd! We don't plan to introduce any new
breaking changes, only bug fixes, polish, and performance improvements.</p>
<p>We'd appreciate any help testing this release candidate before then!</p>]]></content:encoded>
            <category>rc</category>
            <category>major</category>
            <category>release</category>
            <category>v2</category>
        </item>
        <item>
            <title><![CDATA[Beta release of moon v2 now available!]]></title>
            <link>https://moonrepo.dev/blog/moon-v2-beta</link>
            <guid>https://moonrepo.dev/blog/moon-v2-beta</guid>
            <pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[About two weeks ago we announced the alpha release of moon v2, and today we]]></description>
            <content:encoded><![CDATA[<p>About two weeks ago we announced the <a class="" href="https://moonrepo.dev/blog/moon-v2-alpha">alpha release of moon v2</a>, and today we
are excited to share that the beta is now available! With the beta, we've made significant progress
towards stabilizing the new architecture and features introduced in v2.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="how-to-use">How to use<a href="https://moonrepo.dev/blog/moon-v2-beta#how-to-use" class="hash-link" aria-label="Direct link to How to use" title="Direct link to How to use" translate="no">​</a></h2>
<p>You can install the beta with proto (&gt;= 0.54.1), or download it directly from the
<a href="https://github.com/moonrepo/moon/releases/tag/v2.0.0-beta.0" target="_blank" rel="noopener noreferrer" class="">GitHub release page</a>.</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ proto </span><span class="token function" style="color:#ff94ff;font-weight:bold">install</span><span class="token plain"> moon </span><span class="token number" style="color:#94dded">2.0</span><span class="token plain">.0-beta.1</span><br></span></code></pre></div></div>
<p>Alternatively, you can try using the new experimental shell install scripts. Be warned that these
haven't been tested thoroughly yet!</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token comment" style="color:#97a1af;font-style:italic"># Unix</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token function" style="color:#ff94ff;font-weight:bold">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#fef9c3">--proto</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'=https'</span><span class="token plain"> </span><span class="token parameter variable" style="color:#fef9c3">--tlsv1.2</span><span class="token plain"> </span><span class="token parameter variable" style="color:#fef9c3">-LsSf</span><span class="token plain"> https://github.com/moonrepo/moon/releases/download/v2.0.0-beta.0/moon_cli-installer.sh </span><span class="token operator" style="color:#b7a9f9">|</span><span class="token plain"> </span><span class="token function" style="color:#ff94ff;font-weight:bold">sh</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token comment" style="color:#97a1af;font-style:italic"># Windows</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">powershell </span><span class="token parameter variable" style="color:#fef9c3">-ExecutionPolicy</span><span class="token plain"> Bypass </span><span class="token parameter variable" style="color:#fef9c3">-c</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"irm https://github.com/moonrepo/moon/releases/download/v2.0.0-beta.0/moon_cli-installer.ps1 | iex"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="whats-changed-since-alpha">What's changed since alpha?<a href="https://moonrepo.dev/blog/moon-v2-beta#whats-changed-since-alpha" class="hash-link" aria-label="Direct link to What's changed since alpha?" title="Direct link to What's changed since alpha?" translate="no">​</a></h2>
<p>We've been hard at work the past few weeks working on the following:</p>
<ul>
<li class="">The <code>@moonrepo</code> npm packages have been updated (and published) to support v2. Additionally, they
are now published using OIDC tokens for improved security, and now support provenance.</li>
<li class="">The official shell install scripts have been updated to support v2, but "latest" does not point to
v2 yet. This means that the <code>moonrepo/setup-toolchain</code> GitHub Action can now point to v2.</li>
<li class="">Updated the task <code>command</code> and <code>args</code> settings with a
<a href="https://github.com/moonrepo/starbase/tree/master/crates/args" target="_blank" rel="noopener noreferrer" class="">new parser</a> that better handles
shell syntax, preserves quoting, and much more. We've also made a breaking change where these
settings now only allow simple commands, and <code>script</code> should be used for compound commands (pipes,
redirects, etc).</li>
<li class="">Updated the task <code>envFile</code> option to support token/var expansion.</li>
<li class="">Handful of bug fixes and performance improvements.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="whats-still-in-progress">What's still in progress?<a href="https://moonrepo.dev/blog/moon-v2-beta#whats-still-in-progress" class="hash-link" aria-label="Direct link to What's still in progress?" title="Direct link to What's still in progress?" translate="no">​</a></h2>
<p>There are still some features and improvements that are not yet complete. Here are some of the
things we are still working on:</p>
<ul>
<li class="">Rewriting the <a href="https://github.com/moonrepo/plugins/pull/101" target="_blank" rel="noopener noreferrer" class="">Python toolchain</a> as a WASM plugin.
Because this is incomplete, Python is currently not supported in the v2 alpha.</li>
<li class="">Auditing open issues and PRs to see what else needs to be done before the stable release.</li>
</ul>]]></content:encoded>
            <category>beta</category>
            <category>major</category>
            <category>release</category>
            <category>v2</category>
        </item>
        <item>
            <title><![CDATA[Alpha release of moon v2 now available!]]></title>
            <link>https://moonrepo.dev/blog/moon-v2-alpha</link>
            <guid>https://moonrepo.dev/blog/moon-v2-alpha</guid>
            <pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[After months of hard work, we are excited to announce the alpha release of moon v2! This major]]></description>
            <content:encoded><![CDATA[<p>After months of hard work, we are excited to announce the alpha release of moon v2! This major
release brings a host of new features, improvements, and breaking changes that we believe will
greatly enhance your experience with moon.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="how-to-use">How to use<a href="https://moonrepo.dev/blog/moon-v2-alpha#how-to-use" class="hash-link" aria-label="Direct link to How to use" title="Direct link to How to use" translate="no">​</a></h2>
<p>You can install the alpha with proto (&gt;= 0.54.1), or download it directly from the
<a href="https://github.com/moonrepo/moon/releases/tag/v2.0.0-alpha.2" target="_blank" rel="noopener noreferrer" class="">GitHub release page</a>.</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ proto </span><span class="token function" style="color:#ff94ff;font-weight:bold">install</span><span class="token plain"> moon </span><span class="token number" style="color:#94dded">2.0</span><span class="token plain">.0-alpha.3</span><br></span></code></pre></div></div>
<p>Alternatively, you can try using the new experimental shell install scripts. Be warned that these
haven't been tested thoroughly yet!</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token comment" style="color:#97a1af;font-style:italic"># Unix</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token function" style="color:#ff94ff;font-weight:bold">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#fef9c3">--proto</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'=https'</span><span class="token plain"> </span><span class="token parameter variable" style="color:#fef9c3">--tlsv1.2</span><span class="token plain"> </span><span class="token parameter variable" style="color:#fef9c3">-LsSf</span><span class="token plain"> https://github.com/moonrepo/moon/releases/download/v2.0.0-alpha.2/moon_cli-installer.sh </span><span class="token operator" style="color:#b7a9f9">|</span><span class="token plain"> </span><span class="token function" style="color:#ff94ff;font-weight:bold">sh</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token comment" style="color:#97a1af;font-style:italic"># Windows</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">powershell </span><span class="token parameter variable" style="color:#fef9c3">-ExecutionPolicy</span><span class="token plain"> Bypass </span><span class="token parameter variable" style="color:#fef9c3">-c</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"irm https://github.com/moonrepo/moon/releases/download/v2.0.0-alpha.2/moon_cli-installer.ps1 | iex"</span><br></span></code></pre></div></div>
<blockquote>
<p>The existing shell install script and npm packages have not been updated for v2 yet.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-changes">Breaking changes<a href="https://moonrepo.dev/blog/moon-v2-alpha#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes" translate="no">​</a></h2>
<p>Since this is our first major release after v1, there are quite a few breaking changes, far too many
to list here! Please refer to the <a class="" href="https://moonrepo.dev/docs/migrate/2.0">official migration guide</a> for a comprehensive
list of breaking changes and how to address them.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="new-features">New features<a href="https://moonrepo.dev/blog/moon-v2-alpha#new-features" class="hash-link" aria-label="Direct link to New features" title="Direct link to New features" translate="no">​</a></h2>
<p>This wouldn't be a major release without some exciting new features! Here are some of the
highlights:</p>
<ul>
<li class="">New and improved CLI commands</li>
<li class="">New configuration formats</li>
<li class="">Toolchain and extension WASM plugins</li>
<li class="">Default projects</li>
<li class="">Config based task inheritance</li>
<li class="">Reworked env var handling</li>
<li class="">And much more!</li>
</ul>
<p>For a in-depth look at all the new features and improvements, check out the
<a class="" href="https://moonrepo.dev/blog/moon-v2.0">official v2 blog post</a>, which has not been published yet (still a work in
progress).</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="work-in-a-progress">Work in a progress<a href="https://moonrepo.dev/blog/moon-v2-alpha#work-in-a-progress" class="hash-link" aria-label="Direct link to Work in a progress" title="Direct link to Work in a progress" translate="no">​</a></h2>
<p>Before we stabilize v2, there are still some features and improvements we want to make. Here are
some of the things we are currently working on:</p>
<ul>
<li class="">Rewriting the <a href="https://github.com/moonrepo/plugins/pull/101" target="_blank" rel="noopener noreferrer" class="">Python toolchain</a> as a WASM plugin.
Because this is incomplete, Python is currently not supported in the v2 alpha.</li>
<li class="">Updating the <code>@moonrepo/cli</code> npm package with the new distribution format. Because of this, the
npm package is not yet published.</li>
<li class="">Removing the auto-escaping/quoting from task arguments. This is a source of much confusion, and is
only exacerbated by the differences between shells.</li>
<li class="">Auditing open issues and PRs to see what else needs to be done before the stable release.</li>
</ul>]]></content:encoded>
            <category>alpha</category>
            <category>major</category>
            <category>release</category>
            <category>v2</category>
        </item>
        <item>
            <title><![CDATA[moon v1.41 - Deno WASM toolchain and task input/output improvements]]></title>
            <link>https://moonrepo.dev/blog/moon-v1.41</link>
            <guid>https://moonrepo.dev/blog/moon-v1.41</guid>
            <pubDate>Sun, 28 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[With this release, we're introducing the final piece of the JavaScript ecosystem puzzle, Deno!]]></description>
            <content:encoded><![CDATA[<p>With this release, we're introducing the final piece of the JavaScript ecosystem puzzle, Deno!
Additionally, we're introducing new task input and output formats.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="v2-in-development">v2 in development!<a href="https://moonrepo.dev/blog/moon-v1.41#v2-in-development" class="hash-link" aria-label="Direct link to v2 in development!" title="Direct link to v2 in development!" translate="no">​</a></h2>
<p>We've been talking about v2 for many years now, and with the near stabilization of toolchain WASM
plugins, we're ready to pull the trigger! So what does this mean exactly?</p>
<p>We'd like to land v2 at the start of the new year, and to hit this milestone, we'll be focusing all
our efforts on this initiative and <em>will not</em> be releasing any new features or improvements to the
v1 line until v2 is released. This does not include bug fixes or security patches, which we will
continue to provide as needed.</p>
<p>So what should you expect in v2?</p>
<ul>
<li class="">Toolchain WASM plugins stabilized, with the old platform system removed.</li>
<li class="">Extension WASM plugins can extend the project graph and tasks.</li>
<li class="">Remote cache powered by Bazel Remote Execution API stabilized.</li>
<li class="">Task inheritance via inline configuration.</li>
<li class="">Task inheritance deep merging/extending (is shallow right now).</li>
<li class="">Default project when running tasks.</li>
<li class="">Renamed and improved configuration settings.</li>
<li class="">New binary release strategy.</li>
<li class="">Improved CLI commands.</li>
<li class=""><a href="https://github.com/moonrepo/moon/issues/1681" target="_blank" rel="noopener noreferrer" class="">And much more!</a></li>
</ul>
<p>If you have any requests for v2, please leave a comment in the PR linked above! Additionally, if
you'd like to help with v2, let us know!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="new-deno-toolchain-powered-by-wasm">New Deno toolchain powered by WASM<a href="https://moonrepo.dev/blog/moon-v1.41#new-deno-toolchain-powered-by-wasm" class="hash-link" aria-label="Direct link to New Deno toolchain powered by WASM" title="Direct link to New Deno toolchain powered by WASM" translate="no">​</a></h2>
<p>In our <a class="" href="https://moonrepo.dev/blog/moon-v1.40">last release</a> we introduced an array of new JavaScript ecosystem toolchain
plugins, but there was important plugin missing, Deno! Deno works quite differently than Node.js and
Bun, so we wanted to spend some extra time and effort to get it right.</p>
<p>We're excited to announce Deno support, with full workspaces support and npm compatibility. This
toolchain, unlike the previous implementation, only supports Deno &gt;= v2, but also supports the
following:</p>
<ul>
<li class="">Updated <code>unstable_javascript.packageManager</code> with <code>deno</code>.</li>
<li class="">Will parse <code>deno.json</code> and <code>deno.jsonc</code> manifest files.</li>
<li class="">Will parse <code>deno.lock</code> lock files.</li>
<li class="">Will install dependencies with <code>deno install</code>.</li>
</ul>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/toolchain.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">unstable_deno</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">version</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'2.5.0'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key atrule">unstable_javascript</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">packageManager</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'deno'</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="new-task-inputs">New task inputs<a href="https://moonrepo.dev/blog/moon-v1.41#new-task-inputs" class="hash-link" aria-label="Direct link to New task inputs" title="Direct link to New task inputs" translate="no">​</a></h2>
<p>In <a class="" href="https://moonrepo.dev/blog/moon-v1.39">v1.39</a> we introduced new formats for task inputs, a URI string format and an
object format, based on this <a href="https://github.com/moonrepo/moon/issues/1985" target="_blank" rel="noopener noreferrer" class="">RFC</a>. However, we only
implemented support for files and globs. In this release, we have added support for more input
types.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="file-groups">File groups<a href="https://moonrepo.dev/blog/moon-v1.41#file-groups" class="hash-link" aria-label="Direct link to File groups" title="Direct link to File groups" translate="no">​</a></h3>
<p>Similar to the existing file group tokens (<code>@files</code>, <code>@dirs</code>, etc), we are introducing a new
<a class="" href="https://moonrepo.dev/docs/config/project#file-groups">file group input type</a>, with support for <code>group://</code> URIs and
<code>group</code> objects.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">moon.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">fileGroups</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">sources</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'src/**/*'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key atrule">tasks</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">build</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token comment" style="color:#97a1af;font-style:italic"># ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">inputs</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token comment" style="color:#97a1af;font-style:italic"># Using group protocol</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'group://sources?format=dirs'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token comment" style="color:#97a1af;font-style:italic"># Using an object</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token key atrule">group</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'sources'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">        </span><span class="token key atrule">format</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'dirs'</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="external-projects">External projects<a href="https://moonrepo.dev/blog/moon-v1.41#external-projects" class="hash-link" aria-label="Direct link to External projects" title="Direct link to External projects" translate="no">​</a></h3>
<p>This feature has been highly requested, but we were unsure how to best implement it... until now.
With the new external project input type, you can now rely on arbitrary files from other projects as
inputs, instead of requiring no-op or intermediate task relationships. This is perfect for "I want
any file change in a project dependency to trigger a rebuild" scenarios.</p>
<p>This input type supports both <code>project://</code> URIs and <code>project</code> objects. Both of which require a
project identifier, or <code>^</code> to inherit all project dependencies (similar to targets).</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">moon.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">tasks</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">example</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">inputs</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token comment" style="color:#97a1af;font-style:italic"># Using project protocol</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'project://foo'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token comment" style="color:#97a1af;font-style:italic"># Using an object</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token key atrule">project</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'foo'</span><br></span></code></pre></div></div>
<p>By default this will include all files in the target project, using <code>**/*</code>, but this can be
customized with explicit globs, or referencing a file group in the target project.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">moon.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">tasks</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">example</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">inputs</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'project://foo?filter=src/**/*'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token key atrule">project</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'foo'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">        </span><span class="token key atrule">group</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'sources'</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="improved-task-outputs">Improved task outputs<a href="https://moonrepo.dev/blog/moon-v1.41#improved-task-outputs" class="hash-link" aria-label="Direct link to Improved task outputs" title="Direct link to Improved task outputs" translate="no">​</a></h2>
<p>In the spirit of the new task inputs, we have also improved task outputs by applying the same
formats treatment! All file and glob outputs now support the URI and object formats.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">moon.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">tasks</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">example</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">outputs</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token comment" style="color:#97a1af;font-style:italic"># Literal</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'dist/**/*'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token comment" style="color:#97a1af;font-style:italic"># Using glob protocol</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'glob://dist/**/*'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token comment" style="color:#97a1af;font-style:italic"># Using an object</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token key atrule">glob</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'dist/**/*'</span><br></span></code></pre></div></div>
<p>Additionally, file based outputs now support an <code>optional</code> parameter, which will avoid throwing an
error if the output does not exist after a task has ran. This has also been a much requested
feature!</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">moon.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">tasks</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">example</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">outputs</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'file://build/artifact?optional'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token key atrule">file</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'build/artifact'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">        </span><span class="token key atrule">optional</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other changes<a href="https://moonrepo.dev/blog/moon-v1.41#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<p>View the <a href="https://github.com/moonrepo/moon/releases/tag/v1.41.0" target="_blank" rel="noopener noreferrer" class="">official release</a> for a full list
of changes.</p>
<ul>
<li class="">Added new values to the <code>runInCI</code> task option:<!-- -->
<ul>
<li class=""><code>only</code> - Only run the task in CI, and not locally, when affected.</li>
<li class=""><code>skip</code> - Skip running in CI but run locally and allow task relationships to be valid.</li>
</ul>
</li>
</ul>]]></content:encoded>
            <category>toolchain</category>
            <category>wasm</category>
            <category>javascript</category>
            <category>deno</category>
            <category>task</category>
            <category>input</category>
            <category>output</category>
            <category>v2</category>
        </item>
        <item>
            <title><![CDATA[proto v0.53 - New exec command and backend configuration]]></title>
            <link>https://moonrepo.dev/blog/proto-v0.53</link>
            <guid>https://moonrepo.dev/blog/proto-v0.53</guid>
            <pubDate>Thu, 18 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[In this release, we're introducing another way to execute tools within proto.]]></description>
            <content:encoded><![CDATA[<p>In this release, we're introducing another way to execute tools within proto.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="new-proto-exec-command">New <code>proto exec</code> command<a href="https://moonrepo.dev/blog/proto-v0.53#new-proto-exec-command" class="hash-link" aria-label="Direct link to new-proto-exec-command" title="Direct link to new-proto-exec-command" translate="no">​</a></h2>
<p>Since proto's inception, we've had the <a class="" href="https://moonrepo.dev/docs/proto/commands/run"><code>proto run</code></a> command for executing
a specific tool with a list of arguments. While this works well for simple use-cases, like our shims
layer, it has some limitations, such as:</p>
<ul>
<li class="">It only works with one tool at a time, not multiple.</li>
<li class="">It cannot bootstrap the environment (vars and paths).</li>
<li class="">It cannot execute arbitrary commands.</li>
<li class="">It requires a tool to have a primary/main executable (not everything does).</li>
<li class="">Executing a secondary executable is not straightforward.</li>
</ul>
<p>To address these limitations, we're introducing a new command,
<a class="" href="https://moonrepo.dev/docs/proto/commands/exec"><code>proto exec</code></a>! This command is designed to bootstrap the environment
with any numbers of tools, and execute an arbitrary command within that environment.</p>
<p>For example, say we want to run a backend application that requires Node.js, pnpm, and Ruby, we can
do the following:</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ proto </span><span class="token builtin class-name" style="color:#ff94ff;font-weight:bold">exec</span><span class="token plain"> node@24 pnpm@10 ruby@3.4 -- </span><span class="token function" style="color:#ff94ff;font-weight:bold">pnpm</span><span class="token plain"> run app:start</span><br></span></code></pre></div></div>
<p>This will load and activate these three tools, set environment variables, update <code>PATH</code>, and execute
the command! Pretty nifty, right? It even supports executing the command within a shell! Head to the
docs for more information.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="backend-configuration-support">Backend configuration support<a href="https://moonrepo.dev/blog/proto-v0.53#backend-configuration-support" class="hash-link" aria-label="Direct link to Backend configuration support" title="Direct link to Backend configuration support" translate="no">​</a></h2>
<p>In our previous release, we updated backend plugins with user-driven support, instead of being
hard-coded into proto core. To build upon this, we've improved the interoperability of backends by
supporting configuration of the backend itself (not the tool that the backend represents), using the
new <a class="" href="https://moonrepo.dev/docs/proto/config#backends"><code>[backends]</code> setting</a>.</p>
<p>For example, say you're using <code>asdf:zig</code>, which is the <code>zig</code> tool in the <code>asdf</code> backend. To
configure the tool, you would use <code>[tools."asdf:zig"]</code>, but to configure the <code>asdf</code> backend itself,
you can now use <code>[backends.asdf]</code>.</p>
<div class="language-toml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.prototools</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-toml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token punctuation" style="color:#cad4e2">[</span><span class="token table class-name" style="color:#ff94ff;font-weight:bold">backends.asdf</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">backend-setting</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"value"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token table class-name" style="color:#ff94ff;font-weight:bold">tools."asdf:zig"</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">tool-setting</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"value"</span><br></span></code></pre></div></div>
<p>Backend configuration is useful where you want to control the behavior of the backend itself and
apply it to <em>all</em> tools, while backend-managed tool configuration is useful when you want to control
the behavior of a specific tool.</p>
<div class="theme-admonition theme-admonition-warning admonition_WCGJ alert alert--warning"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_pbrs"><p>In previous versions, configuring a backend-managed tool was done without the backend prefix, for
example <code>[tools.zig]</code>. To avoid collision with non-backend-managed tools, this is no longer
supported, and you must use the full locator, for example <code>[tools."asdf:zig"]</code>.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other changes<a href="https://moonrepo.dev/blog/proto-v0.53#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<p>View the <a href="https://github.com/moonrepo/proto/releases/tag/v0.53.0" target="_blank" rel="noopener noreferrer" class="">official release</a> for a full list
of changes.</p>
<ul>
<li class="">Added a mechanism for plugins to setup the environment during activation and execution workflows.</li>
<li class="">Fixed an issue where shims that belong to a backend would fail to run.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="looking-for-contributors">Looking for contributors<a href="https://moonrepo.dev/blog/proto-v0.53#looking-for-contributors" class="hash-link" aria-label="Direct link to Looking for contributors" title="Direct link to Looking for contributors" translate="no">​</a></h2>
<p>We have a lot of cool stuff planned for proto, like more official backends and tools, improved
workflows, an official registry, and more! So if you're interested in Rust or WASM, we would love
and appreciate your help. Feel free to ping us on Discord!</p>]]></content:encoded>
            <category>exec</category>
            <category>workflow</category>
            <category>backend</category>
            <category>config</category>
        </item>
        <item>
            <title><![CDATA[moon v1.40 - JavaScript ecosystem WASM toolchains and more]]></title>
            <link>https://moonrepo.dev/blog/moon-v1.40</link>
            <guid>https://moonrepo.dev/blog/moon-v1.40</guid>
            <pubDate>Mon, 01 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[It's been a while since our last release, as we've been busy working on new JavaScript ecosystem]]></description>
            <content:encoded><![CDATA[<p>It's been a while since our last release, as we've been busy working on new JavaScript ecosystem
WASM toolchains, which are now available!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="new-javascript-ecosystem-toolchains-powered-by-wasm">New JavaScript ecosystem toolchains powered by WASM<a href="https://moonrepo.dev/blog/moon-v1.40#new-javascript-ecosystem-toolchains-powered-by-wasm" class="hash-link" aria-label="Direct link to New JavaScript ecosystem toolchains powered by WASM" title="Direct link to New JavaScript ecosystem toolchains powered by WASM" translate="no">​</a></h2>
<p>Porting the legacy Bun and Node.js toolchains to WASM has been a non-trivial amount of work, as the
JavaScript ecosystem is quite convoluted compared to other languages. The paradigms required by
JavaScript simply don't exist in other languages, and as such, we've had to build custom
functionality into our toolchain plugin system to support it properly.</p>
<p>On top of that, Bun and Node.js share <em>a lot</em> of functionality, and if you've been using both legacy
toolchains in parallel, you may have noticed a handful of issues because of this, such as
overlapping dependency installs, conflicting alias/task extraction, or over-reading of
<code>package.json</code> files. Additionally, this doesn't even take Deno into account, which has its own set
of problems to solve for interoperability.</p>
<p>To solve these problems, we've reimagined how JavaScript toolchains work in moon with the following
goals in mind:</p>
<ul>
<li class="">Share as much functionality across Node, Bun, and Deno without duplication.</li>
<li class="">Support any number of runtimes and package managers with clean interoperability.</li>
<li class="">Allow each runtime and package manager to implement their own tier 1-3 features.</li>
<li class="">Minimize the complexity of the toolchain configurations.</li>
<li class="">Allow users to depend on these toolchains if necessary.</li>
</ul>
<p>And the result of this rework is 6 new toolchains! Continue reading for more details.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="shared-core-unstable_javascript">Shared core: <code>unstable_javascript</code><a href="https://moonrepo.dev/blog/moon-v1.40#shared-core-unstable_javascript" class="hash-link" aria-label="Direct link to shared-core-unstable_javascript" title="Direct link to shared-core-unstable_javascript" translate="no">​</a></h3>
<p>A new JavaScript toolchain has been introduced, called <code>unstable_javascript</code>. This toolchain serves
as the foundation for all other JavaScript-related toolchains, providing a shared core of
functionality and settings. It implements <a class="" href="https://moonrepo.dev/docs/how-it-works/languages">tier 1 and tier 2</a> features, and is in charge of
the following:</p>
<ul>
<li class="">Defines which package manager (and runtime) to use.</li>
<li class="">Extends projects and tasks with <code>package.json</code> and <code>node_modules</code> information.</li>
<li class="">Locates the dependencies root (<code>package.json</code> workspaces).</li>
<li class="">Installs and dedupes dependencies for the defined package manager.</li>
<li class="">Parses manifests and lockfiles for relevant information.</li>
<li class="">Handles project and workspace syncing operations.</li>
<li class="">And anything else that is shared across the JavaScript ecosystem.</li>
</ul>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/toolchain.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">unstable_javascript</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">packageManager</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'yarn'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">inferTasksFromScripts</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">syncPackageManagerField</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">syncProjectWorkspaceDependencies</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><br></span></code></pre></div></div>
<p>If you're familar with the legacy Bun or Node.js toolchains, this should feel very familiar, as this
is a combination of their functionality. Learn more about its settings:</p>
<ul>
<li class=""><a class="" href="https://moonrepo.dev/docs/config/toolchain#unstable_javascript"><code>unstable_javascript</code></a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="runtimes-unstable_bun-and-unstable_node">Runtimes: <code>unstable_bun</code> and <code>unstable_node</code><a href="https://moonrepo.dev/blog/moon-v1.40#runtimes-unstable_bun-and-unstable_node" class="hash-link" aria-label="Direct link to runtimes-unstable_bun-and-unstable_node" title="Direct link to runtimes-unstable_bun-and-unstable_node" translate="no">​</a></h3>
<p>JavaScript is a unique language in that it has multiple runtimes, primarily Node.js, Bun, and Deno.
We support Node.js through the new <code>unstable_node</code> toolchain, and Bun through the <code>unstable_bun</code>
toolchain, with Deno support coming soon. These toolchains only implement <a class="" href="https://moonrepo.dev/docs/how-it-works/languages">tier 1 and tier 3</a>
features, as tier 2 is handled by the core <code>unstable_javascript</code> toolchain.</p>
<p>Their primary role is to provide settings for runtime execution (task child processes), and for
downloading and installing the runtime tool into the proto toolchain (when the <code>version</code> setting is
defined).</p>
<p>The runtime that will be utilized in the action graph is defined by the new
<code>unstable_javascript.packageManager</code> setting (bun = bun, npm/pnpm/yarn = node), but that doesn't
stop you from using multiple runtimes in parallel.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/toolchain.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">unstable_node</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">version</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'24.0.0'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">executeArgs</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">'--preserve-symlinks'</span><span class="token punctuation" style="color:#cad4e2">]</span><br></span></code></pre></div></div>
<p>Learn more about their settings:</p>
<ul>
<li class=""><a class="" href="https://moonrepo.dev/docs/config/toolchain#unstable_bun"><code>unstable_bun</code></a></li>
<li class=""><a class="" href="https://moonrepo.dev/docs/config/toolchain#unstable_node"><code>unstable_node</code></a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="package-managers-unstable_npm-unstable_pnpm-and-unstable_yarn">Package managers: <code>unstable_npm</code>, <code>unstable_pnpm</code>, and <code>unstable_yarn</code><a href="https://moonrepo.dev/blog/moon-v1.40#package-managers-unstable_npm-unstable_pnpm-and-unstable_yarn" class="hash-link" aria-label="Direct link to package-managers-unstable_npm-unstable_pnpm-and-unstable_yarn" title="Direct link to package-managers-unstable_npm-unstable_pnpm-and-unstable_yarn" translate="no">​</a></h3>
<p>All JavaScript package managers (including Bun) are now their own toolchain, with their own
configuration, and are <em>no longer</em> nested within the Node.js toolchain. These toolchains only
implement <a class="" href="https://moonrepo.dev/docs/how-it-works/languages">tier 1 and tier 3</a> features, as tier 2 is handled by the core
<code>unstable_javascript</code> toolchain.</p>
<p>Their primary role is to provide settings for the <code>unstable_javascript</code> toolchain when installing
and syncing dependencies, and for downloading and installing the package manager tool into the proto
toolchain (when the <code>version</code> setting is defined).</p>
<p>Since there are multiple package managers, which do you need to configure? Only the one associated
with the new <code>unstable_javascript.packageManager</code> setting!</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/toolchain.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">unstable_pnpm</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">version</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'10.15.0'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">installArgs</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">'--frozen-lockfile'</span><span class="token punctuation" style="color:#cad4e2">]</span><br></span></code></pre></div></div>
<p>Learn more about their settings:</p>
<ul>
<li class=""><a class="" href="https://moonrepo.dev/docs/config/toolchain#unstable_bun"><code>unstable_bun</code></a></li>
<li class=""><a class="" href="https://moonrepo.dev/docs/config/toolchain#unstable_npm"><code>unstable_npm</code></a></li>
<li class=""><a class="" href="https://moonrepo.dev/docs/config/toolchain#unstable_pnpm"><code>unstable_pnpm</code></a></li>
<li class=""><a class="" href="https://moonrepo.dev/docs/config/toolchain#unstable_yarn"><code>unstable_yarn</code></a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="migrating-from-legacy-toolchains">Migrating from legacy toolchains<a href="https://moonrepo.dev/blog/moon-v1.40#migrating-from-legacy-toolchains" class="hash-link" aria-label="Direct link to Migrating from legacy toolchains" title="Direct link to Migrating from legacy toolchains" translate="no">​</a></h3>
<p>Migrating from the legacy toolchains to these new modern WASM toolchains is rather straightforward,
as most of the existing settings have been ported over. Follow these steps:</p>
<ul>
<li class="">Move the <code>node.npm</code>, <code>node.pnpm</code>, and <code>node.yarn</code> configuration to its own top-level <code>unstable_</code>
toolchain.</li>
<li class="">Move the <code>bun.version</code> or <code>node.version</code> setting to an <code>unstable_bun</code> or <code>unstable_node</code> toolchain
respectively. If not using <code>version</code>, set an empty object.</li>
<li class="">Remove the <code>node.addEnginesConstraint</code> setting.</li>
<li class="">Rename the <code>node</code> or <code>bun</code> toolchain to <code>unstable_javascript</code>.</li>
<li class="">Rename the <code>node.binExecArgs</code> setting to <code>unstable_node.executeArgs</code>.</li>
<li class="">Rename the <code>node.rootPackageOnly</code> setting to <code>unstable_javascript.rootPackageDependenciesOnly</code>.</li>
</ul>
<p>As an example, here's a before and after of our repository.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/toolchain.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token comment" style="color:#97a1af;font-style:italic"># Before</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key atrule">node</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">version</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'22.14.0'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">packageManager</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'yarn'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">yarn</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">version</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'4.8.0'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">inferTasksFromScripts</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">syncPackageManagerField</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">syncProjectWorkspaceDependencies</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><br></span></code></pre></div></div>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/toolchain.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token comment" style="color:#97a1af;font-style:italic"># After</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key atrule">unstable_javascript</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">packageManager</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'yarn'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">inferTasksFromScripts</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">syncPackageManagerField</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">syncProjectWorkspaceDependencies</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key atrule">unstable_node</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">version</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'22.14.0'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key atrule">unstable_yarn</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">version</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'4.8.0'</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="backwards-incompatibility-and-caveats">Backwards incompatibility and caveats<a href="https://moonrepo.dev/blog/moon-v1.40#backwards-incompatibility-and-caveats" class="hash-link" aria-label="Direct link to Backwards incompatibility and caveats" title="Direct link to Backwards incompatibility and caveats" translate="no">​</a></h3>
<p>Because these new toolchains are built around a plugin system, and not hard-coded into core like the
legacy toolchains, there are some backwards incompatibilities, changes, and caveats to be aware of:</p>
<ol>
<li class="">Because the old <code>node</code>/<code>bun</code> toolchains are now spread across multiple new toolchains, instead of
1 toolchain, any configuration of the task <a class="" href="https://moonrepo.dev/docs/config/project#toolchain"><code>toolchain</code> setting</a>
may now be inaccurate, as this setting <em>overrides</em> all detected/inherited toolchains. We suggest
omitting this field unless you want full control and understand what you are doing.</li>
</ol>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">moon.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token comment" style="color:#97a1af;font-style:italic"># Invalid</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key atrule">tasks</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">build</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token comment" style="color:#97a1af;font-style:italic"># ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">toolchain</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'node'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token comment" style="color:#97a1af;font-style:italic"># Valid</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key atrule">tasks</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">build</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token comment" style="color:#97a1af;font-style:italic"># ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">toolchain</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">'unstable_javascript'</span><span class="token punctuation" style="color:#cad4e2">,</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'unstable_node'</span><span class="token punctuation" style="color:#cad4e2">,</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'unstable_npm'</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token comment" style="color:#97a1af;font-style:italic"># Or simply</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">toolchain</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">'javascript'</span><span class="token punctuation" style="color:#cad4e2">,</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'node'</span><span class="token punctuation" style="color:#cad4e2">,</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'npm'</span><span class="token punctuation" style="color:#cad4e2">]</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">Additionally, task inheritance <em>may</em> not function the same, based on what toolchains are now
automatically detected. Ensure that projects and tasks inherit the correct toolchains by
utilizing <a class="" href="https://moonrepo.dev/docs/commands/project"><code>moon project</code></a> and <a class="" href="https://moonrepo.dev/docs/commands/task"><code>moon task</code></a>
commands.</li>
</ol>
<p>If either of these issues, or other unexpected issues arise, please report it so we can fix it, or
provide a work around!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="new-task-caching-options">New task caching options<a href="https://moonrepo.dev/blog/moon-v1.40#new-task-caching-options" class="hash-link" aria-label="Direct link to New task caching options" title="Direct link to New task caching options" translate="no">​</a></h2>
<p>Tasks have always supported a <a class="" href="https://moonrepo.dev/docs/config/project#cache"><code>cache</code> option</a> for toggling caching on
and off. With the introduction of remote cache, we're expanding these options to provide more
flexibility and control. Instead of supporting only a simple boolean flag, we're introducing new
<code>local</code> and <code>remote</code> values, which will only cache locally or remotely, respectively.</p>
<p>This is useful for tasks that need caching, but should not persist in the remote cache, and vice
versa.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">moon.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">tasks</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">build</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token comment" style="color:#97a1af;font-style:italic"># ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">options</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token key atrule">cache</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'local'</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="new-local-read-only-mode-for-remote-cache">New local read-only mode for remote cache<a href="https://moonrepo.dev/blog/moon-v1.40#new-local-read-only-mode-for-remote-cache" class="hash-link" aria-label="Direct link to New local read-only mode for remote cache" title="Direct link to New local read-only mode for remote cache" translate="no">​</a></h2>
<p>Adoption of our new <a class="" href="https://moonrepo.dev/docs/guides/remote-cache">remote cache</a> solution has been going great, and
we've heard positive feedback from users about its performance and reliability. However, it's not
perfect and can always be improved!</p>
<p>And as such, we're introducing a new
<a class="" href="https://moonrepo.dev/docs/config/workspace#localreadonly"><code>unstable_remote.cache.localReadOnly</code></a> setting, which will
only read (download) outputs from the remote cache when in local development, but will <em>not</em> write
(upload) outputs. This is useful for teams that want to share cache between CI and local, but don't
want the overhead of uploading in-development outputs.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/workspace.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">unstable_remote</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">cache</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">localReadOnly</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other changes<a href="https://moonrepo.dev/blog/moon-v1.40#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<p>View the <a href="https://github.com/moonrepo/moon/releases/tag/v1.40.0" target="_blank" rel="noopener noreferrer" class="">official release</a> for a full list
of changes.</p>
<ul>
<li class="">Updated <code>moon query touched-files</code> to default to comparing against remote branches when in CI, and
local when not in CI. This aligns with the other <code>moon query</code> commands.</li>
<li class="">Updated task commands (child processes) to utilize toolchain executables directly, instead of
relying entirely on proto shims. It achieves this by locating the executables, and prepending
their directory onto <code>PATH</code>.</li>
<li class="">When running a task, we now set a <code>MOON_TASK_HASH</code> environment variable for the current hash,
which can be read from child processes.</li>
<li class="">Published the moon VSCode extension to Open VSX:
<a href="https://open-vsx.org/extension/moonrepo/moon-console" target="_blank" rel="noopener noreferrer" class="">https://open-vsx.org/extension/moonrepo/moon-console</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="whats-next">What's next?<a href="https://moonrepo.dev/blog/moon-v1.40#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?" translate="no">​</a></h2>
<p>With toolchains plugins being stabilized more, we'd like to focus on some other areas.</p>
<ul>
<li class="">Implement more of the task inputs RFC: <a href="https://github.com/moonrepo/moon/issues/1985" target="_blank" rel="noopener noreferrer" class="">https://github.com/moonrepo/moon/issues/1985</a></li>
<li class="">Investigate a new <code>unstable_deno</code> toolchain</li>
<li class="">Investigate better task inheritance: <a href="https://github.com/moonrepo/moon/issues/2023" target="_blank" rel="noopener noreferrer" class="">https://github.com/moonrepo/moon/issues/2023</a></li>
</ul>]]></content:encoded>
            <category>toolchain</category>
            <category>wasm</category>
            <category>javascript</category>
            <category>bun</category>
            <category>node</category>
            <category>npm</category>
            <category>pnpm</category>
            <category>yarn</category>
        </item>
        <item>
            <title><![CDATA[proto v0.52 - Custom backend plugins]]></title>
            <link>https://moonrepo.dev/blog/proto-v0.52</link>
            <guid>https://moonrepo.dev/blog/proto-v0.52</guid>
            <pubDate>Thu, 21 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[In this release, we're excited to announce custom backend plugins!]]></description>
            <content:encoded><![CDATA[<p>In this release, we're excited to announce custom backend plugins!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="custom-backend-plugins">Custom backend plugins<a href="https://moonrepo.dev/blog/proto-v0.52#custom-backend-plugins" class="hash-link" aria-label="Direct link to Custom backend plugins" title="Direct link to Custom backend plugins" translate="no">​</a></h2>
<p>In <a class="" href="https://moonrepo.dev/blog/proto-v0.47">proto v0.47</a> we announced support for backend plugins, starting with
<a href="https://asdf-vm.com/" target="_blank" rel="noopener noreferrer" class="">asdf</a>. However, the initial plan was for backend plugins to be an internal
only feature, maintained by the proto team directly. After some thought, we realized that this was a
bit limiting, and would ultimately slow down the growth of proto's ecosystem. So, in this release,
we're opening up backend plugins to the community!</p>
<p>Backend plugins are a superset of tool plugins that inherit all of their functionality, with
additional backend specific functionality layered on top. This means that backend plugins can define
and manage multiple tools, and also handle installation, version resolution, and more.</p>
<p>To support backend plugins, we've made some changes to the configuration format. Backend plugins can
be configured with the new <a class="" href="https://moonrepo.dev/docs/proto/config#pluginsbackends"><code>[plugins.backends]</code> section</a>, and
tool plugins have moved to the <a class="" href="https://moonrepo.dev/docs/proto/config#pluginstools"><code>[plugins.tools]</code> section</a>. For
backwards compatibility, the old <code>[plugins]</code> section will still work for now.</p>
<div class="language-toml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.prototools</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-toml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token punctuation" style="color:#cad4e2">[</span><span class="token table class-name" style="color:#ff94ff;font-weight:bold">plugins.backends</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">my-backend</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"https://raw.githubusercontent.com/my/backend/master/proto-plugin.wasm"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="breaking-new-backend-identifier-format">Breaking: New backend identifier format<a href="https://moonrepo.dev/blog/proto-v0.52#breaking-new-backend-identifier-format" class="hash-link" aria-label="Direct link to Breaking: New backend identifier format" title="Direct link to Breaking: New backend identifier format" translate="no">​</a></h2>
<p>To support the backend plugins going forward, we've had to make a breaking change to the way
backends are identified in configuration. Previously, the backend was specified by prefixing the
version like <code>asdf:1.2.3</code>, or with the <code>[tools.*.backend]</code> setting. This was very restrictive.</p>
<p>Going forward, the backend can <em>only</em> be prefixed as part of the tool identifier.</p>
<div class="language-toml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.prototools</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-toml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token comment" style="color:#97a1af;font-style:italic"># Before</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">zig</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"asdf:0.13.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token comment" style="color:#97a1af;font-style:italic"># After</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">"asdf:zig"</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"0.13.0"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other changes<a href="https://moonrepo.dev/blog/proto-v0.52#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<p>View the <a href="https://github.com/moonrepo/proto/releases/tag/v0.52.0" target="_blank" rel="noopener noreferrer" class="">official release</a> for a full list
of changes.</p>
<ul>
<li class="">Updated lockfiles to track <code>os</code> and <code>arch</code> information when applicable.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="looking-for-contributors">Looking for contributors<a href="https://moonrepo.dev/blog/proto-v0.52#looking-for-contributors" class="hash-link" aria-label="Direct link to Looking for contributors" title="Direct link to Looking for contributors" translate="no">​</a></h2>
<p>We have a lot of cool stuff planned for proto, like more official backends and tools, improved
workflows, an official registry, and more! So if you're interested in Rust or WASM, we would love
and appreciate your help. Feel free to ping us on Discord!</p>]]></content:encoded>
            <category>custom</category>
            <category>backend</category>
            <category>plugin</category>
            <category>lockfile</category>
        </item>
        <item>
            <title><![CDATA[moon v1.39 - Improved task inputs, better proto integration, and project layers]]></title>
            <link>https://moonrepo.dev/blog/moon-v1.39</link>
            <guid>https://moonrepo.dev/blog/moon-v1.39</guid>
            <pubDate>Thu, 24 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[This is a rather small release, but it does include some important changes to task inputs, and]]></description>
            <content:encoded><![CDATA[<p>This is a rather small release, but it does include some important changes to task inputs, and
proto's integration.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="improved-task-inputs">Improved task inputs<a href="https://moonrepo.dev/blog/moon-v1.39#improved-task-inputs" class="hash-link" aria-label="Direct link to Improved task inputs" title="Direct link to Improved task inputs" translate="no">​</a></h2>
<p>A few months ago we introduced an
<a href="https://github.com/moonrepo/moon/issues/1985" target="_blank" rel="noopener noreferrer" class="">RFC for improving task inputs</a> that introduces new
syntax, functionality, and input types. In this release, we have implemented a portion of the RFC
for testing before we implement the rest. Continue reading for more details!</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-formats">New formats<a href="https://moonrepo.dev/blog/moon-v1.39#new-formats" class="hash-link" aria-label="Direct link to New formats" title="Direct link to New formats" translate="no">​</a></h3>
<p>To start, we are introducing 2 new formats for configuring task inputs, a URI format and an object
format, both of which support custom parameters.</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="uris">URIs<a href="https://moonrepo.dev/blog/moon-v1.39#uris" class="hash-link" aria-label="Direct link to URIs" title="Direct link to URIs" translate="no">​</a></h4>
<p>URIs should be rather familiar, as they are a string prefixed with a scheme (<code>://</code>), followed by a
value, and an optional list of query parameters (<code>?</code>). Currently files can be specified using the
<a class="" href="https://moonrepo.dev/docs/config/project#file-paths"><code>file://</code> scheme</a>, and globs with the
<a class="" href="https://moonrepo.dev/docs/config/project#glob-patterns"><code>glob://</code> scheme</a>. Environment variables do not support URIs.</p>
<div class="language-yml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">moon.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">tasks</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">build</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token comment" style="color:#97a1af;font-style:italic"># ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">inputs</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'file:///*.config.js?optional'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'glob://src/**/*.ts'</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>Files and globs can still be configured using literal strings. The URI format can be used when
customizing parameters!</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="objects">Objects<a href="https://moonrepo.dev/blog/moon-v1.39#objects" class="hash-link" aria-label="Direct link to Objects" title="Direct link to Objects" translate="no">​</a></h4>
<p>Objects provide an alternative to strings, allowing you to customize parameters in a standard and
familiar format. Files can be specified using the <a class="" href="https://moonrepo.dev/docs/config/project#file-paths"><code>file</code> key</a>, and
globs with the <a class="" href="https://moonrepo.dev/docs/config/project#glob-patterns"><code>glob</code> key</a>. Environment variables do not
support objects.</p>
<div class="language-yml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">moon.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">tasks</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">build</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token comment" style="color:#97a1af;font-style:italic"># ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">inputs</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token key atrule">file</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'/*.config.js'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">        </span><span class="token key atrule">optional</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token key atrule">glob</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'src/**/*.ts'</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-parameters">New parameters<a href="https://moonrepo.dev/blog/moon-v1.39#new-parameters" class="hash-link" aria-label="Direct link to New parameters" title="Direct link to New parameters" translate="no">​</a></h3>
<p>As mentioned above, file and glob inputs now support parameters, which can be customized using URI
and object formats. The following parameters are available:</p>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="files">Files<a href="https://moonrepo.dev/blog/moon-v1.39#files" class="hash-link" aria-label="Direct link to Files" title="Direct link to Files" translate="no">​</a></h4>
<ul>
<li class=""><code>content</code> (<code>string</code>) - When determining affected state, will match against the file's content
using the defined regex pattern, instead of relying on file existence.</li>
<li class=""><code>optional</code> (<code>boolean</code>) - When hashing and set to <code>true</code> and the file is missing, will not log a
warning. When set to <code>false</code> and the file is missing, will fail with an error. Defaults to logging
a warning.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_tleR" id="globs">Globs<a href="https://moonrepo.dev/blog/moon-v1.39#globs" class="hash-link" aria-label="Direct link to Globs" title="Direct link to Globs" translate="no">​</a></h4>
<ul>
<li class=""><code>cache</code> (<code>boolean</code>) - When gathering inputs for hashing, defines whether the glob results should
be cached for the duration of the moon process. Defaults to <code>true</code>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="better-proto-integration">Better proto integration<a href="https://moonrepo.dev/blog/moon-v1.39#better-proto-integration" class="hash-link" aria-label="Direct link to Better proto integration" title="Direct link to Better proto integration" translate="no">​</a></h2>
<p>In previous versions of moon, we would automatically install <a class="" href="https://moonrepo.dev/proto">proto</a> for you based on
certain conditions. This logic was applied to all <code>moon</code> sub-commands, which was not necessary, as
it was only required for task running related commands.</p>
<p>To improve this, we have integrated proto into the action pipeline through a new action,
<code>SetupProto</code>, which runs before any <code>SetupToolchain</code> action. With this, proto is only installed when
required by that specific toolchain, and not for every command.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-proto-setting">New <code>proto</code> setting<a href="https://moonrepo.dev/blog/moon-v1.39#new-proto-setting" class="hash-link" aria-label="Direct link to new-proto-setting" title="Direct link to new-proto-setting" translate="no">​</a></h3>
<p>Additionally, we are introducing a <a class="" href="https://moonrepo.dev/docs/config/toolchain#proto"><code>proto</code></a> setting in
<a class="" href="https://moonrepo.dev/docs/config/toolchain"><code>.moon/toolchain.yml</code></a>, which can be used to control the integration of
proto in moon. To start, you can now customize the proto version! This is extremely useful if you
want to test new proto features, or need to rollback to an older version.</p>
<div class="language-yml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/toolchain.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">proto</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">version</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'0.51.4'</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other changes<a href="https://moonrepo.dev/blog/moon-v1.39#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h3>
<p>Lastly, proto has been upgrade to <a href="https://github.com/moonrepo/proto/releases/tag/v0.51.0" target="_blank" rel="noopener noreferrer" class="">v0.51</a>,
which includes 2 major features: lockfiles and custom registries. However, we have yet to test these
features thoroughly in moon, so they are not "officially" supported yet, but you can still use them
if you wish. We will be adding support for these features in the future.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="project-layers">Project layers<a href="https://moonrepo.dev/blog/moon-v1.39#project-layers" class="hash-link" aria-label="Direct link to Project layers" title="Direct link to Project layers" translate="no">​</a></h2>
<p>Project layers may sound like a new feature, but they are simply a rename of the project type. Going
forward, the <code>type</code> setting in <a class="" href="https://moonrepo.dev/docs/config/project"><code>moon.yml</code></a> has been renamed to
<a class="" href="https://moonrepo.dev/docs/config/project#layer"><code>layer</code></a>, but backwards compatibility will be maintained until v2. Why
the rename?</p>
<p>The term "layer" better reflects the purpose and functionality of this concept, as it defines a
layer (the <a class="" href="https://moonrepo.dev/docs/config/project#layer"><code>layer</code></a> setting) within the development stack (the
<a class="" href="https://moonrepo.dev/docs/config/project#stack"><code>stack</code></a> setting), and helps to enforce proper relationships. This
change aims to improve clarity and consistency in our configuration.</p>
<p>For example, the following layers are available, from highest to lowest. Layers can then depend on
lower layers, but not higher layers. Except for automations and applications, they can also depend
on themself.</p>
<table><thead><tr><th>Layer</th><th>Description</th></tr></thead><tbody><tr><td><code>automation</code></td><td>An automated testing suite, like E2E, integration, or visual tests.</td></tr><tr><td><code>application</code></td><td>An application of any kind.</td></tr><tr><td><code>tool</code></td><td>An internal tool, CLI, one-off script, etc.</td></tr><tr><td><code>library</code></td><td>A self-contained, shareable, and publishable set of code.</td></tr><tr><td><code>scaffolding</code></td><td>Templates or generators for scaffolding.</td></tr><tr><td><code>configuration</code></td><td>Configuration files or infrastructure.</td></tr><tr><td><code>unknown</code></td><td>When not configured.</td></tr></tbody></table>
<p>Because of this rename, the following changes have been made:</p>
<ul>
<li class=""><code>type</code> --&gt; <code>layer</code> in <code>moon.yml</code></li>
<li class=""><code>--type</code> --&gt; <code>--layer</code> in <code>moon query projects</code></li>
<li class=""><code>projectType</code> --&gt; <code>projectLayer</code> for MQL</li>
<li class=""><code>$projectType</code> --&gt; <code>$projectLayer</code> for task tokens</li>
<li class=""><code>enforceProjectTypeRelationships</code> --&gt; <code>enforceLayerRelationships</code> in <code>.moon/workspace.yml</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes-1">Other changes<a href="https://moonrepo.dev/blog/moon-v1.39#other-changes-1" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<p>View the <a href="https://github.com/moonrepo/moon/releases/tag/v1.39.0" target="_blank" rel="noopener noreferrer" class="">official release</a> for a full list
of changes.</p>
<ul>
<li class="">Added unstable support for bubbling up logs from WASM plugins.</li>
<li class="">Updated the <code>@moonrepo/cli</code> npm package to no longer rely on postinstall scripts.</li>
<li class="">Improved argument quoting for commands and scripts.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="whats-next">What's next?<a href="https://moonrepo.dev/blog/moon-v1.39#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?" translate="no">​</a></h2>
<p>With toolchains plugins being stabilized more, we'd like to focus on some other areas.</p>
<ul>
<li class="">Better command line argument parsing/joining (especially for task <code>args</code>)</li>
<li class="">Pkl configuration improvements</li>
<li class="">WASM toolchain documentation</li>
</ul>]]></content:encoded>
            <category>task</category>
            <category>input</category>
            <category>uri</category>
            <category>object</category>
            <category>proto</category>
            <category>project</category>
            <category>layer</category>
        </item>
        <item>
            <title><![CDATA[proto v0.51 - Unstable lockfiles and plugin registries]]></title>
            <link>https://moonrepo.dev/blog/proto-v0.51</link>
            <guid>https://moonrepo.dev/blog/proto-v0.51</guid>
            <pubDate>Thu, 17 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[With this release, we're excited to introduce two major features that pave the way for proto's]]></description>
            <content:encoded><![CDATA[<p>With this release, we're excited to introduce two major features that pave the way for proto's
future!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="unstable-lockfile-support">Unstable lockfile support<a href="https://moonrepo.dev/blog/proto-v0.51#unstable-lockfile-support" class="hash-link" aria-label="Direct link to Unstable lockfile support" title="Direct link to Unstable lockfile support" translate="no">​</a></h2>
<p>Lockfiles have been requested by the community since proto's inception, but adopting them has been a
non-trivial task, as it requires touching almost every aspect of proto. With that said, we've been
slowly reworking the internals to support lockfiles, and with this release, we're introducing
unstable support for them!</p>
<p>If you're unaware of what lockfiles are, they allow you to pin the exact version (and checksum) of a
tool that is installed, ensuring that your development environment is consistent and reproducible.
If you've used package managers like npm, Cargo, or uv, you're likely familiar with this concept.</p>
<p>In proto, the concept of lockfiles is mostly the same, but the manner in which they are created and
updated may differ based on other tools. To start, lockfiles in proto are <em>opt-in</em> and can be
enabled with the new <a class="" href="https://moonrepo.dev/docs/proto/config#unstable-lockfile"><code>settings.unstable-lockfile</code></a> setting in
<code>.prototools</code>.</p>
<div class="language-toml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.prototools</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-toml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token punctuation" style="color:#cad4e2">[</span><span class="token table class-name" style="color:#ff94ff;font-weight:bold">settings</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">unstable-lockfile</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token boolean" style="color:#94dded">true</span><br></span></code></pre></div></div>
<p>This will create a <code>.protolock</code> file in the current directory, relative to the <code>.prototools</code> file.
In effect, this locks that directory and all of its subdirectories. As a side-effect, nested
lockfiles are not supported.</p>
<p>To demonstrate how lockfiles work, installing the following tools with <code>proto install</code>...</p>
<div class="language-toml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.prototools</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-toml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key property" style="color:#b7a9f9">bun</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"1.2.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">deno</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"2.4.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">node</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"22.17.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token table class-name" style="color:#ff94ff;font-weight:bold">settings</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">unstable-lockfile</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token boolean" style="color:#94dded">true</span><br></span></code></pre></div></div>
<p>... would generate the following <code>.protolock</code> file:</p>
<div class="language-toml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.protolock</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-toml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token comment" style="color:#97a1af;font-style:italic"># Generated by proto. Do not modify!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token table class-name" style="color:#ff94ff;font-weight:bold">tools.bun</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">spec</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"1.2.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">version</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"1.2.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">checksum</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"sha256:fa72173cb2220d00e2d2650fefdc0b5b37bfd8bb33d8d671b50efb409c2f5745"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token table class-name" style="color:#ff94ff;font-weight:bold">tools.deno</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">spec</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"2.4.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">version</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"2.4.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">checksum</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"sha256:c913d018d64c48dcc5b7b90d844efb6d017595a7c1e237f89141df1b3ef8b962"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token table class-name" style="color:#ff94ff;font-weight:bold">tools.node</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">spec</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"22.17.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">version</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"22.17.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">checksum</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"sha256:cc9cc294eaf782dd93c8c51f460da610cc35753c6a9947411731524d16e97914"</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="updated-workflows">Updated workflows<a href="https://moonrepo.dev/blog/proto-v0.51#updated-workflows" class="hash-link" aria-label="Direct link to Updated workflows" title="Direct link to Updated workflows" translate="no">​</a></h3>
<p>The <a class="" href="https://moonrepo.dev/docs/proto/commands/run"><code>proto run</code></a> (shims),
<a class="" href="https://moonrepo.dev/docs/proto/commands/install"><code>proto install</code></a>, and
<a class="" href="https://moonrepo.dev/docs/proto/commands/uninstall"><code>proto uninstall</code></a> commands have been updated to support lockfiles.</p>
<p>When running or installing tools and a matching specification exists in the lockfile, the locked
version will be inherited even if there's a newer version upstream, and the tool's checksum will be
validated when available. These checks can be bypassed with the new <code>--update-lockfile</code> flag
(install only).</p>
<p>Inversely, when uninstalling tools, the lockfile will be updated to remove any matching
specification records.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="still-a-work-in-progress">Still a work in progress<a href="https://moonrepo.dev/blog/proto-v0.51#still-a-work-in-progress" class="hash-link" aria-label="Direct link to Still a work in progress" title="Direct link to Still a work in progress" translate="no">​</a></h3>
<p>We are marking lockfiles as unstable as they have not been fully implemented or thoroughly tested.
There are other commands like <a class="" href="https://moonrepo.dev/docs/proto/commands/outdated"><code>proto outdated</code></a> and
<a class="" href="https://moonrepo.dev/docs/proto/commands/status"><code>proto status</code></a> that are not lockfile aware yet, but will be in the
future.</p>
<p>But please, give them a whirl and let us know what you think!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="unstable-oci-registries-for-plugin-storage">Unstable OCI registries for plugin storage<a href="https://moonrepo.dev/blog/proto-v0.51#unstable-oci-registries-for-plugin-storage" class="hash-link" aria-label="Direct link to Unstable OCI registries for plugin storage" title="Direct link to Unstable OCI registries for plugin storage" translate="no">​</a></h2>
<p>Another important feature that is necessary for proto's success is support for an official plugin
registry. Before we get to that, we need to lay the groundwork for how plugins are stored and
distributed. With this release, we're introducing unstable support for
<a href="https://opencontainers.org/" target="_blank" rel="noopener noreferrer" class="">OCI registries</a> as a storage mechanism for plugins. If you're
unfamiliar with OCI registries, they are a standard for storing and distributing container images
(Docker), but can also be used to store other types of
<a href="https://oras.land/docs/concepts/artifact" target="_blank" rel="noopener noreferrer" class="">artifacts</a>, in this case, WASM plugins.</p>
<p>To support registries, we have introduced a new
<a class="" href="https://moonrepo.dev/docs/proto/config#unstable-registries"><code>settings.unstable-registries</code></a> setting in <code>.prototools</code>,
which allows you to configure a list of registries to query for applicable plugins. For example:</p>
<div class="language-toml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.prototools</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-toml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token punctuation" style="color:#cad4e2">[</span><span class="token table class-name" style="color:#ff94ff;font-weight:bold">settings</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">unstable-registries</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token punctuation" style="color:#cad4e2">{</span><span class="token plain"> registry: </span><span class="token string" style="color:#c9e166">"ghcr.io"</span><span class="token punctuation" style="color:#cad4e2">,</span><span class="token plain"> namespace: </span><span class="token string" style="color:#c9e166">"moonrepo"</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token punctuation" style="color:#cad4e2">]</span><br></span></code></pre></div></div>
<p>Additionally, we are introducing a new <code>registry://</code> plugin locator, which allows you to configure a
plugin by its OCI reference.</p>
<div class="language-toml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.prototools</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-toml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token punctuation" style="color:#cad4e2">[</span><span class="token table class-name" style="color:#ff94ff;font-weight:bold">plugins</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token comment" style="color:#97a1af;font-style:italic"># Longform with tag</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">bun</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"registry://ghcr.io/moonrepo/bun_tool:v1.2.3"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token comment" style="color:#97a1af;font-style:italic"># Longform without tag</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">bun</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"registry://ghcr.io/moonrepo/bun_tool"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token comment" style="color:#97a1af;font-style:italic"># Shortform with tag</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">bun</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"registry://bun_tool:v1.2.3"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token comment" style="color:#97a1af;font-style:italic"># Shortform without tag</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">bun</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"registry://bun_tool"</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="how-it-works">How it works<a href="https://moonrepo.dev/blog/proto-v0.51#how-it-works" class="hash-link" aria-label="Direct link to How it works" title="Direct link to How it works" translate="no">​</a></h3>
<p>Using a container registry to store plugins seems odd at first, but it actually allows us to
leverage existing specifications, infrastructure, and tools to manage and distribute plugins. We
don't want to re-invent the wheel here, so why not use something that most of the industry is
already using?</p>
<p>With that said, how does this work in proto? Since we are not a container image, we use the
<a href="https://oras.land/docs/concepts/artifact" target="_blank" rel="noopener noreferrer" class="">artifact portion of the specification</a> instead.
Primarily, plugins are stored in layers! The blob/content of WASM, TOML, JSON, and YAML plugins are
stored in CAS, and referenced in layers by a sha256 digest.</p>
<p>As for annotations, we support the
<a href="https://github.com/opencontainers/image-spec/blob/main/annotations.md" target="_blank" rel="noopener noreferrer" class="">OCI standard annotations</a>,
but will also support moonrepo-specific annotations in the future.</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>At this time, we do not provide a mechanism for uploading plugins to a registry. You'll need to do
that manually.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="official-registry">Official registry?<a href="https://moonrepo.dev/blog/proto-v0.51#official-registry" class="hash-link" aria-label="Direct link to Official registry?" title="Direct link to Official registry?" translate="no">​</a></h3>
<p>We do have plans to support an official moonrepo plugin registry, for both proto and moon. We are in
the process of investigating solutions to this and will provide more details soon.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other changes<a href="https://moonrepo.dev/blog/proto-v0.51#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<p>View the <a href="https://github.com/moonrepo/proto/releases/tag/v0.51.0" target="_blank" rel="noopener noreferrer" class="">official release</a> for a full list
of changes.</p>
<ul>
<li class="">Removed <code>--canary</code> from <code>proto install</code>, just use <code>canary</code> as the version specifier instead.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="looking-for-contributors">Looking for contributors<a href="https://moonrepo.dev/blog/proto-v0.51#looking-for-contributors" class="hash-link" aria-label="Direct link to Looking for contributors" title="Direct link to Looking for contributors" translate="no">​</a></h2>
<p>We have a lot of cool stuff planned for proto, like backend plugins, more official tools, improved
workflows, an official registry, and more! So if you're interested in Rust or WASM, we would love
and appreciate your help. Feel free to ping us on Discord!</p>]]></content:encoded>
            <category>lockfile</category>
            <category>record</category>
            <category>registry</category>
            <category>oci</category>
            <category>plugin</category>
            <category>locator</category>
        </item>
        <item>
            <title><![CDATA[moon v1.38 - Go WASM toolchain, MCP tools, terminal notifications, and more!]]></title>
            <link>https://moonrepo.dev/blog/moon-v1.38</link>
            <guid>https://moonrepo.dev/blog/moon-v1.38</guid>
            <pubDate>Tue, 24 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[In this release, we're stoked to release the Go WASM toolchain plugin, and improved MCP/AI support!]]></description>
            <content:encoded><![CDATA[<p>In this release, we're stoked to release the Go WASM toolchain plugin, and improved MCP/AI support!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="rfc-task-inheritance-via-inline-configuration">RFC: Task inheritance via inline configuration<a href="https://moonrepo.dev/blog/moon-v1.38#rfc-task-inheritance-via-inline-configuration" class="hash-link" aria-label="Direct link to RFC: Task inheritance via inline configuration" title="Direct link to RFC: Task inheritance via inline configuration" translate="no">​</a></h2>
<p>Task inheritance is one of moon's most powerful features, allowing you to define tasks at the
top-level and have them automatically inherited by projects that match certain conditions. In it's
current form, task inheritance is based on the file name of the configuration file, but this
approach has several limitations.</p>
<p>We're planning to improve task inheritance and have written up an
<a href="https://github.com/moonrepo/moon/issues/2023" target="_blank" rel="noopener noreferrer" class="">RFC to discuss these changes</a>. We'd appreciate any
and all feedback!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="new-go-toolchain-powered-by-wasm">New Go toolchain powered by WASM<a href="https://moonrepo.dev/blog/moon-v1.38#new-go-toolchain-powered-by-wasm" class="hash-link" aria-label="Direct link to New Go toolchain powered by WASM" title="Direct link to New Go toolchain powered by WASM" translate="no">​</a></h2>
<p>Official Go toolchain support has been requested by the community for a long time now, and with the
somewhat stabilization of WASM plugins and the introduction of the
<a class="" href="https://moonrepo.dev/blog/moon-v1.37">Rust toolchain in the last release</a>, we felt it was finally time to add Go! To enable
Go, run our new command or add an <a class="" href="https://moonrepo.dev/docs/config/toolchain#unstable_go"><code>unstable_go</code></a> entry to
<code>.moon/toolchain.yml</code>.</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moon toolchain </span><span class="token function" style="color:#ff94ff;font-weight:bold">add</span><span class="token plain"> unstable_go</span><br></span></code></pre></div></div>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/toolchain.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">unstable_go</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">version</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'1.24.0'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">workspaces</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><br></span></code></pre></div></div>
<p>The Go toolchain releases with full <a class="" href="https://moonrepo.dev/docs/how-it-works/languages">tier 1, 2, and 3 support</a>!
Additionally, the following features and functionality is available when enabling the toolchain:</p>
<ul>
<li class="">Supports Go workspaces through the <code>go.work</code> file. Can be disabled with the
<a class="" href="https://moonrepo.dev/docs/config/toolchain#unstable_go"><code>unstable_go.workspaces</code></a> setting.</li>
<li class="">Extracts the <code>go.mod</code> <code>module</code> directive as a project alias.</li>
<li class="">Extracts project relationships and dependency information from <code>go.mod</code> <code>require</code> directives.</li>
<li class="">Extracts version and checksum information from <code>go.sum</code> and <code>go.work.sum</code> files.</li>
<li class="">Injects Go globals directory (<code>GOBIN</code>) into task command/script child processes.</li>
<li class="">Supports installing Go globals via <code>go install</code> commands. Can be customized with the
<a class="" href="https://moonrepo.dev/docs/config/toolchain#unstable_go"><code>unstable_go.bins</code></a> setting.</li>
<li class="">Automatically runs <code>go mod</code> or <code>go work</code> commands when installing dependencies.</li>
<li class="">Basic Docker image and pruning support.</li>
</ul>
<p>We hope you enjoy this new Go toolchain. With that said, we are <em>not</em> Go experts, and would love to
hear from you on what works, what doesn't, what can be improved, and what features you would like to
see added!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="new-mcp-tools">New MCP tools<a href="https://moonrepo.dev/blog/moon-v1.38#new-mcp-tools" class="hash-link" aria-label="Direct link to New MCP tools" title="Direct link to New MCP tools" translate="no">​</a></h2>
<p>In our last release, we introduced the <a class="" href="https://moonrepo.dev/blog/moon-v1.37#mcp-editor-integration"><code>moon mcp</code> command</a>,
offering deep editor integration with AI models like GitHub Copilot and Cursor. This release expands
on that by introducing 3 more tools to utilize:</p>
<ul>
<li class=""><code>get_touched_files</code> - Gets touched files between base and head revisions.</li>
<li class=""><code>sync_projects</code> - Runs the <code>SyncProject</code> action for one or many projects by <code>id</code>.</li>
<li class=""><code>sync_workspace</code> - Runs the <code>SyncWorkspace</code> action.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="new-os-terminal-notifications">New OS terminal notifications<a href="https://moonrepo.dev/blog/moon-v1.38#new-os-terminal-notifications" class="hash-link" aria-label="Direct link to New OS terminal notifications" title="Direct link to New OS terminal notifications" translate="no">​</a></h2>
<p>This was a feature we originally scoped out during moon's inception, almost 3 years ago, but we
never got around to implementing it. However, there has been some improvements to native operating
system notifications in Rust lately, so it felt like a good time to finally implement it!</p>
<p>And on that note, we are introducing a new
<a class="" href="https://moonrepo.dev/docs/config/workspace#terminalnotifications"><code>notifier.terminalNotifications</code></a> setting that allows
you to receive terminal notifications for pipeline events.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/workspace.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">notifier</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">terminalNotifications</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'failure'</span><br></span></code></pre></div></div>
<blockquote>
<p>View the <a class="" href="https://moonrepo.dev/docs/guides/notifications">official guide</a> for more information!</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other changes<a href="https://moonrepo.dev/blog/moon-v1.38#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<p>View the <a href="https://github.com/moonrepo/moon/releases/tag/v1.38.0" target="_blank" rel="noopener noreferrer" class="">official release</a> for a full list
of changes.</p>
<ul>
<li class="">Added new <code>moon toolchain</code> command and sub-commands.<!-- -->
<ul>
<li class="">Add a toolchain to <code>.moon/toolchain.yml</code> with <code>moon toolchain add</code>.</li>
<li class="">View information about a toolchain plugin with <code>moon toolchain info</code>.</li>
</ul>
</li>
<li class="">Added a <code>notifier.webhookAcknowledge</code> setting, that ensures webhooks resolve with a 2XX status
code.</li>
<li class="">Updated proto to <a href="https://github.com/moonrepo/proto/releases/tag/v0.50.0" target="_blank" rel="noopener noreferrer" class="">v0.50.1</a> (from 0.49.4).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="whats-next">What's next?<a href="https://moonrepo.dev/blog/moon-v1.38#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?" translate="no">​</a></h2>
<p>With toolchains plugins being stabilized more, we'd like to focus on some other areas.</p>
<ul>
<li class="">Better command line argument parsing/joining (especially for task <code>args</code>)</li>
<li class="">Better child process I/O piping</li>
<li class="">WASM toolchain documentation</li>
</ul>]]></content:encoded>
            <category>toolchain</category>
            <category>wasm</category>
            <category>plugin</category>
            <category>go</category>
            <category>mcp</category>
            <category>ai</category>
            <category>webhooks</category>
            <category>terminal</category>
            <category>notifications</category>
        </item>
        <item>
            <title><![CDATA[proto v0.50 - URL rewrites, on-init activation, preserved comments, and more]]></title>
            <link>https://moonrepo.dev/blog/proto-v0.50</link>
            <guid>https://moonrepo.dev/blog/proto-v0.50</guid>
            <pubDate>Wed, 11 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[In this release, we're landing a handful of quality of life improvements that have been requested by]]></description>
            <content:encoded><![CDATA[<p>In this release, we're landing a handful of quality of life improvements that have been requested by
the community.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="rewrite-urls-for-better-interoperability">Rewrite URLs for better interoperability<a href="https://moonrepo.dev/blog/proto-v0.50#rewrite-urls-for-better-interoperability" class="hash-link" aria-label="Direct link to Rewrite URLs for better interoperability" title="Direct link to Rewrite URLs for better interoperability" translate="no">​</a></h2>
<p>proto is heavily reliant on URLs, as they power everything from tool and plugin downloading to
version resolving. Many URLs are hard-coded into proto but most of them come from plugins. For the
most part this is fine, but if you work within a corporate environment, or have a firewall, you may
have to deal with proxy servers, mirrors, or other factors.</p>
<p>Until now, this was very difficult to circumvent, so we wanted to provide a built-in solution to
this problem, and as such, we're introducing the new
<a class="" href="https://moonrepo.dev/docs/proto/config#url-rewrites"><code>url-rewrites</code></a> configuration setting. This setting accepts a map
of regex patterns to replacements, and will rewrite URLs that match the pattern.</p>
<div class="language-toml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.prototools</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-toml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token punctuation" style="color:#cad4e2">[</span><span class="token table class-name" style="color:#ff94ff;font-weight:bold">settings.url-rewrites</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">"github.com/(\\w+)/(\\w+)"</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"gh-mirror.corp.com/$1/$2"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key property" style="color:#b7a9f9">"mo+n"</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">=</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"lunar"</span><br></span></code></pre></div></div>
<p>For example, in the configuration above, any URL that contains <code>github.com</code> will be replaced with
<code>gh-mirror.corp.com</code>, and any URL that contains the word "moon" (with different length o's) will be
replaced with "lunar". Learn more about URL rewriting in the settings documentation!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="activation-flow-now-triggers-immediately">Activation flow now triggers immediately<a href="https://moonrepo.dev/blog/proto-v0.50#activation-flow-now-triggers-immediately" class="hash-link" aria-label="Direct link to Activation flow now triggers immediately" title="Direct link to Activation flow now triggers immediately" translate="no">​</a></h2>
<p>Our <a class="" href="https://moonrepo.dev/docs/proto/workflows#shell-activation">activation flow</a> (shell hooks) is seeing more and more
usage, with improved stability, but based on feedback we've received, there was still some pain
points. One of these pain points was that activation would not trigger immediately (new terminal
window/tab), and would only trigger after changing directories.</p>
<p>There was a way around this using the <code>--on-init</code> flag, but that was not easily discoverable, and
the setup as a whole was not very intuitive. With this release, that flag has been deprecated and
the activation flow now triggers immediately, so you can start using your tools right away.</p>
<p>Historically we've been hesitent to do this, as we were worried about potential performance hits
when having to download WASM plugins, or refetch caches. However in practice this has not been an
issue.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="comments-are-now-preserved-in-prototools">Comments are now preserved in <code>.prototools</code><a href="https://moonrepo.dev/blog/proto-v0.50#comments-are-now-preserved-in-prototools" class="hash-link" aria-label="Direct link to comments-are-now-preserved-in-prototools" title="Direct link to comments-are-now-preserved-in-prototools" translate="no">​</a></h2>
<p>This has been a long standing issue and a long requested feature, and it's finally here! Comments
are now preserved in <code>.prototools</code> files, and they'll no longer be removed when running <code>proto</code>
commands that modify these files (like <a class="" href="https://moonrepo.dev/docs/proto/commands/alias"><code>proto alias</code></a> or
<a class="" href="https://moonrepo.dev/docs/proto/commands/pin"><code>proto pin</code></a>).</p>
<p>Historically this has been a hard problem to solve, as Rust serde (serialization/deserialization
library) strips comments when deserializing (reading) the file. To solve this problem, we had to
avoid serde, and operate on an AST-like structure instead. Because of this, we lose type-safety and
there may be some edge cases not accounted for.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="plugin-commands-are-now-executed-within-a-shell">Plugin commands are now executed within a shell<a href="https://moonrepo.dev/blog/proto-v0.50#plugin-commands-are-now-executed-within-a-shell" class="hash-link" aria-label="Direct link to Plugin commands are now executed within a shell" title="Direct link to Plugin commands are now executed within a shell" translate="no">​</a></h2>
<p>When a plugin executes a command (child process) on the host system (your computer), it now executes
it within a shell, e.g. <code>bash -c "command"</code>. This change was made to ensure environment variables
(like <code>PATH</code>), aliases, and other shell features that you have configured are available to the
plugin.</p>
<p>By default the shell to use is detected from the parent host process, but you can override it with
the <code>PROTO_SHELL</code> environment variable. For example, to use <code>zsh</code> you can set:</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token assign-left variable" style="color:#fef9c3">PROTO_SHELL</span><span class="token operator" style="color:#b7a9f9">=</span><span class="token plain">zsh</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other changes<a href="https://moonrepo.dev/blog/proto-v0.50#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<p>View the <a href="https://github.com/moonrepo/proto/releases/tag/v0.50.0" target="_blank" rel="noopener noreferrer" class="">official release</a> for a full list
of changes.</p>
<ul>
<li class="">Added <code>--dir</code> and <code>--all</code> options to the <a class="" href="https://moonrepo.dev/docs/proto/commands/bin"><code>proto bin</code></a> command.</li>
<li class="">Added environment variable support to many non-tool related <code>.prototools</code> settings.</li>
<li class="">Updated <code>proto install &lt;tool&gt;</code> (without version) to install a version pinned in <code>.prototools</code>,
instead of the latest version.</li>
</ul>]]></content:encoded>
            <category>rewrite</category>
            <category>url</category>
            <category>activation</category>
            <category>comments</category>
            <category>config</category>
            <category>plugin</category>
            <category>shell</category>
        </item>
        <item>
            <title><![CDATA[moon v1.37 - Rust WASM toolchain and MCP support]]></title>
            <link>https://moonrepo.dev/blog/moon-v1.37</link>
            <guid>https://moonrepo.dev/blog/moon-v1.37</guid>
            <pubDate>Tue, 03 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[In this release, we're stoked to release another WASM toolchain plugin, and experimental MCP/AI]]></description>
            <content:encoded><![CDATA[<p>In this release, we're stoked to release another WASM toolchain plugin, and experimental MCP/AI
support!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="rfc-task-input-additions-and-enhancements">RFC: Task input additions and enhancements<a href="https://moonrepo.dev/blog/moon-v1.37#rfc-task-input-additions-and-enhancements" class="hash-link" aria-label="Direct link to RFC: Task input additions and enhancements" title="Direct link to RFC: Task input additions and enhancements" translate="no">​</a></h2>
<p>We're planning to improve task inputs and have written up an
<a href="https://github.com/moonrepo/moon/issues/1985" target="_blank" rel="noopener noreferrer" class="">RFC to discuss these changes</a>. We'd appreciate any
and all feedback!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="new-rust-toolchain-powered-by-wasm">New Rust toolchain powered by WASM<a href="https://moonrepo.dev/blog/moon-v1.37#new-rust-toolchain-powered-by-wasm" class="hash-link" aria-label="Direct link to New Rust toolchain powered by WASM" title="Direct link to New Rust toolchain powered by WASM" translate="no">​</a></h2>
<p>With <a class="" href="https://moonrepo.dev/blog/moon-v1.36">toolchain plugins</a> entering beta last release, it's only natural that we start
migrating the legacy toolchains into plugins. And with this release, the next one we've migrated is
the Rust toolchain! However, unlike the TypeScript toolchain, the new Rust toolchain is opt-in and
must be enabled. Simply rename <code>rust</code> to <code>unstable_rust</code> in <code>.moon/toolchain.yml</code>.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/toolchain.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">unstable_rust</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">version</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'1.87.0'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">components</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">'clippy'</span><span class="token punctuation" style="color:#cad4e2">,</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'rustfmt'</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">targets</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">'wasm32-wasip1'</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">syncToolchainConfig</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new-functionality">New functionality<a href="https://moonrepo.dev/blog/moon-v1.37#new-functionality" class="hash-link" aria-label="Direct link to New functionality" title="Direct link to New functionality" translate="no">​</a></h3>
<p>Although the new Rust toolchain is a one-to-one port, the WASM APIs provide far more flexibility and
functionality than before. For example, the follow improvements and enhancements have been made:</p>
<ul>
<li class="">The Cargo workspace can now exist at any folder depth and does not need to exist at the moon
workspace root. Additionally, because of this, we can now support multiple Cargo workspaces in the
same moon workspace.</li>
<li class="">Added a new <code>addMsrvConstraint</code> setting, which will sync the version as a constraint to
<code>Cargo.toml</code> under the <code>workspace.package.rust-version</code> or <code>package.rust-version</code> fields.</li>
<li class="">Improved the accuracy of implicit project dependencies (inferred from <code>Cargo.toml</code>).</li>
<li class="">Improved the parsing of manifest (<code>Cargo.toml</code>) and lock (<code>Cargo.lock</code>) files. This information is
then fed into the task hashing process.</li>
<li class="">Improved the Docker prune implementation by preserving all binaries (inferred from
<code>cargo metadata</code>) while deleting the <code>target</code> directory.</li>
<li class="">Any <code>cargo</code> or <code>rustup</code> commands are now hashed and cached, and will only re-run when parameters
change. Unlike the current toolchain, which always runs these commands.</li>
</ul>
<p>Quite a list of improvements, and this doesn't even include all the WASM / plugin improvements that
have been slowly introduced! Give this new toolchain a try, and let us know what you think!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="mcp-editor-integration">MCP editor integration<a href="https://moonrepo.dev/blog/moon-v1.37#mcp-editor-integration" class="hash-link" aria-label="Direct link to MCP editor integration" title="Direct link to MCP editor integration" translate="no">​</a></h2>
<p>AI is all the rage these days, and even more so lately with the introduction of
<a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer" class="">MCP</a> (model context protocol) and agentic workflows. MCP is a new
way for AI assistants to "understand" what's going on in your project without you having to explain
everything. It works by feeding structured information, like in the context of moon, projects,
tasks, and relationships, directly into AI models like GitHub Copilot or Cursor.</p>
<p>No more tedious explanations required! The AI can jump straight to helpful suggestions that actually
work in your codebase, saving you time, and making the whole experience much smoother, especially in
complex monorepos with lots of moving parts.</p>
<p>To support agentic workflows, we're introducing an experimental <a class="" href="https://moonrepo.dev/docs/commands/mcp"><code>moon mcp</code></a>
command, that starts an MCP server, and can be <a class="" href="https://moonrepo.dev/docs/guides/mcp">integrated into your editor</a>. For
example, VS Code:</p>
<div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.vscode/mcp.json</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token punctuation" style="color:#cad4e2">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token property" style="color:#b7a9f9">"servers"</span><span class="token operator" style="color:#b7a9f9">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token property" style="color:#b7a9f9">"moon"</span><span class="token operator" style="color:#b7a9f9">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token property" style="color:#b7a9f9">"type"</span><span class="token operator" style="color:#b7a9f9">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"stdio"</span><span class="token punctuation" style="color:#cad4e2">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token property" style="color:#b7a9f9">"command"</span><span class="token operator" style="color:#b7a9f9">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"moon"</span><span class="token punctuation" style="color:#cad4e2">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token property" style="color:#b7a9f9">"args"</span><span class="token operator" style="color:#b7a9f9">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">"mcp"</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token punctuation" style="color:#cad4e2">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token property" style="color:#b7a9f9">"env"</span><span class="token operator" style="color:#b7a9f9">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">        </span><span class="token property" style="color:#b7a9f9">"MOON_WORKSPACE_ROOT"</span><span class="token operator" style="color:#b7a9f9">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">"${workspaceFolder}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token punctuation" style="color:#cad4e2">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token punctuation" style="color:#cad4e2">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token punctuation" style="color:#cad4e2">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token punctuation" style="color:#cad4e2">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="supported-tools">Supported tools<a href="https://moonrepo.dev/blog/moon-v1.37#supported-tools" class="hash-link" aria-label="Direct link to Supported tools" title="Direct link to Supported tools" translate="no">​</a></h3>
<p>Our MCP server currently supports the following tools. We'll be adding more tools in the future, so
if you have any suggestions, please let us know!</p>
<ul>
<li class=""><code>get_project</code> - Get a project and its tasks by <code>id</code>.</li>
<li class=""><code>get_projects</code> - Get all projects.</li>
<li class=""><code>get_task</code> - Get a task by <code>target</code>.</li>
<li class=""><code>get_tasks</code> - Get all tasks.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other changes<a href="https://moonrepo.dev/blog/moon-v1.37#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<p>View the <a href="https://github.com/moonrepo/moon/releases/tag/v1.37.0" target="_blank" rel="noopener noreferrer" class="">official release</a> for a full list
of changes.</p>
<ul>
<li class="">Added <code>environment.initializing</code> and <code>environment.initialized</code> webhook events.</li>
<li class="">Added <code>root</code> and <code>toolchain</code> fields to <code>dependencies.installing</code> and <code>dependencies.installed</code>
webhook events.</li>
<li class="">Updated proto to <a href="https://github.com/moonrepo/proto/releases/tag/v0.49.4" target="_blank" rel="noopener noreferrer" class="">v0.49.4</a> (from 0.49.1).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="whats-next">What's next?<a href="https://moonrepo.dev/blog/moon-v1.37#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?" translate="no">​</a></h2>
<p>With toolchains plugins being stabilized more, we'd like to focus on some other areas.</p>
<ul>
<li class="">Better command line argument parsing/joining (especially for task <code>args</code>)</li>
<li class="">Better child process I/O piping</li>
<li class="">Terminal notifications</li>
<li class="">WASM toolchain documentation</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="looking-for-toolchain-contributors">Looking for toolchain contributors!<a href="https://moonrepo.dev/blog/moon-v1.37#looking-for-toolchain-contributors" class="hash-link" aria-label="Direct link to Looking for toolchain contributors!" title="Direct link to Looking for toolchain contributors!" translate="no">​</a></h3>
<p>Now that the Rust toolchain has been ported to WASM, we'd like to start porting the other
toolchains, starting with Go and JavaScript (not Bun or Node.js), and also investigate supporting
toolchains for entirely new languages, like PHP and Ruby! If you're interested in contributing these
toolchains, please ping us in Discord!</p>
<p>The only requirements is that these toolchains must be written in Rust and must exist in the
<a href="https://github.com/moonrepo/plugins" target="_blank" rel="noopener noreferrer" class="">moonrepo/plugins</a> repository!</p>]]></content:encoded>
            <category>toolchain</category>
            <category>wasm</category>
            <category>plugin</category>
            <category>rust</category>
            <category>mcp</category>
            <category>ai</category>
        </item>
        <item>
            <title><![CDATA[moon v1.36 - Toolchain plugins beta, optimized remote caching, and codegen improvements]]></title>
            <link>https://moonrepo.dev/blog/moon-v1.36</link>
            <guid>https://moonrepo.dev/blog/moon-v1.36</guid>
            <pubDate>Sun, 18 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[In this release, we're very excited to fully release toolchain plugins!]]></description>
            <content:encoded><![CDATA[<p>In this release, we're very excited to fully release toolchain plugins!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="beta-release-of-toolchain-wasm-plugins">Beta release of toolchain WASM plugins<a href="https://moonrepo.dev/blog/moon-v1.36#beta-release-of-toolchain-wasm-plugins" class="hash-link" aria-label="Direct link to Beta release of toolchain WASM plugins" title="Direct link to Beta release of toolchain WASM plugins" translate="no">​</a></h2>
<p>Two months ago we announced <a class="" href="https://moonrepo.dev/blog/moon-v1.33">alpha toolchain plugins</a> with support for tier 3, but not
tier 2. The reason for this was that tier 3 is powered by <a class="" href="https://moonrepo.dev/docs/proto/wasm-plugin">proto APIs</a>,
which already existed! We simply hooked them up to moon. The bulk of the remaining plugin work was
tier 2 support, which we are excited to announce has been completed! The following APIs have been
implemented:</p>
<ul>
<li class=""><code>extend_project_graph</code> - Extend projects with toolchain specific info.</li>
<li class=""><code>extend_task_command</code> - Extend the command child process with parameters.</li>
<li class=""><code>extend_task_script</code> - Extend the script child process with parameters.</li>
<li class=""><code>locate_dependencies_root</code> - Locate the package dependencies workspace root.</li>
<li class=""><code>parse_manifest</code> - Parse a manifest file to extract dependencies.</li>
<li class=""><code>parse_lock</code> - Parse a lock file to extract resolved dependencies.</li>
</ul>
<p>And the following surface areas have been integrated with:</p>
<ul>
<li class="">In the project graph:<!-- -->
<ul>
<li class="">Extend projects with dependencies, tasks, and an alias.</li>
</ul>
</li>
<li class="">In the action pipeline:<!-- -->
<ul>
<li class="">Added <code>SetupEnvironment</code> action that executes the <code>setup_environment</code> API.</li>
<li class="">Added <code>InstallDependencies</code> action that executes the <code>install_dependencies</code> API.</li>
</ul>
</li>
<li class="">When running tasks:<!-- -->
<ul>
<li class="">Extend the command/script with additional parameters before executing.</li>
<li class="">Inject dependency and lock information into the hash.</li>
</ul>
</li>
<li class="">With Docker:<!-- -->
<ul>
<li class="">Updated <code>docker prune</code> to utilize the new WASM APIs for toolchain plugins.</li>
</ul>
</li>
</ul>
<p>As of this release, all 27 APIs have been implemented, and toolchain plugins are now available for
general use! However, they are still quite unstable, not fully tested, and the APIs may change
between releases, but you can start using them today if you're feeling adventurous!</p>
<p>With all this said, we do not have documentation yet. We plan to slowly work on this across the next
few releases. In the meantime, check out the following resources for more information:</p>
<ul>
<li class=""><a href="https://docs.rs/moon_pdk/" target="_blank" rel="noopener noreferrer" class=""><code>moon_pdk</code></a> - Rust plugin development kit.</li>
<li class="">Existing <a href="https://github.com/moonrepo/plugins/tree/master/toolchains" target="_blank" rel="noopener noreferrer" class="">toolchain plugins</a>.</li>
<li class="">In development <a href="https://github.com/moonrepo/plugins/pull/48" target="_blank" rel="noopener noreferrer" class="">Rust toolchain</a>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="optimized-remote-caching">Optimized remote caching<a href="https://moonrepo.dev/blog/moon-v1.36#optimized-remote-caching" class="hash-link" aria-label="Direct link to Optimized remote caching" title="Direct link to Optimized remote caching" translate="no">​</a></h2>
<p>Like the past few releases, we've made some improvements to the remote caching layer.</p>
<p>To start, we're adding a new
<a class="" href="https://moonrepo.dev/docs/config/workspace#verifyintegrity"><code>unstable_remote.cache.verifyIntegrity</code></a> setting, that will
verify the digest (hash) of downloaded blobs to ensure they aren't corrupted or incomplete. We
currently check the file size, but this will also now check the content. This setting will slightly
degrade performance but ensure reliability.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/workspace.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">unstable_remote</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">cache</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">verifyIntegrity</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><br></span></code></pre></div></div>
<p>While we're on the topic of reliability, we're also introducing an implicit rollback mechanic that
will remove partially downloaded or incomplete blobs if hydration ever fails at some point. This
will also run between executions to ensure there are no stale artifacts lying around.</p>
<p>And lastly, we've parallelized the blob existence checks, reducing the amount of large requests for
heavy tasks, and reworked how we inherit <code>MOON_REMOTE_*</code> environment variables.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="improved-code-generation">Improved code generation<a href="https://moonrepo.dev/blog/moon-v1.36#improved-code-generation" class="hash-link" aria-label="Direct link to Improved code generation" title="Direct link to Improved code generation" translate="no">​</a></h2>
<p>It's been a while since we've added new features to code generation, but thanks to some great
requests from the community, we have 2 this release!</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="archive-urls">Archive URLs<a href="https://moonrepo.dev/blog/moon-v1.36#archive-urls" class="hash-link" aria-label="Direct link to Archive URLs" title="Direct link to Archive URLs" translate="no">​</a></h3>
<p>The first is that <a class="" href="https://moonrepo.dev/docs/guides/codegen#archive-urls">remote archives</a> (zip, tar, etc) can be used
as template locations. The archive will then be downloaded and unpacked into <code>~/.moon/templates</code>.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/workspace.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">generator</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">templates</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token punctuation" style="color:#cad4e2">-</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'https://domain.com/some/path/to/archive.zip'</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="array-and-object-types">Array and object types<a href="https://moonrepo.dev/blog/moon-v1.36#array-and-object-types" class="hash-link" aria-label="Direct link to Array and object types" title="Direct link to Array and object types" translate="no">​</a></h3>
<p>The second is that we now support <code>array</code> and <code>object</code>
<a class="" href="https://moonrepo.dev/docs/config/template#variables">variable types</a> in <code>template.yml</code>. The values within each of these
collections can be any JSON-compatible type.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">template.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">variables</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">type</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">type</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'array'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">prompt</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'Type?'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">default</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">'app'</span><span class="token punctuation" style="color:#cad4e2">,</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'lib'</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">type</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'object'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">prompt</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'Metadata?'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">default</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token key atrule">internal</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><br></span></code></pre></div></div>
<p>These variables and their nested values can then be accessed within templates using dot or bracket
notation.</p>
<div class="language-twig codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-twig codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token delimiter punctuation" style="color:#cad4e2">{{</span><span class="token plain"> type</span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token number" style="color:#94dded">0</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">}</span><span class="token punctuation" style="color:#cad4e2">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token punctuation" style="color:#cad4e2">{</span><span class="token punctuation" style="color:#cad4e2">{</span><span class="token plain"> metadata</span><span class="token punctuation" style="color:#cad4e2">.</span><span class="token plain">internal </span><span class="token delimiter punctuation" style="color:#cad4e2">}}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other changes<a href="https://moonrepo.dev/blog/moon-v1.36#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<p>View the <a href="https://github.com/moonrepo/moon/releases/tag/v1.36.0" target="_blank" rel="noopener noreferrer" class="">official release</a> for a full list
of changes.</p>
<ul>
<li class="">Added <code>--host</code> and <code>--port</code> options to <code>moon action-graph</code>, <code>moon task-graph</code>, and
<code>moon project-graph</code>.</li>
<li class="">Added <code>--stdin</code> option to <code>moon ci</code> and <code>moon run</code>, which will allow touched files to be passed
via stdin, instead of running VCS commands to determine them.</li>
<li class="">Removed the restriction around <code>moon.{yml,pkl}</code> not being allowed as a task input. However, will
not be included when using <code>**/*</code>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="whats-next">What's next?<a href="https://moonrepo.dev/blog/moon-v1.36#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?" translate="no">​</a></h2>
<p>Now that toolchain plugins are in beta, we can take the next step in migrating an existing platform
into a toolchain.</p>
<ul>
<li class="">Migrate the Rust toolchain to a WASM plugin.</li>
</ul>]]></content:encoded>
            <category>toolchain</category>
            <category>wasm</category>
            <category>plugin</category>
            <category>remote</category>
            <category>cache</category>
            <category>integrity</category>
            <category>codegen</category>
            <category>template</category>
        </item>
        <item>
            <title><![CDATA[moon v1.35 - Action graph improvements, task priorities, and more!]]></title>
            <link>https://moonrepo.dev/blog/moon-v1.35</link>
            <guid>https://moonrepo.dev/blog/moon-v1.35</guid>
            <pubDate>Wed, 16 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[With this release, we're taking yet another step to supporting plugins.]]></description>
            <content:encoded><![CDATA[<p>With this release, we're taking yet another step to supporting plugins.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="improved-action-graph">Improved action graph<a href="https://moonrepo.dev/blog/moon-v1.35#improved-action-graph" class="hash-link" aria-label="Direct link to Improved action graph" title="Direct link to Improved action graph" translate="no">​</a></h2>
<p>For this release we wanted to introduce a new WASM based Rust toolchain, but we encountered a few
blockers while integrating with the action graph, so instead of working on the toolchain, we decided
to rewrite the action graph to properly support plugins.</p>
<p>The biggest blocker was around locating the toolchain's dependency root, and in Rust's case, the
Cargo workspace (where <code>Cargo.lock</code> is located). We technically have some of this logic in the
current Rust platform, but it always assumed that the Cargo workspace was in the root of the moon
workspace (the same applies to Bun and Node). This heavily restricted all moon users. With the new
plugin system, the dependency root can be located anywhere in the moon workspace, and we'll attempt
to locate it!</p>
<p>While rewriting the action graph, we made a ton of improvements (some won't be noticeable until
plugins are more prevalent). To start the graph is now async compatible, and in the future, we'll
update it to also support concurrency, so that the graph can be built in parallel across threads.
Additionally, a main focus was reducing the amount of edges (relationships) being created between
nodes (actions). And lastly, the following changes were made for the actions themselves.</p>
<ul>
<li class="">Added a new <code>InstallDependencies</code> action for WASM plugins.<!-- -->
<ul>
<li class="">The dependencies root is now dynamically located by traversing the file system, unlike the
previous implementation that assumed everything was in the workspace root.</li>
</ul>
</li>
<li class="">Added a new <code>SetupEnvironment</code> action for WASM plugins.<!-- -->
<ul>
<li class="">This runs after <code>SetupToolchain</code> but before <code>InstallDependencies</code>.</li>
<li class="">Can be used to setup the workspace or project environment. For example, initializing Python
venv, or making manifest/lockfile changes.</li>
</ul>
</li>
<li class="">Updated <code>RunTask</code> to setup toolchains and install dependencies for each <code>toolchain</code> that has been
configured, instead of just the 1st one (work in progress).</li>
<li class="">Updated <code>SyncProject</code> to no longer depend on <code>SetupToolchain</code>, and not be grouped by
language/toolchain, and instead encompass all of them applicable to the project.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="task-priorities">Task priorities<a href="https://moonrepo.dev/blog/moon-v1.35#task-priorities" class="hash-link" aria-label="Direct link to Task priorities" title="Direct link to Task priorities" translate="no">​</a></h2>
<p>Based on a request from the community that we really liked, we're introducing a new concept called
task priorities. Each task can configure a priority level using the new task option
<a class="" href="https://moonrepo.dev/docs/config/project#priority"><code>priority</code></a>, and the priority level determines the position of the
task within the action pipeline queue. A task with a higher priority will run sooner rather than
later, while still respecting the topological order.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">app/moon.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">tasks</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">build</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token comment" style="color:#97a1af;font-style:italic"># ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">options</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#e5e9f1"><span class="token plain">      </span><span class="token key atrule">priority</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'high'</span><br></span></code></pre></div></div>
<p>There are a few things to be aware of with this implementation:</p>
<ul>
<li class="">All non-task related actions (like setup toolchain) will still always run first.</li>
<li class="">Higher priority tasks that depend on lower priority tasks will effectively mark them as high
priority, as we attempt to complete them sooner.</li>
<li class="">The order within each priority level is sorted topological, but is still non-deterministic if
tasks run in parallel.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="enabled-experiments">Enabled experiments<a href="https://moonrepo.dev/blog/moon-v1.35#enabled-experiments" class="hash-link" aria-label="Direct link to Enabled experiments" title="Direct link to Enabled experiments" translate="no">​</a></h2>
<p>In our last release, we introduced <a class="" href="https://moonrepo.dev/blog/moon-v1.34#new-experiments">2 new experiments</a>,
<code>fasterGlobWalk</code> and <code>gitV2</code>. In the past few weeks, we've had many users (including ourself) enable
these experiments without issue. As such, we've decided to enable them by default in this release.</p>
<p>If you encounter an issue with either of these experiments, you can disable them in
<code>.moon/workspace.yml</code>. And of course, please report it so we can fix it!</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/workspace.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">experiments</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">fasterGlobWalk</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">gitV2</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">false</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="light-terminal-theme">Light terminal theme<a href="https://moonrepo.dev/blog/moon-v1.35#light-terminal-theme" class="hash-link" aria-label="Direct link to Light terminal theme" title="Direct link to Light terminal theme" translate="no">​</a></h2>
<p>By default, moon assumes a dark themed terminal is being used, and will output our branded colors
accordingly. However, if you use a light theme, these colors are hard to read, and there's no way to
change them.</p>
<p>To mitigate this, we're introducing a light based terminal theme, which can be enabled with the
<code>--theme</code> global option, or the <code>MOON_THEME</code> environment variable.</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moon run app:build </span><span class="token parameter variable" style="color:#fef9c3">--theme</span><span class="token plain"> light</span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token comment" style="color:#97a1af;font-style:italic"># Or</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ </span><span class="token assign-left variable" style="color:#fef9c3">MOON_THEME</span><span class="token operator" style="color:#b7a9f9">=</span><span class="token plain">light moon run app:build</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other changes<a href="https://moonrepo.dev/blog/moon-v1.35#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<p>View the <a href="https://github.com/moonrepo/moon/releases/tag/v1.35.0" target="_blank" rel="noopener noreferrer" class="">official release</a> for a full list
of changes.</p>
<ul>
<li class="">Added a new task option, <code>cacheKey</code>, which can be used to seed the hash, and invalidate local and
remote caches.</li>
<li class="">Added a <code>--log=verbose</code> level, which includes span information on top of the trace level.</li>
<li class="">Added 2 new webhooks, <code>toolchain.installing</code> and <code>toolchain.installed</code>, which emit when a
toolchain WASM plugin is installing a tool (via proto).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="whats-next">What's next?<a href="https://moonrepo.dev/blog/moon-v1.35#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?" translate="no">​</a></h2>
<p>Now that are action graph supports plugins, we can take the next step in migrating an existing
platform into a toolchain.</p>
<ul>
<li class="">Migrate the Rust toolchain to a WASM plugin.</li>
<li class="">Investigate a new args/command line parser.</li>
<li class="">Add Poetry support for the Python toolchain.</li>
</ul>]]></content:encoded>
            <category>action</category>
            <category>graph</category>
            <category>task</category>
            <category>priority</category>
            <category>experiment</category>
            <category>terminal</category>
            <category>theme</category>
        </item>
        <item>
            <title><![CDATA[moon v1.34 - Action customization, faster globs, better Git, and more!]]></title>
            <link>https://moonrepo.dev/blog/moon-v1.34</link>
            <guid>https://moonrepo.dev/blog/moon-v1.34</guid>
            <pubDate>Mon, 31 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[With this release, we're introducing a handful of performance and customization improvements!]]></description>
            <content:encoded><![CDATA[<p>With this release, we're introducing a handful of performance and customization improvements!</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="moonbase-has-been-sunset">moonbase has been sunset<a href="https://moonrepo.dev/blog/moon-v1.34#moonbase-has-been-sunset" class="hash-link" aria-label="Direct link to moonbase has been sunset" title="Direct link to moonbase has been sunset" translate="no">​</a></h2>
<p>As mentioned in previous releases, we have sunset <a class="" href="https://moonrepo.dev/moonbase">moonbase</a>, our remote caching service.
A while back we had internal discussions on whether to rework moonbase so that it could be
self-hosted (on-premises), or adopt the
<a href="https://github.com/bazelbuild/remote-apis" target="_blank" rel="noopener noreferrer" class="">Bazel Remote Execution API</a> and utilize what the open
source community has to offer. We ultimately decided with the latter, as it frees up resources on
our end to focus on moon and proto, and also provides a better path forward for moon adoption.</p>
<p>If you are currently using moonbase, we suggest migrating to our new
<a class="" href="https://moonrepo.dev/docs/guides/remote-cache">remote caching options</a>. And if you have an active moonbase
subscription, it will be cancelled within the week, and any partial billing for this month will be
prorated.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="customize-actions-in-the-pipeline">Customize actions in the pipeline<a href="https://moonrepo.dev/blog/moon-v1.34#customize-actions-in-the-pipeline" class="hash-link" aria-label="Direct link to Customize actions in the pipeline" title="Direct link to Customize actions in the pipeline" translate="no">​</a></h2>
<p>When a task is ran in moon, we create an <a class="" href="https://moonrepo.dev/docs/how-it-works/action-graph">action graph</a> (not a task
graph) of actions, which are operations required to run to ensure a successful execution. This
includes non-task related functionality, like project and workspace syncing, installing
dependencies, and ensuring the toolchain has been setup. While these actions only take milliseconds
to execute (on a cache hit), they can become quite a barrier and source of friction (on cache miss).</p>
<p>Until now, there wasn't anyway to disable/skip these extra actions -- besides some non-documented
environment variables that didn't actually omit the actions (they were still in the graph), but
simply skipped the inner execution. In this release, we're introducing 4 new settings for
<a class="" href="https://moonrepo.dev/docs/config/workspace#pipeline"><code>pipeline</code></a> (formerly <code>runner</code>) in
<a class="" href="https://moonrepo.dev/docs/config/workspace"><code>.moon/workspace.yml</code></a>.</p>
<ul>
<li class=""><code>installDependencies</code> setting toggles the inclusion of the <code>InstallWorkspaceDeps</code> and
<code>InstallProjectDeps</code> actions, and can be scoped to toolchain IDs.</li>
<li class=""><code>syncProjects</code> setting toggles the inclusion of the <code>SyncProject</code> actions, and can be scoped to
project IDs.</li>
<li class=""><code>syncProjectDependencies</code> setting toggles whether to recursively create <code>SyncProject</code> actions for
each dependency of a project, or just for itself.</li>
<li class=""><code>syncWorkspace</code> setting toggles the inclusion of the root <code>SyncWorkspace</code> action.</li>
</ul>
<p>For example, if you want to disable all of these actions entirely, you can do this:</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/workspace.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">pipeline</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">installDependencies</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">syncProjects</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">syncProjectDependencies</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">syncWorkspace</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">false</span><br></span></code></pre></div></div>
<p>And as mentioned above, the <code>installDependencies</code> and <code>syncProjects</code> settings support configuring a
list of IDs, which acts as an allow list. Any IDs not listed here will not create actions.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/workspace.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">pipeline</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token comment" style="color:#97a1af;font-style:italic"># Only install Node.js dependencies</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">installDependencies</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">'node'</span><span class="token punctuation" style="color:#cad4e2">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token comment" style="color:#97a1af;font-style:italic"># Only sync the `app` project</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">syncProjects</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#cad4e2">[</span><span class="token string" style="color:#c9e166">'app'</span><span class="token punctuation" style="color:#cad4e2">]</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>Even if you disable actions with the <code>pipeline</code> setting, the <a class="" href="https://moonrepo.dev/docs/commands/sync"><code>moon sync</code></a>
commands can still be used to run sync operations, as they ignore that setting. This provides a
solution where you want to avoid the overhead when running a task, but still take advantage of
moon's syncing to ensure a healthy repository state.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="new---no-actions-flag">New <code>--no-actions</code> flag<a href="https://moonrepo.dev/blog/moon-v1.34#new---no-actions-flag" class="hash-link" aria-label="Direct link to new---no-actions-flag" title="Direct link to new---no-actions-flag" translate="no">​</a></h3>
<p>To expand upon the above, we're introducing a <code>--no-actions</code> flag to
<a class="" href="https://moonrepo.dev/docs/commands/run"><code>moon run</code></a>, that will run the task without the other actions being added to
the graph. We suggest only using this flag once dependencies have been installed, and the toolchain
has been setup!</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moon run app:start --no-actions</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="new-experiments">New experiments<a href="https://moonrepo.dev/blog/moon-v1.34#new-experiments" class="hash-link" aria-label="Direct link to New experiments" title="Direct link to New experiments" translate="no">​</a></h2>
<p>It's been a while since we've added new experiments, and in this release, we've got 2! We encourage
everyone to enable these experiments to ensure they are working correctly, but do note that these
are a work in progress and may be buggy.</p>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="faster-glob-walking">Faster glob walking<a href="https://moonrepo.dev/blog/moon-v1.34#faster-glob-walking" class="hash-link" aria-label="Direct link to Faster glob walking" title="Direct link to Faster glob walking" translate="no">​</a></h3>
<p>We've been monitoring glob performance for sometime now, as walking the filesystem has been one of
the largest bottlenecks, especially in large codebases. We felt it was about time to tackle the
problem.</p>
<p>With this new implementation, we are doing a few things to increase performance. To start, we are
parallelizing walking per directory, where previously this would happen serially. Next, we partition
globs based on a common ancestor directory, which reduces the amount of unnecessary walking. And
lastly, we cache common globs to avoid walking all together.</p>
<p>In our benchmarks and tests (moon itself is already using it), we are seeing performance increases
by 1.5-2x! To start using this new glob implementation, enable the new <code>fasterGlobWalk</code> experiment.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/workspace.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">experiments</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">fasterGlobWalk</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="better-git-integration">Better Git integration<a href="https://moonrepo.dev/blog/moon-v1.34#better-git-integration" class="hash-link" aria-label="Direct link to Better Git integration" title="Direct link to Better Git integration" translate="no">​</a></h3>
<p>Our current Git integration works, assuming you're not doing anything complex, like using submodules
or worktrees. If you are using the latter, things have been buggy. We're not happy about this, as we
want to support all the different ways a repository can be architected.</p>
<p>So we started over from scratch! We even created
<a href="https://github.com/moonrepo/git-test" target="_blank" rel="noopener noreferrer" class="">real repositories</a> to ensure our understanding and
implementation of these features is accurate. This new implementation achieves the following:</p>
<ul>
<li class="">Supports submodules, subtrees, and worktees (unique among build systems).<!-- -->
<ul>
<li class="">Our competitors don't support these, and we expect them to "borrow" our implementation in the
future (like they have with other features).</li>
</ul>
</li>
<li class="">Git commands are parallelized when applicable.</li>
<li class="">Touched files within submodules are now properly extracted.</li>
<li class="">File discovery and hashing is more performant.</li>
</ul>
<p>If you'd like to try this new Git implementation (moon itself already is), enable the <code>gitV2</code>
experiment.</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/workspace.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">experiments</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">gitV2</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other changes<a href="https://moonrepo.dev/blog/moon-v1.34#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<p>View the <a href="https://github.com/moonrepo/moon/releases/tag/v1.34.0" target="_blank" rel="noopener noreferrer" class="">official release</a> for a full list
of changes.</p>
<ul>
<li class="">Added a <code>--json</code> flag to <code>moon templates</code>.</li>
<li class="">Integrated a new console rendering system with new terminal styles, prompts, and output.</li>
<li class="">Improved the performance of environment variable substitution.</li>
<li class="">Improved toolchain plugin loading to be on-demand.</li>
<li class="">Improved sync cache invalidation for codeowners, config schemas, and VCS hooks.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="whats-next">What's next?<a href="https://moonrepo.dev/blog/moon-v1.34#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?" translate="no">​</a></h2>
<p>Going forward, we plan to release new updates on a bi-weekly schedule, instead of a monthly
schedule. This will result in less features each release, but will reduce the burden and complexity
of large releases. With that said, this is what we have tentatively planned for the next release!</p>
<ul>
<li class="">Migrate the Rust toolchain to a WASM plugin.</li>
<li class="">Investigate a new args/command line parser.</li>
<li class="">Add Poetry support for the Python toolchain.</li>
</ul>]]></content:encoded>
            <category>moonbase</category>
            <category>remote</category>
            <category>cache</category>
            <category>action</category>
            <category>pipeline</category>
            <category>glob</category>
            <category>git</category>
            <category>experiment</category>
        </item>
        <item>
            <title><![CDATA[moonbase has been sunset]]></title>
            <link>https://moonrepo.dev/blog/moonbase-sunset</link>
            <guid>https://moonrepo.dev/blog/moonbase-sunset</guid>
            <pubDate>Mon, 31 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[As mentioned in previous moon releases and announcements, we have sunset moonbase, our]]></description>
            <content:encoded><![CDATA[<p>As mentioned in previous moon releases and announcements, we have sunset <a class="" href="https://moonrepo.dev/moonbase">moonbase</a>, our
remote caching service.</p>
<p>A while back we had internal discussions on whether to rework moonbase so that it could be
self-hosted (on-premises), or adopt the
<a href="https://github.com/bazelbuild/remote-apis" target="_blank" rel="noopener noreferrer" class="">Bazel Remote Execution API</a> and utilize what the open
source community has to offer. We ultimately decided with the latter, as it frees up resources on
our end to focus on moon and proto, and also provides a better path forward for moon adoption.</p>
<p>If you are currently using moonbase, we suggest migrating to our new
<a class="" href="https://moonrepo.dev/docs/guides/remote-cache">remote caching options</a>. And if you have an active moonbase
subscription, it will be cancelled within the week, and any partial billing for this month will be
prorated.</p>
<p>With that said, we have some ideas brewing on how to bring this back in another form. Perhaps our
own implementation of the Bazel Remote Execution API that can be self-hosted and deeply integrate
with moon.</p>]]></content:encoded>
            <category>moonbase</category>
            <category>remote</category>
            <category>cache</category>
        </item>
        <item>
            <title><![CDATA[moon v1.33 - Alpha support for toolchain WASM plugins]]></title>
            <link>https://moonrepo.dev/blog/moon-v1.33</link>
            <guid>https://moonrepo.dev/blog/moon-v1.33</guid>
            <pubDate>Thu, 13 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[With this release, we're stoked to provide an initial release for plugin support.]]></description>
            <content:encoded><![CDATA[<p>With this release, we're stoked to provide an initial release for plugin support.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="alpha-release-of-toolchain-wasm-plugins">Alpha release of toolchain WASM plugins<a href="https://moonrepo.dev/blog/moon-v1.33#alpha-release-of-toolchain-wasm-plugins" class="hash-link" aria-label="Direct link to Alpha release of toolchain WASM plugins" title="Direct link to Alpha release of toolchain WASM plugins" translate="no">​</a></h2>
<p>For over a <a class="" href="https://moonrepo.dev/blog/2024-roadmap#plugin-based-architecture">year now</a>, we've talked about supporting
WASM-based toolchain plugins... but what's taking so long? Migrating from a "hard-coded in core"
approach to a dynamic plugin approach was actually quite difficult, especially in Rust. It took us
way longer than we expected.</p>
<p>With that said, we're excited to announce alpha support for WASM-based toolchain plugins. In this
release, we have a working solution, but with partial support for the toolchain's
<a class="" href="https://moonrepo.dev/docs/how-it-works/languages#tier-structure-and-responsibilities">tiered features</a>. At this point
in time, we provide full support for tier 0, major support for tier 1 excluding lockfile/manifest
parsing, minor support for tier 2, no support for tier 3 (but will use
<a class="" href="https://moonrepo.dev/docs/proto/wasm-plugin">proto's APIs</a>), and support for non-tiered features, like
<a class="" href="https://moonrepo.dev/docs/commands/init"><code>moon init</code></a> and <a class="" href="https://moonrepo.dev/docs/commands/docker"><code>moon docker</code></a>.</p>
<p>If you're curious, the following WASM function APIs are now available:</p>
<ul>
<li class=""><code>register_toolchain</code> - Registers the toolchain and provide metadata for detection and other
purposes.</li>
<li class=""><code>initialize_toolchain</code> - Provides prompts to use during <code>moon init</code> to gather settings values.</li>
<li class=""><code>define_toolchain_config</code> - Defines a configuration schema for use within JSON schemas.</li>
<li class=""><code>define_docker_metadata</code> - Defines metadata related to <code>docker</code> commands.</li>
<li class=""><code>hash_task_contents</code> - Injects content into the task hashing process.</li>
<li class=""><code>prune_docker</code> - Custom operations to run during <code>docker prune</code>.</li>
<li class=""><code>scaffold_docker</code> - Custom operations to run during <code>docker scaffold</code>.</li>
<li class=""><code>sync_project</code> - Runs syncing operations per project (during the <code>SyncProject</code> action).</li>
<li class=""><code>sync_workspace</code> - Runs syncing operations at the workspace root (during the <code>SyncWorkspace</code>
action).</li>
</ul>
<p>We know everyone is very excited about these plugins, so feel free to start using them today!
However, since we don't have full tiered support, most of the advanced functionality related to
running tasks is currently not supported (except for task hashing which is supported).</p>
<p>Additionally, we do <em>not</em> have documentation yet for these new APIs, but we do have the following
resources to help you get started:</p>
<ul>
<li class=""><a class="" href="https://moonrepo.dev/docs/guides/wasm-plugins">Getting started with WASM plugins</a></li>
<li class=""><a href="https://github.com/moonrepo/plugins/tree/master/toolchains" target="_blank" rel="noopener noreferrer" class="">Example toolchain WASM plugins</a></li>
<li class=""><a href="https://docs.rs/moon_pdk" target="_blank" rel="noopener noreferrer" class=""><code>moon_pdk</code> documentation</a> (functions, macros, etc)</li>
<li class=""><a href="https://docs.rs/moon_pdk_api" target="_blank" rel="noopener noreferrer" class=""><code>moon_pdk_api</code> documentation</a> (structs, enums, etc)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_tleR" id="typescript-toolchain">TypeScript toolchain<a href="https://moonrepo.dev/blog/moon-v1.33#typescript-toolchain" class="hash-link" aria-label="Direct link to TypeScript toolchain" title="Direct link to TypeScript toolchain" translate="no">​</a></h3>
<p>To verify that our WASM plugin implementation works correctly, we've
<a href="https://github.com/moonrepo/plugins/tree/master/toolchains/typescript" target="_blank" rel="noopener noreferrer" class="">migrated the TypeScript toolchain entirely to a WASM plugin</a>,
and it's no longer hard-coded in our Rust core! If you've configured
<a class="" href="https://moonrepo.dev/docs/config/toolchain#typescript"><code>typescript</code></a> in
<a class="" href="https://moonrepo.dev/docs/config/toolchain"><code>.moon/toolchain.yml</code></a>, then you'll automatically use the new plugin under
the hood.</p>
<p>This is our first step in supporting plugins in core. We chose TypeScript as our 1st plugin because
it was the simplest of all the toolchains, was primarily used for project syncing, and did not
require all tiered APIs.</p>
<p>With that said, most of the code had to be rewritten when porting, but we tried to keep as much
parity as possible. Please report an issues or differences you encounter. Additionally, because
TypeScript is now a "true" toolchain, it will appear in the toolchains list for projects and tasks.
This is required since it runs operations in the context of the plugin.</p>
<p>Because toolchain plugins are configured differently internally, and since TypeScript is now a
plugin, the configuration syntax for disabling the TypeScript toolchain at the project-level has
changed. While not a breaking change in this release, the old format will be removed in the future.</p>
<div class="language-yml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">moon.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token comment" style="color:#97a1af;font-style:italic"># Before</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key atrule">toolchain</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">typescript</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">    </span><span class="token key atrule">disable</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token comment" style="color:#97a1af;font-style:italic"># After</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain"></span><span class="token key atrule">toolchain</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#e5e9f1"><span class="token plain">  </span><span class="token key atrule">typescript</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#94dded">false</span><span class="token plain"> </span><span class="token comment" style="color:#97a1af;font-style:italic"># or null</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-warning admonition_WCGJ alert alert--warning"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_pbrs"><p>If you use the TypeScript toolchain, you'll need to update your configuration files or editor to
point to the newer <a href="https://moonrepo.dev/blog/moon-v1.33#dynamic-json-schemas" class="">JSON schemas</a>, otherwise your editor may error with
"Property typescript is not allowed".</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="experimental-moonx-executable">Experimental <code>moonx</code> executable<a href="https://moonrepo.dev/blog/moon-v1.33#experimental-moonx-executable" class="hash-link" aria-label="Direct link to experimental-moonx-executable" title="Direct link to experimental-moonx-executable" translate="no">​</a></h2>
<p>Based on a <a href="https://github.com/moonrepo/moon/issues/1828" target="_blank" rel="noopener noreferrer" class="">request from the community</a>, we're
introducing a new executable <code>moonx</code>, which is simply a shorthand for <code>moon run ...</code>. In the future
we will expand this with more "shorthand" functionality.</p>
<div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token plain">$ moonx app:build</span><br></span></code></pre></div></div>
<p>Because of our current release process, the <code>moonx</code> executable is <em>not</em> packaged in the release (on
GitHub), and is instead created the first time <code>moon</code> runs. Furthermore, <code>moonx</code> is not a binary
executable, and is instead a shim (a Bash script on Unix, and a PowerShell (<code>.ps1</code>) script on
Windows). In the future, this will become a true binary.</p>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="dynamic-json-schemas">Dynamic JSON schemas<a href="https://moonrepo.dev/blog/moon-v1.33#dynamic-json-schemas" class="hash-link" aria-label="Direct link to Dynamic JSON schemas" title="Direct link to Dynamic JSON schemas" translate="no">​</a></h2>
<p>With the initial support for toolchain plugins, the available configuration in
<a class="" href="https://moonrepo.dev/docs/config/toolchain"><code>.moon/toolchain.yml</code></a> and <a class="" href="https://moonrepo.dev/docs/config/project"><code>moon.yml</code></a> is no longer
static, and is instead dynamic based on the enabled/configured toolchains. Because of this, the JSON
schemas provided at <code>moonrepo.dev</code> and in the GitHub release are not accurate for some toolchain
related settings, but accurate for everything else.</p>
<p>This may lead to a poor developer experience where your editor shows errors for unknown settings. To
remedy this, we now generate dynamic schemas at <code>.moon/cache/schemas</code> with accurate settings. If
you're editor supports the <code>$schema</code> property, you can update them like so:</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">.moon/toolchain.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">$schema</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'./cache/schemas/toolchain.json'</span><br></span></code></pre></div></div>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-background-color:#00080f;--prism-color:#e5e9f1"><div class="codeBlockTitle_kY6l">app/moon.yml</div><div class="codeBlockContent_t_Hd"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="background-color:#00080f;color:#e5e9f1"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#e5e9f1"><span class="token key atrule">$schema</span><span class="token punctuation" style="color:#cad4e2">:</span><span class="token plain"> </span><span class="token string" style="color:#c9e166">'../.moon/cache/schemas/toolchain.json'</span><br></span></code></pre></div></div>
<p>The VS Code YAML server does not support the
<a href="https://github.com/redhat-developer/yaml-language-server/pull/970" target="_blank" rel="noopener noreferrer" class=""><code>$schema</code> property</a>, but there
is a
<a href="https://github.com/redhat-developer/yaml-language-server?tab=readme-ov-file#using-inlined-schema" target="_blank" rel="noopener noreferrer" class="">work around</a>.
However, that syntax is a bit unfortunate, so our official moon VS Code extension supports updating
<code>.vscode/settings</code>. Simply open the command palette and select "moon: Append YAML schemas
configuration to settings".</p>
<div class="theme-admonition theme-admonition-info admonition_WCGJ alert alert--info"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_pbrs"><p>These schemas are automatically generated through <a class="" href="https://moonrepo.dev/docs/commands/run"><code>moon run</code></a> but can be
manually generated with <a class="" href="https://moonrepo.dev/docs/commands/sync/config-schemas"><code>moon sync config-schemas</code></a>.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_tleR" id="other-changes">Other changes<a href="https://moonrepo.dev/blog/moon-v1.33#other-changes" class="hash-link" aria-label="Direct link to Other changes" title="Direct link to Other changes" translate="no">​</a></h2>
<p>View the <a href="https://github.com/moonrepo/moon/releases/tag/v1.33.0" target="_blank" rel="noopener noreferrer" class="">official release</a> for a full list
of changes.</p>
<ul>
<li class="">Added support for <code>moon run ~:build</code>, which will run the <code>build</code> task in the closest project
(traversing upwards).</li>
<li class="">Added <code>$XDG_DATA_HOME</code> support when detecting the moon store. Will be used if <code>$MOON_HOME</code> is not
set, and will fallback to <code>$HOME/.moon</code>.</li>
<li class="">Added elapsed/timing information to child processes and WASM calls within logs.</li>
<li class="">Improved the handling of CTRL-C, CTRL-BREAK, and other signals on Windows.</li>
<li class="">Updated <code>moon init</code> with toolchain plugin support.</li>
<li class="">Updated <code>toolchain.default</code> in <code>moon.yml</code> to support a list of IDs.</li>
<li class="">Updated file hashing (via <code>git hash-object</code>) to continously pipe stdin to avoid hanging processes.</li>
</ul>]]></content:encoded>
            <category>toolchain</category>
            <category>wasm</category>
            <category>plugin</category>
            <category>moonx</category>
            <category>schema</category>
        </item>
    </channel>
</rss>