@hominis/fireforge 0.43.0 → 0.44.0
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 +127 -0
- package/README.md +10 -1
- package/dist/bin/fireforge.d.ts +4 -9
- package/dist/bin/fireforge.js +42 -40
- package/dist/build-info.json +4 -4
- package/dist/src/cli.js +74 -8
- package/dist/src/commands/bootstrap.js +17 -20
- package/dist/src/commands/build.js +25 -32
- package/dist/src/commands/config.js +34 -41
- package/dist/src/commands/discard.js +8 -9
- package/dist/src/commands/doctor-check-core.d.ts +4 -18
- package/dist/src/commands/doctor-check-core.js +8 -35
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +18 -0
- package/dist/src/commands/{doctor-furnace-manifest-sync.js → doctor-furnace-config-sync.js} +27 -26
- package/dist/src/commands/doctor-furnace-jar.d.ts +7 -9
- package/dist/src/commands/doctor-furnace-jar.js +7 -9
- package/dist/src/commands/doctor-furnace.js +21 -24
- package/dist/src/commands/doctor-orphaned-harness.d.ts +16 -20
- package/dist/src/commands/doctor-orphaned-harness.js +18 -44
- package/dist/src/commands/doctor-post-rebase-audit.d.ts +2 -0
- package/dist/src/commands/{doctor/post-rebase-audit.js → doctor-post-rebase-audit.js} +3 -3
- package/dist/src/commands/doctor-working-tree.d.ts +10 -12
- package/dist/src/commands/doctor-working-tree.js +11 -18
- package/dist/src/commands/doctor.js +35 -53
- package/dist/src/commands/download.js +32 -48
- package/dist/src/commands/export-all.js +29 -33
- package/dist/src/commands/export-flow.js +6 -6
- package/dist/src/commands/export-placement-conflicts.js +10 -9
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-shared.d.ts +30 -33
- package/dist/src/commands/export-shared.js +45 -43
- package/dist/src/commands/export.js +21 -27
- package/dist/src/commands/furnace/apply.js +14 -23
- package/dist/src/commands/furnace/chrome-doc-remove.js +14 -21
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +23 -23
- package/dist/src/commands/furnace/chrome-doc-templates.js +23 -23
- package/dist/src/commands/furnace/chrome-doc-tests.js +26 -29
- package/dist/src/commands/furnace/chrome-doc.d.ts +16 -17
- package/dist/src/commands/furnace/chrome-doc.js +31 -41
- package/dist/src/commands/furnace/create-browser-test.d.ts +4 -4
- package/dist/src/commands/furnace/create-browser-test.js +8 -8
- package/dist/src/commands/furnace/create-mochikit.d.ts +6 -7
- package/dist/src/commands/furnace/create-mochikit.js +8 -9
- package/dist/src/commands/furnace/create-readback.d.ts +12 -13
- package/dist/src/commands/furnace/create-readback.js +12 -13
- package/dist/src/commands/furnace/create-templates.d.ts +22 -28
- package/dist/src/commands/furnace/create-templates.js +35 -30
- package/dist/src/commands/furnace/create-xpcshell.js +2 -2
- package/dist/src/commands/furnace/create.js +33 -23
- package/dist/src/commands/furnace/deploy.js +16 -24
- package/dist/src/commands/furnace/diff.js +9 -9
- package/dist/src/commands/furnace/init.js +33 -36
- package/dist/src/commands/furnace/override.js +23 -25
- package/dist/src/commands/furnace/preview.js +47 -67
- package/dist/src/commands/furnace/refresh.js +12 -16
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -6
- package/dist/src/commands/furnace/remove-mutations.js +9 -16
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +33 -38
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +8 -11
- package/dist/src/commands/furnace/rename-xpcshell.js +8 -11
- package/dist/src/commands/furnace/rename.js +59 -69
- package/dist/src/commands/furnace/scan.js +19 -33
- package/dist/src/commands/furnace/status.js +12 -9
- package/dist/src/commands/furnace/sync.js +9 -16
- package/dist/src/commands/furnace/validate.js +20 -20
- package/dist/src/commands/import.js +42 -35
- package/dist/src/commands/lint-per-patch.js +15 -10
- package/dist/src/commands/lint-per-run-checkjs.d.ts +13 -13
- package/dist/src/commands/lint-per-run-checkjs.js +13 -13
- package/dist/src/commands/lint-report.js +6 -7
- package/dist/src/commands/lint.d.ts +15 -16
- package/dist/src/commands/lint.js +86 -102
- package/dist/src/commands/package.js +6 -11
- package/dist/src/commands/patch/compact.js +1 -1
- package/dist/src/commands/patch/delete.js +24 -33
- package/dist/src/commands/patch/index.d.ts +5 -6
- package/dist/src/commands/patch/index.js +10 -12
- package/dist/src/commands/patch/lint-ignore.js +14 -13
- package/dist/src/commands/patch/move-files-create.d.ts +6 -6
- package/dist/src/commands/patch/move-files-create.js +8 -8
- package/dist/src/commands/patch/move-files-into.d.ts +6 -6
- package/dist/src/commands/patch/move-files-into.js +8 -8
- package/dist/src/commands/patch/patch-context.d.ts +2 -3
- package/dist/src/commands/patch/patch-context.js +2 -3
- package/dist/src/commands/patch/rename.d.ts +10 -11
- package/dist/src/commands/patch/rename.js +11 -12
- package/dist/src/commands/patch/reorder.js +8 -9
- package/dist/src/commands/patch/split-plan.js +1 -1
- package/dist/src/commands/patch/split.d.ts +8 -10
- package/dist/src/commands/patch/split.js +9 -11
- package/dist/src/commands/patch/staged-dependency-validate.js +8 -8
- package/dist/src/commands/patch/staged-dependency.js +7 -3
- package/dist/src/commands/patch/tier.d.ts +9 -9
- package/dist/src/commands/patch/tier.js +18 -15
- package/dist/src/commands/re-export-adjacent.js +9 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +9 -9
- package/dist/src/commands/re-export-bulk-scan.js +22 -21
- package/dist/src/commands/re-export-drift.js +10 -10
- package/dist/src/commands/re-export-files.d.ts +6 -7
- package/dist/src/commands/re-export-files.js +34 -44
- package/dist/src/commands/re-export-lint.d.ts +10 -13
- package/dist/src/commands/re-export-lint.js +16 -14
- package/dist/src/commands/re-export-options.d.ts +6 -6
- package/dist/src/commands/re-export-options.js +6 -6
- package/dist/src/commands/re-export-register.d.ts +4 -10
- package/dist/src/commands/re-export-register.js +5 -11
- package/dist/src/commands/re-export-scan.js +1 -1
- package/dist/src/commands/re-export-single.d.ts +3 -3
- package/dist/src/commands/re-export-single.js +33 -25
- package/dist/src/commands/re-export.js +13 -21
- package/dist/src/commands/rebase/abort.js +3 -3
- package/dist/src/commands/rebase/confirm.js +2 -1
- package/dist/src/commands/rebase/continue.d.ts +1 -1
- package/dist/src/commands/rebase/continue.js +14 -9
- package/dist/src/commands/rebase/index.js +11 -11
- package/dist/src/commands/rebase/patch-loop.d.ts +7 -1
- package/dist/src/commands/rebase/patch-loop.js +60 -39
- package/dist/src/commands/rebase/summary.js +1 -1
- package/dist/src/commands/register.js +5 -7
- package/dist/src/commands/reset.js +2 -1
- package/dist/src/commands/resolve.d.ts +16 -13
- package/dist/src/commands/resolve.js +30 -33
- package/dist/src/commands/run.js +33 -35
- package/dist/src/commands/setup-support.js +15 -19
- package/dist/src/commands/setup.js +13 -9
- package/dist/src/commands/status-check.d.ts +6 -6
- package/dist/src/commands/status-json.d.ts +6 -6
- package/dist/src/commands/status-json.js +5 -0
- package/dist/src/commands/status-output.d.ts +5 -5
- package/dist/src/commands/status-output.js +6 -6
- package/dist/src/commands/status-ownership.d.ts +16 -14
- package/dist/src/commands/status-ownership.js +16 -14
- package/dist/src/commands/status.js +42 -34
- package/dist/src/commands/test-build-phase.js +26 -13
- package/dist/src/commands/test-diagnose.js +44 -44
- package/dist/src/commands/test-register.js +1 -0
- package/dist/src/commands/test-run.d.ts +14 -16
- package/dist/src/commands/test-run.js +21 -13
- package/dist/src/commands/test-stale-gate.d.ts +15 -16
- package/dist/src/commands/test-stale-gate.js +15 -16
- package/dist/src/commands/test-verdict.d.ts +20 -3
- package/dist/src/commands/test-verdict.js +30 -0
- package/dist/src/commands/test.js +83 -76
- package/dist/src/commands/token-coverage.js +3 -4
- package/dist/src/commands/token.js +16 -18
- package/dist/src/commands/tree.js +47 -31
- package/dist/src/commands/typecheck.d.ts +10 -12
- package/dist/src/commands/typecheck.js +24 -27
- package/dist/src/commands/verify.js +13 -15
- package/dist/src/commands/watch.js +21 -23
- package/dist/src/commands/wire.js +52 -62
- package/dist/src/core/ast-utils.d.ts +8 -7
- package/dist/src/core/ast-utils.js +8 -7
- package/dist/src/core/branding.d.ts +9 -14
- package/dist/src/core/branding.js +7 -11
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +14 -19
- package/dist/src/core/build-audit-platform.js +25 -33
- package/dist/src/core/build-audit-registration.js +17 -25
- package/dist/src/core/build-audit-resolve.d.ts +15 -17
- package/dist/src/core/build-audit-resolve.js +27 -33
- package/dist/src/core/build-audit-transforms.js +18 -19
- package/dist/src/core/build-audit.js +28 -42
- package/dist/src/core/build-baseline-types.d.ts +29 -35
- package/dist/src/core/build-baseline.d.ts +5 -4
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-overwrite-guard.d.ts +7 -14
- package/dist/src/core/build-overwrite-guard.js +62 -19
- package/dist/src/core/build-prepare.d.ts +2 -2
- package/dist/src/core/build-prepare.js +8 -9
- package/dist/src/core/config-state.js +12 -4
- package/dist/src/core/config-validate.js +8 -5
- package/dist/src/core/config.d.ts +5 -8
- package/dist/src/core/config.js +7 -16
- package/dist/src/core/coverage-extend.d.ts +15 -13
- package/dist/src/core/coverage-extend.js +15 -13
- package/dist/src/core/destructive.d.ts +31 -9
- package/dist/src/core/destructive.js +29 -26
- package/dist/src/core/diff-hunks.js +10 -12
- package/dist/src/core/discard-baseline.d.ts +8 -8
- package/dist/src/core/discard-baseline.js +16 -15
- package/dist/src/core/display-state.d.ts +12 -14
- package/dist/src/core/display-state.js +12 -14
- package/dist/src/core/engine-changes.d.ts +2 -4
- package/dist/src/core/engine-changes.js +2 -4
- package/dist/src/core/engine-precondition.d.ts +28 -13
- package/dist/src/core/engine-precondition.js +25 -10
- package/dist/src/core/engine-session-lock.d.ts +47 -21
- package/dist/src/core/engine-session-lock.js +168 -33
- package/dist/src/core/export-moved-code-shape.d.ts +10 -10
- package/dist/src/core/export-moved-code-shape.js +10 -10
- package/dist/src/core/file-lock.d.ts +62 -5
- package/dist/src/core/file-lock.js +196 -59
- package/dist/src/core/firefox-cache.js +1 -3
- package/dist/src/core/firefox-extract.js +10 -14
- package/dist/src/core/firefox.d.ts +7 -5
- package/dist/src/core/firefox.js +4 -5
- package/dist/src/core/furnace-apply-dry-run.d.ts +2 -2
- package/dist/src/core/furnace-apply-dry-run.js +3 -2
- package/dist/src/core/furnace-apply-ftl.d.ts +7 -9
- package/dist/src/core/furnace-apply-ftl.js +12 -12
- package/dist/src/core/furnace-apply-helpers.d.ts +7 -7
- package/dist/src/core/furnace-apply-helpers.js +19 -16
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +8 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +8 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +3 -4
- package/dist/src/core/furnace-apply-undeploy-actions.js +3 -4
- package/dist/src/core/furnace-apply.d.ts +5 -8
- package/dist/src/core/furnace-apply.js +19 -24
- package/dist/src/core/furnace-checksum-utils.d.ts +14 -0
- package/dist/src/core/furnace-checksum-utils.js +16 -0
- package/dist/src/core/furnace-config.d.ts +21 -30
- package/dist/src/core/furnace-config.js +32 -54
- package/dist/src/core/furnace-constants.d.ts +8 -0
- package/dist/src/core/furnace-constants.js +10 -2
- package/dist/src/core/furnace-css-fragments.d.ts +5 -5
- package/dist/src/core/furnace-css-fragments.js +5 -5
- package/dist/src/core/furnace-jsconfig.d.ts +11 -12
- package/dist/src/core/furnace-jsconfig.js +11 -12
- package/dist/src/core/furnace-marker.d.ts +7 -8
- package/dist/src/core/furnace-marker.js +7 -8
- package/dist/src/core/furnace-operation.d.ts +31 -0
- package/dist/src/core/furnace-operation.js +54 -17
- package/dist/src/core/furnace-precondition.d.ts +61 -0
- package/dist/src/core/furnace-precondition.js +67 -0
- package/dist/src/core/furnace-registration-remove.d.ts +5 -6
- package/dist/src/core/furnace-registration-remove.js +6 -7
- package/dist/src/core/furnace-registration-validate.d.ts +13 -0
- package/dist/src/core/furnace-registration-validate.js +20 -1
- package/dist/src/core/furnace-registration.d.ts +5 -6
- package/dist/src/core/furnace-registration.js +10 -12
- package/dist/src/core/furnace-rollback.js +7 -7
- package/dist/src/core/furnace-scanner.d.ts +1 -0
- package/dist/src/core/furnace-scanner.js +1 -2
- package/dist/src/core/furnace-stale-export.d.ts +10 -10
- package/dist/src/core/furnace-stale-export.js +10 -10
- package/dist/src/core/furnace-state-persist.d.ts +6 -8
- package/dist/src/core/furnace-state-persist.js +6 -8
- package/dist/src/core/furnace-validate-accessibility.d.ts +22 -0
- package/dist/src/core/furnace-validate-accessibility.js +310 -1
- package/dist/src/core/furnace-validate-compatibility.js +141 -1
- package/dist/src/core/furnace-validate-helpers.d.ts +5 -116
- package/dist/src/core/furnace-validate-helpers.js +0 -491
- package/dist/src/core/furnace-validate-registration.d.ts +7 -0
- package/dist/src/core/furnace-validate-registration.js +115 -41
- package/dist/src/core/furnace-validate.d.ts +16 -0
- package/dist/src/core/furnace-validate.js +188 -145
- package/dist/src/core/furnace-version-drift.d.ts +10 -11
- package/dist/src/core/furnace-version-drift.js +10 -11
- package/dist/src/core/git-base.d.ts +7 -9
- package/dist/src/core/git-base.js +7 -9
- package/dist/src/core/git-diff.d.ts +20 -9
- package/dist/src/core/git-diff.js +148 -63
- package/dist/src/core/git-file-ops.d.ts +19 -19
- package/dist/src/core/git-file-ops.js +19 -19
- package/dist/src/core/git-readonly-index.d.ts +53 -19
- package/dist/src/core/git-readonly-index.js +75 -31
- package/dist/src/core/git-status.d.ts +5 -6
- package/dist/src/core/git-status.js +5 -6
- package/dist/src/core/git.d.ts +9 -10
- package/dist/src/core/git.js +54 -70
- package/dist/src/core/license-headers.d.ts +17 -23
- package/dist/src/core/license-headers.js +17 -23
- package/dist/src/core/mach-build-artifacts.d.ts +9 -9
- package/dist/src/core/mach-build-artifacts.js +57 -19
- package/dist/src/core/mach-error-hints.js +42 -29
- package/dist/src/core/mach-known-noise-filter.d.ts +15 -16
- package/dist/src/core/mach-known-noise-filter.js +18 -20
- package/dist/src/core/mach-mozconfig.d.ts +14 -0
- package/dist/src/core/mach-mozconfig.js +30 -0
- package/dist/src/core/mach-resource-shim.d.ts +43 -58
- package/dist/src/core/mach-resource-shim.js +50 -67
- package/dist/src/core/mach.d.ts +37 -41
- package/dist/src/core/mach.js +50 -51
- package/dist/src/core/marionette-port.d.ts +36 -1
- package/dist/src/core/marionette-port.js +96 -31
- package/dist/src/core/marionette-preflight.d.ts +8 -12
- package/dist/src/core/marionette-preflight.js +86 -52
- package/dist/src/core/mochitest-server-port.d.ts +42 -0
- package/dist/src/core/mochitest-server-port.js +119 -0
- package/dist/src/core/module-resolution-preflight.d.ts +9 -11
- package/dist/src/core/module-resolution-preflight.js +9 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +79 -0
- package/dist/src/core/moz-manifest-helpers.js +163 -0
- package/dist/src/core/{manifest-register.d.ts → moz-manifest-register.d.ts} +1 -1
- package/dist/src/core/{manifest-register.js → moz-manifest-register.js} +13 -28
- package/dist/src/core/{manifest-rules.d.ts → moz-manifest-rules.d.ts} +10 -1
- package/dist/src/core/{manifest-rules.js → moz-manifest-rules.js} +31 -24
- package/dist/src/core/{manifest-tokenizers.d.ts → moz-manifest-tokenizers.d.ts} +3 -5
- package/dist/src/core/{manifest-tokenizers.js → moz-manifest-tokenizers.js} +9 -12
- package/dist/src/core/ownership-table.d.ts +14 -16
- package/dist/src/core/ownership-table.js +14 -16
- package/dist/src/core/parser-fallback.d.ts +15 -1
- package/dist/src/core/parser-fallback.js +22 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +10 -12
- package/dist/src/core/patch-apply-fuzz.js +15 -18
- package/dist/src/core/patch-apply.d.ts +13 -34
- package/dist/src/core/patch-apply.js +16 -76
- package/dist/src/core/patch-artifact-normalize.d.ts +13 -15
- package/dist/src/core/patch-artifact-normalize.js +13 -15
- package/dist/src/core/patch-export-metadata.d.ts +12 -2
- package/dist/src/core/patch-export-metadata.js +13 -4
- package/dist/src/core/patch-export-update.d.ts +13 -1
- package/dist/src/core/patch-export-update.js +25 -8
- package/dist/src/core/patch-export.d.ts +15 -8
- package/dist/src/core/patch-export.js +10 -11
- package/dist/src/core/patch-files.d.ts +5 -6
- package/dist/src/core/patch-files.js +5 -6
- package/dist/src/core/patch-identifier-suggest.d.ts +7 -12
- package/dist/src/core/patch-identifier-suggest.js +14 -19
- package/dist/src/core/patch-lint-binary.d.ts +51 -0
- package/dist/src/core/patch-lint-binary.js +39 -0
- package/dist/src/core/{lint-cache.d.ts → patch-lint-cache.d.ts} +5 -5
- package/dist/src/core/{lint-cache.js → patch-lint-cache.js} +21 -23
- package/dist/src/core/patch-lint-checkjs.d.ts +16 -16
- package/dist/src/core/patch-lint-checkjs.js +16 -16
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +6 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -14
- package/dist/src/core/patch-lint-creators.d.ts +8 -8
- package/dist/src/core/patch-lint-creators.js +8 -8
- package/dist/src/core/patch-lint-cross.d.ts +17 -20
- package/dist/src/core/patch-lint-cross.js +16 -16
- package/dist/src/core/patch-lint-css.d.ts +3 -5
- package/dist/src/core/patch-lint-css.js +17 -22
- package/dist/src/core/patch-lint-diff-tag.d.ts +14 -16
- package/dist/src/core/patch-lint-diff-tag.js +14 -16
- package/dist/src/core/patch-lint-jsdoc.d.ts +7 -8
- package/dist/src/core/patch-lint-jsdoc.js +26 -19
- package/dist/src/core/patch-lint-mozbuild.js +20 -20
- package/dist/src/core/patch-lint-observer.d.ts +7 -7
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint.d.ts +38 -29
- package/dist/src/core/patch-lint.js +89 -121
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +45 -9
- package/dist/src/core/patch-manifest-consistency.d.ts +2 -1
- package/dist/src/core/patch-manifest-consistency.js +25 -27
- package/dist/src/core/patch-manifest-io.js +14 -18
- package/dist/src/core/patch-manifest-resolve.d.ts +9 -12
- package/dist/src/core/patch-manifest-resolve.js +9 -12
- package/dist/src/core/patch-manifest-validate.d.ts +6 -1
- package/dist/src/core/patch-manifest-validate.js +25 -13
- package/dist/src/core/patch-parse.d.ts +24 -13
- package/dist/src/core/patch-parse.js +19 -14
- package/dist/src/core/patch-policy.d.ts +2 -2
- package/dist/src/core/patch-policy.js +2 -2
- package/dist/src/core/patch-registration-refs.d.ts +7 -8
- package/dist/src/core/patch-registration-refs.js +9 -9
- package/dist/src/core/process-cpu-time.d.ts +12 -0
- package/dist/src/core/process-cpu-time.js +52 -0
- package/dist/src/core/rebase-session.d.ts +38 -26
- package/dist/src/core/rebase-session.js +55 -28
- package/dist/src/core/register-browser-content.js +9 -74
- package/dist/src/core/{register-test-manifest.js → register-browser-test.js} +7 -42
- package/dist/src/core/register-module.js +10 -43
- package/dist/src/core/register-scaffold.d.ts +8 -8
- package/dist/src/core/register-scaffold.js +10 -10
- package/dist/src/core/register-shared-css.d.ts +9 -12
- package/dist/src/core/register-shared-css.js +17 -87
- package/dist/src/core/register-xpcshell-test.d.ts +6 -7
- package/dist/src/core/register-xpcshell-test.js +7 -8
- package/dist/src/core/shared-ftl.js +12 -4
- package/dist/src/core/state-file.d.ts +45 -0
- package/dist/src/core/state-file.js +34 -0
- package/dist/src/core/status-binary.d.ts +18 -11
- package/dist/src/core/status-binary.js +19 -12
- package/dist/src/core/status-classify.d.ts +30 -36
- package/dist/src/core/status-classify.js +21 -26
- package/dist/src/core/test-changed-prefs.d.ts +30 -0
- package/dist/src/core/test-changed-prefs.js +78 -0
- package/dist/src/core/test-harness-crash.d.ts +25 -63
- package/dist/src/core/test-harness-crash.js +121 -142
- package/dist/src/core/test-harness-signature.d.ts +18 -0
- package/dist/src/core/test-harness-signature.js +13 -0
- package/dist/src/core/test-path-scope.d.ts +12 -15
- package/dist/src/core/test-path-scope.js +15 -18
- package/dist/src/core/test-stale-check.d.ts +17 -17
- package/dist/src/core/test-stale-check.js +50 -43
- package/dist/src/core/test-stall-triage.d.ts +51 -0
- package/dist/src/core/test-stall-triage.js +126 -0
- package/dist/src/core/token-category.js +5 -7
- package/dist/src/core/token-coverage.js +9 -9
- package/dist/src/core/token-dark-mode.d.ts +9 -11
- package/dist/src/core/token-dark-mode.js +9 -11
- package/dist/src/core/token-docs.d.ts +2 -0
- package/dist/src/core/token-docs.js +2 -0
- package/dist/src/core/token-manager.d.ts +10 -2
- package/dist/src/core/token-manager.js +17 -8
- package/dist/src/core/token-scaffold.d.ts +7 -7
- package/dist/src/core/token-scaffold.js +7 -7
- package/dist/src/core/token-variant.d.ts +4 -4
- package/dist/src/core/token-variant.js +4 -4
- package/dist/src/core/toolchain-preflight.d.ts +20 -21
- package/dist/src/core/toolchain-preflight.js +28 -31
- package/dist/src/core/tree-guard.js +12 -2
- package/dist/src/core/tree-store.d.ts +41 -27
- package/dist/src/core/tree-store.js +63 -42
- package/dist/src/core/typecheck-shim.d.ts +23 -24
- package/dist/src/core/typecheck-shim.js +23 -24
- package/dist/src/core/typecheck.js +8 -8
- package/dist/src/core/wire-destroy.d.ts +3 -3
- package/dist/src/core/wire-destroy.js +7 -15
- package/dist/src/core/wire-dom-fragment.d.ts +9 -17
- package/dist/src/core/wire-dom-fragment.js +11 -44
- package/dist/src/core/wire-init.d.ts +2 -3
- package/dist/src/core/wire-init.js +8 -19
- package/dist/src/core/wire-subscript.d.ts +2 -3
- package/dist/src/core/wire-subscript.js +4 -13
- package/dist/src/core/wire-utils.d.ts +7 -8
- package/dist/src/core/wire-utils.js +7 -8
- package/dist/src/core/xpcshell-appdir.d.ts +38 -45
- package/dist/src/core/xpcshell-appdir.js +38 -45
- package/dist/src/errors/base.d.ts +37 -16
- package/dist/src/errors/base.js +37 -16
- package/dist/src/errors/build.d.ts +13 -1
- package/dist/src/errors/build.js +14 -2
- package/dist/src/errors/codes.d.ts +16 -0
- package/dist/src/errors/codes.js +16 -0
- package/dist/src/errors/furnace.d.ts +4 -4
- package/dist/src/errors/git.d.ts +6 -10
- package/dist/src/errors/git.js +6 -10
- package/dist/src/errors/patch.d.ts +7 -7
- package/dist/src/errors/patch.js +7 -7
- package/dist/src/errors/rebase.d.ts +4 -4
- package/dist/src/errors/rebase.js +4 -4
- package/dist/src/index.d.ts +7 -1
- package/dist/src/index.js +5 -0
- package/dist/src/types/commands/index.d.ts +2 -2
- package/dist/src/types/commands/options.d.ts +88 -70
- package/dist/src/types/commands/patches.d.ts +24 -34
- package/dist/src/types/commands/project.d.ts +5 -34
- package/dist/src/types/config.d.ts +25 -23
- package/dist/src/types/config.js +6 -1
- package/dist/src/types/furnace.d.ts +37 -13
- package/dist/src/types/furnace.js +19 -1
- package/dist/src/types/index.d.ts +3 -3
- package/dist/src/utils/build-info.d.ts +7 -8
- package/dist/src/utils/build-info.js +12 -11
- package/dist/src/utils/errors.d.ts +6 -8
- package/dist/src/utils/errors.js +6 -8
- package/dist/src/utils/logger.d.ts +27 -10
- package/dist/src/utils/logger.js +28 -16
- package/dist/src/utils/machine-output.d.ts +12 -0
- package/dist/src/utils/machine-output.js +33 -0
- package/dist/src/utils/options.d.ts +31 -14
- package/dist/src/utils/options.js +86 -30
- package/dist/src/utils/paths.d.ts +10 -8
- package/dist/src/utils/paths.js +10 -8
- package/dist/src/utils/platform.d.ts +0 -25
- package/dist/src/utils/platform.js +1 -42
- package/dist/src/utils/process-group.d.ts +9 -4
- package/dist/src/utils/process-group.js +19 -5
- package/dist/src/utils/process.d.ts +42 -7
- package/dist/src/utils/process.js +44 -17
- package/dist/src/utils/ps-duration.d.ts +31 -0
- package/dist/src/utils/ps-duration.js +70 -0
- package/dist/src/utils/regex.d.ts +9 -10
- package/dist/src/utils/regex.js +9 -10
- package/dist/src/utils/validation.d.ts +58 -28
- package/dist/src/utils/validation.js +60 -33
- package/package.json +2 -2
- package/dist/src/commands/doctor/post-rebase-audit.d.ts +0 -2
- package/dist/src/commands/doctor-furnace-manifest-sync.d.ts +0 -18
- package/dist/src/core/manifest-helpers.d.ts +0 -38
- package/dist/src/core/manifest-helpers.js +0 -120
- /package/dist/src/core/{lint-projection.d.ts → patch-lint-projection.d.ts} +0 -0
- /package/dist/src/core/{lint-projection.js → patch-lint-projection.js} +0 -0
- /package/dist/src/core/{register-test-manifest.d.ts → register-browser-test.d.ts} +0 -0
|
@@ -2,20 +2,27 @@
|
|
|
2
2
|
* Binary-aware drift classification for patch-owned files.
|
|
3
3
|
*
|
|
4
4
|
* The text classifier compares utf-8 decoded content against
|
|
5
|
-
* `computePatchedContent`, which cannot apply `GIT binary patch` bodies —
|
|
6
|
-
*
|
|
5
|
+
* `computePatchedContent`, which cannot apply `GIT binary patch` bodies — so
|
|
6
|
+
* a binary file exported into a patch classifies as `patch-owned-drift`
|
|
7
7
|
* forever, keeping the engine-clean gate permanently red with nothing
|
|
8
|
-
* actually un-durable.
|
|
9
|
-
* `git diff --binary` always records full blob hashes on the section's
|
|
8
|
+
* actually un-durable. A `GIT binary patch` section DOES carry the ground
|
|
9
|
+
* truth: `git diff --binary` always records full blob hashes on the section's
|
|
10
10
|
* `index <old>..<new>` line. Comparing the live file's `git hash-object`
|
|
11
|
-
* against the last owning section's new-side hash settles the
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
11
|
+
* against the last owning section's new-side hash settles the classification
|
|
12
|
+
* exactly. Bodies without a usable hash (hand-written diffs) classify as
|
|
13
|
+
* `binary-unsupported` — an honest "cannot compare" instead of a false "not
|
|
14
|
+
* durable".
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
16
|
+
* That hash is trusted ONLY when the section carries a replayable payload
|
|
17
|
+
* (`hasBinaryDelta`). A `Binary files … differ` stub carries a correct index
|
|
18
|
+
* line too, so hashing against it reports `patch-backed` for a body that
|
|
19
|
+
* cannot rebuild the file at all — precisely the dishonesty this module
|
|
20
|
+
* exists to avoid. Such a body is `binary-unsupported` here, and an error
|
|
21
|
+
* from the `binary-body-not-reconstructable` queue lint.
|
|
22
|
+
*
|
|
23
|
+
* Lives in its own module (not `status-classify.ts`) so the classifier stays
|
|
24
|
+
* within the per-file line budget and this module never has to import it
|
|
25
|
+
* back: the dependency edge points one way, which keeps dpdm clean.
|
|
19
26
|
*/
|
|
20
27
|
import type { PatchedContentContext } from './patch-apply.js';
|
|
21
28
|
/** Batched patch lookup, injected by callers that classify many files. */
|
|
@@ -3,20 +3,27 @@
|
|
|
3
3
|
* Binary-aware drift classification for patch-owned files.
|
|
4
4
|
*
|
|
5
5
|
* The text classifier compares utf-8 decoded content against
|
|
6
|
-
* `computePatchedContent`, which cannot apply `GIT binary patch` bodies —
|
|
7
|
-
*
|
|
6
|
+
* `computePatchedContent`, which cannot apply `GIT binary patch` bodies — so
|
|
7
|
+
* a binary file exported into a patch classifies as `patch-owned-drift`
|
|
8
8
|
* forever, keeping the engine-clean gate permanently red with nothing
|
|
9
|
-
* actually un-durable.
|
|
10
|
-
* `git diff --binary` always records full blob hashes on the section's
|
|
9
|
+
* actually un-durable. A `GIT binary patch` section DOES carry the ground
|
|
10
|
+
* truth: `git diff --binary` always records full blob hashes on the section's
|
|
11
11
|
* `index <old>..<new>` line. Comparing the live file's `git hash-object`
|
|
12
|
-
* against the last owning section's new-side hash settles the
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
12
|
+
* against the last owning section's new-side hash settles the classification
|
|
13
|
+
* exactly. Bodies without a usable hash (hand-written diffs) classify as
|
|
14
|
+
* `binary-unsupported` — an honest "cannot compare" instead of a false "not
|
|
15
|
+
* durable".
|
|
16
16
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
17
|
+
* That hash is trusted ONLY when the section carries a replayable payload
|
|
18
|
+
* (`hasBinaryDelta`). A `Binary files … differ` stub carries a correct index
|
|
19
|
+
* line too, so hashing against it reports `patch-backed` for a body that
|
|
20
|
+
* cannot rebuild the file at all — precisely the dishonesty this module
|
|
21
|
+
* exists to avoid. Such a body is `binary-unsupported` here, and an error
|
|
22
|
+
* from the `binary-body-not-reconstructable` queue lint.
|
|
23
|
+
*
|
|
24
|
+
* Lives in its own module (not `status-classify.ts`) so the classifier stays
|
|
25
|
+
* within the per-file line budget and this module never has to import it
|
|
26
|
+
* back: the dependency edge points one way, which keeps dpdm clean.
|
|
20
27
|
*/
|
|
21
28
|
import { join } from 'node:path';
|
|
22
29
|
import { toError } from '../utils/errors.js';
|
|
@@ -102,7 +109,7 @@ export async function classifyBinaryOwnedFile(args) {
|
|
|
102
109
|
// The last binary section expects the file to exist.
|
|
103
110
|
return { ...entry, classification: 'patch-owned-drift', owner };
|
|
104
111
|
}
|
|
105
|
-
if (section.indexNewHash !== undefined) {
|
|
112
|
+
if (section.hasBinaryDelta && section.indexNewHash !== undefined) {
|
|
106
113
|
const fullPath = join(engineDir, entry.file);
|
|
107
114
|
const live = (await hashObjectBatch(engineDir, [fullPath])).get(fullPath);
|
|
108
115
|
if (live !== undefined) {
|
|
@@ -7,38 +7,34 @@
|
|
|
7
7
|
*/
|
|
8
8
|
/**
|
|
9
9
|
* Classification buckets for engine file changes:
|
|
10
|
-
* - `patch-backed`: content matches the expected post-patch state —
|
|
11
|
-
*
|
|
12
|
-
* - `patch-owned-drift`: the file is claimed by exactly one patch, but
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* drift to export or discard.
|
|
10
|
+
* - `patch-backed`: content matches the expected post-patch state — normal
|
|
11
|
+
* after `fireforge import`.
|
|
12
|
+
* - `patch-owned-drift`: the file is claimed by exactly one patch, but the
|
|
13
|
+
* live engine content no longer matches that patch's expected post-apply
|
|
14
|
+
* content. This includes furnace-prefixed paths: a path can be both
|
|
15
|
+
* Furnace-managed and patch-claimed (export a deployed component, then
|
|
16
|
+
* edit the workspace source and `furnace deploy` again — the deployed copy
|
|
17
|
+
* now has content the patch body lacks). Checking the furnace prefix first
|
|
18
|
+
* would bucket such files as `furnace` and report the stale patch as
|
|
19
|
+
* owned.
|
|
20
|
+
* - `unmanaged`: edits not explained by any patch or tool — local drift to
|
|
21
|
+
* export or discard.
|
|
23
22
|
* - `branding`: files under tool-managed branding paths, written by
|
|
24
23
|
* FireForge's branding pipeline.
|
|
25
|
-
* - `furnace`: files under Furnace-managed component prefixes. When
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
24
|
+
* - `furnace`: files under Furnace-managed component prefixes. When exactly
|
|
25
|
+
* one patch also claims the path, this bucket asserts the live content
|
|
26
|
+
* matches that patch's expected post-apply content — a mismatch is
|
|
27
|
+
* reported as `patch-owned-drift` instead (see above).
|
|
29
28
|
* - `conflict`: the file is claimed by two or more patches in
|
|
30
|
-
* `patches.json`. The human `--ownership` mode
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* cross-patch conflicts silently rolled into the `unmanaged` bucket
|
|
35
|
-
* in `--json`, which misled scripts built on top of the JSON view
|
|
36
|
-
* into treating the file as routine local drift.
|
|
29
|
+
* `patches.json`. The human `--ownership` mode surfaces this bucket as
|
|
30
|
+
* `CONFLICT`; carrying the classification through the JSON pipeline lets
|
|
31
|
+
* machine consumers detect the same ownership breakage rather than seeing
|
|
32
|
+
* it rolled into `unmanaged` as routine local drift.
|
|
37
33
|
* - `binary-unsupported`: the file's comparison is binary and the owning
|
|
38
|
-
* patch body records no usable blob hash to compare against — an
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
34
|
+
* patch body records no usable blob hash to compare against — an honest
|
|
35
|
+
* "binary — comparison unsupported" instead of a permanent false
|
|
36
|
+
* `patch-owned-drift`. Deliberately NOT in the default `--check` fail set;
|
|
37
|
+
* opt in with `--fail-on binary-unsupported`.
|
|
42
38
|
*/
|
|
43
39
|
export type FileClassification = 'patch-backed' | 'patch-owned-drift' | 'unmanaged' | 'branding' | 'furnace' | 'conflict' | 'binary-unsupported';
|
|
44
40
|
export interface StatusFile {
|
|
@@ -91,13 +87,11 @@ export declare function isGeneratedBrandingPath(file: string, binaryName: string
|
|
|
91
87
|
* Classifies files into patch-backed, unmanaged, branding, furnace, or
|
|
92
88
|
* conflict buckets.
|
|
93
89
|
*
|
|
94
|
-
* Tracks patch ownership as a `Map<file, patchFilename[]>` rather than
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
* `
|
|
99
|
-
*
|
|
100
|
-
* flagged as `CONFLICT`; the JSON output was effectively lying to
|
|
101
|
-
* machine consumers about the nature of the drift.
|
|
90
|
+
* Tracks patch ownership as a `Map<file, patchFilename[]>` rather than a
|
|
91
|
+
* plain `Set<file>` so the classifier can surface cross-patch ownership
|
|
92
|
+
* conflicts the same way the human `--ownership` mode does. With only a Set,
|
|
93
|
+
* `status --json` reports `classification: "unmanaged"` on files that
|
|
94
|
+
* `--ownership` correctly flags as `CONFLICT`, which lies to machine
|
|
95
|
+
* consumers about the nature of the drift.
|
|
102
96
|
*/
|
|
103
97
|
export declare function classifyFiles(files: StatusFile[], engineDir: string, patchesDir: string, binaryName: string, furnacePrefixes: Set<string>): Promise<ClassifiedFile[]>;
|
|
@@ -120,14 +120,12 @@ async function classifySingleOwnerFile(entry, engineDir, patchesDir, matchClassi
|
|
|
120
120
|
* Classifies files into patch-backed, unmanaged, branding, furnace, or
|
|
121
121
|
* conflict buckets.
|
|
122
122
|
*
|
|
123
|
-
* Tracks patch ownership as a `Map<file, patchFilename[]>` rather than
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
* `
|
|
128
|
-
*
|
|
129
|
-
* flagged as `CONFLICT`; the JSON output was effectively lying to
|
|
130
|
-
* machine consumers about the nature of the drift.
|
|
123
|
+
* Tracks patch ownership as a `Map<file, patchFilename[]>` rather than a
|
|
124
|
+
* plain `Set<file>` so the classifier can surface cross-patch ownership
|
|
125
|
+
* conflicts the same way the human `--ownership` mode does. With only a Set,
|
|
126
|
+
* `status --json` reports `classification: "unmanaged"` on files that
|
|
127
|
+
* `--ownership` correctly flags as `CONFLICT`, which lies to machine
|
|
128
|
+
* consumers about the nature of the drift.
|
|
131
129
|
*/
|
|
132
130
|
export async function classifyFiles(files, engineDir, patchesDir, binaryName, furnacePrefixes) {
|
|
133
131
|
// One manifest load + patch discovery + memoized body reads for the
|
|
@@ -135,13 +133,12 @@ export async function classifyFiles(files, engineDir, patchesDir, binaryName, fu
|
|
|
135
133
|
// every dirty file (O(dirtyFiles × patches) redundant IO on a broad
|
|
136
134
|
// engine edit session).
|
|
137
135
|
const ctx = await createPatchedContentContext(patchesDir, engineDir);
|
|
138
|
-
// Build a multimap from file path → list of claiming patch
|
|
139
|
-
//
|
|
140
|
-
//
|
|
141
|
-
//
|
|
142
|
-
//
|
|
143
|
-
//
|
|
144
|
-
// expectation.
|
|
136
|
+
// Build a multimap from file path → list of claiming patch filenames so
|
|
137
|
+
// cross-patch ownership conflicts are detectable. A plain `Set<string>`
|
|
138
|
+
// captures only whether a path was claimed, not by whom, and collapses
|
|
139
|
+
// multi-owner files into the single-owner branch where the
|
|
140
|
+
// expected-vs-actual content comparison then routes them into `unmanaged`
|
|
141
|
+
// when the content matches neither owner's expectation.
|
|
145
142
|
const patchClaims = buildPatchClaims(ctx.manifestPatches);
|
|
146
143
|
const deps = {
|
|
147
144
|
engineDir,
|
|
@@ -176,11 +173,10 @@ async function classifyEntry(entry, deps) {
|
|
|
176
173
|
};
|
|
177
174
|
}
|
|
178
175
|
// Branding paths are tool-managed for generated edits, but a brand-new
|
|
179
|
-
// unowned branding asset must not disappear from `status --unmanaged
|
|
180
|
-
//
|
|
181
|
-
//
|
|
182
|
-
//
|
|
183
|
-
// patch claimed it yet.
|
|
176
|
+
// unowned branding asset must not disappear from `status --unmanaged`:
|
|
177
|
+
// classifying every branding path before checking ownership hides a new
|
|
178
|
+
// patch candidate (an Assets.car appearing under the active branding tree,
|
|
179
|
+
// for instance) as "branding" even though no patch claims it yet.
|
|
184
180
|
const isUnownedNewFile = owners === undefined && (primaryCode === '?' || primaryCode === 'A');
|
|
185
181
|
if (isBrandingManagedPath(entry.file, binaryName) &&
|
|
186
182
|
(!isUnownedNewFile || isGeneratedBrandingPath(entry.file, binaryName))) {
|
|
@@ -197,12 +193,11 @@ async function classifyEntry(entry, deps) {
|
|
|
197
193
|
}
|
|
198
194
|
if (isFurnace) {
|
|
199
195
|
// A furnace path claimed by exactly one patch gets the same
|
|
200
|
-
// expected-vs-actual comparison as any other single-owner path:
|
|
201
|
-
//
|
|
202
|
-
//
|
|
203
|
-
//
|
|
204
|
-
//
|
|
205
|
-
// short-circuit.
|
|
196
|
+
// expected-vs-actual comparison as any other single-owner path: after
|
|
197
|
+
// a `furnace deploy` of an edited component the deployed copy has
|
|
198
|
+
// content the owning patch's body lacks, and an unconditional
|
|
199
|
+
// short-circuit here would silently bucket that drift as `furnace`.
|
|
200
|
+
// Multi-owner and unowned furnace paths keep the short-circuit.
|
|
206
201
|
if (owners && owners.length === 1 && owners[0] !== undefined) {
|
|
207
202
|
return classifySingleOwnerFile(entry, engineDir, patchesDir, 'furnace', owners[0], ctx);
|
|
208
203
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recognizer for the one mochitest failure shape that is a function of run
|
|
3
|
+
* LENGTH rather than of the code under test: the time-driven
|
|
4
|
+
* changed-preference checks.
|
|
5
|
+
*
|
|
6
|
+
* Separate from `test-harness-crash.ts` because it is not a crash
|
|
7
|
+
* classification — the run failed, and the classifier's verdict is correct.
|
|
8
|
+
* What this adds is which KIND of failure it was, which is a different
|
|
9
|
+
* question and one that only grows as more such shapes are recorded.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Describes a failure set that consists ENTIRELY of changed-preference
|
|
13
|
+
* checks on {@link TIME_DRIVEN_PREF_NAMES}.
|
|
14
|
+
*
|
|
15
|
+
* Deliberately keyed on the pref NAMES rather than on the harness's phrasing
|
|
16
|
+
* of its changed-preference report: the phrasing is upstream copy that has
|
|
17
|
+
* no stable contract with us, and the names are the part that identifies the
|
|
18
|
+
* shape. A single block that names anything else — a real assertion, a
|
|
19
|
+
* different pref — disqualifies the whole set, because the point is to
|
|
20
|
+
* describe a run whose every failure is this noise, never to explain away
|
|
21
|
+
* one real failure sitting beside it.
|
|
22
|
+
*
|
|
23
|
+
* Pure; returns undefined when the shape does not apply.
|
|
24
|
+
*
|
|
25
|
+
* @param output - Combined harness stdout+stderr
|
|
26
|
+
* @returns Operator-facing explanation, or undefined
|
|
27
|
+
*/
|
|
28
|
+
export declare function describeChangedPrefNoise(output: string): string | undefined;
|
|
29
|
+
/** Short verdict-line note for the changed-preference-noise shape. */
|
|
30
|
+
export declare function changedPrefNoiseVerdictNote(output: string): string | undefined;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
+
/**
|
|
3
|
+
* Recognizer for the one mochitest failure shape that is a function of run
|
|
4
|
+
* LENGTH rather than of the code under test: the time-driven
|
|
5
|
+
* changed-preference checks.
|
|
6
|
+
*
|
|
7
|
+
* Separate from `test-harness-crash.ts` because it is not a crash
|
|
8
|
+
* classification — the run failed, and the classifier's verdict is correct.
|
|
9
|
+
* What this adds is which KIND of failure it was, which is a different
|
|
10
|
+
* question and one that only grows as more such shapes are recorded.
|
|
11
|
+
*/
|
|
12
|
+
import { collectUnexpectedFailureBlocks } from './test-harness-crash.js';
|
|
13
|
+
/**
|
|
14
|
+
* Preferences that move on their own as a function of how LONG a run takes,
|
|
15
|
+
* not of what it tested.
|
|
16
|
+
*
|
|
17
|
+
* Both are time-driven: a long run crosses the cold-startup check interval
|
|
18
|
+
* and the pref moves under the harness. The observable consequence is that
|
|
19
|
+
* chunk length, not the change under test, decides whether the suite is
|
|
20
|
+
* red — the same work at a smaller `--chunk` passes. FireForge cannot
|
|
21
|
+
* suppress the check (it is the harness's, not ours) but it can stop the
|
|
22
|
+
* pair being indistinguishable from two real assertion failures, which is
|
|
23
|
+
* the whole cost of the shape.
|
|
24
|
+
*
|
|
25
|
+
* Matched as substrings: the harness prints fully-qualified pref names and
|
|
26
|
+
* the leading namespace has moved upstream more than once.
|
|
27
|
+
*/
|
|
28
|
+
const TIME_DRIVEN_PREF_NAMES = ['lastColdStartupCheck', 'globalprivacycontrol'];
|
|
29
|
+
/** A failure block that is a changed-preference report rather than an assertion. */
|
|
30
|
+
const CHANGED_PREF_BLOCK_PATTERN = /pref(?:erence)?s?\b/i;
|
|
31
|
+
/**
|
|
32
|
+
* Describes a failure set that consists ENTIRELY of changed-preference
|
|
33
|
+
* checks on {@link TIME_DRIVEN_PREF_NAMES}.
|
|
34
|
+
*
|
|
35
|
+
* Deliberately keyed on the pref NAMES rather than on the harness's phrasing
|
|
36
|
+
* of its changed-preference report: the phrasing is upstream copy that has
|
|
37
|
+
* no stable contract with us, and the names are the part that identifies the
|
|
38
|
+
* shape. A single block that names anything else — a real assertion, a
|
|
39
|
+
* different pref — disqualifies the whole set, because the point is to
|
|
40
|
+
* describe a run whose every failure is this noise, never to explain away
|
|
41
|
+
* one real failure sitting beside it.
|
|
42
|
+
*
|
|
43
|
+
* Pure; returns undefined when the shape does not apply.
|
|
44
|
+
*
|
|
45
|
+
* @param output - Combined harness stdout+stderr
|
|
46
|
+
* @returns Operator-facing explanation, or undefined
|
|
47
|
+
*/
|
|
48
|
+
export function describeChangedPrefNoise(output) {
|
|
49
|
+
const blocks = collectUnexpectedFailureBlocks(output, CHANGED_PREF_BLOCK_LIMIT).filter((block) => !block.startsWith('…'));
|
|
50
|
+
if (blocks.length === 0)
|
|
51
|
+
return undefined;
|
|
52
|
+
const namesSeen = new Set();
|
|
53
|
+
for (const block of blocks) {
|
|
54
|
+
if (!CHANGED_PREF_BLOCK_PATTERN.test(block))
|
|
55
|
+
return undefined;
|
|
56
|
+
const matched = TIME_DRIVEN_PREF_NAMES.filter((name) => block.includes(name));
|
|
57
|
+
if (matched.length === 0)
|
|
58
|
+
return undefined;
|
|
59
|
+
for (const name of matched)
|
|
60
|
+
namesSeen.add(name);
|
|
61
|
+
}
|
|
62
|
+
return (`Every unexpected result in this run is a changed-preference check on ${[...namesSeen].join(' / ')}. ` +
|
|
63
|
+
'Those preferences are TIME-DRIVEN: they move once a run is long enough to cross the ' +
|
|
64
|
+
'cold-startup check interval, so they correlate with run LENGTH rather than with the ' +
|
|
65
|
+
'change under test or with the build. The first probe is to halve the chunk size ' +
|
|
66
|
+
'(`--chunk 8` where a 40-row chunk tripped it) and see whether the same work passes; ' +
|
|
67
|
+
'if it does, this was harness noise, not a regression. FireForge cannot forgive the ' +
|
|
68
|
+
'check — it belongs to the harness — only tell you which kind of failure you are ' +
|
|
69
|
+
'looking at.');
|
|
70
|
+
}
|
|
71
|
+
/** Failure blocks inspected before the changed-pref shape is abandoned. */
|
|
72
|
+
const CHANGED_PREF_BLOCK_LIMIT = 20;
|
|
73
|
+
/** Short verdict-line note for the changed-preference-noise shape. */
|
|
74
|
+
export function changedPrefNoiseVerdictNote(output) {
|
|
75
|
+
return describeChangedPrefNoise(output) === undefined
|
|
76
|
+
? undefined
|
|
77
|
+
: 'all unexpected results are time-driven changed-pref checks';
|
|
78
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Harness-crash classification for `fireforge test
|
|
2
|
+
* Harness-crash classification for `fireforge test`.
|
|
3
3
|
*
|
|
4
4
|
* The wrapped mach harness exhibits flaky non-test failures that an exit
|
|
5
5
|
* code (or a "did it print a summary" grep) cannot distinguish from real
|
|
@@ -10,25 +10,22 @@
|
|
|
10
10
|
* 'poll_interval'`, `host_statistics64(HOST_VM_INFO64) syscall failed`,
|
|
11
11
|
* `(ipc/mig) array not large enough` — a psutil/macOS mismatch) which
|
|
12
12
|
* abort the run before any test executes;
|
|
13
|
-
* - hangs after browser startup that die at the no-output timeout yet
|
|
14
|
-
*
|
|
15
|
-
* - post-green shutdown re-entry, where a fully green run stalls on
|
|
16
|
-
*
|
|
17
|
-
*
|
|
13
|
+
* - hangs after browser startup that die at the no-output timeout yet still
|
|
14
|
+
* emit a `Passed: 0` summary;
|
|
15
|
+
* - post-green shutdown re-entry, where a fully green run stalls on "must
|
|
16
|
+
* wait for focus" and records "Application shut down (without crashing)
|
|
17
|
+
* in the middle of a test!" as the only unexpected failure.
|
|
18
18
|
*
|
|
19
19
|
* Classification therefore keys on `TEST-START` presence — summary lines
|
|
20
20
|
* never count as proof that tests ran — and recognizes the crash shapes
|
|
21
|
-
* above so the command layer can retry them with a bounded budget instead
|
|
22
|
-
*
|
|
21
|
+
* above so the command layer can retry them with a bounded budget instead of
|
|
22
|
+
* reporting phantom test failures (or phantom passes).
|
|
23
23
|
*/
|
|
24
|
-
|
|
24
|
+
export type { HarnessCrashSignature } from './test-harness-signature.js';
|
|
25
|
+
import type { HarnessCrashSignature } from './test-harness-signature.js';
|
|
26
|
+
export { headedDisplayAsleepVerdictNote, headedNoOutputTimeoutHint } from './test-stall-triage.js';
|
|
25
27
|
/** How a completed harness run should be interpreted. */
|
|
26
28
|
export type HarnessRunClassification = 'tests-ran-ok' | 'test-failures' | 'harness-crash' | 'no-tests';
|
|
27
|
-
/** A recognized harness-crash shape with its evidence line. */
|
|
28
|
-
export interface HarnessCrashSignature {
|
|
29
|
-
reason: string;
|
|
30
|
-
line: string;
|
|
31
|
-
}
|
|
32
29
|
/** Numeric counts parsed from the harness's embedded result summary. */
|
|
33
30
|
export interface HarnessSummaryCounts {
|
|
34
31
|
/** Total checks the suite ran (`Ran N checks`), when the summary prints one. */
|
|
@@ -61,10 +58,10 @@ export interface HarnessRunVerdict extends HarnessSummaryCounts {
|
|
|
61
58
|
/**
|
|
62
59
|
* Set when the output embeds a green-LOOKING summary that was REJECTED:
|
|
63
60
|
* crash or truncation evidence proves the suite never completed, so the
|
|
64
|
-
* "green" counts only cover the files that ran before the run died
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
61
|
+
* "green" counts only cover the files that ran before the run died — a
|
|
62
|
+
* SIGSEGV at the second of eight files leaves a `Passed: 2 / Failed: 0`
|
|
63
|
+
* summary that reads as a pass. Callers must fail the run and surface the
|
|
64
|
+
* evidence.
|
|
68
65
|
*/
|
|
69
66
|
greenSummaryRejected?: GreenSummaryRejection;
|
|
70
67
|
/**
|
|
@@ -99,16 +96,16 @@ export declare function stripNonSignalNoise(output: string): string;
|
|
|
99
96
|
*/
|
|
100
97
|
export declare function findCrashMarkerLine(output: string): string | undefined;
|
|
101
98
|
/**
|
|
102
|
-
* True when the output embeds a COMPLETED, GREEN suite summary: an
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
* sharded runs
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
99
|
+
* True when the output embeds a COMPLETED, GREEN suite summary: an execution
|
|
100
|
+
* signal, `Unexpected results: 0` (and no non-zero unexpected count), a
|
|
101
|
+
* `SUITE_END` marker, no real `TEST-UNEXPECTED-*` lines — and NO crash
|
|
102
|
+
* marker. Such a run finished its suite, so any startup-traceback-shaped
|
|
103
|
+
* noise in the same output is by definition non-fatal and this vetoes
|
|
104
|
+
* signature-based crash classification; without the veto, fully green
|
|
105
|
+
* sharded runs report `CRASH (N attempts)` because degradation warnings
|
|
106
|
+
* match the psutil signals. A summary printed after a crash marker is NOT
|
|
107
|
+
* "completed" — it only covers the files that ran before the crash.
|
|
108
|
+
* Exported for direct unit testing.
|
|
112
109
|
*/
|
|
113
110
|
export declare function hasCompletedGreenSummary(output: string): boolean;
|
|
114
111
|
/**
|
|
@@ -193,41 +190,6 @@ export declare function formatFireforgeVerdictLine(verdict: HarnessRunVerdict, s
|
|
|
193
190
|
export declare function buildGreenSummaryRejectedMessage(rejection: GreenSummaryRejection, exitCode: number): string;
|
|
194
191
|
/** Builds the operator-facing failure message after retries are exhausted. */
|
|
195
192
|
export declare function buildHarnessCrashMessage(signature: HarnessCrashSignature, attempts: number, commandLabel?: string): string;
|
|
196
|
-
/**
|
|
197
|
-
* Optional hint appended to the harness-crash message when a HEADED run on
|
|
198
|
-
* macOS died at the no-output timeout.
|
|
199
|
-
*
|
|
200
|
-
* When `displayState` names a MEASURED display state, the hint states it
|
|
201
|
-
* as fact rather than as one of three possibilities — that is the whole
|
|
202
|
-
* point of probing: an operator staring at a bare test failure should not
|
|
203
|
-
* have to rediscover that their machine dimmed. `caffeinate` is described
|
|
204
|
-
* accurately (it prevents sleep; it cannot wake an already-sleeping
|
|
205
|
-
* display), because the previous wording sent operators to a command that
|
|
206
|
-
* could not have helped them.
|
|
207
|
-
*
|
|
208
|
-
* Pure — the platform and the probed state are injected so unit tests need
|
|
209
|
-
* no mocking.
|
|
210
|
-
*
|
|
211
|
-
* @param signature - The recognized crash shape
|
|
212
|
-
* @param context - Run mode, platform, and the probed display state
|
|
213
|
-
* @returns The hint text, or undefined when the shape does not apply
|
|
214
|
-
*/
|
|
215
|
-
export declare function headedNoOutputTimeoutHint(signature: HarnessCrashSignature, context: {
|
|
216
|
-
headless: boolean;
|
|
217
|
-
platform: string;
|
|
218
|
-
displayState?: DisplaySleepState;
|
|
219
|
-
}): string | undefined;
|
|
220
|
-
/**
|
|
221
|
-
* Verdict-line note for a headed no-output stall whose display was
|
|
222
|
-
* measured asleep. Returned as the parenthetical the verdict line carries,
|
|
223
|
-
* so the one greppable line an automated consumer reads already names the
|
|
224
|
-
* environmental cause instead of a bare `FAIL reason=crash`.
|
|
225
|
-
*/
|
|
226
|
-
export declare function headedDisplayAsleepVerdictNote(signature: HarnessCrashSignature, context: {
|
|
227
|
-
headless: boolean;
|
|
228
|
-
platform: string;
|
|
229
|
-
displayState: DisplaySleepState;
|
|
230
|
-
}): string | undefined;
|
|
231
193
|
/**
|
|
232
194
|
* True when a harness run died on SIGSEGV having produced no test evidence
|
|
233
195
|
* whatsoever.
|