@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
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* `fireforge patch rename <name
|
|
3
|
+
* `fireforge patch rename <name>`: relabels a patch's filename, manifest
|
|
4
4
|
* `name`, and (optionally) `description` without rewriting the `.patch` file
|
|
5
5
|
* body.
|
|
6
6
|
*
|
|
7
7
|
* Companion to `re-export --files <subset>`. Re-export shrinks the body and
|
|
8
8
|
* `filesAffected` but leaves the patch's identity describing the pre-shrink
|
|
9
9
|
* scope. The only alternative for that drift is `delete` + re-export, which
|
|
10
|
-
* briefly removes the patch from the queue
|
|
11
|
-
* then refuses the re-export until the deleted patch's siblings
|
|
12
|
-
* rewritten.
|
|
10
|
+
* briefly removes the patch from the queue, and any forward-import
|
|
11
|
+
* dependent then refuses the re-export until the deleted patch's siblings
|
|
12
|
+
* are rewritten.
|
|
13
13
|
*
|
|
14
14
|
* The filename rename and the manifest mutation happen under the patch
|
|
15
15
|
* directory lock so concurrent exports cannot allocate the new filename, and
|
|
@@ -54,7 +54,7 @@ function splitPatchFilename(filename) {
|
|
|
54
54
|
* renames the `.patch` file on disk (when applicable), writes the
|
|
55
55
|
* updated manifest, and appends a history entry. Filesystem rename
|
|
56
56
|
* happens before the manifest save so an interrupted run never leaves
|
|
57
|
-
* the manifest pointing at a missing file
|
|
57
|
+
* the manifest pointing at a missing file. A manifest-save failure
|
|
58
58
|
* rolls the filesystem rename back.
|
|
59
59
|
*/
|
|
60
60
|
async function commitRenameUnderLock(input) {
|
|
@@ -102,7 +102,7 @@ async function commitRenameUnderLock(input) {
|
|
|
102
102
|
...(descriptionChanging ? { description: newDescription ?? '' } : {}),
|
|
103
103
|
};
|
|
104
104
|
// Staged-dependency owners on other patches reference the old
|
|
105
|
-
// filename
|
|
105
|
+
// filename. Remap them so forward-import declarations survive the
|
|
106
106
|
// rename instead of dangling.
|
|
107
107
|
const ownerLookup = (old) => old === target.filename ? newFilename : undefined;
|
|
108
108
|
fresh.patches = fresh.patches.map((p) => rewriteStagedDependencyOwners(p, ownerLookup));
|
|
@@ -182,7 +182,7 @@ function resolveRenamePlan(target, options, config) {
|
|
|
182
182
|
if (newSlug === '') {
|
|
183
183
|
throw new InvalidArgumentError('--to must contain at least one alphanumeric character after sanitisation.', 'patch rename');
|
|
184
184
|
}
|
|
185
|
-
// Preserve the ordinal's zero-padding width
|
|
185
|
+
// Preserve the ordinal's zero-padding width. A wider order simply
|
|
186
186
|
// prints unpadded-longer.
|
|
187
187
|
const newOrdinalStr = options.order !== undefined
|
|
188
188
|
? String(options.order).padStart(split.ordinalStr.length, '0')
|
|
@@ -203,7 +203,7 @@ function resolveRenamePlan(target, options, config) {
|
|
|
203
203
|
}
|
|
204
204
|
/**
|
|
205
205
|
* Pre-flight refusals: order collision (with a pointer to the verb that
|
|
206
|
-
* renumbers siblings
|
|
206
|
+
* renumbers siblings, and `--order` means "this exact unused sparse slot",
|
|
207
207
|
* mirroring `export --order`), projected cross-patch lint on an order
|
|
208
208
|
* change (forward imports resolve by queue position), and the
|
|
209
209
|
* filename collision. The authoritative collision checks run again inside
|
|
@@ -41,10 +41,10 @@ export function rebuildFilenameForOrder(existing, newOrder) {
|
|
|
41
41
|
* blocks the destination slot is renumbered, so intentional gaps left by
|
|
42
42
|
* prior `patch delete` calls survive the reorder.
|
|
43
43
|
*
|
|
44
|
-
* Algorithm: remove target from the sorted list, then cascade
|
|
45
|
-
* patch sits at the destination order, bump it to order+1
|
|
46
|
-
* collides with the next patch, bump that one too
|
|
47
|
-
* slot is reached. The direction is symmetric
|
|
44
|
+
* Algorithm: remove target from the sorted list, then cascade. If any
|
|
45
|
+
* patch sits at the destination order, bump it to order+1. If that
|
|
46
|
+
* collides with the next patch, bump that one too. Continue until a free
|
|
47
|
+
* slot is reached. The direction is symmetric: moving a patch earlier
|
|
48
48
|
* and moving it later both reduce to "find a free slot at destination by
|
|
49
49
|
* shifting the contiguous conflicting run upward".
|
|
50
50
|
*/
|
|
@@ -62,7 +62,7 @@ function computeRenameMap(manifestPatches, target, destinationOrder) {
|
|
|
62
62
|
if (clampedDest === target.order)
|
|
63
63
|
return renames;
|
|
64
64
|
// Build a mutable order-for-each map so cascading bumps compose. Keys are
|
|
65
|
-
// filenames
|
|
65
|
+
// filenames. Values start as current order and get rewritten as bumps
|
|
66
66
|
// propagate. Only patches whose value changes end up in the rename map.
|
|
67
67
|
const currentOrder = new Map();
|
|
68
68
|
for (const patch of withoutTarget)
|
|
@@ -70,7 +70,7 @@ function computeRenameMap(manifestPatches, target, destinationOrder) {
|
|
|
70
70
|
// Cascade from the destination: while any surviving patch occupies the
|
|
71
71
|
// slot we want, bump it to slot+1 and advance. Patches are processed in
|
|
72
72
|
// ascending order so each bump's collision (if any) is with the immediate
|
|
73
|
-
// successor in the sort
|
|
73
|
+
// successor in the sort, so no back-tracking is needed.
|
|
74
74
|
let slot = clampedDest;
|
|
75
75
|
for (const patch of withoutTarget) {
|
|
76
76
|
const order = currentOrder.get(patch.filename);
|
|
@@ -109,7 +109,7 @@ export function projectReorder(base, renameMap) {
|
|
|
109
109
|
const ownerLookup = (oldFilename) => renameMap.get(oldFilename)?.newFilename;
|
|
110
110
|
const projectedEntries = base.entries.map((entry) => {
|
|
111
111
|
// Project staged-dependency owner references through the rename map on
|
|
112
|
-
// every entry
|
|
112
|
+
// every entry. Owners point at other patches' filenames, so a
|
|
113
113
|
// projection that skips non-renamed entries would lint against stale
|
|
114
114
|
// owners and report false forward-import regressions.
|
|
115
115
|
const metadata = entry.metadata
|
|
@@ -152,7 +152,7 @@ function resolveDestination(target, manifestPatches, options) {
|
|
|
152
152
|
throw new InvalidArgumentError(`--before anchor "${options.before}" not found.`, '--before');
|
|
153
153
|
}
|
|
154
154
|
// Reject self-reference. `--before <target>` resolves to the target's
|
|
155
|
-
// current order, so computeRenameMap would take its no-op branch
|
|
155
|
+
// current order, so computeRenameMap would take its no-op branch, but
|
|
156
156
|
// that masks a user-facing typo or scripted mistake instead of
|
|
157
157
|
// surfacing it. The symmetric `--after` case is worse (mutates the
|
|
158
158
|
// queue), so both reject for consistency.
|
|
@@ -275,7 +275,7 @@ export async function patchReorderCommand(projectRoot, identifier, options = {})
|
|
|
275
275
|
return;
|
|
276
276
|
}
|
|
277
277
|
// Project the reorder through cross-patch lint. Forward-import violations
|
|
278
|
-
// that
|
|
278
|
+
// that the reorder itself introduces become hard refusals.
|
|
279
279
|
const baseCtx = await buildPatchQueueContext(paths.patches);
|
|
280
280
|
const projected = projectReorder(baseCtx, renameMap);
|
|
281
281
|
const projectedIssues = lintPatchQueue(projected);
|
|
@@ -317,7 +317,7 @@ export async function patchReorderCommand(projectRoot, identifier, options = {})
|
|
|
317
317
|
if (!proceedAfterDecision(decision, 'Reorder cancelled'))
|
|
318
318
|
return;
|
|
319
319
|
// The history entry is built inside commitReorderPlan (still under the
|
|
320
|
-
// lock) from the
|
|
320
|
+
// lock) from the final rename map rather than the pre-confirmation one, so
|
|
321
321
|
// the destinationOrder and renames mirror what actually landed on disk.
|
|
322
322
|
const buildHistoryEntry = (finalRenameMap) => {
|
|
323
323
|
const finalEntries = getSortedRenameEntries(finalRenameMap);
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* construction from the worktree, staged-dependency owner-rewrite
|
|
4
4
|
* discovery, cross-patch lint projection, and policy-manifest projection.
|
|
5
5
|
* Split out of `split.ts` to keep both files within the per-file line
|
|
6
|
-
* budget
|
|
6
|
+
* budget. It is consumed only by the split command.
|
|
7
7
|
*/
|
|
8
8
|
import { type ConflictReport } from '../../core/destructive.js';
|
|
9
9
|
import type { PatchQueueContext } from '../../core/patch-lint-cross.js';
|
|
@@ -33,7 +33,7 @@ export interface SplitPlan {
|
|
|
33
33
|
/**
|
|
34
34
|
* Staged forward-import declarations the split introduces, keyed by the
|
|
35
35
|
* importing patch's post-rename filename. These are the new forward edges
|
|
36
|
-
* from existing patches into the freshly-created patch (owner known)
|
|
36
|
+
* from existing patches into the freshly-created patch (owner known). They
|
|
37
37
|
* are injected into the projected lint so dry-run matches the real gate,
|
|
38
38
|
* and persisted on commit so the real per-patch gate stays clean.
|
|
39
39
|
*/
|
|
@@ -82,7 +82,7 @@ export declare function projectSplitManifest(manifest: {
|
|
|
82
82
|
*/
|
|
83
83
|
export declare function buildNewPatchMetadata(plan: SplitPlan, config: FireForgeConfig): PatchMetadata;
|
|
84
84
|
/**
|
|
85
|
-
* Renders the operator-facing summary lines for a planned split
|
|
85
|
+
* Renders the operator-facing summary lines for a planned split: the text
|
|
86
86
|
* shown by `--dry-run` and by the destructive-operation confirmation prompt.
|
|
87
87
|
*/
|
|
88
88
|
export declare function buildSplitSummary(plan: SplitPlan): string[];
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* construction from the worktree, staged-dependency owner-rewrite
|
|
5
5
|
* discovery, cross-patch lint projection, and policy-manifest projection.
|
|
6
6
|
* Split out of `split.ts` to keep both files within the per-file line
|
|
7
|
-
* budget
|
|
7
|
+
* budget. It is consumed only by the split command.
|
|
8
8
|
*/
|
|
9
9
|
import { join } from 'node:path';
|
|
10
10
|
import {} from '../../core/destructive.js';
|
|
@@ -111,11 +111,12 @@ function buildProjectedSplitEntries(baseCtx, plan) {
|
|
|
111
111
|
/**
|
|
112
112
|
* Computes the staged forward-import declarations the split introduces:
|
|
113
113
|
* forward edges from existing patches into the freshly-created patch (its
|
|
114
|
-
* `creates` files are the moved files
|
|
115
|
-
* known). Keyed by the importing patch's projected (post-rename)
|
|
114
|
+
* `creates` files are the moved files, and the owner is the new patch, so
|
|
115
|
+
* it is known). Keyed by the importing patch's projected (post-rename)
|
|
116
|
+
* filename.
|
|
116
117
|
*
|
|
117
118
|
* These edges did not exist before the split (importer and imported file
|
|
118
|
-
* lived in the same patch), so they have no declaration yet
|
|
119
|
+
* lived in the same patch), so they have no declaration yet. Without this
|
|
119
120
|
* the projected lint flags them while the real per-patch gate would resolve
|
|
120
121
|
* them once declared. Auto-declaring keeps the two in lock-step and lets a
|
|
121
122
|
* sound split read as sound.
|
|
@@ -233,7 +234,7 @@ export function buildNewPatchMetadata(plan, config) {
|
|
|
233
234
|
};
|
|
234
235
|
}
|
|
235
236
|
/**
|
|
236
|
-
* Renders the operator-facing summary lines for a planned split
|
|
237
|
+
* Renders the operator-facing summary lines for a planned split: the text
|
|
237
238
|
* shown by `--dry-run` and by the destructive-operation confirmation prompt.
|
|
238
239
|
*/
|
|
239
240
|
export function buildSplitSummary(plan) {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `fireforge patch split <source> --files <p...> --name <n>`
|
|
2
|
+
* `fireforge patch split <source> --files <p...> --name <n>` moves files
|
|
3
3
|
* out of an existing patch into a brand-new patch as one transaction.
|
|
4
4
|
*
|
|
5
5
|
* Splitting a patch whose files have inbound forward-imports otherwise
|
|
6
6
|
* requires a precise manual order: re-point each staged-dependency owner at
|
|
7
7
|
* a not-yet-created patch, shrink the source via
|
|
8
|
-
* `re-export --files --allow-shrink`, then `export --order
|
|
8
|
+
* `re-export --files --allow-shrink`, then `export --order`. Any other
|
|
9
9
|
* order refuses or needs `--force-unsafe`. Split performs the shrink, the
|
|
10
10
|
* new-patch creation, and the dependent owner rewrites under one
|
|
11
11
|
* patch-directory lock with rollback, validating only the final projection.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* `fireforge patch split <source> --files <p...> --name <n>`
|
|
3
|
+
* `fireforge patch split <source> --files <p...> --name <n>` moves files
|
|
4
4
|
* out of an existing patch into a brand-new patch as one transaction.
|
|
5
5
|
*
|
|
6
6
|
* Splitting a patch whose files have inbound forward-imports otherwise
|
|
7
7
|
* requires a precise manual order: re-point each staged-dependency owner at
|
|
8
8
|
* a not-yet-created patch, shrink the source via
|
|
9
|
-
* `re-export --files --allow-shrink`, then `export --order
|
|
9
|
+
* `re-export --files --allow-shrink`, then `export --order`. Any other
|
|
10
10
|
* order refuses or needs `--force-unsafe`. Split performs the shrink, the
|
|
11
11
|
* new-patch creation, and the dependent owner rewrites under one
|
|
12
12
|
* patch-directory lock with rollback, validating only the final projection.
|
|
@@ -111,7 +111,7 @@ export async function commitPatchSplit(patchesDir, plan, newMetadata, options, c
|
|
|
111
111
|
}, `patch split committed`);
|
|
112
112
|
}
|
|
113
113
|
catch (error) {
|
|
114
|
-
// Reverse-order rollback
|
|
114
|
+
// Reverse-order rollback. Each step warns on its own failure so the
|
|
115
115
|
// original error stays visible.
|
|
116
116
|
if (sourceRewritten) {
|
|
117
117
|
try {
|
|
@@ -160,7 +160,7 @@ export async function commitPatchSplit(patchesDir, plan, newMetadata, options, c
|
|
|
160
160
|
*/
|
|
161
161
|
export async function patchSplitCommand(projectRoot, sourceId, options) {
|
|
162
162
|
intro(options.dryRun ? 'FireForge patch split (dry run)' : 'FireForge patch split');
|
|
163
|
-
// Refuse a prompt-less run
|
|
163
|
+
// Refuse a prompt-less run before doing the diff/lint work.
|
|
164
164
|
assertConfirmationAvailable('patch split', options);
|
|
165
165
|
const paths = getProjectPaths(projectRoot);
|
|
166
166
|
const config = await loadConfig(projectRoot);
|
|
@@ -193,7 +193,7 @@ export async function patchSplitCommand(projectRoot, sourceId, options) {
|
|
|
193
193
|
(options.order === undefined && options.before === undefined ? source.filename : undefined),
|
|
194
194
|
});
|
|
195
195
|
const placement = await resolvePlacementPlan(paths.patches, placementOptions, category, options.name, config);
|
|
196
|
-
// The filename slug pipeline strips redundant category prefixes
|
|
196
|
+
// The filename slug pipeline strips redundant category prefixes. The
|
|
197
197
|
// manifest display name must agree with the bare-slug naming policy,
|
|
198
198
|
// exactly as `export --name` already does.
|
|
199
199
|
const displayName = normalizePatchDisplayName(options.name, category);
|
|
@@ -7,7 +7,7 @@ interface StagedDependencyShape {
|
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
9
9
|
* Validates the `--add` declaration fields against the loaded queue.
|
|
10
|
-
* Throws on a clear flag mixup
|
|
10
|
+
* Throws on a clear flag mixup. Warns (only) when `--owner` is
|
|
11
11
|
* well-formed but absent from the queue, because the owner may
|
|
12
12
|
* legitimately be exported moments later and renumbering rewrites owners.
|
|
13
13
|
*/
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Shape validation for `patch staged-dependency --add`.
|
|
4
4
|
*
|
|
5
|
-
* `--creates`/`--file` take engine-relative
|
|
6
|
-
* patch
|
|
5
|
+
* `--creates`/`--file` take engine-relative file paths, while `--owner`
|
|
6
|
+
* takes a patch filename. Accepting all three as arbitrary strings lets a
|
|
7
7
|
* `--creates <patch-name>` mixup produce a declaration nothing can ever
|
|
8
8
|
* discharge, surfacing only later as a `staged-dependency-unused` warning.
|
|
9
9
|
* Refusals here fire only on a clear patch-name shape (slash-free values
|
|
@@ -28,7 +28,7 @@ function refusePatchShapedPath(flag, value, role, queuePatches) {
|
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
30
|
* Validates the `--add` declaration fields against the loaded queue.
|
|
31
|
-
* Throws on a clear flag mixup
|
|
31
|
+
* Throws on a clear flag mixup. Warns (only) when `--owner` is
|
|
32
32
|
* well-formed but absent from the queue, because the owner may
|
|
33
33
|
* legitimately be exported moments later and renumbering rewrites owners.
|
|
34
34
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* `fireforge patch staged-dependency <name>`
|
|
3
|
+
* `fireforge patch staged-dependency <name>` edits
|
|
4
4
|
* PatchMetadata.stagedDependencies without rewriting the .patch body.
|
|
5
5
|
*/
|
|
6
6
|
import { Command } from 'commander';
|
|
@@ -85,7 +85,7 @@ function requireRegistrationOptions(options) {
|
|
|
85
85
|
/**
|
|
86
86
|
* Resolves the `--remove` target for forward-imports:
|
|
87
87
|
* `--file` + `--specifier` suffice when they identify at most one staged
|
|
88
|
-
* entry
|
|
88
|
+
* entry. `--creates` is inferred from a unique match, an ambiguous match
|
|
89
89
|
* refuses with the candidate list, and no match falls through to the
|
|
90
90
|
* honest "no staged forward-import matched" summary.
|
|
91
91
|
*/
|
|
@@ -217,7 +217,7 @@ export async function patchStagedDependencyCommand(projectRoot, identifier, opti
|
|
|
217
217
|
intro(isDryRun ? 'FireForge patch staged-dependency (dry run)' : 'FireForge patch staged-dependency');
|
|
218
218
|
const mode = modeFromOptions(options);
|
|
219
219
|
const kind = kindFromOptions(options);
|
|
220
|
-
// The patch queue loads
|
|
220
|
+
// The patch queue loads before the declaration fields resolve so
|
|
221
221
|
// `--remove` can infer `--creates` from the target patch's staged
|
|
222
222
|
// entries.
|
|
223
223
|
const { paths, manifest } = await requirePatchQueue(projectRoot);
|
|
@@ -232,9 +232,9 @@ export async function patchStagedDependencyCommand(projectRoot, identifier, opti
|
|
|
232
232
|
: mode === 'add'
|
|
233
233
|
? requireRegistrationOptions(options)
|
|
234
234
|
: resolveRegistrationRemovalTarget(options, targetPatch.stagedDependencies);
|
|
235
|
-
// Shape-check --add declarations against the loaded queue:
|
|
236
|
-
//
|
|
237
|
-
//
|
|
235
|
+
// Shape-check --add declarations against the loaded queue: a
|
|
236
|
+
// patch-name-shaped --creates/--file is refused now instead of surfacing
|
|
237
|
+
// later as an undischargeable staged-dependency-unused.
|
|
238
238
|
if (mode === 'add') {
|
|
239
239
|
const added = importDependency ?? registrationDependency;
|
|
240
240
|
if (added !== undefined) {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `fireforge patch tier <name>`
|
|
2
|
+
* `fireforge patch tier <name>` sets or clears `PatchMetadata.tier` on a
|
|
3
3
|
* single patch without rewriting the `.patch` file body.
|
|
4
4
|
*
|
|
5
5
|
* Companion to `fireforge re-export <name> --tier <tier>`. Re-export is the
|
|
6
|
-
* right tool when the patch body itself needs regenerating
|
|
6
|
+
* right tool when the patch body itself needs regenerating. This subcommand
|
|
7
7
|
* covers the metadata-only adjustment, where the operator has discovered
|
|
8
8
|
* (from a `lint --per-patch` warning, say) that the threshold-tier override
|
|
9
9
|
* should be set but the patch body is already correct. Avoiding the
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* `fireforge patch tier <name>`
|
|
3
|
+
* `fireforge patch tier <name>` sets or clears `PatchMetadata.tier` on a
|
|
4
4
|
* single patch without rewriting the `.patch` file body.
|
|
5
5
|
*
|
|
6
6
|
* Companion to `fireforge re-export <name> --tier <tier>`. Re-export is the
|
|
7
|
-
* right tool when the patch body itself needs regenerating
|
|
7
|
+
* right tool when the patch body itself needs regenerating. This subcommand
|
|
8
8
|
* covers the metadata-only adjustment, where the operator has discovered
|
|
9
9
|
* (from a `lint --per-patch` warning, say) that the threshold-tier override
|
|
10
10
|
* should be set but the patch body is already correct. Avoiding the
|
|
@@ -35,8 +35,8 @@ export async function patchTierCommand(projectRoot, identifier, options = {}) {
|
|
|
35
35
|
const isDryRun = options.dryRun === true;
|
|
36
36
|
intro(isDryRun ? 'FireForge patch tier (dry run)' : 'FireForge patch tier');
|
|
37
37
|
// Mode mutex: a single invocation either sets or clears the tier.
|
|
38
|
-
// Combining both is ambiguous
|
|
39
|
-
//
|
|
38
|
+
// Combining both is ambiguous: the operator's intent is not obvious and
|
|
39
|
+
// silently picking one would mask the typo.
|
|
40
40
|
const setting = options.tier !== undefined;
|
|
41
41
|
const clearing = options.clear === true;
|
|
42
42
|
if (setting && clearing) {
|
|
@@ -75,7 +75,7 @@ export async function patchTierCommand(projectRoot, identifier, options = {}) {
|
|
|
75
75
|
if (!proceedAfterDecision(decision, 'Cancelled — no changes made'))
|
|
76
76
|
return;
|
|
77
77
|
// Single write under the patch directory lock (delegated inside
|
|
78
|
-
// updatePatchMetadata). Setting routes through `updates
|
|
78
|
+
// updatePatchMetadata). Setting routes through `updates`. Clearing
|
|
79
79
|
// routes through `unsetFields` so TypeScript's exact optional types
|
|
80
80
|
// do not have to carry an explicit `undefined` on the `tier` field.
|
|
81
81
|
if (after !== undefined) {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Structural equality for patch rename maps, shared by the placement-mode
|
|
3
3
|
* export preview/commit check (`export-flow.ts`) and `patch reorder`'s
|
|
4
4
|
* under-lock drift check. Both previously carried a byte-identical copy of
|
|
5
|
-
* the sorted-entries comparison
|
|
5
|
+
* the sorted-entries comparison. One helper keeps the two commit gates from
|
|
6
6
|
* drifting.
|
|
7
7
|
*/
|
|
8
8
|
import type { PatchRenameEntry } from '../core/patch-manifest.js';
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Structural equality for patch rename maps, shared by the placement-mode
|
|
4
4
|
* export preview/commit check (`export-flow.ts`) and `patch reorder`'s
|
|
5
5
|
* under-lock drift check. Both previously carried a byte-identical copy of
|
|
6
|
-
* the sorted-entries comparison
|
|
6
|
+
* the sorted-entries comparison. One helper keeps the two commit gates from
|
|
7
7
|
* drifting.
|
|
8
8
|
*/
|
|
9
9
|
/**
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Five commands (`doctor --clear-resolution`, `resolve`, `rebase --continue`,
|
|
5
5
|
* `rebase --abort`, and the rebase patch loop) had each copied the same
|
|
6
|
-
* spread-then-`delete` updater.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
6
|
+
* spread-then-`delete` updater. The clear routes through `updateState` instead
|
|
7
|
+
* of a load/modify/save pair so the updater runs inside the state-file lock
|
|
8
|
+
* against the freshest on-disk state: a concurrent write to an unrelated key
|
|
9
|
+
* (`buildMode`, `baseCommit`) is then not clobbered by a stale reload. Keeping
|
|
10
|
+
* it in one place stops the copies from drifting apart.
|
|
11
11
|
*
|
|
12
12
|
* A no-op when nothing is pending, so callers need no guard of their own.
|
|
13
13
|
* @param projectRoot - Project root holding `.fireforge/state.json`.
|
|
@@ -5,11 +5,11 @@ import { updateState } from '../core/config.js';
|
|
|
5
5
|
*
|
|
6
6
|
* Five commands (`doctor --clear-resolution`, `resolve`, `rebase --continue`,
|
|
7
7
|
* `rebase --abort`, and the rebase patch loop) had each copied the same
|
|
8
|
-
* spread-then-`delete` updater.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
8
|
+
* spread-then-`delete` updater. The clear routes through `updateState` instead
|
|
9
|
+
* of a load/modify/save pair so the updater runs inside the state-file lock
|
|
10
|
+
* against the freshest on-disk state: a concurrent write to an unrelated key
|
|
11
|
+
* (`buildMode`, `baseCommit`) is then not clobbered by a stale reload. Keeping
|
|
12
|
+
* it in one place stops the copies from drifting apart.
|
|
13
13
|
*
|
|
14
14
|
* A no-op when nothing is pending, so callers need no guard of their own.
|
|
15
15
|
* @param projectRoot - Project root holding `.fireforge/state.json`.
|
|
@@ -20,7 +20,7 @@ export interface AdjacentUnmanagedContext {
|
|
|
20
20
|
approvedSeen: Set<string>;
|
|
21
21
|
/**
|
|
22
22
|
* Offenders collected across the loop. `files` stays the bare paths that
|
|
23
|
-
* downstream consumers already read
|
|
23
|
+
* downstream consumers already read. `anchored` carries the same entries
|
|
24
24
|
* with the owned directory that made each one adjacent, so the run-level
|
|
25
25
|
* refusal can name the anchor without re-deriving it.
|
|
26
26
|
*/
|
|
@@ -36,7 +36,7 @@ export declare function findMissingFiles(engineDir: string, files: readonly stri
|
|
|
36
36
|
* One unmanaged file and the owned directory that made it adjacent.
|
|
37
37
|
*
|
|
38
38
|
* The anchor is what an unattended run could not previously recover: the
|
|
39
|
-
* notice named the offending file and the patch, but not
|
|
39
|
+
* notice named the offending file and the patch, but not which of the
|
|
40
40
|
* patch's owned locations the file sits beside, so triaging a refusal on a
|
|
41
41
|
* patch that owns files in several directories meant re-deriving the
|
|
42
42
|
* adjacency by hand from the manifest.
|
|
@@ -51,7 +51,7 @@ export interface AdjacentUnmanagedFile {
|
|
|
51
51
|
* Emits the scan-less advisory for one patch: missing manifest files and
|
|
52
52
|
* unmanaged files adjacent to the patch's ownership. When
|
|
53
53
|
* `--refuse-adjacent-unmanaged` is set and any unmanaged adjacent file
|
|
54
|
-
* exists, records the patch into `ctx.refusals` and returns true
|
|
54
|
+
* exists, records the patch into `ctx.refusals` and returns true. The
|
|
55
55
|
* caller then skips the write for this patch and converts the collection
|
|
56
56
|
* into one run-level non-zero refusal after the loop.
|
|
57
57
|
*/
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
* brand-new file an author just created beside a patch's owned files is
|
|
7
7
|
* silently left out of the refreshed body. This module detects such adjacent
|
|
8
8
|
* files, filters out tool-managed paths (branding, furnace) so the notice
|
|
9
|
-
* names only genuinely unmanaged candidates, and
|
|
10
|
-
* `--refuse-adjacent-unmanaged
|
|
9
|
+
* names only genuinely unmanaged candidates, and, under
|
|
10
|
+
* `--refuse-adjacent-unmanaged`, lets the caller turn the notice into a
|
|
11
11
|
* non-zero refusal.
|
|
12
12
|
*
|
|
13
|
-
* Split out of re-export.ts to keep that file inside the max-lines budget
|
|
14
|
-
*
|
|
13
|
+
* Split out of re-export.ts to keep that file inside the max-lines budget.
|
|
14
|
+
* Exports helpers consumed by re-export.ts, no registrar.
|
|
15
15
|
*/
|
|
16
16
|
import { dirname, join } from 'node:path';
|
|
17
17
|
import { isBrandingManagedPath } from '../core/branding.js';
|
|
@@ -30,7 +30,7 @@ export async function findMissingFiles(engineDir, files) {
|
|
|
30
30
|
}
|
|
31
31
|
function isToolManagedPath(file, isNewFile, ctx) {
|
|
32
32
|
// Mirrors status-classify: a generated branding path is tool-managed
|
|
33
|
-
// outright
|
|
33
|
+
// outright. A brand-new unowned file under the branding root is still a
|
|
34
34
|
// patch candidate (the Assets.car precedent) and must stay listed.
|
|
35
35
|
if (isBrandingManagedPath(file, ctx.binaryName) &&
|
|
36
36
|
(!isNewFile || isGeneratedBrandingPath(file, ctx.binaryName))) {
|
|
@@ -72,8 +72,8 @@ async function findAdjacentUnmanagedFiles(args) {
|
|
|
72
72
|
/**
|
|
73
73
|
* Splits the candidates into the ones that refuse and the ones a
|
|
74
74
|
* `--expect-unmanaged` carve-out admits. Approved paths are recorded as seen
|
|
75
|
-
* so an unused carve-out can be reported, and are
|
|
76
|
-
* dropped
|
|
75
|
+
* so an unused carve-out can be reported, and are returned rather than
|
|
76
|
+
* dropped, so the exception stays visible instead of quietly widening.
|
|
77
77
|
*/
|
|
78
78
|
function partitionApproved(files, ctx) {
|
|
79
79
|
const refusing = [];
|
|
@@ -97,7 +97,7 @@ function describeAnchored(entry) {
|
|
|
97
97
|
* Emits the scan-less advisory for one patch: missing manifest files and
|
|
98
98
|
* unmanaged files adjacent to the patch's ownership. When
|
|
99
99
|
* `--refuse-adjacent-unmanaged` is set and any unmanaged adjacent file
|
|
100
|
-
* exists, records the patch into `ctx.refusals` and returns true
|
|
100
|
+
* exists, records the patch into `ctx.refusals` and returns true. The
|
|
101
101
|
* caller then skips the write for this patch and converts the collection
|
|
102
102
|
* into one run-level non-zero refusal after the loop.
|
|
103
103
|
*/
|
|
@@ -7,9 +7,9 @@ export declare function loadScanFilesAssignments(manifestPath: string, manifest:
|
|
|
7
7
|
* a dry-run changed anything it promised only to inspect. That turns a
|
|
8
8
|
* "dry-run reverted a just-written export" incident into a hard, named
|
|
9
9
|
* failure instead of silent data loss discovered only when a later gate
|
|
10
|
-
* fails. The post-fingerprint runs whether `operation` resolves or rejects
|
|
11
|
-
* a dry-run that mutates state and
|
|
12
|
-
* rollback defect must not go unreported
|
|
10
|
+
* fails. The post-fingerprint runs whether `operation` resolves or rejects,
|
|
11
|
+
* because a dry-run that mutates state and then fails is exactly the case
|
|
12
|
+
* where a rollback defect must not go unreported. A rejection with a purity
|
|
13
13
|
* violation surfaces the violation with the original error as `cause`.
|
|
14
14
|
* No-op outside dry-run.
|
|
15
15
|
*/
|
|
@@ -54,7 +54,7 @@ export async function loadScanFilesAssignments(manifestPath, manifest) {
|
|
|
54
54
|
for (const assignment of parsed.assignments) {
|
|
55
55
|
const patch = resolvePatchIdentifier(assignment.patch, manifest.patches);
|
|
56
56
|
if (!patch) {
|
|
57
|
-
// Suggest
|
|
57
|
+
// Suggest close matches instead of dumping the whole queue.
|
|
58
58
|
throw new InvalidArgumentError(`--scan-files: ${formatPatchNotFoundError(assignment.patch, manifest.patches)}`, '--scan-files');
|
|
59
59
|
}
|
|
60
60
|
const patchFiles = filesByPatch.get(patch.filename) ?? new Set();
|
|
@@ -75,23 +75,23 @@ export async function loadScanFilesAssignments(manifestPath, manifest) {
|
|
|
75
75
|
* Fingerprints every piece of state a `re-export --dry-run` promises not to
|
|
76
76
|
* disturb: the engine's commit + working-tree status (via the same
|
|
77
77
|
* generation token `fireforge test` uses) and the byte content of every
|
|
78
|
-
* regular file under `patches
|
|
79
|
-
* patches, because a dry-run of patch B can revert a just-written
|
|
80
|
-
* patch A.
|
|
78
|
+
* regular file under `patches/`. That covers all of them, not just the
|
|
79
|
+
* selected patches, because a dry-run of patch B can revert a just-written
|
|
80
|
+
* export of patch A.
|
|
81
81
|
*
|
|
82
|
-
* A missing patches directory (ENOENT/ENOTDIR) fingerprints as empty
|
|
83
|
-
* is nothing there to protect
|
|
82
|
+
* A missing patches directory (ENOENT/ENOTDIR) fingerprints as empty, since
|
|
83
|
+
* there is nothing there to protect. Any other listing failure (EACCES, EIO,
|
|
84
84
|
* …) throws: an unreadable directory is not evidence it is empty, and
|
|
85
85
|
* treating it as such lets the guard silently vouch for state it never saw.
|
|
86
86
|
* The same rule covers an unmeasurable engine generation and an unreadable
|
|
87
|
-
* individual patch file
|
|
87
|
+
* individual patch file. A before-pass failure aborts the dry run before it
|
|
88
88
|
* starts, since a guard that measured nothing cannot vouch for anything.
|
|
89
89
|
*/
|
|
90
90
|
async function fingerprintDryRunState(engineDir, patchesDir) {
|
|
91
91
|
const fingerprint = new Map();
|
|
92
92
|
const generation = await snapshotEngineGeneration(engineDir);
|
|
93
93
|
if (isUnavailableGenerationToken(generation)) {
|
|
94
|
-
// A failed probe measured nothing
|
|
94
|
+
// A failed probe measured nothing. Hashing the failure token would let
|
|
95
95
|
// two identical failures compare "unchanged" (vouching for unmeasured
|
|
96
96
|
// state) and two differing messages report a spurious violation.
|
|
97
97
|
throw new GeneralError(`[dry-run] cannot fingerprint the engine working tree for the purity guard: ` +
|
|
@@ -107,9 +107,9 @@ async function fingerprintDryRunState(engineDir, patchesDir) {
|
|
|
107
107
|
.sort();
|
|
108
108
|
}
|
|
109
109
|
catch (error) {
|
|
110
|
-
// No patches directory
|
|
111
|
-
// the post-run pass produces the same empty set, and a directory that
|
|
112
|
-
// appears mid-dry-run correctly reports as a violation. Any
|
|
110
|
+
// No patches directory, so nothing there to protect. The same condition
|
|
111
|
+
// on the post-run pass produces the same empty set, and a directory that
|
|
112
|
+
// appears mid-dry-run correctly reports as a violation. Any other failure
|
|
113
113
|
// must not read as "empty": the guard would be vouching for state it
|
|
114
114
|
// never saw.
|
|
115
115
|
const code = getNodeErrorCode(error);
|
|
@@ -125,7 +125,7 @@ async function fingerprintDryRunState(engineDir, patchesDir) {
|
|
|
125
125
|
}
|
|
126
126
|
catch (error) {
|
|
127
127
|
// A file that vanished between the listing and the read is omitted, so
|
|
128
|
-
// a dry run that
|
|
128
|
+
// a dry run that deleted a patch artifact reports as the violation it
|
|
129
129
|
// is (key present before, absent after) instead of hiding behind a
|
|
130
130
|
// fingerprinting error. Every other failure fails closed: a constant
|
|
131
131
|
// placeholder would make unreadable-before equal unreadable-after even
|
|
@@ -155,9 +155,9 @@ async function fingerprintDryRunState(engineDir, patchesDir) {
|
|
|
155
155
|
* a dry-run changed anything it promised only to inspect. That turns a
|
|
156
156
|
* "dry-run reverted a just-written export" incident into a hard, named
|
|
157
157
|
* failure instead of silent data loss discovered only when a later gate
|
|
158
|
-
* fails. The post-fingerprint runs whether `operation` resolves or rejects
|
|
159
|
-
* a dry-run that mutates state and
|
|
160
|
-
* rollback defect must not go unreported
|
|
158
|
+
* fails. The post-fingerprint runs whether `operation` resolves or rejects,
|
|
159
|
+
* because a dry-run that mutates state and then fails is exactly the case
|
|
160
|
+
* where a rollback defect must not go unreported. A rejection with a purity
|
|
161
161
|
* violation surfaces the violation with the original error as `cause`.
|
|
162
162
|
* No-op outside dry-run.
|
|
163
163
|
*/
|
|
@@ -181,9 +181,9 @@ export async function withDryRunPurityGuard(engineDir, patchesDir, isDryRun, ope
|
|
|
181
181
|
}
|
|
182
182
|
catch (fingerprintError) {
|
|
183
183
|
// The post-run fingerprint failing must not swallow the dry run's own
|
|
184
|
-
// failure
|
|
184
|
+
// failure: an operation that mutated state, broke it, and made it
|
|
185
185
|
// unreadable is exactly the case where both facts matter. The combined
|
|
186
|
-
// message carries both
|
|
186
|
+
// message carries both. The operation error stays the `cause`.
|
|
187
187
|
if (failed) {
|
|
188
188
|
throw new GeneralError(`[dry-run] this dry run failed (${toError(operationError).message}), and its purity could ` +
|
|
189
189
|
`not be verified afterwards: ${toError(fingerprintError).message}. Inspect engine/ and ` +
|