skills/cli-scripting/nodejs/20/SKILL.md
Node.js 20 LTS version-specific expertise. Stable test runner (node --test), stable fetch API, permission model (experimental), Single Executable Applications (SEA), watch mode, V8 11.3, Array.fromAsync(). WHEN: "Node 20", "Node.js 20", "node --test", "permission model", "--allow-fs-read", "SEA", "Single Executable".
npx skillsauth add chrishuffman5/domain-expert cli-nodejs-20Install this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Node 20 LTS (codename Iron). Released April 2023, EOL April 2026. This is the widest-deployed LTS version.
| Feature | Status |
|---|---|
| node:test built-in test runner | Stable |
| fetch / Request / Response | Stable |
| Permission model (--allow-fs-read, etc.) | Experimental |
| Single Executable Applications (SEA) | Experimental |
| --watch mode | Stable |
| import.meta.resolve() | Stable |
| V8 11.3, Array.fromAsync() | Included |
import { test, describe, it, before, after, mock } from 'node:test';
import assert from 'node:assert/strict';
// Simple test
test('addition works', () => {
assert.strictEqual(1 + 1, 2);
});
// Async test
test('fetch returns data', async () => {
const res = await fetch('https://jsonplaceholder.typicode.com/todos/1');
assert.ok(res.ok);
const data = await res.json();
assert.equal(data.id, 1);
});
// Test suite with describe/it
describe('Array', () => {
it('should support map', () => {
assert.deepStrictEqual([1, 2, 3].map(x => x * 2), [2, 4, 6]);
});
it('should support filter', () => {
assert.deepStrictEqual([1, 2, 3, 4].filter(x => x > 2), [3, 4]);
});
});
// Mocking
test('mocked function', () => {
const fn = mock.fn(() => 42);
assert.equal(fn(), 42);
assert.equal(fn.mock.calls.length, 1);
});
# Run tests
node --test # find and run **/*.test.{js,mjs}
node --test src/ # test files in directory
node --test --watch # watch mode
node --test --test-reporter=spec # spec reporter
node --test --test-reporter=tap # TAP output
node --test --test-concurrency=4 # parallel
# Sandbox: restrict file system, network, child_process
node --experimental-permission --allow-fs-read=/data --allow-fs-write=/tmp script.mjs
node --experimental-permission --allow-child-process --allow-net script.mjs
# No flags = deny all (when --experimental-permission is set)
node --experimental-permission script.mjs # all restricted
Permission flags: --allow-fs-read, --allow-fs-write, --allow-child-process, --allow-worker, --allow-net.
node --watch server.mjs # restart on file changes
node --watch-path=./src server.mjs # watch specific directory
node --watch --test # rerun tests on changes
fetch, Request, Response, Headers, FormData are all globally available without import.
const res = await fetch('https://api.example.com/data');
const data = await res.json();
# 1. Create SEA config
echo '{"main":"app.js","output":"sea-prep.blob"}' > sea-config.json
# 2. Generate the blob
node --experimental-sea-config sea-config.json
# 3. Copy node binary and inject
cp $(which node) my-app
npx postject my-app NODE_SEA_BLOB sea-prep.blob --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2
# 4. Run standalone
./my-app
Array.fromAsync() -- async version of Array.from()ArrayBuffer.prototype.transfer() -- zero-copy transfer.isWellFormed() and .toWellFormed() -- Unicode validationWhen migrating from Node 18 to Node 20:
fetch moves from experimental to stablenode:test moves from experimental to stable--watch moves from experimental to stableimport.meta.resolve() becomes synchronoustools
kubectl command-line usage and scripting: kubeconfig and context management, output formats (jsonpath, custom-columns, go-template), all major verbs (get, describe, apply, delete, exec, logs, port-forward, rollout, scale, drain), workload resources, config/storage, networking, RBAC, node management, debugging (CrashLoopBackOff, ImagePullBackOff, OOMKilled), and scripting patterns (dry-run, diff, wait, jq, kustomize). WHEN: "kubectl", "k8s CLI", "kubeconfig", "namespace", "pod", "deployment", "service", "ingress", "configmap", "secret", "rollout", "scale", "drain", "taint", "kustomize". Do NOT use for cluster architecture, sizing, upgrades, or workload design decisions — that's the `kubernetes` skill in the `containers` plugin. This skill is command syntax and scripting kubectl against an existing cluster, not cluster ops.
tools
Bash 5.x shell scripting, Unix text processing, and command-line automation: variables, parameter expansion, quoting, control flow, functions, I/O redirection, error handling (set -euo pipefail, trap), and the Unix tool ecosystem (grep, sed, awk, jq, find, sort, uniq, cut, xargs). Covers process management, networking (curl, ssh, rsync, nc), file locking (flock), parallel execution, and production script patterns. WHEN: "Bash", "bash", "shell", "sh", ".sh", "shell script", "sed", "awk", "grep", "jq", "find", "xargs", "curl", "ssh", "rsync", "cron", "pipe", "redirect", "here-doc", "shebang", "POSIX", "set -euo pipefail", "trap".
tools
Azure CLI (az) command syntax and scripting: authentication (interactive, service principal, managed identity, SSO), output formats and JMESPath queries, resource groups, VMs, storage accounts/blobs, networking (VNets, NSGs, load balancers, DNS), Entra ID, AKS, App Service, Functions, databases (SQL, Cosmos DB, MySQL, PostgreSQL), Key Vault, Monitor/alerting, and infrastructure scripting patterns. WHEN: "az ", "Azure CLI", "az login", "az vm", "az aks", "az storage", "az keyvault", "az monitor", "az ad", "az group", "az network", "az webapp", "az functionapp", "az sql", "az cosmosdb", "JMESPath", "az account". Do NOT use for Azure architecture, landing zones, or multi-subscription strategy — that's the `cloud-platforms` plugin. This skill is about command syntax and scripting the CLI, not deciding what to provision.
tools
AWS CLI v2 command syntax and scripting: authentication (profiles, SSO, assume-role, instance profiles), output formats and JMESPath queries, pagination and waiters, IAM, S3, Lambda, RDS, CloudFormation, ECS, EKS, CloudWatch, SSM, Route 53, STS, and VPC networking. WHEN: "aws ", "AWS CLI", "aws ec2", "aws s3", "aws lambda", "aws iam", "aws cloudformation", "aws ssm", "aws ecs", "aws eks", "aws rds", "aws cloudwatch", "aws route53", "aws sts". Do NOT use for AWS architecture, service selection, multi-account strategy, or FinOps — that's the `cloud-platforms` plugin. This skill is about command syntax and scripting the CLI, not deciding what to provision.