[BUG] In workspaces `npm run` autocomplete only lists root scripts
Is there an existing issue for this?
- [X] I have searched the existing issues
This issue exists in the latest npm version
- [X] I am using the latest npm
Current Behavior
When run from a workspace sub-folder, the npm run autocomplete only lists scripts from the workspace root package.json. This is a problem because those aren't the scripts that npm run actually can execute in that context. Trying to run one of the autocompleted script names will fail with "npm ERR! Error: Missing script".
Expected Behavior
It should list scripts from the nearest ancestor package.json, as that is what will actually be executed, not the ones from the root.
Steps To Reproduce
- Make a new npm project with at least one workspace
- Add a script to the root package.json file
- Add a script to the workspace's package.json file
cdto the workspace folder- Type
npm runand press Tab
Environment
- npm: 10.2.5 (also reproducible on 9.8.1)
- Node.js: 20.10.0 (also reproducible on 18.18.2)
- OS Name: macOS
- System Model Name: Macbook Pro
- npm config:
npm ERR! code ENOWORKSPACES
npm ERR! This command does not support workspaces.
The issue is in the static completion method for the run-script command. It always operates on npm.localPrefix which will be the root package.json for workspace.
https://github.com/npm/cli/blob/badeac28faf9fde5f8c05d235219be840999a646/lib/commands/run-script.js#L23-L34
Ideally that method could use the workspace directory if it was the pwd, or even parse the args so npm run -w workspace <tab> would find the directory for workspace.