@hominis/fireforge 0.45.0 → 0.46.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +409 -446
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +21 -15
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +46 -0
- package/dist/src/cli-usage-error.js +81 -0
- package/dist/src/cli.d.ts +7 -2
- package/dist/src/cli.js +47 -47
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +3 -4
- package/dist/src/commands/build.js +27 -17
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +19 -0
- package/dist/src/commands/destructive-decision.js +31 -0
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -10
- package/dist/src/commands/doctor-check-core.js +0 -8
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
- package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
- package/dist/src/commands/doctor-furnace-jar.js +1 -1
- package/dist/src/commands/doctor-furnace.js +22 -22
- package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -17
- package/dist/src/commands/doctor-orphaned-harness.js +14 -23
- package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
- package/dist/src/commands/doctor-patch-manifest.js +7 -6
- package/dist/src/commands/doctor-post-rebase-audit.js +3 -3
- package/dist/src/commands/doctor-source-pin.d.ts +12 -12
- package/dist/src/commands/doctor-source-pin.js +14 -14
- package/dist/src/commands/doctor-working-tree.d.ts +3 -3
- package/dist/src/commands/doctor-working-tree.js +3 -3
- package/dist/src/commands/doctor.d.ts +3 -1
- package/dist/src/commands/doctor.js +15 -16
- package/dist/src/commands/download.js +50 -37
- package/dist/src/commands/export-all.js +29 -12
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +29 -59
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +12 -12
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +7 -13
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +4 -6
- package/dist/src/commands/export-shared.d.ts +51 -32
- package/dist/src/commands/export-shared.js +17 -32
- package/dist/src/commands/export.js +14 -5
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/authoring-config.d.ts +13 -0
- package/dist/src/commands/furnace/authoring-config.js +19 -0
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +2 -2
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
- package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
- package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
- package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
- package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
- package/dist/src/commands/furnace/chrome-doc.js +18 -18
- package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +7 -12
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +6 -9
- package/dist/src/commands/furnace/create-features.d.ts +2 -2
- package/dist/src/commands/furnace/create-features.js +2 -2
- package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
- package/dist/src/commands/furnace/create-mochikit.js +7 -7
- package/dist/src/commands/furnace/create-templates.d.ts +31 -15
- package/dist/src/commands/furnace/create-templates.js +20 -19
- package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
- package/dist/src/commands/furnace/create-xpcshell.js +8 -8
- package/dist/src/commands/furnace/create.d.ts +1 -1
- package/dist/src/commands/furnace/create.js +35 -29
- package/dist/src/commands/furnace/deploy.js +15 -6
- package/dist/src/commands/furnace/diff.js +7 -7
- package/dist/src/commands/furnace/index.js +1 -1
- package/dist/src/commands/furnace/init.js +17 -16
- package/dist/src/commands/furnace/list.js +2 -2
- package/dist/src/commands/furnace/override.d.ts +1 -1
- package/dist/src/commands/furnace/override.js +43 -34
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +15 -7
- package/dist/src/commands/furnace/remove-mutations.d.ts +9 -10
- package/dist/src/commands/furnace/remove-mutations.js +19 -19
- package/dist/src/commands/furnace/remove-state.d.ts +1 -1
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +4 -8
- package/dist/src/commands/furnace/rename-browser-test.js +10 -15
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
- package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
- package/dist/src/commands/furnace/rename.js +36 -36
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +19 -16
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +28 -0
- package/dist/src/commands/furnace/test-file-name.js +39 -0
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/furnace/validation-output.d.ts +21 -9
- package/dist/src/commands/furnace/validation-output.js +3 -8
- package/dist/src/commands/import.js +22 -29
- package/dist/src/commands/lint-per-patch.d.ts +2 -2
- package/dist/src/commands/lint-per-patch.js +27 -12
- package/dist/src/commands/lint-per-run-checkjs.d.ts +14 -15
- package/dist/src/commands/lint-per-run-checkjs.js +14 -15
- package/dist/src/commands/lint-report.d.ts +3 -3
- package/dist/src/commands/lint-report.js +4 -4
- package/dist/src/commands/lint.d.ts +5 -4
- package/dist/src/commands/lint.js +36 -36
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/manifest.js +1 -1
- package/dist/src/commands/package.js +4 -6
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +19 -20
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +23 -33
- package/dist/src/commands/patch/entry-projection.d.ts +13 -0
- package/dist/src/commands/patch/entry-projection.js +24 -0
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -12
- package/dist/src/commands/patch/lint-ignore.js +33 -44
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +29 -15
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +41 -37
- package/dist/src/commands/patch/move-files.js +5 -14
- package/dist/src/commands/patch/patch-context.d.ts +1 -1
- package/dist/src/commands/patch/rename.d.ts +4 -4
- package/dist/src/commands/patch/rename.js +35 -49
- package/dist/src/commands/patch/reorder.js +35 -48
- package/dist/src/commands/patch/split-plan.d.ts +7 -8
- package/dist/src/commands/patch/split-plan.js +10 -13
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +50 -48
- package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +22 -28
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +20 -30
- package/dist/src/commands/patch-rename-map.d.ts +19 -0
- package/dist/src/commands/patch-rename-map.js +36 -0
- package/dist/src/commands/pending-resolution.d.ts +15 -0
- package/dist/src/commands/pending-resolution.js +25 -0
- package/dist/src/commands/re-export-adjacent.d.ts +25 -3
- package/dist/src/commands/re-export-adjacent.js +40 -24
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +23 -27
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +33 -33
- package/dist/src/commands/re-export-files.d.ts +2 -3
- package/dist/src/commands/re-export-files.js +52 -44
- package/dist/src/commands/re-export-lint.d.ts +29 -30
- package/dist/src/commands/re-export-lint.js +36 -29
- package/dist/src/commands/re-export-options.d.ts +1 -1
- package/dist/src/commands/re-export-options.js +1 -1
- package/dist/src/commands/re-export-register.d.ts +1 -1
- package/dist/src/commands/re-export-register.js +1 -1
- package/dist/src/commands/re-export-scan.d.ts +1 -1
- package/dist/src/commands/re-export-scan.js +12 -9
- package/dist/src/commands/re-export-single.d.ts +23 -4
- package/dist/src/commands/re-export-single.js +39 -31
- package/dist/src/commands/re-export.js +35 -17
- package/dist/src/commands/rebase/abort.js +9 -14
- package/dist/src/commands/rebase/continue.js +20 -19
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +5 -5
- package/dist/src/commands/rebase/patch-loop.d.ts +2 -2
- package/dist/src/commands/rebase/patch-loop.js +20 -24
- package/dist/src/commands/register.js +5 -5
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/resolve.d.ts +2 -2
- package/dist/src/commands/resolve.js +21 -13
- package/dist/src/commands/run.d.ts +0 -13
- package/dist/src/commands/run.js +38 -51
- package/dist/src/commands/setup-support.d.ts +16 -4
- package/dist/src/commands/setup-support.js +20 -20
- package/dist/src/commands/setup.js +4 -10
- package/dist/src/commands/source.js +9 -2
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +6 -6
- package/dist/src/commands/status-json.d.ts +14 -13
- package/dist/src/commands/status-json.js +9 -8
- package/dist/src/commands/status-output.d.ts +3 -3
- package/dist/src/commands/status-output.js +5 -5
- package/dist/src/commands/status-ownership.d.ts +3 -3
- package/dist/src/commands/status-ownership.js +3 -3
- package/dist/src/commands/status.js +25 -26
- package/dist/src/commands/test-build-phase.d.ts +3 -3
- package/dist/src/commands/test-build-phase.js +48 -24
- package/dist/src/commands/test-diagnose.d.ts +1 -1
- package/dist/src/commands/test-diagnose.js +20 -20
- package/dist/src/commands/test-modes.d.ts +4 -4
- package/dist/src/commands/test-modes.js +4 -5
- package/dist/src/commands/test-register.js +5 -3
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +40 -33
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +17 -17
- package/dist/src/commands/test-verdict.d.ts +19 -5
- package/dist/src/commands/test-verdict.js +26 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +73 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.d.ts +26 -0
- package/dist/src/commands/token-list.js +153 -0
- package/dist/src/commands/token.js +26 -10
- package/dist/src/commands/tree.js +26 -21
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +16 -16
- package/dist/src/commands/verify.d.ts +3 -3
- package/dist/src/commands/verify.js +10 -10
- package/dist/src/commands/watch.js +11 -11
- package/dist/src/commands/wire.js +17 -16
- package/dist/src/core/ast-utils.d.ts +7 -7
- package/dist/src/core/ast-utils.js +8 -8
- package/dist/src/core/branding.d.ts +5 -12
- package/dist/src/core/branding.js +6 -5
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +10 -7
- package/dist/src/core/build-audit-platform.d.ts +32 -3
- package/dist/src/core/build-audit-platform.js +153 -13
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +10 -9
- package/dist/src/core/build-audit-resolve.d.ts +5 -5
- package/dist/src/core/build-audit-resolve.js +6 -6
- package/dist/src/core/build-audit-skip.d.ts +57 -0
- package/dist/src/core/build-audit-skip.js +112 -0
- package/dist/src/core/build-audit-transforms.d.ts +2 -2
- package/dist/src/core/build-audit-transforms.js +3 -3
- package/dist/src/core/build-audit.d.ts +21 -8
- package/dist/src/core/build-audit.js +142 -40
- package/dist/src/core/build-baseline-types.d.ts +19 -18
- package/dist/src/core/build-baseline-types.js +1 -1
- package/dist/src/core/build-baseline.d.ts +48 -31
- package/dist/src/core/build-baseline.js +20 -43
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +18 -17
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +14 -14
- package/dist/src/core/build-prepare.d.ts +4 -12
- package/dist/src/core/build-prepare.js +22 -26
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-paths.d.ts +2 -6
- package/dist/src/core/config-paths.js +4 -2
- package/dist/src/core/config-state.d.ts +0 -6
- package/dist/src/core/config-state.js +3 -21
- package/dist/src/core/config-validate-build-audit.d.ts +8 -0
- package/dist/src/core/config-validate-build-audit.js +80 -0
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +3 -3
- package/dist/src/core/config-validate-patch-policy.d.ts +2 -2
- package/dist/src/core/config-validate-patch-policy.js +3 -3
- package/dist/src/core/config-validate-test-toolchains.d.ts +2 -2
- package/dist/src/core/config-validate-test-toolchains.js +4 -5
- package/dist/src/core/config-validate.js +22 -12
- package/dist/src/core/config.d.ts +12 -12
- package/dist/src/core/config.js +21 -25
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +20 -20
- package/dist/src/core/destructive.d.ts +14 -14
- package/dist/src/core/destructive.js +9 -9
- package/dist/src/core/diff-hunks.d.ts +2 -2
- package/dist/src/core/diff-hunks.js +7 -7
- package/dist/src/core/discard-baseline.d.ts +10 -10
- package/dist/src/core/discard-baseline.js +22 -23
- package/dist/src/core/display-state.d.ts +11 -11
- package/dist/src/core/display-state.js +12 -12
- package/dist/src/core/engine-changes.d.ts +2 -2
- package/dist/src/core/engine-changes.js +2 -2
- package/dist/src/core/engine-precondition.d.ts +5 -13
- package/dist/src/core/engine-precondition.js +5 -10
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +50 -54
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +10 -10
- package/dist/src/core/file-lock-owner.d.ts +103 -0
- package/dist/src/core/file-lock-owner.js +259 -0
- package/dist/src/core/file-lock.d.ts +14 -19
- package/dist/src/core/file-lock.js +90 -128
- package/dist/src/core/firefox-cache.d.ts +13 -1
- package/dist/src/core/firefox-cache.js +61 -36
- package/dist/src/core/firefox-download.d.ts +15 -0
- package/dist/src/core/firefox-download.js +38 -22
- package/dist/src/core/firefox-extract.d.ts +8 -7
- package/dist/src/core/firefox-extract.js +45 -27
- package/dist/src/core/firefox.d.ts +34 -36
- package/dist/src/core/firefox.js +13 -44
- package/dist/src/core/furnace-apply-dry-run.d.ts +1 -6
- package/dist/src/core/furnace-apply-dry-run.js +2 -8
- package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
- package/dist/src/core/furnace-apply-ftl.js +8 -8
- package/dist/src/core/furnace-apply-helpers.d.ts +9 -20
- package/dist/src/core/furnace-apply-helpers.js +28 -39
- package/dist/src/core/furnace-apply-output.js +1 -1
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +13 -11
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
- package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
- package/dist/src/core/furnace-apply.d.ts +4 -4
- package/dist/src/core/furnace-apply.js +50 -29
- package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
- package/dist/src/core/furnace-checksum-utils.js +5 -5
- package/dist/src/core/furnace-config-custom.d.ts +1 -1
- package/dist/src/core/furnace-config-custom.js +2 -2
- package/dist/src/core/furnace-config-order.js +1 -1
- package/dist/src/core/furnace-config-tokens.d.ts +3 -3
- package/dist/src/core/furnace-config-tokens.js +3 -3
- package/dist/src/core/furnace-config-validate.js +2 -2
- package/dist/src/core/furnace-config.d.ts +5 -5
- package/dist/src/core/furnace-config.js +40 -53
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +9 -8
- package/dist/src/core/furnace-css-fragments.d.ts +6 -6
- package/dist/src/core/furnace-css-fragments.js +11 -11
- package/dist/src/core/furnace-dir-entry.d.ts +20 -0
- package/dist/src/core/furnace-dir-entry.js +21 -0
- package/dist/src/core/furnace-jsconfig.d.ts +7 -7
- package/dist/src/core/furnace-jsconfig.js +22 -20
- package/dist/src/core/furnace-operation.d.ts +22 -19
- package/dist/src/core/furnace-operation.js +38 -34
- package/dist/src/core/furnace-precondition.d.ts +10 -10
- package/dist/src/core/furnace-precondition.js +8 -8
- package/dist/src/core/furnace-refresh.d.ts +18 -6
- package/dist/src/core/furnace-refresh.js +5 -8
- package/dist/src/core/furnace-registration-ast.d.ts +2 -3
- package/dist/src/core/furnace-registration-ast.js +9 -12
- package/dist/src/core/furnace-registration-remove.d.ts +4 -4
- package/dist/src/core/furnace-registration-remove.js +6 -6
- package/dist/src/core/furnace-registration-validate.d.ts +2 -2
- package/dist/src/core/furnace-registration-validate.js +2 -2
- package/dist/src/core/furnace-registration.d.ts +7 -6
- package/dist/src/core/furnace-registration.js +29 -36
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-scanner.js +3 -6
- package/dist/src/core/furnace-stale-export.d.ts +17 -16
- package/dist/src/core/furnace-stale-export.js +16 -15
- package/dist/src/core/furnace-staleness.d.ts +2 -2
- package/dist/src/core/furnace-staleness.js +2 -2
- package/dist/src/core/furnace-state-persist.d.ts +12 -12
- package/dist/src/core/furnace-state-persist.js +10 -10
- package/dist/src/core/furnace-step-errors.d.ts +6 -6
- package/dist/src/core/furnace-step-errors.js +6 -6
- package/dist/src/core/furnace-validate-accessibility.js +14 -14
- package/dist/src/core/furnace-validate-compatibility.js +9 -9
- package/dist/src/core/furnace-validate-registration.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +18 -20
- package/dist/src/core/furnace-validate-structure.d.ts +1 -1
- package/dist/src/core/furnace-validate-structure.js +4 -4
- package/dist/src/core/furnace-validate.js +9 -9
- package/dist/src/core/furnace-version-drift.d.ts +5 -5
- package/dist/src/core/furnace-version-drift.js +5 -5
- package/dist/src/core/git-base.d.ts +6 -4
- package/dist/src/core/git-base.js +29 -7
- package/dist/src/core/git-diff-new-file.d.ts +40 -0
- package/dist/src/core/git-diff-new-file.js +119 -0
- package/dist/src/core/git-diff.d.ts +13 -13
- package/dist/src/core/git-diff.js +121 -189
- package/dist/src/core/git-file-ops.d.ts +6 -13
- package/dist/src/core/git-file-ops.js +11 -35
- package/dist/src/core/git-readonly-index.d.ts +12 -14
- package/dist/src/core/git-readonly-index.js +12 -16
- package/dist/src/core/git-status.d.ts +9 -2
- package/dist/src/core/git-status.js +23 -11
- package/dist/src/core/git.d.ts +3 -9
- package/dist/src/core/git.js +28 -57
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +28 -27
- package/dist/src/core/history-log.d.ts +19 -0
- package/dist/src/core/history-log.js +29 -0
- package/dist/src/core/license-headers.d.ts +19 -18
- package/dist/src/core/license-headers.js +29 -28
- package/dist/src/core/mach-build-artifacts.d.ts +21 -21
- package/dist/src/core/mach-build-artifacts.js +23 -23
- package/dist/src/core/mach-error-hints.d.ts +5 -10
- package/dist/src/core/mach-error-hints.js +14 -14
- package/dist/src/core/mach-known-noise-filter.d.ts +42 -38
- package/dist/src/core/mach-known-noise-filter.js +57 -56
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +17 -16
- package/dist/src/core/mach-python.d.ts +3 -0
- package/dist/src/core/mach-python.js +13 -7
- package/dist/src/core/mach-resource-shim.d.ts +24 -12
- package/dist/src/core/mach-resource-shim.js +124 -21
- package/dist/src/core/mach.d.ts +59 -73
- package/dist/src/core/mach.js +47 -115
- package/dist/src/core/marionette-port.d.ts +15 -30
- package/dist/src/core/marionette-port.js +46 -89
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +32 -50
- package/dist/src/core/markdown-table.d.ts +9 -9
- package/dist/src/core/markdown-table.js +14 -14
- package/dist/src/core/mochitest-server-port.d.ts +8 -8
- package/dist/src/core/mochitest-server-port.js +17 -17
- package/dist/src/core/module-resolution-preflight.d.ts +8 -8
- package/dist/src/core/module-resolution-preflight.js +11 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
- package/dist/src/core/moz-manifest-helpers.js +7 -7
- package/dist/src/core/moz-manifest-register.d.ts +1 -1
- package/dist/src/core/moz-manifest-register.js +2 -2
- package/dist/src/core/moz-manifest-rules.js +46 -42
- package/dist/src/core/moz-manifest-tokenizers.js +1 -1
- package/dist/src/core/ownership-table.d.ts +5 -5
- package/dist/src/core/ownership-table.js +7 -7
- package/dist/src/core/parser-fallback.d.ts +3 -3
- package/dist/src/core/parser-fallback.js +3 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
- package/dist/src/core/patch-apply-fuzz.js +13 -13
- package/dist/src/core/patch-apply.d.ts +13 -14
- package/dist/src/core/patch-apply.js +36 -42
- package/dist/src/core/patch-export-coverage.d.ts +0 -9
- package/dist/src/core/patch-export-coverage.js +1 -30
- package/dist/src/core/patch-export-update.d.ts +21 -4
- package/dist/src/core/patch-export-update.js +7 -6
- package/dist/src/core/patch-export.d.ts +20 -30
- package/dist/src/core/patch-export.js +55 -77
- package/dist/src/core/patch-files.d.ts +0 -4
- package/dist/src/core/patch-files.js +0 -11
- package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
- package/dist/src/core/patch-identifier-suggest.js +4 -4
- package/dist/src/core/patch-lint-binary.d.ts +12 -18
- package/dist/src/core/patch-lint-cache.d.ts +18 -2
- package/dist/src/core/patch-lint-cache.js +16 -19
- package/dist/src/core/patch-lint-checkjs.d.ts +55 -38
- package/dist/src/core/patch-lint-checkjs.js +78 -64
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
- package/dist/src/core/patch-lint-creators.d.ts +5 -9
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +27 -19
- package/dist/src/core/patch-lint-cross.js +67 -110
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +15 -11
- package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
- package/dist/src/core/patch-lint-diff-tag.js +5 -5
- package/dist/src/core/patch-lint-diff.d.ts +4 -4
- package/dist/src/core/patch-lint-diff.js +4 -4
- package/dist/src/core/patch-lint-file-size.d.ts +3 -3
- package/dist/src/core/patch-lint-file-size.js +6 -6
- package/dist/src/core/patch-lint-forward-registration.d.ts +58 -0
- package/dist/src/core/patch-lint-forward-registration.js +210 -0
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +46 -46
- package/dist/src/core/patch-lint-module-registration.d.ts +3 -9
- package/dist/src/core/patch-lint-module-registration.js +1 -1
- package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
- package/dist/src/core/patch-lint-mozbuild.js +10 -10
- package/dist/src/core/patch-lint-observer.d.ts +3 -3
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint-ownership.d.ts +6 -6
- package/dist/src/core/patch-lint-ownership.js +6 -6
- package/dist/src/core/patch-lint-prettier.d.ts +6 -6
- package/dist/src/core/patch-lint-prettier.js +7 -7
- package/dist/src/core/patch-lint-queue-types.d.ts +60 -0
- package/dist/src/core/patch-lint-queue-types.js +12 -0
- package/dist/src/core/patch-lint-staged-registration.d.ts +61 -0
- package/dist/src/core/patch-lint-staged-registration.js +90 -0
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +41 -35
- package/dist/src/core/patch-lint.js +52 -49
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +11 -11
- package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
- package/dist/src/core/patch-manifest-consistency.js +16 -17
- package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
- package/dist/src/core/patch-manifest-files-affected.js +3 -3
- package/dist/src/core/patch-manifest-io.d.ts +14 -14
- package/dist/src/core/patch-manifest-io.js +35 -34
- package/dist/src/core/patch-manifest-query.d.ts +1 -1
- package/dist/src/core/patch-manifest-query.js +4 -4
- package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
- package/dist/src/core/patch-manifest-resolve.js +7 -7
- package/dist/src/core/patch-manifest-validate.js +3 -3
- package/dist/src/core/patch-manifest.d.ts +2 -2
- package/dist/src/core/patch-manifest.js +2 -2
- package/dist/src/core/patch-parse.d.ts +32 -21
- package/dist/src/core/patch-parse.js +40 -15
- package/dist/src/core/patch-policy.js +15 -27
- package/dist/src/core/patch-registration-refs.d.ts +4 -4
- package/dist/src/core/patch-registration-refs.js +7 -7
- package/dist/src/core/patch-source-metadata.d.ts +1 -3
- package/dist/src/core/patch-source-metadata.js +0 -4
- package/dist/src/core/patch-transform.d.ts +8 -16
- package/dist/src/core/patch-transform.js +13 -23
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +6 -6
- package/dist/src/core/rebase-session.d.ts +9 -15
- package/dist/src/core/rebase-session.js +13 -25
- package/dist/src/core/register-browser-content.js +3 -2
- package/dist/src/core/register-browser-test.js +2 -1
- package/dist/src/core/register-module.js +2 -1
- package/dist/src/core/register-result.d.ts +1 -1
- package/dist/src/core/register-result.js +1 -1
- package/dist/src/core/register-scaffold.d.ts +2 -2
- package/dist/src/core/register-scaffold.js +8 -7
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +6 -5
- package/dist/src/core/register-xpcshell-test.d.ts +2 -2
- package/dist/src/core/register-xpcshell-test.js +2 -2
- package/dist/src/core/run-log-redact.d.ts +38 -0
- package/dist/src/core/run-log-redact.js +69 -0
- package/dist/src/core/run-log.d.ts +21 -10
- package/dist/src/core/run-log.js +76 -27
- package/dist/src/core/shared-ftl.d.ts +2 -2
- package/dist/src/core/shared-ftl.js +6 -6
- package/dist/src/core/signal-critical.d.ts +2 -2
- package/dist/src/core/signal-critical.js +4 -6
- package/dist/src/core/smoke-patterns.d.ts +5 -6
- package/dist/src/core/smoke-patterns.js +15 -20
- package/dist/src/core/state-file.d.ts +15 -4
- package/dist/src/core/state-file.js +14 -1
- package/dist/src/core/status-binary.d.ts +8 -8
- package/dist/src/core/status-binary.js +12 -12
- package/dist/src/core/status-classify.d.ts +17 -17
- package/dist/src/core/status-classify.js +13 -12
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +40 -25
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +69 -69
- package/dist/src/core/test-harness-output.d.ts +7 -7
- package/dist/src/core/test-harness-output.js +7 -7
- package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
- package/dist/src/core/test-harness-verdict-notes.js +4 -4
- package/dist/src/core/test-path-scope.d.ts +8 -8
- package/dist/src/core/test-path-scope.js +11 -11
- package/dist/src/core/test-stale-check.d.ts +22 -23
- package/dist/src/core/test-stale-check.js +31 -30
- package/dist/src/core/test-stale-symlink.d.ts +1 -1
- package/dist/src/core/test-stale-symlink.js +1 -1
- package/dist/src/core/test-stall-triage.d.ts +9 -9
- package/dist/src/core/test-stall-triage.js +22 -22
- package/dist/src/core/test-xpcshell-retry.d.ts +26 -7
- package/dist/src/core/test-xpcshell-retry.js +14 -11
- package/dist/src/core/token-category.d.ts +35 -2
- package/dist/src/core/token-category.js +67 -58
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +9 -9
- package/dist/src/core/token-dark-mode.js +13 -25
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +56 -0
- package/dist/src/core/token-inventory.js +109 -0
- package/dist/src/core/token-manager.d.ts +4 -4
- package/dist/src/core/token-manager.js +22 -22
- package/dist/src/core/token-scaffold.d.ts +4 -4
- package/dist/src/core/token-scaffold.js +4 -4
- package/dist/src/core/token-variant.d.ts +14 -14
- package/dist/src/core/token-variant.js +52 -53
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +23 -23
- package/dist/src/core/tree-cow.d.ts +3 -5
- package/dist/src/core/tree-cow.js +8 -8
- package/dist/src/core/tree-guard.d.ts +3 -3
- package/dist/src/core/tree-guard.js +23 -23
- package/dist/src/core/tree-store.d.ts +15 -15
- package/dist/src/core/tree-store.js +39 -38
- package/dist/src/core/typecheck-shim.d.ts +16 -15
- package/dist/src/core/typecheck-shim.js +26 -25
- package/dist/src/core/typecheck.d.ts +12 -12
- package/dist/src/core/typecheck.js +33 -33
- package/dist/src/core/wire-destroy.d.ts +2 -2
- package/dist/src/core/wire-destroy.js +5 -5
- package/dist/src/core/wire-dom-fragment.d.ts +3 -3
- package/dist/src/core/wire-dom-fragment.js +12 -23
- package/dist/src/core/wire-init.d.ts +2 -2
- package/dist/src/core/wire-init.js +7 -7
- package/dist/src/core/wire-subscript.d.ts +1 -1
- package/dist/src/core/wire-subscript.js +3 -3
- package/dist/src/core/wire-utils.d.ts +9 -9
- package/dist/src/core/wire-utils.js +16 -28
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +28 -30
- package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
- package/dist/src/core/xpcshell-profile-dir.js +7 -7
- package/dist/src/errors/base.d.ts +69 -16
- package/dist/src/errors/base.js +95 -26
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +26 -34
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/config.d.ts +0 -14
- package/dist/src/errors/config.js +13 -34
- package/dist/src/errors/download.d.ts +13 -0
- package/dist/src/errors/download.js +53 -24
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/furnace.js +8 -9
- package/dist/src/errors/git.d.ts +9 -9
- package/dist/src/errors/git.js +21 -31
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +11 -13
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +8 -8
- package/dist/src/errors/run.d.ts +1 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/types/commands/options.d.ts +155 -200
- package/dist/src/types/commands/patches.d.ts +19 -19
- package/dist/src/types/commands/project.d.ts +3 -3
- package/dist/src/types/config.d.ts +52 -19
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/index.d.ts +0 -1
- package/dist/src/types/json.d.ts +3 -3
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/typecheck.d.ts +3 -3
- package/dist/src/utils/assert.d.ts +4 -16
- package/dist/src/utils/assert.js +7 -24
- package/dist/src/utils/build-info.d.ts +6 -6
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +7 -6
- package/dist/src/utils/child-env.js +5 -5
- package/dist/src/utils/concurrency.d.ts +2 -2
- package/dist/src/utils/concurrency.js +2 -2
- package/dist/src/utils/elapsed.js +10 -1
- package/dist/src/utils/errors.d.ts +8 -8
- package/dist/src/utils/errors.js +8 -8
- package/dist/src/utils/fs.d.ts +1 -1
- package/dist/src/utils/fs.js +15 -20
- package/dist/src/utils/hash.d.ts +12 -0
- package/dist/src/utils/hash.js +16 -0
- package/dist/src/utils/line-dispatch.d.ts +15 -0
- package/dist/src/utils/line-dispatch.js +48 -0
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.js +11 -11
- package/dist/src/utils/machine-output.js +2 -2
- package/dist/src/utils/options.d.ts +14 -20
- package/dist/src/utils/options.js +26 -27
- package/dist/src/utils/package-root.js +5 -14
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/platform.d.ts +0 -4
- package/dist/src/utils/process-group.d.ts +10 -9
- package/dist/src/utils/process-group.js +37 -36
- package/dist/src/utils/process.d.ts +70 -55
- package/dist/src/utils/process.js +129 -179
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +9 -9
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +26 -0
- package/dist/src/utils/sleep.js +31 -0
- package/dist/src/utils/stdio-drain.d.ts +7 -7
- package/dist/src/utils/stdio-drain.js +8 -8
- package/dist/src/utils/validation.d.ts +12 -49
- package/dist/src/utils/validation.js +26 -36
- package/docs/README.md +2 -2
- package/docs/configuration.md +163 -69
- package/docs/exit-codes.md +66 -49
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +414 -247
- package/docs/machine-output.md +58 -34
- package/docs/patch-workflow.md +48 -44
- package/docs/run-logs.md +72 -28
- package/docs/testing.md +105 -98
- package/docs/verification-trees.md +23 -22
- package/package.json +7 -6
- package/dist/src/commands/rebase.d.ts +0 -4
- package/dist/src/commands/rebase.js +0 -5
- package/dist/src/core/patch-artifact-normalize.d.ts +0 -21
- package/dist/src/core/patch-artifact-normalize.js +0 -24
- package/dist/src/core/patch-lint-reexports.d.ts +0 -7
- package/dist/src/core/patch-lint-reexports.js +0 -8
- package/dist/src/core/wire-targets.d.ts +0 -7
- package/dist/src/core/wire-targets.js +0 -8
|
@@ -21,16 +21,16 @@ import { lintPerPatch } from './lint-per-patch.js';
|
|
|
21
21
|
/**
|
|
22
22
|
* Resolves the diff the lint command should run against. Returns `null` when
|
|
23
23
|
* there is nothing to lint (no matching files, clean tree, or empty diff
|
|
24
|
-
* content)
|
|
24
|
+
* content). Callers treat that as the early-exit signal and stop.
|
|
25
25
|
*
|
|
26
26
|
* Extracted from {@link lintCommand} so that function stays under the
|
|
27
|
-
* per-function LOC budget
|
|
27
|
+
* per-function LOC budget. The two file-mode and aggregate-mode branches
|
|
28
28
|
* share no state with the post-lint reporting pipeline.
|
|
29
29
|
*
|
|
30
30
|
* When `binaryName` is provided, the aggregate-mode branch (no explicit file
|
|
31
31
|
* list) excludes paths under `browser/branding/<binaryName>/` from the diff.
|
|
32
|
-
* `status` classifies those paths as `branding
|
|
33
|
-
* operator did not author directly
|
|
32
|
+
* `status` classifies those paths as `branding`, tool-managed material the
|
|
33
|
+
* operator did not author directly, and without the exclusion
|
|
34
34
|
* `fireforge lint` on a fresh project immediately fails `large-patch-lines`
|
|
35
35
|
* / `large-patch-files` / `missing-license-header` on the generated branding
|
|
36
36
|
* tree. File-list mode (explicit paths) is unaffected: passing a branding
|
|
@@ -97,7 +97,7 @@ async function resolveLintDiff(engineDir, files, binaryName, furnacePrefixes) {
|
|
|
97
97
|
return null;
|
|
98
98
|
}
|
|
99
99
|
// Aggregate-mode branding exclusion. A fresh-setup workspace carries a
|
|
100
|
-
// large tool-managed branding diff the operator did not author
|
|
100
|
+
// large tool-managed branding diff the operator did not author. Running
|
|
101
101
|
// the default lint against it fires size and license-header rules on
|
|
102
102
|
// content that was never intended to survive in the patch queue as-is. The
|
|
103
103
|
// exclusion mirrors the `branding` bucket in `fireforge status` so the two
|
|
@@ -119,7 +119,7 @@ async function resolveLintDiff(engineDir, files, binaryName, furnacePrefixes) {
|
|
|
119
119
|
// stories) that the operator did not author and never intended to land
|
|
120
120
|
// on the patch queue. Without the carve-out, a post-`furnace preview`
|
|
121
121
|
// aggregate `lint` fails with one `missing-license-header` error per
|
|
122
|
-
// generated story file
|
|
122
|
+
// generated story file. Each is header-less on purpose because it is
|
|
123
123
|
// re-generated from component metadata on every preview run.
|
|
124
124
|
const filteredPaths = furnacePrefixes
|
|
125
125
|
? nonBrandingPaths.filter((path) => ![...furnacePrefixes].some((p) => path.startsWith(p)))
|
|
@@ -176,9 +176,9 @@ function buildMaxWarningsMessage(count, maxWarnings, scope) {
|
|
|
176
176
|
* attribute via `issue.file`, which is the offending site and is owned by
|
|
177
177
|
* some patch.
|
|
178
178
|
*
|
|
179
|
-
* Multiple owners: an issue is dropped if
|
|
180
|
-
* rule.
|
|
181
|
-
* ones.
|
|
179
|
+
* Multiple owners: an issue is dropped if any owning patch waived the
|
|
180
|
+
* rule. This is conservative: it never adds new findings, only drops
|
|
181
|
+
* already-waived ones.
|
|
182
182
|
*
|
|
183
183
|
* @param issues - Issues collected from the aggregate lint run.
|
|
184
184
|
* @param ctx - Patch queue context used to attribute file → patch.
|
|
@@ -208,7 +208,7 @@ export function applyAggregateLintIgnoreSuppression(issues, ctx) {
|
|
|
208
208
|
}
|
|
209
209
|
/**
|
|
210
210
|
* Up-front flag validation for `lintCommand`: rejects `--only-introduced`
|
|
211
|
-
* without `--since` and non-integer `--max-warnings
|
|
211
|
+
* without `--since` and non-integer `--max-warnings`, each a
|
|
212
212
|
* misconfiguration that should fail loud rather than silently narrow the
|
|
213
213
|
* result. Positional arguments in per-patch mode are patch selectors
|
|
214
214
|
* and are validated downstream by `selectPatchSubset`.
|
|
@@ -216,7 +216,7 @@ export function applyAggregateLintIgnoreSuppression(issues, ctx) {
|
|
|
216
216
|
function validateLintFlags(options) {
|
|
217
217
|
// `--only-introduced` scopes the exit code to `--since`-tagged issues, so
|
|
218
218
|
// without a revision to anchor the diff there is no "introduced" subset
|
|
219
|
-
// to scope to
|
|
219
|
+
// to scope to. Reject the combination up-front so a misconfigured CI
|
|
220
220
|
// invocation fails loud instead of silently treating every error as
|
|
221
221
|
// cumulative and passing.
|
|
222
222
|
if (options.onlyIntroduced && !options.since) {
|
|
@@ -226,13 +226,13 @@ function validateLintFlags(options) {
|
|
|
226
226
|
(!Number.isInteger(options.maxWarnings) || options.maxWarnings < 0)) {
|
|
227
227
|
throw new InvalidArgumentError('--max-warnings must be a non-negative integer.', '--max-warnings');
|
|
228
228
|
}
|
|
229
|
-
// `--patches` only means something in per-patch mode
|
|
230
|
-
// queue
|
|
229
|
+
// `--patches` only means something in per-patch mode, where it filters
|
|
230
|
+
// the queue. In aggregate/file-list mode there is no patch loop to narrow.
|
|
231
231
|
if (options.patches !== undefined && !options.perPatch) {
|
|
232
232
|
throw new InvalidArgumentError('--patches requires --per-patch.', '--patches');
|
|
233
233
|
}
|
|
234
234
|
// The JSON report is a per-patch artifact (per-patch size metrics and
|
|
235
|
-
// suppressed issues)
|
|
235
|
+
// suppressed issues). Aggregate mode has no per-patch rows to report.
|
|
236
236
|
if (options.report !== undefined && !options.perPatch) {
|
|
237
237
|
throw new InvalidArgumentError('--report requires --per-patch.', '--report');
|
|
238
238
|
}
|
|
@@ -242,7 +242,7 @@ function validateLintFlags(options) {
|
|
|
242
242
|
* applied patch summed (no explicit file scope, multi-patch queue), the
|
|
243
243
|
* `large-patch-lines` / `large-patch-files` counts are an artefact of
|
|
244
244
|
* aggregation rather than a property of any one patch. Surface the
|
|
245
|
-
* `--per-patch` hint and downgrade those two rules to warnings
|
|
245
|
+
* `--per-patch` hint and downgrade those two rules to warnings. Per-patch
|
|
246
246
|
* mode keeps them as errors.
|
|
247
247
|
*/
|
|
248
248
|
function downgradeAggregateSizeRules(issues, files, ctx) {
|
|
@@ -260,8 +260,8 @@ function downgradeAggregateSizeRules(issues, files, ctx) {
|
|
|
260
260
|
}
|
|
261
261
|
/**
|
|
262
262
|
* Evaluates the patch-size rules (`large-patch-files` / `large-patch-lines`)
|
|
263
|
-
* for an ad-hoc explicit-file-list lint, scoped to each file's
|
|
264
|
-
* patch
|
|
263
|
+
* for an ad-hoc explicit-file-list lint, scoped to each file's owning
|
|
264
|
+
* patch rather than the combined file list.
|
|
265
265
|
*
|
|
266
266
|
* Feeding every passed file to `lintExportedPatch` as one synthetic patch
|
|
267
267
|
* makes a cross-patch selection of eight files belonging to four patches
|
|
@@ -269,7 +269,7 @@ function downgradeAggregateSizeRules(issues, files, ctx) {
|
|
|
269
269
|
* oversized. This helper groups the affected files by their owning patch
|
|
270
270
|
* (via the manifest's `filesAffected`), then runs `lintPatchSize` against
|
|
271
271
|
* each owner's real file count + diff, honouring that owner's `tier` and
|
|
272
|
-
* `lintIgnore
|
|
272
|
+
* `lintIgnore`, so `lint <files>`, `lint --per-patch`, and
|
|
273
273
|
* `re-export --dry-run` agree on the same size findings for the same files.
|
|
274
274
|
* Files no patch claims are evaluated together as one prospective new patch,
|
|
275
275
|
* preserving the pre-export oversized-change warning.
|
|
@@ -338,9 +338,9 @@ async function lintOwningPatchSizes(engineDir, filesAffected, ctx) {
|
|
|
338
338
|
*/
|
|
339
339
|
async function reportLintOutcome(engineDir, issues, options) {
|
|
340
340
|
// Diff-scoping: tag each issue as introduced-in-current-task vs
|
|
341
|
-
// cumulative-pre-existing-drift.
|
|
342
|
-
// and exit code semantics are unchanged
|
|
343
|
-
// summary make triage
|
|
341
|
+
// cumulative-pre-existing-drift. Nothing is filtered (the full set still
|
|
342
|
+
// prints and exit code semantics are unchanged), but the per-line prefix
|
|
343
|
+
// and summary make triage easier on a large patch series.
|
|
344
344
|
const sinceActive = Boolean(options.since);
|
|
345
345
|
if (options.since) {
|
|
346
346
|
const diffFiles = await collectDiffFilePaths(engineDir, options.since);
|
|
@@ -371,8 +371,8 @@ async function reportLintOutcome(engineDir, issues, options) {
|
|
|
371
371
|
}
|
|
372
372
|
// Exit-code scope: `--only-introduced` narrows the failure criterion to
|
|
373
373
|
// issues tagged `introduced`. Cumulative errors still print so the
|
|
374
|
-
// operator sees the full queue state, but do not fail lint
|
|
375
|
-
//
|
|
374
|
+
// operator sees the full queue state, but do not fail lint. The case
|
|
375
|
+
// this serves is a branch whose own diff is clean but whose repo
|
|
376
376
|
// already carries pre-existing queue errors from older patches.
|
|
377
377
|
const failingErrors = options.onlyIntroduced
|
|
378
378
|
? errors.filter((i) => i.tag === 'introduced')
|
|
@@ -388,7 +388,7 @@ async function reportLintOutcome(engineDir, issues, options) {
|
|
|
388
388
|
outro('Lint failed');
|
|
389
389
|
throw new GeneralError(buildMaxWarningsMessage(warnings.length, options.maxWarnings));
|
|
390
390
|
}
|
|
391
|
-
// Notices are advisory and do not count as warnings
|
|
391
|
+
// Notices are advisory and do not count as warnings: emitting "passed
|
|
392
392
|
// with warnings" when only notices fired contradicts the preceding
|
|
393
393
|
// `0 warning(s)` summary line and reads as a regression. Errors suppressed
|
|
394
394
|
// by --only-introduced still warrant the "with warnings" outro: they print
|
|
@@ -417,10 +417,10 @@ export async function lintCommand(projectRoot, files, options = {}) {
|
|
|
417
417
|
const paths = getProjectPaths(projectRoot);
|
|
418
418
|
await assertEngineGitReady(paths.engine);
|
|
419
419
|
if (options.perPatch) {
|
|
420
|
-
// Positional arguments in per-patch mode select
|
|
421
|
-
// same alias resolution as --patches
|
|
422
|
-
//
|
|
423
|
-
//
|
|
420
|
+
// Positional arguments in per-patch mode select patches through the
|
|
421
|
+
// same alias resolution as --patches. A non-matching positional fails
|
|
422
|
+
// loud against the queue listing, so an engine path can never silently
|
|
423
|
+
// lint. Explicit --patches entries come first.
|
|
424
424
|
const perPatchOptions = files.length > 0 ? { ...options, patches: [...(options.patches ?? []), ...files] } : options;
|
|
425
425
|
await lintPerPatch(projectRoot, paths, perPatchOptions);
|
|
426
426
|
return;
|
|
@@ -429,7 +429,7 @@ export async function lintCommand(projectRoot, files, options = {}) {
|
|
|
429
429
|
// into the aggregate-mode branding exclusion in `resolveLintDiff`.
|
|
430
430
|
const config = await loadConfig(projectRoot);
|
|
431
431
|
// Pull the Furnace-managed prefix set up-front so aggregate lint can
|
|
432
|
-
// mirror the branding exclusion for Furnace material
|
|
432
|
+
// mirror the branding exclusion for Furnace material. Without it,
|
|
433
433
|
// preview-generated stories under `browser/components/storybook/
|
|
434
434
|
// stories/furnace/` show up as license-header errors on every
|
|
435
435
|
// post-preview lint run.
|
|
@@ -446,7 +446,7 @@ export async function lintCommand(projectRoot, files, options = {}) {
|
|
|
446
446
|
}
|
|
447
447
|
// Ad-hoc explicit-file-list mode evaluates the patch-size rules per
|
|
448
448
|
// owning patch (see `lintOwningPatchSizes`), so suppress the synthetic
|
|
449
|
-
// combined-list size check in the shared pass
|
|
449
|
+
// combined-list size check in the shared pass. Otherwise a cross-patch
|
|
450
450
|
// selection synthesises a phantom oversized patch from the file count.
|
|
451
451
|
const fileListMode = files.length > 0 && ctx !== undefined;
|
|
452
452
|
let issues = [
|
|
@@ -459,15 +459,15 @@ export async function lintCommand(projectRoot, files, options = {}) {
|
|
|
459
459
|
issues.push(...(await lintOwningPatchSizes(paths.engine, filesAffected, ctx)));
|
|
460
460
|
}
|
|
461
461
|
// Cross-patch rules operate over the whole queue, so run them whenever a
|
|
462
|
-
// patches directory exists
|
|
462
|
+
// patches directory exists. They surface duplicate /dev/null creations
|
|
463
463
|
// and forward-import chains that the per-patch orchestrator cannot see.
|
|
464
464
|
if (ctx) {
|
|
465
465
|
issues.push(...lintPatchQueue(ctx));
|
|
466
466
|
}
|
|
467
467
|
// Honor per-patch `lintIgnore` in aggregate mode by attributing each
|
|
468
468
|
// issue's file to its owning patches via the manifest's `filesAffected`.
|
|
469
|
-
// Per-patch mode threads `lintIgnore` directly into `lintExportedPatch
|
|
470
|
-
//
|
|
469
|
+
// Per-patch mode threads `lintIgnore` directly into `lintExportedPatch`.
|
|
470
|
+
// Aggregate mode has no patch-level scope to consult, so a check an
|
|
471
471
|
// operator explicitly waived in `patches.json` re-surfaces on every
|
|
472
472
|
// `--since` run (the CI default).
|
|
473
473
|
if (ctx) {
|
|
@@ -495,7 +495,7 @@ export function registerLint(program, { getProjectRoot, withErrorHandling }) {
|
|
|
495
495
|
.option('--since <git-rev>', 'Tag issues as [introduced] or [cumulative] based on whether the file changed since <git-rev> (e.g. HEAD, a branch, a SHA)')
|
|
496
496
|
.option('--only-introduced', 'Fail only on issues tagged [introduced] (requires --since). Cumulative errors still print but do not set a non-zero exit.')
|
|
497
497
|
.option('--per-patch', "Lint each patch in the queue as its own isolated diff. Rescopes patch-size rules so they fire against individual patches rather than the aggregate. Honours each patch's `lintIgnore` entries.")
|
|
498
|
-
.option('--patches <names...>', 'With --per-patch, lint only the named patches. Accepts repeated flags, comma lists, full filenames/stems, manifest names, category-prefixed slugs, or bare slugs. Positional arguments after --per-patch are treated the same way.')
|
|
498
|
+
.option('--patches <names...>', 'With --per-patch, lint only the named patches. Accepts repeated flags, comma lists, full filenames/stems, bare order numbers, manifest names, category-prefixed slugs, or bare slugs. Positional arguments after --per-patch are treated the same way.')
|
|
499
499
|
.option('--max-warnings <n>', 'Fail when lint reports more than <n> warning(s); use 0 for warning-clean release gates.')
|
|
500
500
|
.option('--no-cache', 'Bypass per-patch lint result cache reads and writes.')
|
|
501
501
|
.option('--report <path>', 'With --per-patch, write a machine-readable JSON report (per-patch size metrics, tier, thresholds, issues, and lintIgnore-suppressed issues) to <path>.')
|
|
@@ -533,8 +533,8 @@ export function registerLint(program, { getProjectRoot, withErrorHandling }) {
|
|
|
533
533
|
.description('Manage the per-patch lint result cache')
|
|
534
534
|
// Commander routes `fireforge lint cache` here even when the operator
|
|
535
535
|
// meant to lint an engine directory literally named `cache`. A bare
|
|
536
|
-
// `lint cache` (no subcommand) used to silently do nothing
|
|
537
|
-
// ambiguity explicit instead of doing the wrong operation quietly.
|
|
536
|
+
// `lint cache` (no subcommand) used to silently do nothing, so make
|
|
537
|
+
// the ambiguity explicit instead of doing the wrong operation quietly.
|
|
538
538
|
.action(withErrorHandling(() => {
|
|
539
539
|
info('Nothing to do: "lint cache" manages the lint result cache (try "lint cache clear"). ' +
|
|
540
540
|
'To lint a directory named cache/, disambiguate with a trailing slash: "fireforge lint cache/".');
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
* of commands to enumerate.
|
|
9
9
|
*
|
|
10
10
|
* The order of entries in {@link COMMAND_MANIFEST} is the order commands
|
|
11
|
-
* appear in `fireforge --help
|
|
12
|
-
* groups related commands together.
|
|
11
|
+
* appear in `fireforge --help`. The order is chosen rather than
|
|
12
|
+
* alphabetical, and groups related commands together.
|
|
13
13
|
*/
|
|
14
14
|
import type { CommandRegistrar } from '../types/cli.js';
|
|
15
15
|
/**
|
|
@@ -18,9 +18,9 @@ import type { CommandRegistrar } from '../types/cli.js';
|
|
|
18
18
|
export interface CommandManifestEntry {
|
|
19
19
|
/**
|
|
20
20
|
* Human-readable command name, matching the first token of the
|
|
21
|
-
* command line (e.g. `build`, `furnace`). Informational only
|
|
21
|
+
* command line (e.g. `build`, `furnace`). Informational only, since the
|
|
22
22
|
* authoritative command string lives inside each registrar's
|
|
23
|
-
* `.command(...)` call
|
|
23
|
+
* `.command(...)` call, but useful for documentation, manifest
|
|
24
24
|
* introspection, and test assertions.
|
|
25
25
|
*/
|
|
26
26
|
name: string;
|
|
@@ -12,7 +12,7 @@ import { registerLint } from './lint.js';
|
|
|
12
12
|
import { registerPackage } from './package.js';
|
|
13
13
|
import { registerPatch } from './patch/index.js';
|
|
14
14
|
import { registerReExport } from './re-export-register.js';
|
|
15
|
-
import { registerRebase } from './rebase.js';
|
|
15
|
+
import { registerRebase } from './rebase/index.js';
|
|
16
16
|
import { registerRegister } from './register.js';
|
|
17
17
|
import { registerReset } from './reset.js';
|
|
18
18
|
import { registerResolve } from './resolve.js';
|
|
@@ -8,6 +8,7 @@ import { hasBuildArtifacts, machPackageCapture } from '../core/mach.js';
|
|
|
8
8
|
import { assertBuildArtifacts } from '../core/mach-build-artifacts.js';
|
|
9
9
|
import { explainMachError } from '../core/mach-error-hints.js';
|
|
10
10
|
import { BuildError } from '../errors/build.js';
|
|
11
|
+
import { elapsedSince } from '../utils/elapsed.js';
|
|
11
12
|
import { error, info, intro, outro, verbose } from '../utils/logger.js';
|
|
12
13
|
import { pickDefined } from '../utils/options.js';
|
|
13
14
|
/**
|
|
@@ -44,8 +45,8 @@ export async function packageCommand(projectRoot, options) {
|
|
|
44
45
|
const startTime = Date.now();
|
|
45
46
|
let result;
|
|
46
47
|
try {
|
|
47
|
-
// `machPackageCapture` streams output live
|
|
48
|
-
// post-run diagnostics
|
|
48
|
+
// `machPackageCapture` streams output live and captures the tail for
|
|
49
|
+
// post-run diagnostics. An inherit-only dispatch leaves the hint
|
|
49
50
|
// translator unable to see the failure text. The captured stderr is fed
|
|
50
51
|
// through `explainMachError` below so recognised failure modes get an
|
|
51
52
|
// actionable hint prepended to the raw mach output.
|
|
@@ -54,10 +55,7 @@ export async function packageCommand(projectRoot, options) {
|
|
|
54
55
|
catch (error) {
|
|
55
56
|
throw new BuildError('Package process failed to start', 'mach package', error instanceof Error ? error : undefined);
|
|
56
57
|
}
|
|
57
|
-
const
|
|
58
|
-
const minutes = Math.floor(duration / 60000);
|
|
59
|
-
const seconds = Math.floor((duration % 60000) / 1000);
|
|
60
|
-
const timeStr = minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;
|
|
58
|
+
const timeStr = elapsedSince(startTime);
|
|
61
59
|
if (result.exitCode !== 0) {
|
|
62
60
|
error(`Packaging failed after ${timeStr}`);
|
|
63
61
|
const combinedOutput = `${result.stdout}\n${result.stderr}`;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `fireforge patch compact
|
|
2
|
+
* `fireforge patch compact`: closes ordinal gaps in the patch queue.
|
|
3
3
|
*
|
|
4
4
|
* After deletes or splits, patch ordinals may have gaps (e.g. 1, 3, 7).
|
|
5
5
|
* This command renumbers patches to close those gaps in a single atomic
|
|
6
6
|
* operation, preserving relative order. Without a patch policy the whole
|
|
7
|
-
* queue is renumbered from 1
|
|
7
|
+
* queue is renumbered from 1. With `patchPolicy.ranges` configured the
|
|
8
8
|
* compaction is range-aware (each category range compacts independently,
|
|
9
9
|
* reserved ranges and out-of-range strays are left untouched).
|
|
10
10
|
*/
|
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* `fireforge patch compact
|
|
3
|
+
* `fireforge patch compact`: closes ordinal gaps in the patch queue.
|
|
4
4
|
*
|
|
5
5
|
* After deletes or splits, patch ordinals may have gaps (e.g. 1, 3, 7).
|
|
6
6
|
* This command renumbers patches to close those gaps in a single atomic
|
|
7
7
|
* operation, preserving relative order. Without a patch policy the whole
|
|
8
|
-
* queue is renumbered from 1
|
|
8
|
+
* queue is renumbered from 1. With `patchPolicy.ranges` configured the
|
|
9
9
|
* compaction is range-aware (each category range compacts independently,
|
|
10
10
|
* reserved ranges and out-of-range strays are left untouched).
|
|
11
11
|
*/
|
|
12
12
|
import { Command } from 'commander';
|
|
13
13
|
import { loadConfig } from '../../core/config.js';
|
|
14
|
-
import {
|
|
14
|
+
import { confirmDestructive } from '../../core/destructive.js';
|
|
15
|
+
import { appendHistoryBestEffort } from '../../core/history-log.js';
|
|
15
16
|
import { withPatchDirectoryLock } from '../../core/patch-lock.js';
|
|
16
17
|
import { loadPatchesManifest, renumberPatchesInManifest, } from '../../core/patch-manifest.js';
|
|
17
18
|
import { applyRenameMapToManifest, enforcePatchPolicy } from '../../core/patch-policy.js';
|
|
18
19
|
import { GeneralError } from '../../errors/base.js';
|
|
19
|
-
import { toError } from '../../utils/errors.js';
|
|
20
20
|
import { info, intro, outro, warn } from '../../utils/logger.js';
|
|
21
21
|
import { addWaitLockOption, pickDefined, resolveWaitLockSeconds } from '../../utils/options.js';
|
|
22
|
+
import { proceedAfterDecision } from '../destructive-decision.js';
|
|
23
|
+
import { renameMapsEqual } from '../patch-rename-map.js';
|
|
22
24
|
import { requirePatchQueue } from './patch-context.js';
|
|
23
25
|
import { rebuildFilenameForOrder } from './reorder.js';
|
|
24
26
|
/** True when `order` falls inside a configured reserved range. */
|
|
@@ -30,9 +32,9 @@ function isReservedOrder(policyCfg, order) {
|
|
|
30
32
|
*
|
|
31
33
|
* Without a patch policy, all patches are renumbered to 1, 2, 3, … in
|
|
32
34
|
* current sort order (historical behaviour). With `patchPolicy.ranges`
|
|
33
|
-
* configured, compaction happens
|
|
35
|
+
* configured, compaction happens within each category range instead:
|
|
34
36
|
* each range's members are renumbered consecutively starting at the
|
|
35
|
-
* range's first occupied ordinal, skipping reserved orders
|
|
37
|
+
* range's first occupied ordinal, skipping reserved orders, mirroring
|
|
36
38
|
* what `evaluateGaps` treats as gapless under `allowGaps: false`.
|
|
37
39
|
* Reserved-range patches and patches outside their category's range are
|
|
38
40
|
* never moved (a global renumber would project them across range
|
|
@@ -84,7 +86,7 @@ function computeCompactRenameMap(patches, policyCfg) {
|
|
|
84
86
|
/**
|
|
85
87
|
* Patches a range-aware compact leaves in place because they sit outside
|
|
86
88
|
* their category's configured range (or outside all ranges) without a
|
|
87
|
-
* reserved-range exception. They already violate `category-range
|
|
89
|
+
* reserved-range exception. They already violate `category-range`. Moving
|
|
88
90
|
* them is a policy decision compact must not make silently.
|
|
89
91
|
*/
|
|
90
92
|
function findCompactStrays(patches, policyCfg) {
|
|
@@ -139,14 +141,8 @@ export async function patchCompactCommand(projectRoot, options = {}) {
|
|
|
139
141
|
dryRun: options.dryRun === true,
|
|
140
142
|
unsafeOverride: options.forceUnsafe === true,
|
|
141
143
|
});
|
|
142
|
-
if (decision
|
|
143
|
-
outro('Dry run complete — no changes made');
|
|
144
|
+
if (!proceedAfterDecision(decision, 'Compact cancelled'))
|
|
144
145
|
return;
|
|
145
|
-
}
|
|
146
|
-
if (decision === 'declined') {
|
|
147
|
-
outro('Compact cancelled');
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
146
|
await withPatchDirectoryLock(paths.patches, async () => {
|
|
151
147
|
const currentManifest = await loadPatchesManifest(paths.patches);
|
|
152
148
|
if (!currentManifest) {
|
|
@@ -157,6 +153,14 @@ export async function patchCompactCommand(projectRoot, options = {}) {
|
|
|
157
153
|
info('Patch queue was compacted by another process. Nothing to do.');
|
|
158
154
|
return;
|
|
159
155
|
}
|
|
156
|
+
// The operator confirmed a specific plan. A queue that changed between
|
|
157
|
+
// the prompt and the lock (an export landing a new patch, a delete)
|
|
158
|
+
// yields a different plan whose renames were never shown, so refuse
|
|
159
|
+
// rather than commit them under a history entry that says "ok". This
|
|
160
|
+
// is the same gate `patch reorder` applies.
|
|
161
|
+
if (!renameMapsEqual(renameMap, currentRenameMap)) {
|
|
162
|
+
throw new GeneralError('Patch queue changed while waiting for confirmation. Re-run compact to recompute the rename plan.');
|
|
163
|
+
}
|
|
160
164
|
enforcePatchPolicy({
|
|
161
165
|
config,
|
|
162
166
|
manifest: applyRenameMapToManifest(currentManifest, currentRenameMap),
|
|
@@ -179,12 +183,7 @@ export async function patchCompactCommand(projectRoot, options = {}) {
|
|
|
179
183
|
...(options.forceUnsafe === true ? { unsafeOverride: true } : {}),
|
|
180
184
|
result: 'ok',
|
|
181
185
|
};
|
|
182
|
-
|
|
183
|
-
await appendHistory(paths.patches, historyEntry);
|
|
184
|
-
}
|
|
185
|
-
catch (historyError) {
|
|
186
|
-
warn(`History log append failed after patch compact committed: ${toError(historyError).message}`);
|
|
187
|
-
}
|
|
186
|
+
await appendHistoryBestEffort(paths.patches, historyEntry, `patch compact committed`);
|
|
188
187
|
}, { waitLockSeconds: resolveWaitLockSeconds(options.waitLock), command: 'patch compact' });
|
|
189
188
|
info(`Compacted ${renameMap.size} patch(es).`);
|
|
190
189
|
outro('Compact complete');
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `fireforge patch delete <name
|
|
2
|
+
* `fireforge patch delete <name>`: removes a patch from the queue.
|
|
3
3
|
*
|
|
4
4
|
* Destructive: refuses when a later patch imports a module owned by the
|
|
5
5
|
* target (that would leave a dangling forward import), prompts for
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* `fireforge patch delete <name
|
|
3
|
+
* `fireforge patch delete <name>`: removes a patch from the queue.
|
|
4
4
|
*
|
|
5
5
|
* Destructive: refuses when a later patch imports a module owned by the
|
|
6
6
|
* target (that would leave a dangling forward import), prompts for
|
|
@@ -9,13 +9,14 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { basename } from 'node:path';
|
|
11
11
|
import { Command } from 'commander';
|
|
12
|
-
import {
|
|
12
|
+
import { confirmDestructive } from '../../core/destructive.js';
|
|
13
|
+
import { appendHistoryBestEffort } from '../../core/history-log.js';
|
|
13
14
|
import { buildPatchQueueContext, extractImportSpecifiersWithLines, findForwardImportIgnoreLines, isForwardImportableFile, } from '../../core/patch-lint.js';
|
|
14
15
|
import { withPatchDirectoryLock } from '../../core/patch-lock.js';
|
|
15
16
|
import { removePatchFileAndManifest } from '../../core/patch-manifest.js';
|
|
16
|
-
import { toError } from '../../utils/errors.js';
|
|
17
17
|
import { info, intro, outro, warn } from '../../utils/logger.js';
|
|
18
18
|
import { addWaitLockOption, pickDefined, resolveWaitLockSeconds } from '../../utils/options.js';
|
|
19
|
+
import { proceedAfterDecision } from '../destructive-decision.js';
|
|
19
20
|
import { requirePatchQueue, requirePatchTarget } from './patch-context.js';
|
|
20
21
|
/**
|
|
21
22
|
* Runs the `patch delete` command: removes a patch file and its manifest
|
|
@@ -35,7 +36,7 @@ export async function patchDeleteCommand(projectRoot, identifier, options = {})
|
|
|
35
36
|
// Build the full queue context once so we can scan each patch's newFiles
|
|
36
37
|
// without re-parsing for the dependency check below.
|
|
37
38
|
const baseCtx = await buildPatchQueueContext(paths.patches);
|
|
38
|
-
// Hard refusal: an import owned by a
|
|
39
|
+
// Hard refusal: an import owned by a later patch that points at any of
|
|
39
40
|
// the target's newly-created files is a dependency on the target. That
|
|
40
41
|
// check is built directly from `baseCtx` rather than by diffing lint runs
|
|
41
42
|
// over a projected state.
|
|
@@ -46,10 +47,10 @@ export async function patchDeleteCommand(projectRoot, identifier, options = {})
|
|
|
46
47
|
targetNewFileLeaves.add(basename(fullPath));
|
|
47
48
|
}
|
|
48
49
|
}
|
|
49
|
-
// Scan every later patch's new files
|
|
50
|
+
// Scan every later patch's new files and its added lines on pre-existing
|
|
50
51
|
// files for import specifiers that resolve to a leaf owned by the target.
|
|
51
52
|
// Uses the shared specifier extractor so dynamic `import()` and
|
|
52
|
-
// `ChromeUtils.defineESModuleGetters` are picked up
|
|
53
|
+
// `ChromeUtils.defineESModuleGetters` are picked up: the forward-import
|
|
53
54
|
// lint rule already covers those forms, and delete safety must match the
|
|
54
55
|
// same set or it silently drops dependencies.
|
|
55
56
|
//
|
|
@@ -109,14 +110,14 @@ export async function patchDeleteCommand(projectRoot, identifier, options = {})
|
|
|
109
110
|
}
|
|
110
111
|
const conflicts = dependents.length > 0
|
|
111
112
|
? {
|
|
112
|
-
//
|
|
113
|
+
// The wording spells out the runtime impact: `git apply`
|
|
113
114
|
// does not resolve imports and succeeds even when a later patch
|
|
114
115
|
// imports a file the target created, so the queue re-imports
|
|
115
116
|
// cleanly. The breakage surfaces at browser startup when
|
|
116
117
|
// `ChromeUtils.importESModule` cannot locate the deleted module.
|
|
117
|
-
// Operators who
|
|
118
|
-
//
|
|
119
|
-
//
|
|
118
|
+
// Operators who plan to re-introduce the imported files (rename,
|
|
119
|
+
// refactor) need to know this is the impact model rather than a
|
|
120
|
+
// patch-application failure.
|
|
120
121
|
reason: `${dependents.length} later patch(es) contain import statements that reference files created by ${target.filename}. Patch application itself will still succeed, but runtime imports will fail at browser startup until those files are re-introduced.`,
|
|
121
122
|
details: dependents,
|
|
122
123
|
}
|
|
@@ -138,14 +139,8 @@ export async function patchDeleteCommand(projectRoot, identifier, options = {})
|
|
|
138
139
|
unsafeOverride: options.forceUnsafe === true,
|
|
139
140
|
conflicts,
|
|
140
141
|
});
|
|
141
|
-
if (decision
|
|
142
|
-
outro('Dry run complete — no changes made');
|
|
142
|
+
if (!proceedAfterDecision(decision, 'Delete cancelled'))
|
|
143
143
|
return;
|
|
144
|
-
}
|
|
145
|
-
if (decision === 'declined') {
|
|
146
|
-
outro('Delete cancelled');
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
144
|
// Proceed: remove under the patch directory lock so concurrent exports
|
|
150
145
|
// cannot race us into the same manifest row. The history append lives
|
|
151
146
|
// inside the same lock so two concurrent deletes cannot interleave history
|
|
@@ -156,22 +151,17 @@ export async function patchDeleteCommand(projectRoot, identifier, options = {})
|
|
|
156
151
|
// failure to the caller would mislead.
|
|
157
152
|
await withPatchDirectoryLock(paths.patches, async () => {
|
|
158
153
|
await removePatchFileAndManifest(paths.patches, target.filename);
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
catch (historyError) {
|
|
173
|
-
warn(`History log append failed after patch delete committed (${target.filename}): ${toError(historyError).message}`);
|
|
174
|
-
}
|
|
154
|
+
await appendHistoryBestEffort(paths.patches, {
|
|
155
|
+
operation: 'patch-delete',
|
|
156
|
+
args: {
|
|
157
|
+
filename: target.filename,
|
|
158
|
+
order: target.order,
|
|
159
|
+
filesAffected: target.filesAffected,
|
|
160
|
+
},
|
|
161
|
+
...(options.yes === true ? { yes: true } : {}),
|
|
162
|
+
...(options.forceUnsafe === true ? { unsafeOverride: true } : {}),
|
|
163
|
+
result: 'ok',
|
|
164
|
+
}, `patch delete committed (${target.filename})`);
|
|
175
165
|
}, { waitLockSeconds: resolveWaitLockSeconds(options.waitLock), command: 'patch delete' });
|
|
176
166
|
info(`Deleted ${target.filename}.`);
|
|
177
167
|
outro('Delete complete');
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { PatchQueueEntry } from '../../core/patch-lint.js';
|
|
2
|
+
/**
|
|
3
|
+
* Projects a rewritten patch body into the three fields cross-patch lint reads
|
|
4
|
+
* off a queue entry.
|
|
5
|
+
*
|
|
6
|
+
* `patch split` and `patch move-files` each had a byte-identical copy of this
|
|
7
|
+
* (`buildEntryProjection` / `projectEntryBody`). Both feed the same linter, so
|
|
8
|
+
* a change to what the projection carries has to reach both or the two
|
|
9
|
+
* commands start refusing different things for the same queue.
|
|
10
|
+
* @param diff - The rewritten patch body.
|
|
11
|
+
* @returns The diff plus its derived new-file and modified-file projections.
|
|
12
|
+
*/
|
|
13
|
+
export declare function projectEntryBody(diff: string): Pick<PatchQueueEntry, 'diff' | 'newFiles' | 'createdFiles' | 'modifiedFileAdditions'>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { buildModifiedFileAdditionsFromDiff } from '../../core/patch-lint.js';
|
|
2
|
+
import { detectNewFilesInDiff } from '../../core/patch-lint-diff.js';
|
|
3
|
+
import { buildNewFileTextProjection } from '../../core/patch-transform.js';
|
|
4
|
+
/**
|
|
5
|
+
* Projects a rewritten patch body into the three fields cross-patch lint reads
|
|
6
|
+
* off a queue entry.
|
|
7
|
+
*
|
|
8
|
+
* `patch split` and `patch move-files` each had a byte-identical copy of this
|
|
9
|
+
* (`buildEntryProjection` / `projectEntryBody`). Both feed the same linter, so
|
|
10
|
+
* a change to what the projection carries has to reach both or the two
|
|
11
|
+
* commands start refusing different things for the same queue.
|
|
12
|
+
* @param diff - The rewritten patch body.
|
|
13
|
+
* @returns The diff plus its derived new-file and modified-file projections.
|
|
14
|
+
*/
|
|
15
|
+
export function projectEntryBody(diff) {
|
|
16
|
+
const newFiles = buildNewFileTextProjection(diff);
|
|
17
|
+
return {
|
|
18
|
+
diff,
|
|
19
|
+
newFiles,
|
|
20
|
+
// Body-kind agnostic: a binary creation is still a creation.
|
|
21
|
+
createdFiles: detectNewFilesInDiff(diff),
|
|
22
|
+
modifiedFileAdditions: buildModifiedFileAdditionsFromDiff(diff),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `fireforge patch lint-ignore <name
|
|
2
|
+
* `fireforge patch lint-ignore <name>`: adds, removes, or clears entries
|
|
3
3
|
* in `PatchMetadata.lintIgnore` without rewriting the `.patch` file body.
|
|
4
4
|
*
|
|
5
5
|
* Companion to `fireforge re-export <name> --lint-ignore <id>` (which is
|
|
6
|
-
* append-only).
|
|
7
|
-
* express:
|
|
6
|
+
* append-only). It exists for the cases re-export cannot express:
|
|
8
7
|
* - Removing a single entry without dropping the rest of the list.
|
|
9
8
|
* - Clearing the entire list when the operator wants the rule(s) to
|
|
10
9
|
* start firing again.
|
|
@@ -15,19 +14,12 @@
|
|
|
15
14
|
* `--clear` must be supplied per invocation. The read-modify-write
|
|
16
15
|
* happens inside the patch directory lock via {@link mutatePatchMetadata}
|
|
17
16
|
* so a concurrent writer cannot interleave between the read and the
|
|
18
|
-
* write
|
|
17
|
+
* write, which matters when an operator scripts repeated invocations or
|
|
19
18
|
* runs `--add` and `--remove` back-to-back.
|
|
20
19
|
*/
|
|
21
20
|
import { Command } from 'commander';
|
|
22
21
|
import type { CommandContext } from '../../types/cli.js';
|
|
23
22
|
import type { PatchLintIgnoreOptions } from '../../types/commands/index.js';
|
|
24
|
-
type LintIgnoreMode = 'add' | 'remove' | 'clear';
|
|
25
|
-
/**
|
|
26
|
-
* Renders a one-line summary of the planned change for use in
|
|
27
|
-
* `info()` / dry-run / history args. Exported for unit-testing the
|
|
28
|
-
* message format directly without mocking the logger transport.
|
|
29
|
-
*/
|
|
30
|
-
export declare function describeChange(before: ReadonlyArray<string>, after: ReadonlyArray<string>, mode: LintIgnoreMode, values: ReadonlyArray<string>): string;
|
|
31
23
|
/**
|
|
32
24
|
* Runs the `patch lint-ignore` command: reads the patch's existing
|
|
33
25
|
* `lintIgnore`, applies the requested mode, and writes the manifest.
|
|
@@ -44,4 +36,3 @@ export declare function patchLintIgnoreCommand(projectRoot: string, identifier:
|
|
|
44
36
|
* @param context - Shared CLI registration context
|
|
45
37
|
*/
|
|
46
38
|
export declare function registerPatchLintIgnore(parent: Command, context: CommandContext): void;
|
|
47
|
-
export {};
|