@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
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* `fireforge patch rename <name
|
|
3
|
+
* `fireforge patch rename <name>`: relabels a patch's filename, manifest
|
|
4
4
|
* `name`, and (optionally) `description` without rewriting the `.patch` file
|
|
5
5
|
* body.
|
|
6
6
|
*
|
|
7
7
|
* Companion to `re-export --files <subset>`. Re-export shrinks the body and
|
|
8
8
|
* `filesAffected` but leaves the patch's identity describing the pre-shrink
|
|
9
9
|
* scope. The only alternative for that drift is `delete` + re-export, which
|
|
10
|
-
* briefly removes the patch from the queue
|
|
11
|
-
* then refuses the re-export until the deleted patch's siblings
|
|
12
|
-
* rewritten.
|
|
10
|
+
* briefly removes the patch from the queue, and any forward-import
|
|
11
|
+
* dependent then refuses the re-export until the deleted patch's siblings
|
|
12
|
+
* are rewritten.
|
|
13
13
|
*
|
|
14
14
|
* The filename rename and the manifest mutation happen under the patch
|
|
15
15
|
* directory lock so concurrent exports cannot allocate the new filename, and
|
|
@@ -19,7 +19,8 @@ import { rename as fsRename } from 'node:fs/promises';
|
|
|
19
19
|
import { join } from 'node:path';
|
|
20
20
|
import { Command } from 'commander';
|
|
21
21
|
import { loadConfig } from '../../core/config.js';
|
|
22
|
-
import {
|
|
22
|
+
import { confirmDestructive } from '../../core/destructive.js';
|
|
23
|
+
import { appendHistoryBestEffort } from '../../core/history-log.js';
|
|
23
24
|
import { patchNameSlug } from '../../core/patch-export.js';
|
|
24
25
|
import { buildPatchQueueContext, formatPatchLintIssue, lintPatchQueue, } from '../../core/patch-lint.js';
|
|
25
26
|
import { withPatchDirectoryLock } from '../../core/patch-lock.js';
|
|
@@ -30,6 +31,8 @@ import { toError } from '../../utils/errors.js';
|
|
|
30
31
|
import { pathExists } from '../../utils/fs.js';
|
|
31
32
|
import { info, intro, outro, warn } from '../../utils/logger.js';
|
|
32
33
|
import { addWaitLockOption, commanderArgParser, pickDefined, resolveWaitLockSeconds, } from '../../utils/options.js';
|
|
34
|
+
import { parsePositiveIntegerFlag } from '../../utils/validation.js';
|
|
35
|
+
import { proceedAfterDecision } from '../destructive-decision.js';
|
|
33
36
|
import { requirePatchQueue, requirePatchTarget } from './patch-context.js';
|
|
34
37
|
import { projectReorder } from './reorder.js';
|
|
35
38
|
/**
|
|
@@ -51,7 +54,7 @@ function splitPatchFilename(filename) {
|
|
|
51
54
|
* renames the `.patch` file on disk (when applicable), writes the
|
|
52
55
|
* updated manifest, and appends a history entry. Filesystem rename
|
|
53
56
|
* happens before the manifest save so an interrupted run never leaves
|
|
54
|
-
* the manifest pointing at a missing file
|
|
57
|
+
* the manifest pointing at a missing file. A manifest-save failure
|
|
55
58
|
* rolls the filesystem rename back.
|
|
56
59
|
*/
|
|
57
60
|
async function commitRenameUnderLock(input) {
|
|
@@ -76,7 +79,7 @@ async function commitRenameUnderLock(input) {
|
|
|
76
79
|
if (orderChanging && input.newOrder !== undefined) {
|
|
77
80
|
const orderHolder = fresh.patches.find((p) => p.order === input.newOrder && p.filename !== target.filename);
|
|
78
81
|
if (orderHolder) {
|
|
79
|
-
throw new InvalidArgumentError(`Order ${
|
|
82
|
+
throw new InvalidArgumentError(`Order ${input.newOrder} was claimed by ${orderHolder.filename} concurrently. Pick an unused order, or use "fireforge patch reorder" to renumber siblings.`, '--order');
|
|
80
83
|
}
|
|
81
84
|
}
|
|
82
85
|
let oldPath;
|
|
@@ -99,7 +102,7 @@ async function commitRenameUnderLock(input) {
|
|
|
99
102
|
...(descriptionChanging ? { description: newDescription ?? '' } : {}),
|
|
100
103
|
};
|
|
101
104
|
// Staged-dependency owners on other patches reference the old
|
|
102
|
-
// filename
|
|
105
|
+
// filename. Remap them so forward-import declarations survive the
|
|
103
106
|
// rename instead of dangling.
|
|
104
107
|
const ownerLookup = (old) => old === target.filename ? newFilename : undefined;
|
|
105
108
|
fresh.patches = fresh.patches.map((p) => rewriteStagedDependencyOwners(p, ownerLookup));
|
|
@@ -136,28 +139,23 @@ async function commitRenameUnderLock(input) {
|
|
|
136
139
|
else {
|
|
137
140
|
await savePatchesManifest(patchesDir, fresh);
|
|
138
141
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
catch (historyError) {
|
|
159
|
-
warn(`History log append failed after patch rename committed (${newFilename}): ${toError(historyError).message}`);
|
|
160
|
-
}
|
|
142
|
+
await appendHistoryBestEffort(patchesDir, {
|
|
143
|
+
operation: 'patch-rename',
|
|
144
|
+
args: {
|
|
145
|
+
oldFilename: target.filename,
|
|
146
|
+
newFilename,
|
|
147
|
+
oldName: target.name,
|
|
148
|
+
newName,
|
|
149
|
+
...(descriptionChanging ? { oldDescription: target.description, newDescription } : {}),
|
|
150
|
+
...(orderChanging ? { oldOrder: target.order, newOrder: input.newOrder } : {}),
|
|
151
|
+
...(categoryChanging
|
|
152
|
+
? { oldCategory: target.category, newCategory: input.newCategory }
|
|
153
|
+
: {}),
|
|
154
|
+
},
|
|
155
|
+
...(input.yes === true ? { yes: true } : {}),
|
|
156
|
+
...(input.forceUnsafe === true ? { unsafeOverride: true } : {}),
|
|
157
|
+
result: 'ok',
|
|
158
|
+
}, `patch rename committed (${newFilename})`);
|
|
161
159
|
}, { waitLockSeconds: input.waitLockSeconds, command: 'patch rename' });
|
|
162
160
|
}
|
|
163
161
|
/** Validates the flags and resolves the new filename/identity fields. */
|
|
@@ -184,7 +182,7 @@ function resolveRenamePlan(target, options, config) {
|
|
|
184
182
|
if (newSlug === '') {
|
|
185
183
|
throw new InvalidArgumentError('--to must contain at least one alphanumeric character after sanitisation.', 'patch rename');
|
|
186
184
|
}
|
|
187
|
-
// Preserve the ordinal's zero-padding width
|
|
185
|
+
// Preserve the ordinal's zero-padding width. A wider order simply
|
|
188
186
|
// prints unpadded-longer.
|
|
189
187
|
const newOrdinalStr = options.order !== undefined
|
|
190
188
|
? String(options.order).padStart(split.ordinalStr.length, '0')
|
|
@@ -205,7 +203,7 @@ function resolveRenamePlan(target, options, config) {
|
|
|
205
203
|
}
|
|
206
204
|
/**
|
|
207
205
|
* Pre-flight refusals: order collision (with a pointer to the verb that
|
|
208
|
-
* renumbers siblings
|
|
206
|
+
* renumbers siblings, and `--order` means "this exact unused sparse slot",
|
|
209
207
|
* mirroring `export --order`), projected cross-patch lint on an order
|
|
210
208
|
* change (forward imports resolve by queue position), and the
|
|
211
209
|
* filename collision. The authoritative collision checks run again inside
|
|
@@ -215,14 +213,14 @@ async function assertRenamePreconditions(patchesDir, manifest, target, plan, opt
|
|
|
215
213
|
if (plan.orderChanging && options.order !== undefined) {
|
|
216
214
|
const holder = manifest.patches.find((p) => p.order === options.order && p.filename !== target.filename);
|
|
217
215
|
if (holder) {
|
|
218
|
-
throw new InvalidArgumentError(`Order ${
|
|
216
|
+
throw new InvalidArgumentError(`Order ${options.order} is already used by ${holder.filename}. Pick an unused order, or use "fireforge patch reorder ${target.filename} --to ${options.order}" to renumber siblings.`, '--order');
|
|
219
217
|
}
|
|
220
218
|
if (options.forceUnsafe !== true) {
|
|
221
219
|
const baseCtx = await buildPatchQueueContext(patchesDir, config);
|
|
222
220
|
const projected = projectReorder(baseCtx, new Map([[target.filename, { newFilename: plan.newFilename, newOrder: options.order }]]));
|
|
223
221
|
const projectedErrors = lintPatchQueue(projected).filter((i) => i.severity === 'error');
|
|
224
222
|
if (projectedErrors.length > 0) {
|
|
225
|
-
throw new InvalidArgumentError(`Refusing to run patch rename: the order change would introduce ${
|
|
223
|
+
throw new InvalidArgumentError(`Refusing to run patch rename: the order change would introduce ${projectedErrors.length} cross-patch lint error(s):\n ${projectedErrors
|
|
226
224
|
.map(formatPatchLintIssue)
|
|
227
225
|
.join('\n ')}\nPass --force-unsafe to override.`, '--force-unsafe');
|
|
228
226
|
}
|
|
@@ -248,7 +246,7 @@ function buildRenameSummary(target, plan, options) {
|
|
|
248
246
|
summary.push(`description: "${target.description || '(none)'}" → "${options.description ?? '(none)'}"`);
|
|
249
247
|
}
|
|
250
248
|
if (plan.orderChanging && options.order !== undefined) {
|
|
251
|
-
summary.push(`order: ${
|
|
249
|
+
summary.push(`order: ${target.order} → ${options.order}`);
|
|
252
250
|
}
|
|
253
251
|
if (plan.categoryChanging) {
|
|
254
252
|
summary.push(`category: ${target.category} → ${plan.newCategory}`);
|
|
@@ -309,14 +307,8 @@ export async function patchRenameCommand(projectRoot, identifier, options = {})
|
|
|
309
307
|
dryRun: isDryRun,
|
|
310
308
|
conflicts: null,
|
|
311
309
|
});
|
|
312
|
-
if (decision
|
|
313
|
-
outro('Dry run complete — no changes made');
|
|
314
|
-
return;
|
|
315
|
-
}
|
|
316
|
-
if (decision === 'declined') {
|
|
317
|
-
outro('Rename cancelled');
|
|
310
|
+
if (!proceedAfterDecision(decision, 'Rename cancelled'))
|
|
318
311
|
return;
|
|
319
|
-
}
|
|
320
312
|
await commitRenameUnderLock({
|
|
321
313
|
patchesDir: paths.patches,
|
|
322
314
|
target,
|
|
@@ -356,13 +348,7 @@ export function registerPatchRename(parent, context) {
|
|
|
356
348
|
.description('Rename a patch: filename, manifest name, category, order, and/or description update in one transaction without rewriting the .patch body.')
|
|
357
349
|
.option('--to <new-name>', 'New human-readable name, category-prefixed slug, or full filename stem (normalised into the filename slug)')
|
|
358
350
|
.option('--category <category>', 'New category for the patch (validated against configured categories); rewrites the filename prefix and manifest row in one transaction')
|
|
359
|
-
.option('--order <n>', 'Move the patch to this exact unused order; refuses on collision — use "patch reorder" to renumber siblings', commanderArgParser((raw) =>
|
|
360
|
-
const n = Number.parseInt(raw, 10);
|
|
361
|
-
if (!Number.isInteger(n) || n <= 0) {
|
|
362
|
-
throw new InvalidArgumentError(`--order must be a positive integer, got "${raw}".`, '--order');
|
|
363
|
-
}
|
|
364
|
-
return n;
|
|
365
|
-
}))
|
|
351
|
+
.option('--order <n>', 'Move the patch to this exact unused order; refuses on collision — use "patch reorder" to renumber siblings', commanderArgParser((raw) => parsePositiveIntegerFlag('--order', raw)))
|
|
366
352
|
.option('-d, --description <text>', 'Replacement description (omit to leave description unchanged)')
|
|
367
353
|
.option('--dry-run', 'Show what would change without writing')
|
|
368
354
|
.option('-y, --yes', 'Skip confirmation prompt (required for non-TTY)')
|
|
@@ -10,16 +10,18 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { Command, Option } from 'commander';
|
|
12
12
|
import { loadConfig } from '../../core/config.js';
|
|
13
|
-
import {
|
|
13
|
+
import { confirmDestructive, } from '../../core/destructive.js';
|
|
14
|
+
import { appendHistoryBestEffort } from '../../core/history-log.js';
|
|
14
15
|
import { buildPatchQueueContext, formatPatchLintIssue, lintPatchQueue, } from '../../core/patch-lint.js';
|
|
15
16
|
import { withPatchDirectoryLock } from '../../core/patch-lock.js';
|
|
16
17
|
import { loadPatchesManifest, renumberPatchesInManifest, resolvePatchIdentifier, rewriteStagedDependencyOwners, } from '../../core/patch-manifest.js';
|
|
17
18
|
import { applyRenameMapToManifest, enforcePatchPolicy } from '../../core/patch-policy.js';
|
|
18
19
|
import { GeneralError, InvalidArgumentError } from '../../errors/base.js';
|
|
19
|
-
import {
|
|
20
|
-
import { info, intro, outro, warn } from '../../utils/logger.js';
|
|
20
|
+
import { info, intro, outro } from '../../utils/logger.js';
|
|
21
21
|
import { addWaitLockOption, commanderArgParser, pickDefined, resolveWaitLockSeconds, } from '../../utils/options.js';
|
|
22
22
|
import { parsePositiveIntegerFlag } from '../../utils/validation.js';
|
|
23
|
+
import { proceedAfterDecision } from '../destructive-decision.js';
|
|
24
|
+
import { getSortedRenameEntries, renameMapsEqual } from '../patch-rename-map.js';
|
|
23
25
|
import { requirePatchQueue, requirePatchTarget } from './patch-context.js';
|
|
24
26
|
/** Zero-pads an ordinal number to the given width. */
|
|
25
27
|
function padOrder(value, width) {
|
|
@@ -39,10 +41,10 @@ export function rebuildFilenameForOrder(existing, newOrder) {
|
|
|
39
41
|
* blocks the destination slot is renumbered, so intentional gaps left by
|
|
40
42
|
* prior `patch delete` calls survive the reorder.
|
|
41
43
|
*
|
|
42
|
-
* Algorithm: remove target from the sorted list, then cascade
|
|
43
|
-
* patch sits at the destination order, bump it to order+1
|
|
44
|
-
* collides with the next patch, bump that one too
|
|
45
|
-
* slot is reached. The direction is symmetric
|
|
44
|
+
* Algorithm: remove target from the sorted list, then cascade. If any
|
|
45
|
+
* patch sits at the destination order, bump it to order+1. If that
|
|
46
|
+
* collides with the next patch, bump that one too. Continue until a free
|
|
47
|
+
* slot is reached. The direction is symmetric: moving a patch earlier
|
|
46
48
|
* and moving it later both reduce to "find a free slot at destination by
|
|
47
49
|
* shifting the contiguous conflicting run upward".
|
|
48
50
|
*/
|
|
@@ -60,7 +62,7 @@ function computeRenameMap(manifestPatches, target, destinationOrder) {
|
|
|
60
62
|
if (clampedDest === target.order)
|
|
61
63
|
return renames;
|
|
62
64
|
// Build a mutable order-for-each map so cascading bumps compose. Keys are
|
|
63
|
-
// filenames
|
|
65
|
+
// filenames. Values start as current order and get rewritten as bumps
|
|
64
66
|
// propagate. Only patches whose value changes end up in the rename map.
|
|
65
67
|
const currentOrder = new Map();
|
|
66
68
|
for (const patch of withoutTarget)
|
|
@@ -68,7 +70,7 @@ function computeRenameMap(manifestPatches, target, destinationOrder) {
|
|
|
68
70
|
// Cascade from the destination: while any surviving patch occupies the
|
|
69
71
|
// slot we want, bump it to slot+1 and advance. Patches are processed in
|
|
70
72
|
// ascending order so each bump's collision (if any) is with the immediate
|
|
71
|
-
// successor in the sort
|
|
73
|
+
// successor in the sort, so no back-tracking is needed.
|
|
72
74
|
let slot = clampedDest;
|
|
73
75
|
for (const patch of withoutTarget) {
|
|
74
76
|
const order = currentOrder.get(patch.filename);
|
|
@@ -98,25 +100,6 @@ function computeRenameMap(manifestPatches, target, destinationOrder) {
|
|
|
98
100
|
});
|
|
99
101
|
return renames;
|
|
100
102
|
}
|
|
101
|
-
function getSortedRenameEntries(renameMap) {
|
|
102
|
-
return Array.from(renameMap.entries()).sort((a, b) => a[1].newOrder - b[1].newOrder);
|
|
103
|
-
}
|
|
104
|
-
function renameMapsEqual(left, right) {
|
|
105
|
-
const leftEntries = getSortedRenameEntries(left);
|
|
106
|
-
const rightEntries = getSortedRenameEntries(right);
|
|
107
|
-
if (leftEntries.length !== rightEntries.length) {
|
|
108
|
-
return false;
|
|
109
|
-
}
|
|
110
|
-
return leftEntries.every(([leftFilename, leftEntry], index) => {
|
|
111
|
-
const rightTuple = rightEntries[index];
|
|
112
|
-
if (!rightTuple)
|
|
113
|
-
return false;
|
|
114
|
-
const [rightFilename, rightEntry] = rightTuple;
|
|
115
|
-
return (leftFilename === rightFilename &&
|
|
116
|
-
leftEntry.newFilename === rightEntry.newFilename &&
|
|
117
|
-
leftEntry.newOrder === rightEntry.newOrder);
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
103
|
/**
|
|
121
104
|
* Applies a rename map to a {@link PatchQueueContext} so cross-patch lint
|
|
122
105
|
* can run against the projected state without touching disk. Exported for
|
|
@@ -126,7 +109,7 @@ export function projectReorder(base, renameMap) {
|
|
|
126
109
|
const ownerLookup = (oldFilename) => renameMap.get(oldFilename)?.newFilename;
|
|
127
110
|
const projectedEntries = base.entries.map((entry) => {
|
|
128
111
|
// Project staged-dependency owner references through the rename map on
|
|
129
|
-
// every entry
|
|
112
|
+
// every entry. Owners point at other patches' filenames, so a
|
|
130
113
|
// projection that skips non-renamed entries would lint against stale
|
|
131
114
|
// owners and report false forward-import regressions.
|
|
132
115
|
const metadata = entry.metadata
|
|
@@ -159,7 +142,7 @@ function resolveDestination(target, manifestPatches, options) {
|
|
|
159
142
|
// integers, but the function is reachable from tests that may pass
|
|
160
143
|
// `{ to: NaN }` directly.
|
|
161
144
|
if (!Number.isInteger(options.to) || options.to <= 0) {
|
|
162
|
-
throw new InvalidArgumentError(`--to must be a positive integer, got ${
|
|
145
|
+
throw new InvalidArgumentError(`--to must be a positive integer, got ${options.to}.`, '--to');
|
|
163
146
|
}
|
|
164
147
|
return { destinationOrder: options.to, anchorFilename: undefined };
|
|
165
148
|
}
|
|
@@ -169,7 +152,7 @@ function resolveDestination(target, manifestPatches, options) {
|
|
|
169
152
|
throw new InvalidArgumentError(`--before anchor "${options.before}" not found.`, '--before');
|
|
170
153
|
}
|
|
171
154
|
// Reject self-reference. `--before <target>` resolves to the target's
|
|
172
|
-
// current order, so computeRenameMap would take its no-op branch
|
|
155
|
+
// current order, so computeRenameMap would take its no-op branch, but
|
|
173
156
|
// that masks a user-facing typo or scripted mistake instead of
|
|
174
157
|
// surfacing it. The symmetric `--after` case is worse (mutates the
|
|
175
158
|
// queue), so both reject for consistency.
|
|
@@ -195,7 +178,14 @@ function resolveDestination(target, manifestPatches, options) {
|
|
|
195
178
|
}
|
|
196
179
|
return { destinationOrder: anchor.order + 1, anchorFilename: anchor.filename };
|
|
197
180
|
}
|
|
198
|
-
|
|
181
|
+
/**
|
|
182
|
+
* Re-validates the reorder against the freshly-loaded manifest and commits
|
|
183
|
+
* it, all under the patch directory lock.
|
|
184
|
+
*
|
|
185
|
+
* @param commitOptions - See {@link CommitReorderPlanOptions}
|
|
186
|
+
*/
|
|
187
|
+
async function commitReorderPlan(commitOptions) {
|
|
188
|
+
const { patchesDir, target, renameMap, anchorFilename, options, config, buildHistoryEntry } = commitOptions;
|
|
199
189
|
await withPatchDirectoryLock(patchesDir, async () => {
|
|
200
190
|
const currentManifest = await loadPatchesManifest(patchesDir);
|
|
201
191
|
if (!currentManifest || currentManifest.patches.length === 0) {
|
|
@@ -248,12 +238,7 @@ async function commitReorderPlan(patchesDir, target, renameMap, anchorFilename,
|
|
|
248
238
|
// permissions) is warned but not re-thrown: the mutation has already
|
|
249
239
|
// succeeded and is not reversible, so surfacing it as a command
|
|
250
240
|
// failure would mislead.
|
|
251
|
-
|
|
252
|
-
await appendHistory(patchesDir, buildHistoryEntry(currentRenameMap));
|
|
253
|
-
}
|
|
254
|
-
catch (historyError) {
|
|
255
|
-
warn(`History log append failed after patch reorder committed: ${toError(historyError).message}`);
|
|
256
|
-
}
|
|
241
|
+
await appendHistoryBestEffort(patchesDir, buildHistoryEntry(currentRenameMap), `patch reorder committed`);
|
|
257
242
|
}, { waitLockSeconds: resolveWaitLockSeconds(options.waitLock), command: 'patch reorder' });
|
|
258
243
|
}
|
|
259
244
|
/**
|
|
@@ -290,7 +275,7 @@ export async function patchReorderCommand(projectRoot, identifier, options = {})
|
|
|
290
275
|
return;
|
|
291
276
|
}
|
|
292
277
|
// Project the reorder through cross-patch lint. Forward-import violations
|
|
293
|
-
// that
|
|
278
|
+
// that the reorder itself introduces become hard refusals.
|
|
294
279
|
const baseCtx = await buildPatchQueueContext(paths.patches);
|
|
295
280
|
const projected = projectReorder(baseCtx, renameMap);
|
|
296
281
|
const projectedIssues = lintPatchQueue(projected);
|
|
@@ -329,16 +314,10 @@ export async function patchReorderCommand(projectRoot, identifier, options = {})
|
|
|
329
314
|
unsafeOverride: options.forceUnsafe === true,
|
|
330
315
|
conflicts,
|
|
331
316
|
});
|
|
332
|
-
if (decision
|
|
333
|
-
outro('Dry run complete — no changes made');
|
|
334
|
-
return;
|
|
335
|
-
}
|
|
336
|
-
if (decision === 'declined') {
|
|
337
|
-
outro('Reorder cancelled');
|
|
317
|
+
if (!proceedAfterDecision(decision, 'Reorder cancelled'))
|
|
338
318
|
return;
|
|
339
|
-
}
|
|
340
319
|
// The history entry is built inside commitReorderPlan (still under the
|
|
341
|
-
// lock) from the
|
|
320
|
+
// lock) from the final rename map rather than the pre-confirmation one, so
|
|
342
321
|
// the destinationOrder and renames mirror what actually landed on disk.
|
|
343
322
|
const buildHistoryEntry = (finalRenameMap) => {
|
|
344
323
|
const finalEntries = getSortedRenameEntries(finalRenameMap);
|
|
@@ -359,7 +338,15 @@ export async function patchReorderCommand(projectRoot, identifier, options = {})
|
|
|
359
338
|
result: 'ok',
|
|
360
339
|
};
|
|
361
340
|
};
|
|
362
|
-
await commitReorderPlan(
|
|
341
|
+
await commitReorderPlan({
|
|
342
|
+
patchesDir: paths.patches,
|
|
343
|
+
target,
|
|
344
|
+
renameMap,
|
|
345
|
+
anchorFilename,
|
|
346
|
+
options,
|
|
347
|
+
config,
|
|
348
|
+
buildHistoryEntry,
|
|
349
|
+
});
|
|
363
350
|
info(`Reordered ${renameMap.size} patch(es).`);
|
|
364
351
|
outro('Reorder complete');
|
|
365
352
|
}
|
|
@@ -3,13 +3,12 @@
|
|
|
3
3
|
* construction from the worktree, staged-dependency owner-rewrite
|
|
4
4
|
* discovery, cross-patch lint projection, and policy-manifest projection.
|
|
5
5
|
* Split out of `split.ts` to keep both files within the per-file line
|
|
6
|
-
* budget
|
|
6
|
+
* budget. It is consumed only by the split command.
|
|
7
7
|
*/
|
|
8
8
|
import { type ConflictReport } from '../../core/destructive.js';
|
|
9
|
-
import {
|
|
10
|
-
import { buildProjectedManifest } from '../../core/patch-policy.js';
|
|
9
|
+
import type { PatchQueueContext } from '../../core/patch-lint-cross.js';
|
|
11
10
|
import type { PatchStagedForwardImport } from '../../types/commands/index.js';
|
|
12
|
-
import type { PatchCategory, PatchMetadata } from '../../types/commands/index.js';
|
|
11
|
+
import type { PatchCategory, PatchesManifest, PatchMetadata } from '../../types/commands/index.js';
|
|
13
12
|
import type { FireForgeConfig } from '../../types/config.js';
|
|
14
13
|
import { type PlacementPlan } from '../export-flow.js';
|
|
15
14
|
/** Everything the commit step needs, computed and confirmed up front. */
|
|
@@ -34,7 +33,7 @@ export interface SplitPlan {
|
|
|
34
33
|
/**
|
|
35
34
|
* Staged forward-import declarations the split introduces, keyed by the
|
|
36
35
|
* importing patch's post-rename filename. These are the new forward edges
|
|
37
|
-
* from existing patches into the freshly-created patch (owner known)
|
|
36
|
+
* from existing patches into the freshly-created patch (owner known). They
|
|
38
37
|
* are injected into the projected lint so dry-run matches the real gate,
|
|
39
38
|
* and persisted on commit so the real per-patch gate stays clean.
|
|
40
39
|
*/
|
|
@@ -68,7 +67,7 @@ export declare function mergeStagedForwardImports(patch: PatchMetadata, decls: r
|
|
|
68
67
|
* patch are auto-declared (and the declarations returned) so the projection
|
|
69
68
|
* matches the real per-patch gate the split leaves behind.
|
|
70
69
|
*/
|
|
71
|
-
export declare function runProjectedSplitLint(plan: SplitPlan, baseCtx:
|
|
70
|
+
export declare function runProjectedSplitLint(plan: SplitPlan, baseCtx: PatchQueueContext): {
|
|
72
71
|
conflicts: ConflictReport | null;
|
|
73
72
|
stagedDependencyAdditions: Map<string, PatchStagedForwardImport[]>;
|
|
74
73
|
};
|
|
@@ -76,14 +75,14 @@ export declare function runProjectedSplitLint(plan: SplitPlan, baseCtx: Awaited<
|
|
|
76
75
|
export declare function projectSplitManifest(manifest: {
|
|
77
76
|
version: 1;
|
|
78
77
|
patches: PatchMetadata[];
|
|
79
|
-
}, plan: SplitPlan, newMetadata: PatchMetadata):
|
|
78
|
+
}, plan: SplitPlan, newMetadata: PatchMetadata): PatchesManifest;
|
|
80
79
|
/**
|
|
81
80
|
* Builds the manifest row for the patch created by a split, carrying the
|
|
82
81
|
* source's provenance (product, version, category) onto the new patch.
|
|
83
82
|
*/
|
|
84
83
|
export declare function buildNewPatchMetadata(plan: SplitPlan, config: FireForgeConfig): PatchMetadata;
|
|
85
84
|
/**
|
|
86
|
-
* Renders the operator-facing summary lines for a planned split
|
|
85
|
+
* Renders the operator-facing summary lines for a planned split: the text
|
|
87
86
|
* shown by `--dry-run` and by the destructive-operation confirmation prompt.
|
|
88
87
|
*/
|
|
89
88
|
export declare function buildSplitSummary(plan: SplitPlan): string[];
|
|
@@ -4,22 +4,22 @@
|
|
|
4
4
|
* construction from the worktree, staged-dependency owner-rewrite
|
|
5
5
|
* discovery, cross-patch lint projection, and policy-manifest projection.
|
|
6
6
|
* Split out of `split.ts` to keep both files within the per-file line
|
|
7
|
-
* budget
|
|
7
|
+
* budget. It is consumed only by the split command.
|
|
8
8
|
*/
|
|
9
9
|
import { join } from 'node:path';
|
|
10
10
|
import {} from '../../core/destructive.js';
|
|
11
11
|
import { getDiffForFilesAgainstHead } from '../../core/git-diff.js';
|
|
12
12
|
import { extractAffectedFiles } from '../../core/patch-apply.js';
|
|
13
|
-
import {
|
|
13
|
+
import { collectForwardImportEdges, formatPatchLintIssue, lintPatchQueue, } from '../../core/patch-lint.js';
|
|
14
14
|
import { computeProjectedLintRegressions } from '../../core/patch-lint-projection.js';
|
|
15
15
|
import { rewriteStagedDependencyOwners } from '../../core/patch-manifest.js';
|
|
16
16
|
import { applyRenameMapToManifest, buildProjectedManifest } from '../../core/patch-policy.js';
|
|
17
17
|
import { buildPatchSourceMetadata } from '../../core/patch-source-metadata.js';
|
|
18
|
-
import { buildNewFileTextProjection } from '../../core/patch-transform.js';
|
|
19
18
|
import { GeneralError, InvalidArgumentError } from '../../errors/base.js';
|
|
20
19
|
import { pathExists } from '../../utils/fs.js';
|
|
21
20
|
import { warn } from '../../utils/logger.js';
|
|
22
21
|
import {} from '../export-flow.js';
|
|
22
|
+
import { projectEntryBody } from './entry-projection.js';
|
|
23
23
|
/**
|
|
24
24
|
* Refuses the split unless the source patch currently owns every requested
|
|
25
25
|
* file. Splitting out a file the source does not own would produce a new patch
|
|
@@ -81,10 +81,6 @@ export function rewriteSplitOwners(patch, sourceFilename, movedSet, newFilename)
|
|
|
81
81
|
},
|
|
82
82
|
};
|
|
83
83
|
}
|
|
84
|
-
function buildEntryProjection(diff) {
|
|
85
|
-
const newFiles = buildNewFileTextProjection(diff);
|
|
86
|
-
return { diff, newFiles, modifiedFileAdditions: buildModifiedFileAdditionsFromDiff(diff) };
|
|
87
|
-
}
|
|
88
84
|
/** Builds the projected post-split queue entries (renumber + shrunken source + new patch). */
|
|
89
85
|
function buildProjectedSplitEntries(baseCtx, plan) {
|
|
90
86
|
const movedSet = new Set(plan.movedFiles);
|
|
@@ -101,13 +97,13 @@ function buildProjectedSplitEntries(baseCtx, plan) {
|
|
|
101
97
|
: { ...entry, metadata };
|
|
102
98
|
if (entry.filename !== plan.source.filename)
|
|
103
99
|
return base;
|
|
104
|
-
return { ...base, ...
|
|
100
|
+
return { ...base, ...projectEntryBody(plan.remainingDiff) };
|
|
105
101
|
});
|
|
106
102
|
entries.push({
|
|
107
103
|
filename: plan.placement.newFilename,
|
|
108
104
|
order: plan.placement.insertionOrder,
|
|
109
105
|
metadata: null,
|
|
110
|
-
...
|
|
106
|
+
...projectEntryBody(plan.movedDiff),
|
|
111
107
|
});
|
|
112
108
|
entries.sort((a, b) => a.order - b.order || a.filename.localeCompare(b.filename));
|
|
113
109
|
return entries;
|
|
@@ -115,11 +111,12 @@ function buildProjectedSplitEntries(baseCtx, plan) {
|
|
|
115
111
|
/**
|
|
116
112
|
* Computes the staged forward-import declarations the split introduces:
|
|
117
113
|
* forward edges from existing patches into the freshly-created patch (its
|
|
118
|
-
* `creates` files are the moved files
|
|
119
|
-
* known). Keyed by the importing patch's projected (post-rename)
|
|
114
|
+
* `creates` files are the moved files, and the owner is the new patch, so
|
|
115
|
+
* it is known). Keyed by the importing patch's projected (post-rename)
|
|
116
|
+
* filename.
|
|
120
117
|
*
|
|
121
118
|
* These edges did not exist before the split (importer and imported file
|
|
122
|
-
* lived in the same patch), so they have no declaration yet
|
|
119
|
+
* lived in the same patch), so they have no declaration yet. Without this
|
|
123
120
|
* the projected lint flags them while the real per-patch gate would resolve
|
|
124
121
|
* them once declared. Auto-declaring keeps the two in lock-step and lets a
|
|
125
122
|
* sound split read as sound.
|
|
@@ -237,7 +234,7 @@ export function buildNewPatchMetadata(plan, config) {
|
|
|
237
234
|
};
|
|
238
235
|
}
|
|
239
236
|
/**
|
|
240
|
-
* Renders the operator-facing summary lines for a planned split
|
|
237
|
+
* Renders the operator-facing summary lines for a planned split: the text
|
|
241
238
|
* shown by `--dry-run` and by the destructive-operation confirmation prompt.
|
|
242
239
|
*/
|
|
243
240
|
export function buildSplitSummary(plan) {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `fireforge patch split <source> --files <p...> --name <n>`
|
|
2
|
+
* `fireforge patch split <source> --files <p...> --name <n>` moves files
|
|
3
3
|
* out of an existing patch into a brand-new patch as one transaction.
|
|
4
4
|
*
|
|
5
5
|
* Splitting a patch whose files have inbound forward-imports otherwise
|
|
6
6
|
* requires a precise manual order: re-point each staged-dependency owner at
|
|
7
7
|
* a not-yet-created patch, shrink the source via
|
|
8
|
-
* `re-export --files --allow-shrink`, then `export --order
|
|
8
|
+
* `re-export --files --allow-shrink`, then `export --order`. Any other
|
|
9
9
|
* order refuses or needs `--force-unsafe`. Split performs the shrink, the
|
|
10
10
|
* new-patch creation, and the dependent owner rewrites under one
|
|
11
11
|
* patch-directory lock with rollback, validating only the final projection.
|