From 50a1dc725fc65585b9d90af8dba4e9b937e4d761 Mon Sep 17 00:00:00 2001 From: Taku Kodma <79110363+risu729@users.noreply.github.com> Date: Sun, 10 May 2026 05:36:14 +1000 Subject: [PATCH 1/3] registry: use aqua backend for npm --- registry/npm.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/registry/npm.toml b/registry/npm.toml index 8cb60720b8..ea4bad2348 100644 --- a/registry/npm.toml +++ b/registry/npm.toml @@ -1,4 +1,5 @@ -backends = ["npm:npm"] +backends = ["aqua:npm/cli", "npm:npm"] +depends = ["node"] description = "the package manager for JavaScript" idiomatic_files = ["package.json"] overrides = ["node"] From 04412c363248d40386e55193bf2f2b5167e81cf8 Mon Sep 17 00:00:00 2001 From: Taku Kodama <79110363+risu729@users.noreply.github.com> Date: Sun, 10 May 2026 06:08:00 +1000 Subject: [PATCH 2/3] Remove 'depends' entry from npm.toml --- registry/npm.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/registry/npm.toml b/registry/npm.toml index ea4bad2348..417f5ea037 100644 --- a/registry/npm.toml +++ b/registry/npm.toml @@ -1,5 +1,4 @@ backends = ["aqua:npm/cli", "npm:npm"] -depends = ["node"] description = "the package manager for JavaScript" idiomatic_files = ["package.json"] overrides = ["node"] From 1b628e32afe173ab1aea18b38979ed5d5ec7e528 Mon Sep 17 00:00:00 2001 From: Taku Kodma <79110363+risu729@users.noreply.github.com> Date: Sun, 10 May 2026 20:17:50 +1000 Subject: [PATCH 3/3] test(backend): update npm registry expectations --- src/backend/npm.rs | 6 ++++-- src/cli/args/backend_arg.rs | 11 ++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/backend/npm.rs b/src/backend/npm.rs index c2bd490d2a..4f0e34124b 100644 --- a/src/backend/npm.rs +++ b/src/backend/npm.rs @@ -64,8 +64,10 @@ impl Backend for NPMBackend { let package_manager = settings.npm.package_manager; let tool_name = self.tool_name(); - // Avoid circular dependency when installing npm itself - // But we still need the configured package manager for installation + // Explicit `npm:npm` still bootstraps through node's bundled npm even + // when the registry shorthand prefers aqua. Keep node here so users of + // the npm backend, or the registry fallback, wait for that bootstrap + // npm before installation starts. if tool_name == "npm" { return match package_manager { NpmPackageManager::Auto => Ok(vec!["node"]), diff --git a/src/cli/args/backend_arg.rs b/src/cli/args/backend_arg.rs index 60b9ef214b..255939c72d 100644 --- a/src/cli/args/backend_arg.rs +++ b/src/cli/args/backend_arg.rs @@ -701,11 +701,20 @@ mod tests { let fa: BackendArg = "gem:bashly".into(); assert_eq!(BackendType::Gem, fa.backend_type()); - let fa: BackendArg = "npm".into(); + let fa: BackendArg = "npm:npm".into(); assert_str_eq!("npm:npm", fa.full()); assert_eq!(BackendType::Npm, fa.backend_type()); } + #[tokio::test] + async fn test_bare_npm_uses_registry_tool() { + let _config = Config::get().await.unwrap(); + + let fa: BackendArg = "npm".into(); + assert_str_eq!("aqua:npm/cli", fa.full()); + assert_eq!(BackendType::Aqua, fa.backend_type()); + } + #[tokio::test] async fn test_backend_arg_pathname() { let _config = Config::get().await.unwrap();