@hominis/fireforge 0.46.0 → 0.46.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +381 -498
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +17 -17
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +9 -9
- package/dist/src/cli-usage-error.js +12 -12
- package/dist/src/cli.d.ts +3 -2
- package/dist/src/cli.js +29 -28
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +2 -2
- package/dist/src/commands/build.js +12 -11
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +4 -4
- package/dist/src/commands/destructive-decision.js +4 -4
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -4
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
- package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
- package/dist/src/commands/doctor-furnace-jar.js +1 -1
- package/dist/src/commands/doctor-furnace.js +22 -22
- package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -11
- package/dist/src/commands/doctor-orphaned-harness.js +10 -11
- package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
- package/dist/src/commands/doctor-patch-manifest.js +7 -6
- package/dist/src/commands/doctor-post-rebase-audit.js +2 -2
- package/dist/src/commands/doctor-source-pin.d.ts +12 -12
- package/dist/src/commands/doctor-source-pin.js +14 -14
- package/dist/src/commands/doctor-working-tree.d.ts +3 -3
- package/dist/src/commands/doctor-working-tree.js +3 -3
- package/dist/src/commands/doctor.d.ts +2 -2
- package/dist/src/commands/doctor.js +9 -9
- package/dist/src/commands/download.js +15 -13
- package/dist/src/commands/export-all.js +8 -8
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +14 -14
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +9 -9
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +1 -1
- package/dist/src/commands/export-shared.d.ts +10 -10
- package/dist/src/commands/export-shared.js +13 -13
- package/dist/src/commands/export.js +4 -4
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +1 -1
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
- package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
- package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
- package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
- package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
- package/dist/src/commands/furnace/chrome-doc.js +18 -18
- package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +4 -4
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +4 -4
- package/dist/src/commands/furnace/create-features.d.ts +2 -2
- package/dist/src/commands/furnace/create-features.js +2 -2
- package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
- package/dist/src/commands/furnace/create-mochikit.js +7 -7
- package/dist/src/commands/furnace/create-templates.d.ts +14 -14
- package/dist/src/commands/furnace/create-templates.js +18 -18
- package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
- package/dist/src/commands/furnace/create-xpcshell.js +8 -8
- package/dist/src/commands/furnace/create.d.ts +1 -1
- package/dist/src/commands/furnace/create.js +10 -10
- package/dist/src/commands/furnace/deploy.js +4 -4
- package/dist/src/commands/furnace/diff.js +7 -7
- package/dist/src/commands/furnace/index.js +1 -1
- package/dist/src/commands/furnace/init.js +15 -15
- package/dist/src/commands/furnace/list.js +2 -2
- package/dist/src/commands/furnace/override.d.ts +1 -1
- package/dist/src/commands/furnace/override.js +15 -15
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +6 -6
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -3
- package/dist/src/commands/furnace/remove-mutations.js +19 -18
- package/dist/src/commands/furnace/remove-state.d.ts +1 -1
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +2 -2
- package/dist/src/commands/furnace/rename-browser-test.js +9 -8
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
- package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
- package/dist/src/commands/furnace/rename.js +9 -9
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +7 -7
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +2 -2
- package/dist/src/commands/furnace/test-file-name.js +2 -2
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/import.js +20 -20
- package/dist/src/commands/lint-per-patch.js +8 -8
- package/dist/src/commands/lint-per-run-checkjs.d.ts +12 -13
- package/dist/src/commands/lint-per-run-checkjs.js +14 -15
- package/dist/src/commands/lint-report.d.ts +3 -3
- package/dist/src/commands/lint-report.js +4 -4
- package/dist/src/commands/lint.d.ts +3 -3
- package/dist/src/commands/lint.js +35 -35
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/package.js +2 -2
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +8 -8
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +8 -8
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -4
- package/dist/src/commands/patch/lint-ignore.js +14 -15
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +5 -5
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +3 -3
- package/dist/src/commands/patch/move-files.js +1 -1
- package/dist/src/commands/patch/patch-context.d.ts +1 -1
- package/dist/src/commands/patch/rename.d.ts +4 -4
- package/dist/src/commands/patch/rename.js +8 -8
- package/dist/src/commands/patch/reorder.js +10 -10
- package/dist/src/commands/patch/split-plan.d.ts +3 -3
- package/dist/src/commands/patch/split-plan.js +6 -5
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +5 -5
- package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +6 -6
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +5 -5
- package/dist/src/commands/patch-rename-map.d.ts +1 -1
- package/dist/src/commands/patch-rename-map.js +1 -1
- package/dist/src/commands/pending-resolution.d.ts +5 -5
- package/dist/src/commands/pending-resolution.js +5 -5
- package/dist/src/commands/re-export-adjacent.d.ts +3 -3
- package/dist/src/commands/re-export-adjacent.js +8 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +17 -17
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +29 -29
- package/dist/src/commands/re-export-files.js +14 -15
- package/dist/src/commands/re-export-lint.d.ts +26 -26
- package/dist/src/commands/re-export-lint.js +27 -27
- package/dist/src/commands/re-export-options.d.ts +1 -1
- package/dist/src/commands/re-export-options.js +1 -1
- package/dist/src/commands/re-export-register.d.ts +1 -1
- package/dist/src/commands/re-export-register.js +1 -1
- package/dist/src/commands/re-export-scan.d.ts +1 -1
- package/dist/src/commands/re-export-scan.js +7 -7
- package/dist/src/commands/re-export-single.d.ts +1 -1
- package/dist/src/commands/re-export-single.js +20 -20
- package/dist/src/commands/re-export.js +7 -6
- package/dist/src/commands/rebase/abort.js +6 -6
- package/dist/src/commands/rebase/continue.js +8 -7
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +3 -3
- package/dist/src/commands/rebase/patch-loop.js +18 -17
- package/dist/src/commands/register.js +5 -5
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/resolve.d.ts +2 -2
- package/dist/src/commands/resolve.js +3 -3
- package/dist/src/commands/run.js +26 -26
- package/dist/src/commands/setup-support.js +4 -4
- package/dist/src/commands/setup.js +1 -1
- package/dist/src/commands/source.js +1 -1
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +4 -4
- package/dist/src/commands/status-json.d.ts +14 -13
- package/dist/src/commands/status-json.js +9 -8
- package/dist/src/commands/status-output.d.ts +3 -3
- package/dist/src/commands/status-output.js +3 -3
- package/dist/src/commands/status-ownership.d.ts +3 -3
- package/dist/src/commands/status-ownership.js +3 -3
- package/dist/src/commands/status.js +22 -22
- package/dist/src/commands/test-build-phase.d.ts +1 -1
- package/dist/src/commands/test-build-phase.js +17 -17
- package/dist/src/commands/test-diagnose.d.ts +1 -1
- package/dist/src/commands/test-diagnose.js +20 -20
- package/dist/src/commands/test-modes.d.ts +2 -2
- package/dist/src/commands/test-modes.js +4 -4
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +15 -15
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +13 -13
- package/dist/src/commands/test-verdict.d.ts +6 -6
- package/dist/src/commands/test-verdict.js +11 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +36 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.js +5 -5
- package/dist/src/commands/token.js +9 -9
- package/dist/src/commands/tree.js +19 -19
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +7 -7
- package/dist/src/commands/verify.d.ts +3 -3
- package/dist/src/commands/verify.js +10 -10
- package/dist/src/commands/watch.js +11 -11
- package/dist/src/commands/wire.js +13 -13
- package/dist/src/core/ast-utils.d.ts +7 -7
- package/dist/src/core/ast-utils.js +8 -8
- package/dist/src/core/branding.d.ts +5 -5
- package/dist/src/core/branding.js +3 -3
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +4 -4
- package/dist/src/core/build-audit-platform.d.ts +6 -6
- package/dist/src/core/build-audit-platform.js +26 -26
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +7 -7
- package/dist/src/core/build-audit-resolve.d.ts +5 -5
- package/dist/src/core/build-audit-resolve.js +6 -6
- package/dist/src/core/build-audit-skip.d.ts +8 -8
- package/dist/src/core/build-audit-skip.js +12 -12
- package/dist/src/core/build-audit-transforms.d.ts +2 -2
- package/dist/src/core/build-audit-transforms.js +3 -3
- package/dist/src/core/build-audit.d.ts +8 -8
- package/dist/src/core/build-audit.js +39 -37
- package/dist/src/core/build-baseline-types.d.ts +19 -18
- package/dist/src/core/build-baseline-types.js +1 -1
- package/dist/src/core/build-baseline.d.ts +8 -8
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +15 -15
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +13 -13
- package/dist/src/core/build-prepare.d.ts +4 -4
- package/dist/src/core/build-prepare.js +16 -15
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-state.js +2 -2
- package/dist/src/core/config-validate-build-audit.js +3 -3
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +2 -2
- package/dist/src/core/config-validate.js +8 -9
- package/dist/src/core/config.d.ts +10 -10
- package/dist/src/core/config.js +10 -10
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +16 -16
- package/dist/src/core/destructive.d.ts +14 -14
- package/dist/src/core/destructive.js +9 -9
- package/dist/src/core/diff-hunks.d.ts +2 -2
- package/dist/src/core/diff-hunks.js +7 -7
- package/dist/src/core/discard-baseline.d.ts +10 -10
- package/dist/src/core/discard-baseline.js +15 -16
- package/dist/src/core/display-state.d.ts +11 -11
- package/dist/src/core/display-state.js +12 -12
- package/dist/src/core/engine-changes.d.ts +2 -2
- package/dist/src/core/engine-changes.js +2 -2
- package/dist/src/core/engine-precondition.d.ts +4 -4
- package/dist/src/core/engine-precondition.js +2 -2
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +37 -37
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +8 -8
- package/dist/src/core/file-lock-owner.d.ts +11 -11
- package/dist/src/core/file-lock-owner.js +18 -18
- package/dist/src/core/file-lock.d.ts +12 -12
- package/dist/src/core/file-lock.js +52 -39
- package/dist/src/core/firefox-cache.d.ts +1 -1
- package/dist/src/core/firefox-cache.js +10 -10
- package/dist/src/core/firefox-download.d.ts +3 -3
- package/dist/src/core/firefox-download.js +6 -6
- package/dist/src/core/firefox-extract.d.ts +2 -2
- package/dist/src/core/firefox-extract.js +13 -13
- package/dist/src/core/firefox.d.ts +5 -5
- package/dist/src/core/firefox.js +8 -8
- package/dist/src/core/furnace-apply-dry-run.js +1 -1
- package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
- package/dist/src/core/furnace-apply-ftl.js +8 -8
- package/dist/src/core/furnace-apply-helpers.d.ts +9 -9
- package/dist/src/core/furnace-apply-helpers.js +21 -21
- package/dist/src/core/furnace-apply-output.js +1 -1
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +9 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
- package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
- package/dist/src/core/furnace-apply.d.ts +3 -3
- package/dist/src/core/furnace-apply.js +22 -21
- package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
- package/dist/src/core/furnace-checksum-utils.js +5 -5
- package/dist/src/core/furnace-config-custom.d.ts +1 -1
- package/dist/src/core/furnace-config-custom.js +2 -2
- package/dist/src/core/furnace-config-order.js +1 -1
- package/dist/src/core/furnace-config-tokens.d.ts +3 -3
- package/dist/src/core/furnace-config-tokens.js +3 -3
- package/dist/src/core/furnace-config-validate.js +2 -2
- package/dist/src/core/furnace-config.d.ts +4 -4
- package/dist/src/core/furnace-config.js +18 -18
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +6 -6
- package/dist/src/core/furnace-css-fragments.d.ts +6 -6
- package/dist/src/core/furnace-css-fragments.js +11 -11
- package/dist/src/core/furnace-dir-entry.d.ts +1 -1
- package/dist/src/core/furnace-dir-entry.js +1 -1
- package/dist/src/core/furnace-jsconfig.d.ts +7 -7
- package/dist/src/core/furnace-jsconfig.js +22 -20
- package/dist/src/core/furnace-operation.d.ts +21 -20
- package/dist/src/core/furnace-operation.js +36 -34
- package/dist/src/core/furnace-precondition.d.ts +10 -10
- package/dist/src/core/furnace-precondition.js +8 -8
- package/dist/src/core/furnace-refresh.js +2 -2
- package/dist/src/core/furnace-registration-ast.d.ts +2 -2
- package/dist/src/core/furnace-registration-ast.js +9 -9
- package/dist/src/core/furnace-registration-remove.d.ts +4 -4
- package/dist/src/core/furnace-registration-remove.js +6 -6
- package/dist/src/core/furnace-registration-validate.d.ts +2 -2
- package/dist/src/core/furnace-registration-validate.js +2 -2
- package/dist/src/core/furnace-registration.d.ts +5 -5
- package/dist/src/core/furnace-registration.js +7 -7
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-stale-export.d.ts +17 -16
- package/dist/src/core/furnace-stale-export.js +16 -15
- package/dist/src/core/furnace-staleness.d.ts +2 -2
- package/dist/src/core/furnace-staleness.js +2 -2
- package/dist/src/core/furnace-state-persist.d.ts +10 -10
- package/dist/src/core/furnace-state-persist.js +10 -10
- package/dist/src/core/furnace-step-errors.d.ts +6 -6
- package/dist/src/core/furnace-step-errors.js +6 -6
- package/dist/src/core/furnace-validate-accessibility.js +14 -14
- package/dist/src/core/furnace-validate-compatibility.js +9 -9
- package/dist/src/core/furnace-validate-registration.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +13 -13
- package/dist/src/core/furnace-validate-structure.d.ts +1 -1
- package/dist/src/core/furnace-validate-structure.js +4 -4
- package/dist/src/core/furnace-validate.js +9 -9
- package/dist/src/core/furnace-version-drift.d.ts +5 -5
- package/dist/src/core/furnace-version-drift.js +5 -5
- package/dist/src/core/git-base.d.ts +4 -4
- package/dist/src/core/git-base.js +9 -9
- package/dist/src/core/git-diff-new-file.d.ts +4 -4
- package/dist/src/core/git-diff-new-file.js +8 -8
- package/dist/src/core/git-diff.d.ts +4 -4
- package/dist/src/core/git-diff.js +35 -34
- package/dist/src/core/git-file-ops.d.ts +6 -6
- package/dist/src/core/git-file-ops.js +7 -7
- package/dist/src/core/git-readonly-index.d.ts +12 -12
- package/dist/src/core/git-readonly-index.js +12 -12
- package/dist/src/core/git-status.d.ts +4 -4
- package/dist/src/core/git-status.js +4 -4
- package/dist/src/core/git.d.ts +3 -3
- package/dist/src/core/git.js +14 -14
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +20 -20
- package/dist/src/core/history-log.d.ts +3 -3
- package/dist/src/core/history-log.js +3 -3
- package/dist/src/core/license-headers.d.ts +19 -18
- package/dist/src/core/license-headers.js +29 -28
- package/dist/src/core/mach-build-artifacts.d.ts +21 -21
- package/dist/src/core/mach-build-artifacts.js +23 -23
- package/dist/src/core/mach-error-hints.d.ts +5 -5
- package/dist/src/core/mach-error-hints.js +13 -13
- package/dist/src/core/mach-known-noise-filter.d.ts +41 -38
- package/dist/src/core/mach-known-noise-filter.js +53 -50
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +15 -15
- package/dist/src/core/mach-python.d.ts +2 -1
- package/dist/src/core/mach-python.js +4 -3
- package/dist/src/core/mach-resource-shim.d.ts +12 -12
- package/dist/src/core/mach-resource-shim.js +20 -20
- package/dist/src/core/mach.d.ts +23 -23
- package/dist/src/core/mach.js +36 -36
- package/dist/src/core/marionette-port.d.ts +15 -13
- package/dist/src/core/marionette-port.js +34 -31
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +23 -23
- package/dist/src/core/markdown-table.d.ts +9 -9
- package/dist/src/core/markdown-table.js +14 -14
- package/dist/src/core/mochitest-server-port.d.ts +8 -8
- package/dist/src/core/mochitest-server-port.js +14 -14
- package/dist/src/core/module-resolution-preflight.d.ts +8 -8
- package/dist/src/core/module-resolution-preflight.js +11 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
- package/dist/src/core/moz-manifest-helpers.js +7 -7
- package/dist/src/core/moz-manifest-register.d.ts +1 -1
- package/dist/src/core/moz-manifest-register.js +2 -2
- package/dist/src/core/moz-manifest-rules.js +11 -11
- package/dist/src/core/moz-manifest-tokenizers.js +1 -1
- package/dist/src/core/ownership-table.d.ts +5 -5
- package/dist/src/core/ownership-table.js +7 -7
- package/dist/src/core/parser-fallback.d.ts +3 -3
- package/dist/src/core/parser-fallback.js +3 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
- package/dist/src/core/patch-apply-fuzz.js +9 -9
- package/dist/src/core/patch-apply.d.ts +9 -9
- package/dist/src/core/patch-apply.js +30 -30
- package/dist/src/core/patch-export-update.d.ts +4 -4
- package/dist/src/core/patch-export-update.js +3 -3
- package/dist/src/core/patch-export.d.ts +10 -10
- package/dist/src/core/patch-export.js +13 -13
- package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
- package/dist/src/core/patch-identifier-suggest.js +4 -4
- package/dist/src/core/patch-lint-binary.d.ts +7 -7
- package/dist/src/core/patch-lint-cache.d.ts +2 -2
- package/dist/src/core/patch-lint-cache.js +13 -13
- package/dist/src/core/patch-lint-checkjs.d.ts +26 -26
- package/dist/src/core/patch-lint-checkjs.js +42 -41
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
- package/dist/src/core/patch-lint-creators.d.ts +3 -3
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +13 -13
- package/dist/src/core/patch-lint-cross.js +21 -21
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +5 -5
- package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
- package/dist/src/core/patch-lint-diff-tag.js +5 -5
- package/dist/src/core/patch-lint-diff.d.ts +4 -4
- package/dist/src/core/patch-lint-diff.js +4 -4
- package/dist/src/core/patch-lint-file-size.d.ts +3 -3
- package/dist/src/core/patch-lint-file-size.js +3 -3
- package/dist/src/core/patch-lint-forward-registration.d.ts +4 -4
- package/dist/src/core/patch-lint-forward-registration.js +12 -12
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +11 -11
- package/dist/src/core/patch-lint-module-registration.d.ts +1 -1
- package/dist/src/core/patch-lint-module-registration.js +1 -1
- package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
- package/dist/src/core/patch-lint-mozbuild.js +10 -10
- package/dist/src/core/patch-lint-observer.d.ts +3 -3
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint-ownership.d.ts +6 -6
- package/dist/src/core/patch-lint-ownership.js +6 -6
- package/dist/src/core/patch-lint-prettier.d.ts +6 -6
- package/dist/src/core/patch-lint-prettier.js +6 -6
- package/dist/src/core/patch-lint-queue-types.d.ts +1 -1
- package/dist/src/core/patch-lint-queue-types.js +1 -1
- package/dist/src/core/patch-lint-staged-registration.d.ts +2 -2
- package/dist/src/core/patch-lint-staged-registration.js +6 -6
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +27 -26
- package/dist/src/core/patch-lint.js +48 -46
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +8 -8
- package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
- package/dist/src/core/patch-manifest-consistency.js +16 -17
- package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
- package/dist/src/core/patch-manifest-files-affected.js +3 -3
- package/dist/src/core/patch-manifest-io.d.ts +14 -14
- package/dist/src/core/patch-manifest-io.js +27 -27
- package/dist/src/core/patch-manifest-query.d.ts +1 -1
- package/dist/src/core/patch-manifest-query.js +4 -4
- package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
- package/dist/src/core/patch-manifest-resolve.js +7 -7
- package/dist/src/core/patch-manifest-validate.js +3 -3
- package/dist/src/core/patch-manifest.d.ts +2 -2
- package/dist/src/core/patch-manifest.js +2 -2
- package/dist/src/core/patch-parse.d.ts +14 -14
- package/dist/src/core/patch-parse.js +16 -16
- package/dist/src/core/patch-registration-refs.d.ts +4 -4
- package/dist/src/core/patch-registration-refs.js +7 -7
- package/dist/src/core/patch-transform.d.ts +8 -8
- package/dist/src/core/patch-transform.js +13 -13
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +5 -5
- package/dist/src/core/rebase-session.d.ts +7 -7
- package/dist/src/core/rebase-session.js +8 -8
- package/dist/src/core/register-result.d.ts +1 -1
- package/dist/src/core/register-result.js +1 -1
- package/dist/src/core/register-scaffold.d.ts +2 -2
- package/dist/src/core/register-scaffold.js +3 -3
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +4 -4
- package/dist/src/core/register-xpcshell-test.d.ts +2 -2
- package/dist/src/core/register-xpcshell-test.js +2 -2
- package/dist/src/core/run-log-redact.d.ts +12 -12
- package/dist/src/core/run-log-redact.js +16 -16
- package/dist/src/core/run-log.d.ts +9 -9
- package/dist/src/core/run-log.js +14 -14
- package/dist/src/core/shared-ftl.d.ts +2 -2
- package/dist/src/core/shared-ftl.js +6 -6
- package/dist/src/core/signal-critical.d.ts +2 -2
- package/dist/src/core/signal-critical.js +2 -2
- package/dist/src/core/smoke-patterns.d.ts +5 -5
- package/dist/src/core/smoke-patterns.js +9 -9
- package/dist/src/core/state-file.d.ts +3 -3
- package/dist/src/core/status-binary.d.ts +8 -8
- package/dist/src/core/status-binary.js +12 -12
- package/dist/src/core/status-classify.d.ts +17 -17
- package/dist/src/core/status-classify.js +11 -11
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +15 -15
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +67 -67
- package/dist/src/core/test-harness-output.d.ts +7 -7
- package/dist/src/core/test-harness-output.js +7 -7
- package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
- package/dist/src/core/test-harness-verdict-notes.js +4 -4
- package/dist/src/core/test-path-scope.d.ts +8 -8
- package/dist/src/core/test-path-scope.js +11 -11
- package/dist/src/core/test-stale-check.d.ts +22 -21
- package/dist/src/core/test-stale-check.js +29 -28
- package/dist/src/core/test-stale-symlink.d.ts +1 -1
- package/dist/src/core/test-stale-symlink.js +1 -1
- package/dist/src/core/test-stall-triage.d.ts +9 -9
- package/dist/src/core/test-stall-triage.js +22 -22
- package/dist/src/core/token-category.d.ts +4 -4
- package/dist/src/core/token-category.js +13 -12
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +17 -9
- package/dist/src/core/token-dark-mode.js +41 -28
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +6 -6
- package/dist/src/core/token-inventory.js +7 -7
- package/dist/src/core/token-manager.d.ts +3 -3
- package/dist/src/core/token-manager.js +21 -21
- package/dist/src/core/token-scaffold.d.ts +4 -4
- package/dist/src/core/token-scaffold.js +4 -4
- package/dist/src/core/token-variant.d.ts +14 -14
- package/dist/src/core/token-variant.js +32 -32
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +22 -22
- package/dist/src/core/tree-cow.d.ts +3 -3
- package/dist/src/core/tree-cow.js +6 -6
- package/dist/src/core/tree-guard.d.ts +3 -3
- package/dist/src/core/tree-guard.js +23 -23
- package/dist/src/core/tree-store.d.ts +15 -15
- package/dist/src/core/tree-store.js +35 -33
- package/dist/src/core/typecheck-shim.d.ts +16 -15
- package/dist/src/core/typecheck-shim.js +26 -25
- package/dist/src/core/typecheck.d.ts +12 -12
- package/dist/src/core/typecheck.js +31 -31
- package/dist/src/core/wire-destroy.d.ts +2 -2
- package/dist/src/core/wire-destroy.js +5 -5
- package/dist/src/core/wire-dom-fragment.d.ts +3 -3
- package/dist/src/core/wire-dom-fragment.js +6 -6
- package/dist/src/core/wire-init.d.ts +2 -2
- package/dist/src/core/wire-init.js +7 -7
- package/dist/src/core/wire-subscript.d.ts +1 -1
- package/dist/src/core/wire-subscript.js +3 -3
- package/dist/src/core/wire-utils.d.ts +9 -9
- package/dist/src/core/wire-utils.js +11 -11
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +26 -26
- package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
- package/dist/src/core/xpcshell-profile-dir.js +7 -7
- package/dist/src/errors/base.d.ts +22 -21
- package/dist/src/errors/base.js +22 -21
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +6 -6
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/git.d.ts +1 -1
- package/dist/src/errors/git.js +1 -1
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +3 -3
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +1 -1
- package/dist/src/errors/run.d.ts +1 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/types/commands/options.d.ts +86 -85
- package/dist/src/types/commands/patches.d.ts +19 -19
- package/dist/src/types/commands/project.d.ts +3 -3
- package/dist/src/types/config.d.ts +24 -23
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/json.d.ts +3 -3
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/typecheck.d.ts +3 -3
- package/dist/src/utils/assert.d.ts +1 -1
- package/dist/src/utils/assert.js +6 -6
- package/dist/src/utils/build-info.d.ts +5 -5
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +5 -5
- package/dist/src/utils/child-env.js +5 -5
- package/dist/src/utils/concurrency.d.ts +2 -2
- package/dist/src/utils/concurrency.js +2 -2
- package/dist/src/utils/elapsed.js +1 -1
- package/dist/src/utils/errors.d.ts +8 -8
- package/dist/src/utils/errors.js +8 -8
- package/dist/src/utils/fs.d.ts +1 -1
- package/dist/src/utils/fs.js +8 -8
- package/dist/src/utils/line-dispatch.d.ts +3 -3
- package/dist/src/utils/line-dispatch.js +5 -5
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.js +11 -11
- package/dist/src/utils/machine-output.js +2 -2
- package/dist/src/utils/options.d.ts +13 -13
- package/dist/src/utils/options.js +20 -20
- package/dist/src/utils/package-root.js +2 -2
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/process-group.d.ts +8 -8
- package/dist/src/utils/process-group.js +19 -19
- package/dist/src/utils/process.d.ts +34 -33
- package/dist/src/utils/process.js +20 -19
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +6 -6
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +7 -7
- package/dist/src/utils/sleep.js +7 -7
- package/dist/src/utils/stdio-drain.d.ts +7 -7
- package/dist/src/utils/stdio-drain.js +8 -8
- package/dist/src/utils/validation.d.ts +11 -12
- package/dist/src/utils/validation.js +20 -21
- package/docs/README.md +2 -2
- package/docs/configuration.md +120 -114
- package/docs/exit-codes.md +63 -58
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +412 -251
- package/docs/machine-output.md +33 -32
- package/docs/patch-workflow.md +48 -45
- package/docs/run-logs.md +62 -58
- package/docs/testing.md +101 -101
- package/docs/verification-trees.md +23 -22
- package/package.json +2 -2
|
@@ -19,7 +19,7 @@ export function isString(value) {
|
|
|
19
19
|
* @returns True if value is a finite number
|
|
20
20
|
*/
|
|
21
21
|
export function isNumber(value) {
|
|
22
|
-
// Number.isFinite matches the documented contract: NaN
|
|
22
|
+
// Number.isFinite matches the documented contract: NaN and ±Infinity are
|
|
23
23
|
// excluded (a JSON config field of 1e999 parses to Infinity and used to
|
|
24
24
|
// validate as a legal number).
|
|
25
25
|
return typeof value === 'number' && Number.isFinite(value);
|
|
@@ -42,9 +42,9 @@ export function isPositiveInteger(value) {
|
|
|
42
42
|
* orders instead of failing fast.
|
|
43
43
|
*
|
|
44
44
|
* Rejects leading-zero forms ("01"), decimals ("1.5"), whitespace, and
|
|
45
|
-
* non-numeric garbage via a strict regex
|
|
46
|
-
*
|
|
47
|
-
*
|
|
45
|
+
* non-numeric garbage via a strict regex. Only the canonical representation
|
|
46
|
+
* is accepted, so there is no ambiguity between what the user typed and what
|
|
47
|
+
* the value becomes on disk.
|
|
48
48
|
*
|
|
49
49
|
* @param flagName - Flag name to include in the error (e.g. `--order`)
|
|
50
50
|
* @param rawValue - Raw string value from Commander
|
|
@@ -83,8 +83,8 @@ export function isArray(value) {
|
|
|
83
83
|
* Narrows a JSON value to a JSON object node (excludes arrays and `null`).
|
|
84
84
|
*
|
|
85
85
|
* Unlike {@link isObject} this accepts only values already known to be JSON
|
|
86
|
-
* data, so the narrowed `JsonObject` keeps its concrete value contract
|
|
87
|
-
*
|
|
86
|
+
* data, so the narrowed `JsonObject` keeps its concrete value contract.
|
|
87
|
+
* Use it when walking a `JsonValue` tree rather than at `unknown` boundaries.
|
|
88
88
|
* @param value - JSON value to check
|
|
89
89
|
* @returns True if value is a JSON object node
|
|
90
90
|
*/
|
|
@@ -110,16 +110,16 @@ export function isValidFirefoxCandidate(candidate) {
|
|
|
110
110
|
/**
|
|
111
111
|
* Naming contract for this module's checks.
|
|
112
112
|
*
|
|
113
|
-
* `validate*` is easy to spread across incompatible return contracts
|
|
113
|
+
* `validate*` is easy to spread across incompatible return contracts: some
|
|
114
114
|
* throwing and returning void, some returning an issue list, some a parsed
|
|
115
|
-
* value, some a boolean, some an error
|
|
116
|
-
*
|
|
115
|
+
* value, some a boolean, some an error message. A caller cannot tell which
|
|
116
|
+
* from the name. Passing a throwing `validate*` to a clack `validate`
|
|
117
117
|
* callback, which expects a returned message, kills the prompt instead of
|
|
118
118
|
* re-prompting.
|
|
119
119
|
*
|
|
120
120
|
* The two dominant contracts keep the prefix:
|
|
121
|
-
* - `validate
|
|
122
|
-
* - `is*` / `has
|
|
121
|
+
* - `validate*`: throws on failure, or returns an issue list.
|
|
122
|
+
* - `is*` / `has*`: a type predicate or boolean.
|
|
123
123
|
* The message-returning minority is `describe*Problem`, which reads as what
|
|
124
124
|
* it is: a description of what is wrong, or `undefined`.
|
|
125
125
|
*
|
|
@@ -129,9 +129,9 @@ export function isValidFirefoxCandidate(candidate) {
|
|
|
129
129
|
* Valid Firefox product identifiers.
|
|
130
130
|
*
|
|
131
131
|
* `satisfies readonly FirefoxProduct[]` links the runtime list to the union
|
|
132
|
-
* in
|
|
133
|
-
* declare. It cannot see a union member missing from this list
|
|
134
|
-
* `readonly T[]` check never fails for being short. The reverse direction is
|
|
132
|
+
* in one direction: it rejects an entry here that the union does not
|
|
133
|
+
* declare. It cannot see a union member missing from this list, because
|
|
134
|
+
* widening a `readonly T[]` check never fails for being short. The reverse direction is
|
|
135
135
|
* covered by the `ExhaustiveFirefoxProductList` operand below, which stops
|
|
136
136
|
* compiling when the union grows past this list.
|
|
137
137
|
*/
|
|
@@ -146,22 +146,21 @@ export const FIREFOX_PRODUCTS = FIREFOX_PRODUCT_VALUES;
|
|
|
146
146
|
* Validates a Firefox product string.
|
|
147
147
|
*
|
|
148
148
|
* A type predicate, matching its sibling {@link isValidProjectLicense}.
|
|
149
|
-
* Returning plain `boolean` would force
|
|
150
|
-
*
|
|
151
|
-
* check IS the runtime proof.
|
|
149
|
+
* Returning plain `boolean` would force `as FirefoxProduct` casts at the
|
|
150
|
+
* call sites even though the `.includes` check is the runtime proof.
|
|
152
151
|
*/
|
|
153
152
|
export const isValidFirefoxProduct = makeEnumGuard(FIREFOX_PRODUCTS);
|
|
154
153
|
/**
|
|
155
154
|
* Builds a type predicate from a `readonly` tuple of allowed values.
|
|
156
155
|
*
|
|
157
|
-
* Deriving the type from the list
|
|
158
|
-
* hand-maintaining a matching array
|
|
156
|
+
* Deriving the type from the list, rather than declaring a union and
|
|
157
|
+
* hand-maintaining a matching array, removes a whole class of drift: a
|
|
159
158
|
* union can otherwise accept a stale allowlist with no compile error, and a
|
|
160
159
|
* copy of the member list on the `fireforge.json` read path can silently
|
|
161
160
|
* reject a newly added value.
|
|
162
161
|
*
|
|
163
162
|
* Returning a predicate rather than a boolean is what removes the `as`
|
|
164
|
-
* casts: `.includes`
|
|
163
|
+
* casts: `.includes` is the runtime proof, so the caller should not have to
|
|
165
164
|
* re-assert it. `ParsedRecord.stringEnum` (src/utils/parse.ts) consumes
|
|
166
165
|
* exactly this shape.
|
|
167
166
|
*
|
|
@@ -311,7 +310,7 @@ export function normalizeTokenName(name) {
|
|
|
311
310
|
* Normalizes a patch display name against its category:
|
|
312
311
|
* strips a trailing `.patch` and any redundant `NNN-<category>-` /
|
|
313
312
|
* `<category>-` prefixes, case-insensitively and repeatedly, mirroring
|
|
314
|
-
* the filename slug pipeline's require-the-category-token rule
|
|
313
|
+
* the filename slug pipeline's require-the-category-token rule. A bare
|
|
315
314
|
* leading number is never stripped, so names like `2-step-verification`
|
|
316
315
|
* survive intact. Falls back to the `.patch`-stripped stem when the
|
|
317
316
|
* strip would empty the name.
|
package/docs/README.md
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
[`../README.md`](../README.md) is the getting-started page. These files are
|
|
6
6
|
the reference material behind it. `fireforge --help` (and
|
|
7
|
-
`fireforge <command> --help`)
|
|
8
|
-
|
|
7
|
+
`fireforge <command> --help`) is always the authority on flags. These docs
|
|
8
|
+
cover the things a flag list cannot say.
|
|
9
9
|
|
|
10
10
|
## Using FireForge
|
|
11
11
|
|
package/docs/configuration.md
CHANGED
|
@@ -2,55 +2,57 @@
|
|
|
2
2
|
|
|
3
3
|
# Configuration
|
|
4
4
|
|
|
5
|
-
`fireforge.json` at the project root
|
|
5
|
+
`fireforge.json` at the project root holds the project's configuration, and
|
|
6
6
|
`furnace.json` holds component configuration. This file covers the settings
|
|
7
|
-
whose
|
|
7
|
+
whose behavior needs more than a schema line, plus the environment variables
|
|
8
8
|
FireForge reads.
|
|
9
9
|
|
|
10
|
-
## `firefox
|
|
10
|
+
## `firefox`, the source pin
|
|
11
11
|
|
|
12
|
-
`firefox.version
|
|
13
|
-
`firefox.
|
|
14
|
-
from. `fireforge source set` writes
|
|
12
|
+
`firefox.version`, together with `firefox.product` and optionally
|
|
13
|
+
`firefox.sha256` and `firefox.candidate`, is the source pin that
|
|
14
|
+
`fireforge download` resolves an archive from. `fireforge source set` writes
|
|
15
|
+
it.
|
|
15
16
|
|
|
16
|
-
The pin lives in `fireforge.json`
|
|
17
|
-
is worth knowing when
|
|
18
|
-
after an accidental reformat also reverts an
|
|
19
|
-
is then building a different version than the
|
|
17
|
+
The pin lives in `fireforge.json` next to hand-maintained policy sections,
|
|
18
|
+
which is worth knowing when you revert that file. Running
|
|
19
|
+
`git checkout -- fireforge.json` after an accidental reformat also reverts an
|
|
20
|
+
uncommitted pin, and the tree is then building a different version than the
|
|
21
|
+
config claims.
|
|
20
22
|
|
|
21
23
|
### Archive integrity: `firefox.sha256` and `firefox.allowUnverifiedDownload`
|
|
22
24
|
|
|
23
25
|
Every fresh download is checked against Mozilla's published `SHA256SUMS` for
|
|
24
|
-
the release
|
|
25
|
-
check also
|
|
26
|
-
404, a captive portal answering with an HTML page, a dropped connection or
|
|
27
|
-
timeout. TLS alone is thin trust for the artifact that becomes the git
|
|
26
|
+
the release. A mismatch fails the download and discards the archive. The
|
|
27
|
+
check also fails closed when the published digest cannot be obtained at all:
|
|
28
|
+
a 404, a captive portal answering with an HTML page, a dropped connection, or
|
|
29
|
+
a timeout. TLS alone is thin trust for the artifact that becomes the git
|
|
28
30
|
baseline every patch is built on, and "the checksum host was unreachable" is
|
|
29
31
|
exactly the condition someone positioned on the network can arrange.
|
|
30
32
|
|
|
31
33
|
- `firefox.sha256` pins the digest. It takes precedence over the published
|
|
32
34
|
file and is the right answer for reproducible builds and offline mirrors:
|
|
33
|
-
obtain it out of band and the download verifies with no network beyond the
|
|
35
|
+
obtain it out of band, and the download verifies with no network beyond the
|
|
34
36
|
archive itself.
|
|
35
37
|
- `firefox.allowUnverifiedDownload: true` accepts a download when the
|
|
36
|
-
published digest is
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
instead. A digest that
|
|
40
|
-
|
|
38
|
+
published digest is unavailable, with a loud warning. This disables the
|
|
39
|
+
integrity check for that case, so the archive is trusted on TLS alone. Use
|
|
40
|
+
it only for a mirror you already trust, and prefer pinning `sha256`
|
|
41
|
+
instead. A digest that is fetched and does not match is rejected either
|
|
42
|
+
way. The setting is ignored when `sha256` is set.
|
|
41
43
|
|
|
42
|
-
`fireforge doctor` reports the pin beside what the checkout actually is
|
|
44
|
+
`fireforge doctor` reports the pin beside what the checkout actually is (the
|
|
43
45
|
engine's own `browser/config/version.txt` and the version the last download
|
|
44
|
-
recorded
|
|
45
|
-
may legitimately be mid-migration. `product`, `sha256` and `candidate`
|
|
46
|
-
recorded counterpart on disk, so the check does not claim to have
|
|
47
|
-
them.
|
|
46
|
+
recorded) and warns when they disagree. It is a report, not a lock, since a
|
|
47
|
+
tree may legitimately be mid-migration. `product`, `sha256` and `candidate`
|
|
48
|
+
have no recorded counterpart on disk, so the check does not claim to have
|
|
49
|
+
verified them.
|
|
48
50
|
|
|
49
51
|
## External toolchains
|
|
50
52
|
|
|
51
53
|
Projects with generated asset prerequisites can declare opt-in
|
|
52
|
-
`externalToolchains`. `fireforge doctor` reports missing
|
|
53
|
-
errors and missing
|
|
54
|
+
`externalToolchains`. `fireforge doctor` reports missing required tools as
|
|
55
|
+
errors and missing optional tools as warnings.
|
|
54
56
|
|
|
55
57
|
Seasonal branding on macOS, for example, can declare Apple's Icon Composer
|
|
56
58
|
tool at
|
|
@@ -59,27 +61,28 @@ plus `actool` via `xcrun`, `sips`, and `iconutil`.
|
|
|
59
61
|
|
|
60
62
|
## `patchLint`
|
|
61
63
|
|
|
62
|
-
Per-patch lint type-checks plain Firefox JS against a built-in
|
|
63
|
-
shim that tracks upstream WebIDL additions per release.
|
|
64
|
+
Per-patch lint type-checks plain Firefox JS against a built-in
|
|
65
|
+
Firefox-globals shim that tracks upstream WebIDL additions per release.
|
|
64
66
|
|
|
65
|
-
- `patchLint.checkJsExtraShim` adds members to the structured shim globals
|
|
66
|
-
TypeScript interface merging,
|
|
67
|
+
- `patchLint.checkJsExtraShim` adds members to the structured shim globals
|
|
68
|
+
via TypeScript interface merging, for example
|
|
67
69
|
`interface ChromeUtilsShim { newApi(): any }`.
|
|
68
70
|
- `patchLint.checkJsTestFiles: true` extends the pass to patch-owned test
|
|
69
|
-
`.js` files (`browser_
|
|
70
|
-
is checked as its own small script-scope program against a loose
|
|
71
|
-
harness shim.
|
|
71
|
+
`.js` files (`browser_*`, `test_*`, `xpcshell_*`, and `/test/` paths). Each
|
|
72
|
+
one is checked as its own small script-scope program against a loose
|
|
73
|
+
built-in harness shim.
|
|
72
74
|
- `patchLint.checkJsTestShim` points at a project `.d.ts` whose typed
|
|
73
|
-
declarations (
|
|
74
|
-
baseline, so calls to
|
|
75
|
-
|
|
75
|
+
declarations (a real `TestUtils` interface, say) override the loose
|
|
76
|
+
baseline, so calls to harness members that do not exist fail at export
|
|
77
|
+
time.
|
|
78
|
+
- `patchLint.prettier` (`'off'`, `'warning'` or `'error'`, default `'off'`)
|
|
76
79
|
runs the project's configured Prettier over patch-owned `.sys.mjs`
|
|
77
80
|
modules. It runs from inside `engine/`, so `engine/.prettierrc*` and
|
|
78
|
-
`engine/.prettierignore` decide
|
|
79
|
-
can report a false pass when the root `.prettierignore` excludes
|
|
81
|
+
`engine/.prettierignore` decide the outcome. The same command run from the
|
|
82
|
+
repo root can report a false pass when the root `.prettierignore` excludes
|
|
80
83
|
`engine/`. Prettier is resolved from `engine/node_modules`, then the
|
|
81
|
-
project's, then `npx --no-install`.
|
|
82
|
-
scope for the per-patch tier
|
|
84
|
+
project's, then `npx --no-install`. Left at `'off'`, formatting is out of
|
|
85
|
+
scope for the per-patch tier, and no other tier checks `.sys.mjs`
|
|
83
86
|
formatting either.
|
|
84
87
|
- `patchLint.fileSizeThresholds` tunes the `file-too-large` line counts per
|
|
85
88
|
file class:
|
|
@@ -96,11 +99,11 @@ shim that tracks upstream WebIDL additions per release.
|
|
|
96
99
|
```
|
|
97
100
|
|
|
98
101
|
Every field is optional and merges over the defaults (general
|
|
99
|
-
`500/750/900`, test `1200/1400/1600`). The merged triple
|
|
100
|
-
`notice <= warning <= error`, which is validated at config load.
|
|
101
|
-
|
|
102
|
-
a hard failure
|
|
103
|
-
let you move.
|
|
102
|
+
`500/750/900`, test `1200/1400/1600`). The merged triple has to satisfy
|
|
103
|
+
`notice <= warning <= error`, which is validated at config load. Under
|
|
104
|
+
the recommended gate posture `--max-warnings 0`, the `warning` band
|
|
105
|
+
is a hard failure rather than a soft limit, which is what these thresholds
|
|
106
|
+
exist to let you move.
|
|
104
107
|
|
|
105
108
|
## `patchPolicy`
|
|
106
109
|
|
|
@@ -115,12 +118,13 @@ gaps does not move a patch out of the band its category owns.
|
|
|
115
118
|
## `buildAudit`
|
|
116
119
|
|
|
117
120
|
The post-build packaging audit is warn-only. Most of what it would otherwise
|
|
118
|
-
report as "missing packaged artifact" is classified away
|
|
119
|
-
unselected `--with-branding` tree read from the
|
|
120
|
-
a directory reached only through a
|
|
121
|
-
`moz.build`, a Storybook
|
|
122
|
-
|
|
123
|
-
mirror whose header says it
|
|
121
|
+
report as "missing packaged artifact" is classified away from the structure
|
|
122
|
+
of the tree itself: an unselected `--with-branding` tree read from the
|
|
123
|
+
generated `engine/mozconfig`, a directory reached only through a
|
|
124
|
+
platform-gated `DIRS +=` in an ancestor `moz.build`, a Storybook
|
|
125
|
+
`*.stories.mjs`. One case cannot be derived from the tree: a source that is
|
|
126
|
+
deliberately never packaged, such as a type-only mirror whose header says it
|
|
127
|
+
is never loaded. Declare those:
|
|
124
128
|
|
|
125
129
|
```json
|
|
126
130
|
{
|
|
@@ -128,112 +132,114 @@ mirror whose header says it is never loaded. Declare those:
|
|
|
128
132
|
"unpackaged": [
|
|
129
133
|
{
|
|
130
134
|
"path": "browser/base/content/hominis-tile-host-types.js",
|
|
131
|
-
"reason": "Type-only mirror of the tile host
|
|
135
|
+
"reason": "Type-only mirror of the tile host, never loaded, and no jar.mn entry by design."
|
|
132
136
|
}
|
|
133
137
|
]
|
|
134
138
|
}
|
|
135
139
|
}
|
|
136
140
|
```
|
|
137
141
|
|
|
138
|
-
- `path` is engine-relative. A `*` may glob
|
|
139
|
-
|
|
140
|
-
|
|
142
|
+
- `path` is engine-relative. A `*` may glob within one path segment. `**` is
|
|
143
|
+
refused, because a subtree carve-out is how a reviewed exception quietly
|
|
144
|
+
becomes a blanket one.
|
|
141
145
|
- `reason` is required and must be non-empty. This is the one audit class
|
|
142
146
|
FireForge cannot verify against the tree, so the declaration is the
|
|
143
|
-
evidence
|
|
144
|
-
|
|
145
|
-
- Admitted paths are
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
- A declared path that
|
|
149
|
-
|
|
150
|
-
about the tree that is no longer true.
|
|
147
|
+
evidence. By the time someone reads it, an unexplained carve-out is
|
|
148
|
+
indistinguishable from a mistake.
|
|
149
|
+
- Admitted paths are listed in the audit output, never silenced. The notice
|
|
150
|
+
reads `admitted as unpackaged by buildAudit.unpackaged "<path>"` followed
|
|
151
|
+
by the declared reason.
|
|
152
|
+
- A declared path that does resolve to a packaged artifact is reported as a
|
|
153
|
+
stale carve-out rather than suppressed, because the declaration asserts a
|
|
154
|
+
fact about the tree that is no longer true.
|
|
151
155
|
- A declaration matching nothing that changed in a given run says nothing.
|
|
152
|
-
Unlike `--expect-unmanaged`, whose unmet entries are reported because it
|
|
153
|
-
|
|
154
|
-
|
|
156
|
+
Unlike `--expect-unmanaged`, whose unmet entries are reported because it is
|
|
157
|
+
a per-invocation flag list, this is a standing list checked only against
|
|
158
|
+
the files that happened to change, so "not met" is the normal case.
|
|
155
159
|
|
|
156
160
|
The `Packaged:` summary line names each non-zero skip class with its count,
|
|
157
|
-
so a run that dismissed four unselected-branding files reads differently
|
|
158
|
-
|
|
161
|
+
so a run that dismissed four unselected-branding files reads differently from
|
|
162
|
+
one that dismissed four unregistered sources.
|
|
159
163
|
|
|
160
164
|
## Design tokens
|
|
161
165
|
|
|
162
|
-
Tokens are managed with `fireforge token add
|
|
166
|
+
Tokens are managed with `fireforge token add`. `fireforge token list` and
|
|
163
167
|
`fireforge token show` report what is already there.
|
|
164
168
|
|
|
165
169
|
- `--create-category` declares a new category banner and inserts the token in
|
|
166
|
-
one step. It
|
|
167
|
-
base token first, then add each variant.
|
|
170
|
+
one step. It cannot be combined with `--variant`: author the category with
|
|
171
|
+
the base token first, then add each variant.
|
|
168
172
|
- `--category` is required for a base declaration and optional under
|
|
169
173
|
`--variant`, where the declaration is routed into a `:root<selector>` block
|
|
170
174
|
and never into a category section. It is still validated when supplied.
|
|
171
175
|
- `--variant` takes the same selector grammar the block matcher understands:
|
|
172
|
-
one attribute fragment (`[data-private]`, `[data-skin=precision]`), a run
|
|
173
|
-
them (`[data-skin=precision][data-theme=dark]`), and an optional
|
|
174
|
-
tail (`[data-skin=precision]:not([data-private])`). Names and
|
|
175
|
-
identifier-safe, and `=value` is normalized to `="value"`. A
|
|
176
|
-
qualifier matches only a block carrying that qualifier
|
|
177
|
-
qualifier still matches a qualified block, and the write says
|
|
176
|
+
one attribute fragment (`[data-private]`, `[data-skin=precision]`), a run
|
|
177
|
+
of them (`[data-skin=precision][data-theme=dark]`), and an optional
|
|
178
|
+
pseudo-class tail (`[data-skin=precision]:not([data-private])`). Names and
|
|
179
|
+
values must be identifier-safe, and `=value` is normalized to `="value"`. A
|
|
180
|
+
variant naming a qualifier matches only a block carrying that qualifier.
|
|
181
|
+
One without a qualifier still matches a qualified block, and the write says
|
|
182
|
+
so.
|
|
178
183
|
- `--mode override` mirrors into both `:root[data-theme="dark"]` and
|
|
179
184
|
`:root[data-theme="light"]`. A qualified block such as
|
|
180
185
|
`:root[data-theme="light"]:not([data-private])` is matched and written
|
|
181
|
-
through, with a warning naming the selector
|
|
182
|
-
|
|
183
|
-
worse failure.
|
|
186
|
+
through, with a warning naming the selector. The qualifier carries meaning,
|
|
187
|
+
but silently skipping half the mirror is the worse failure.
|
|
184
188
|
- A token already present in the target block is reported with its location
|
|
185
|
-
(`already exists in :root[…] (line N), unchanged`) rather than a bare
|
|
189
|
+
(`already exists in :root[…] (line N), unchanged`) rather than as a bare
|
|
186
190
|
no-op.
|
|
187
191
|
|
|
188
192
|
### Reading the token file
|
|
189
193
|
|
|
190
|
-
`token add --category` refuses a category the tokens CSS does not
|
|
191
|
-
`token list` exists to name
|
|
192
|
-
out of the file.
|
|
194
|
+
`token add --category` refuses a category that the tokens CSS does not
|
|
195
|
+
declare, so `token list` exists to name the categories without you
|
|
196
|
+
hand-parsing a `= Category =` banner out of the file.
|
|
193
197
|
|
|
194
198
|
- `fireforge token list [--category <name>] [--json]` reports each category
|
|
195
199
|
banner with the tokens declared under it, in file order. Declarations above
|
|
196
|
-
the first banner are reported under `(no category)` rather than dropped,
|
|
197
|
-
a banner with no tokens is still listed
|
|
198
|
-
`--category` is refused by naming the ones that exist, because a
|
|
199
|
-
printed nothing would read as "this category is empty".
|
|
200
|
-
- `fireforge token show <token-name> [--json]` reports the owning category
|
|
201
|
-
the value the token takes in
|
|
202
|
-
`:root`, the dark `@media` mirror, and each `:root[variant]
|
|
203
|
-
of each. The leading `--` is optional
|
|
204
|
-
first (`fireforge token show -- --my-token`).
|
|
205
|
-
|
|
206
|
-
Only the base `:root` block owns a token, so `token list` reports it once
|
|
207
|
-
|
|
200
|
+
the first banner are reported under `(no category)` rather than dropped,
|
|
201
|
+
and a banner with no tokens is still listed, since `token add` accepts it.
|
|
202
|
+
An unknown `--category` is refused by naming the ones that exist, because a
|
|
203
|
+
filter that printed nothing would read as "this category is empty".
|
|
204
|
+
- `fireforge token show <token-name> [--json]` reports the owning category
|
|
205
|
+
and the value the token takes in every block that declares it: the base
|
|
206
|
+
`:root`, the dark `@media` mirror, and each `:root[variant]`, with the line
|
|
207
|
+
of each. The leading `--` is optional, and if you include it, pass the `--`
|
|
208
|
+
separator first (`fireforge token show -- --my-token`).
|
|
209
|
+
|
|
210
|
+
Only the base `:root` block owns a token, so `token list` reports it once.
|
|
211
|
+
The dark and variant blocks mirror it and appear in `token show`.
|
|
208
212
|
|
|
209
213
|
## Smoke runs
|
|
210
214
|
|
|
211
215
|
For unattended smoke checks, `fireforge run --smoke-exit <s> --headless`
|
|
212
216
|
launches the browser headless. A headed smoke window on a shared desktop
|
|
213
|
-
absorbs live input, which contaminates the console capture
|
|
214
|
-
launches print a warning saying so. Exit codes 12 and 13 separate a
|
|
215
|
-
regression from a launch failure
|
|
217
|
+
absorbs live input, which contaminates the console capture, so headed
|
|
218
|
+
non-CI launches print a warning saying so. Exit codes 12 and 13 separate a
|
|
219
|
+
console regression from a launch failure. See
|
|
220
|
+
[`exit-codes.md`](exit-codes.md).
|
|
216
221
|
|
|
217
222
|
## Lock waits
|
|
218
223
|
|
|
219
|
-
Every FireForge command that mutates the engine takes the engine-session
|
|
220
|
-
and some take a second subsystem lock as well. Contention fails fast
|
|
221
|
-
about a second by default.
|
|
224
|
+
Every FireForge command that mutates the engine takes the engine-session
|
|
225
|
+
lock, and some take a second subsystem lock as well. Contention fails fast
|
|
226
|
+
after about a second by default.
|
|
222
227
|
|
|
223
|
-
`--wait-lock [seconds]` (bare flag
|
|
224
|
-
bounded wait, and the budget covers
|
|
225
|
-
`furnace apply
|
|
226
|
-
engine-session lock. While waiting, a progress line roughly every 5
|
|
227
|
-
identifies the holder by PID, command and start time.
|
|
228
|
+
`--wait-lock [seconds]` (bare flag means 60, valid range 1 to 3600) replaces
|
|
229
|
+
that with a bounded wait, and the budget covers every lock the command takes.
|
|
230
|
+
For `furnace apply`, `deploy` and `sync` that means the furnace lock as well
|
|
231
|
+
as the engine-session lock. While waiting, a progress line roughly every 5
|
|
232
|
+
seconds identifies the holder by PID, command and start time.
|
|
228
233
|
|
|
229
234
|
Commands that take no lock accept `--wait-lock` and ignore it, so a scripted
|
|
230
|
-
sequence can
|
|
235
|
+
sequence can append the flag everywhere without a usage error killing the
|
|
236
|
+
run.
|
|
231
237
|
|
|
232
238
|
`FIREFORGE_WAIT_LOCK=<seconds>` applies the same budget to every command in a
|
|
233
239
|
session, using the same bounds as the flag. It is the only way to give a
|
|
234
240
|
budget to the furnace mutators that declare no flag (`create`, `remove`,
|
|
235
|
-
`rename`, `refresh`, `scan`, `override`, `chrome-doc`,
|
|
236
|
-
`--wait-lock` always wins.
|
|
241
|
+
`rename`, `refresh`, `scan`, `override`, `chrome-doc`, and the rest). An
|
|
242
|
+
explicit `--wait-lock` always wins.
|
|
237
243
|
|
|
238
244
|
`fireforge status --lock` reports the current holder and queue depth.
|
|
239
245
|
|
|
@@ -241,11 +247,11 @@ budget to the furnace mutators that declare no flag (`create`, `remove`,
|
|
|
241
247
|
|
|
242
248
|
| Variable | Effect |
|
|
243
249
|
| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------- |
|
|
244
|
-
| `FIREFORGE_WAIT_LOCK` | Session-wide lock wait budget in seconds (1
|
|
250
|
+
| `FIREFORGE_WAIT_LOCK` | Session-wide lock wait budget in seconds (1 to 3600). See above. |
|
|
245
251
|
| `FIREFORGE_MAX_UNTRACKED_FILES` | Per-directory cap when expanding collapsed untracked directories in `status` (default 5000). A non-positive value warns and is ignored. |
|
|
246
252
|
| `FIREFORGE_GIT_ADD_TIMEOUT_MS` | Timeout for the monolithic `git add -A` baseline pass (default 10 min). For slow or loaded filesystems. |
|
|
247
253
|
| `FIREFORGE_GIT_ADD_CHUNK_TIMEOUT_MS` | Timeout for the chunked `git add -- <dir>` fallback (default 30 min). Paired with the above. |
|
|
248
254
|
|
|
249
|
-
`CLAUDECODE` is read by mozbuild, not by FireForge
|
|
250
|
-
--full-output` unsets it for test dispatches only
|
|
255
|
+
`CLAUDECODE` is read by mozbuild, not by FireForge. `fireforge test
|
|
256
|
+
--full-output` unsets it for test dispatches only. See
|
|
251
257
|
[`testing.md`](testing.md#output-verbosity).
|
package/docs/exit-codes.md
CHANGED
|
@@ -2,76 +2,81 @@
|
|
|
2
2
|
|
|
3
3
|
# Exit codes (internal)
|
|
4
4
|
|
|
5
|
-
The exit code is the machine-readable half of the CLI's contract
|
|
6
|
-
branches on it, and CI
|
|
7
|
-
in `src/errors/codes.ts
|
|
8
|
-
|
|
5
|
+
The exit code is the machine-readable half of the CLI's contract. A script
|
|
6
|
+
branches on it, and CI uses it to decide whether to retry or escalate. The
|
|
7
|
+
values live in `src/errors/codes.ts`. This file says what they mean and
|
|
8
|
+
which error class produces each one.
|
|
9
9
|
|
|
10
|
-
| Code | Name | Meaning
|
|
11
|
-
| ---: | ---------------------- |
|
|
12
|
-
| 0 | `SUCCESS` | Completed. Also a run that prompted and the operator declined
|
|
13
|
-
| 1 | `GENERAL_ERROR` | Unspecified failure the operator
|
|
14
|
-
| 2 | `CONFIG_ERROR` | `fireforge.json` missing or invalid.
|
|
15
|
-
| 3 | `DOWNLOAD_ERROR` | Could not download or extract Firefox source.
|
|
16
|
-
| 4 | `GIT_ERROR` | A git operation failed.
|
|
17
|
-
| 5 | `BUILD_ERROR` | `mach build` failed, or a test suite went red.
|
|
18
|
-
| 6 | `PATCH_ERROR` | A patch failed to apply, or the patch queue could not be mutated.
|
|
19
|
-
| 7 | `MISSING_DEPENDENCY` | A required tool (python3, git, tar) was not found.
|
|
20
|
-
| 8 | `INVALID_ARGUMENT` | The flags were wrong.
|
|
21
|
-
| 9 | `FURNACE_ERROR` | A Furnace component operation failed.
|
|
22
|
-
| 10 | `RESOLUTION_ERROR` | Conflict resolution failed.
|
|
23
|
-
| 11 | `INTERNAL_ERROR` | A FireForge invariant did not hold.
|
|
24
|
-
| 12 | `SMOKE_EXIT_FAILURE` | `run --smoke-exit` saw
|
|
25
|
-
| 13 | `SMOKE_LAUNCH_FAILURE` | `run --smoke-exit` saw
|
|
26
|
-
| 14 | `INCONCLUSIVE` | A test run's verdict was thrown away
|
|
27
|
-
| 15 | `LOCK_TIMEOUT` | A lock wait expired, so the run never started. Re-queue it
|
|
28
|
-
| 130 | `USER_CANCELLED` | The operator
|
|
10
|
+
| Code | Name | Meaning | Produced by |
|
|
11
|
+
| ---: | ---------------------- | ----------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
|
|
12
|
+
| 0 | `SUCCESS` | Completed. Also a run that prompted and the operator declined: declining is a successful run that chose not to proceed. | (none) |
|
|
13
|
+
| 1 | `GENERAL_ERROR` | Unspecified failure the operator has to act on. | `GeneralError` (and `PreflightRefusalError`), `ParserFallbackError`, `ExecTimeoutError` |
|
|
14
|
+
| 2 | `CONFIG_ERROR` | `fireforge.json` missing or invalid. | `ConfigError` and subclasses |
|
|
15
|
+
| 3 | `DOWNLOAD_ERROR` | Could not download or extract Firefox source. | `DownloadError` and subclasses |
|
|
16
|
+
| 4 | `GIT_ERROR` | A git operation failed. | `GitError` and subclasses, except `GitNotFoundError` |
|
|
17
|
+
| 5 | `BUILD_ERROR` | `mach build` failed, or a test suite went red. | `BuildError` and subclasses, `TestFailureError` |
|
|
18
|
+
| 6 | `PATCH_ERROR` | A patch failed to apply, or the patch queue could not be mutated. | `PatchError`, `PatchManifestCorruptError`, `RebaseError` and subclasses |
|
|
19
|
+
| 7 | `MISSING_DEPENDENCY` | A required tool (python3, git, tar) was not found. | `PythonNotFoundError`, `GitNotFoundError`, `MachNotFoundError` |
|
|
20
|
+
| 8 | `INVALID_ARGUMENT` | The flags were wrong. A usage problem, not an environment one. | `InvalidArgumentError`, plus commander usage errors (unknown command or option, missing argument) |
|
|
21
|
+
| 9 | `FURNACE_ERROR` | A Furnace component operation failed. | `FurnaceError` |
|
|
22
|
+
| 10 | `RESOLUTION_ERROR` | Conflict resolution failed. | `ResolutionError` |
|
|
23
|
+
| 11 | `INTERNAL_ERROR` | A FireForge invariant did not hold. This is a bug in FireForge, not something the operator can fix. | `InternalInvariantError` |
|
|
24
|
+
| 12 | `SMOKE_EXIT_FAILURE` | `run --smoke-exit` saw console errors that were not allowed in the smoke window. | `SmokeRunError` |
|
|
25
|
+
| 13 | `SMOKE_LAUNCH_FAILURE` | `run --smoke-exit` saw the browser exit uncleanly before the window elapsed. | `SmokeRunError` |
|
|
26
|
+
| 14 | `INCONCLUSIVE` | A test run's verdict was thrown away because `engine/` moved while the harness ran. This is not red. Re-run it. | `InconclusiveVerdictError` |
|
|
27
|
+
| 15 | `LOCK_TIMEOUT` | A lock wait expired, so the run never started. Re-queue it with a larger `--wait-lock`. | `LockContentionError` |
|
|
28
|
+
| 130 | `USER_CANCELLED` | The operator interrupted a prompt (Esc or Ctrl+C). 128 + SIGINT. | `CancellationError` |
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
malformed option, a missing required argument
|
|
32
|
-
action
|
|
33
|
-
|
|
34
|
-
commander's `exitOverride()
|
|
30
|
+
Usage errors that commander detects itself (an unknown command, an unknown
|
|
31
|
+
or malformed option, a missing required argument) never reach a command
|
|
32
|
+
action. Before 0.46.0 commander terminated the process with its own exit 1
|
|
33
|
+
and printed no refusal envelope under `--json`. `createProgram` now installs
|
|
34
|
+
commander's `exitOverride()`, and the entry point maps the resulting
|
|
35
35
|
`CommanderError` to `INVALID_ARGUMENT` (8) with the standard envelope on
|
|
36
|
-
stdout. `--help` and `--version`
|
|
37
|
-
|
|
36
|
+
stdout. `--help` and `--version` take the same path and still exit 0, and so
|
|
37
|
+
does a command group invoked without a subcommand (`fireforge`,
|
|
38
38
|
`fireforge tree`): commander prints the group's help and the entry point
|
|
39
|
-
treats
|
|
40
|
-
that `patch`, `token` and `furnace` give through their own help
|
|
39
|
+
treats that as informational rather than as a wrong flag. That matches the
|
|
40
|
+
exit 0 that `patch`, `token` and `furnace` give through their own help
|
|
41
|
+
action.
|
|
41
42
|
|
|
42
43
|
## The three distinctions that matter for CI
|
|
43
44
|
|
|
44
|
-
**Retry
|
|
45
|
-
something and a retry may help. `INTERNAL_ERROR` means nothing
|
|
46
|
-
change would have helped
|
|
45
|
+
**Retry or escalate.** `GENERAL_ERROR` usually means the operator has to
|
|
46
|
+
change something, and a retry may then help. `INTERNAL_ERROR` means nothing
|
|
47
|
+
they could change would have helped. Escalate it, do not retry.
|
|
47
48
|
|
|
48
|
-
**Red
|
|
49
|
-
before 0.44.0
|
|
50
|
-
FAILED — thrown as `TestFailureError` since 0.45.0, which keeps the code but
|
|
51
|
-
carries test remedies rather than build ones (`--json` reports it as
|
|
52
|
-
`test-failure`). `LOCK_TIMEOUT` (15) is a run that never started, because another
|
|
53
|
-
FireForge process held the lock for the whole budget — nothing about the
|
|
54
|
-
request was wrong, so re-queue it. `INCONCLUSIVE` (14) is a suite whose
|
|
55
|
-
result was DISCARDED, because `engine/` moved underneath it — the code may
|
|
56
|
-
be perfectly green, and reporting it as red is wrong. A summary line reading
|
|
57
|
-
`FAIL — exit 1` beside `FAIL — exit 5` invited treating opposites as the same
|
|
58
|
-
kind of fact; the codes now separate them mechanically. The
|
|
59
|
-
`FIREFORGE-VERDICT:` line's `reason=` key carries the same distinction for
|
|
60
|
-
humans.
|
|
49
|
+
**Red, never ran, or thrown away.** These are three different facts, and
|
|
50
|
+
before 0.44.0 two of them shared exit 1.
|
|
61
51
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
52
|
+
- `BUILD_ERROR` (5) is a suite that failed. Since 0.45.0 it is thrown as
|
|
53
|
+
`TestFailureError`, which keeps the code but carries test remedies rather
|
|
54
|
+
than build ones (`--json` reports it as `test-failure`).
|
|
55
|
+
- `LOCK_TIMEOUT` (15) is a run that never started, because another FireForge
|
|
56
|
+
process held the lock for the whole budget. Nothing about the request was
|
|
57
|
+
wrong, so re-queue it.
|
|
58
|
+
- `INCONCLUSIVE` (14) is a suite whose result was discarded because
|
|
59
|
+
`engine/` moved underneath it. The code may be perfectly green, so
|
|
60
|
+
reporting it as red is wrong.
|
|
65
61
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
62
|
+
A summary line reading `FAIL - exit 1` beside `FAIL - exit 5` invited
|
|
63
|
+
treating opposite facts as the same kind of thing. The codes now separate
|
|
64
|
+
them. The `FIREFORGE-VERDICT:` line's `reason=` key carries the same
|
|
65
|
+
distinction for humans.
|
|
66
|
+
|
|
67
|
+
`LockContentionError` backs every lock in FireForge (engine session, patch
|
|
68
|
+
directory, build, furnace), so all four exit 15. That is intentional: the
|
|
69
|
+
fact is the same whichever lock was contended.
|
|
70
|
+
|
|
71
|
+
**Interrupted or declined.** Before 0.44.0 a Ctrl+C and a deliberate "no" at
|
|
72
|
+
a confirmation both returned the same value and exited 0, so a script could
|
|
73
|
+
not tell them apart. They are now distinct: an interrupt raises
|
|
74
|
+
`CancellationError` and exits 130, and a declined confirmation returns
|
|
75
|
+
normally and exits 0, because the run did what it was asked and the answer
|
|
76
|
+
was no.
|
|
72
77
|
|
|
73
78
|
## Adding a code
|
|
74
79
|
|
|
75
80
|
New codes go in `src/errors/codes.ts` with a comment saying what a consumer
|
|
76
|
-
should
|
|
81
|
+
should do differently on seeing it. If the answer is "nothing different from
|
|
77
82
|
an existing code", it does not need one. Add a row here in the same change.
|