XrmToolSuite.SolutionComplexityScore 1.2026.7.12

dotnet add package XrmToolSuite.SolutionComplexityScore --version 1.2026.7.12
                    
NuGet\Install-Package XrmToolSuite.SolutionComplexityScore -Version 1.2026.7.12
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="XrmToolSuite.SolutionComplexityScore" Version="1.2026.7.12" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="XrmToolSuite.SolutionComplexityScore" Version="1.2026.7.12" />
                    
Directory.Packages.props
<PackageReference Include="XrmToolSuite.SolutionComplexityScore" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add XrmToolSuite.SolutionComplexityScore --version 1.2026.7.12
                    
#r "nuget: XrmToolSuite.SolutionComplexityScore, 1.2026.7.12"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package XrmToolSuite.SolutionComplexityScore@1.2026.7.12
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=XrmToolSuite.SolutionComplexityScore&version=1.2026.7.12
                    
Install as a Cake Addin
#tool nuget:?package=XrmToolSuite.SolutionComplexityScore&version=1.2026.7.12
                    
Install as a Cake Tool

📊 Solution Complexity Score

An XrmToolBox plugin that inventories a single solution's components and computes a weighted 0–100 complexity score — with a maintainability score, upgrade/migration/testing effort in person-days, a rough annual support-cost estimate, and a sibling build-quality score — from the component tallies via a UI-free, SDK-free scoring engine. Read-only (counts components; never modifies the solution).

Features

Area What it produces
Component inventory Tallies tables, columns, relationships, plugin steps, PCF controls, views, charts, JavaScript web resources, forms, dashboards, workflows, flows, business rules, custom APIs and apps (model-driven + canvas) into a plain ComponentCounts POCO — every query solution-scoped and fail-soft. The widest form (by control count) is captured as an outlier signal.
Complexity score Each dimension contributes count × weight points (e.g. Table 3.0, Plugin step 2.5, PCF 3.0, Column 0.2); the total maps to a 0–100 score that saturates at 100 when points reach the max. Per-dimension contributions are exposed as rows.
Maintainability MaintainabilityScore = 100 − ComplexityScore.
Effort & cost Transparent linear estimates from the tallies — testing / upgrade / migration effort in person-days and a rough annual support-cost figure.
Build-quality score A separate 0–100 score (higher = better, Low/Med/High band split at 80/60) that starts at 100 and deducts for best-practice violations over the same tallies (oversized forms, plugin-step density, automation sprawl, client-script weight, legacy-workflow reliance, schema sprawl, low maintainability).
Hotspots Graded-severity findings — wide form (≥100 controls), high plugin-step count (≥30), large automation surface (≥40), heavy scripting (≥25 JS), large data model (≥50 tables). An unremarkable solution reads as "No structural hotspots".
Dashboard A score + band header with a metric strip and a hotspot grid.

Exports

  • PDF (native, MigraDoc/PdfSharp-GDI)
  • HTML dashboard
  • Excel workbook
  • JSON
  • Markdown
  • An executive summary — offline-templated by default, with an opt-in AI path

Help & Support

A right-aligned Help button on the toolbar opens a Help & Support dialog (Documentation, Report an issue, and a support link, each opened in the browser). The tool implements IHelpPlugin and IGitHubPlugin pointing at repository kkora/XrmToolSuite.

Build & install

This tool is not single-DLL — it ships the Excel/PDF export dependency chain (ClosedXML + PdfSharp/MigraDoc-GDI) into the Plugins root next to the tool DLL. The one-step build copies the whole chain automatically:

dotnet build src\Tools\XrmToolSuite.SolutionComplexityScore\XrmToolSuite.SolutionComplexityScore.csproj -c Release -p:DeployToXTB=true

Restart XrmToolBox and open Solution Complexity Score. For a manual copy to another machine, copy every DLL from the tool's bin\Release\net48\ folder — flat in the Plugins root, never a subfolder, or XrmToolBox silently drops the tool. See ./DEPLOYMENT.md and the suite guide Deployment_Guide_XrmToolBox.md.

Usage

  1. Connect to your Dataverse environment.
  2. Open Solution Complexity Score and pick a solution (visible, non-system solutions load off-thread).
  3. Run the inventory — collection runs on a background worker with progress.
  4. Review the dashboard: complexity + maintainability + build-quality scores, effort/cost estimates, the metric strip and the hotspot grid.
  5. Export to PDF / HTML / Excel / JSON / Markdown.

Notes & limitations

  • Read-only — no destructive operations, so no confirmation dialog is required.
  • The complexity/effort model, the ComponentCounts POCO and the report projection are UI-free and SDK-free; the collector degrades query failures to zero counts rather than throwing.
  • The optional AI executive summary is opt-in behind a session-only API key (env var or the AI-settings dialog) that is never persisted, and a payload-preview consent dialog shows the anonymized JSON (no record data, credentials or environment names) before anything is sent. The chosen provider/model-id persist; the key does not.
  • Local models (Ollama): run the summary against a local model — no API key, nothing leaves the machine.
    1. Install: winget install Ollama.Ollama (or ollama.com/download). Ollama serves http://localhost:11434 automatically; start it manually with ollama serve if needed.
    2. Pull a model: ollama pull qwen2.5:7b (also gemma3:4b, llama3.2:3b, qwen2.5-coder:7b). ollama list shows installed models, ollama ps shows loaded ones, ollama run <model> "hi" warms one up.
    3. AI settings ▸ Provider = Ollama (local), Model = qwen2.5:7b, leave API key blank. The first request loads the model (waits up to 5 min); if Ollama isn't running it falls back to the offline summary. nomic-embed-text is an embedding model — use a chat model (qwen2.5/gemma3/llama3.2).
  • Deferred quality signals (naming-prefix consistency, description coverage, managed/unmanaged layering) need a collector change and are a phase-2 item.
Product Compatible and additional computed target framework versions.
.NET Framework net48 is compatible.  net481 was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.2026.7.12 117 7/11/2026
1.2026.7.11 82 7/11/2026
1.2026.7.10 104 7/11/2026
1.2026.7.9 116 7/11/2026
1.2026.7.8 101 7/11/2026
1.2026.7.7 107 7/11/2026
1.2026.7.6 107 7/10/2026
1.2026.7.5 105 7/9/2026
1.2026.7.3 102 7/7/2026
1.2026.7.2 104 7/5/2026

1.2026.7.12: The executive summary now renders with proper line breaks.