@hominis/fireforge 0.45.0 → 0.46.1
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 +409 -446
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +21 -15
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +46 -0
- package/dist/src/cli-usage-error.js +81 -0
- package/dist/src/cli.d.ts +7 -2
- package/dist/src/cli.js +47 -47
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +3 -4
- package/dist/src/commands/build.js +27 -17
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +19 -0
- package/dist/src/commands/destructive-decision.js +31 -0
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -10
- package/dist/src/commands/doctor-check-core.js +0 -8
- 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 -17
- package/dist/src/commands/doctor-orphaned-harness.js +14 -23
- 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 +3 -3
- 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 +3 -1
- package/dist/src/commands/doctor.js +15 -16
- package/dist/src/commands/download.js +50 -37
- package/dist/src/commands/export-all.js +29 -12
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +29 -59
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +12 -12
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +7 -13
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +4 -6
- package/dist/src/commands/export-shared.d.ts +51 -32
- package/dist/src/commands/export-shared.js +17 -32
- package/dist/src/commands/export.js +14 -5
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/authoring-config.d.ts +13 -0
- package/dist/src/commands/furnace/authoring-config.js +19 -0
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +2 -2
- 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 +7 -12
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +6 -9
- 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 +31 -15
- package/dist/src/commands/furnace/create-templates.js +20 -19
- 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 +35 -29
- package/dist/src/commands/furnace/deploy.js +15 -6
- 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 +17 -16
- 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 +43 -34
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +15 -7
- package/dist/src/commands/furnace/remove-mutations.d.ts +9 -10
- package/dist/src/commands/furnace/remove-mutations.js +19 -19
- 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 +4 -8
- package/dist/src/commands/furnace/rename-browser-test.js +10 -15
- 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 +36 -36
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +19 -16
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +28 -0
- package/dist/src/commands/furnace/test-file-name.js +39 -0
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/furnace/validation-output.d.ts +21 -9
- package/dist/src/commands/furnace/validation-output.js +3 -8
- package/dist/src/commands/import.js +22 -29
- package/dist/src/commands/lint-per-patch.d.ts +2 -2
- package/dist/src/commands/lint-per-patch.js +27 -12
- package/dist/src/commands/lint-per-run-checkjs.d.ts +14 -15
- 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 +5 -4
- package/dist/src/commands/lint.js +36 -36
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/manifest.js +1 -1
- package/dist/src/commands/package.js +4 -6
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +19 -20
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +23 -33
- package/dist/src/commands/patch/entry-projection.d.ts +13 -0
- package/dist/src/commands/patch/entry-projection.js +24 -0
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -12
- package/dist/src/commands/patch/lint-ignore.js +33 -44
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +29 -15
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +41 -37
- package/dist/src/commands/patch/move-files.js +5 -14
- 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 +35 -49
- package/dist/src/commands/patch/reorder.js +35 -48
- package/dist/src/commands/patch/split-plan.d.ts +7 -8
- package/dist/src/commands/patch/split-plan.js +10 -13
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +50 -48
- 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 +22 -28
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +20 -30
- package/dist/src/commands/patch-rename-map.d.ts +19 -0
- package/dist/src/commands/patch-rename-map.js +36 -0
- package/dist/src/commands/pending-resolution.d.ts +15 -0
- package/dist/src/commands/pending-resolution.js +25 -0
- package/dist/src/commands/re-export-adjacent.d.ts +25 -3
- package/dist/src/commands/re-export-adjacent.js +40 -24
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +23 -27
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +33 -33
- package/dist/src/commands/re-export-files.d.ts +2 -3
- package/dist/src/commands/re-export-files.js +52 -44
- package/dist/src/commands/re-export-lint.d.ts +29 -30
- package/dist/src/commands/re-export-lint.js +36 -29
- 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 +12 -9
- package/dist/src/commands/re-export-single.d.ts +23 -4
- package/dist/src/commands/re-export-single.js +39 -31
- package/dist/src/commands/re-export.js +35 -17
- package/dist/src/commands/rebase/abort.js +9 -14
- package/dist/src/commands/rebase/continue.js +20 -19
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +5 -5
- package/dist/src/commands/rebase/patch-loop.d.ts +2 -2
- package/dist/src/commands/rebase/patch-loop.js +20 -24
- 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 +21 -13
- package/dist/src/commands/run.d.ts +0 -13
- package/dist/src/commands/run.js +38 -51
- package/dist/src/commands/setup-support.d.ts +16 -4
- package/dist/src/commands/setup-support.js +20 -20
- package/dist/src/commands/setup.js +4 -10
- package/dist/src/commands/source.js +9 -2
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +6 -6
- 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 +5 -5
- 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 +25 -26
- package/dist/src/commands/test-build-phase.d.ts +3 -3
- package/dist/src/commands/test-build-phase.js +48 -24
- 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 +4 -4
- package/dist/src/commands/test-modes.js +4 -5
- package/dist/src/commands/test-register.js +5 -3
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +40 -33
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +17 -17
- package/dist/src/commands/test-verdict.d.ts +19 -5
- package/dist/src/commands/test-verdict.js +26 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +73 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.d.ts +26 -0
- package/dist/src/commands/token-list.js +153 -0
- package/dist/src/commands/token.js +26 -10
- package/dist/src/commands/tree.js +26 -21
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +16 -16
- 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 +17 -16
- 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 -12
- package/dist/src/core/branding.js +6 -5
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +10 -7
- package/dist/src/core/build-audit-platform.d.ts +32 -3
- package/dist/src/core/build-audit-platform.js +153 -13
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +10 -9
- 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 +57 -0
- package/dist/src/core/build-audit-skip.js +112 -0
- 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 +21 -8
- package/dist/src/core/build-audit.js +142 -40
- 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 +48 -31
- package/dist/src/core/build-baseline.js +20 -43
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +18 -17
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +14 -14
- package/dist/src/core/build-prepare.d.ts +4 -12
- package/dist/src/core/build-prepare.js +22 -26
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-paths.d.ts +2 -6
- package/dist/src/core/config-paths.js +4 -2
- package/dist/src/core/config-state.d.ts +0 -6
- package/dist/src/core/config-state.js +3 -21
- package/dist/src/core/config-validate-build-audit.d.ts +8 -0
- package/dist/src/core/config-validate-build-audit.js +80 -0
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +3 -3
- package/dist/src/core/config-validate-patch-policy.d.ts +2 -2
- package/dist/src/core/config-validate-patch-policy.js +3 -3
- package/dist/src/core/config-validate-test-toolchains.d.ts +2 -2
- package/dist/src/core/config-validate-test-toolchains.js +4 -5
- package/dist/src/core/config-validate.js +22 -12
- package/dist/src/core/config.d.ts +12 -12
- package/dist/src/core/config.js +21 -25
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +20 -20
- 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 +22 -23
- 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 +5 -13
- package/dist/src/core/engine-precondition.js +5 -10
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +50 -54
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +10 -10
- package/dist/src/core/file-lock-owner.d.ts +103 -0
- package/dist/src/core/file-lock-owner.js +259 -0
- package/dist/src/core/file-lock.d.ts +14 -19
- package/dist/src/core/file-lock.js +90 -128
- package/dist/src/core/firefox-cache.d.ts +13 -1
- package/dist/src/core/firefox-cache.js +61 -36
- package/dist/src/core/firefox-download.d.ts +15 -0
- package/dist/src/core/firefox-download.js +38 -22
- package/dist/src/core/firefox-extract.d.ts +8 -7
- package/dist/src/core/firefox-extract.js +45 -27
- package/dist/src/core/firefox.d.ts +34 -36
- package/dist/src/core/firefox.js +13 -44
- package/dist/src/core/furnace-apply-dry-run.d.ts +1 -6
- package/dist/src/core/furnace-apply-dry-run.js +2 -8
- 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 -20
- package/dist/src/core/furnace-apply-helpers.js +28 -39
- 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 +13 -11
- 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 +4 -4
- package/dist/src/core/furnace-apply.js +50 -29
- 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 +5 -5
- package/dist/src/core/furnace-config.js +40 -53
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +9 -8
- 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 +20 -0
- package/dist/src/core/furnace-dir-entry.js +21 -0
- 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 +22 -19
- package/dist/src/core/furnace-operation.js +38 -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.d.ts +18 -6
- package/dist/src/core/furnace-refresh.js +5 -8
- package/dist/src/core/furnace-registration-ast.d.ts +2 -3
- package/dist/src/core/furnace-registration-ast.js +9 -12
- 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 +7 -6
- package/dist/src/core/furnace-registration.js +29 -36
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-scanner.js +3 -6
- 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 +12 -12
- 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 +18 -20
- 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 +6 -4
- package/dist/src/core/git-base.js +29 -7
- package/dist/src/core/git-diff-new-file.d.ts +40 -0
- package/dist/src/core/git-diff-new-file.js +119 -0
- package/dist/src/core/git-diff.d.ts +13 -13
- package/dist/src/core/git-diff.js +121 -189
- package/dist/src/core/git-file-ops.d.ts +6 -13
- package/dist/src/core/git-file-ops.js +11 -35
- package/dist/src/core/git-readonly-index.d.ts +12 -14
- package/dist/src/core/git-readonly-index.js +12 -16
- package/dist/src/core/git-status.d.ts +9 -2
- package/dist/src/core/git-status.js +23 -11
- package/dist/src/core/git.d.ts +3 -9
- package/dist/src/core/git.js +28 -57
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +28 -27
- package/dist/src/core/history-log.d.ts +19 -0
- package/dist/src/core/history-log.js +29 -0
- 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 -10
- package/dist/src/core/mach-error-hints.js +14 -14
- package/dist/src/core/mach-known-noise-filter.d.ts +42 -38
- package/dist/src/core/mach-known-noise-filter.js +57 -56
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +17 -16
- package/dist/src/core/mach-python.d.ts +3 -0
- package/dist/src/core/mach-python.js +13 -7
- package/dist/src/core/mach-resource-shim.d.ts +24 -12
- package/dist/src/core/mach-resource-shim.js +124 -21
- package/dist/src/core/mach.d.ts +59 -73
- package/dist/src/core/mach.js +47 -115
- package/dist/src/core/marionette-port.d.ts +15 -30
- package/dist/src/core/marionette-port.js +46 -89
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +32 -50
- 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 +17 -17
- 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 +46 -42
- 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 +13 -13
- package/dist/src/core/patch-apply.d.ts +13 -14
- package/dist/src/core/patch-apply.js +36 -42
- package/dist/src/core/patch-export-coverage.d.ts +0 -9
- package/dist/src/core/patch-export-coverage.js +1 -30
- package/dist/src/core/patch-export-update.d.ts +21 -4
- package/dist/src/core/patch-export-update.js +7 -6
- package/dist/src/core/patch-export.d.ts +20 -30
- package/dist/src/core/patch-export.js +55 -77
- package/dist/src/core/patch-files.d.ts +0 -4
- package/dist/src/core/patch-files.js +0 -11
- 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 +12 -18
- package/dist/src/core/patch-lint-cache.d.ts +18 -2
- package/dist/src/core/patch-lint-cache.js +16 -19
- package/dist/src/core/patch-lint-checkjs.d.ts +55 -38
- package/dist/src/core/patch-lint-checkjs.js +78 -64
- 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 +5 -9
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +27 -19
- package/dist/src/core/patch-lint-cross.js +67 -110
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +15 -11
- 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 +6 -6
- package/dist/src/core/patch-lint-forward-registration.d.ts +58 -0
- package/dist/src/core/patch-lint-forward-registration.js +210 -0
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +46 -46
- package/dist/src/core/patch-lint-module-registration.d.ts +3 -9
- 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 +7 -7
- package/dist/src/core/patch-lint-queue-types.d.ts +60 -0
- package/dist/src/core/patch-lint-queue-types.js +12 -0
- package/dist/src/core/patch-lint-staged-registration.d.ts +61 -0
- package/dist/src/core/patch-lint-staged-registration.js +90 -0
- 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 +41 -35
- package/dist/src/core/patch-lint.js +52 -49
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +11 -11
- 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 +35 -34
- 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 +32 -21
- package/dist/src/core/patch-parse.js +40 -15
- package/dist/src/core/patch-policy.js +15 -27
- 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-source-metadata.d.ts +1 -3
- package/dist/src/core/patch-source-metadata.js +0 -4
- package/dist/src/core/patch-transform.d.ts +8 -16
- package/dist/src/core/patch-transform.js +13 -23
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +6 -6
- package/dist/src/core/rebase-session.d.ts +9 -15
- package/dist/src/core/rebase-session.js +13 -25
- package/dist/src/core/register-browser-content.js +3 -2
- package/dist/src/core/register-browser-test.js +2 -1
- package/dist/src/core/register-module.js +2 -1
- 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 +8 -7
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +6 -5
- 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 +38 -0
- package/dist/src/core/run-log-redact.js +69 -0
- package/dist/src/core/run-log.d.ts +21 -10
- package/dist/src/core/run-log.js +76 -27
- 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 +4 -6
- package/dist/src/core/smoke-patterns.d.ts +5 -6
- package/dist/src/core/smoke-patterns.js +15 -20
- package/dist/src/core/state-file.d.ts +15 -4
- package/dist/src/core/state-file.js +14 -1
- 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 +13 -12
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +40 -25
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +69 -69
- 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 -23
- package/dist/src/core/test-stale-check.js +31 -30
- 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/test-xpcshell-retry.d.ts +26 -7
- package/dist/src/core/test-xpcshell-retry.js +14 -11
- package/dist/src/core/token-category.d.ts +35 -2
- package/dist/src/core/token-category.js +67 -58
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +9 -9
- package/dist/src/core/token-dark-mode.js +13 -25
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +56 -0
- package/dist/src/core/token-inventory.js +109 -0
- package/dist/src/core/token-manager.d.ts +4 -4
- package/dist/src/core/token-manager.js +22 -22
- 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 +52 -53
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +23 -23
- package/dist/src/core/tree-cow.d.ts +3 -5
- package/dist/src/core/tree-cow.js +8 -8
- 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 +39 -38
- 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 +33 -33
- 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 +12 -23
- 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 +16 -28
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +28 -30
- 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 +69 -16
- package/dist/src/errors/base.js +95 -26
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +26 -34
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/config.d.ts +0 -14
- package/dist/src/errors/config.js +13 -34
- package/dist/src/errors/download.d.ts +13 -0
- package/dist/src/errors/download.js +53 -24
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/furnace.js +8 -9
- package/dist/src/errors/git.d.ts +9 -9
- package/dist/src/errors/git.js +21 -31
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +11 -13
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +8 -8
- 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 +155 -200
- 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 +52 -19
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/index.d.ts +0 -1
- 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 +4 -16
- package/dist/src/utils/assert.js +7 -24
- package/dist/src/utils/build-info.d.ts +6 -6
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +7 -6
- 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 +10 -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 +15 -20
- package/dist/src/utils/hash.d.ts +12 -0
- package/dist/src/utils/hash.js +16 -0
- package/dist/src/utils/line-dispatch.d.ts +15 -0
- package/dist/src/utils/line-dispatch.js +48 -0
- 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 +14 -20
- package/dist/src/utils/options.js +26 -27
- package/dist/src/utils/package-root.js +5 -14
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/platform.d.ts +0 -4
- package/dist/src/utils/process-group.d.ts +10 -9
- package/dist/src/utils/process-group.js +37 -36
- package/dist/src/utils/process.d.ts +70 -55
- package/dist/src/utils/process.js +129 -179
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +9 -9
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +26 -0
- package/dist/src/utils/sleep.js +31 -0
- 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 +12 -49
- package/dist/src/utils/validation.js +26 -36
- package/docs/README.md +2 -2
- package/docs/configuration.md +163 -69
- package/docs/exit-codes.md +66 -49
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +414 -247
- package/docs/machine-output.md +58 -34
- package/docs/patch-workflow.md +48 -44
- package/docs/run-logs.md +72 -28
- package/docs/testing.md +105 -98
- package/docs/verification-trees.md +23 -22
- package/package.json +7 -6
- package/dist/src/commands/rebase.d.ts +0 -4
- package/dist/src/commands/rebase.js +0 -5
- package/dist/src/core/patch-artifact-normalize.d.ts +0 -21
- package/dist/src/core/patch-artifact-normalize.js +0 -24
- package/dist/src/core/patch-lint-reexports.d.ts +0 -7
- package/dist/src/core/patch-lint-reexports.js +0 -8
- package/dist/src/core/wire-targets.d.ts +0 -7
- package/dist/src/core/wire-targets.js +0 -8
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
import { InvalidArgumentError as CommanderInvalidArgumentError } from 'commander';
|
|
2
|
+
import { GeneralError, InvalidArgumentError } from '../errors/base.js';
|
|
3
|
+
import { toError } from './errors.js';
|
|
2
4
|
/**
|
|
3
5
|
* Filters an object to only include keys whose values are not undefined.
|
|
4
|
-
* Designed for use with exactOptionalPropertyTypes
|
|
6
|
+
* Designed for use with exactOptionalPropertyTypes: the result can be
|
|
5
7
|
* spread into typed option objects without assigning undefined to optional
|
|
6
8
|
* properties.
|
|
7
9
|
*
|
|
8
10
|
* Constrained to `object`, not `Record<string, unknown>`: a named interface
|
|
9
11
|
* has no index signature, so the narrower constraint rejects exactly the
|
|
10
12
|
* annotations this helper is most useful with. Nothing in the body needs the
|
|
11
|
-
* index signature
|
|
13
|
+
* index signature, since the key walk goes through `Object.keys`.
|
|
12
14
|
*
|
|
13
15
|
* @param obj - Object to filter
|
|
14
16
|
* @returns The same object with every `undefined`-valued key removed
|
|
@@ -22,15 +24,12 @@ export function pickDefined(obj) {
|
|
|
22
24
|
}
|
|
23
25
|
return result;
|
|
24
26
|
}
|
|
25
|
-
import { InvalidArgumentError as CommanderInvalidArgumentError } from 'commander';
|
|
26
|
-
import { GeneralError, InvalidArgumentError } from '../errors/base.js';
|
|
27
|
-
import { toError } from './errors.js';
|
|
28
27
|
/**
|
|
29
28
|
* Wraps an option-argument parser so its failures surface through
|
|
30
29
|
* commander's own invalid-argument channel.
|
|
31
30
|
*
|
|
32
31
|
* Commander only treats errors whose `code` is `'commander.invalidArgument'`
|
|
33
|
-
* as argument-validation failures
|
|
32
|
+
* as argument-validation failures. Anything else re-throws out of
|
|
34
33
|
* `parseAsync`, BYPASSING `withErrorHandling` entirely and landing in the
|
|
35
34
|
* bin's `main().catch` as an unformatted `Fatal error: …` dump with exit 1.
|
|
36
35
|
* That covers a plain Error, a `GeneralError`, and even a FireForge
|
|
@@ -88,12 +87,12 @@ function parseWaitLockSeconds(raw) {
|
|
|
88
87
|
* The standing wait budget from {@link WAIT_LOCK_ENV_VAR}, or undefined when
|
|
89
88
|
* it is unset or empty.
|
|
90
89
|
*
|
|
91
|
-
* 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
|
|
92
91
|
* invocation: a checkout worked by several concurrent agent sessions has a
|
|
93
92
|
* held lock as its normal state, and an unattended loop would otherwise have
|
|
94
|
-
* to thread `--wait-lock` through every command it issues
|
|
95
|
-
* it is easiest to forget, and the failure only shows up once the loop
|
|
96
|
-
* 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.
|
|
97
96
|
*
|
|
98
97
|
* An unusable value is a usage error rather than a silent fall-back to
|
|
99
98
|
* fail-fast: the operator set it precisely because they did not want to
|
|
@@ -106,7 +105,7 @@ function waitLockSecondsFromEnv() {
|
|
|
106
105
|
}
|
|
107
106
|
const parsed = parseWaitLockSeconds(raw);
|
|
108
107
|
if (parsed === undefined) {
|
|
109
|
-
throw new InvalidArgumentError(`${WAIT_LOCK_ENV_VAR} must be an integer in ${
|
|
108
|
+
throw new InvalidArgumentError(`${WAIT_LOCK_ENV_VAR} must be an integer in ${MIN_WAIT_LOCK_SECONDS}..${MAX_WAIT_LOCK_SECONDS} (got "${raw}")`, WAIT_LOCK_ENV_VAR);
|
|
110
109
|
}
|
|
111
110
|
return parsed;
|
|
112
111
|
}
|
|
@@ -125,8 +124,8 @@ function waitLockSecondsFromEnv() {
|
|
|
125
124
|
* Accepts the raw string too, so it doubles as the option's arg parser (wrap
|
|
126
125
|
* with {@link commanderArgParser} so failures surface through commander's
|
|
127
126
|
* invalid-argument channel). In that role the value is never `undefined`, so
|
|
128
|
-
* the environment fallback cannot leak into flag
|
|
129
|
-
*
|
|
127
|
+
* the environment fallback cannot leak into flag parsing, only into flag
|
|
128
|
+
* absence, which is where it belongs.
|
|
130
129
|
*/
|
|
131
130
|
export function resolveWaitLockSeconds(value) {
|
|
132
131
|
if (value === undefined || value === false) {
|
|
@@ -140,25 +139,25 @@ export function resolveWaitLockSeconds(value) {
|
|
|
140
139
|
}
|
|
141
140
|
const parsed = parseWaitLockSeconds(value);
|
|
142
141
|
if (parsed === undefined) {
|
|
143
|
-
throw new GeneralError(`--wait-lock must be an integer in ${
|
|
142
|
+
throw new GeneralError(`--wait-lock must be an integer in ${MIN_WAIT_LOCK_SECONDS}..${MAX_WAIT_LOCK_SECONDS} (got "${value}")`);
|
|
144
143
|
}
|
|
145
144
|
return parsed;
|
|
146
145
|
}
|
|
147
146
|
/**
|
|
148
|
-
* The session-wide wait budget in
|
|
147
|
+
* The session-wide wait budget in milliseconds, or undefined when none is
|
|
149
148
|
* set. Sourced from {@link WAIT_LOCK_ENV_VAR} only.
|
|
150
149
|
*
|
|
151
|
-
* Exists for the
|
|
150
|
+
* Exists for the secondary locks a command takes after the one its
|
|
152
151
|
* `--wait-lock` flag was threaded to. A furnace mutation takes the engine
|
|
153
|
-
* session lock and then `.fireforge/furnace.lock
|
|
152
|
+
* session lock and then `.fireforge/furnace.lock`. Only the first had a
|
|
154
153
|
* budget, so a contended deploy died on the file lock's fixed 30 s while
|
|
155
154
|
* its operator believed a much larger budget was in force. Threading the
|
|
156
|
-
* flag reaches the three furnace commands that declare it
|
|
155
|
+
* flag reaches the three furnace commands that declare it. This reaches
|
|
157
156
|
* the twelve that do not (`create`, `remove`, `rename`, `refresh`, `scan`,
|
|
158
157
|
* `override`, `chrome-doc`, …), which have no flag to thread but are just
|
|
159
158
|
* as contended.
|
|
160
159
|
*
|
|
161
|
-
*
|
|
160
|
+
* Env-only: a flag belongs to one invocation and is passed
|
|
162
161
|
* explicitly where it applies, while the environment is exactly the place a
|
|
163
162
|
* session-wide default is expressed. An explicit budget at a call site
|
|
164
163
|
* always wins over this.
|
|
@@ -170,12 +169,12 @@ export function sessionWaitLockMs() {
|
|
|
170
169
|
return seconds === undefined ? undefined : seconds * 1000;
|
|
171
170
|
}
|
|
172
171
|
/**
|
|
173
|
-
* Registers `--wait-lock [seconds]` on a command that takes
|
|
172
|
+
* Registers `--wait-lock [seconds]` on a command that takes no lock, so a
|
|
174
173
|
* scripted sequence can blanket-append the flag without hitting a usage
|
|
175
|
-
* error
|
|
174
|
+
* error. A command that rejects it with "unknown option" kills the whole
|
|
176
175
|
* sequence with a usage error instead of a lock message.
|
|
177
176
|
*
|
|
178
|
-
* The flag is accepted and ignored here
|
|
177
|
+
* The flag is accepted and ignored here, never silently repurposed, and
|
|
179
178
|
* the help text says so, so nobody reads its presence as evidence that this
|
|
180
179
|
* command waits for anything.
|
|
181
180
|
*
|
|
@@ -191,7 +190,7 @@ function addAcceptedWaitLockOption(command) {
|
|
|
191
190
|
* CLI wiring to add the accept-and-ignore variant only where the honoring
|
|
192
191
|
* one is absent.
|
|
193
192
|
*/
|
|
194
|
-
|
|
193
|
+
function hasWaitLockOption(command) {
|
|
195
194
|
return command.options.some((option) => option.long === '--wait-lock');
|
|
196
195
|
}
|
|
197
196
|
/**
|
|
@@ -210,12 +209,12 @@ export function ensureWaitLockOptionEverywhere(command) {
|
|
|
210
209
|
* Registers the shared `--wait-lock [seconds]` flag on a lock-taking
|
|
211
210
|
* command (the engine session lock for engine-mutating commands, the patch
|
|
212
211
|
* directory lock for queue-mutating ones). The parsed option value is `true`
|
|
213
|
-
* for the bare flag or a validated integer
|
|
212
|
+
* for the bare flag or a validated integer. Feed it through
|
|
214
213
|
* {@link resolveWaitLockSeconds} at the call site to obtain the
|
|
215
214
|
* `waitLockSeconds` for `withEngineSessionLock`/`withPatchDirectoryLock`.
|
|
216
215
|
*
|
|
217
|
-
* A command can take
|
|
218
|
-
* 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
|
|
219
218
|
* has to reach all of them or the flag is a half-truth. The secondary locks
|
|
220
219
|
* read the session budget through {@link sessionWaitLockMs} rather than
|
|
221
220
|
* having it threaded to every call site.
|
|
@@ -3,21 +3,12 @@ import { readFileSync } from 'node:fs';
|
|
|
3
3
|
import { dirname, join } from 'node:path';
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
5
|
import { getNodeErrorCode, toError } from './errors.js';
|
|
6
|
+
import { parseObject } from './parse.js';
|
|
6
7
|
import { isObject } from './validation.js';
|
|
7
|
-
function validatePackageMetadata(data, filePath) {
|
|
8
|
-
if (typeof data !== 'object' || data === null) {
|
|
9
|
-
throw new Error(`Invalid package metadata in ${filePath}: expected an object`);
|
|
10
|
-
}
|
|
11
|
-
const name = 'name' in data ? data.name : undefined;
|
|
12
|
-
const version = 'version' in data ? data.version : undefined;
|
|
13
|
-
if (typeof name !== 'string' || typeof version !== 'string') {
|
|
14
|
-
throw new Error(`Invalid package metadata in ${filePath}: expected string "name" and "version" fields`);
|
|
15
|
-
}
|
|
16
|
-
return { name, version, bin: 'bin' in data ? data.bin : undefined };
|
|
17
|
-
}
|
|
18
8
|
function readPackageMetadata(filePath) {
|
|
19
9
|
const raw = readFileSync(filePath, 'utf-8');
|
|
20
|
-
|
|
10
|
+
const parsed = parseObject(JSON.parse(raw), 'package.json');
|
|
11
|
+
return { name: parsed.string('name'), version: parsed.string('version'), bin: parsed.raw('bin') };
|
|
21
12
|
}
|
|
22
13
|
let cachedPackageRoot;
|
|
23
14
|
/**
|
|
@@ -45,8 +36,8 @@ export function getPackageRoot() {
|
|
|
45
36
|
}
|
|
46
37
|
}
|
|
47
38
|
catch (error) {
|
|
48
|
-
// Absent package.json: keep walking. A package.json that
|
|
49
|
-
// 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
|
|
50
41
|
// to a wrong ancestor package (any parent exposing bin.fireforge) or
|
|
51
42
|
// end in the unhelpful generic "could not locate" error, hiding the
|
|
52
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
|
|
@@ -2,10 +2,6 @@
|
|
|
2
2
|
* Supported operating system platforms.
|
|
3
3
|
*/
|
|
4
4
|
export type Platform = 'darwin' | 'linux' | 'win32';
|
|
5
|
-
/**
|
|
6
|
-
* Supported CPU architectures.
|
|
7
|
-
*/
|
|
8
|
-
export type Arch = 'x64' | 'arm64';
|
|
9
5
|
/**
|
|
10
6
|
* Gets the current operating system platform.
|
|
11
7
|
* @throws Error if running on an unsupported platform
|
|
@@ -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:
|
|
@@ -19,7 +19,7 @@ import { type ChildProcess } from 'node:child_process';
|
|
|
19
19
|
*/
|
|
20
20
|
export declare function killProcessTree(child: ChildProcess, signal: NodeJS.Signals, usesProcessGroup: boolean): void;
|
|
21
21
|
/** One process still alive in a swept group. */
|
|
22
|
-
|
|
22
|
+
interface ProcessGroupSurvivor {
|
|
23
23
|
/** PID, or -1 when pgrep was unavailable and only a liveness probe ran. */
|
|
24
24
|
pid: number;
|
|
25
25
|
/** Command line (pgrep -lf output), best-effort. */
|
|
@@ -30,9 +30,10 @@ export 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<{
|
|
37
37
|
survivors: ProcessGroupSurvivor[];
|
|
38
38
|
}>;
|
|
39
|
+
export {};
|
|
@@ -1,18 +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
|
+
import { sleep } from './sleep.js';
|
|
11
12
|
/**
|
|
12
|
-
* Sends `signal` to the child's whole tree: the process
|
|
13
|
-
* (negative-PID kill
|
|
14
|
-
* chains), or a `taskkill /T /F` tree kill plus a direct
|
|
15
|
-
* 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
|
|
16
17
|
* survivors after exit are the post-run sweep's job, not this function's).
|
|
17
18
|
*
|
|
18
19
|
* A failed group kill falls through to a direct `child.kill` on POSIX too:
|
|
@@ -37,19 +38,19 @@ export function killProcessTree(child, signal, usesProcessGroup) {
|
|
|
37
38
|
catch {
|
|
38
39
|
// ESRCH/EPERM: the group is gone, or was never created because the
|
|
39
40
|
// platform ignored `detached`. Signal the direct child rather than
|
|
40
|
-
// doing nothing
|
|
41
|
+
// doing nothing, since it may well still be alive. Without this
|
|
41
42
|
// fall-through a failed group kill left the child running.
|
|
42
43
|
child.kill(signal);
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
46
|
else {
|
|
46
|
-
// No process group on Windows
|
|
47
|
+
// No process group on Windows, so taskkill /T walks the descendant
|
|
47
48
|
// tree instead. Always forced (/F): there is no SIGTERM analogue,
|
|
48
49
|
// so the grace window only exists on POSIX.
|
|
49
50
|
spawn('taskkill', ['/pid', String(targetPid), '/T', '/F'], {
|
|
50
51
|
stdio: 'ignore',
|
|
51
52
|
}).on('error', () => {
|
|
52
|
-
// taskkill unavailable
|
|
53
|
+
// taskkill unavailable, so nothing more we can do beyond the
|
|
53
54
|
// direct-child kill below.
|
|
54
55
|
});
|
|
55
56
|
child.kill(signal);
|
|
@@ -61,18 +62,6 @@ export function killProcessTree(child, signal, usesProcessGroup) {
|
|
|
61
62
|
}
|
|
62
63
|
const SWEEP_GRACE_MS = 2000;
|
|
63
64
|
const MULTIPROCESSING_WORKER_PATTERN = /multiprocessing\.(?:spawn|forkserver)|resource_tracker/;
|
|
64
|
-
function sweepDelay(ms) {
|
|
65
|
-
// Deliberately ref'd (no unref()): this promise is AWAITED between the
|
|
66
|
-
// group SIGTERM and the post-grace re-list/SIGKILL escalation, from a
|
|
67
|
-
// child 'close' handler after the signal forwarder is disposed — with an
|
|
68
|
-
// unref'd timer nothing kept the event loop alive, so Node could exit
|
|
69
|
-
// mid-grace and skip the escalation entirely. Healthy runs never reach
|
|
70
|
-
// this function (sweepProcessGroup early-returns on zero survivors), so
|
|
71
|
-
// the ref never holds a clean exit open.
|
|
72
|
-
return new Promise((resolve) => {
|
|
73
|
-
setTimeout(resolve, ms);
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
65
|
/**
|
|
77
66
|
* Minimal spawn-based pgrep runner. exitCode -1 means pgrep itself was
|
|
78
67
|
* unavailable or errored (distinct from exit 1 = "no matches").
|
|
@@ -115,10 +104,10 @@ async function listGroupSurvivors(pgid) {
|
|
|
115
104
|
return [{ pid: -1, command: 'unknown (pgrep unavailable; group still has live members)' }];
|
|
116
105
|
}
|
|
117
106
|
catch (error) {
|
|
118
|
-
// Same errno semantics as `isProcessAlive` (which cannot be called here
|
|
119
|
-
// it probes a single positive pid): only ESRCH proves the group is
|
|
120
|
-
// EPERM means it exists under another uid, and an unrecognized
|
|
121
|
-
// 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.
|
|
122
111
|
if (getNodeErrorCode(error) === 'ESRCH')
|
|
123
112
|
return [];
|
|
124
113
|
return [{ pid: -1, command: 'unknown (pgrep unavailable; group liveness probe denied)' }];
|
|
@@ -130,7 +119,7 @@ function describeSurvivors(list) {
|
|
|
130
119
|
const tag = MULTIPROCESSING_WORKER_PATTERN.test(s.command)
|
|
131
120
|
? ' [multiprocessing worker — the known busy-spin orphan shape]'
|
|
132
121
|
: '';
|
|
133
|
-
return `PID ${
|
|
122
|
+
return `PID ${s.pid}: ${s.command}${tag}`;
|
|
134
123
|
})
|
|
135
124
|
.join('; ');
|
|
136
125
|
}
|
|
@@ -139,7 +128,7 @@ function describeSurvivors(list) {
|
|
|
139
128
|
* the PID of a child started with `detached: true`): lists survivors,
|
|
140
129
|
* SIGTERMs the group, waits a short grace, escalates to SIGKILL, and warns
|
|
141
130
|
* about anything that still refuses to die. POSIX only (no-op on win32).
|
|
142
|
-
* The only kill target is `-pgid
|
|
131
|
+
* The only kill target is `-pgid`, never anything outside the group.
|
|
143
132
|
* A healthy run costs exactly one `pgrep`.
|
|
144
133
|
*/
|
|
145
134
|
export async function sweepProcessGroup(pgid, graceMs = SWEEP_GRACE_MS) {
|
|
@@ -148,17 +137,23 @@ export async function sweepProcessGroup(pgid, graceMs = SWEEP_GRACE_MS) {
|
|
|
148
137
|
const survivors = await listGroupSurvivors(pgid);
|
|
149
138
|
if (survivors.length === 0)
|
|
150
139
|
return { survivors };
|
|
151
|
-
warn(`Harness process group ${
|
|
140
|
+
warn(`Harness process group ${pgid} left ${survivors.length} surviving ` +
|
|
152
141
|
`process(es) after exit — reaping the group. ${describeSurvivors(survivors)}`);
|
|
153
142
|
try {
|
|
154
143
|
process.kill(-pgid, 'SIGTERM');
|
|
155
144
|
}
|
|
156
145
|
catch {
|
|
157
|
-
// The group vanished between the listing and the signal
|
|
158
|
-
// 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.
|
|
159
148
|
return { survivors };
|
|
160
149
|
}
|
|
161
|
-
|
|
150
|
+
// Ref'd (sleep's default): this wait sits between the group
|
|
151
|
+
// SIGTERM and the post-grace re-list/SIGKILL escalation, awaited from a
|
|
152
|
+
// child 'close' handler after the signal forwarder is disposed. With an
|
|
153
|
+
// unref'd timer nothing keeps the event loop alive, so Node could exit
|
|
154
|
+
// mid-grace and skip the escalation entirely. Healthy runs never reach
|
|
155
|
+
// here (sweepProcessGroup early-returns on zero survivors).
|
|
156
|
+
await sleep(graceMs);
|
|
162
157
|
let remaining = await listGroupSurvivors(pgid);
|
|
163
158
|
if (remaining.length > 0) {
|
|
164
159
|
try {
|
|
@@ -169,18 +164,24 @@ export async function sweepProcessGroup(pgid, graceMs = SWEEP_GRACE_MS) {
|
|
|
169
164
|
// nothing to signal.
|
|
170
165
|
return { survivors };
|
|
171
166
|
}
|
|
172
|
-
|
|
167
|
+
// Ref'd (sleep's default): this wait sits between the group
|
|
168
|
+
// SIGTERM and the post-grace re-list/SIGKILL escalation, awaited from a
|
|
169
|
+
// child 'close' handler after the signal forwarder is disposed. With an
|
|
170
|
+
// unref'd timer nothing keeps the event loop alive, so Node could exit
|
|
171
|
+
// mid-grace and skip the escalation entirely. Healthy runs never reach
|
|
172
|
+
// here (sweepProcessGroup early-returns on zero survivors).
|
|
173
|
+
await sleep(Math.min(200, graceMs));
|
|
173
174
|
remaining = await listGroupSurvivors(pgid);
|
|
174
175
|
if (remaining.length > 0) {
|
|
175
|
-
warn(`Process group ${
|
|
176
|
+
warn(`Process group ${pgid} still has survivors after SIGKILL: ${describeSurvivors(remaining)}. ` +
|
|
176
177
|
'Inspect manually (ps -axo pid,ppid,time,command) and kill by PID.');
|
|
177
178
|
}
|
|
178
179
|
else {
|
|
179
|
-
verbose(`Process group ${
|
|
180
|
+
verbose(`Process group ${pgid} reaped after SIGKILL escalation.`);
|
|
180
181
|
}
|
|
181
182
|
}
|
|
182
183
|
else {
|
|
183
|
-
verbose(`Process group ${
|
|
184
|
+
verbose(`Process group ${pgid} reaped cleanly with SIGTERM.`);
|
|
184
185
|
}
|
|
185
186
|
return { survivors };
|
|
186
187
|
}
|