@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
|
@@ -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) {
|
|
@@ -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;
|
|
@@ -45,8 +45,8 @@ export async function packageCommand(projectRoot, options) {
|
|
|
45
45
|
const startTime = Date.now();
|
|
46
46
|
let result;
|
|
47
47
|
try {
|
|
48
|
-
// `machPackageCapture` streams output live
|
|
49
|
-
// post-run diagnostics
|
|
48
|
+
// `machPackageCapture` streams output live and captures the tail for
|
|
49
|
+
// post-run diagnostics. An inherit-only dispatch leaves the hint
|
|
50
50
|
// translator unable to see the failure text. The captured stderr is fed
|
|
51
51
|
// through `explainMachError` below so recognised failure modes get an
|
|
52
52
|
// actionable hint prepended to the raw mach output.
|
|
@@ -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,11 +1,11 @@
|
|
|
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
|
*/
|
|
@@ -32,9 +32,9 @@ function isReservedOrder(policyCfg, order) {
|
|
|
32
32
|
*
|
|
33
33
|
* Without a patch policy, all patches are renumbered to 1, 2, 3, … in
|
|
34
34
|
* current sort order (historical behaviour). With `patchPolicy.ranges`
|
|
35
|
-
* configured, compaction happens
|
|
35
|
+
* configured, compaction happens within each category range instead:
|
|
36
36
|
* each range's members are renumbered consecutively starting at the
|
|
37
|
-
* range's first occupied ordinal, skipping reserved orders
|
|
37
|
+
* range's first occupied ordinal, skipping reserved orders, mirroring
|
|
38
38
|
* what `evaluateGaps` treats as gapless under `allowGaps: false`.
|
|
39
39
|
* Reserved-range patches and patches outside their category's range are
|
|
40
40
|
* never moved (a global renumber would project them across range
|
|
@@ -86,7 +86,7 @@ function computeCompactRenameMap(patches, policyCfg) {
|
|
|
86
86
|
/**
|
|
87
87
|
* Patches a range-aware compact leaves in place because they sit outside
|
|
88
88
|
* their category's configured range (or outside all ranges) without a
|
|
89
|
-
* reserved-range exception. They already violate `category-range
|
|
89
|
+
* reserved-range exception. They already violate `category-range`. Moving
|
|
90
90
|
* them is a policy decision compact must not make silently.
|
|
91
91
|
*/
|
|
92
92
|
function findCompactStrays(patches, policyCfg) {
|
|
@@ -155,9 +155,9 @@ export async function patchCompactCommand(projectRoot, options = {}) {
|
|
|
155
155
|
}
|
|
156
156
|
// The operator confirmed a specific plan. A queue that changed between
|
|
157
157
|
// the prompt and the lock (an export landing a new patch, a delete)
|
|
158
|
-
// yields a different plan whose renames were never shown
|
|
159
|
-
// rather than commit them under a history entry that says "ok"
|
|
160
|
-
// same gate `patch reorder` applies.
|
|
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
161
|
if (!renameMapsEqual(renameMap, currentRenameMap)) {
|
|
162
162
|
throw new GeneralError('Patch queue changed while waiting for confirmation. Re-run compact to recompute the rename plan.');
|
|
163
163
|
}
|
|
@@ -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
|
|
@@ -36,7 +36,7 @@ export async function patchDeleteCommand(projectRoot, identifier, options = {})
|
|
|
36
36
|
// Build the full queue context once so we can scan each patch's newFiles
|
|
37
37
|
// without re-parsing for the dependency check below.
|
|
38
38
|
const baseCtx = await buildPatchQueueContext(paths.patches);
|
|
39
|
-
// Hard refusal: an import owned by a
|
|
39
|
+
// Hard refusal: an import owned by a later patch that points at any of
|
|
40
40
|
// the target's newly-created files is a dependency on the target. That
|
|
41
41
|
// check is built directly from `baseCtx` rather than by diffing lint runs
|
|
42
42
|
// over a projected state.
|
|
@@ -47,10 +47,10 @@ export async function patchDeleteCommand(projectRoot, identifier, options = {})
|
|
|
47
47
|
targetNewFileLeaves.add(basename(fullPath));
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
-
// Scan every later patch's new files
|
|
50
|
+
// Scan every later patch's new files and its added lines on pre-existing
|
|
51
51
|
// files for import specifiers that resolve to a leaf owned by the target.
|
|
52
52
|
// Uses the shared specifier extractor so dynamic `import()` and
|
|
53
|
-
// `ChromeUtils.defineESModuleGetters` are picked up
|
|
53
|
+
// `ChromeUtils.defineESModuleGetters` are picked up: the forward-import
|
|
54
54
|
// lint rule already covers those forms, and delete safety must match the
|
|
55
55
|
// same set or it silently drops dependencies.
|
|
56
56
|
//
|
|
@@ -110,14 +110,14 @@ export async function patchDeleteCommand(projectRoot, identifier, options = {})
|
|
|
110
110
|
}
|
|
111
111
|
const conflicts = dependents.length > 0
|
|
112
112
|
? {
|
|
113
|
-
//
|
|
113
|
+
// The wording spells out the runtime impact: `git apply`
|
|
114
114
|
// does not resolve imports and succeeds even when a later patch
|
|
115
115
|
// imports a file the target created, so the queue re-imports
|
|
116
116
|
// cleanly. The breakage surfaces at browser startup when
|
|
117
117
|
// `ChromeUtils.importESModule` cannot locate the deleted module.
|
|
118
|
-
// Operators who
|
|
119
|
-
//
|
|
120
|
-
//
|
|
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.
|
|
121
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.`,
|
|
122
122
|
details: dependents,
|
|
123
123
|
}
|
|
@@ -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,7 +14,7 @@
|
|
|
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';
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* `fireforge patch lint-ignore <name
|
|
3
|
+
* `fireforge patch lint-ignore <name>`: adds, removes, or clears entries
|
|
4
4
|
* in `PatchMetadata.lintIgnore` without rewriting the `.patch` file body.
|
|
5
5
|
*
|
|
6
6
|
* Companion to `fireforge re-export <name> --lint-ignore <id>` (which is
|
|
7
|
-
* append-only).
|
|
8
|
-
* express:
|
|
7
|
+
* append-only). It exists for the cases re-export cannot express:
|
|
9
8
|
* - Removing a single entry without dropping the rest of the list.
|
|
10
9
|
* - Clearing the entire list when the operator wants the rule(s) to
|
|
11
10
|
* start firing again.
|
|
@@ -16,7 +15,7 @@
|
|
|
16
15
|
* `--clear` must be supplied per invocation. The read-modify-write
|
|
17
16
|
* happens inside the patch directory lock via {@link mutatePatchMetadata}
|
|
18
17
|
* so a concurrent writer cannot interleave between the read and the
|
|
19
|
-
* write
|
|
18
|
+
* write, which matters when an operator scripts repeated invocations or
|
|
20
19
|
* runs `--add` and `--remove` back-to-back.
|
|
21
20
|
*/
|
|
22
21
|
import { Command } from 'commander';
|
|
@@ -31,9 +30,9 @@ import { requirePatchQueue, requirePatchTarget } from './patch-context.js';
|
|
|
31
30
|
/**
|
|
32
31
|
* Printed whenever `--add` lands a new check id. The waiver this command
|
|
33
32
|
* writes turns per-patch lint green immediately, but consumer projects
|
|
34
|
-
* commonly audit lintIgnore lists against a reviewed allow-map
|
|
35
|
-
* that the map also needs updating otherwise costs a full
|
|
36
|
-
* run.
|
|
33
|
+
* commonly audit lintIgnore lists against a reviewed allow-map, and
|
|
34
|
+
* discovering that the map also needs updating otherwise costs a full
|
|
35
|
+
* downstream gate run.
|
|
37
36
|
*/
|
|
38
37
|
const LINT_IGNORE_REVIEW_WARNING = "This lint waiver is subject to the project's patch-policy review process. " +
|
|
39
38
|
'Downstream policy audits that mirror lintIgnore lists in a reviewed allow-map ' +
|
|
@@ -103,8 +102,8 @@ export async function patchLintIgnoreCommand(projectRoot, identifier, options =
|
|
|
103
102
|
const isDryRun = options.dryRun === true;
|
|
104
103
|
intro(isDryRun ? 'FireForge patch lint-ignore (dry run)' : 'FireForge patch lint-ignore');
|
|
105
104
|
// Mode mutex: exactly one mode per invocation. Combinations like
|
|
106
|
-
// `--add foo --remove bar` are rejected
|
|
107
|
-
// runs the command twice (clearer audit trail) and `--clear` plus a
|
|
105
|
+
// `--add foo --remove bar` are rejected: an operator who needs both
|
|
106
|
+
// runs the command twice (clearer audit trail), and `--clear` plus a
|
|
108
107
|
// mode is contradictory.
|
|
109
108
|
const adding = (options.add?.length ?? 0) > 0;
|
|
110
109
|
const removing = (options.remove?.length ?? 0) > 0;
|
|
@@ -123,8 +122,8 @@ export async function patchLintIgnoreCommand(projectRoot, identifier, options =
|
|
|
123
122
|
// Destructive-operation contract (docs/lifecycle-invariants.md): manifest
|
|
124
123
|
// metadata mutations get summary + dry-run + confirmation/--yes + history
|
|
125
124
|
// uniformly. Accepting --yes without ever prompting makes the flag appear
|
|
126
|
-
// only in the history record
|
|
127
|
-
//
|
|
125
|
+
// only in the history record, and suppressing lint findings is the kind
|
|
126
|
+
// of mutation an operator should approve consciously.
|
|
128
127
|
const currentList = target.lintIgnore ?? [];
|
|
129
128
|
const projectedList = applyMode(currentList, mode, values) ?? [];
|
|
130
129
|
const addsNewIds = mode === 'add' && projectedList.length > currentList.length;
|
|
@@ -145,15 +144,15 @@ export async function patchLintIgnoreCommand(projectRoot, identifier, options =
|
|
|
145
144
|
const next = applyMode(existing.lintIgnore ?? [], mode, values);
|
|
146
145
|
// Either set the new list when non-empty or unset the field
|
|
147
146
|
// entirely. The mutation API splits these to keep the
|
|
148
|
-
// exactOptionalPropertyTypes contract clean
|
|
147
|
+
// exactOptionalPropertyTypes contract clean: only set values land
|
|
149
148
|
// in the typed `Partial<PatchMetadata>`, and the unset list is
|
|
150
149
|
// applied via `delete` after spread.
|
|
151
150
|
return next !== undefined ? { set: { lintIgnore: next } } : { unset: ['lintIgnore'] };
|
|
152
151
|
}, { waitLockSeconds: resolveWaitLockSeconds(options.waitLock), command: 'patch lint-ignore' });
|
|
153
152
|
if (!result) {
|
|
154
153
|
// Race: target vanished between the manifest read above and the
|
|
155
|
-
// locked mutate.
|
|
156
|
-
// no-op
|
|
154
|
+
// locked mutate. Surfaced as a hard error rather than a silent
|
|
155
|
+
// no-op, because the operator's intent did not land.
|
|
157
156
|
throw new GeneralError(`Patch ${target.filename} disappeared from the manifest during the update. Re-run after investigating.`);
|
|
158
157
|
}
|
|
159
158
|
const existing = result.before.lintIgnore ?? [];
|
|
@@ -195,7 +194,7 @@ export function registerPatchLintIgnore(parent, context) {
|
|
|
195
194
|
addWaitLockOption(command).action(withErrorHandling(async (name, options) => {
|
|
196
195
|
// Commander defaults `--add`/`--remove` to `[]` so they appear in
|
|
197
196
|
// the options object even when unused. Strip empty arrays so
|
|
198
|
-
// `pickDefined` sees them as absent
|
|
197
|
+
// `pickDefined` sees them as absent. Otherwise the mode-count
|
|
199
198
|
// mutex would treat zero-length arrays as a present mode.
|
|
200
199
|
const normalized = {};
|
|
201
200
|
if (options.add !== undefined && options.add.length > 0)
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `fireforge patch move-files <from> <to> --create --order <n>`
|
|
2
|
+
* `fireforge patch move-files <from> <to> --create --order <n>` creates
|
|
3
3
|
* the target patch at the requested sparse order and moves the files into it
|
|
4
4
|
* as one transaction. This is the transactional bootstrap of a split:
|
|
5
5
|
* without it, moving files into a not-yet-existing patch requires a manual
|
|
6
6
|
* shrink-then-export dance with hand-repointed staged-dependency owners.
|
|
7
7
|
*
|
|
8
8
|
* Mirrors `patch split` end-to-end (same planning, projection lint, policy
|
|
9
|
-
* enforcement, and locked commit)
|
|
9
|
+
* enforcement, and locked commit). The `<to>` argument becomes the new
|
|
10
10
|
* patch's name/slug the way `split --name` does.
|
|
11
11
|
*/
|
|
12
12
|
import type { PatchMoveFilesOptions } from '../../types/commands/index.js';
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* `fireforge patch move-files <from> <to> --create --order <n>`
|
|
3
|
+
* `fireforge patch move-files <from> <to> --create --order <n>` creates
|
|
4
4
|
* the target patch at the requested sparse order and moves the files into it
|
|
5
5
|
* as one transaction. This is the transactional bootstrap of a split:
|
|
6
6
|
* without it, moving files into a not-yet-existing patch requires a manual
|
|
7
7
|
* shrink-then-export dance with hand-repointed staged-dependency owners.
|
|
8
8
|
*
|
|
9
9
|
* Mirrors `patch split` end-to-end (same planning, projection lint, policy
|
|
10
|
-
* enforcement, and locked commit)
|
|
10
|
+
* enforcement, and locked commit). The `<to>` argument becomes the new
|
|
11
11
|
* patch's name/slug the way `split --name` does.
|
|
12
12
|
*/
|
|
13
13
|
import { getProjectPaths, loadConfig } from '../../core/config.js';
|
|
@@ -33,7 +33,7 @@ export async function patchMoveFilesCreateCommand(projectRoot, fromIdentifier, n
|
|
|
33
33
|
intro(options.dryRun === true
|
|
34
34
|
? 'FireForge patch move-files --create (dry run)'
|
|
35
35
|
: 'FireForge patch move-files --create');
|
|
36
|
-
// Refuse a prompt-less run
|
|
36
|
+
// Refuse a prompt-less run before the diff/lint work, not after it.
|
|
37
37
|
assertConfirmationAvailable('patch move-files --create', options);
|
|
38
38
|
const paths = getProjectPaths(projectRoot);
|
|
39
39
|
const config = await loadConfig(projectRoot);
|
|
@@ -67,7 +67,7 @@ export async function patchMoveFilesCreateCommand(projectRoot, fromIdentifier, n
|
|
|
67
67
|
const placementOptions = { order: options.order };
|
|
68
68
|
const placement = await resolvePlacementPlan(paths.patches, placementOptions, category, newPatchName, config);
|
|
69
69
|
// The filename slug pipeline (resolvePlacementPlan above) strips redundant
|
|
70
|
-
// category prefixes
|
|
70
|
+
// category prefixes. The manifest display name must agree with the bare-slug
|
|
71
71
|
// naming policy, exactly as `export --name` already does.
|
|
72
72
|
const displayName = normalizePatchDisplayName(newPatchName, category);
|
|
73
73
|
if (displayName !== newPatchName) {
|
|
@@ -93,7 +93,7 @@ export async function patchMoveFilesCreateCommand(projectRoot, fromIdentifier, n
|
|
|
93
93
|
// The whole-queue context (built once, with the config so it carries the
|
|
94
94
|
// same patch-policy shape as the committed `lint --per-patch` gate) makes
|
|
95
95
|
// cross-patch `resource:///` imports and sibling head.js harness roots
|
|
96
|
-
// resolve exactly as they will after the move lands
|
|
96
|
+
// resolve exactly as they will after the move lands. Without it the
|
|
97
97
|
// projection lint is blind.
|
|
98
98
|
const patchQueueCtx = await buildPatchQueueContext(paths.patches, config);
|
|
99
99
|
const ignoreChecks = source.lintIgnore ? new Set(source.lintIgnore) : undefined;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Transactional file-ownership move into an
|
|
2
|
+
* Transactional file-ownership move into an existing patch.
|
|
3
3
|
*
|
|
4
4
|
* A preview-only `patch move-files <from> <to>` prints two
|
|
5
5
|
* `re-export --files` commands whose real execution costs three further
|
|
6
6
|
* refusals (`--allow-shrink`, `--yes`, and a projected
|
|
7
|
-
* `duplicate-new-file-creation` unless the
|
|
7
|
+
* `duplicate-new-file-creation` unless the shrink lands first, while the
|
|
8
8
|
* printed plan lists the grow first). This module performs the same
|
|
9
9
|
* shrink→grow as one transaction under the patch-directory lock with
|
|
10
10
|
* rollback, mirroring `patch split` / `move-files --create`.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* Transactional file-ownership move into an
|
|
3
|
+
* Transactional file-ownership move into an existing patch.
|
|
4
4
|
*
|
|
5
5
|
* A preview-only `patch move-files <from> <to>` prints two
|
|
6
6
|
* `re-export --files` commands whose real execution costs three further
|
|
7
7
|
* refusals (`--allow-shrink`, `--yes`, and a projected
|
|
8
|
-
* `duplicate-new-file-creation` unless the
|
|
8
|
+
* `duplicate-new-file-creation` unless the shrink lands first, while the
|
|
9
9
|
* printed plan lists the grow first). This module performs the same
|
|
10
10
|
* shrink→grow as one transaction under the patch-directory lock with
|
|
11
11
|
* rollback, mirroring `patch split` / `move-files --create`.
|
|
@@ -182,7 +182,7 @@ async function commitMoveInto(patchesDir, plan, waitLockSeconds) {
|
|
|
182
182
|
*/
|
|
183
183
|
export async function runMoveFilesInto(args) {
|
|
184
184
|
const { enginePath, patchesDir, source, target, files, sourceAfter, targetAfter, options } = args;
|
|
185
|
-
// Refuse a prompt-less run
|
|
185
|
+
// Refuse a prompt-less run before the diff/lint work, not after it.
|
|
186
186
|
assertConfirmationAvailable('patch move-files', options);
|
|
187
187
|
const sourceDiff = await buildSplitDiff(enginePath, sourceAfter, 'remaining', source.filename);
|
|
188
188
|
const targetDiff = await buildSplitDiff(enginePath, targetAfter, 'moved', target.filename);
|
|
@@ -128,7 +128,7 @@ export async function patchMoveFilesCommand(projectRoot, fromIdentifier, toIdent
|
|
|
128
128
|
note(formatFiles(targetAfter), `${target.filename} files after move`);
|
|
129
129
|
// Manual fallback (e.g. when the worktree cannot carry both patches'
|
|
130
130
|
// content right now): the equivalent re-export choreography, in
|
|
131
|
-
//
|
|
131
|
+
// executable order. The shrink must land before the grow, or the
|
|
132
132
|
// projected cross-patch lint refuses the pair with
|
|
133
133
|
// duplicate-new-file-creation.
|
|
134
134
|
const applySource = formatReExportCommand(source.filename, sourceAfter, [
|
|
@@ -10,7 +10,7 @@ import type { ProjectPaths } from '../../types/config.js';
|
|
|
10
10
|
export interface PatchQueueContext {
|
|
11
11
|
/** Project paths resolved from the project root. */
|
|
12
12
|
paths: ProjectPaths;
|
|
13
|
-
/** The loaded manifest
|
|
13
|
+
/** The loaded manifest, guaranteed to contain at least one patch. */
|
|
14
14
|
manifest: PatchesManifest;
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `fireforge patch rename <name
|
|
2
|
+
* `fireforge patch rename <name>`: relabels a patch's filename, manifest
|
|
3
3
|
* `name`, and (optionally) `description` without rewriting the `.patch` file
|
|
4
4
|
* body.
|
|
5
5
|
*
|
|
6
6
|
* Companion to `re-export --files <subset>`. Re-export shrinks the body and
|
|
7
7
|
* `filesAffected` but leaves the patch's identity describing the pre-shrink
|
|
8
8
|
* scope. The only alternative for that drift is `delete` + re-export, which
|
|
9
|
-
* briefly removes the patch from the queue
|
|
10
|
-
* then refuses the re-export until the deleted patch's siblings
|
|
11
|
-
* rewritten.
|
|
9
|
+
* briefly removes the patch from the queue, and any forward-import
|
|
10
|
+
* dependent then refuses the re-export until the deleted patch's siblings
|
|
11
|
+
* are rewritten.
|
|
12
12
|
*
|
|
13
13
|
* The filename rename and the manifest mutation happen under the patch
|
|
14
14
|
* directory lock so concurrent exports cannot allocate the new filename, and
|