@hominis/fireforge 0.46.0 → 0.46.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +381 -498
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +17 -17
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +9 -9
- package/dist/src/cli-usage-error.js +12 -12
- package/dist/src/cli.d.ts +3 -2
- package/dist/src/cli.js +29 -28
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +2 -2
- package/dist/src/commands/build.js +12 -11
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +4 -4
- package/dist/src/commands/destructive-decision.js +4 -4
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -4
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
- package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
- package/dist/src/commands/doctor-furnace-jar.js +1 -1
- package/dist/src/commands/doctor-furnace.js +22 -22
- package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -11
- package/dist/src/commands/doctor-orphaned-harness.js +10 -11
- package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
- package/dist/src/commands/doctor-patch-manifest.js +7 -6
- package/dist/src/commands/doctor-post-rebase-audit.js +2 -2
- package/dist/src/commands/doctor-source-pin.d.ts +12 -12
- package/dist/src/commands/doctor-source-pin.js +14 -14
- package/dist/src/commands/doctor-working-tree.d.ts +3 -3
- package/dist/src/commands/doctor-working-tree.js +3 -3
- package/dist/src/commands/doctor.d.ts +2 -2
- package/dist/src/commands/doctor.js +9 -9
- package/dist/src/commands/download.js +15 -13
- package/dist/src/commands/export-all.js +8 -8
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +14 -14
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +9 -9
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +1 -1
- package/dist/src/commands/export-shared.d.ts +10 -10
- package/dist/src/commands/export-shared.js +13 -13
- package/dist/src/commands/export.js +4 -4
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +1 -1
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
- package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
- package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
- package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
- package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
- package/dist/src/commands/furnace/chrome-doc.js +18 -18
- package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +4 -4
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +4 -4
- package/dist/src/commands/furnace/create-features.d.ts +2 -2
- package/dist/src/commands/furnace/create-features.js +2 -2
- package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
- package/dist/src/commands/furnace/create-mochikit.js +7 -7
- package/dist/src/commands/furnace/create-templates.d.ts +14 -14
- package/dist/src/commands/furnace/create-templates.js +18 -18
- package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
- package/dist/src/commands/furnace/create-xpcshell.js +8 -8
- package/dist/src/commands/furnace/create.d.ts +1 -1
- package/dist/src/commands/furnace/create.js +10 -10
- package/dist/src/commands/furnace/deploy.js +4 -4
- package/dist/src/commands/furnace/diff.js +7 -7
- package/dist/src/commands/furnace/index.js +1 -1
- package/dist/src/commands/furnace/init.js +15 -15
- package/dist/src/commands/furnace/list.js +2 -2
- package/dist/src/commands/furnace/override.d.ts +1 -1
- package/dist/src/commands/furnace/override.js +15 -15
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +6 -6
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -3
- package/dist/src/commands/furnace/remove-mutations.js +19 -18
- package/dist/src/commands/furnace/remove-state.d.ts +1 -1
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +2 -2
- package/dist/src/commands/furnace/rename-browser-test.js +9 -8
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
- package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
- package/dist/src/commands/furnace/rename.js +9 -9
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +7 -7
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +2 -2
- package/dist/src/commands/furnace/test-file-name.js +2 -2
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/import.js +20 -20
- package/dist/src/commands/lint-per-patch.js +8 -8
- package/dist/src/commands/lint-per-run-checkjs.d.ts +12 -13
- package/dist/src/commands/lint-per-run-checkjs.js +14 -15
- package/dist/src/commands/lint-report.d.ts +3 -3
- package/dist/src/commands/lint-report.js +4 -4
- package/dist/src/commands/lint.d.ts +3 -3
- package/dist/src/commands/lint.js +35 -35
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/package.js +2 -2
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +8 -8
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +8 -8
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -4
- package/dist/src/commands/patch/lint-ignore.js +14 -15
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +5 -5
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +3 -3
- package/dist/src/commands/patch/move-files.js +1 -1
- package/dist/src/commands/patch/patch-context.d.ts +1 -1
- package/dist/src/commands/patch/rename.d.ts +4 -4
- package/dist/src/commands/patch/rename.js +8 -8
- package/dist/src/commands/patch/reorder.js +10 -10
- package/dist/src/commands/patch/split-plan.d.ts +3 -3
- package/dist/src/commands/patch/split-plan.js +6 -5
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +5 -5
- package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +6 -6
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +5 -5
- package/dist/src/commands/patch-rename-map.d.ts +1 -1
- package/dist/src/commands/patch-rename-map.js +1 -1
- package/dist/src/commands/pending-resolution.d.ts +5 -5
- package/dist/src/commands/pending-resolution.js +5 -5
- package/dist/src/commands/re-export-adjacent.d.ts +3 -3
- package/dist/src/commands/re-export-adjacent.js +8 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +17 -17
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +29 -29
- package/dist/src/commands/re-export-files.js +14 -15
- package/dist/src/commands/re-export-lint.d.ts +26 -26
- package/dist/src/commands/re-export-lint.js +27 -27
- package/dist/src/commands/re-export-options.d.ts +1 -1
- package/dist/src/commands/re-export-options.js +1 -1
- package/dist/src/commands/re-export-register.d.ts +1 -1
- package/dist/src/commands/re-export-register.js +1 -1
- package/dist/src/commands/re-export-scan.d.ts +1 -1
- package/dist/src/commands/re-export-scan.js +7 -7
- package/dist/src/commands/re-export-single.d.ts +1 -1
- package/dist/src/commands/re-export-single.js +20 -20
- package/dist/src/commands/re-export.js +7 -6
- package/dist/src/commands/rebase/abort.js +6 -6
- package/dist/src/commands/rebase/continue.js +8 -7
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +3 -3
- package/dist/src/commands/rebase/patch-loop.js +18 -17
- package/dist/src/commands/register.js +5 -5
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/resolve.d.ts +2 -2
- package/dist/src/commands/resolve.js +3 -3
- package/dist/src/commands/run.js +26 -26
- package/dist/src/commands/setup-support.js +4 -4
- package/dist/src/commands/setup.js +1 -1
- package/dist/src/commands/source.js +1 -1
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +4 -4
- package/dist/src/commands/status-json.d.ts +14 -13
- package/dist/src/commands/status-json.js +9 -8
- package/dist/src/commands/status-output.d.ts +3 -3
- package/dist/src/commands/status-output.js +3 -3
- package/dist/src/commands/status-ownership.d.ts +3 -3
- package/dist/src/commands/status-ownership.js +3 -3
- package/dist/src/commands/status.js +22 -22
- package/dist/src/commands/test-build-phase.d.ts +1 -1
- package/dist/src/commands/test-build-phase.js +17 -17
- package/dist/src/commands/test-diagnose.d.ts +1 -1
- package/dist/src/commands/test-diagnose.js +20 -20
- package/dist/src/commands/test-modes.d.ts +2 -2
- package/dist/src/commands/test-modes.js +4 -4
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +15 -15
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +13 -13
- package/dist/src/commands/test-verdict.d.ts +6 -6
- package/dist/src/commands/test-verdict.js +11 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +36 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.js +5 -5
- package/dist/src/commands/token.js +9 -9
- package/dist/src/commands/tree.js +19 -19
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +7 -7
- package/dist/src/commands/verify.d.ts +3 -3
- package/dist/src/commands/verify.js +10 -10
- package/dist/src/commands/watch.js +11 -11
- package/dist/src/commands/wire.js +13 -13
- package/dist/src/core/ast-utils.d.ts +7 -7
- package/dist/src/core/ast-utils.js +8 -8
- package/dist/src/core/branding.d.ts +5 -5
- package/dist/src/core/branding.js +3 -3
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +4 -4
- package/dist/src/core/build-audit-platform.d.ts +6 -6
- package/dist/src/core/build-audit-platform.js +26 -26
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +7 -7
- package/dist/src/core/build-audit-resolve.d.ts +5 -5
- package/dist/src/core/build-audit-resolve.js +6 -6
- package/dist/src/core/build-audit-skip.d.ts +8 -8
- package/dist/src/core/build-audit-skip.js +12 -12
- package/dist/src/core/build-audit-transforms.d.ts +2 -2
- package/dist/src/core/build-audit-transforms.js +3 -3
- package/dist/src/core/build-audit.d.ts +8 -8
- package/dist/src/core/build-audit.js +39 -37
- package/dist/src/core/build-baseline-types.d.ts +19 -18
- package/dist/src/core/build-baseline-types.js +1 -1
- package/dist/src/core/build-baseline.d.ts +8 -8
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +15 -15
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +13 -13
- package/dist/src/core/build-prepare.d.ts +4 -4
- package/dist/src/core/build-prepare.js +16 -15
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-state.js +2 -2
- package/dist/src/core/config-validate-build-audit.js +3 -3
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +2 -2
- package/dist/src/core/config-validate.js +8 -9
- package/dist/src/core/config.d.ts +10 -10
- package/dist/src/core/config.js +10 -10
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +16 -16
- package/dist/src/core/destructive.d.ts +14 -14
- package/dist/src/core/destructive.js +9 -9
- package/dist/src/core/diff-hunks.d.ts +2 -2
- package/dist/src/core/diff-hunks.js +7 -7
- package/dist/src/core/discard-baseline.d.ts +10 -10
- package/dist/src/core/discard-baseline.js +15 -16
- package/dist/src/core/display-state.d.ts +11 -11
- package/dist/src/core/display-state.js +12 -12
- package/dist/src/core/engine-changes.d.ts +2 -2
- package/dist/src/core/engine-changes.js +2 -2
- package/dist/src/core/engine-precondition.d.ts +4 -4
- package/dist/src/core/engine-precondition.js +2 -2
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +37 -37
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +8 -8
- package/dist/src/core/file-lock-owner.d.ts +11 -11
- package/dist/src/core/file-lock-owner.js +18 -18
- package/dist/src/core/file-lock.d.ts +12 -12
- package/dist/src/core/file-lock.js +52 -39
- package/dist/src/core/firefox-cache.d.ts +1 -1
- package/dist/src/core/firefox-cache.js +10 -10
- package/dist/src/core/firefox-download.d.ts +3 -3
- package/dist/src/core/firefox-download.js +6 -6
- package/dist/src/core/firefox-extract.d.ts +2 -2
- package/dist/src/core/firefox-extract.js +13 -13
- package/dist/src/core/firefox.d.ts +5 -5
- package/dist/src/core/firefox.js +8 -8
- package/dist/src/core/furnace-apply-dry-run.js +1 -1
- package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
- package/dist/src/core/furnace-apply-ftl.js +8 -8
- package/dist/src/core/furnace-apply-helpers.d.ts +9 -9
- package/dist/src/core/furnace-apply-helpers.js +21 -21
- package/dist/src/core/furnace-apply-output.js +1 -1
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +9 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
- package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
- package/dist/src/core/furnace-apply.d.ts +3 -3
- package/dist/src/core/furnace-apply.js +22 -21
- package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
- package/dist/src/core/furnace-checksum-utils.js +5 -5
- package/dist/src/core/furnace-config-custom.d.ts +1 -1
- package/dist/src/core/furnace-config-custom.js +2 -2
- package/dist/src/core/furnace-config-order.js +1 -1
- package/dist/src/core/furnace-config-tokens.d.ts +3 -3
- package/dist/src/core/furnace-config-tokens.js +3 -3
- package/dist/src/core/furnace-config-validate.js +2 -2
- package/dist/src/core/furnace-config.d.ts +4 -4
- package/dist/src/core/furnace-config.js +18 -18
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +6 -6
- package/dist/src/core/furnace-css-fragments.d.ts +6 -6
- package/dist/src/core/furnace-css-fragments.js +11 -11
- package/dist/src/core/furnace-dir-entry.d.ts +1 -1
- package/dist/src/core/furnace-dir-entry.js +1 -1
- package/dist/src/core/furnace-jsconfig.d.ts +7 -7
- package/dist/src/core/furnace-jsconfig.js +22 -20
- package/dist/src/core/furnace-operation.d.ts +21 -20
- package/dist/src/core/furnace-operation.js +36 -34
- package/dist/src/core/furnace-precondition.d.ts +10 -10
- package/dist/src/core/furnace-precondition.js +8 -8
- package/dist/src/core/furnace-refresh.js +2 -2
- package/dist/src/core/furnace-registration-ast.d.ts +2 -2
- package/dist/src/core/furnace-registration-ast.js +9 -9
- package/dist/src/core/furnace-registration-remove.d.ts +4 -4
- package/dist/src/core/furnace-registration-remove.js +6 -6
- package/dist/src/core/furnace-registration-validate.d.ts +2 -2
- package/dist/src/core/furnace-registration-validate.js +2 -2
- package/dist/src/core/furnace-registration.d.ts +5 -5
- package/dist/src/core/furnace-registration.js +7 -7
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-stale-export.d.ts +17 -16
- package/dist/src/core/furnace-stale-export.js +16 -15
- package/dist/src/core/furnace-staleness.d.ts +2 -2
- package/dist/src/core/furnace-staleness.js +2 -2
- package/dist/src/core/furnace-state-persist.d.ts +10 -10
- package/dist/src/core/furnace-state-persist.js +10 -10
- package/dist/src/core/furnace-step-errors.d.ts +6 -6
- package/dist/src/core/furnace-step-errors.js +6 -6
- package/dist/src/core/furnace-validate-accessibility.js +14 -14
- package/dist/src/core/furnace-validate-compatibility.js +9 -9
- package/dist/src/core/furnace-validate-registration.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +13 -13
- package/dist/src/core/furnace-validate-structure.d.ts +1 -1
- package/dist/src/core/furnace-validate-structure.js +4 -4
- package/dist/src/core/furnace-validate.js +9 -9
- package/dist/src/core/furnace-version-drift.d.ts +5 -5
- package/dist/src/core/furnace-version-drift.js +5 -5
- package/dist/src/core/git-base.d.ts +4 -4
- package/dist/src/core/git-base.js +9 -9
- package/dist/src/core/git-diff-new-file.d.ts +4 -4
- package/dist/src/core/git-diff-new-file.js +8 -8
- package/dist/src/core/git-diff.d.ts +4 -4
- package/dist/src/core/git-diff.js +35 -34
- package/dist/src/core/git-file-ops.d.ts +6 -6
- package/dist/src/core/git-file-ops.js +7 -7
- package/dist/src/core/git-readonly-index.d.ts +12 -12
- package/dist/src/core/git-readonly-index.js +12 -12
- package/dist/src/core/git-status.d.ts +4 -4
- package/dist/src/core/git-status.js +4 -4
- package/dist/src/core/git.d.ts +3 -3
- package/dist/src/core/git.js +14 -14
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +20 -20
- package/dist/src/core/history-log.d.ts +3 -3
- package/dist/src/core/history-log.js +3 -3
- package/dist/src/core/license-headers.d.ts +19 -18
- package/dist/src/core/license-headers.js +29 -28
- package/dist/src/core/mach-build-artifacts.d.ts +21 -21
- package/dist/src/core/mach-build-artifacts.js +23 -23
- package/dist/src/core/mach-error-hints.d.ts +5 -5
- package/dist/src/core/mach-error-hints.js +13 -13
- package/dist/src/core/mach-known-noise-filter.d.ts +41 -38
- package/dist/src/core/mach-known-noise-filter.js +53 -50
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +15 -15
- package/dist/src/core/mach-python.d.ts +2 -1
- package/dist/src/core/mach-python.js +4 -3
- package/dist/src/core/mach-resource-shim.d.ts +12 -12
- package/dist/src/core/mach-resource-shim.js +20 -20
- package/dist/src/core/mach.d.ts +23 -23
- package/dist/src/core/mach.js +36 -36
- package/dist/src/core/marionette-port.d.ts +15 -13
- package/dist/src/core/marionette-port.js +34 -31
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +23 -23
- package/dist/src/core/markdown-table.d.ts +9 -9
- package/dist/src/core/markdown-table.js +14 -14
- package/dist/src/core/mochitest-server-port.d.ts +8 -8
- package/dist/src/core/mochitest-server-port.js +14 -14
- package/dist/src/core/module-resolution-preflight.d.ts +8 -8
- package/dist/src/core/module-resolution-preflight.js +11 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
- package/dist/src/core/moz-manifest-helpers.js +7 -7
- package/dist/src/core/moz-manifest-register.d.ts +1 -1
- package/dist/src/core/moz-manifest-register.js +2 -2
- package/dist/src/core/moz-manifest-rules.js +11 -11
- package/dist/src/core/moz-manifest-tokenizers.js +1 -1
- package/dist/src/core/ownership-table.d.ts +5 -5
- package/dist/src/core/ownership-table.js +7 -7
- package/dist/src/core/parser-fallback.d.ts +3 -3
- package/dist/src/core/parser-fallback.js +3 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
- package/dist/src/core/patch-apply-fuzz.js +9 -9
- package/dist/src/core/patch-apply.d.ts +9 -9
- package/dist/src/core/patch-apply.js +30 -30
- package/dist/src/core/patch-export-update.d.ts +4 -4
- package/dist/src/core/patch-export-update.js +3 -3
- package/dist/src/core/patch-export.d.ts +10 -10
- package/dist/src/core/patch-export.js +13 -13
- package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
- package/dist/src/core/patch-identifier-suggest.js +4 -4
- package/dist/src/core/patch-lint-binary.d.ts +7 -7
- package/dist/src/core/patch-lint-cache.d.ts +2 -2
- package/dist/src/core/patch-lint-cache.js +13 -13
- package/dist/src/core/patch-lint-checkjs.d.ts +26 -26
- package/dist/src/core/patch-lint-checkjs.js +42 -41
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
- package/dist/src/core/patch-lint-creators.d.ts +3 -3
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +13 -13
- package/dist/src/core/patch-lint-cross.js +21 -21
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +5 -5
- package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
- package/dist/src/core/patch-lint-diff-tag.js +5 -5
- package/dist/src/core/patch-lint-diff.d.ts +4 -4
- package/dist/src/core/patch-lint-diff.js +4 -4
- package/dist/src/core/patch-lint-file-size.d.ts +3 -3
- package/dist/src/core/patch-lint-file-size.js +3 -3
- package/dist/src/core/patch-lint-forward-registration.d.ts +4 -4
- package/dist/src/core/patch-lint-forward-registration.js +12 -12
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +11 -11
- package/dist/src/core/patch-lint-module-registration.d.ts +1 -1
- package/dist/src/core/patch-lint-module-registration.js +1 -1
- package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
- package/dist/src/core/patch-lint-mozbuild.js +10 -10
- package/dist/src/core/patch-lint-observer.d.ts +3 -3
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint-ownership.d.ts +6 -6
- package/dist/src/core/patch-lint-ownership.js +6 -6
- package/dist/src/core/patch-lint-prettier.d.ts +6 -6
- package/dist/src/core/patch-lint-prettier.js +6 -6
- package/dist/src/core/patch-lint-queue-types.d.ts +1 -1
- package/dist/src/core/patch-lint-queue-types.js +1 -1
- package/dist/src/core/patch-lint-staged-registration.d.ts +2 -2
- package/dist/src/core/patch-lint-staged-registration.js +6 -6
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +27 -26
- package/dist/src/core/patch-lint.js +48 -46
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +8 -8
- package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
- package/dist/src/core/patch-manifest-consistency.js +16 -17
- package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
- package/dist/src/core/patch-manifest-files-affected.js +3 -3
- package/dist/src/core/patch-manifest-io.d.ts +14 -14
- package/dist/src/core/patch-manifest-io.js +27 -27
- package/dist/src/core/patch-manifest-query.d.ts +1 -1
- package/dist/src/core/patch-manifest-query.js +4 -4
- package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
- package/dist/src/core/patch-manifest-resolve.js +7 -7
- package/dist/src/core/patch-manifest-validate.js +3 -3
- package/dist/src/core/patch-manifest.d.ts +2 -2
- package/dist/src/core/patch-manifest.js +2 -2
- package/dist/src/core/patch-parse.d.ts +14 -14
- package/dist/src/core/patch-parse.js +16 -16
- package/dist/src/core/patch-registration-refs.d.ts +4 -4
- package/dist/src/core/patch-registration-refs.js +7 -7
- package/dist/src/core/patch-transform.d.ts +8 -8
- package/dist/src/core/patch-transform.js +13 -13
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +5 -5
- package/dist/src/core/rebase-session.d.ts +7 -7
- package/dist/src/core/rebase-session.js +8 -8
- package/dist/src/core/register-result.d.ts +1 -1
- package/dist/src/core/register-result.js +1 -1
- package/dist/src/core/register-scaffold.d.ts +2 -2
- package/dist/src/core/register-scaffold.js +3 -3
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +4 -4
- package/dist/src/core/register-xpcshell-test.d.ts +2 -2
- package/dist/src/core/register-xpcshell-test.js +2 -2
- package/dist/src/core/run-log-redact.d.ts +12 -12
- package/dist/src/core/run-log-redact.js +16 -16
- package/dist/src/core/run-log.d.ts +9 -9
- package/dist/src/core/run-log.js +14 -14
- package/dist/src/core/shared-ftl.d.ts +2 -2
- package/dist/src/core/shared-ftl.js +6 -6
- package/dist/src/core/signal-critical.d.ts +2 -2
- package/dist/src/core/signal-critical.js +2 -2
- package/dist/src/core/smoke-patterns.d.ts +5 -5
- package/dist/src/core/smoke-patterns.js +9 -9
- package/dist/src/core/state-file.d.ts +3 -3
- package/dist/src/core/status-binary.d.ts +8 -8
- package/dist/src/core/status-binary.js +12 -12
- package/dist/src/core/status-classify.d.ts +17 -17
- package/dist/src/core/status-classify.js +11 -11
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +15 -15
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +67 -67
- package/dist/src/core/test-harness-output.d.ts +7 -7
- package/dist/src/core/test-harness-output.js +7 -7
- package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
- package/dist/src/core/test-harness-verdict-notes.js +4 -4
- package/dist/src/core/test-path-scope.d.ts +8 -8
- package/dist/src/core/test-path-scope.js +11 -11
- package/dist/src/core/test-stale-check.d.ts +22 -21
- package/dist/src/core/test-stale-check.js +29 -28
- package/dist/src/core/test-stale-symlink.d.ts +1 -1
- package/dist/src/core/test-stale-symlink.js +1 -1
- package/dist/src/core/test-stall-triage.d.ts +9 -9
- package/dist/src/core/test-stall-triage.js +22 -22
- package/dist/src/core/token-category.d.ts +4 -4
- package/dist/src/core/token-category.js +13 -12
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +17 -9
- package/dist/src/core/token-dark-mode.js +41 -28
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +6 -6
- package/dist/src/core/token-inventory.js +7 -7
- package/dist/src/core/token-manager.d.ts +3 -3
- package/dist/src/core/token-manager.js +21 -21
- package/dist/src/core/token-scaffold.d.ts +4 -4
- package/dist/src/core/token-scaffold.js +4 -4
- package/dist/src/core/token-variant.d.ts +14 -14
- package/dist/src/core/token-variant.js +32 -32
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +22 -22
- package/dist/src/core/tree-cow.d.ts +3 -3
- package/dist/src/core/tree-cow.js +6 -6
- package/dist/src/core/tree-guard.d.ts +3 -3
- package/dist/src/core/tree-guard.js +23 -23
- package/dist/src/core/tree-store.d.ts +15 -15
- package/dist/src/core/tree-store.js +35 -33
- package/dist/src/core/typecheck-shim.d.ts +16 -15
- package/dist/src/core/typecheck-shim.js +26 -25
- package/dist/src/core/typecheck.d.ts +12 -12
- package/dist/src/core/typecheck.js +31 -31
- package/dist/src/core/wire-destroy.d.ts +2 -2
- package/dist/src/core/wire-destroy.js +5 -5
- package/dist/src/core/wire-dom-fragment.d.ts +3 -3
- package/dist/src/core/wire-dom-fragment.js +6 -6
- package/dist/src/core/wire-init.d.ts +2 -2
- package/dist/src/core/wire-init.js +7 -7
- package/dist/src/core/wire-subscript.d.ts +1 -1
- package/dist/src/core/wire-subscript.js +3 -3
- package/dist/src/core/wire-utils.d.ts +9 -9
- package/dist/src/core/wire-utils.js +11 -11
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +26 -26
- package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
- package/dist/src/core/xpcshell-profile-dir.js +7 -7
- package/dist/src/errors/base.d.ts +22 -21
- package/dist/src/errors/base.js +22 -21
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +6 -6
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/git.d.ts +1 -1
- package/dist/src/errors/git.js +1 -1
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +3 -3
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +1 -1
- package/dist/src/errors/run.d.ts +1 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/types/commands/options.d.ts +86 -85
- package/dist/src/types/commands/patches.d.ts +19 -19
- package/dist/src/types/commands/project.d.ts +3 -3
- package/dist/src/types/config.d.ts +24 -23
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/json.d.ts +3 -3
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/typecheck.d.ts +3 -3
- package/dist/src/utils/assert.d.ts +1 -1
- package/dist/src/utils/assert.js +6 -6
- package/dist/src/utils/build-info.d.ts +5 -5
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +5 -5
- package/dist/src/utils/child-env.js +5 -5
- package/dist/src/utils/concurrency.d.ts +2 -2
- package/dist/src/utils/concurrency.js +2 -2
- package/dist/src/utils/elapsed.js +1 -1
- package/dist/src/utils/errors.d.ts +8 -8
- package/dist/src/utils/errors.js +8 -8
- package/dist/src/utils/fs.d.ts +1 -1
- package/dist/src/utils/fs.js +8 -8
- package/dist/src/utils/line-dispatch.d.ts +3 -3
- package/dist/src/utils/line-dispatch.js +5 -5
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.js +11 -11
- package/dist/src/utils/machine-output.js +2 -2
- package/dist/src/utils/options.d.ts +13 -13
- package/dist/src/utils/options.js +20 -20
- package/dist/src/utils/package-root.js +2 -2
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/process-group.d.ts +8 -8
- package/dist/src/utils/process-group.js +19 -19
- package/dist/src/utils/process.d.ts +34 -33
- package/dist/src/utils/process.js +20 -19
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +6 -6
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +7 -7
- package/dist/src/utils/sleep.js +7 -7
- package/dist/src/utils/stdio-drain.d.ts +7 -7
- package/dist/src/utils/stdio-drain.js +8 -8
- package/dist/src/utils/validation.d.ts +11 -12
- package/dist/src/utils/validation.js +20 -21
- package/docs/README.md +2 -2
- package/docs/configuration.md +120 -114
- package/docs/exit-codes.md +63 -58
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +412 -251
- package/docs/machine-output.md +33 -32
- package/docs/patch-workflow.md +48 -45
- package/docs/run-logs.md +62 -58
- package/docs/testing.md +101 -101
- package/docs/verification-trees.md +23 -22
- package/package.json +2 -2
package/dist/src/utils/fs.js
CHANGED
|
@@ -202,9 +202,9 @@ export async function writeFileAtomic(path, content) {
|
|
|
202
202
|
/**
|
|
203
203
|
* Renames the temp file over its destination, retrying transient sharing
|
|
204
204
|
* violations. On Windows, a rename onto a target that another writer is
|
|
205
|
-
* concurrently replacing
|
|
205
|
+
* concurrently replacing (or that an antivirus/indexer briefly holds open)
|
|
206
206
|
* fails with EPERM/EACCES/EBUSY even though the same rename succeeds a moment
|
|
207
|
-
* later
|
|
207
|
+
* later. POSIX renames never hit this. Non-retriable codes and exhausted
|
|
208
208
|
* budgets rethrow, so a genuine permission problem still surfaces.
|
|
209
209
|
*/
|
|
210
210
|
async function renameWithRetries(from, to) {
|
|
@@ -237,7 +237,7 @@ async function syncParentDir(path) {
|
|
|
237
237
|
await directoryHandle?.close();
|
|
238
238
|
}
|
|
239
239
|
catch {
|
|
240
|
-
// Nothing left to do
|
|
240
|
+
// Nothing left to do. The handle is being discarded either way.
|
|
241
241
|
}
|
|
242
242
|
}
|
|
243
243
|
}
|
|
@@ -272,7 +272,7 @@ export async function copyDir(src, dest) {
|
|
|
272
272
|
* artefacts out of their listings without racing the rename.
|
|
273
273
|
*
|
|
274
274
|
* Intentionally anchored so a legitimately-named backup file like
|
|
275
|
-
* `.notes.fireforge-tmp-backup` (no PID+UUID continuation) is
|
|
275
|
+
* `.notes.fireforge-tmp-backup` (no PID+UUID continuation) is not treated
|
|
276
276
|
* as one of our temps. The full shape is `.<filename>.fireforge-tmp-<pid>-<uuid>`.
|
|
277
277
|
*/
|
|
278
278
|
export const FIREFORGE_TMP_PATH_PATTERN = /(^|\/)\.[^/]+\.fireforge-tmp-\d+-[0-9a-f-]{36}$/i;
|
|
@@ -281,8 +281,8 @@ export const FIREFORGE_TMP_PATH_PATTERN = /(^|\/)\.[^/]+\.fireforge-tmp-\d+-[0-9
|
|
|
281
281
|
*
|
|
282
282
|
* Each invocation gets its own path via PID + UUID, so concurrent writers
|
|
283
283
|
* targeting the same destination never interfere with each other. Cleanup of
|
|
284
|
-
* the temp file is the caller's responsibility on error
|
|
285
|
-
*
|
|
284
|
+
* the temp file is the caller's responsibility on error. We intentionally do
|
|
285
|
+
* not glob-delete peer temp files here to avoid racing with other writers.
|
|
286
286
|
*/
|
|
287
287
|
function createAtomicTempPath(path) {
|
|
288
288
|
const directory = dirname(path);
|
|
@@ -306,7 +306,7 @@ function createAtomicTempPath(path) {
|
|
|
306
306
|
export async function checkDiskSpace(path, minBytes, onLowSpace) {
|
|
307
307
|
try {
|
|
308
308
|
const stats = await statfs(path);
|
|
309
|
-
// bavail = blocks available to UNPRIVILEGED users
|
|
309
|
+
// bavail = blocks available to UNPRIVILEGED users. bfree includes the
|
|
310
310
|
// root-reserved blocks (typically 5% on ext4), so it over-reported free
|
|
311
311
|
// space and silently suppressed the low-space warning exactly when it
|
|
312
312
|
// mattered.
|
|
@@ -321,7 +321,7 @@ export async function checkDiskSpace(path, minBytes, onLowSpace) {
|
|
|
321
321
|
}
|
|
322
322
|
catch {
|
|
323
323
|
// statfs may not be available on all platforms or the path may
|
|
324
|
-
// not exist yet
|
|
324
|
+
// not exist yet, so silently degrade rather than blocking the operation.
|
|
325
325
|
return undefined;
|
|
326
326
|
}
|
|
327
327
|
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Line splitting for the smoke-run stream dispatch in `process.ts`. Kept as
|
|
3
|
-
* a sibling so the exec module stays within its size budget
|
|
3
|
+
* a sibling so the exec module stays within its size budget. The contract
|
|
4
4
|
* (terminators, partial-line cap) is documented on the function.
|
|
5
5
|
*/
|
|
6
6
|
/**
|
|
7
7
|
* Drains complete lines from `buffer`, dispatching each to `cb`. Treats
|
|
8
|
-
* `\n`, `\r\n`, and lone `\r` as line terminators
|
|
8
|
+
* `\n`, `\r\n`, and lone `\r` as line terminators. The lone-`\r` case
|
|
9
9
|
* matters for progress-bar style output (mach, cargo) that repaints a line
|
|
10
10
|
* with carriage returns and never sends a newline, which otherwise
|
|
11
11
|
* accumulates indefinitely. A single trailing `\r` is held back since it may
|
|
12
12
|
* be the first half of a `\r\n` pair split across chunks. Returns the
|
|
13
|
-
* remaining partial line
|
|
13
|
+
* remaining partial line. Callers keep accumulating into it.
|
|
14
14
|
*/
|
|
15
15
|
export declare function dispatchCompleteLines(buffer: string, cb: ((line: string) => void) | undefined): string;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
3
|
* Line splitting for the smoke-run stream dispatch in `process.ts`. Kept as
|
|
4
|
-
* a sibling so the exec module stays within its size budget
|
|
4
|
+
* a sibling so the exec module stays within its size budget. The contract
|
|
5
5
|
* (terminators, partial-line cap) is documented on the function.
|
|
6
6
|
*/
|
|
7
7
|
/**
|
|
8
8
|
* Cap on the partial-line tail kept between chunks. A child emitting one
|
|
9
9
|
* enormous line with no terminator (minified JS dumped to stderr, a raw
|
|
10
|
-
* binary blob) would otherwise grow the buffer without bound
|
|
10
|
+
* binary blob) would otherwise grow the buffer without bound: the 50 MB cap
|
|
11
11
|
* guards the collector, not these line buffers. When the tail exceeds the
|
|
12
12
|
* cap it is dispatched as a synthetic (oversized) line so the matchers still
|
|
13
13
|
* see its content, then the buffer resets.
|
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
const MAX_PARTIAL_LINE_SIZE = 1024 * 1024;
|
|
16
16
|
/**
|
|
17
17
|
* Drains complete lines from `buffer`, dispatching each to `cb`. Treats
|
|
18
|
-
* `\n`, `\r\n`, and lone `\r` as line terminators
|
|
18
|
+
* `\n`, `\r\n`, and lone `\r` as line terminators. The lone-`\r` case
|
|
19
19
|
* matters for progress-bar style output (mach, cargo) that repaints a line
|
|
20
20
|
* with carriage returns and never sends a newline, which otherwise
|
|
21
21
|
* accumulates indefinitely. A single trailing `\r` is held back since it may
|
|
22
22
|
* be the first half of a `\r\n` pair split across chunks. Returns the
|
|
23
|
-
* remaining partial line
|
|
23
|
+
* remaining partial line. Callers keep accumulating into it.
|
|
24
24
|
*/
|
|
25
25
|
export function dispatchCompleteLines(buffer, cb) {
|
|
26
26
|
let searchFrom = 0;
|
|
@@ -31,7 +31,7 @@ export function dispatchCompleteLines(buffer, cb) {
|
|
|
31
31
|
if (idx === -1)
|
|
32
32
|
break;
|
|
33
33
|
if (buffer[idx] === '\r' && idx === buffer.length - 1) {
|
|
34
|
-
// Possible first half of a chunk-split \r\n
|
|
34
|
+
// Possible first half of a chunk-split \r\n, so wait for the next chunk.
|
|
35
35
|
break;
|
|
36
36
|
}
|
|
37
37
|
const line = buffer.slice(0, idx);
|
|
@@ -64,9 +64,9 @@ export declare function warn(message: string): void;
|
|
|
64
64
|
export declare const NOTICE_PREFIX = "[FireForge] NOTICE:";
|
|
65
65
|
/**
|
|
66
66
|
* Logs one of FireForge's own "why this is happening / why this is slow"
|
|
67
|
-
* explanations at
|
|
67
|
+
* explanations at warning severity.
|
|
68
68
|
*
|
|
69
|
-
* These lines are not warnings about the operator's code
|
|
69
|
+
* These lines are not warnings about the operator's code. They explain a
|
|
70
70
|
* decision FireForge just made (escalating an incremental build to a full
|
|
71
71
|
* one, sharding a run, skipping a step). Emitted through `info` they are
|
|
72
72
|
* silently dropped by agent-facing output filters that keep only warnings
|
|
@@ -98,10 +98,10 @@ export declare function cancel(message: string): void;
|
|
|
98
98
|
/**
|
|
99
99
|
* Checks whether a prompt result represents a user cancellation.
|
|
100
100
|
*
|
|
101
|
-
* Narrows to `symbol
|
|
101
|
+
* Narrows to `symbol`: clack returns its cancel sentinel as a symbol and
|
|
102
102
|
* `p.isCancel` is itself a type predicate. Returning plain `boolean` erases
|
|
103
103
|
* that narrowing and forces `as string` / `as PatchCategory` casts across
|
|
104
|
-
* the command modules on the
|
|
104
|
+
* the command modules on the non-cancelled branch, where the value is
|
|
105
105
|
* already known not to be the sentinel. Keep the predicate form.
|
|
106
106
|
*/
|
|
107
107
|
export declare function isCancel(value: unknown): value is symbol;
|
package/dist/src/utils/logger.js
CHANGED
|
@@ -6,11 +6,11 @@ let verboseMode = false;
|
|
|
6
6
|
/**
|
|
7
7
|
* Whether machine-output mode is active (`--json` / `--raw`).
|
|
8
8
|
*
|
|
9
|
-
* In machine mode, stdout belongs
|
|
9
|
+
* In machine mode, stdout belongs exclusively to the machine-readable
|
|
10
10
|
* payload: all human-facing diagnostics (intro/outro banners, info, warn,
|
|
11
11
|
* error, steps, notes) are routed to stderr as plain unstyled lines.
|
|
12
|
-
* Otherwise clack's log helpers write styled warnings to stdout
|
|
13
|
-
* JSON body
|
|
12
|
+
* Otherwise clack's log helpers write styled warnings to stdout before the
|
|
13
|
+
* JSON body, and a truncated-directory warning during `status --json` breaks
|
|
14
14
|
* every `JSON.parse(stdout)` consumer.
|
|
15
15
|
*/
|
|
16
16
|
let machineOutputMode = false;
|
|
@@ -35,11 +35,11 @@ export function isMachineOutputMode() {
|
|
|
35
35
|
/**
|
|
36
36
|
* Whether stdout is sealed behind a machine-readable final line.
|
|
37
37
|
*
|
|
38
|
-
* The `FIREFORGE-VERDICT:` contract promises that line as the run's
|
|
39
|
-
* stdout write
|
|
38
|
+
* The `FIREFORGE-VERDICT:` contract promises that line as the run's last
|
|
39
|
+
* stdout write, but emit-then-throw failure paths rethrow into
|
|
40
40
|
* `withErrorHandling`, whose clack error/cancel rendering lands on stdout
|
|
41
41
|
* in non-machine mode, displacing the verdict from the final line. The
|
|
42
|
-
* verdict sink seals stdout the moment it writes
|
|
42
|
+
* verdict sink seals stdout the moment it writes. Every later logger call
|
|
43
43
|
* routes to stderr through the same diagnostic channel machine mode uses.
|
|
44
44
|
* `withErrorHandling`'s finally clears the seal (alongside machine mode).
|
|
45
45
|
*/
|
|
@@ -138,9 +138,9 @@ export function warn(message) {
|
|
|
138
138
|
export const NOTICE_PREFIX = '[FireForge] NOTICE:';
|
|
139
139
|
/**
|
|
140
140
|
* Logs one of FireForge's own "why this is happening / why this is slow"
|
|
141
|
-
* explanations at
|
|
141
|
+
* explanations at warning severity.
|
|
142
142
|
*
|
|
143
|
-
* These lines are not warnings about the operator's code
|
|
143
|
+
* These lines are not warnings about the operator's code. They explain a
|
|
144
144
|
* decision FireForge just made (escalating an incremental build to a full
|
|
145
145
|
* one, sharding a run, skipping a step). Emitted through `info` they are
|
|
146
146
|
* silently dropped by agent-facing output filters that keep only warnings
|
|
@@ -196,7 +196,7 @@ export function formatErrorText(message) {
|
|
|
196
196
|
*/
|
|
197
197
|
export function spinner(initialMessage) {
|
|
198
198
|
if (routeToStderr()) {
|
|
199
|
-
// Spinner progress is diagnostics
|
|
199
|
+
// Spinner progress is diagnostics. Keep stdout clean for the payload.
|
|
200
200
|
return {
|
|
201
201
|
message: (msg) => {
|
|
202
202
|
writeDiagnostic('', msg);
|
|
@@ -251,10 +251,10 @@ export function cancel(message) {
|
|
|
251
251
|
/**
|
|
252
252
|
* Checks whether a prompt result represents a user cancellation.
|
|
253
253
|
*
|
|
254
|
-
* Narrows to `symbol
|
|
254
|
+
* Narrows to `symbol`: clack returns its cancel sentinel as a symbol and
|
|
255
255
|
* `p.isCancel` is itself a type predicate. Returning plain `boolean` erases
|
|
256
256
|
* that narrowing and forces `as string` / `as PatchCategory` casts across
|
|
257
|
-
* the command modules on the
|
|
257
|
+
* the command modules on the non-cancelled branch, where the value is
|
|
258
258
|
* already known not to be the sentinel. Keep the predicate form.
|
|
259
259
|
*/
|
|
260
260
|
export function isCancel(value) {
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
* 1. Success writes exactly one JSON document to stdout.
|
|
12
12
|
* 2. Failure writes exactly one `{ schemaVersion, error, code }` document
|
|
13
13
|
* to stdout, then exits non-zero.
|
|
14
|
-
* 3. Machine mode is engaged
|
|
15
|
-
* including one rendered later by `withErrorHandling
|
|
14
|
+
* 3. Machine mode is engaged before any output, so every diagnostic,
|
|
15
|
+
* including one rendered later by `withErrorHandling`, routes to
|
|
16
16
|
* stderr and cannot corrupt the payload.
|
|
17
17
|
*/
|
|
18
18
|
import { CommandError } from '../errors/base.js';
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
2
|
/**
|
|
3
3
|
* Filters an object to only include keys whose values are not undefined.
|
|
4
|
-
* Designed for use with exactOptionalPropertyTypes
|
|
4
|
+
* Designed for use with exactOptionalPropertyTypes: the result can be
|
|
5
5
|
* spread into typed option objects without assigning undefined to optional
|
|
6
6
|
* properties.
|
|
7
7
|
*
|
|
8
8
|
* Constrained to `object`, not `Record<string, unknown>`: a named interface
|
|
9
9
|
* has no index signature, so the narrower constraint rejects exactly the
|
|
10
10
|
* annotations this helper is most useful with. Nothing in the body needs the
|
|
11
|
-
* index signature
|
|
11
|
+
* index signature, since the key walk goes through `Object.keys`.
|
|
12
12
|
*
|
|
13
13
|
* @param obj - Object to filter
|
|
14
14
|
* @returns The same object with every `undefined`-valued key removed
|
|
@@ -21,7 +21,7 @@ export declare function pickDefined<T extends object>(obj: T): {
|
|
|
21
21
|
* commander's own invalid-argument channel.
|
|
22
22
|
*
|
|
23
23
|
* Commander only treats errors whose `code` is `'commander.invalidArgument'`
|
|
24
|
-
* as argument-validation failures
|
|
24
|
+
* as argument-validation failures. Anything else re-throws out of
|
|
25
25
|
* `parseAsync`, BYPASSING `withErrorHandling` entirely and landing in the
|
|
26
26
|
* bin's `main().catch` as an unformatted `Fatal error: …` dump with exit 1.
|
|
27
27
|
* That covers a plain Error, a `GeneralError`, and even a FireForge
|
|
@@ -62,25 +62,25 @@ export declare const WAIT_LOCK_ENV_VAR = "FIREFORGE_WAIT_LOCK";
|
|
|
62
62
|
* Accepts the raw string too, so it doubles as the option's arg parser (wrap
|
|
63
63
|
* with {@link commanderArgParser} so failures surface through commander's
|
|
64
64
|
* invalid-argument channel). In that role the value is never `undefined`, so
|
|
65
|
-
* the environment fallback cannot leak into flag
|
|
66
|
-
*
|
|
65
|
+
* the environment fallback cannot leak into flag parsing, only into flag
|
|
66
|
+
* absence, which is where it belongs.
|
|
67
67
|
*/
|
|
68
68
|
export declare function resolveWaitLockSeconds(value: string | number | boolean | undefined): number | undefined;
|
|
69
69
|
/**
|
|
70
|
-
* The session-wide wait budget in
|
|
70
|
+
* The session-wide wait budget in milliseconds, or undefined when none is
|
|
71
71
|
* set. Sourced from {@link WAIT_LOCK_ENV_VAR} only.
|
|
72
72
|
*
|
|
73
|
-
* Exists for the
|
|
73
|
+
* Exists for the secondary locks a command takes after the one its
|
|
74
74
|
* `--wait-lock` flag was threaded to. A furnace mutation takes the engine
|
|
75
|
-
* session lock and then `.fireforge/furnace.lock
|
|
75
|
+
* session lock and then `.fireforge/furnace.lock`. Only the first had a
|
|
76
76
|
* budget, so a contended deploy died on the file lock's fixed 30 s while
|
|
77
77
|
* its operator believed a much larger budget was in force. Threading the
|
|
78
|
-
* flag reaches the three furnace commands that declare it
|
|
78
|
+
* flag reaches the three furnace commands that declare it. This reaches
|
|
79
79
|
* the twelve that do not (`create`, `remove`, `rename`, `refresh`, `scan`,
|
|
80
80
|
* `override`, `chrome-doc`, …), which have no flag to thread but are just
|
|
81
81
|
* as contended.
|
|
82
82
|
*
|
|
83
|
-
*
|
|
83
|
+
* Env-only: a flag belongs to one invocation and is passed
|
|
84
84
|
* explicitly where it applies, while the environment is exactly the place a
|
|
85
85
|
* session-wide default is expressed. An explicit budget at a call site
|
|
86
86
|
* always wins over this.
|
|
@@ -98,12 +98,12 @@ export declare function ensureWaitLockOptionEverywhere(command: Command): void;
|
|
|
98
98
|
* Registers the shared `--wait-lock [seconds]` flag on a lock-taking
|
|
99
99
|
* command (the engine session lock for engine-mutating commands, the patch
|
|
100
100
|
* directory lock for queue-mutating ones). The parsed option value is `true`
|
|
101
|
-
* for the bare flag or a validated integer
|
|
101
|
+
* for the bare flag or a validated integer. Feed it through
|
|
102
102
|
* {@link resolveWaitLockSeconds} at the call site to obtain the
|
|
103
103
|
* `waitLockSeconds` for `withEngineSessionLock`/`withPatchDirectoryLock`.
|
|
104
104
|
*
|
|
105
|
-
* A command can take
|
|
106
|
-
* engine session lock and then `.fireforge/furnace.lock`
|
|
105
|
+
* A command can take more than one lock (a furnace mutation takes the
|
|
106
|
+
* engine session lock and then `.fireforge/furnace.lock`) and the budget
|
|
107
107
|
* has to reach all of them or the flag is a half-truth. The secondary locks
|
|
108
108
|
* read the session budget through {@link sessionWaitLockMs} rather than
|
|
109
109
|
* having it threaded to every call site.
|
|
@@ -3,14 +3,14 @@ import { GeneralError, InvalidArgumentError } from '../errors/base.js';
|
|
|
3
3
|
import { toError } from './errors.js';
|
|
4
4
|
/**
|
|
5
5
|
* Filters an object to only include keys whose values are not undefined.
|
|
6
|
-
* Designed for use with exactOptionalPropertyTypes
|
|
6
|
+
* Designed for use with exactOptionalPropertyTypes: the result can be
|
|
7
7
|
* spread into typed option objects without assigning undefined to optional
|
|
8
8
|
* properties.
|
|
9
9
|
*
|
|
10
10
|
* Constrained to `object`, not `Record<string, unknown>`: a named interface
|
|
11
11
|
* has no index signature, so the narrower constraint rejects exactly the
|
|
12
12
|
* annotations this helper is most useful with. Nothing in the body needs the
|
|
13
|
-
* index signature
|
|
13
|
+
* index signature, since the key walk goes through `Object.keys`.
|
|
14
14
|
*
|
|
15
15
|
* @param obj - Object to filter
|
|
16
16
|
* @returns The same object with every `undefined`-valued key removed
|
|
@@ -29,7 +29,7 @@ export function pickDefined(obj) {
|
|
|
29
29
|
* commander's own invalid-argument channel.
|
|
30
30
|
*
|
|
31
31
|
* Commander only treats errors whose `code` is `'commander.invalidArgument'`
|
|
32
|
-
* as argument-validation failures
|
|
32
|
+
* as argument-validation failures. Anything else re-throws out of
|
|
33
33
|
* `parseAsync`, BYPASSING `withErrorHandling` entirely and landing in the
|
|
34
34
|
* bin's `main().catch` as an unformatted `Fatal error: …` dump with exit 1.
|
|
35
35
|
* That covers a plain Error, a `GeneralError`, and even a FireForge
|
|
@@ -87,12 +87,12 @@ function parseWaitLockSeconds(raw) {
|
|
|
87
87
|
* The standing wait budget from {@link WAIT_LOCK_ENV_VAR}, or undefined when
|
|
88
88
|
* it is unset or empty.
|
|
89
89
|
*
|
|
90
|
-
* Exists because a wait budget is a property of the
|
|
90
|
+
* Exists because a wait budget is a property of the session, not of the
|
|
91
91
|
* invocation: a checkout worked by several concurrent agent sessions has a
|
|
92
92
|
* held lock as its normal state, and an unattended loop would otherwise have
|
|
93
|
-
* to thread `--wait-lock` through every command it issues
|
|
94
|
-
* it is easiest to forget, and the failure only shows up once the loop
|
|
95
|
-
* already produced a tail of refusals.
|
|
93
|
+
* to thread `--wait-lock` through every command it issues. That is the one
|
|
94
|
+
* place it is easiest to forget, and the failure only shows up once the loop
|
|
95
|
+
* has already produced a tail of refusals.
|
|
96
96
|
*
|
|
97
97
|
* An unusable value is a usage error rather than a silent fall-back to
|
|
98
98
|
* fail-fast: the operator set it precisely because they did not want to
|
|
@@ -124,8 +124,8 @@ function waitLockSecondsFromEnv() {
|
|
|
124
124
|
* Accepts the raw string too, so it doubles as the option's arg parser (wrap
|
|
125
125
|
* with {@link commanderArgParser} so failures surface through commander's
|
|
126
126
|
* invalid-argument channel). In that role the value is never `undefined`, so
|
|
127
|
-
* the environment fallback cannot leak into flag
|
|
128
|
-
*
|
|
127
|
+
* the environment fallback cannot leak into flag parsing, only into flag
|
|
128
|
+
* absence, which is where it belongs.
|
|
129
129
|
*/
|
|
130
130
|
export function resolveWaitLockSeconds(value) {
|
|
131
131
|
if (value === undefined || value === false) {
|
|
@@ -144,20 +144,20 @@ export function resolveWaitLockSeconds(value) {
|
|
|
144
144
|
return parsed;
|
|
145
145
|
}
|
|
146
146
|
/**
|
|
147
|
-
* The session-wide wait budget in
|
|
147
|
+
* The session-wide wait budget in milliseconds, or undefined when none is
|
|
148
148
|
* set. Sourced from {@link WAIT_LOCK_ENV_VAR} only.
|
|
149
149
|
*
|
|
150
|
-
* Exists for the
|
|
150
|
+
* Exists for the secondary locks a command takes after the one its
|
|
151
151
|
* `--wait-lock` flag was threaded to. A furnace mutation takes the engine
|
|
152
|
-
* session lock and then `.fireforge/furnace.lock
|
|
152
|
+
* session lock and then `.fireforge/furnace.lock`. Only the first had a
|
|
153
153
|
* budget, so a contended deploy died on the file lock's fixed 30 s while
|
|
154
154
|
* its operator believed a much larger budget was in force. Threading the
|
|
155
|
-
* flag reaches the three furnace commands that declare it
|
|
155
|
+
* flag reaches the three furnace commands that declare it. This reaches
|
|
156
156
|
* the twelve that do not (`create`, `remove`, `rename`, `refresh`, `scan`,
|
|
157
157
|
* `override`, `chrome-doc`, …), which have no flag to thread but are just
|
|
158
158
|
* as contended.
|
|
159
159
|
*
|
|
160
|
-
*
|
|
160
|
+
* Env-only: a flag belongs to one invocation and is passed
|
|
161
161
|
* explicitly where it applies, while the environment is exactly the place a
|
|
162
162
|
* session-wide default is expressed. An explicit budget at a call site
|
|
163
163
|
* always wins over this.
|
|
@@ -169,12 +169,12 @@ export function sessionWaitLockMs() {
|
|
|
169
169
|
return seconds === undefined ? undefined : seconds * 1000;
|
|
170
170
|
}
|
|
171
171
|
/**
|
|
172
|
-
* Registers `--wait-lock [seconds]` on a command that takes
|
|
172
|
+
* Registers `--wait-lock [seconds]` on a command that takes no lock, so a
|
|
173
173
|
* scripted sequence can blanket-append the flag without hitting a usage
|
|
174
|
-
* error
|
|
174
|
+
* error. A command that rejects it with "unknown option" kills the whole
|
|
175
175
|
* sequence with a usage error instead of a lock message.
|
|
176
176
|
*
|
|
177
|
-
* The flag is accepted and ignored here
|
|
177
|
+
* The flag is accepted and ignored here, never silently repurposed, and
|
|
178
178
|
* the help text says so, so nobody reads its presence as evidence that this
|
|
179
179
|
* command waits for anything.
|
|
180
180
|
*
|
|
@@ -209,12 +209,12 @@ export function ensureWaitLockOptionEverywhere(command) {
|
|
|
209
209
|
* Registers the shared `--wait-lock [seconds]` flag on a lock-taking
|
|
210
210
|
* command (the engine session lock for engine-mutating commands, the patch
|
|
211
211
|
* directory lock for queue-mutating ones). The parsed option value is `true`
|
|
212
|
-
* for the bare flag or a validated integer
|
|
212
|
+
* for the bare flag or a validated integer. Feed it through
|
|
213
213
|
* {@link resolveWaitLockSeconds} at the call site to obtain the
|
|
214
214
|
* `waitLockSeconds` for `withEngineSessionLock`/`withPatchDirectoryLock`.
|
|
215
215
|
*
|
|
216
|
-
* A command can take
|
|
217
|
-
* engine session lock and then `.fireforge/furnace.lock`
|
|
216
|
+
* A command can take more than one lock (a furnace mutation takes the
|
|
217
|
+
* engine session lock and then `.fireforge/furnace.lock`) and the budget
|
|
218
218
|
* has to reach all of them or the flag is a half-truth. The secondary locks
|
|
219
219
|
* read the session budget through {@link sessionWaitLockMs} rather than
|
|
220
220
|
* having it threaded to every call site.
|
|
@@ -36,8 +36,8 @@ export function getPackageRoot() {
|
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
catch (error) {
|
|
39
|
-
// Absent package.json: keep walking. A package.json that
|
|
40
|
-
// fails to parse is a different
|
|
39
|
+
// Absent package.json: keep walking. A package.json that exists but
|
|
40
|
+
// fails to parse is a different case: walking past it could bind
|
|
41
41
|
// to a wrong ancestor package (any parent exposing bin.fireforge) or
|
|
42
42
|
// end in the unhelpful generic "could not locate" error, hiding the
|
|
43
43
|
// actual syntax problem.
|
|
@@ -7,13 +7,13 @@ export declare function normalizePathSlashes(path: string): string;
|
|
|
7
7
|
* (`browser/base/content/foo.js`).
|
|
8
8
|
*
|
|
9
9
|
* The match is case-insensitive because default macOS and Windows
|
|
10
|
-
* filesystems treat `Engine/` and `engine/` as the same directory
|
|
11
|
-
* lowercase-only check leaves `mach` and the manifest writers
|
|
12
|
-
* against a wrongly-cased prefix. Leading whitespace is ignored so
|
|
10
|
+
* filesystems treat `Engine/` and `engine/` as the same directory. A
|
|
11
|
+
* literal lowercase-only check leaves `mach` and the manifest writers
|
|
12
|
+
* resolving against a wrongly-cased prefix. Leading whitespace is ignored so
|
|
13
13
|
* tab-completed inputs do not slip past the strip.
|
|
14
14
|
*
|
|
15
15
|
* The return value is trimmed of that leading whitespace when the prefix
|
|
16
|
-
* matched, and otherwise passed through verbatim
|
|
16
|
+
* matched, and otherwise passed through verbatim. Callers that care about
|
|
17
17
|
* internal whitespace can trim on their side.
|
|
18
18
|
*
|
|
19
19
|
* @param filePath Path as provided by the user
|
package/dist/src/utils/paths.js
CHANGED
|
@@ -21,13 +21,13 @@ export function normalizePathSlashes(path) {
|
|
|
21
21
|
* (`browser/base/content/foo.js`).
|
|
22
22
|
*
|
|
23
23
|
* The match is case-insensitive because default macOS and Windows
|
|
24
|
-
* filesystems treat `Engine/` and `engine/` as the same directory
|
|
25
|
-
* lowercase-only check leaves `mach` and the manifest writers
|
|
26
|
-
* against a wrongly-cased prefix. Leading whitespace is ignored so
|
|
24
|
+
* filesystems treat `Engine/` and `engine/` as the same directory. A
|
|
25
|
+
* literal lowercase-only check leaves `mach` and the manifest writers
|
|
26
|
+
* resolving against a wrongly-cased prefix. Leading whitespace is ignored so
|
|
27
27
|
* tab-completed inputs do not slip past the strip.
|
|
28
28
|
*
|
|
29
29
|
* The return value is trimmed of that leading whitespace when the prefix
|
|
30
|
-
* matched, and otherwise passed through verbatim
|
|
30
|
+
* matched, and otherwise passed through verbatim. Callers that care about
|
|
31
31
|
* internal whitespace can trim on their side.
|
|
32
32
|
*
|
|
33
33
|
* @param filePath Path as provided by the user
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Process-group kill and post-run sweep helpers for the exec layer. Split
|
|
3
|
-
* out of `process.ts` to keep that file within the per-file line budget
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* out of `process.ts` to keep that file within the per-file line budget.
|
|
4
|
+
* Spawn-based rather than `exec`-based so the two modules do not import
|
|
5
|
+
* each other cyclically.
|
|
6
6
|
*/
|
|
7
7
|
import { type ChildProcess } from 'node:child_process';
|
|
8
8
|
/**
|
|
9
|
-
* Sends `signal` to the child's whole tree: the process
|
|
10
|
-
* (negative-PID kill
|
|
11
|
-
* chains), or a `taskkill /T /F` tree kill plus a direct
|
|
12
|
-
* fallback on Windows. No-ops once the direct child has exited (group
|
|
9
|
+
* Sends `signal` to the child's whole tree: the process group on POSIX
|
|
10
|
+
* (negative-PID kill, which reaches mach → python → firefox →
|
|
11
|
+
* content-process chains), or a `taskkill /T /F` tree kill plus a direct
|
|
12
|
+
* `child.kill` fallback on Windows. No-ops once the direct child has exited (group
|
|
13
13
|
* survivors after exit are the post-run sweep's job, not this function's).
|
|
14
14
|
*
|
|
15
15
|
* A failed group kill falls through to a direct `child.kill` on POSIX too:
|
|
@@ -30,7 +30,7 @@ interface ProcessGroupSurvivor {
|
|
|
30
30
|
* the PID of a child started with `detached: true`): lists survivors,
|
|
31
31
|
* SIGTERMs the group, waits a short grace, escalates to SIGKILL, and warns
|
|
32
32
|
* about anything that still refuses to die. POSIX only (no-op on win32).
|
|
33
|
-
* The only kill target is `-pgid
|
|
33
|
+
* The only kill target is `-pgid`, never anything outside the group.
|
|
34
34
|
* A healthy run costs exactly one `pgrep`.
|
|
35
35
|
*/
|
|
36
36
|
export declare function sweepProcessGroup(pgid: number, graceMs?: number): Promise<{
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
3
|
* Process-group kill and post-run sweep helpers for the exec layer. Split
|
|
4
|
-
* out of `process.ts` to keep that file within the per-file line budget
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* out of `process.ts` to keep that file within the per-file line budget.
|
|
5
|
+
* Spawn-based rather than `exec`-based so the two modules do not import
|
|
6
|
+
* each other cyclically.
|
|
7
7
|
*/
|
|
8
8
|
import { spawn } from 'node:child_process';
|
|
9
9
|
import { getNodeErrorCode } from './errors.js';
|
|
10
10
|
import { verbose, warn } from './logger.js';
|
|
11
11
|
import { sleep } from './sleep.js';
|
|
12
12
|
/**
|
|
13
|
-
* Sends `signal` to the child's whole tree: the process
|
|
14
|
-
* (negative-PID kill
|
|
15
|
-
* chains), or a `taskkill /T /F` tree kill plus a direct
|
|
16
|
-
* fallback on Windows. No-ops once the direct child has exited (group
|
|
13
|
+
* Sends `signal` to the child's whole tree: the process group on POSIX
|
|
14
|
+
* (negative-PID kill, which reaches mach → python → firefox →
|
|
15
|
+
* content-process chains), or a `taskkill /T /F` tree kill plus a direct
|
|
16
|
+
* `child.kill` fallback on Windows. No-ops once the direct child has exited (group
|
|
17
17
|
* survivors after exit are the post-run sweep's job, not this function's).
|
|
18
18
|
*
|
|
19
19
|
* A failed group kill falls through to a direct `child.kill` on POSIX too:
|
|
@@ -38,19 +38,19 @@ export function killProcessTree(child, signal, usesProcessGroup) {
|
|
|
38
38
|
catch {
|
|
39
39
|
// ESRCH/EPERM: the group is gone, or was never created because the
|
|
40
40
|
// platform ignored `detached`. Signal the direct child rather than
|
|
41
|
-
// doing nothing
|
|
41
|
+
// doing nothing, since it may well still be alive. Without this
|
|
42
42
|
// fall-through a failed group kill left the child running.
|
|
43
43
|
child.kill(signal);
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
else {
|
|
47
|
-
// No process group on Windows
|
|
47
|
+
// No process group on Windows, so taskkill /T walks the descendant
|
|
48
48
|
// tree instead. Always forced (/F): there is no SIGTERM analogue,
|
|
49
49
|
// so the grace window only exists on POSIX.
|
|
50
50
|
spawn('taskkill', ['/pid', String(targetPid), '/T', '/F'], {
|
|
51
51
|
stdio: 'ignore',
|
|
52
52
|
}).on('error', () => {
|
|
53
|
-
// taskkill unavailable
|
|
53
|
+
// taskkill unavailable, so nothing more we can do beyond the
|
|
54
54
|
// direct-child kill below.
|
|
55
55
|
});
|
|
56
56
|
child.kill(signal);
|
|
@@ -104,10 +104,10 @@ async function listGroupSurvivors(pgid) {
|
|
|
104
104
|
return [{ pid: -1, command: 'unknown (pgrep unavailable; group still has live members)' }];
|
|
105
105
|
}
|
|
106
106
|
catch (error) {
|
|
107
|
-
// Same errno semantics as `isProcessAlive` (which cannot be called here
|
|
108
|
-
// it probes a single positive pid): only ESRCH proves the group is
|
|
109
|
-
// EPERM means it exists under another uid, and an unrecognized
|
|
110
|
-
// not evidence of absence
|
|
107
|
+
// Same errno semantics as `isProcessAlive` (which cannot be called here,
|
|
108
|
+
// since it probes a single positive pid): only ESRCH proves the group is
|
|
109
|
+
// gone. EPERM means it exists under another uid, and an unrecognized
|
|
110
|
+
// failure is not evidence of absence, so report survivors in both cases.
|
|
111
111
|
if (getNodeErrorCode(error) === 'ESRCH')
|
|
112
112
|
return [];
|
|
113
113
|
return [{ pid: -1, command: 'unknown (pgrep unavailable; group liveness probe denied)' }];
|
|
@@ -128,7 +128,7 @@ function describeSurvivors(list) {
|
|
|
128
128
|
* the PID of a child started with `detached: true`): lists survivors,
|
|
129
129
|
* SIGTERMs the group, waits a short grace, escalates to SIGKILL, and warns
|
|
130
130
|
* about anything that still refuses to die. POSIX only (no-op on win32).
|
|
131
|
-
* The only kill target is `-pgid
|
|
131
|
+
* The only kill target is `-pgid`, never anything outside the group.
|
|
132
132
|
* A healthy run costs exactly one `pgrep`.
|
|
133
133
|
*/
|
|
134
134
|
export async function sweepProcessGroup(pgid, graceMs = SWEEP_GRACE_MS) {
|
|
@@ -143,11 +143,11 @@ export async function sweepProcessGroup(pgid, graceMs = SWEEP_GRACE_MS) {
|
|
|
143
143
|
process.kill(-pgid, 'SIGTERM');
|
|
144
144
|
}
|
|
145
145
|
catch {
|
|
146
|
-
// The group vanished between the listing and the signal
|
|
147
|
-
// escalate against
|
|
146
|
+
// The group vanished between the listing and the signal, so there is
|
|
147
|
+
// nothing left to escalate against. Report the survivors collected so far.
|
|
148
148
|
return { survivors };
|
|
149
149
|
}
|
|
150
|
-
//
|
|
150
|
+
// Ref'd (sleep's default): this wait sits between the group
|
|
151
151
|
// SIGTERM and the post-grace re-list/SIGKILL escalation, awaited from a
|
|
152
152
|
// child 'close' handler after the signal forwarder is disposed. With an
|
|
153
153
|
// unref'd timer nothing keeps the event loop alive, so Node could exit
|
|
@@ -164,7 +164,7 @@ export async function sweepProcessGroup(pgid, graceMs = SWEEP_GRACE_MS) {
|
|
|
164
164
|
// nothing to signal.
|
|
165
165
|
return { survivors };
|
|
166
166
|
}
|
|
167
|
-
//
|
|
167
|
+
// Ref'd (sleep's default): this wait sits between the group
|
|
168
168
|
// SIGTERM and the post-grace re-list/SIGKILL escalation, awaited from a
|
|
169
169
|
// child 'close' handler after the signal forwarder is disposed. With an
|
|
170
170
|
// unref'd timer nothing keeps the event loop alive, so Node could exit
|