@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
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* Environment construction for spawned children.
|
|
3
3
|
*
|
|
4
4
|
* Its own module rather than a helper inside `process.ts` only because that
|
|
5
|
-
* file sits on a 500-line budget
|
|
5
|
+
* file sits on a 500-line budget. The logic belongs to the exec layer.
|
|
6
6
|
*/
|
|
7
7
|
/** The `env` / `envUnset` slice of exec options this module needs. */
|
|
8
|
-
|
|
8
|
+
interface ChildEnvOptions {
|
|
9
9
|
/** Variables to add or overwrite on top of `process.env`. */
|
|
10
10
|
env?: Record<string, string> | undefined;
|
|
11
11
|
/** Variables to remove after the merge. */
|
|
@@ -15,16 +15,17 @@ export interface ChildEnvOptions {
|
|
|
15
15
|
* The child's environment: `process.env`, with `env` merged over it, then
|
|
16
16
|
* every `envUnset` key removed.
|
|
17
17
|
*
|
|
18
|
-
* One helper rather than five inline spreads
|
|
18
|
+
* One helper rather than five inline spreads: the removal step is easy to
|
|
19
19
|
* add at four of the five spawn sites and forget at the fifth, which would
|
|
20
20
|
* make the option silently inert exactly where it was not tested.
|
|
21
21
|
*
|
|
22
|
-
* Removal is a real removal
|
|
23
|
-
* `is_running_under_coding_agent()` reads `CLAUDECODE` for its
|
|
24
|
-
* an empty value would not unset it. `Reflect.deleteProperty` rather than
|
|
22
|
+
* Removal is a real removal rather than an assignment to `''`: mozbuild's
|
|
23
|
+
* `is_running_under_coding_agent()` reads `CLAUDECODE` only for its
|
|
24
|
+
* presence, so an empty value would not unset it. `Reflect.deleteProperty` rather than
|
|
25
25
|
* `delete obj[key]` because the key is computed.
|
|
26
26
|
*
|
|
27
27
|
* @param options - Options carrying `env` / `envUnset`
|
|
28
28
|
* @returns The environment to hand `spawn`
|
|
29
29
|
*/
|
|
30
30
|
export declare function buildChildEnv(options: ChildEnvOptions): NodeJS.ProcessEnv;
|
|
31
|
+
export {};
|
|
@@ -3,19 +3,19 @@
|
|
|
3
3
|
* Environment construction for spawned children.
|
|
4
4
|
*
|
|
5
5
|
* Its own module rather than a helper inside `process.ts` only because that
|
|
6
|
-
* file sits on a 500-line budget
|
|
6
|
+
* file sits on a 500-line budget. The logic belongs to the exec layer.
|
|
7
7
|
*/
|
|
8
8
|
/**
|
|
9
9
|
* The child's environment: `process.env`, with `env` merged over it, then
|
|
10
10
|
* every `envUnset` key removed.
|
|
11
11
|
*
|
|
12
|
-
* One helper rather than five inline spreads
|
|
12
|
+
* One helper rather than five inline spreads: the removal step is easy to
|
|
13
13
|
* add at four of the five spawn sites and forget at the fifth, which would
|
|
14
14
|
* make the option silently inert exactly where it was not tested.
|
|
15
15
|
*
|
|
16
|
-
* Removal is a real removal
|
|
17
|
-
* `is_running_under_coding_agent()` reads `CLAUDECODE` for its
|
|
18
|
-
* an empty value would not unset it. `Reflect.deleteProperty` rather than
|
|
16
|
+
* Removal is a real removal rather than an assignment to `''`: mozbuild's
|
|
17
|
+
* `is_running_under_coding_agent()` reads `CLAUDECODE` only for its
|
|
18
|
+
* presence, so an empty value would not unset it. `Reflect.deleteProperty` rather than
|
|
19
19
|
* `delete obj[key]` because the key is computed.
|
|
20
20
|
*
|
|
21
21
|
* @param options - Options carrying `env` / `envUnset`
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Bounded-concurrency helpers shared by commands that fan out per-file IO
|
|
3
3
|
* (status classification, import's unmanaged-dirty guard, re-export scans,
|
|
4
|
-
* the dry-run purity guard). Kept
|
|
5
|
-
*
|
|
4
|
+
* the dry-run purity guard). Kept tiny: one order-preserving mapper, no
|
|
5
|
+
* queues, no cancellation.
|
|
6
6
|
*/
|
|
7
7
|
/** Maps items with at most `limit` in-flight promises. Preserves order. */
|
|
8
8
|
export declare function mapWithConcurrency<T, R>(items: readonly T[], limit: number, fn: (item: T, index: number) => Promise<R>): Promise<R[]>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Bounded-concurrency helpers shared by commands that fan out per-file IO
|
|
3
3
|
* (status classification, import's unmanaged-dirty guard, re-export scans,
|
|
4
|
-
* the dry-run purity guard). Kept
|
|
5
|
-
*
|
|
4
|
+
* the dry-run purity guard). Kept tiny: one order-preserving mapper, no
|
|
5
|
+
* queues, no cancellation.
|
|
6
6
|
*/
|
|
7
7
|
/** Maps items with at most `limit` in-flight promises. Preserves order. */
|
|
8
8
|
export async function mapWithConcurrency(items, limit, fn) {
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Formats a duration in milliseconds as `Xm Ys`, or `Ys` under a minute.
|
|
4
|
+
*
|
|
5
|
+
* The single spelling of FireForge's elapsed-time wording: `build` and
|
|
6
|
+
* `package` each hand-rolled the same minute/second split, so a change to
|
|
7
|
+
* the format silently applied to some progress lines and not others.
|
|
8
|
+
*
|
|
9
|
+
* @param ms - Duration in milliseconds. Negative input is clamped to zero.
|
|
10
|
+
* @returns The duration as `Xm Ys`, or `Ys` when under one minute.
|
|
11
|
+
*/
|
|
3
12
|
function formatElapsed(ms) {
|
|
4
13
|
const totalSeconds = Math.max(0, Math.round(ms / 1000));
|
|
5
14
|
const minutes = Math.floor(totalSeconds / 60);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Throwable normalisation primitives.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* dependency graph
|
|
6
|
-
* `bin/` reach it
|
|
4
|
+
* This module must import nothing. It sits at the very bottom of the
|
|
5
|
+
* dependency graph (81 modules across `core/`, `commands/`, `utils/` and
|
|
6
|
+
* `bin/` reach it), so it is the one place a shared helper can live and be
|
|
7
7
|
* provably cycle-immune. Adding an import here makes that whole subtree
|
|
8
8
|
* reachable from every util, and any future `src/errors/*` module wanting a
|
|
9
9
|
* util back (`errors/git.ts` already carries a mirrored index-lock heuristic
|
|
@@ -17,18 +17,18 @@ export declare function toError(error: unknown): Error;
|
|
|
17
17
|
* Extracts a Node errno string (`ENOENT`, `EACCES`, `EPERM`, …) from an
|
|
18
18
|
* unknown throwable, or `undefined` when the value carries no string `code`.
|
|
19
19
|
*
|
|
20
|
-
* The check is
|
|
21
|
-
*
|
|
22
|
-
*
|
|
20
|
+
* The check is structural rather than `error instanceof Error`: a plain
|
|
21
|
+
* object carrying `.code` (exactly the shape {@link toError} exists to
|
|
22
|
+
* normalise) reaches errno consumers through rejected promises and
|
|
23
23
|
* cross-realm throws, and an `instanceof Error` gate misclassifies it as "no
|
|
24
24
|
* code".
|
|
25
25
|
*/
|
|
26
26
|
export declare function getNodeErrorCode(error: unknown): string | undefined;
|
|
27
27
|
/**
|
|
28
28
|
* Checks whether a process with the given PID is still running, using
|
|
29
|
-
* `kill(pid, 0)
|
|
29
|
+
* `kill(pid, 0)`: no signal is sent, only the existence check is performed.
|
|
30
30
|
*
|
|
31
|
-
* Only `ESRCH` ("no such process") means dead.
|
|
31
|
+
* Only `ESRCH` ("no such process") means dead. `EPERM` means alive: the
|
|
32
32
|
* process exists but is owned by another uid, which happens routinely with
|
|
33
33
|
* root-owned builds, `sudo`, shared CI runners and container UID mismatches.
|
|
34
34
|
* Reading EPERM as dead in a predicate that gates a recursive delete removes
|
package/dist/src/utils/errors.js
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Throwable normalisation primitives.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* dependency graph
|
|
7
|
-
* `bin/` reach it
|
|
5
|
+
* This module must import nothing. It sits at the very bottom of the
|
|
6
|
+
* dependency graph (81 modules across `core/`, `commands/`, `utils/` and
|
|
7
|
+
* `bin/` reach it), so it is the one place a shared helper can live and be
|
|
8
8
|
* provably cycle-immune. Adding an import here makes that whole subtree
|
|
9
9
|
* reachable from every util, and any future `src/errors/*` module wanting a
|
|
10
10
|
* util back (`errors/git.ts` already carries a mirrored index-lock heuristic
|
|
@@ -29,9 +29,9 @@ export function toError(error) {
|
|
|
29
29
|
* Extracts a Node errno string (`ENOENT`, `EACCES`, `EPERM`, …) from an
|
|
30
30
|
* unknown throwable, or `undefined` when the value carries no string `code`.
|
|
31
31
|
*
|
|
32
|
-
* The check is
|
|
33
|
-
*
|
|
34
|
-
*
|
|
32
|
+
* The check is structural rather than `error instanceof Error`: a plain
|
|
33
|
+
* object carrying `.code` (exactly the shape {@link toError} exists to
|
|
34
|
+
* normalise) reaches errno consumers through rejected promises and
|
|
35
35
|
* cross-realm throws, and an `instanceof Error` gate misclassifies it as "no
|
|
36
36
|
* code".
|
|
37
37
|
*/
|
|
@@ -46,9 +46,9 @@ export function getNodeErrorCode(error) {
|
|
|
46
46
|
}
|
|
47
47
|
/**
|
|
48
48
|
* Checks whether a process with the given PID is still running, using
|
|
49
|
-
* `kill(pid, 0)
|
|
49
|
+
* `kill(pid, 0)`: no signal is sent, only the existence check is performed.
|
|
50
50
|
*
|
|
51
|
-
* Only `ESRCH` ("no such process") means dead.
|
|
51
|
+
* Only `ESRCH` ("no such process") means dead. `EPERM` means alive: the
|
|
52
52
|
* process exists but is owned by another uid, which happens routinely with
|
|
53
53
|
* root-owned builds, `sudo`, shared CI runners and container UID mismatches.
|
|
54
54
|
* Reading EPERM as dead in a predicate that gates a recursive delete removes
|
package/dist/src/utils/fs.d.ts
CHANGED
|
@@ -95,7 +95,7 @@ export declare function copyDir(src: string, dest: string): Promise<void>;
|
|
|
95
95
|
* artefacts out of their listings without racing the rename.
|
|
96
96
|
*
|
|
97
97
|
* Intentionally anchored so a legitimately-named backup file like
|
|
98
|
-
* `.notes.fireforge-tmp-backup` (no PID+UUID continuation) is
|
|
98
|
+
* `.notes.fireforge-tmp-backup` (no PID+UUID continuation) is not treated
|
|
99
99
|
* as one of our temps. The full shape is `.<filename>.fireforge-tmp-<pid>-<uuid>`.
|
|
100
100
|
*/
|
|
101
101
|
export declare const FIREFORGE_TMP_PATH_PATTERN: RegExp;
|
package/dist/src/utils/fs.js
CHANGED
|
@@ -3,13 +3,9 @@ import { randomUUID } from 'node:crypto';
|
|
|
3
3
|
import { access, chmod, copyFile as fsCopyFile, lstat, mkdir, open, readdir, readFile, rename, rm, stat, statfs, } from 'node:fs/promises';
|
|
4
4
|
import { basename, dirname, join } from 'node:path';
|
|
5
5
|
import { getNodeErrorCode } from './errors.js';
|
|
6
|
+
import { sleep } from './sleep.js';
|
|
6
7
|
const RETRIABLE_REMOVE_ERRORS = new Set(['ENOTEMPTY', 'EBUSY', 'EPERM']);
|
|
7
8
|
const RETRIABLE_RENAME_ERRORS = new Set(['EPERM', 'EACCES', 'EBUSY']);
|
|
8
|
-
function sleep(ms) {
|
|
9
|
-
return new Promise((resolve) => {
|
|
10
|
-
setTimeout(resolve, ms);
|
|
11
|
-
});
|
|
12
|
-
}
|
|
13
9
|
/**
|
|
14
10
|
* Checks if a path exists.
|
|
15
11
|
* @param path - Path to check
|
|
@@ -19,8 +15,7 @@ export async function pathExists(path) {
|
|
|
19
15
|
await access(path);
|
|
20
16
|
return true;
|
|
21
17
|
}
|
|
22
|
-
catch
|
|
23
|
-
void error;
|
|
18
|
+
catch {
|
|
24
19
|
return false;
|
|
25
20
|
}
|
|
26
21
|
}
|
|
@@ -92,8 +87,7 @@ export async function isSymlink(path) {
|
|
|
92
87
|
try {
|
|
93
88
|
return (await lstat(path)).isSymbolicLink();
|
|
94
89
|
}
|
|
95
|
-
catch
|
|
96
|
-
void error;
|
|
90
|
+
catch {
|
|
97
91
|
return false;
|
|
98
92
|
}
|
|
99
93
|
}
|
|
@@ -208,9 +202,9 @@ export async function writeFileAtomic(path, content) {
|
|
|
208
202
|
/**
|
|
209
203
|
* Renames the temp file over its destination, retrying transient sharing
|
|
210
204
|
* violations. On Windows, a rename onto a target that another writer is
|
|
211
|
-
* concurrently replacing
|
|
205
|
+
* concurrently replacing (or that an antivirus/indexer briefly holds open)
|
|
212
206
|
* fails with EPERM/EACCES/EBUSY even though the same rename succeeds a moment
|
|
213
|
-
* later
|
|
207
|
+
* later. POSIX renames never hit this. Non-retriable codes and exhausted
|
|
214
208
|
* budgets rethrow, so a genuine permission problem still surfaces.
|
|
215
209
|
*/
|
|
216
210
|
async function renameWithRetries(from, to) {
|
|
@@ -234,15 +228,16 @@ async function syncParentDir(path) {
|
|
|
234
228
|
directoryHandle = await open(dirname(path), 'r');
|
|
235
229
|
await directoryHandle.sync();
|
|
236
230
|
}
|
|
237
|
-
catch
|
|
238
|
-
|
|
231
|
+
catch {
|
|
232
|
+
// Best-effort durability: a directory that cannot be opened or fsynced
|
|
233
|
+
// (network mounts, Windows) must not fail the write it was protecting.
|
|
239
234
|
}
|
|
240
235
|
finally {
|
|
241
236
|
try {
|
|
242
237
|
await directoryHandle?.close();
|
|
243
238
|
}
|
|
244
|
-
catch
|
|
245
|
-
|
|
239
|
+
catch {
|
|
240
|
+
// Nothing left to do. The handle is being discarded either way.
|
|
246
241
|
}
|
|
247
242
|
}
|
|
248
243
|
}
|
|
@@ -277,7 +272,7 @@ export async function copyDir(src, dest) {
|
|
|
277
272
|
* artefacts out of their listings without racing the rename.
|
|
278
273
|
*
|
|
279
274
|
* Intentionally anchored so a legitimately-named backup file like
|
|
280
|
-
* `.notes.fireforge-tmp-backup` (no PID+UUID continuation) is
|
|
275
|
+
* `.notes.fireforge-tmp-backup` (no PID+UUID continuation) is not treated
|
|
281
276
|
* as one of our temps. The full shape is `.<filename>.fireforge-tmp-<pid>-<uuid>`.
|
|
282
277
|
*/
|
|
283
278
|
export const FIREFORGE_TMP_PATH_PATTERN = /(^|\/)\.[^/]+\.fireforge-tmp-\d+-[0-9a-f-]{36}$/i;
|
|
@@ -286,8 +281,8 @@ export const FIREFORGE_TMP_PATH_PATTERN = /(^|\/)\.[^/]+\.fireforge-tmp-\d+-[0-9
|
|
|
286
281
|
*
|
|
287
282
|
* Each invocation gets its own path via PID + UUID, so concurrent writers
|
|
288
283
|
* targeting the same destination never interfere with each other. Cleanup of
|
|
289
|
-
* the temp file is the caller's responsibility on error
|
|
290
|
-
*
|
|
284
|
+
* the temp file is the caller's responsibility on error. We intentionally do
|
|
285
|
+
* not glob-delete peer temp files here to avoid racing with other writers.
|
|
291
286
|
*/
|
|
292
287
|
function createAtomicTempPath(path) {
|
|
293
288
|
const directory = dirname(path);
|
|
@@ -311,7 +306,7 @@ function createAtomicTempPath(path) {
|
|
|
311
306
|
export async function checkDiskSpace(path, minBytes, onLowSpace) {
|
|
312
307
|
try {
|
|
313
308
|
const stats = await statfs(path);
|
|
314
|
-
// bavail = blocks available to UNPRIVILEGED users
|
|
309
|
+
// bavail = blocks available to UNPRIVILEGED users. bfree includes the
|
|
315
310
|
// root-reserved blocks (typically 5% on ext4), so it over-reported free
|
|
316
311
|
// space and silently suppressed the low-space warning exactly when it
|
|
317
312
|
// mattered.
|
|
@@ -326,7 +321,7 @@ export async function checkDiskSpace(path, minBytes, onLowSpace) {
|
|
|
326
321
|
}
|
|
327
322
|
catch {
|
|
328
323
|
// statfs may not be available on all platforms or the path may
|
|
329
|
-
// not exist yet
|
|
324
|
+
// not exist yet, so silently degrade rather than blocking the operation.
|
|
330
325
|
return undefined;
|
|
331
326
|
}
|
|
332
327
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Computes the hexadecimal SHA-256 digest of a string or buffer.
|
|
3
|
+
*
|
|
4
|
+
* Eleven sites across `src/core/` inlined the same
|
|
5
|
+
* `createHash('sha256').update(input).digest('hex')` chain for cache keys,
|
|
6
|
+
* fingerprints and content addresses. They all share this helper instead, so
|
|
7
|
+
* the digest algorithm and encoding are decided in exactly one place.
|
|
8
|
+
*
|
|
9
|
+
* @param input - Data to digest, as a UTF-8 string or a raw buffer.
|
|
10
|
+
* @returns The 64-character lowercase hexadecimal digest.
|
|
11
|
+
*/
|
|
12
|
+
export declare function sha256Hex(input: string | Buffer): string;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
/**
|
|
4
|
+
* Computes the hexadecimal SHA-256 digest of a string or buffer.
|
|
5
|
+
*
|
|
6
|
+
* Eleven sites across `src/core/` inlined the same
|
|
7
|
+
* `createHash('sha256').update(input).digest('hex')` chain for cache keys,
|
|
8
|
+
* fingerprints and content addresses. They all share this helper instead, so
|
|
9
|
+
* the digest algorithm and encoding are decided in exactly one place.
|
|
10
|
+
*
|
|
11
|
+
* @param input - Data to digest, as a UTF-8 string or a raw buffer.
|
|
12
|
+
* @returns The 64-character lowercase hexadecimal digest.
|
|
13
|
+
*/
|
|
14
|
+
export function sha256Hex(input) {
|
|
15
|
+
return createHash('sha256').update(input).digest('hex');
|
|
16
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Line splitting for the smoke-run stream dispatch in `process.ts`. Kept as
|
|
3
|
+
* a sibling so the exec module stays within its size budget. The contract
|
|
4
|
+
* (terminators, partial-line cap) is documented on the function.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Drains complete lines from `buffer`, dispatching each to `cb`. Treats
|
|
8
|
+
* `\n`, `\r\n`, and lone `\r` as line terminators. The lone-`\r` case
|
|
9
|
+
* matters for progress-bar style output (mach, cargo) that repaints a line
|
|
10
|
+
* with carriage returns and never sends a newline, which otherwise
|
|
11
|
+
* accumulates indefinitely. A single trailing `\r` is held back since it may
|
|
12
|
+
* be the first half of a `\r\n` pair split across chunks. Returns the
|
|
13
|
+
* remaining partial line. Callers keep accumulating into it.
|
|
14
|
+
*/
|
|
15
|
+
export declare function dispatchCompleteLines(buffer: string, cb: ((line: string) => void) | undefined): string;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
+
/**
|
|
3
|
+
* Line splitting for the smoke-run stream dispatch in `process.ts`. Kept as
|
|
4
|
+
* a sibling so the exec module stays within its size budget. The contract
|
|
5
|
+
* (terminators, partial-line cap) is documented on the function.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Cap on the partial-line tail kept between chunks. A child emitting one
|
|
9
|
+
* enormous line with no terminator (minified JS dumped to stderr, a raw
|
|
10
|
+
* binary blob) would otherwise grow the buffer without bound: the 50 MB cap
|
|
11
|
+
* guards the collector, not these line buffers. When the tail exceeds the
|
|
12
|
+
* cap it is dispatched as a synthetic (oversized) line so the matchers still
|
|
13
|
+
* see its content, then the buffer resets.
|
|
14
|
+
*/
|
|
15
|
+
const MAX_PARTIAL_LINE_SIZE = 1024 * 1024;
|
|
16
|
+
/**
|
|
17
|
+
* Drains complete lines from `buffer`, dispatching each to `cb`. Treats
|
|
18
|
+
* `\n`, `\r\n`, and lone `\r` as line terminators. The lone-`\r` case
|
|
19
|
+
* matters for progress-bar style output (mach, cargo) that repaints a line
|
|
20
|
+
* with carriage returns and never sends a newline, which otherwise
|
|
21
|
+
* accumulates indefinitely. A single trailing `\r` is held back since it may
|
|
22
|
+
* be the first half of a `\r\n` pair split across chunks. Returns the
|
|
23
|
+
* remaining partial line. Callers keep accumulating into it.
|
|
24
|
+
*/
|
|
25
|
+
export function dispatchCompleteLines(buffer, cb) {
|
|
26
|
+
let searchFrom = 0;
|
|
27
|
+
for (;;) {
|
|
28
|
+
const nl = buffer.indexOf('\n', searchFrom);
|
|
29
|
+
const cr = buffer.indexOf('\r', searchFrom);
|
|
30
|
+
const idx = nl === -1 ? cr : cr === -1 ? nl : Math.min(nl, cr);
|
|
31
|
+
if (idx === -1)
|
|
32
|
+
break;
|
|
33
|
+
if (buffer[idx] === '\r' && idx === buffer.length - 1) {
|
|
34
|
+
// Possible first half of a chunk-split \r\n, so wait for the next chunk.
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
const line = buffer.slice(0, idx);
|
|
38
|
+
const terminatorLength = buffer[idx] === '\r' && buffer[idx + 1] === '\n' ? 2 : 1;
|
|
39
|
+
buffer = buffer.slice(idx + terminatorLength);
|
|
40
|
+
searchFrom = 0;
|
|
41
|
+
cb?.(line);
|
|
42
|
+
}
|
|
43
|
+
if (buffer.length > MAX_PARTIAL_LINE_SIZE) {
|
|
44
|
+
cb?.(buffer);
|
|
45
|
+
return '';
|
|
46
|
+
}
|
|
47
|
+
return buffer;
|
|
48
|
+
}
|
|
@@ -64,9 +64,9 @@ export declare function warn(message: string): void;
|
|
|
64
64
|
export declare const NOTICE_PREFIX = "[FireForge] NOTICE:";
|
|
65
65
|
/**
|
|
66
66
|
* Logs one of FireForge's own "why this is happening / why this is slow"
|
|
67
|
-
* explanations at
|
|
67
|
+
* explanations at warning severity.
|
|
68
68
|
*
|
|
69
|
-
* These lines are not warnings about the operator's code
|
|
69
|
+
* These lines are not warnings about the operator's code. They explain a
|
|
70
70
|
* decision FireForge just made (escalating an incremental build to a full
|
|
71
71
|
* one, sharding a run, skipping a step). Emitted through `info` they are
|
|
72
72
|
* silently dropped by agent-facing output filters that keep only warnings
|
|
@@ -98,10 +98,10 @@ export declare function cancel(message: string): void;
|
|
|
98
98
|
/**
|
|
99
99
|
* Checks whether a prompt result represents a user cancellation.
|
|
100
100
|
*
|
|
101
|
-
* Narrows to `symbol
|
|
101
|
+
* Narrows to `symbol`: clack returns its cancel sentinel as a symbol and
|
|
102
102
|
* `p.isCancel` is itself a type predicate. Returning plain `boolean` erases
|
|
103
103
|
* that narrowing and forces `as string` / `as PatchCategory` casts across
|
|
104
|
-
* the command modules on the
|
|
104
|
+
* the command modules on the non-cancelled branch, where the value is
|
|
105
105
|
* already known not to be the sentinel. Keep the predicate form.
|
|
106
106
|
*/
|
|
107
107
|
export declare function isCancel(value: unknown): value is symbol;
|
package/dist/src/utils/logger.js
CHANGED
|
@@ -6,11 +6,11 @@ let verboseMode = false;
|
|
|
6
6
|
/**
|
|
7
7
|
* Whether machine-output mode is active (`--json` / `--raw`).
|
|
8
8
|
*
|
|
9
|
-
* In machine mode, stdout belongs
|
|
9
|
+
* In machine mode, stdout belongs exclusively to the machine-readable
|
|
10
10
|
* payload: all human-facing diagnostics (intro/outro banners, info, warn,
|
|
11
11
|
* error, steps, notes) are routed to stderr as plain unstyled lines.
|
|
12
|
-
* Otherwise clack's log helpers write styled warnings to stdout
|
|
13
|
-
* JSON body
|
|
12
|
+
* Otherwise clack's log helpers write styled warnings to stdout before the
|
|
13
|
+
* JSON body, and a truncated-directory warning during `status --json` breaks
|
|
14
14
|
* every `JSON.parse(stdout)` consumer.
|
|
15
15
|
*/
|
|
16
16
|
let machineOutputMode = false;
|
|
@@ -35,11 +35,11 @@ export function isMachineOutputMode() {
|
|
|
35
35
|
/**
|
|
36
36
|
* Whether stdout is sealed behind a machine-readable final line.
|
|
37
37
|
*
|
|
38
|
-
* The `FIREFORGE-VERDICT:` contract promises that line as the run's
|
|
39
|
-
* stdout write
|
|
38
|
+
* The `FIREFORGE-VERDICT:` contract promises that line as the run's last
|
|
39
|
+
* stdout write, but emit-then-throw failure paths rethrow into
|
|
40
40
|
* `withErrorHandling`, whose clack error/cancel rendering lands on stdout
|
|
41
41
|
* in non-machine mode, displacing the verdict from the final line. The
|
|
42
|
-
* verdict sink seals stdout the moment it writes
|
|
42
|
+
* verdict sink seals stdout the moment it writes. Every later logger call
|
|
43
43
|
* routes to stderr through the same diagnostic channel machine mode uses.
|
|
44
44
|
* `withErrorHandling`'s finally clears the seal (alongside machine mode).
|
|
45
45
|
*/
|
|
@@ -138,9 +138,9 @@ export function warn(message) {
|
|
|
138
138
|
export const NOTICE_PREFIX = '[FireForge] NOTICE:';
|
|
139
139
|
/**
|
|
140
140
|
* Logs one of FireForge's own "why this is happening / why this is slow"
|
|
141
|
-
* explanations at
|
|
141
|
+
* explanations at warning severity.
|
|
142
142
|
*
|
|
143
|
-
* These lines are not warnings about the operator's code
|
|
143
|
+
* These lines are not warnings about the operator's code. They explain a
|
|
144
144
|
* decision FireForge just made (escalating an incremental build to a full
|
|
145
145
|
* one, sharding a run, skipping a step). Emitted through `info` they are
|
|
146
146
|
* silently dropped by agent-facing output filters that keep only warnings
|
|
@@ -196,7 +196,7 @@ export function formatErrorText(message) {
|
|
|
196
196
|
*/
|
|
197
197
|
export function spinner(initialMessage) {
|
|
198
198
|
if (routeToStderr()) {
|
|
199
|
-
// Spinner progress is diagnostics
|
|
199
|
+
// Spinner progress is diagnostics. Keep stdout clean for the payload.
|
|
200
200
|
return {
|
|
201
201
|
message: (msg) => {
|
|
202
202
|
writeDiagnostic('', msg);
|
|
@@ -251,10 +251,10 @@ export function cancel(message) {
|
|
|
251
251
|
/**
|
|
252
252
|
* Checks whether a prompt result represents a user cancellation.
|
|
253
253
|
*
|
|
254
|
-
* Narrows to `symbol
|
|
254
|
+
* Narrows to `symbol`: clack returns its cancel sentinel as a symbol and
|
|
255
255
|
* `p.isCancel` is itself a type predicate. Returning plain `boolean` erases
|
|
256
256
|
* that narrowing and forces `as string` / `as PatchCategory` casts across
|
|
257
|
-
* the command modules on the
|
|
257
|
+
* the command modules on the non-cancelled branch, where the value is
|
|
258
258
|
* already known not to be the sentinel. Keep the predicate form.
|
|
259
259
|
*/
|
|
260
260
|
export function isCancel(value) {
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
* 1. Success writes exactly one JSON document to stdout.
|
|
12
12
|
* 2. Failure writes exactly one `{ schemaVersion, error, code }` document
|
|
13
13
|
* to stdout, then exits non-zero.
|
|
14
|
-
* 3. Machine mode is engaged
|
|
15
|
-
* including one rendered later by `withErrorHandling
|
|
14
|
+
* 3. Machine mode is engaged before any output, so every diagnostic,
|
|
15
|
+
* including one rendered later by `withErrorHandling`, routes to
|
|
16
16
|
* stderr and cannot corrupt the payload.
|
|
17
17
|
*/
|
|
18
18
|
import { CommandError } from '../errors/base.js';
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
1
2
|
/**
|
|
2
3
|
* Filters an object to only include keys whose values are not undefined.
|
|
3
|
-
* Designed for use with exactOptionalPropertyTypes
|
|
4
|
+
* Designed for use with exactOptionalPropertyTypes: the result can be
|
|
4
5
|
* spread into typed option objects without assigning undefined to optional
|
|
5
6
|
* properties.
|
|
6
7
|
*
|
|
7
8
|
* Constrained to `object`, not `Record<string, unknown>`: a named interface
|
|
8
9
|
* has no index signature, so the narrower constraint rejects exactly the
|
|
9
10
|
* annotations this helper is most useful with. Nothing in the body needs the
|
|
10
|
-
* index signature
|
|
11
|
+
* index signature, since the key walk goes through `Object.keys`.
|
|
11
12
|
*
|
|
12
13
|
* @param obj - Object to filter
|
|
13
14
|
* @returns The same object with every `undefined`-valued key removed
|
|
@@ -15,13 +16,12 @@
|
|
|
15
16
|
export declare function pickDefined<T extends object>(obj: T): {
|
|
16
17
|
[K in keyof T]+?: Exclude<T[K], undefined>;
|
|
17
18
|
};
|
|
18
|
-
import type { Command } from 'commander';
|
|
19
19
|
/**
|
|
20
20
|
* Wraps an option-argument parser so its failures surface through
|
|
21
21
|
* commander's own invalid-argument channel.
|
|
22
22
|
*
|
|
23
23
|
* Commander only treats errors whose `code` is `'commander.invalidArgument'`
|
|
24
|
-
* as argument-validation failures
|
|
24
|
+
* as argument-validation failures. Anything else re-throws out of
|
|
25
25
|
* `parseAsync`, BYPASSING `withErrorHandling` entirely and landing in the
|
|
26
26
|
* bin's `main().catch` as an unformatted `Fatal error: …` dump with exit 1.
|
|
27
27
|
* That covers a plain Error, a `GeneralError`, and even a FireForge
|
|
@@ -62,25 +62,25 @@ export declare const WAIT_LOCK_ENV_VAR = "FIREFORGE_WAIT_LOCK";
|
|
|
62
62
|
* Accepts the raw string too, so it doubles as the option's arg parser (wrap
|
|
63
63
|
* with {@link commanderArgParser} so failures surface through commander's
|
|
64
64
|
* invalid-argument channel). In that role the value is never `undefined`, so
|
|
65
|
-
* the environment fallback cannot leak into flag
|
|
66
|
-
*
|
|
65
|
+
* the environment fallback cannot leak into flag parsing, only into flag
|
|
66
|
+
* absence, which is where it belongs.
|
|
67
67
|
*/
|
|
68
68
|
export declare function resolveWaitLockSeconds(value: string | number | boolean | undefined): number | undefined;
|
|
69
69
|
/**
|
|
70
|
-
* The session-wide wait budget in
|
|
70
|
+
* The session-wide wait budget in milliseconds, or undefined when none is
|
|
71
71
|
* set. Sourced from {@link WAIT_LOCK_ENV_VAR} only.
|
|
72
72
|
*
|
|
73
|
-
* Exists for the
|
|
73
|
+
* Exists for the secondary locks a command takes after the one its
|
|
74
74
|
* `--wait-lock` flag was threaded to. A furnace mutation takes the engine
|
|
75
|
-
* session lock and then `.fireforge/furnace.lock
|
|
75
|
+
* session lock and then `.fireforge/furnace.lock`. Only the first had a
|
|
76
76
|
* budget, so a contended deploy died on the file lock's fixed 30 s while
|
|
77
77
|
* its operator believed a much larger budget was in force. Threading the
|
|
78
|
-
* flag reaches the three furnace commands that declare it
|
|
78
|
+
* flag reaches the three furnace commands that declare it. This reaches
|
|
79
79
|
* the twelve that do not (`create`, `remove`, `rename`, `refresh`, `scan`,
|
|
80
80
|
* `override`, `chrome-doc`, …), which have no flag to thread but are just
|
|
81
81
|
* as contended.
|
|
82
82
|
*
|
|
83
|
-
*
|
|
83
|
+
* Env-only: a flag belongs to one invocation and is passed
|
|
84
84
|
* explicitly where it applies, while the environment is exactly the place a
|
|
85
85
|
* session-wide default is expressed. An explicit budget at a call site
|
|
86
86
|
* always wins over this.
|
|
@@ -88,12 +88,6 @@ export declare function resolveWaitLockSeconds(value: string | number | boolean
|
|
|
88
88
|
* @returns The session budget in milliseconds, or undefined
|
|
89
89
|
*/
|
|
90
90
|
export declare function sessionWaitLockMs(): number | undefined;
|
|
91
|
-
/**
|
|
92
|
-
* True when `command` already declares `--wait-lock` itself. Used by the
|
|
93
|
-
* CLI wiring to add the accept-and-ignore variant only where the honoring
|
|
94
|
-
* one is absent.
|
|
95
|
-
*/
|
|
96
|
-
export declare function hasWaitLockOption(command: Command): boolean;
|
|
97
91
|
/**
|
|
98
92
|
* Recursively gives every command in the tree a `--wait-lock` flag: the
|
|
99
93
|
* honoring registration where one already exists, the accept-and-ignore
|
|
@@ -104,12 +98,12 @@ export declare function ensureWaitLockOptionEverywhere(command: Command): void;
|
|
|
104
98
|
* Registers the shared `--wait-lock [seconds]` flag on a lock-taking
|
|
105
99
|
* command (the engine session lock for engine-mutating commands, the patch
|
|
106
100
|
* directory lock for queue-mutating ones). The parsed option value is `true`
|
|
107
|
-
* for the bare flag or a validated integer
|
|
101
|
+
* for the bare flag or a validated integer. Feed it through
|
|
108
102
|
* {@link resolveWaitLockSeconds} at the call site to obtain the
|
|
109
103
|
* `waitLockSeconds` for `withEngineSessionLock`/`withPatchDirectoryLock`.
|
|
110
104
|
*
|
|
111
|
-
* A command can take
|
|
112
|
-
* engine session lock and then `.fireforge/furnace.lock`
|
|
105
|
+
* A command can take more than one lock (a furnace mutation takes the
|
|
106
|
+
* engine session lock and then `.fireforge/furnace.lock`) and the budget
|
|
113
107
|
* has to reach all of them or the flag is a half-truth. The secondary locks
|
|
114
108
|
* read the session budget through {@link sessionWaitLockMs} rather than
|
|
115
109
|
* having it threaded to every call site.
|