src: list scripts when --run has no command - #64606

Merged
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
Cherry:run-list-scripts
Aug 24, 2026
Merged

src: list scripts when --run has no command#64606
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
Cherry:run-list-scripts

Conversation

@Cherry

@CherryCherry commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

This extends the behaviour when you run node --run <unknown script> that prints a list of available scripts, to now print available scripts when you simply run node --run, to mimic the behaviour of npm run, etc.

$ node --runAvailable scripts are: test: node --test build: node build.js

Previously, node --run with no command errored with --run requires an argument.

This is my first contribution to Node.js so while I've tried to read and follow everything, please let me know if I'm missing anything!

Fixes: #64870

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Review requested:

  • @nodejs/config
  • @nodejs/startup

@nodejs-github-botnodejs-github-bot added c++ Issues and PRs that require attention from people who are familiar with C++. lib / src Issues and PRs involving general changes in the lib/ or src/ directories. needs-ci PRs that need a full CI run. labels Jul 19, 2026
Comment on lines +457 to +459
// `--run` may be passed without a script name to list available scripts,
// so an omitted value is not an error and must not swallow a later flag.
const bool optional_value = name == "--run";

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a better solution to modifying the options parser directly? We have other CLI flags that have different behavior depending on whether or not they have an argument passed?

How does --inspect do this?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely familiar with the code, but looking at --inspect, it's a boolean option so works a bit differently I think:

node/src/node_options.cc

Lines 475 to 479 in 0bcc6ef

AddOption("--inspect",
"activate inspector on host:port (default: 127.0.0.1:9229)",
&DebugOptions::inspector_enabled,
kAllowedInEnvvar);
AddAlias("--inspect=", { "--inspect-port", "--inspect" });

So --inspect and --inspect=1234 work, but --inspect 1234 isn't valid.

If I'm understanding correctly, --run can't do this, because it's space separated.

To avoid the hardcoded name == "--run", what would you suggest?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm, perhaps I was mis-remembering that --inspect required an = to run 😓. I'm still wary about changing the parser, since there probably should be a way for a flag to be passed with an optional value, regardless of =.

Sorry about misremembering, I'll ask around to see if there's a way to do this, and if not, we can always add it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks! It's also very possible I'm misreading this or missing something, and this is already supported somewhere - sorry if so!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I doubt that, you (so far) demonstrate a great understanding of the codebase. It's probable that we just never encountered this scenario before.

Great work so far :-)

Comment threadsrc/node_task_runner.cc Outdated
@avivkelleravivkeller added the cli Issues and PRs related to the Node.js command-line interface. label Jul 19, 2026
@avivkeller

Copy link
Copy Markdown
Member

Implementation LGTM. I'm not giving this the green check while I look into better ways of actually detecting the option-less flag, but everything from that point on is great :)

@codecov

codecovBot commented Jul 20, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 86.20690% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 90.13%. Comparing base (cf30b2e) to head (2958891).
⚠️ Report is 117 commits behind head on main.

Files with missing linesPatch %Lines
src/node_options-inl.h50.00%0 Missing and 3 partials ⚠️
src/node_task_runner.cc95.23%0 Missing and 1 partial ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #64606 +/- ##
==========================================
+ Coverage 90.11% 90.13% +0.01% 
==========================================
Files 752 752 Lines 251861 251873 +12 Branches 47365 47363 -2 ==========================================
+ Hits 226955 227016 +61 + Misses 16238 16186 -52 - Partials 8668 8671 +3 
Files with missing linesCoverage Δ
src/node.cc76.53% <100.00%> (ø)
src/node_options.h95.37% <100.00%> (+0.48%)⬆️
src/node_task_runner.cc89.78% <95.23%> (+0.45%)⬆️
src/node_options-inl.h83.09% <50.00%> (-0.18%)⬇️

... and 32 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Just pushed to fix the markdown linting - looks like I needed to prepend to changes, not append, sorry!

The macOS test failure looks to be an unrelated flake, but let me know if not.

@anonriganonrig added author ready PRs with CI started, the required approvals, and no outstanding review comments. request-ci Add this label to start a Jenkins CI on a PR. labels Jul 31, 2026
@anonrig

Copy link
Copy Markdown
Member

Thank you James! @Cherry

@github-actionsgithub-actionsBot removed the request-ci Add this label to start a Jenkins CI on a PR. label Jul 31, 2026
@nodejs-github-bot

This comment was marked as outdated.

@Renegade334

Copy link
Copy Markdown
Member

GHA is borked on the current PR head, and looks like there will be lint issues to address anyway, so I'm just going to trigger a rebase.

@Renegade334Renegade334 removed the author ready PRs with CI started, the required approvals, and no outstanding review comments. label Jul 31, 2026
@Cherry

Copy link
Copy Markdown
ContributorAuthor

Let me know if I can help with any of the linting (etc.) issues! Thanks all.

@anonrig

Copy link
Copy Markdown
Member

Let me know if I can help with any of the linting (etc.) issues! Thanks all.

@Cherry can you rebase and ask your agent to fix the linting errors please?

@Renegade334

Copy link
Copy Markdown
Member

The only complaint appears to be:

doc/node.1 is out of date; run `make node.1` to regenerate it.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Yeah I can rebase and try and fix that shortly!

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Should be good now, thanks!

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@jasnell

Copy link
Copy Markdown
Member

Overall fine with the idea, but there's a subtly that's worth calling out.

$ export CMD=test
$ node --run $CMD
// Runs the test script
$ export CMD=
$ node --run $CMD
// Lists the available scripts

Re-using the --run could lead to edge case bugs if the user does not realize the CMD env var is not set.

@Cherry

Cherry commented Aug 2, 2026

Copy link
Copy Markdown
ContributorAuthor

Yeah that's a fair point, though I think this edge-case is a pretty common shell thing - for example node $CMD with an empty var drops you into the REPL (or exits 0 in CI), and npm run $CMD / yarn / pnpm all list scripts and exit 0 the same way.

That said, since --run $CMD used to fail hard here, happy to keep the listing but exit non-zero when no command is given (like bare git) - scripts with a broken env var would still fail, and interactive users still get the list. Let me know if folks would prefer that and I'll update.

@jasnell

Copy link
Copy Markdown
Member

That sounds like a reasonable approach to me.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Updated to do a non-zero exit (9 seemed the most appropriate looking at other codes, but happy to tweak), and then print to stderrr. Let me know if there's any other feedback!

@Cherry

Cherry commented Aug 18, 2026

Copy link
Copy Markdown
ContributorAuthor

CI is looking good! Let me know if there's anything further I can do to help land this. Pushed up changes to resolve the merge conflicts.

Signed-off-by: James Ross <james@jross.me>
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@trivikrtrivikr added author ready PRs with CI started, the required approvals, and no outstanding review comments. commit-queue PRs queued for automated landing through the Commit Queue. labels Aug 23, 2026
@nodejs-github-bot
nodejs-github-bot merged commit 5e48fb3 into nodejs:mainAug 24, 2026
71 checks passed
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in 5e48fb3

@nodejs-github-botnodejs-github-bot removed the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 24, 2026
aduh95 pushed a commit that referenced this pull request Aug 29, 2026
Signed-off-by: James Ross <james@jross.me>
PR-URL: #64606Fixes: #64870
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author readyPRs with CI started, the required approvals, and no outstanding review comments.c++Issues and PRs that require attention from people who are familiar with C++.cliIssues and PRs related to the Node.js command-line interface.lib / srcIssues and PRs involving general changes in the lib/ or src/ directories.needs-ciPRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

node --run should print list of available tasks

7 participants

@Cherry@nodejs-github-bot@avivkeller@anonrig@Renegade334@jasnell@trivikr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

src: list scripts when --run has no command - #64606

Merged
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
Cherry:run-list-scripts
Aug 24, 2026
Merged

src: list scripts when --run has no command#64606
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
Cherry:run-list-scripts

Conversation

@Cherry

@CherryCherry commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

This extends the behaviour when you run node --run <unknown script> that prints a list of available scripts, to now print available scripts when you simply run node --run, to mimic the behaviour of npm run, etc.

$ node --runAvailable scripts are: test: node --test build: node build.js

Previously, node --run with no command errored with --run requires an argument.

This is my first contribution to Node.js so while I've tried to read and follow everything, please let me know if I'm missing anything!

Fixes: #64870

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Review requested:

  • @nodejs/config
  • @nodejs/startup

@nodejs-github-botnodejs-github-bot added c++ Issues and PRs that require attention from people who are familiar with C++. lib / src Issues and PRs involving general changes in the lib/ or src/ directories. needs-ci PRs that need a full CI run. labels Jul 19, 2026
Comment on lines +457 to +459
// `--run` may be passed without a script name to list available scripts,
// so an omitted value is not an error and must not swallow a later flag.
const bool optional_value = name == "--run";

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a better solution to modifying the options parser directly? We have other CLI flags that have different behavior depending on whether or not they have an argument passed?

How does --inspect do this?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely familiar with the code, but looking at --inspect, it's a boolean option so works a bit differently I think:

node/src/node_options.cc

Lines 475 to 479 in 0bcc6ef

AddOption("--inspect",
"activate inspector on host:port (default: 127.0.0.1:9229)",
&DebugOptions::inspector_enabled,
kAllowedInEnvvar);
AddAlias("--inspect=", { "--inspect-port", "--inspect" });

So --inspect and --inspect=1234 work, but --inspect 1234 isn't valid.

If I'm understanding correctly, --run can't do this, because it's space separated.

To avoid the hardcoded name == "--run", what would you suggest?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm, perhaps I was mis-remembering that --inspect required an = to run 😓. I'm still wary about changing the parser, since there probably should be a way for a flag to be passed with an optional value, regardless of =.

Sorry about misremembering, I'll ask around to see if there's a way to do this, and if not, we can always add it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks! It's also very possible I'm misreading this or missing something, and this is already supported somewhere - sorry if so!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I doubt that, you (so far) demonstrate a great understanding of the codebase. It's probable that we just never encountered this scenario before.

Great work so far :-)

Comment threadsrc/node_task_runner.cc Outdated
@avivkelleravivkeller added the cli Issues and PRs related to the Node.js command-line interface. label Jul 19, 2026
@avivkeller

Copy link
Copy Markdown
Member

Implementation LGTM. I'm not giving this the green check while I look into better ways of actually detecting the option-less flag, but everything from that point on is great :)

@codecov

codecovBot commented Jul 20, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 86.20690% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 90.13%. Comparing base (cf30b2e) to head (2958891).
⚠️ Report is 117 commits behind head on main.

Files with missing linesPatch %Lines
src/node_options-inl.h50.00%0 Missing and 3 partials ⚠️
src/node_task_runner.cc95.23%0 Missing and 1 partial ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #64606 +/- ##
==========================================
+ Coverage 90.11% 90.13% +0.01% 
==========================================
Files 752 752 Lines 251861 251873 +12 Branches 47365 47363 -2 ==========================================
+ Hits 226955 227016 +61 + Misses 16238 16186 -52 - Partials 8668 8671 +3 
Files with missing linesCoverage Δ
src/node.cc76.53% <100.00%> (ø)
src/node_options.h95.37% <100.00%> (+0.48%)⬆️
src/node_task_runner.cc89.78% <95.23%> (+0.45%)⬆️
src/node_options-inl.h83.09% <50.00%> (-0.18%)⬇️

... and 32 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Just pushed to fix the markdown linting - looks like I needed to prepend to changes, not append, sorry!

The macOS test failure looks to be an unrelated flake, but let me know if not.

@anonriganonrig added author ready PRs with CI started, the required approvals, and no outstanding review comments. request-ci Add this label to start a Jenkins CI on a PR. labels Jul 31, 2026
@anonrig

Copy link
Copy Markdown
Member

Thank you James! @Cherry

@github-actionsgithub-actionsBot removed the request-ci Add this label to start a Jenkins CI on a PR. label Jul 31, 2026
@nodejs-github-bot

This comment was marked as outdated.

@Renegade334

Copy link
Copy Markdown
Member

GHA is borked on the current PR head, and looks like there will be lint issues to address anyway, so I'm just going to trigger a rebase.

@Renegade334Renegade334 removed the author ready PRs with CI started, the required approvals, and no outstanding review comments. label Jul 31, 2026
@Cherry

Copy link
Copy Markdown
ContributorAuthor

Let me know if I can help with any of the linting (etc.) issues! Thanks all.

@anonrig

Copy link
Copy Markdown
Member

Let me know if I can help with any of the linting (etc.) issues! Thanks all.

@Cherry can you rebase and ask your agent to fix the linting errors please?

@Renegade334

Copy link
Copy Markdown
Member

The only complaint appears to be:

doc/node.1 is out of date; run `make node.1` to regenerate it.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Yeah I can rebase and try and fix that shortly!

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Should be good now, thanks!

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@jasnell

Copy link
Copy Markdown
Member

Overall fine with the idea, but there's a subtly that's worth calling out.

$ export CMD=test
$ node --run $CMD
// Runs the test script
$ export CMD=
$ node --run $CMD
// Lists the available scripts

Re-using the --run could lead to edge case bugs if the user does not realize the CMD env var is not set.

@Cherry

Cherry commented Aug 2, 2026

Copy link
Copy Markdown
ContributorAuthor

Yeah that's a fair point, though I think this edge-case is a pretty common shell thing - for example node $CMD with an empty var drops you into the REPL (or exits 0 in CI), and npm run $CMD / yarn / pnpm all list scripts and exit 0 the same way.

That said, since --run $CMD used to fail hard here, happy to keep the listing but exit non-zero when no command is given (like bare git) - scripts with a broken env var would still fail, and interactive users still get the list. Let me know if folks would prefer that and I'll update.

@jasnell

Copy link
Copy Markdown
Member

That sounds like a reasonable approach to me.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Updated to do a non-zero exit (9 seemed the most appropriate looking at other codes, but happy to tweak), and then print to stderrr. Let me know if there's any other feedback!

@Cherry

Cherry commented Aug 18, 2026

Copy link
Copy Markdown
ContributorAuthor

CI is looking good! Let me know if there's anything further I can do to help land this. Pushed up changes to resolve the merge conflicts.

Signed-off-by: James Ross <james@jross.me>
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@trivikrtrivikr added author ready PRs with CI started, the required approvals, and no outstanding review comments. commit-queue PRs queued for automated landing through the Commit Queue. labels Aug 23, 2026
@nodejs-github-bot
nodejs-github-bot merged commit 5e48fb3 into nodejs:mainAug 24, 2026
71 checks passed
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in 5e48fb3

@nodejs-github-botnodejs-github-bot removed the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 24, 2026
aduh95 pushed a commit that referenced this pull request Aug 29, 2026
Signed-off-by: James Ross <james@jross.me>
PR-URL: #64606Fixes: #64870
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author readyPRs with CI started, the required approvals, and no outstanding review comments.c++Issues and PRs that require attention from people who are familiar with C++.cliIssues and PRs related to the Node.js command-line interface.lib / srcIssues and PRs involving general changes in the lib/ or src/ directories.needs-ciPRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

node --run should print list of available tasks

7 participants

@Cherry@nodejs-github-bot@avivkeller@anonrig@Renegade334@jasnell@trivikr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

src: list scripts when --run has no command - #64606

Merged
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
Cherry:run-list-scripts
Aug 24, 2026
Merged

src: list scripts when --run has no command#64606
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
Cherry:run-list-scripts

Conversation

@Cherry

@CherryCherry commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

This extends the behaviour when you run node --run <unknown script> that prints a list of available scripts, to now print available scripts when you simply run node --run, to mimic the behaviour of npm run, etc.

$ node --runAvailable scripts are: test: node --test build: node build.js

Previously, node --run with no command errored with --run requires an argument.

This is my first contribution to Node.js so while I've tried to read and follow everything, please let me know if I'm missing anything!

Fixes: #64870

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Review requested:

  • @nodejs/config
  • @nodejs/startup

@nodejs-github-botnodejs-github-bot added c++ Issues and PRs that require attention from people who are familiar with C++. lib / src Issues and PRs involving general changes in the lib/ or src/ directories. needs-ci PRs that need a full CI run. labels Jul 19, 2026
Comment on lines +457 to +459
// `--run` may be passed without a script name to list available scripts,
// so an omitted value is not an error and must not swallow a later flag.
const bool optional_value = name == "--run";

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a better solution to modifying the options parser directly? We have other CLI flags that have different behavior depending on whether or not they have an argument passed?

How does --inspect do this?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely familiar with the code, but looking at --inspect, it's a boolean option so works a bit differently I think:

node/src/node_options.cc

Lines 475 to 479 in 0bcc6ef

AddOption("--inspect",
"activate inspector on host:port (default: 127.0.0.1:9229)",
&DebugOptions::inspector_enabled,
kAllowedInEnvvar);
AddAlias("--inspect=", { "--inspect-port", "--inspect" });

So --inspect and --inspect=1234 work, but --inspect 1234 isn't valid.

If I'm understanding correctly, --run can't do this, because it's space separated.

To avoid the hardcoded name == "--run", what would you suggest?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm, perhaps I was mis-remembering that --inspect required an = to run 😓. I'm still wary about changing the parser, since there probably should be a way for a flag to be passed with an optional value, regardless of =.

Sorry about misremembering, I'll ask around to see if there's a way to do this, and if not, we can always add it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks! It's also very possible I'm misreading this or missing something, and this is already supported somewhere - sorry if so!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I doubt that, you (so far) demonstrate a great understanding of the codebase. It's probable that we just never encountered this scenario before.

Great work so far :-)

Comment threadsrc/node_task_runner.cc Outdated
@avivkelleravivkeller added the cli Issues and PRs related to the Node.js command-line interface. label Jul 19, 2026
@avivkeller

Copy link
Copy Markdown
Member

Implementation LGTM. I'm not giving this the green check while I look into better ways of actually detecting the option-less flag, but everything from that point on is great :)

@codecov

codecovBot commented Jul 20, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 86.20690% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 90.13%. Comparing base (cf30b2e) to head (2958891).
⚠️ Report is 117 commits behind head on main.

Files with missing linesPatch %Lines
src/node_options-inl.h50.00%0 Missing and 3 partials ⚠️
src/node_task_runner.cc95.23%0 Missing and 1 partial ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #64606 +/- ##
==========================================
+ Coverage 90.11% 90.13% +0.01% 
==========================================
Files 752 752 Lines 251861 251873 +12 Branches 47365 47363 -2 ==========================================
+ Hits 226955 227016 +61 + Misses 16238 16186 -52 - Partials 8668 8671 +3 
Files with missing linesCoverage Δ
src/node.cc76.53% <100.00%> (ø)
src/node_options.h95.37% <100.00%> (+0.48%)⬆️
src/node_task_runner.cc89.78% <95.23%> (+0.45%)⬆️
src/node_options-inl.h83.09% <50.00%> (-0.18%)⬇️

... and 32 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Just pushed to fix the markdown linting - looks like I needed to prepend to changes, not append, sorry!

The macOS test failure looks to be an unrelated flake, but let me know if not.

@anonriganonrig added author ready PRs with CI started, the required approvals, and no outstanding review comments. request-ci Add this label to start a Jenkins CI on a PR. labels Jul 31, 2026
@anonrig

Copy link
Copy Markdown
Member

Thank you James! @Cherry

@github-actionsgithub-actionsBot removed the request-ci Add this label to start a Jenkins CI on a PR. label Jul 31, 2026
@nodejs-github-bot

This comment was marked as outdated.

@Renegade334

Copy link
Copy Markdown
Member

GHA is borked on the current PR head, and looks like there will be lint issues to address anyway, so I'm just going to trigger a rebase.

@Renegade334Renegade334 removed the author ready PRs with CI started, the required approvals, and no outstanding review comments. label Jul 31, 2026
@Cherry

Copy link
Copy Markdown
ContributorAuthor

Let me know if I can help with any of the linting (etc.) issues! Thanks all.

@anonrig

Copy link
Copy Markdown
Member

Let me know if I can help with any of the linting (etc.) issues! Thanks all.

@Cherry can you rebase and ask your agent to fix the linting errors please?

@Renegade334

Copy link
Copy Markdown
Member

The only complaint appears to be:

doc/node.1 is out of date; run `make node.1` to regenerate it.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Yeah I can rebase and try and fix that shortly!

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Should be good now, thanks!

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@jasnell

Copy link
Copy Markdown
Member

Overall fine with the idea, but there's a subtly that's worth calling out.

$ export CMD=test
$ node --run $CMD
// Runs the test script
$ export CMD=
$ node --run $CMD
// Lists the available scripts

Re-using the --run could lead to edge case bugs if the user does not realize the CMD env var is not set.

@Cherry

Cherry commented Aug 2, 2026

Copy link
Copy Markdown
ContributorAuthor

Yeah that's a fair point, though I think this edge-case is a pretty common shell thing - for example node $CMD with an empty var drops you into the REPL (or exits 0 in CI), and npm run $CMD / yarn / pnpm all list scripts and exit 0 the same way.

That said, since --run $CMD used to fail hard here, happy to keep the listing but exit non-zero when no command is given (like bare git) - scripts with a broken env var would still fail, and interactive users still get the list. Let me know if folks would prefer that and I'll update.

@jasnell

Copy link
Copy Markdown
Member

That sounds like a reasonable approach to me.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Updated to do a non-zero exit (9 seemed the most appropriate looking at other codes, but happy to tweak), and then print to stderrr. Let me know if there's any other feedback!

@Cherry

Cherry commented Aug 18, 2026

Copy link
Copy Markdown
ContributorAuthor

CI is looking good! Let me know if there's anything further I can do to help land this. Pushed up changes to resolve the merge conflicts.

Signed-off-by: James Ross <james@jross.me>
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@trivikrtrivikr added author ready PRs with CI started, the required approvals, and no outstanding review comments. commit-queue PRs queued for automated landing through the Commit Queue. labels Aug 23, 2026
@nodejs-github-bot
nodejs-github-bot merged commit 5e48fb3 into nodejs:mainAug 24, 2026
71 checks passed
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in 5e48fb3

@nodejs-github-botnodejs-github-bot removed the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 24, 2026
aduh95 pushed a commit that referenced this pull request Aug 29, 2026
Signed-off-by: James Ross <james@jross.me>
PR-URL: #64606Fixes: #64870
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author readyPRs with CI started, the required approvals, and no outstanding review comments.c++Issues and PRs that require attention from people who are familiar with C++.cliIssues and PRs related to the Node.js command-line interface.lib / srcIssues and PRs involving general changes in the lib/ or src/ directories.needs-ciPRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

node --run should print list of available tasks

7 participants

@Cherry@nodejs-github-bot@avivkeller@anonrig@Renegade334@jasnell@trivikr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

src: list scripts when --run has no command - #64606

Merged
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
Cherry:run-list-scripts
Aug 24, 2026
Merged

src: list scripts when --run has no command#64606
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
Cherry:run-list-scripts

Conversation

@Cherry

@CherryCherry commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

This extends the behaviour when you run node --run <unknown script> that prints a list of available scripts, to now print available scripts when you simply run node --run, to mimic the behaviour of npm run, etc.

$ node --runAvailable scripts are: test: node --test build: node build.js

Previously, node --run with no command errored with --run requires an argument.

This is my first contribution to Node.js so while I've tried to read and follow everything, please let me know if I'm missing anything!

Fixes: #64870

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Review requested:

  • @nodejs/config
  • @nodejs/startup

@nodejs-github-botnodejs-github-bot added c++ Issues and PRs that require attention from people who are familiar with C++. lib / src Issues and PRs involving general changes in the lib/ or src/ directories. needs-ci PRs that need a full CI run. labels Jul 19, 2026
Comment on lines +457 to +459
// `--run` may be passed without a script name to list available scripts,
// so an omitted value is not an error and must not swallow a later flag.
const bool optional_value = name == "--run";

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a better solution to modifying the options parser directly? We have other CLI flags that have different behavior depending on whether or not they have an argument passed?

How does --inspect do this?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely familiar with the code, but looking at --inspect, it's a boolean option so works a bit differently I think:

node/src/node_options.cc

Lines 475 to 479 in 0bcc6ef

AddOption("--inspect",
"activate inspector on host:port (default: 127.0.0.1:9229)",
&DebugOptions::inspector_enabled,
kAllowedInEnvvar);
AddAlias("--inspect=", { "--inspect-port", "--inspect" });

So --inspect and --inspect=1234 work, but --inspect 1234 isn't valid.

If I'm understanding correctly, --run can't do this, because it's space separated.

To avoid the hardcoded name == "--run", what would you suggest?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm, perhaps I was mis-remembering that --inspect required an = to run 😓. I'm still wary about changing the parser, since there probably should be a way for a flag to be passed with an optional value, regardless of =.

Sorry about misremembering, I'll ask around to see if there's a way to do this, and if not, we can always add it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks! It's also very possible I'm misreading this or missing something, and this is already supported somewhere - sorry if so!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I doubt that, you (so far) demonstrate a great understanding of the codebase. It's probable that we just never encountered this scenario before.

Great work so far :-)

Comment threadsrc/node_task_runner.cc Outdated
@avivkelleravivkeller added the cli Issues and PRs related to the Node.js command-line interface. label Jul 19, 2026
@avivkeller

Copy link
Copy Markdown
Member

Implementation LGTM. I'm not giving this the green check while I look into better ways of actually detecting the option-less flag, but everything from that point on is great :)

@codecov

codecovBot commented Jul 20, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 86.20690% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 90.13%. Comparing base (cf30b2e) to head (2958891).
⚠️ Report is 117 commits behind head on main.

Files with missing linesPatch %Lines
src/node_options-inl.h50.00%0 Missing and 3 partials ⚠️
src/node_task_runner.cc95.23%0 Missing and 1 partial ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #64606 +/- ##
==========================================
+ Coverage 90.11% 90.13% +0.01% 
==========================================
Files 752 752 Lines 251861 251873 +12 Branches 47365 47363 -2 ==========================================
+ Hits 226955 227016 +61 + Misses 16238 16186 -52 - Partials 8668 8671 +3 
Files with missing linesCoverage Δ
src/node.cc76.53% <100.00%> (ø)
src/node_options.h95.37% <100.00%> (+0.48%)⬆️
src/node_task_runner.cc89.78% <95.23%> (+0.45%)⬆️
src/node_options-inl.h83.09% <50.00%> (-0.18%)⬇️

... and 32 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Just pushed to fix the markdown linting - looks like I needed to prepend to changes, not append, sorry!

The macOS test failure looks to be an unrelated flake, but let me know if not.

@anonriganonrig added author ready PRs with CI started, the required approvals, and no outstanding review comments. request-ci Add this label to start a Jenkins CI on a PR. labels Jul 31, 2026
@anonrig

Copy link
Copy Markdown
Member

Thank you James! @Cherry

@github-actionsgithub-actionsBot removed the request-ci Add this label to start a Jenkins CI on a PR. label Jul 31, 2026
@nodejs-github-bot

This comment was marked as outdated.

@Renegade334

Copy link
Copy Markdown
Member

GHA is borked on the current PR head, and looks like there will be lint issues to address anyway, so I'm just going to trigger a rebase.

@Renegade334Renegade334 removed the author ready PRs with CI started, the required approvals, and no outstanding review comments. label Jul 31, 2026
@Cherry

Copy link
Copy Markdown
ContributorAuthor

Let me know if I can help with any of the linting (etc.) issues! Thanks all.

@anonrig

Copy link
Copy Markdown
Member

Let me know if I can help with any of the linting (etc.) issues! Thanks all.

@Cherry can you rebase and ask your agent to fix the linting errors please?

@Renegade334

Copy link
Copy Markdown
Member

The only complaint appears to be:

doc/node.1 is out of date; run `make node.1` to regenerate it.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Yeah I can rebase and try and fix that shortly!

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Should be good now, thanks!

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@jasnell

Copy link
Copy Markdown
Member

Overall fine with the idea, but there's a subtly that's worth calling out.

$ export CMD=test
$ node --run $CMD
// Runs the test script
$ export CMD=
$ node --run $CMD
// Lists the available scripts

Re-using the --run could lead to edge case bugs if the user does not realize the CMD env var is not set.

@Cherry

Cherry commented Aug 2, 2026

Copy link
Copy Markdown
ContributorAuthor

Yeah that's a fair point, though I think this edge-case is a pretty common shell thing - for example node $CMD with an empty var drops you into the REPL (or exits 0 in CI), and npm run $CMD / yarn / pnpm all list scripts and exit 0 the same way.

That said, since --run $CMD used to fail hard here, happy to keep the listing but exit non-zero when no command is given (like bare git) - scripts with a broken env var would still fail, and interactive users still get the list. Let me know if folks would prefer that and I'll update.

@jasnell

Copy link
Copy Markdown
Member

That sounds like a reasonable approach to me.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Updated to do a non-zero exit (9 seemed the most appropriate looking at other codes, but happy to tweak), and then print to stderrr. Let me know if there's any other feedback!

@Cherry

Cherry commented Aug 18, 2026

Copy link
Copy Markdown
ContributorAuthor

CI is looking good! Let me know if there's anything further I can do to help land this. Pushed up changes to resolve the merge conflicts.

Signed-off-by: James Ross <james@jross.me>
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@trivikrtrivikr added author ready PRs with CI started, the required approvals, and no outstanding review comments. commit-queue PRs queued for automated landing through the Commit Queue. labels Aug 23, 2026
@nodejs-github-bot
nodejs-github-bot merged commit 5e48fb3 into nodejs:mainAug 24, 2026
71 checks passed
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in 5e48fb3

@nodejs-github-botnodejs-github-bot removed the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 24, 2026
aduh95 pushed a commit that referenced this pull request Aug 29, 2026
Signed-off-by: James Ross <james@jross.me>
PR-URL: #64606Fixes: #64870
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author readyPRs with CI started, the required approvals, and no outstanding review comments.c++Issues and PRs that require attention from people who are familiar with C++.cliIssues and PRs related to the Node.js command-line interface.lib / srcIssues and PRs involving general changes in the lib/ or src/ directories.needs-ciPRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

node --run should print list of available tasks

7 participants

@Cherry@nodejs-github-bot@avivkeller@anonrig@Renegade334@jasnell@trivikr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

src: list scripts when --run has no command - #64606

Merged
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
Cherry:run-list-scripts
Aug 24, 2026
Merged

src: list scripts when --run has no command#64606
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
Cherry:run-list-scripts

Conversation

@Cherry

@CherryCherry commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

This extends the behaviour when you run node --run <unknown script> that prints a list of available scripts, to now print available scripts when you simply run node --run, to mimic the behaviour of npm run, etc.

$ node --runAvailable scripts are: test: node --test build: node build.js

Previously, node --run with no command errored with --run requires an argument.

This is my first contribution to Node.js so while I've tried to read and follow everything, please let me know if I'm missing anything!

Fixes: #64870

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Review requested:

  • @nodejs/config
  • @nodejs/startup

@nodejs-github-botnodejs-github-bot added c++ Issues and PRs that require attention from people who are familiar with C++. lib / src Issues and PRs involving general changes in the lib/ or src/ directories. needs-ci PRs that need a full CI run. labels Jul 19, 2026
Comment on lines +457 to +459
// `--run` may be passed without a script name to list available scripts,
// so an omitted value is not an error and must not swallow a later flag.
const bool optional_value = name == "--run";

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a better solution to modifying the options parser directly? We have other CLI flags that have different behavior depending on whether or not they have an argument passed?

How does --inspect do this?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely familiar with the code, but looking at --inspect, it's a boolean option so works a bit differently I think:

node/src/node_options.cc

Lines 475 to 479 in 0bcc6ef

AddOption("--inspect",
"activate inspector on host:port (default: 127.0.0.1:9229)",
&DebugOptions::inspector_enabled,
kAllowedInEnvvar);
AddAlias("--inspect=", { "--inspect-port", "--inspect" });

So --inspect and --inspect=1234 work, but --inspect 1234 isn't valid.

If I'm understanding correctly, --run can't do this, because it's space separated.

To avoid the hardcoded name == "--run", what would you suggest?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm, perhaps I was mis-remembering that --inspect required an = to run 😓. I'm still wary about changing the parser, since there probably should be a way for a flag to be passed with an optional value, regardless of =.

Sorry about misremembering, I'll ask around to see if there's a way to do this, and if not, we can always add it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks! It's also very possible I'm misreading this or missing something, and this is already supported somewhere - sorry if so!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I doubt that, you (so far) demonstrate a great understanding of the codebase. It's probable that we just never encountered this scenario before.

Great work so far :-)

Comment threadsrc/node_task_runner.cc Outdated
@avivkelleravivkeller added the cli Issues and PRs related to the Node.js command-line interface. label Jul 19, 2026
@avivkeller

Copy link
Copy Markdown
Member

Implementation LGTM. I'm not giving this the green check while I look into better ways of actually detecting the option-less flag, but everything from that point on is great :)

@codecov

codecovBot commented Jul 20, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 86.20690% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 90.13%. Comparing base (cf30b2e) to head (2958891).
⚠️ Report is 117 commits behind head on main.

Files with missing linesPatch %Lines
src/node_options-inl.h50.00%0 Missing and 3 partials ⚠️
src/node_task_runner.cc95.23%0 Missing and 1 partial ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #64606 +/- ##
==========================================
+ Coverage 90.11% 90.13% +0.01% 
==========================================
Files 752 752 Lines 251861 251873 +12 Branches 47365 47363 -2 ==========================================
+ Hits 226955 227016 +61 + Misses 16238 16186 -52 - Partials 8668 8671 +3 
Files with missing linesCoverage Δ
src/node.cc76.53% <100.00%> (ø)
src/node_options.h95.37% <100.00%> (+0.48%)⬆️
src/node_task_runner.cc89.78% <95.23%> (+0.45%)⬆️
src/node_options-inl.h83.09% <50.00%> (-0.18%)⬇️

... and 32 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Just pushed to fix the markdown linting - looks like I needed to prepend to changes, not append, sorry!

The macOS test failure looks to be an unrelated flake, but let me know if not.

@anonriganonrig added author ready PRs with CI started, the required approvals, and no outstanding review comments. request-ci Add this label to start a Jenkins CI on a PR. labels Jul 31, 2026
@anonrig

Copy link
Copy Markdown
Member

Thank you James! @Cherry

@github-actionsgithub-actionsBot removed the request-ci Add this label to start a Jenkins CI on a PR. label Jul 31, 2026
@nodejs-github-bot

This comment was marked as outdated.

@Renegade334

Copy link
Copy Markdown
Member

GHA is borked on the current PR head, and looks like there will be lint issues to address anyway, so I'm just going to trigger a rebase.

@Renegade334Renegade334 removed the author ready PRs with CI started, the required approvals, and no outstanding review comments. label Jul 31, 2026
@Cherry

Copy link
Copy Markdown
ContributorAuthor

Let me know if I can help with any of the linting (etc.) issues! Thanks all.

@anonrig

Copy link
Copy Markdown
Member

Let me know if I can help with any of the linting (etc.) issues! Thanks all.

@Cherry can you rebase and ask your agent to fix the linting errors please?

@Renegade334

Copy link
Copy Markdown
Member

The only complaint appears to be:

doc/node.1 is out of date; run `make node.1` to regenerate it.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Yeah I can rebase and try and fix that shortly!

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Should be good now, thanks!

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@jasnell

Copy link
Copy Markdown
Member

Overall fine with the idea, but there's a subtly that's worth calling out.

$ export CMD=test
$ node --run $CMD
// Runs the test script
$ export CMD=
$ node --run $CMD
// Lists the available scripts

Re-using the --run could lead to edge case bugs if the user does not realize the CMD env var is not set.

@Cherry

Cherry commented Aug 2, 2026

Copy link
Copy Markdown
ContributorAuthor

Yeah that's a fair point, though I think this edge-case is a pretty common shell thing - for example node $CMD with an empty var drops you into the REPL (or exits 0 in CI), and npm run $CMD / yarn / pnpm all list scripts and exit 0 the same way.

That said, since --run $CMD used to fail hard here, happy to keep the listing but exit non-zero when no command is given (like bare git) - scripts with a broken env var would still fail, and interactive users still get the list. Let me know if folks would prefer that and I'll update.

@jasnell

Copy link
Copy Markdown
Member

That sounds like a reasonable approach to me.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Updated to do a non-zero exit (9 seemed the most appropriate looking at other codes, but happy to tweak), and then print to stderrr. Let me know if there's any other feedback!

@Cherry

Cherry commented Aug 18, 2026

Copy link
Copy Markdown
ContributorAuthor

CI is looking good! Let me know if there's anything further I can do to help land this. Pushed up changes to resolve the merge conflicts.

Signed-off-by: James Ross <james@jross.me>
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@trivikrtrivikr added author ready PRs with CI started, the required approvals, and no outstanding review comments. commit-queue PRs queued for automated landing through the Commit Queue. labels Aug 23, 2026
@nodejs-github-bot
nodejs-github-bot merged commit 5e48fb3 into nodejs:mainAug 24, 2026
71 checks passed
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in 5e48fb3

@nodejs-github-botnodejs-github-bot removed the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 24, 2026
aduh95 pushed a commit that referenced this pull request Aug 29, 2026
Signed-off-by: James Ross <james@jross.me>
PR-URL: #64606Fixes: #64870
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author readyPRs with CI started, the required approvals, and no outstanding review comments.c++Issues and PRs that require attention from people who are familiar with C++.cliIssues and PRs related to the Node.js command-line interface.lib / srcIssues and PRs involving general changes in the lib/ or src/ directories.needs-ciPRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

node --run should print list of available tasks

7 participants

@Cherry@nodejs-github-bot@avivkeller@anonrig@Renegade334@jasnell@trivikr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

src: list scripts when --run has no command - #64606

Merged
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
Cherry:run-list-scripts
Aug 24, 2026
Merged

src: list scripts when --run has no command#64606
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
Cherry:run-list-scripts

Conversation

@Cherry

@CherryCherry commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

This extends the behaviour when you run node --run <unknown script> that prints a list of available scripts, to now print available scripts when you simply run node --run, to mimic the behaviour of npm run, etc.

$ node --runAvailable scripts are: test: node --test build: node build.js

Previously, node --run with no command errored with --run requires an argument.

This is my first contribution to Node.js so while I've tried to read and follow everything, please let me know if I'm missing anything!

Fixes: #64870

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Review requested:

  • @nodejs/config
  • @nodejs/startup

@nodejs-github-botnodejs-github-bot added c++ Issues and PRs that require attention from people who are familiar with C++. lib / src Issues and PRs involving general changes in the lib/ or src/ directories. needs-ci PRs that need a full CI run. labels Jul 19, 2026
Comment on lines +457 to +459
// `--run` may be passed without a script name to list available scripts,
// so an omitted value is not an error and must not swallow a later flag.
const bool optional_value = name == "--run";

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a better solution to modifying the options parser directly? We have other CLI flags that have different behavior depending on whether or not they have an argument passed?

How does --inspect do this?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely familiar with the code, but looking at --inspect, it's a boolean option so works a bit differently I think:

node/src/node_options.cc

Lines 475 to 479 in 0bcc6ef

AddOption("--inspect",
"activate inspector on host:port (default: 127.0.0.1:9229)",
&DebugOptions::inspector_enabled,
kAllowedInEnvvar);
AddAlias("--inspect=", { "--inspect-port", "--inspect" });

So --inspect and --inspect=1234 work, but --inspect 1234 isn't valid.

If I'm understanding correctly, --run can't do this, because it's space separated.

To avoid the hardcoded name == "--run", what would you suggest?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm, perhaps I was mis-remembering that --inspect required an = to run 😓. I'm still wary about changing the parser, since there probably should be a way for a flag to be passed with an optional value, regardless of =.

Sorry about misremembering, I'll ask around to see if there's a way to do this, and if not, we can always add it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks! It's also very possible I'm misreading this or missing something, and this is already supported somewhere - sorry if so!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I doubt that, you (so far) demonstrate a great understanding of the codebase. It's probable that we just never encountered this scenario before.

Great work so far :-)

Comment threadsrc/node_task_runner.cc Outdated
@avivkelleravivkeller added the cli Issues and PRs related to the Node.js command-line interface. label Jul 19, 2026
@avivkeller

Copy link
Copy Markdown
Member

Implementation LGTM. I'm not giving this the green check while I look into better ways of actually detecting the option-less flag, but everything from that point on is great :)

@codecov

codecovBot commented Jul 20, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 86.20690% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 90.13%. Comparing base (cf30b2e) to head (2958891).
⚠️ Report is 117 commits behind head on main.

Files with missing linesPatch %Lines
src/node_options-inl.h50.00%0 Missing and 3 partials ⚠️
src/node_task_runner.cc95.23%0 Missing and 1 partial ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #64606 +/- ##
==========================================
+ Coverage 90.11% 90.13% +0.01% 
==========================================
Files 752 752 Lines 251861 251873 +12 Branches 47365 47363 -2 ==========================================
+ Hits 226955 227016 +61 + Misses 16238 16186 -52 - Partials 8668 8671 +3 
Files with missing linesCoverage Δ
src/node.cc76.53% <100.00%> (ø)
src/node_options.h95.37% <100.00%> (+0.48%)⬆️
src/node_task_runner.cc89.78% <95.23%> (+0.45%)⬆️
src/node_options-inl.h83.09% <50.00%> (-0.18%)⬇️

... and 32 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Just pushed to fix the markdown linting - looks like I needed to prepend to changes, not append, sorry!

The macOS test failure looks to be an unrelated flake, but let me know if not.

@anonriganonrig added author ready PRs with CI started, the required approvals, and no outstanding review comments. request-ci Add this label to start a Jenkins CI on a PR. labels Jul 31, 2026
@anonrig

Copy link
Copy Markdown
Member

Thank you James! @Cherry

@github-actionsgithub-actionsBot removed the request-ci Add this label to start a Jenkins CI on a PR. label Jul 31, 2026
@nodejs-github-bot

This comment was marked as outdated.

@Renegade334

Copy link
Copy Markdown
Member

GHA is borked on the current PR head, and looks like there will be lint issues to address anyway, so I'm just going to trigger a rebase.

@Renegade334Renegade334 removed the author ready PRs with CI started, the required approvals, and no outstanding review comments. label Jul 31, 2026
@Cherry

Copy link
Copy Markdown
ContributorAuthor

Let me know if I can help with any of the linting (etc.) issues! Thanks all.

@anonrig

Copy link
Copy Markdown
Member

Let me know if I can help with any of the linting (etc.) issues! Thanks all.

@Cherry can you rebase and ask your agent to fix the linting errors please?

@Renegade334

Copy link
Copy Markdown
Member

The only complaint appears to be:

doc/node.1 is out of date; run `make node.1` to regenerate it.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Yeah I can rebase and try and fix that shortly!

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Should be good now, thanks!

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@jasnell

Copy link
Copy Markdown
Member

Overall fine with the idea, but there's a subtly that's worth calling out.

$ export CMD=test
$ node --run $CMD
// Runs the test script
$ export CMD=
$ node --run $CMD
// Lists the available scripts

Re-using the --run could lead to edge case bugs if the user does not realize the CMD env var is not set.

@Cherry

Cherry commented Aug 2, 2026

Copy link
Copy Markdown
ContributorAuthor

Yeah that's a fair point, though I think this edge-case is a pretty common shell thing - for example node $CMD with an empty var drops you into the REPL (or exits 0 in CI), and npm run $CMD / yarn / pnpm all list scripts and exit 0 the same way.

That said, since --run $CMD used to fail hard here, happy to keep the listing but exit non-zero when no command is given (like bare git) - scripts with a broken env var would still fail, and interactive users still get the list. Let me know if folks would prefer that and I'll update.

@jasnell

Copy link
Copy Markdown
Member

That sounds like a reasonable approach to me.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Updated to do a non-zero exit (9 seemed the most appropriate looking at other codes, but happy to tweak), and then print to stderrr. Let me know if there's any other feedback!

@Cherry

Cherry commented Aug 18, 2026

Copy link
Copy Markdown
ContributorAuthor

CI is looking good! Let me know if there's anything further I can do to help land this. Pushed up changes to resolve the merge conflicts.

Signed-off-by: James Ross <james@jross.me>
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@trivikrtrivikr added author ready PRs with CI started, the required approvals, and no outstanding review comments. commit-queue PRs queued for automated landing through the Commit Queue. labels Aug 23, 2026
@nodejs-github-bot
nodejs-github-bot merged commit 5e48fb3 into nodejs:mainAug 24, 2026
71 checks passed
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in 5e48fb3

@nodejs-github-botnodejs-github-bot removed the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 24, 2026
aduh95 pushed a commit that referenced this pull request Aug 29, 2026
Signed-off-by: James Ross <james@jross.me>
PR-URL: #64606Fixes: #64870
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author readyPRs with CI started, the required approvals, and no outstanding review comments.c++Issues and PRs that require attention from people who are familiar with C++.cliIssues and PRs related to the Node.js command-line interface.lib / srcIssues and PRs involving general changes in the lib/ or src/ directories.needs-ciPRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

node --run should print list of available tasks

7 participants

@Cherry@nodejs-github-bot@avivkeller@anonrig@Renegade334@jasnell@trivikr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

src: list scripts when --run has no command - #64606

Merged
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
Cherry:run-list-scripts
Aug 24, 2026
Merged

src: list scripts when --run has no command#64606
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
Cherry:run-list-scripts

Conversation

@Cherry

@CherryCherry commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

This extends the behaviour when you run node --run <unknown script> that prints a list of available scripts, to now print available scripts when you simply run node --run, to mimic the behaviour of npm run, etc.

$ node --runAvailable scripts are: test: node --test build: node build.js

Previously, node --run with no command errored with --run requires an argument.

This is my first contribution to Node.js so while I've tried to read and follow everything, please let me know if I'm missing anything!

Fixes: #64870

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Review requested:

  • @nodejs/config
  • @nodejs/startup

@nodejs-github-botnodejs-github-bot added c++ Issues and PRs that require attention from people who are familiar with C++. lib / src Issues and PRs involving general changes in the lib/ or src/ directories. needs-ci PRs that need a full CI run. labels Jul 19, 2026
Comment on lines +457 to +459
// `--run` may be passed without a script name to list available scripts,
// so an omitted value is not an error and must not swallow a later flag.
const bool optional_value = name == "--run";

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a better solution to modifying the options parser directly? We have other CLI flags that have different behavior depending on whether or not they have an argument passed?

How does --inspect do this?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely familiar with the code, but looking at --inspect, it's a boolean option so works a bit differently I think:

node/src/node_options.cc

Lines 475 to 479 in 0bcc6ef

AddOption("--inspect",
"activate inspector on host:port (default: 127.0.0.1:9229)",
&DebugOptions::inspector_enabled,
kAllowedInEnvvar);
AddAlias("--inspect=", { "--inspect-port", "--inspect" });

So --inspect and --inspect=1234 work, but --inspect 1234 isn't valid.

If I'm understanding correctly, --run can't do this, because it's space separated.

To avoid the hardcoded name == "--run", what would you suggest?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm, perhaps I was mis-remembering that --inspect required an = to run 😓. I'm still wary about changing the parser, since there probably should be a way for a flag to be passed with an optional value, regardless of =.

Sorry about misremembering, I'll ask around to see if there's a way to do this, and if not, we can always add it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks! It's also very possible I'm misreading this or missing something, and this is already supported somewhere - sorry if so!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I doubt that, you (so far) demonstrate a great understanding of the codebase. It's probable that we just never encountered this scenario before.

Great work so far :-)

Comment threadsrc/node_task_runner.cc Outdated
@avivkelleravivkeller added the cli Issues and PRs related to the Node.js command-line interface. label Jul 19, 2026
@avivkeller

Copy link
Copy Markdown
Member

Implementation LGTM. I'm not giving this the green check while I look into better ways of actually detecting the option-less flag, but everything from that point on is great :)

@codecov

codecovBot commented Jul 20, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 86.20690% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 90.13%. Comparing base (cf30b2e) to head (2958891).
⚠️ Report is 117 commits behind head on main.

Files with missing linesPatch %Lines
src/node_options-inl.h50.00%0 Missing and 3 partials ⚠️
src/node_task_runner.cc95.23%0 Missing and 1 partial ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #64606 +/- ##
==========================================
+ Coverage 90.11% 90.13% +0.01% 
==========================================
Files 752 752 Lines 251861 251873 +12 Branches 47365 47363 -2 ==========================================
+ Hits 226955 227016 +61 + Misses 16238 16186 -52 - Partials 8668 8671 +3 
Files with missing linesCoverage Δ
src/node.cc76.53% <100.00%> (ø)
src/node_options.h95.37% <100.00%> (+0.48%)⬆️
src/node_task_runner.cc89.78% <95.23%> (+0.45%)⬆️
src/node_options-inl.h83.09% <50.00%> (-0.18%)⬇️

... and 32 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Just pushed to fix the markdown linting - looks like I needed to prepend to changes, not append, sorry!

The macOS test failure looks to be an unrelated flake, but let me know if not.

@anonriganonrig added author ready PRs with CI started, the required approvals, and no outstanding review comments. request-ci Add this label to start a Jenkins CI on a PR. labels Jul 31, 2026
@anonrig

Copy link
Copy Markdown
Member

Thank you James! @Cherry

@github-actionsgithub-actionsBot removed the request-ci Add this label to start a Jenkins CI on a PR. label Jul 31, 2026
@nodejs-github-bot

This comment was marked as outdated.

@Renegade334

Copy link
Copy Markdown
Member

GHA is borked on the current PR head, and looks like there will be lint issues to address anyway, so I'm just going to trigger a rebase.

@Renegade334Renegade334 removed the author ready PRs with CI started, the required approvals, and no outstanding review comments. label Jul 31, 2026
@Cherry

Copy link
Copy Markdown
ContributorAuthor

Let me know if I can help with any of the linting (etc.) issues! Thanks all.

@anonrig

Copy link
Copy Markdown
Member

Let me know if I can help with any of the linting (etc.) issues! Thanks all.

@Cherry can you rebase and ask your agent to fix the linting errors please?

@Renegade334

Copy link
Copy Markdown
Member

The only complaint appears to be:

doc/node.1 is out of date; run `make node.1` to regenerate it.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Yeah I can rebase and try and fix that shortly!

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Should be good now, thanks!

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@jasnell

Copy link
Copy Markdown
Member

Overall fine with the idea, but there's a subtly that's worth calling out.

$ export CMD=test
$ node --run $CMD
// Runs the test script
$ export CMD=
$ node --run $CMD
// Lists the available scripts

Re-using the --run could lead to edge case bugs if the user does not realize the CMD env var is not set.

@Cherry

Cherry commented Aug 2, 2026

Copy link
Copy Markdown
ContributorAuthor

Yeah that's a fair point, though I think this edge-case is a pretty common shell thing - for example node $CMD with an empty var drops you into the REPL (or exits 0 in CI), and npm run $CMD / yarn / pnpm all list scripts and exit 0 the same way.

That said, since --run $CMD used to fail hard here, happy to keep the listing but exit non-zero when no command is given (like bare git) - scripts with a broken env var would still fail, and interactive users still get the list. Let me know if folks would prefer that and I'll update.

@jasnell

Copy link
Copy Markdown
Member

That sounds like a reasonable approach to me.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Updated to do a non-zero exit (9 seemed the most appropriate looking at other codes, but happy to tweak), and then print to stderrr. Let me know if there's any other feedback!

@Cherry

Cherry commented Aug 18, 2026

Copy link
Copy Markdown
ContributorAuthor

CI is looking good! Let me know if there's anything further I can do to help land this. Pushed up changes to resolve the merge conflicts.

Signed-off-by: James Ross <james@jross.me>
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@trivikrtrivikr added author ready PRs with CI started, the required approvals, and no outstanding review comments. commit-queue PRs queued for automated landing through the Commit Queue. labels Aug 23, 2026
@nodejs-github-bot
nodejs-github-bot merged commit 5e48fb3 into nodejs:mainAug 24, 2026
71 checks passed
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in 5e48fb3

@nodejs-github-botnodejs-github-bot removed the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 24, 2026
aduh95 pushed a commit that referenced this pull request Aug 29, 2026
Signed-off-by: James Ross <james@jross.me>
PR-URL: #64606Fixes: #64870
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author readyPRs with CI started, the required approvals, and no outstanding review comments.c++Issues and PRs that require attention from people who are familiar with C++.cliIssues and PRs related to the Node.js command-line interface.lib / srcIssues and PRs involving general changes in the lib/ or src/ directories.needs-ciPRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

node --run should print list of available tasks

7 participants

@Cherry@nodejs-github-bot@avivkeller@anonrig@Renegade334@jasnell@trivikr
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

src: list scripts when --run has no command - #64606

Merged
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
Cherry:run-list-scripts
Aug 24, 2026
Merged

src: list scripts when --run has no command#64606
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
Cherry:run-list-scripts

Conversation

@Cherry

@CherryCherry commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

This extends the behaviour when you run node --run <unknown script> that prints a list of available scripts, to now print available scripts when you simply run node --run, to mimic the behaviour of npm run, etc.

$ node --runAvailable scripts are: test: node --test build: node build.js

Previously, node --run with no command errored with --run requires an argument.

This is my first contribution to Node.js so while I've tried to read and follow everything, please let me know if I'm missing anything!

Fixes: #64870

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Review requested:

  • @nodejs/config
  • @nodejs/startup

@nodejs-github-botnodejs-github-bot added c++ Issues and PRs that require attention from people who are familiar with C++. lib / src Issues and PRs involving general changes in the lib/ or src/ directories. needs-ci PRs that need a full CI run. labels Jul 19, 2026
Comment on lines +457 to +459
// `--run` may be passed without a script name to list available scripts,
// so an omitted value is not an error and must not swallow a later flag.
const bool optional_value = name == "--run";

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a better solution to modifying the options parser directly? We have other CLI flags that have different behavior depending on whether or not they have an argument passed?

How does --inspect do this?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely familiar with the code, but looking at --inspect, it's a boolean option so works a bit differently I think:

node/src/node_options.cc

Lines 475 to 479 in 0bcc6ef

AddOption("--inspect",
"activate inspector on host:port (default: 127.0.0.1:9229)",
&DebugOptions::inspector_enabled,
kAllowedInEnvvar);
AddAlias("--inspect=", { "--inspect-port", "--inspect" });

So --inspect and --inspect=1234 work, but --inspect 1234 isn't valid.

If I'm understanding correctly, --run can't do this, because it's space separated.

To avoid the hardcoded name == "--run", what would you suggest?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm, perhaps I was mis-remembering that --inspect required an = to run 😓. I'm still wary about changing the parser, since there probably should be a way for a flag to be passed with an optional value, regardless of =.

Sorry about misremembering, I'll ask around to see if there's a way to do this, and if not, we can always add it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks! It's also very possible I'm misreading this or missing something, and this is already supported somewhere - sorry if so!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I doubt that, you (so far) demonstrate a great understanding of the codebase. It's probable that we just never encountered this scenario before.

Great work so far :-)

Comment threadsrc/node_task_runner.cc Outdated
@avivkelleravivkeller added the cli Issues and PRs related to the Node.js command-line interface. label Jul 19, 2026
@avivkeller

Copy link
Copy Markdown
Member

Implementation LGTM. I'm not giving this the green check while I look into better ways of actually detecting the option-less flag, but everything from that point on is great :)

@codecov

codecovBot commented Jul 20, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 86.20690% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 90.13%. Comparing base (cf30b2e) to head (2958891).
⚠️ Report is 117 commits behind head on main.

Files with missing linesPatch %Lines
src/node_options-inl.h50.00%0 Missing and 3 partials ⚠️
src/node_task_runner.cc95.23%0 Missing and 1 partial ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #64606 +/- ##
==========================================
+ Coverage 90.11% 90.13% +0.01% 
==========================================
Files 752 752 Lines 251861 251873 +12 Branches 47365 47363 -2 ==========================================
+ Hits 226955 227016 +61 + Misses 16238 16186 -52 - Partials 8668 8671 +3 
Files with missing linesCoverage Δ
src/node.cc76.53% <100.00%> (ø)
src/node_options.h95.37% <100.00%> (+0.48%)⬆️
src/node_task_runner.cc89.78% <95.23%> (+0.45%)⬆️
src/node_options-inl.h83.09% <50.00%> (-0.18%)⬇️

... and 32 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Just pushed to fix the markdown linting - looks like I needed to prepend to changes, not append, sorry!

The macOS test failure looks to be an unrelated flake, but let me know if not.

@anonriganonrig added author ready PRs with CI started, the required approvals, and no outstanding review comments. request-ci Add this label to start a Jenkins CI on a PR. labels Jul 31, 2026
@anonrig

Copy link
Copy Markdown
Member

Thank you James! @Cherry

@github-actionsgithub-actionsBot removed the request-ci Add this label to start a Jenkins CI on a PR. label Jul 31, 2026
@nodejs-github-bot

This comment was marked as outdated.

@Renegade334

Copy link
Copy Markdown
Member

GHA is borked on the current PR head, and looks like there will be lint issues to address anyway, so I'm just going to trigger a rebase.

@Renegade334Renegade334 removed the author ready PRs with CI started, the required approvals, and no outstanding review comments. label Jul 31, 2026
@Cherry

Copy link
Copy Markdown
ContributorAuthor

Let me know if I can help with any of the linting (etc.) issues! Thanks all.

@anonrig

Copy link
Copy Markdown
Member

Let me know if I can help with any of the linting (etc.) issues! Thanks all.

@Cherry can you rebase and ask your agent to fix the linting errors please?

@Renegade334

Copy link
Copy Markdown
Member

The only complaint appears to be:

doc/node.1 is out of date; run `make node.1` to regenerate it.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Yeah I can rebase and try and fix that shortly!

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Should be good now, thanks!

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@jasnell

Copy link
Copy Markdown
Member

Overall fine with the idea, but there's a subtly that's worth calling out.

$ export CMD=test
$ node --run $CMD
// Runs the test script
$ export CMD=
$ node --run $CMD
// Lists the available scripts

Re-using the --run could lead to edge case bugs if the user does not realize the CMD env var is not set.

@Cherry

Cherry commented Aug 2, 2026

Copy link
Copy Markdown
ContributorAuthor

Yeah that's a fair point, though I think this edge-case is a pretty common shell thing - for example node $CMD with an empty var drops you into the REPL (or exits 0 in CI), and npm run $CMD / yarn / pnpm all list scripts and exit 0 the same way.

That said, since --run $CMD used to fail hard here, happy to keep the listing but exit non-zero when no command is given (like bare git) - scripts with a broken env var would still fail, and interactive users still get the list. Let me know if folks would prefer that and I'll update.

@jasnell

Copy link
Copy Markdown
Member

That sounds like a reasonable approach to me.

@Cherry

Copy link
Copy Markdown
ContributorAuthor

Updated to do a non-zero exit (9 seemed the most appropriate looking at other codes, but happy to tweak), and then print to stderrr. Let me know if there's any other feedback!

@Cherry

Cherry commented Aug 18, 2026

Copy link
Copy Markdown
ContributorAuthor

CI is looking good! Let me know if there's anything further I can do to help land this. Pushed up changes to resolve the merge conflicts.

Signed-off-by: James Ross <james@jross.me>
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@trivikrtrivikr added author ready PRs with CI started, the required approvals, and no outstanding review comments. commit-queue PRs queued for automated landing through the Commit Queue. labels Aug 23, 2026
@nodejs-github-bot
nodejs-github-bot merged commit 5e48fb3 into nodejs:mainAug 24, 2026
71 checks passed
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in 5e48fb3

@nodejs-github-botnodejs-github-bot removed the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 24, 2026
aduh95 pushed a commit that referenced this pull request Aug 29, 2026
Signed-off-by: James Ross <james@jross.me>
PR-URL: #64606Fixes: #64870
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author readyPRs with CI started, the required approvals, and no outstanding review comments.c++Issues and PRs that require attention from people who are familiar with C++.cliIssues and PRs related to the Node.js command-line interface.lib / srcIssues and PRs involving general changes in the lib/ or src/ directories.needs-ciPRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

node --run should print list of available tasks

7 participants

@Cherry@nodejs-github-bot@avivkeller@anonrig@Renegade334@jasnell@trivikr