helloadhavan/github_issues huggingface dataset:
Repository: denoland/deno
Pull request: fix: do not panic running remote cjs module

Instead error.

Closes https://github.com/denoland/deno/issues/26258

Changed files:
filename: cli/worker.rs
patch: @@ -552,7 +552,8 @@ impl CliMainWorkerFactory {
           .await?;
         self.shared.cjs_resolution_store.is_known_cjs(&main_module)
       } else {
-        specifier_has_extension(&main_module, "cjs")
+        main_module.scheme() == "file"
+          && specifier_has_extension(&main_module, "cjs")
       };
       (main_module, is_cjs)
     };

filename: tests/specs/run/remote_cjs_main/__test__.jsonc
patch: @@ -0,0 +1,5 @@
+{
+  "args": "run http://localhost:4545/run/add.cjs",
+  "output": "output.out",
+  "exitCode": 1
+}

filename: tests/specs/run/remote_cjs_main/output.out
patch: @@ -0,0 +1,3 @@
+Download http://localhost:4545/run/add.cjs
+error: Expected a JavaScript or TypeScript module, but identified a Cjs module. Importing these types of modules is currently not supported.
+  Specifier: http://localhost:4545/run/add.cjs

filename: tests/testdata/run/add.cjs
patch: @@ -0,0 +1,3 @@
+module.exports.add = function (a, b) {
+  return a + b;
+};
Repository: vercel/next.js
Pull request: [release] create empty changeset for next when no changeset found during canary release

### Why?

When there are no changesets for `next`, the canary release won't be published even if there are new commits. If this is the case, add an empty changeset for `next` to let the canary release proceed.

Note that this will result in an empty Changelog and GitHub Release, but this PR does not cover handling that part.

### Testing Plan

Set env `RELEASE_TYPE=canary` and run `ci:version` locally to see the result.

Changed files:
filename: scripts/release/version-packages.ts
patch: @@ -1,6 +1,26 @@
 import execa from 'execa'
-import { existsSync } from 'node:fs'
-import { join } from 'node:path'
+import { existsSync } from 'fs'
+import { writeFile, readFile, unlink } from 'fs/promises'
+import { join } from 'path'
+
+// NOTE: This type may change over time.
+type ChangesetStatusJson = {
+  changesets: {
+    releases: {
+      name: string
+      type: string
+      summary: string
+      id: string
+    }[]
+  }[]
+  releases: {
+    name: string
+    type: string
+    oldVersion: string
+    changesets: string[]
+    newVersion: string
+  }[]
+}
 
 async function versionPackages() {
   const preConfigPath = join(process.cwd(), '.changeset', 'pre.json')
@@ -23,13 +43,54 @@ async function versionPackages() {
     await execa('pnpm', ['changeset', 'pre', 'enter', 'canary'], {
       stdio: 'inherit',
     })
-    // TODO: Create empty changeset for `next` to bump canary version
-    // even if there is no changeset.
+
+    console.log(
+      '▲   Preparing to bump the canary version, checking if there are any changesets.'
+    )
+
+    // Create an empty changeset for `next` to bump the canary version
+    // even if there are no changesets for `next`.
+    await execa('pnpm', [
+      'changeset',
+      'status',
+      '--output',
+      './changeset-status.json',
+    ])
+
+    let hasNextChangeset = false
+    if (existsSync('./changeset-status.json')) {
+      const changesetStatus: ChangesetStatusJson = JSON.parse(
+        await readFile('./changeset-status.json', 'utf8')
+      )
+
+      console.log('▲   Changeset Status:')
+      console.log(changesetStatus)
+
+      hasNextChangeset =
+        changesetStatus.releases.find((release) => release.name === 'next') !==
+        undefined
+
+      await unlink('./changeset-status.json')
+    }
+
+    if (!hasNextChangeset) {
+      console.log(
+        '▲   No changesets found for `next`, creating an empty changeset.'
+      )
+      // TODO: Since this is temporary until we hard-require a changeset, we will
+      // need to remove this in the future to prevent publishing empty releases.
+      await writeFile(
+        join(process.cwd(), '.changeset', `next-canary-${Date.now()}.md`),
+        `---\n'next': patch\n---`
+      )
+    }
   }
 
   await execa('pnpm', ['changeset', 'version'], {
     stdio: 'inherit',
   })
+  // TODO: Update the pnpm-lock.yaml since the packages' depend on
+  // each other. Remove this once they use `workspace:` protocol.
   await execa('pnpm', ['install', '--no-frozen-lockfile'], {
     stdio: 'inherit',
   })
Repository: huggingface/transformers
Pull request: [mllama] fix loading and inference

# What does this PR do?

Fixes https://github.com/huggingface/transformers/issues/38220, it's a shame we couldn't see it earlier in CI. Probably because mllama isn't available in EU 🥲 

We should not repeat keys before calling attn, otherwise it is repeated twice. And remove `base_model_prefix` so the model can load old state dicts by manual remapping

Changed files:
filename: src/transformers/models/mllama/modeling_mllama.py
patch: @@ -486,8 +486,6 @@ def forward(
             value_states = self.v_proj(cross_attention_states)
             key_states = key_states.view(bsz, -1, self.num_key_value_heads, self.head_dim).transpose(1, 2)
             value_states = value_states.view(bsz, -1, self.num_key_value_heads, self.head_dim).transpose(1, 2)
-            key_states = repeat_kv(key_states, self.num_key_value_groups)
-            value_states = repeat_kv(value_states, self.num_key_value_groups)
 
             key_states = self.k_norm(key_states)
             if past_key_value is not None:
@@ -850,7 +848,7 @@ def forward(self, x, position_ids):
 @auto_docstring
 class MllamaPreTrainedModel(PreTrainedModel):
     config_class = MllamaConfig
-    base_model_prefix = "model"
+    base_model_prefix = ""
     supports_gradient_checkpointing = True
     _no_split_modules = [
         "MllamaVisionEncoderLayer",
Repository: ggml-org/llama.cpp
Pull request: llama-chat : fix multiple system messages for gemma, orion

Fix https://github.com/ggml-org/llama.cpp/issues/14151

---

Important: this won't work with jinja template, because jinja only allow 0 or 1 system message at the **beginning** of the conversation:

<img width="704" alt="image" src="https://github.com/user-attachments/assets/200b07f1-584c-4295-8366-f887199e6cac" />



Changed files:
filename: src/llama-chat.cpp
patch: @@ -333,7 +333,7 @@ int32_t llm_chat_apply_template(
             std::string role(message->role);
             if (role == "system") {
                 // there is no system message for gemma, but we will merge it with user prompt, so nothing is broken
-                system_prompt = trim(message->content);
+                system_prompt += trim(message->content);
                 continue;
             }
             // in gemma, "assistant" is "model"
@@ -355,7 +355,7 @@ int32_t llm_chat_apply_template(
             std::string role(message->role);
             if (role == "system") {
                 // there is no system message support, we will merge it with user prompt
-                system_prompt = message->content;
+                system_prompt += message->content;
                 continue;
             } else if (role == "user") {
                 ss << "Human: ";
Repository: denoland/deno
Pull request: perf(http): avoid clone getting request method and url

Code:

```js
Deno.serve({ port: 8085 }, request => {
  return new Response(request.url);
});
```

Before:

```
$ wrk -d60s http://localhost:8085
Running 1m test @ http://localhost:8085
  2 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    65.49us   36.05us   5.46ms   96.33%
    Req/Sec    75.71k     1.90k   79.44k    78.87%
  9053462 requests in 1.00m, 1.36GB read
Requests/sec: 150641.83
Transfer/sec:     23.13MB
```

After:

```
$ wrk -d60s http://localhost:8085
Running 1m test @ http://localhost:8085
  2 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    64.72us   38.14us   3.29ms   95.97%
    Req/Sec    76.66k     1.85k   80.17k    77.45%
  9168694 requests in 1.00m, 1.37GB read
Requests/sec: 152557.21
Transfer/sec:     23.42MB
```

Changed files:
filename: ext/http/fly_accept_encoding.rs
patch: @@ -119,7 +119,7 @@ fn encodings_iter_inner<'s>(
       };
       Some(Ok((encoding, qval)))
     })
-    .map(|r| r?) // flatten Result<Result<...
+    .flatten()
 }
 
 #[cfg(test)]

filename: ext/http/http_next.rs
patch: @@ -296,7 +296,7 @@ where
   let authority: v8::Local<v8::Value> = match request_properties.authority {
     Some(authority) => v8::String::new_from_utf8(
       scope,
-      authority.as_ref(),
+      authority.as_bytes(),
       v8::NewStringType::Normal,
     )
     .unwrap()

filename: ext/http/request_properties.rs
patch: @@ -34,8 +34,8 @@ pub struct HttpConnectionProperties {
   pub stream_type: NetworkStreamType,
 }
 
-pub struct HttpRequestProperties {
-  pub authority: Option<String>,
+pub struct HttpRequestProperties<'a> {
+  pub authority: Option<Cow<'a, str>>,
 }
 
 /// Pluggable trait to determine listen, connection and request properties
@@ -84,11 +84,11 @@ pub trait HttpPropertyExtractor {
   ) -> NetworkStream;
 
   /// Determines the request properties.
-  fn request_properties(
-    connection_properties: &HttpConnectionProperties,
-    uri: &Uri,
-    headers: &HeaderMap,
-  ) -> HttpRequestProperties;
+  fn request_properties<'a>(
+    connection_properties: &'a HttpConnectionProperties,
+    uri: &'a Uri,
+    headers: &'a HeaderMap,
+  ) -> HttpRequestProperties<'a>;
 }
 
 pub struct DefaultHttpPropertyExtractor {}
@@ -180,18 +180,17 @@ impl HttpPropertyExtractor for DefaultHttpPropertyExtractor {
     }
   }
 
-  fn request_properties(
-    connection_properties: &HttpConnectionProperties,
-    uri: &Uri,
-    headers: &HeaderMap,
-  ) -> HttpRequestProperties {
+  fn request_properties<'a>(
+    connection_properties: &'a HttpConnectionProperties,
+    uri: &'a Uri,
+    headers: &'a HeaderMap,
+  ) -> HttpRequestProperties<'a> {
     let authority = req_host(
       uri,
       headers,
       connection_properties.stream_type,
       connection_properties.local_port.unwrap_or_default(),
-    )
-    .map(|s| s.into_owned());
+    );
 
     HttpRequestProperties { authority }
   }
Repository: electron/electron
Pull request: fix: -Wunsafe-buffer-usage warnings when read()ing and write()ing integers (31-x-y)

Manual backport of #44185 to 31-x-y. See that PR for details.

Notes: none

Changed files:
filename: shell/browser/electron_browser_main_parts_posix.cc
patch: @@ -24,6 +24,18 @@ namespace electron {
 
 namespace {
 
+// write |ref|'s raw bytes to |fd|.
+template <typename T>
+void WriteValToFd(int fd, const T& ref) {
+  base::span<const uint8_t> bytes = base::byte_span_from_ref(ref);
+  while (!bytes.empty()) {
+    const ssize_t rv = HANDLE_EINTR(write(fd, bytes.data(), bytes.size()));
+    RAW_CHECK(rv >= 0);
+    const size_t n_bytes_written = rv >= 0 ? static_cast<size_t>(rv) : 0U;
+    bytes = bytes.subspan(n_bytes_written);
+  }
+}
+
 // See comment in |PreEarlyInitialization()|, where sigaction is called.
 void SIGCHLDHandler(int signal) {}
 
@@ -48,15 +60,7 @@ void GracefulShutdownHandler(int signal) {
   RAW_CHECK(g_pipe_pid == getpid());
   RAW_CHECK(g_shutdown_pipe_write_fd != -1);
   RAW_CHECK(g_shutdown_pipe_read_fd != -1);
-  size_t bytes_written = 0;
-  do {
-    int rv = HANDLE_EINTR(
-        write(g_shutdown_pipe_write_fd,
-              reinterpret_cast<const char*>(&signal) + bytes_written,
-              sizeof(signal) - bytes_written));
-    RAW_CHECK(rv >= 0);
-    bytes_written += rv;
-  } while (bytes_written < sizeof(signal));
+  WriteValToFd(g_shutdown_pipe_write_fd, signal);
 }
 
 // See comment in |PostCreateMainMessageLoop()|, where sigaction is called.
@@ -129,26 +133,33 @@ NOINLINE void ExitPosted() {
   sleep(UINT_MAX);
 }
 
-void ShutdownDetector::ThreadMain() {
-  base::PlatformThread::SetName("CrShutdownDetector");
-
-  int signal;
-  size_t bytes_read = 0;
-  do {
-    const ssize_t ret = HANDLE_EINTR(
-        read(shutdown_fd_, reinterpret_cast<char*>(&signal) + bytes_read,
-             sizeof(signal) - bytes_read));
-    if (ret < 0) {
+// read |sizeof(T)| raw bytes from |fd| and return the result
+template <typename T>
+[[nodiscard]] std::optional<T> ReadValFromFd(int fd) {
+  auto val = T{};
+  base::span<uint8_t> bytes = base::byte_span_from_ref(val);
+  while (!bytes.empty()) {
+    const ssize_t rv = HANDLE_EINTR(read(fd, bytes.data(), bytes.size()));
+    if (rv < 0) {
       NOTREACHED() << "Unexpected error: " << strerror(errno);
       ShutdownFDReadError();
-      break;
-    } else if (ret == 0) {
+      return {};
+    }
+    if (rv == 0) {
       NOTREACHED() << "Unexpected closure of shutdown pipe.";
       ShutdownFDClosedError();
-      break;
+      return {};
     }
-    bytes_read += ret;
-  } while (bytes_read < sizeof(signal));
+    const size_t n_bytes_read = static_cast<size_t>(rv);
+    bytes = bytes.subspan(n_bytes_read);
+  }
+  return val;
+}
+
+void ShutdownDetector::ThreadMain() {
+  base::PlatformThread::SetName("CrShutdownDetector");
+
+  const int signal = ReadValFromFd<int>(shutdown_fd_).value_or(0);
   VLOG(1) << "Handling shutdown for signal " << signal << ".";
 
   if (!task_runner_->PostTask(FROM_HERE,
Repository: ggml-org/llama.cpp
Pull request: sync : ggml


Changed files:
filename: scripts/sync-ggml.last
patch: @@ -1 +1 @@
-6a7d170c04789f6ebcf320ed03c1b16973f93bd7
+8cda0a3c19f2c7dc493887353c42f6956bc268b1
Repository: huggingface/transformers
Pull request: Fixing Bitnet after use_rms_norm introduction

# What does this PR do?

This pr simply fixes an issue related to using `_replace_with_bitnet_linear` outside of the quantizer in tests. It checks if `quantization_config` is not None before accessing `use_rms_norm`

Action : https://github.com/huggingface/transformers/actions/runs/15127726788/job/42523132728

Changed files:
filename: src/transformers/integrations/bitnet.py
patch: @@ -362,8 +362,8 @@ def _replace_with_bitnet_linear(
                             bias=module.bias is not None,
                             device=module.weight.device,
                             dtype=module.weight.dtype,
-                            use_rms_norm=quantization_config.use_rms_norm,
-                            rms_norm_eps=quantization_config.rms_norm_eps,
+                            use_rms_norm=quantization_config.use_rms_norm if quantization_config else False,
+                            rms_norm_eps=quantization_config.rms_norm_eps if quantization_config else 1e-6,
                         )
                         model._modules[name].requires_grad_(False)
                     has_been_replaced = True
Repository: electron/electron
Pull request: fix: -Wunsafe-buffer-usage warnings in GetNextZoomLevel()

#### Description of Change

Fixup to #43803 / e894839709406101c54a067b6e1848ff294f17a5 that actually fixes the warning.

Takeaway lesson: give the compiler enough information to know that the array indices are always in the array's valid range.

Warnings fixed by this PR:

```
2024-10-04T05:18:49.7736915Z ../../electron/shell/browser/ui/inspectable_web_contents.cc:132:46: error: unsafe pointer arithmetic [-Werror,-Wunsafe-buffer-usage]
2024-10-04T05:18:49.7737765Z   132 |       return blink::ZoomFactorToZoomLevel(*--iter);
2024-10-04T05:18:49.7738163Z       |                                              ^~~~
2024-10-04T05:18:49.7738801Z ../../electron/shell/browser/ui/inspectable_web_contents.cc:132:46: note: See //docs/unsafe_buffers.md for help.
2024-10-04T05:18:49.7739875Z ../../electron/shell/browser/ui/inspectable_web_contents.cc:133:19: error: unsafe pointer arithmetic [-Werror,-Wunsafe-buffer-usage]
2024-10-04T05:18:49.7740573Z   133 |     if (!out && ++iter != kEnd)
2024-10-04T05:18:49.7740875Z       |                   ^~~~
2024-10-04T05:18:49.7741546Z ../../electron/shell/browser/ui/inspectable_web_contents.cc:133:19: note: See //docs/unsafe_buffers.md for help.
2024-10-04T05:18:49.7742134Z 2 errors generated.
```

#### Checklist

- [x] PR description included and stakeholders cc'd
- [x] `npm test` passes
- [x] [PR release notes](https://github.com/electron/clerk/blob/main/README.md) describe the change in a way relevant to app developers, and are [capitalized, punctuated, and past tense](https://github.com/electron/clerk/blob/main/README.md#examples).

#### Release Notes

Notes: none

Changed files:
filename: shell/browser/ui/inspectable_web_contents.cc
patch: @@ -118,20 +118,20 @@ void SetZoomLevelForWebContents(content::WebContents* web_contents,
   content::HostZoomMap::SetZoomLevel(web_contents, level);
 }
 
-double GetNextZoomLevel(const double level, const bool out) {
+double GetNextZoomLevel(double level, bool out) {
   static constexpr std::array<double, 16U> kPresetFactors{
       0.25, 0.333, 0.5,  0.666, 0.75, 0.9, 1.0, 1.1,
       1.25, 1.5,   1.75, 2.0,   2.5,  3.0, 4.0, 5.0};
-  static constexpr auto kBegin = kPresetFactors.begin();
-  static constexpr auto kEnd = kPresetFactors.end();
+  static constexpr size_t size = std::size(kPresetFactors);
 
   const double factor = blink::ZoomLevelToZoomFactor(level);
-  auto matches = [=](auto val) { return blink::ZoomValuesEqual(factor, val); };
-  if (auto iter = std::find_if(kBegin, kEnd, matches); iter != kEnd) {
-    if (out && iter != kBegin)
-      return blink::ZoomFactorToZoomLevel(*--iter);
-    if (!out && ++iter != kEnd)
-      return blink::ZoomFactorToZoomLevel(*iter);
+  for (size_t i = 0U; i < size; ++i) {
+    if (!blink::ZoomValuesEqual(kPresetFactors[i], factor))
+      continue;
+    if (out && i > 0U)
+      return blink::ZoomFactorToZoomLevel(kPresetFactors[i - 1U]);
+    if (!out && i + 1U < size)
+      return blink::ZoomFactorToZoomLevel(kPresetFactors[i + 1U]);
   }
   return level;
 }
Repository: vercel/next.js
Pull request: perf(turbopack): Use sourcemap with perf patches

### What?

Use latest version of `sourcemap` crate

### Why?

In the name of the performance!

Applies
 - https://github.com/getsentry/rust-sourcemap/pull/122
 - https://github.com/getsentry/rust-sourcemap/pull/124


Closes PACK-4659

Changed files:
filename: Cargo.lock
patch: @@ -7162,8 +7162,7 @@ dependencies = [
 [[package]]
 name = "sourcemap"
 version = "9.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bdee719193ae5c919a3ee43f64c2c0dd87f9b9a451d67918a2a5ec2e3c70561c"
+source = "git+https://github.com/getsentry/rust-sourcemap?branch=master#24a07e376a634c7823ada1b55326454ba7fc921d"
 dependencies = [
  "base64-simd 0.8.0",
  "bitvec",

filename: Cargo.toml
patch: @@ -431,3 +431,5 @@ webbrowser = "0.8.7"
 
 [patch.crates-io]
 mdxjs = { git = "https://github.com/kdy1/mdxjs-rs", branch = "swc-core-26" }
+# Use unreleased version of sourcemap, in the name of performance
+sourcemap = { git = "https://github.com/getsentry/rust-sourcemap", branch = "master" }
Repository: denoland/deno
Pull request: fix(cli): named export takes precedence over default export in doc testing

This commit fixes the issue of import name conflict in case the named export and default export have the same name by letting named export take precedence over default export.

Fixes #26009


Changed files:
filename: cli/util/extract.rs
patch: @@ -254,7 +254,11 @@ impl ExportCollector {
     let mut import_specifiers = vec![];
 
     if let Some(default_export) = &self.default_export {
-      if !symbols_to_exclude.contains(default_export) {
+      // If the default export conflicts with a named export, a named one
+      // takes precedence.
+      if !symbols_to_exclude.contains(default_export)
+        && !self.named_exports.contains(default_export)
+      {
         import_specifiers.push(ast::ImportSpecifier::Default(
           ast::ImportDefaultSpecifier {
             span: DUMMY_SP,
@@ -1137,6 +1141,30 @@ Deno.test("file:///README.md$6-12.js", async ()=>{
           media_type: MediaType::JavaScript,
         }],
       },
+      // https://github.com/denoland/deno/issues/26009
+      Test {
+        input: Input {
+          source: r#"
+/**
+ * ```ts
+ * console.log(Foo)
+ * ```
+ */
+export class Foo {}
+export default Foo
+"#,
+          specifier: "file:///main.ts",
+        },
+        expected: vec![Expected {
+          source: r#"import { Foo } from "file:///main.ts";
+Deno.test("file:///main.ts$3-6.ts", async ()=>{
+    console.log(Foo);
+});
+"#,
+          specifier: "file:///main.ts$3-6.ts",
+          media_type: MediaType::TypeScript,
+        }],
+      },
     ];
 
     for test in tests {
@@ -1326,6 +1354,28 @@ assertEquals(add(1, 2), 3);
           media_type: MediaType::JavaScript,
         }],
       },
+      // https://github.com/denoland/deno/issues/26009
+      Test {
+        input: Input {
+          source: r#"
+/**
+ * ```ts
+ * console.log(Foo)
+ * ```
+ */
+export class Foo {}
+export default Foo
+"#,
+          specifier: "file:///main.ts",
+        },
+        expected: vec![Expected {
+          source: r#"import { Foo } from "file:///main.ts";
+console.log(Foo);
+"#,
+          specifier: "file:///main.ts$3-6.ts",
+          media_type: MediaType::TypeScript,
+        }],
+      },
     ];
 
     for test in tests {
@@ -1581,6 +1631,16 @@ declare global {
         named_expected: atom_set!(),
         default_expected: None,
       },
+      // The identifier `Foo` conflicts, but `ExportCollector` doesn't do
+      // anything about it. It is handled by `to_import_specifiers` method.
+      Test {
+        input: r#"
+export class Foo {}
+export default Foo
+"#,
+        named_expected: atom_set!("Foo"),
+        default_expected: Some("Foo".into()),
+      },
     ];
 
     for test in tests {
Repository: facebook/react
Pull request: Include install command for devtools-extension build instructions

<!--
  Thanks for submitting a pull request!
  We appreciate you spending the time to work on these changes. Please provide enough information so that others can review your pull request. The three fields below are mandatory.

  Before submitting a pull request, please make sure the following is done:

  1. Fork [the repository](https://github.com/facebook/react) and create your branch from `main`.
  2. Run `yarn` in the repository root.
  3. If you've fixed a bug or added code that should be tested, add tests!
  4. Ensure the test suite passes (`yarn test`). Tip: `yarn test --watch TestName` is helpful in development.
  5. Run `yarn test --prod` to test in the production environment. It supports the same options as `yarn test`.
  6. If you need a debugger, run `yarn debug-test --watch TestName`, open `chrome://inspect`, and press "Inspect".
  7. Format your code with [prettier](https://github.com/prettier/prettier) (`yarn prettier`).
  8. Make sure your code lints (`yarn lint`). Tip: `yarn linc` to only check changed files.
  9. Run the [Flow](https://flowtype.org/) type checks (`yarn flow`).
  10. If you haven't already, complete the CLA.

  Learn more about contributing: https://reactjs.org/docs/how-to-contribute.html
-->

## Summary

Closes https://github.com/facebook/react/issues/25052

@SijaanX would that addition have helped you?

## How did you test this change?

🤷🏻‍♂️ 


Changed files:
filename: packages/react-devtools-extensions/README.md
patch: @@ -15,6 +15,12 @@ DevTools depends on local versions of several NPM packages<sup>1</sup> also in t
 
 <sup>1</sup> Note that at this time, an _experimental_ build is required because DevTools depends on the `createRoot` API.
 
+To install all necessary dependencies, run the following command from the root of the repository:
+
+```sh
+yarn install
+```
+
 #### Build from source
 To build dependencies from source, run the following command from the root of the repository:
 ```sh