@hominis/fireforge 0.46.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 +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 +9 -9
- package/dist/src/core/token-dark-mode.js +11 -11
- 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
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Toolchain-minimum awareness for Firefox source hops.
|
|
3
3
|
*
|
|
4
|
-
* When `fireforge download --force` moves the engine to a new Firefox
|
|
4
|
+
* When `fireforge download --force` moves the engine to a new Firefox major
|
|
5
5
|
* version, the tree's declared toolchain minimums (cbindgen, Rust)
|
|
6
|
-
* frequently move with it
|
|
6
|
+
* frequently move with it, and the first `fireforge build` then dies a few
|
|
7
7
|
* seconds into `mach configure` with a message whose remediation text names
|
|
8
8
|
* `./mach bootstrap`, the wrong tool for a FireForge-managed repo (e.g.
|
|
9
9
|
* `ERROR: cbindgen version 0.29.1 is too old. At least version 0.29.4 is
|
|
10
10
|
* required.`).
|
|
11
11
|
*
|
|
12
12
|
* Two layers:
|
|
13
|
-
* 1. {@link formatMajorVersionHopNotice}
|
|
13
|
+
* 1. {@link formatMajorVersionHopNotice}, a post-download nudge when the
|
|
14
14
|
* downloaded major differs from the previously downloaded one.
|
|
15
|
-
* 2. {@link runToolchainPreflight}
|
|
15
|
+
* 2. {@link runToolchainPreflight}, a cheap pre-build probe comparing the
|
|
16
16
|
* minimums the tree itself declares against the host binaries
|
|
17
17
|
* `mach configure` will resolve, probing configure's own candidate
|
|
18
18
|
* order: env override first, then the `~/.mozbuild` state-directory copy
|
|
19
19
|
* bootstrap installs, then PATH. Probing env-or-PATH alone blocks builds
|
|
20
20
|
* whose current tool lives in the state dir behind a stale PATH copy.
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
21
|
+
* Fail-soft: it reports a mismatch only when a minimum was positively
|
|
22
|
+
* parsed, at least one candidate resolved, and every resolved candidate
|
|
23
|
+
* is definitively lower. Any uncertainty (file moved upstream,
|
|
24
|
+
* unparseable output, no candidate found) skips silently. The
|
|
25
25
|
* mach-error-hints translator still catches the real configure failure
|
|
26
26
|
* downstream.
|
|
27
27
|
*/
|
|
@@ -41,16 +41,16 @@ export interface ToolchainMismatch {
|
|
|
41
41
|
/** Engine-relative file the minimum was parsed from. */
|
|
42
42
|
declaredIn: string;
|
|
43
43
|
/**
|
|
44
|
-
* Every candidate that resolved
|
|
44
|
+
* Every candidate that resolved, all of them below the minimum
|
|
45
45
|
* (mach-resolution order: env override, mozbuild state dir, PATH).
|
|
46
46
|
*/
|
|
47
47
|
candidates: ToolchainCandidate[];
|
|
48
48
|
}
|
|
49
49
|
/**
|
|
50
50
|
* Returns the one-line notice to print after a download that hopped the
|
|
51
|
-
* Firefox
|
|
52
|
-
* download, same major, or unparseable versions
|
|
53
|
-
* must not spam every download with a false hint).
|
|
51
|
+
* Firefox major version, or undefined when no notice is warranted (first
|
|
52
|
+
* download, same major, or unparseable versions, since an unparseable
|
|
53
|
+
* version must not spam every download with a false hint).
|
|
54
54
|
*
|
|
55
55
|
* @param previousVersion - `downloadedVersion` recorded in state before this download
|
|
56
56
|
* @param newVersion - Version that was just downloaded
|
|
@@ -59,14 +59,14 @@ export declare function formatMajorVersionHopNotice(previousVersion: string | un
|
|
|
59
59
|
/**
|
|
60
60
|
* Reads the toolchain minimums the engine tree itself declares. Any file
|
|
61
61
|
* that is missing or no longer matches the expected declaration shape
|
|
62
|
-
* yields undefined for that tool
|
|
62
|
+
* yields undefined for that tool, never an error.
|
|
63
63
|
*/
|
|
64
64
|
export declare function readDeclaredToolchainMinimums(engineDir: string): Promise<Partial<Record<ToolchainTool, string>>>;
|
|
65
65
|
/**
|
|
66
66
|
* Compares the tree-declared toolchain minimums against the host binaries
|
|
67
67
|
* `mach configure` will resolve, in configure's own candidate order (env
|
|
68
|
-
* override, mozbuild state dir, PATH). A tool fails
|
|
69
|
-
* one candidate resolved and none of them meets the minimum
|
|
68
|
+
* override, mozbuild state dir, PATH). A tool fails only when at least
|
|
69
|
+
* one candidate resolved and none of them meets the minimum. Any single
|
|
70
70
|
* passing candidate passes the tool (configure will find it), and a tool
|
|
71
71
|
* with no resolvable candidate skips silently (see module header for the
|
|
72
72
|
* fail-soft rationale).
|
|
@@ -2,27 +2,27 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Toolchain-minimum awareness for Firefox source hops.
|
|
4
4
|
*
|
|
5
|
-
* When `fireforge download --force` moves the engine to a new Firefox
|
|
5
|
+
* When `fireforge download --force` moves the engine to a new Firefox major
|
|
6
6
|
* version, the tree's declared toolchain minimums (cbindgen, Rust)
|
|
7
|
-
* frequently move with it
|
|
7
|
+
* frequently move with it, and the first `fireforge build` then dies a few
|
|
8
8
|
* seconds into `mach configure` with a message whose remediation text names
|
|
9
9
|
* `./mach bootstrap`, the wrong tool for a FireForge-managed repo (e.g.
|
|
10
10
|
* `ERROR: cbindgen version 0.29.1 is too old. At least version 0.29.4 is
|
|
11
11
|
* required.`).
|
|
12
12
|
*
|
|
13
13
|
* Two layers:
|
|
14
|
-
* 1. {@link formatMajorVersionHopNotice}
|
|
14
|
+
* 1. {@link formatMajorVersionHopNotice}, a post-download nudge when the
|
|
15
15
|
* downloaded major differs from the previously downloaded one.
|
|
16
|
-
* 2. {@link runToolchainPreflight}
|
|
16
|
+
* 2. {@link runToolchainPreflight}, a cheap pre-build probe comparing the
|
|
17
17
|
* minimums the tree itself declares against the host binaries
|
|
18
18
|
* `mach configure` will resolve, probing configure's own candidate
|
|
19
19
|
* order: env override first, then the `~/.mozbuild` state-directory copy
|
|
20
20
|
* bootstrap installs, then PATH. Probing env-or-PATH alone blocks builds
|
|
21
21
|
* whose current tool lives in the state dir behind a stale PATH copy.
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
22
|
+
* Fail-soft: it reports a mismatch only when a minimum was positively
|
|
23
|
+
* parsed, at least one candidate resolved, and every resolved candidate
|
|
24
|
+
* is definitively lower. Any uncertainty (file moved upstream,
|
|
25
|
+
* unparseable output, no candidate found) skips silently. The
|
|
26
26
|
* mach-error-hints translator still catches the real configure failure
|
|
27
27
|
* downstream.
|
|
28
28
|
*/
|
|
@@ -62,16 +62,16 @@ const MINIMUM_DECLARATIONS = {
|
|
|
62
62
|
*
|
|
63
63
|
* `stateDirRelPaths` are the mach-state-directory locations
|
|
64
64
|
* `fireforge bootstrap` (via mozboot) installs the tool to. mach's configure
|
|
65
|
-
* tries the state directory
|
|
66
|
-
*
|
|
67
|
-
*
|
|
65
|
+
* tries the state directory before the PATH candidates (bindgen.configure's
|
|
66
|
+
* toolchain search path lists `~/.mozbuild/cbindgen/cbindgen` first), so the
|
|
67
|
+
* probe must too. Probing only env-or-PATH fails a
|
|
68
68
|
* build configure would have accepted whenever an old `~/.cargo/bin/
|
|
69
69
|
* cbindgen` shadows a current bootstrap-installed copy. Rust has no
|
|
70
|
-
* state-dir install
|
|
70
|
+
* state-dir install, since rustup owns it, so its list is empty.
|
|
71
71
|
*/
|
|
72
72
|
const HOST_PROBES = {
|
|
73
73
|
// `mach configure` honours the CBINDGEN env option (bindgen.configure's
|
|
74
|
-
// `option(env="CBINDGEN", ...)`), so the probe must too
|
|
74
|
+
// `option(env="CBINDGEN", ...)`), so the probe must too. Otherwise the
|
|
75
75
|
// preflight could veto a build configure would have accepted.
|
|
76
76
|
cbindgen: {
|
|
77
77
|
envVar: 'CBINDGEN',
|
|
@@ -82,7 +82,7 @@ const HOST_PROBES = {
|
|
|
82
82
|
};
|
|
83
83
|
/**
|
|
84
84
|
* Parses a dotted version string into numeric components. Trailing
|
|
85
|
-
* non-numeric suffixes are ignored
|
|
85
|
+
* non-numeric suffixes are ignored. Returns undefined when the string
|
|
86
86
|
* does not start with a number. (Same posture as the furnace version
|
|
87
87
|
* drift classifier, kept local so the two modules stay decoupled.)
|
|
88
88
|
*/
|
|
@@ -92,7 +92,7 @@ function parseVersionComponents(version) {
|
|
|
92
92
|
return undefined;
|
|
93
93
|
return match[1].split('.').map(Number);
|
|
94
94
|
}
|
|
95
|
-
/** Component-wise comparison
|
|
95
|
+
/** Component-wise comparison. Missing components count as 0. */
|
|
96
96
|
function isVersionLower(candidate, minimum) {
|
|
97
97
|
const length = Math.max(candidate.length, minimum.length);
|
|
98
98
|
for (let i = 0; i < length; i += 1) {
|
|
@@ -105,9 +105,9 @@ function isVersionLower(candidate, minimum) {
|
|
|
105
105
|
}
|
|
106
106
|
/**
|
|
107
107
|
* Returns the one-line notice to print after a download that hopped the
|
|
108
|
-
* Firefox
|
|
109
|
-
* download, same major, or unparseable versions
|
|
110
|
-
* must not spam every download with a false hint).
|
|
108
|
+
* Firefox major version, or undefined when no notice is warranted (first
|
|
109
|
+
* download, same major, or unparseable versions, since an unparseable
|
|
110
|
+
* version must not spam every download with a false hint).
|
|
111
111
|
*
|
|
112
112
|
* @param previousVersion - `downloadedVersion` recorded in state before this download
|
|
113
113
|
* @param newVersion - Version that was just downloaded
|
|
@@ -128,7 +128,7 @@ export function formatMajorVersionHopNotice(previousVersion, newVersion) {
|
|
|
128
128
|
/**
|
|
129
129
|
* Reads the toolchain minimums the engine tree itself declares. Any file
|
|
130
130
|
* that is missing or no longer matches the expected declaration shape
|
|
131
|
-
* yields undefined for that tool
|
|
131
|
+
* yields undefined for that tool, never an error.
|
|
132
132
|
*/
|
|
133
133
|
export async function readDeclaredToolchainMinimums(engineDir) {
|
|
134
134
|
const entries = Object.entries(MINIMUM_DECLARATIONS);
|
|
@@ -173,7 +173,7 @@ async function probeBinaryVersion(binary, versionPattern) {
|
|
|
173
173
|
}
|
|
174
174
|
/**
|
|
175
175
|
* Probes every candidate binary for a tool in mach's resolution order:
|
|
176
|
-
* the env override (which, when set, is the
|
|
176
|
+
* the env override (which, when set, is the only candidate, since configure
|
|
177
177
|
* uses it even when a better binary exists elsewhere), then the mozbuild
|
|
178
178
|
* state-directory copy bootstrap installs, then PATH. Candidates that
|
|
179
179
|
* fail to run or to parse are dropped silently.
|
|
@@ -196,8 +196,8 @@ async function probeHostToolCandidates(tool) {
|
|
|
196
196
|
/**
|
|
197
197
|
* Compares the tree-declared toolchain minimums against the host binaries
|
|
198
198
|
* `mach configure` will resolve, in configure's own candidate order (env
|
|
199
|
-
* override, mozbuild state dir, PATH). A tool fails
|
|
200
|
-
* one candidate resolved and none of them meets the minimum
|
|
199
|
+
* override, mozbuild state dir, PATH). A tool fails only when at least
|
|
200
|
+
* one candidate resolved and none of them meets the minimum. Any single
|
|
201
201
|
* passing candidate passes the tool (configure will find it), and a tool
|
|
202
202
|
* with no resolvable candidate skips silently (see module header for the
|
|
203
203
|
* fail-soft rationale).
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Runs a clone command
|
|
1
|
+
/** Runs a clone command. Throws on non-zero exit. */
|
|
2
2
|
export type CloneExecutor = (command: string, args: string[]) => Promise<void>;
|
|
3
3
|
/** How this host can materialise a tree. */
|
|
4
4
|
export type CowCapability = 'clonefile' | 'reflink' | 'none';
|
|
@@ -9,8 +9,8 @@ export type CowCapability = 'clonefile' | 'reflink' | 'none';
|
|
|
9
9
|
export declare function detectCowSupport(dir: string, platform?: NodeJS.Platform, executor?: CloneExecutor): Promise<CowCapability>;
|
|
10
10
|
/**
|
|
11
11
|
* Copies one directory entry (file or directory, recursively) from
|
|
12
|
-
* `sourcePath` to `destinationPath` using the given capability
|
|
12
|
+
* `sourcePath` to `destinationPath` using the given capability:
|
|
13
13
|
* clonefile/reflink when available, a plain physical copy under
|
|
14
|
-
* 'none' (the `--force-copy` path
|
|
14
|
+
* 'none' (the `--force-copy` path, and the caller gates on the flag).
|
|
15
15
|
*/
|
|
16
16
|
export declare function cloneEntry(capability: CowCapability, sourcePath: string, destinationPath: string, platform?: NodeJS.Platform, executor?: CloneExecutor): Promise<void>;
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Copy-on-write cloning for `fireforge tree`.
|
|
4
4
|
*
|
|
5
|
-
* Capability is probed
|
|
6
|
-
* `cp --reflink=always` (btrfs/XFS) in the actual destination
|
|
7
|
-
* so the verdict is truthful for the volume the trees will live
|
|
8
|
-
* filesystem without CoW support
|
|
5
|
+
* Capability is probed by doing it: a tiny `cp -c` (APFS clonefile) or
|
|
6
|
+
* `cp --reflink=always` (btrfs/XFS) runs in the actual destination
|
|
7
|
+
* directory, so the verdict is truthful for the volume the trees will live
|
|
8
|
+
* on. A filesystem without CoW support refuses honestly. `--force-copy` opts
|
|
9
9
|
* into a full physical copy but is never implied (a Firefox tree can be
|
|
10
10
|
* tens of gigabytes).
|
|
11
11
|
*
|
|
@@ -57,9 +57,9 @@ export async function detectCowSupport(dir, platform = process.platform, executo
|
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
59
59
|
* Copies one directory entry (file or directory, recursively) from
|
|
60
|
-
* `sourcePath` to `destinationPath` using the given capability
|
|
60
|
+
* `sourcePath` to `destinationPath` using the given capability:
|
|
61
61
|
* clonefile/reflink when available, a plain physical copy under
|
|
62
|
-
* 'none' (the `--force-copy` path
|
|
62
|
+
* 'none' (the `--force-copy` path, and the caller gates on the flag).
|
|
63
63
|
*/
|
|
64
64
|
export async function cloneEntry(capability, sourcePath, destinationPath, platform = process.platform, executor = defaultExecutor) {
|
|
65
65
|
const args = capability === 'none'
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { type TreeMarker } from './tree-store.js';
|
|
2
2
|
/**
|
|
3
|
-
* Per-command verdicts. `allowed` runs unconditionally
|
|
4
|
-
* runs in a tree
|
|
3
|
+
* Per-command verdicts. `allowed` runs unconditionally. `refused` never
|
|
4
|
+
* runs in a tree. `conditional` consults `TREE_CONDITIONAL_CHECKS` with
|
|
5
5
|
* the invoked subcommand chain, parsed options, and the tree marker.
|
|
6
6
|
*/
|
|
7
7
|
export declare const TREE_COMMAND_VERDICTS: Readonly<Record<string, 'allowed' | 'refused' | 'conditional'>>;
|
|
8
8
|
interface ConditionalInput {
|
|
9
9
|
/** Subcommand chain below the top-level command (e.g. ['staged-dependency']). */
|
|
10
10
|
subcommands: readonly string[];
|
|
11
|
-
/** Merged options of the
|
|
11
|
+
/** Merged options of the action command (leaf). */
|
|
12
12
|
options: Readonly<Record<string, unknown>>;
|
|
13
13
|
/** Positional args of the action command. */
|
|
14
14
|
args: readonly unknown[];
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
*
|
|
5
5
|
* A tree is a snapshot: its `patches/` and `components/` are copies with
|
|
6
6
|
* no merge-back model, so any command that mutates project or engine
|
|
7
|
-
* state must run in the primary tree. Enforcement is
|
|
8
|
-
* explicit verdict table over every top-level command
|
|
7
|
+
* state must run in the primary tree. Enforcement is default-deny via an
|
|
8
|
+
* explicit verdict table over every top-level command, so a newly added
|
|
9
9
|
* command is refused inside trees until its author classifies it (the
|
|
10
|
-
* drift test in `tree-guard.test.ts` fails otherwise)
|
|
10
|
+
* drift test in `tree-guard.test.ts` fails otherwise). It lives in one
|
|
11
11
|
* commander `preAction` hook installed by `createProgram()`, so the
|
|
12
12
|
* guard fires no matter how the cwd ended up inside a tree (`tree exec`
|
|
13
13
|
* or a plain `cd`).
|
|
@@ -17,8 +17,8 @@ import { dirname, join, resolve } from 'node:path';
|
|
|
17
17
|
import { GeneralError } from '../errors/base.js';
|
|
18
18
|
import { getTreeMarkerPath, readTreeMarker, } from './tree-store.js';
|
|
19
19
|
/**
|
|
20
|
-
* Per-command verdicts. `allowed` runs unconditionally
|
|
21
|
-
* runs in a tree
|
|
20
|
+
* Per-command verdicts. `allowed` runs unconditionally. `refused` never
|
|
21
|
+
* runs in a tree. `conditional` consults `TREE_CONDITIONAL_CHECKS` with
|
|
22
22
|
* the invoked subcommand chain, parsed options, and the tree marker.
|
|
23
23
|
*/
|
|
24
24
|
export const TREE_COMMAND_VERDICTS = {
|
|
@@ -41,7 +41,7 @@ export const TREE_COMMAND_VERDICTS = {
|
|
|
41
41
|
package: 'refused',
|
|
42
42
|
watch: 'refused',
|
|
43
43
|
// Build-less runs only, and only in trees whose marker records a cloned
|
|
44
|
-
// (mozinfo-rewritten) objdir
|
|
44
|
+
// (mozinfo-rewritten) objdir. See the conditional check below.
|
|
45
45
|
test: 'conditional',
|
|
46
46
|
config: 'conditional',
|
|
47
47
|
doctor: 'conditional',
|
|
@@ -52,8 +52,8 @@ export const TREE_COMMAND_VERDICTS = {
|
|
|
52
52
|
typecheck: 'allowed',
|
|
53
53
|
verify: 'allowed',
|
|
54
54
|
furnace: 'refused',
|
|
55
|
-
// No nesting
|
|
56
|
-
// subcommand check below allows only `list`.
|
|
55
|
+
// No nesting. `tree list` inside a tree is pointless but harmless, and
|
|
56
|
+
// the subcommand check below allows only `list`.
|
|
57
57
|
tree: 'conditional',
|
|
58
58
|
};
|
|
59
59
|
/** The command set named in refusal messages. */
|
|
@@ -61,29 +61,29 @@ const ALLOWED_SUMMARY = 'Verification trees support: status, lint, typecheck, ve
|
|
|
61
61
|
'config (read), export --dry-run, export-all --dry-run, re-export --dry-run, and — ' +
|
|
62
62
|
'in trees created with --with-objdir — build-less test.';
|
|
63
63
|
const TREE_CONDITIONAL_CHECKS = {
|
|
64
|
-
// Exports write patches/ + patches.json
|
|
64
|
+
// Exports write patches/ + patches.json. Only the dry-run preview is a read.
|
|
65
65
|
export: ({ options }) => options['dryRun'] === true,
|
|
66
66
|
'export-all': ({ options }) => options['dryRun'] === true,
|
|
67
67
|
// Same rule for refreshing existing patches: the dry-run projection is a
|
|
68
68
|
// read (proven side-effect free and runtime-enforced by
|
|
69
|
-
// withDryRunPurityGuard)
|
|
69
|
+
// withDryRunPurityGuard). A real re-export writes patches/.
|
|
70
70
|
're-export': ({ options }) => options['dryRun'] === true,
|
|
71
|
-
// `config` with no positional value prints
|
|
71
|
+
// `config` with no positional value prints. With a value it writes.
|
|
72
72
|
config: ({ args }) => args.filter((a) => typeof a === 'string').length <= 1,
|
|
73
73
|
// Doctor reads unless a repair flag is set.
|
|
74
74
|
doctor: ({ options }) => options['repairFurnace'] !== true && options['fix'] !== true,
|
|
75
75
|
// Build-less test needs the objdir the marker records as cloned,
|
|
76
|
-
// mozinfo-rewritten
|
|
76
|
+
// mozinfo-rewritten and reconfigured in-tree. `test --build` rebuilds
|
|
77
77
|
// the engine and stays primary-only (a tree is a snapshot with no
|
|
78
78
|
// merge-back model, so build outputs mutated in-tree go nowhere).
|
|
79
79
|
test: ({ options }, marker) => marker.clonedObjdir !== undefined && options['build'] !== true,
|
|
80
|
-
// No tree lifecycle inside a tree
|
|
80
|
+
// No tree lifecycle inside a tree. `tree list` is the only read.
|
|
81
81
|
tree: ({ subcommands }) => subcommands[0] === 'list',
|
|
82
82
|
};
|
|
83
83
|
/**
|
|
84
|
-
* Command-specific refusal hints appended after the generic sentence
|
|
85
|
-
*
|
|
86
|
-
*
|
|
84
|
+
* Command-specific refusal hints appended after the generic sentence, for
|
|
85
|
+
* verdicts where "mutates project or engine state" alone would misdiagnose
|
|
86
|
+
* the actual reason.
|
|
87
87
|
*/
|
|
88
88
|
const TREE_REFUSAL_HINTS = {
|
|
89
89
|
test: ({ options }, marker) => {
|
|
@@ -149,13 +149,13 @@ export async function runTreeGuardHook(rootCommandName, actionCommand) {
|
|
|
149
149
|
const state = located.state;
|
|
150
150
|
if (state.kind === 'absent')
|
|
151
151
|
return;
|
|
152
|
-
// A marker we cannot read is not evidence that this is not a tree
|
|
152
|
+
// A marker we cannot read is not evidence that this is not a tree. It is
|
|
153
153
|
// evidence that we cannot tell. Treating it as "not a tree" would grant the
|
|
154
154
|
// full mutating command set to a snapshot on the strength of a file that
|
|
155
|
-
// failed to parse, which is
|
|
156
|
-
// A marker from a
|
|
157
|
-
// remedies
|
|
158
|
-
// wrong for it. Refuse with the upgrade instruction instead, and do
|
|
155
|
+
// failed to parse, which is backwards for a default-deny guard.
|
|
156
|
+
// A marker from a newer FireForge is not damaged, so the corrupt branch's
|
|
157
|
+
// remedies (recreate the tree, delete the stray marker) are actively
|
|
158
|
+
// wrong for it. Refuse with the upgrade instruction instead, and do not
|
|
159
159
|
// offer --ignore-corrupt-tree-marker: proceeding would mean acting on a
|
|
160
160
|
// marker whose fields this build does not understand.
|
|
161
161
|
if (state.kind === 'unsupported') {
|
|
@@ -166,8 +166,8 @@ export async function runTreeGuardHook(rootCommandName, actionCommand) {
|
|
|
166
166
|
if (state.kind === 'corrupt') {
|
|
167
167
|
if (options['ignoreCorruptTreeMarker'] === true)
|
|
168
168
|
return;
|
|
169
|
-
// Unconditionally-allowed commands never consult marker fields
|
|
170
|
-
// verdict is the same in every tree
|
|
169
|
+
// Unconditionally-allowed commands never consult marker fields, and
|
|
170
|
+
// their verdict is the same in every tree, so an unreadable marker cannot
|
|
171
171
|
// change their answer. Letting them through keeps read-only diagnostics
|
|
172
172
|
// (status, lint) usable on the very tree the operator needs to inspect.
|
|
173
173
|
// 'conditional' verdicts stay refused: their predicates can write.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type CowCapability } from './tree-cow.js';
|
|
2
|
-
/** `.fireforge/tree.json
|
|
2
|
+
/** `.fireforge/tree.json`, which identifies a directory as a verification tree. */
|
|
3
3
|
export interface TreeMarker {
|
|
4
4
|
schemaVersion: 1;
|
|
5
5
|
name: string;
|
|
@@ -11,10 +11,10 @@ export interface TreeMarker {
|
|
|
11
11
|
patchesFingerprint: string | null;
|
|
12
12
|
/**
|
|
13
13
|
* Name of the obj-* directory cloned into this tree, written only after
|
|
14
|
-
* its mozinfo.json was successfully rewritten to the tree's paths
|
|
14
|
+
* its mozinfo.json was successfully rewritten to the tree's paths and the
|
|
15
15
|
* caller's in-tree reconfigure regenerated the remaining configure output.
|
|
16
16
|
* Its presence is what lets the guard admit build-less `test` in-tree
|
|
17
|
-
* (`tree-guard.ts`)
|
|
17
|
+
* (`tree-guard.ts`). Absent on trees created without `--with-objdir`.
|
|
18
18
|
*/
|
|
19
19
|
clonedObjdir?: string;
|
|
20
20
|
}
|
|
@@ -35,7 +35,7 @@ export declare function withTreeLifecycleLock<T>(primaryRoot: string, operation:
|
|
|
35
35
|
* The three states must stay distinct because they carry opposite safety
|
|
36
36
|
* meanings. `absent` means "this directory is not a tree", which is what
|
|
37
37
|
* lets every mutating command run. `corrupt` means "this directory claims to
|
|
38
|
-
* be a tree but we cannot read the claim"
|
|
38
|
+
* be a tree but we cannot read the claim". Collapsing it into `absent` (as
|
|
39
39
|
* a bare `undefined` return does) hands a snapshot the full mutating command
|
|
40
40
|
* set on the strength of a file we failed to parse, inverting
|
|
41
41
|
* `tree-guard.ts`'s default-deny design. Deleting one field from a marker is
|
|
@@ -51,7 +51,7 @@ export type TreeMarkerRead = {
|
|
|
51
51
|
reason: string;
|
|
52
52
|
}
|
|
53
53
|
/**
|
|
54
|
-
* Written by a
|
|
54
|
+
* Written by a newer FireForge. Distinct from `corrupt` because the remedy
|
|
55
55
|
* is the opposite: upgrade, do not delete.
|
|
56
56
|
*/
|
|
57
57
|
| {
|
|
@@ -68,20 +68,20 @@ export declare function getTreeMarkerPath(root: string): string;
|
|
|
68
68
|
*
|
|
69
69
|
* Only ENOENT/ENOTDIR mean `absent`: any other probe failure (EACCES on the
|
|
70
70
|
* `.fireforge` directory, EIO, …) reports `corrupt`, because "we cannot read
|
|
71
|
-
* the marker" is not evidence that there is no marker
|
|
71
|
+
* the marker" is not evidence that there is no marker: a `pathExists`
|
|
72
72
|
* pre-check classifies a tree with an unreadable `.fireforge` as `absent`
|
|
73
73
|
* and hands it the full mutating command set.
|
|
74
74
|
*/
|
|
75
75
|
/**
|
|
76
76
|
* Naming convention for state-file readers:
|
|
77
|
-
* - `readX(): Promise<XRead>`
|
|
77
|
+
* - `readX(): Promise<XRead>` is the tri-state read: absent, corrupt, or
|
|
78
78
|
* valid.
|
|
79
|
-
* - `tryReadX(): Promise<X | undefined>`
|
|
79
|
+
* - `tryReadX(): Promise<X | undefined>` collapses absent and corrupt.
|
|
80
80
|
*/
|
|
81
81
|
export declare function readTreeMarker(root: string): Promise<TreeMarkerRead>;
|
|
82
82
|
/**
|
|
83
83
|
* Reads the tree marker for a project root, or undefined when it is absent
|
|
84
|
-
*
|
|
84
|
+
* or unreadable.
|
|
85
85
|
*
|
|
86
86
|
* For display and best-effort paths only (`tree list` renders an unreadable
|
|
87
87
|
* marker as staleness 'unknown'). Anything that decides whether a mutation may
|
|
@@ -93,8 +93,8 @@ export declare function tryReadTreeMarker(root: string): Promise<TreeMarker | un
|
|
|
93
93
|
* the one this tree's marker vouched for as rewritten-and-reconfigured. A
|
|
94
94
|
* mismatch means an objdir appeared in the tree through some path other than
|
|
95
95
|
* `tree create --with-objdir` (manual copy, partial restore), so nothing
|
|
96
|
-
* proves it was relocated
|
|
97
|
-
* No-op outside a tree
|
|
96
|
+
* proves it was relocated, and running against it could consult primary paths.
|
|
97
|
+
* No-op outside a tree. A corrupt marker is already refused by the guard.
|
|
98
98
|
*/
|
|
99
99
|
export declare function assertObjdirMatchesTreeMarker(projectRoot: string, objDir: string | undefined): Promise<void>;
|
|
100
100
|
/** Current primary-side snapshot identity, including dirty source and patch bodies. */
|
|
@@ -109,8 +109,8 @@ export declare function assertValidTreeName(name: string): void;
|
|
|
109
109
|
* Materialises the tree at `treeRoot` from `primaryRoot` using `capability`
|
|
110
110
|
* ('none' = plain copy, already gated on --force-copy by the caller).
|
|
111
111
|
*
|
|
112
|
-
* The engine is cloned one
|
|
113
|
-
* directories are never traversed or materialised
|
|
112
|
+
* The engine is cloned one top-level entry at a time so unwanted `obj-*`
|
|
113
|
+
* directories are never traversed or materialised. On a Firefox tree, even
|
|
114
114
|
* CoW-cloning and then deleting an objdir touches metadata for millions of
|
|
115
115
|
* build outputs. With `withObjdir` exactly that objdir is included (after
|
|
116
116
|
* {@link assertCloneSafeObjdir} refuses symlinked or engine-escaping objdirs
|
|
@@ -134,8 +134,8 @@ export declare function cloneTree(args: {
|
|
|
134
134
|
export declare function listTrees(primaryRoot: string): Promise<TreeListEntry[]>;
|
|
135
135
|
/**
|
|
136
136
|
* Removes one tree. Refuses when a live process holds the tree's build
|
|
137
|
-
* or engine-session lock
|
|
138
|
-
* cannot be established
|
|
137
|
+
* or engine-session lock, or when a lock directory exists whose ownership
|
|
138
|
+
* cannot be established (which `--force` overrides). Never deletes a path
|
|
139
139
|
* outside the trees directory (containment check before `rm -rf`).
|
|
140
140
|
*/
|
|
141
141
|
export declare function removeTree(primaryRoot: string, name: string, options?: {
|