Normalize Tooling
Normalize scripts, allowScripts, gypfile, config, and workspaces fields in workspace package.json files.
Summary
The normalize-tooling recipe handles tooling-related fields in each workspace's package.json.
It normalizes the scripts object, allowScripts object, gypfile flag, config object, and workspaces field according to workspace role conventions.
Why Use This Command?
- Keeps package scripts and tooling metadata in shapes expected by npm and the repository toolchain.
- Detects
binding.gypand workspace roles so native and monorepo fields appear only when applicable. - Removes empty tooling objects before they become misleading configuration stubs.
Requirements
- Node.js runtime — Use a supported Node.js LTS release with the Nova CLI available.
- Project config — Register the workspace and enable
recipes.package-json.<workspace>.normalize-toolinginnova.config.json. - Workspace manifest — The configured workspace must contain a readable
package.jsonfile.
Behavior
For each eligible workspace, the recipe inspects tooling-related fields and applies the following rules. See Workspace Rules for how tags are determined.
scripts(Required) — If the field is missing, it is added as an empty object{}. Existing lifecycle groups are ordered asdev,prod,check,build,deploy, andclean; each group'sname:*children stay directly beneath their parent in authored order so sequential pipelines keep their intended execution order. Other scripts retain their relative order after those groups.allowScripts(Conditional) — Removed if the field is present but empty. A non-empty policy is preserved exactly; Nova never adds an approval or changes an existing decision.gypfile(Required) — If present but nobinding.gypfile exists in the workspace directory, the field is removed. If missing butbinding.gypexists and neitherscripts.preinstallnorscripts.installare defined, it is added astrue.config(Conditional) — Removed if the field is present but empty.workspaces(Required) — Removed if the workspace role is notproject. If the role isprojectand the field is missing, it is added as an empty array[].
Install-Script Trust Boundary
normalize-tooling performs shape cleanup, not dependency trust review. It does not inspect lifecycle-script source, run npm's approval commands, or infer entries from the lockfile. This prevents a routine recipe run from granting newly installed dependency code permission to execute.
Keep the reviewed policy in the project root and use exact-version approvals plus name-only denials. See Root Install-Script Policy for the field shape, npm 11 and npm 12 review commands, and the difference between approved, denied, and unreviewed packages.
Config Fields
A workspace is only processed when its nova.config.json entry opts in. The recipe filters out any workspace that does not enable normalize-tooling, and skips entirely when no workspace enables it.
| Field | Description |
|---|---|
workspaces[].recipes | Per-workspace recipe map in nova.config.json. A workspace with no recipes map is skipped. |
workspaces[].recipes['normalize-tooling'] | Recipe tuple enabling this recipe for the workspace. The first tuple element must be true; otherwise the workspace is skipped. |
Usage
Options
| Flag | Description |
|---|---|
-d, --dry-run | Run without writing any files. |
-r, --replace-file | Overwrite the original file instead of creating a .nova-backup copy. |