Skip to content

feat: add EfcptOfflineMode for air-gapped/secure CI (#185)#197

Merged
JerrettDavis merged 11 commits into
mainfrom
feat/185-offline-mode
Jul 11, 2026
Merged

feat: add EfcptOfflineMode for air-gapped/secure CI (#185)#197
JerrettDavis merged 11 commits into
mainfrom
feat/185-offline-mode

Conversation

@JerrettDavis

Copy link
Copy Markdown
Owner

Summary

Adds EfcptOfflineMode so RunEfcpt can be used in air-gapped / secure CI environments that must never make an outbound network call.

  • ISdkProbe seam (src/JD.Efcpt.Build.Tasks/Utilities/ISdkProbe.cs): extracts the SDK/dnx/global-tool capability checks used by RunEfcpt's tool resolution/restore strategies behind an interface. DefaultSdkProbe delegates to the existing SdkProbeCache-backed memoized probes from Cache dnx/SDK capability probe to reduce build overhead #187 - no behavior change, no new caching. Adds IsGlobalToolInstalled for offline pre-flight use.
  • EfcptOfflineMode MSBuild property (default false): threads an Offline flag through the tool resolution/restore Strategy contexts and prepends !ctx.Offline && to the three network-dependent branches - dnx execution, tool-manifest restore, and global tool update. Emits a one-time high-importance status message when offline. Also honors the EFCPT_OFFLINE environment variable.
  • JD0026 pre-flight validation: when offline, RunEfcpt requires the tool to already be runnable via an explicit existing EfcptToolPath, a discovered (already-restored) tool manifest, or a global tool on PATH. If none apply, it fails actionably with error JD0026 (modeled on ProviderDriverNotFoundException's shape - problem, exact dotnet tool install commands, detected state, docs URL) via log.Error + return false, never throwing.
  • Guards the _EfcptCheckForUpdates target with and '$(EfcptOfflineMode)' != 'true' so the SDK update-check network call is also skipped offline.
  • New docs/user-guide/offline.md and a JD0026 entry in docs/user-guide/error-codes.md.
  • New tests/JD.Efcpt.Build.Tests/OfflineModeTests.cs (TinyBDD, mirrors RunEfcptTests/DotNetToolUtilitiesTests): offline + pre-provisioned ToolPath succeeds while a throwing fake probe proves no SDK/dnx/global-tool check runs; offline + no manifest/no ToolPath/all-probes-unavailable fails with JD0026 containing a dotnet tool install command; offline defaults to disabled.

Known gap - buildTransitive regeneration blocked (pre-existing, unrelated)

buildTransitive/JD.Efcpt.Build.{props,targets} are not regenerated in this PR. Regeneration is currently broken on main, independent of this change:

  • Dependabot PR chore(deps): Bump the nuget-dependencies group with 7 updates #177 bumped JD.MSBuild.Fluent 1.3.20 -> 1.3.22 as a "semver-patch" update.
  • That bump silently changed TargetsBuilder.RegisterTasks's parameter names (assemblyPath no longer valid), which cascades into ~44 compile errors across src/JD.Efcpt.Build.Definitions (confirmed via dotnet msbuild -t:JDMSBuildFluentGenerate -p:TargetFramework=net8.0 -p:JDMSBuildFluentGenerateEnabled=true per GENERATING.md, reproduced identically on a clean origin/main checkout).
  • JD.Efcpt.Build.Definitions.csproj is not part of JD.Efcpt.Build.sln, and GENERATING.md notes CI always runs with generation disabled - so this breakage has been dormant/undetected.
  • Per instructions, I did not hand-edit the generated XML to work around this.

The EfcptOfflineMode property, OfflineMode task param, and _EfcptCheckForUpdates guard are all added at the source (factory) level and are ready to regenerate once the JD.MSBuild.Fluent version issue is resolved (pin back to 1.3.20, or update the RegisterTasks/registry call sites for the new API). Until then, the packaged NuGet's buildTransitive XML does not yet expose EfcptOfflineMode to consumers, even though the task itself fully supports it when driven directly (e.g. via the task param, as covered by the new tests).

Test plan

  • dotnet build JD.Efcpt.Build.sln -c Debug - 0 errors, warning-clean (only pre-existing NuGet TFM-support warnings, not compiler warnings)
  • dotnet test tests/JD.Efcpt.Build.Tests -c Debug --filter "FullyQualifiedName~Offline |FullyQualifiedName~RunEfcpt|FullyQualifiedName~DotNetToolUtilities|FullyQualifiedName~SdkProbeCache" - 146 passed, 0 failed, 0 skipped
  • Follow-up: fix JD.MSBuild.Fluent version mismatch, regenerate buildTransitive/, verify EfcptOfflineMode/OfflineMode param appear in the generated XML

Fixes #185.

Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com

JerrettDavis and others added 4 commits July 10, 2026 21:31
…l checks

Extracts RunEfcpt's SDK/dnx capability checks behind an ISdkProbe interface
(plus a new IsGlobalToolInstalled probe for later offline pre-flight use).
DefaultSdkProbe delegates to the existing #187 memoized probes on RunEfcpt
(backed by SdkProbeCache) so caching and behavior are unchanged. Threads the
probe through the tool resolution/restore Strategy contexts so predicates
call ctx.Probe.* instead of the static methods directly - a pure testability
seam with no behavior change; existing RunEfcptTests/DotNetToolUtilitiesTests
stay green.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…rk-dependent tool branches

Adds EfcptOfflineMode (default false) to both mirrored property groups in
BuildTransitivePropsFactory.cs, and the OfflineMode task param on RunEfcpt in
BuildTransitiveTargetsFactory.cs. RunEfcpt gains an OfflineMode property
(OR-ed with the EFCPT_OFFLINE env var) and threads a resolved `Offline` flag
through the tool resolution/restore Strategy contexts, prepending
`!ctx.Offline &&` to the three network-dependent branches (dnx execution,
tool-manifest restore, global tool update) so none of them spawn a process
when offline. Emits a one-time high-importance status message when offline.

KNOWN GAP: buildTransitive/JD.Efcpt.Build.{props,targets} are NOT regenerated
in this commit. Regeneration is currently broken on main independent of this
change: dependabot PR #177 bumped JD.MSBuild.Fluent 1.3.20 -> 1.3.22 as a
"semver-patch" update, but TargetsBuilder.RegisterTasks's parameter names
changed (`assemblyPath` no longer valid), which cascades into ~44 compile
errors in JD.Efcpt.Build.Definitions (a project that is not part of the .sln
and is never built by CI - see GENERATING.md's note that CI always disables
generation). Reproduced identically on a clean checkout of origin/main via
`dotnet msbuild -t:JDMSBuildFluentGenerate` per GENERATING.md. Per explicit
instruction not to hand-edit the generated XML, this is left as a follow-up:
fix the JD.MSBuild.Fluent version mismatch (or pin back to 1.3.20), then
regenerate and commit the buildTransitive files including this property.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…arget, add docs

RunEfcpt now validates, when offline, that the efcpt tool is guaranteed
runnable without a network call: an explicit existing EfcptToolPath, a
discovered (already-restored) tool manifest, or a global tool resolvable on
PATH via the new ISdkProbe.IsGlobalToolInstalled. If none apply, the task
logs actionable error JD0026 (mirroring ProviderDriverNotFoundException's
shape - problem, exact dotnet tool install commands, detected state, docs
URL) via log.Error and returns false rather than throwing, per
TaskExecutionDecorator's contract.

Adds EfcptToolNotAvailableOfflineException as the JD0026 message builder.
Guards the _EfcptCheckForUpdates target with `and '$(EfcptOfflineMode)' !=
'true'` so the SDK update-check network call is also skipped offline (same
buildTransitive regeneration gap noted in the prior commit - source-level
change only, pending the JD.MSBuild.Fluent version fix).

Adds docs/user-guide/offline.md (full offline/air-gapped workflow) and a
JD0026 entry in docs/user-guide/error-codes.md.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…pre-flight

Adds TinyBDD Given/When/Then scenarios, mirroring RunEfcptTests/
DotNetToolUtilitiesTests conventions ([Collection(nameof(AssemblySetup))]):

- offline-skips-network: a ThrowingSdkProbe that fails the test if any probe
  method is invoked; OfflineMode=true, TargetFramework=net10.0, a
  pre-provisioned explicit ToolPath (a real, always-succeeding .cmd script,
  not EFCPT_FAKE_EFCPT - which short-circuits before tool resolution runs at
  all) -> task succeeds, no probe/restore/acquire path is touched.
- offline-fails-actionably: OfflineMode=true, no manifest, no ToolPath,
  TargetFramework=net8.0, an AllUnavailableSdkProbe -> task returns false and
  Engine.Errors contains code JD0026 with a "dotnet tool install" command.
- offline-disabled-by-default: OfflineMode left unset -> defaults to "false"
  and fake-mode execution is unaffected.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… and regenerate with EfcptOfflineMode (#185)

Dependabot PR #177 bumped JD.MSBuild.Fluent 1.3.20 -> 1.3.22, which changed
several fluent-DSL APIs (ResolveMultiTargetedTaskAssembly, RegisterTasks,
BeforeTargets/AfterTargets, OutputProperty<T1,T2>). This broke
JD.Efcpt.Build.Definitions with ~44 compile errors, invisible to CI because
that project is not in JD.Efcpt.Build.sln and CI runs with generation
disabled. As a result, EfcptOfflineMode (added on this branch) never made it
into the generated buildTransitive/JD.Efcpt.Build.{props,targets}.

Adapted Definitions to the 1.3.22 API rather than pinning back to 1.3.20,
since the bump also included other patch/security updates in the same
Dependabot group:
- SharedPropertyGroups/UsingTasksRegistry: updated
  ResolveMultiTargetedTaskAssembly to the new (tasksFolderProperty,
  taskAssemblyProperty, assemblyFileName, packageId, frameworkMappings)
  signature, and RegisterTasks' renamed assemblyPathProperty parameter.
- BuildTransitiveTargetsFactory: multi-target BeforeTargets("A", "B") calls
  switched to the single semicolon-joined string form; OutputProperty<T1,T2>()
  calls (which required task-parameter marker types that were never defined,
  plus some property markers only visible from a different nested class)
  switched to the plain-string OutputProperty(taskParameter, propertyName)
  overload using the exact strings already present in the last known-good
  generated targets file.

Separately, JD.Efcpt.Build.csproj never actually wired in the Definitions
sources: JD.MSBuild.Fluent's generator reflects over the project's own
compiled JD.Efcpt.Build.dll for JDMSBuildFluentDefinitionType, and a
ProjectReference to JD.Efcpt.Build.Definitions.csproj is not enough - the
type must be physically compiled into that assembly. Added a Compile
Include so JD.Efcpt.Build.Definitions's sources compile directly into
JD.Efcpt.Build.dll (IncludeBuildOutput=false, so this does not affect the
packed NuGet output).

Regenerated buildTransitive/JD.Efcpt.Build.{props,targets} (and build/):
EfcptOfflineMode now appears in the props defaults and is wired into the
RunEfcpt task's OfflineMode parameter. Diffed the regenerated files against
the previous versions: aside from EfcptOfflineMode, all other properties/
targets are preserved; the only other differences are the newer generator's
XML formatting and two target names (EfcptEnsureDacpac,
EfcptQuerySchemaMetadata) that were already renamed in source but never
regenerated.

Follow-up recommended (not filed): add JD.Efcpt.Build.Definitions to the
solution, or add a CI step that builds it / diffs regenerated output against
committed buildTransitive files, so this class of breakage can't silently
reoccur.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
JerrettDavis and others added 6 commits July 10, 2026 22:36
EfcptOfflineMode's default now honors a truthy EFCPT_OFFLINE environment
variable (MSBuild exposes env vars as properties automatically), so the
documented "either is sufficient" contract holds for consumers of the
property directly - notably the _EfcptCheckForUpdates target, which reads
$(EfcptOfflineMode) rather than going through RunEfcpt's task-level OR.

Truthy tokens intentionally mirror StringExtensions.IsTrue()
(true/yes/on/1/enable/enabled/y); MSBuild condition equality is
case-insensitive so no extra case variants are needed.
EFCPT_OFFLINE=false/0/unset does not enable offline mode. Regenerated
buildTransitive/JD.Efcpt.Build.{props,targets} from the factory via
JDMSBuildFluentGenerate. Updated docs/user-guide/offline.md to describe
the two independent OR points (MSBuild property default vs. task-level
env-var read) and the exact accepted values.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
)

The offline JD0026 pre-flight's manifest leg previously treated ANY
discovered .config/dotnet-tools.json as proof the efcpt tool was runnable.
A stale, foreign, or never-restored manifest (or a ToolMode that wouldn't
even use it) would pass pre-flight and only fail later with a cryptic
`dotnet tool run` error instead of the actionable JD0026.

The manifest leg now only counts as runnable when (a) the current
ToolMode would actually use the manifest - extracted the existing
ToolIsAutoOrManifest condition into a reusable ToolModeUsesManifest(mode,
manifestDir, forceManifestOnNonWindows) helper, callable before a
ToolResolutionContext exists - and (b) the manifest file itself lists an
entry for the target tool (matched by ToolPackageId or by a "commands"
entry matching ToolCommand), via a new ManifestListsTool() helper that
does a tolerant local JSON read (malformed/unreadable manifests are
treated as "not runnable", never thrown). Both checks are local file
reads only, so they remain offline-safe. The explicit-ToolPath and
global-tool-on-PATH legs are unchanged.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The existing 3 OfflineModeTests scenarios all bypass the !ctx.Offline
STRATEGY gates in RunEfcpt (explicit ToolPath short-circuits before them;
EFCPT_FAKE_EFCPT returns before tool resolution runs at all). Adds 4
scenarios that exercise those gates directly, using capturing fake
dotnet/global-tool .cmd scripts (append invocation to a log file, exit 0)
plus counting/throwing ISdkProbe substitutes to assert what did and
didn't run:

- Offline + a manifest that lists the efcpt tool resolves via
  'dotnet tool run', with dnx/global-tool probes and tool
  restore/update never invoked (TFM net10.0, no explicit ToolPath).
- Offline + no manifest + a global tool on PATH succeeds by invoking the
  tool directly, without ever touching dotnet (proving tool update
  --global never runs).
- EFCPT_OFFLINE set with EfcptOfflineMode left at its default reproduces
  the JD0026 pre-flight failure via the task-level env-var OR-in alone;
  the MSBuild-property-level bridge is verified separately via the
  generated buildTransitive/*.props XML (a full MSBuild target harness is
  out of scope for this task-level project).
- Offline=false gate-regression: with a manifest present, TFM net8.0, and
  a counting probe, tool restore genuinely runs - proving the
  !ctx.Offline prefix is a real gate, not inverted or always-on.

7 OfflineModeTests scenarios total, all passing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ptQuerySchemaMetadataForDb) to avoid breaking samples/consumers (#185)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… CI) (#185)

The offline-mode tests created fake dotnet/global-tool shims as Windows .cmd
batch scripts. On the Linux CI runner a .cmd file is not executable, so the
shim never ran, its invocation log was never written, and the assertions
(task succeeds / no error / invocation recorded) failed with
FileNotFoundException. This is a test-portability bug, not a defect in the
offline-mode logic.

Introduce TestScripts.CreateCaptureScript / CreateAlwaysSucceedsScript which
branch on OperatingSystem.IsWindows(): Windows still gets a .cmd batch file
(wrapped via cmd.exe /c by CommandNormalizationStrategy); Linux/macOS get a
#!/bin/sh script with the executable bit set (File.SetUnixFileMode, via the
existing TestFileSystem.MakeExecutable helper), launched directly by
Process.Start. Test-only change; no product code touched.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… Linux auto-mode manifest fallback (#185)

RunEfcpt.ExecuteCore forces `auto` ToolMode into tool-manifest resolution
on non-Windows whenever ToolPath is empty (forceManifestOnNonWindows),
regardless of whether a manifest actually exists - a deliberate guard
against fragile bare-PATH assumptions on CI. The offline
global-tool-on-PATH test used ToolMode="auto" with no manifest and no
ToolPath, so on Linux it silently resolved via `dotnet tool run` (through
the fake dotnet shim) instead of invoking the fake global-tool executable
directly, leaving global-tool-invocations.log never written.

Using ToolMode="global" (any non-auto/non-tool-manifest value, per the
ToolMode doc comment) bypasses that platform-dependent branch entirely
and exercises the intended Default/global-tool resolution branch
identically on Windows and Linux. No product code changes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Code Coverage

Summary
  Generated on: 07/11/2026 - 05:33:13
  Coverage date: 07/11/2026 - 05:28:42 - 07/11/2026 - 05:33:10
  Parser: MultiReport (2x Cobertura)
  Assemblies: 8
  Classes: 111
  Files: 74
  Line coverage: 86.9%
  Covered lines: 4714
  Uncovered lines: 707
  Coverable lines: 5421
  Total lines: 11708
  Branch coverage: 68.1% (1836 of 2696)
  Covered branches: 1836
  Total branches: 2696
  Method coverage: 95.6% (906 of 947)
  Full method coverage: 84.6% (802 of 947)
  Covered methods: 906
  Fully covered methods: 802
  Total methods: 947

JD.Efcpt.Build.Firebird                                                                                                                                          98.7%
  JD.Efcpt.Build.Tasks.Schema.Providers.FirebirdProviderAdapter                                                                                                   100%
  JD.Efcpt.Build.Tasks.Schema.Providers.FirebirdSchemaReader                                                                                                     98.6%

JD.Efcpt.Build.MySqlConnector                                                                                                                                     100%
  JD.Efcpt.Build.Tasks.Schema.Providers.MySqlProviderAdapter                                                                                                      100%
  JD.Efcpt.Build.Tasks.Schema.Providers.MySqlSchemaReader                                                                                                         100%

JD.Efcpt.Build.Oracle                                                                                                                                             100%
  JD.Efcpt.Build.Tasks.Schema.Providers.OracleProviderAdapter                                                                                                     100%
  JD.Efcpt.Build.Tasks.Schema.Providers.OracleSchemaReader                                                                                                        100%

JD.Efcpt.Build.PostgreSQL                                                                                                                                         100%
  JD.Efcpt.Build.Tasks.Schema.Providers.PostgreSqlProviderAdapter                                                                                                 100%
  JD.Efcpt.Build.Tasks.Schema.Providers.PostgreSqlSchemaReader                                                                                                    100%

JD.Efcpt.Build.Providers.Abstractions                                                                                                                              98%
  JD.Efcpt.Build.Tasks.Extensions.DataRowExtensions                                                                                                               100%
  JD.Efcpt.Build.Tasks.Extensions.StringExtensions                                                                                                                100%
  JD.Efcpt.Build.Tasks.Schema.ColumnModel                                                                                                                         100%
  JD.Efcpt.Build.Tasks.Schema.ColumnNameMapping                                                                                                                   100%
  JD.Efcpt.Build.Tasks.Schema.ConstraintModel                                                                                                                     100%
  JD.Efcpt.Build.Tasks.Schema.ForeignKeyColumnModel                                                                                                               100%
  JD.Efcpt.Build.Tasks.Schema.ForeignKeyModel                                                                                                                      90%
  JD.Efcpt.Build.Tasks.Schema.IndexColumnModel                                                                                                                    100%
  JD.Efcpt.Build.Tasks.Schema.IndexModel                                                                                                                         92.8%
  JD.Efcpt.Build.Tasks.Schema.SchemaModel                                                                                                                         100%
  JD.Efcpt.Build.Tasks.Schema.SchemaReaderBase                                                                                                                    100%
  JD.Efcpt.Build.Tasks.Schema.TableModel                                                                                                                         92.8%

JD.Efcpt.Build.Snowflake                                                                                                                                          100%
  JD.Efcpt.Build.Tasks.Schema.Providers.SnowflakeProviderAdapter                                                                                                  100%

JD.Efcpt.Build.Sqlite                                                                                                                                             100%
  JD.Efcpt.Build.Tasks.Schema.Providers.SqliteProviderAdapter                                                                                                     100%
  JD.Efcpt.Build.Tasks.Schema.Providers.SqliteSchemaReader                                                                                                        100%

JD.Efcpt.Build.Tasks                                                                                                                                             85.2%
  JD.Efcpt.Build.Tasks.AddSqlFileWarnings                                                                                                                         100%
  JD.Efcpt.Build.Tasks.ApplyConfigOverrides                                                                                                                       100%
  JD.Efcpt.Build.Tasks.BuildLog                                                                                                                                   100%
  JD.Efcpt.Build.Tasks.Chains.ConnectionStringResolutionChain                                                                                                    90.1%
  JD.Efcpt.Build.Tasks.Chains.ConnectionStringResolutionContext                                                                                                   100%
  JD.Efcpt.Build.Tasks.Chains.DirectoryResolutionChain                                                                                                           91.6%
  JD.Efcpt.Build.Tasks.Chains.DirectoryResolutionContext                                                                                                          100%
  JD.Efcpt.Build.Tasks.Chains.FileResolutionChain                                                                                                                 100%
  JD.Efcpt.Build.Tasks.Chains.FileResolutionContext                                                                                                               100%
  JD.Efcpt.Build.Tasks.Chains.ResourceResolutionChain                                                                                                            93.1%
  JD.Efcpt.Build.Tasks.Chains.ResourceResolutionContext                                                                                                           100%
  JD.Efcpt.Build.Tasks.CheckSdkVersion                                                                                                                           40.9%
  JD.Efcpt.Build.Tasks.ComputeFingerprint                                                                                                                        97.8%
  JD.Efcpt.Build.Tasks.Config.CodeGenerationOverrides                                                                                                             100%
  JD.Efcpt.Build.Tasks.Config.EfcptConfigGenerator                                                                                                               79.6%
  JD.Efcpt.Build.Tasks.Config.EfcptConfigOverrideApplicator                                                                                                      93.1%
  JD.Efcpt.Build.Tasks.Config.EfcptConfigOverrides                                                                                                                100%
  JD.Efcpt.Build.Tasks.Config.FileLayoutOverrides                                                                                                                 100%
  JD.Efcpt.Build.Tasks.Config.NamesOverrides                                                                                                                      100%
  JD.Efcpt.Build.Tasks.Config.ReplacementsOverrides                                                                                                               100%
  JD.Efcpt.Build.Tasks.Config.TypeMappingsOverrides                                                                                                               100%
  JD.Efcpt.Build.Tasks.ConnectionStrings.AppConfigConnectionStringParser                                                                                          100%
  JD.Efcpt.Build.Tasks.ConnectionStrings.AppSettingsConnectionStringParser                                                                                        100%
  JD.Efcpt.Build.Tasks.ConnectionStrings.ConfigurationFileTypeValidator                                                                                           100%
  JD.Efcpt.Build.Tasks.ConnectionStrings.ConnectionStringResult                                                                                                   100%
  JD.Efcpt.Build.Tasks.DacpacFingerprint                                                                                                                         96.1%
  JD.Efcpt.Build.Tasks.DbContextNameGenerator                                                                                                                    83.6%
  JD.Efcpt.Build.Tasks.Decorators.ProfileInputAttribute                                                                                                           100%
  JD.Efcpt.Build.Tasks.Decorators.ProfileOutputAttribute                                                                                                           50%
  JD.Efcpt.Build.Tasks.Decorators.ProfilingBehavior                                                                                                              91.6%
  JD.Efcpt.Build.Tasks.Decorators.TaskExecutionContext                                                                                                           66.6%
  JD.Efcpt.Build.Tasks.Decorators.TaskExecutionDecorator                                                                                                          100%
  JD.Efcpt.Build.Tasks.DetectSqlProject                                                                                                                            84%
  JD.Efcpt.Build.Tasks.EnsureDacpacBuilt                                                                                                                         96.1%
  JD.Efcpt.Build.Tasks.Extensions.EnumerableExtensions                                                                                                            100%
  JD.Efcpt.Build.Tasks.FileHash                                                                                                                                   100%
  JD.Efcpt.Build.Tasks.FileSystemHelpers                                                                                                                          100%
  JD.Efcpt.Build.Tasks.FinalizeBuildProfiling                                                                                                                     100%
  JD.Efcpt.Build.Tasks.InitializeBuildProfiling                                                                                                                   100%
  JD.Efcpt.Build.Tasks.MessageLevelHelpers                                                                                                                        100%
  JD.Efcpt.Build.Tasks.ModuleInitializer                                                                                                                          100%
  JD.Efcpt.Build.Tasks.MsBuildPropertyHelpers                                                                                                                     100%
  JD.Efcpt.Build.Tasks.NullBuildLog                                                                                                                               100%
  JD.Efcpt.Build.Tasks.PathUtils                                                                                                                                 91.6%
  JD.Efcpt.Build.Tasks.ProcessResult                                                                                                                              100%
  JD.Efcpt.Build.Tasks.ProcessRunner                                                                                                                               90%
  JD.Efcpt.Build.Tasks.Profiling.ArtifactInfo                                                                                                                     100%
  JD.Efcpt.Build.Tasks.Profiling.BuildConfiguration                                                                                                               100%
  JD.Efcpt.Build.Tasks.Profiling.BuildGraph                                                                                                                       100%
  JD.Efcpt.Build.Tasks.Profiling.BuildGraphNode                                                                                                                   100%
  JD.Efcpt.Build.Tasks.Profiling.BuildProfiler                                                                                                                   95.2%
  JD.Efcpt.Build.Tasks.Profiling.BuildProfilerManager                                                                                                             100%
  JD.Efcpt.Build.Tasks.Profiling.BuildRunOutput                                                                                                                   100%
  JD.Efcpt.Build.Tasks.Profiling.DiagnosticMessage                                                                                                                100%
  JD.Efcpt.Build.Tasks.Profiling.JsonTimeSpanConverter                                                                                                            100%
  JD.Efcpt.Build.Tasks.Profiling.ProjectInfo                                                                                                                      100%
  JD.Efcpt.Build.Tasks.Profiling.TaskExecution                                                                                                                    100%
  JD.Efcpt.Build.Tasks.ProfilingHelper                                                                                                                            100%
  JD.Efcpt.Build.Tasks.QuerySchemaMetadata                                                                                                                       89.5%
  JD.Efcpt.Build.Tasks.RenameGeneratedFiles                                                                                                                       100%
  JD.Efcpt.Build.Tasks.ResolveDbContextName                                                                                                                      96.9%
  JD.Efcpt.Build.Tasks.ResolveSqlProjAndInputs                                                                                                                   87.9%
  JD.Efcpt.Build.Tasks.RunEfcpt                                                                                                                                  85.3%
  JD.Efcpt.Build.Tasks.RunSqlPackage                                                                                                                               18%
  JD.Efcpt.Build.Tasks.Schema.DatabaseProviderFactory                                                                                                            96.6%
  JD.Efcpt.Build.Tasks.Schema.EfcptToolNotAvailableOfflineException                                                                                               100%
  JD.Efcpt.Build.Tasks.Schema.ProviderAdapterResolver                                                                                                             100%
  JD.Efcpt.Build.Tasks.Schema.ProviderDriverNotFoundException                                                                                                     100%
  JD.Efcpt.Build.Tasks.Schema.Providers.SqlServerProviderAdapter                                                                                                  100%
  JD.Efcpt.Build.Tasks.Schema.Providers.SqlServerSchemaReader                                                                                                     100%
  JD.Efcpt.Build.Tasks.Schema.SchemaFingerprinter                                                                                                                 100%
  JD.Efcpt.Build.Tasks.SerializeConfigProperties                                                                                                                  100%
  JD.Efcpt.Build.Tasks.SqlProjectDetector                                                                                                                        94.5%
  JD.Efcpt.Build.Tasks.StageEfcptInputs                                                                                                                          95.7%
  JD.Efcpt.Build.Tasks.Strategies.CommandNormalizationStrategy                                                                                                   94.1%
  JD.Efcpt.Build.Tasks.Strategies.ProcessCommand                                                                                                                  100%
  JD.Efcpt.Build.Tasks.Utilities.DefaultSdkProbe                                                                                                                    0%
  JD.Efcpt.Build.Tasks.Utilities.DotNetToolUtilities                                                                                                             87.1%
  JD.Efcpt.Build.Tasks.Utilities.SdkProbeCache                                                                                                                     86%
  System.Text.RegularExpressions.Generated                                                                                                                       80.3%
  System.Text.RegularExpressions.Generated.<RegexGenerator_g>F9F9425F6F5E055E5C6489D8E6FA46DE135B3C69D9A15B4CBA235D8D2417FD2EC__AssemblySymbolsMetadataRegex_1   86.2%
  System.Text.RegularExpressions.Generated.<RegexGenerator_g>F9F9425F6F5E055E5C6489D8E6FA46DE135B3C69D9A15B4CBA235D8D2417FD2EC__DatabaseKeywordRegex_4           75.7%
  System.Text.RegularExpressions.Generated.<RegexGenerator_g>F9F9425F6F5E055E5C6489D8E6FA46DE135B3C69D9A15B4CBA235D8D2417FD2EC__DataSourceKeywordRegex_6         72.3%
  System.Text.RegularExpressions.Generated.<RegexGenerator_g>F9F9425F6F5E055E5C6489D8E6FA46DE135B3C69D9A15B4CBA235D8D2417FD2EC__FileNameMetadataRegex_0          86.2%
  System.Text.RegularExpressions.Generated.<RegexGenerator_g>F9F9425F6F5E055E5C6489D8E6FA46DE135B3C69D9A15B4CBA235D8D2417FD2EC__InitialCatalogKeywordRegex_5     71.2%
  System.Text.RegularExpressions.Generated.<RegexGenerator_g>F9F9425F6F5E055E5C6489D8E6FA46DE135B3C69D9A15B4CBA235D8D2417FD2EC__NonLetterRegex_2                  100%
  System.Text.RegularExpressions.Generated.<RegexGenerator_g>F9F9425F6F5E055E5C6489D8E6FA46DE135B3C69D9A15B4CBA235D8D2417FD2EC__SolutionProjectLineRegex_7       82.5%
  System.Text.RegularExpressions.Generated.<RegexGenerator_g>F9F9425F6F5E055E5C6489D8E6FA46DE135B3C69D9A15B4CBA235D8D2417FD2EC__TrailingDigitsRegex_3            95.2%

@codecov

codecov Bot commented Jul 11, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 81.81818% with 14 lines in your changes missing coverage. Please review.
✅ Project coverage is 90.41%. Comparing base (04f0b17) to head (d393fbf).

Files with missing lines Patch % Lines
src/JD.Efcpt.Build.Tasks/RunEfcpt.cs 81.03% 11 Missing ⚠️
src/JD.Efcpt.Build.Tasks/Utilities/ISdkProbe.cs 0.00% 3 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #197      +/-   ##
==========================================
+ Coverage   82.28%   90.41%   +8.13%     
==========================================
  Files          72       74       +2     
  Lines        3985     4048      +63     
  Branches      584      600      +16     
==========================================
+ Hits         3279     3660     +381     
+ Misses        456      388      -68     
+ Partials      250        0     -250     
Flag Coverage Δ
unittests 90.41% <81.81%> (+8.13%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@JerrettDavis
JerrettDavis merged commit 5c4d013 into main Jul 11, 2026
11 of 12 checks passed
@JerrettDavis
JerrettDavis deleted the feat/185-offline-mode branch July 11, 2026 05:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add offline mode for air-gapped and secure CI environments

1 participant