Skip to content

Commit 7ab7f03

Browse files
committed
Add frontend skill detection to CLI
Detect Astro, Blazor, React, and other browser UI signals from project files. Recommend Astro and Playwright visual-testing skills through recommend and auto-install flows.
1 parent 4b10729 commit 7ab7f03

6 files changed

Lines changed: 413 additions & 33 deletions

File tree

README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ dotnet skills --version # alias for the same version view
5050
dotnet skills list # show installed and available skills
5151
dotnet skills bundle list # show focused bundles by collection and workflow
5252
dotnet skills list --local # only installed skills in the current target
53-
dotnet skills recommend # suggest skills from local .csproj files
54-
dotnet skills install --auto # install skills for NuGet packages detected in local .csproj files
53+
dotnet skills recommend # suggest skills from local .NET and browser UI signals
54+
dotnet skills install --auto # install skills from local .NET and browser UI project signals
5555
dotnet skills install --auto --prune # remove stale auto-managed skills that no longer match the project
5656
dotnet skills install bundle quality # install a focused .NET quality bundle
5757
dotnet skills install mcaf # install the opt-in MCAF governance skill
@@ -78,8 +78,8 @@ agents install router --auto # same agent install flow without th
7878
| `dotnet skills version` | Show the current installed tool version and check whether NuGet has a newer release |
7979
| `dotnet skills list` | Show the current inventory, compare project/global scope when relevant, and keep the remaining catalog as a compact collection summary |
8080
| `dotnet skills bundle list` | Show the focused bundles that expand into related skills by collection or workflow |
81-
| `dotnet skills recommend` | Scan local `*.csproj` files, propose relevant skills, and let you decide what to install |
82-
| `dotnet skills install --auto` | Inspect local `*.csproj` files, detect NuGet packages and strong project signals, and install matching skills automatically |
81+
| `dotnet skills recommend` | Scan local `*.csproj`, `package.json`, and browser UI files, propose relevant skills, and let you decide what to install |
82+
| `dotnet skills install --auto` | Inspect local `*.csproj`, `package.json`, and browser UI files, detect strong project signals, and install matching skills automatically |
8383
| `dotnet skills install --auto --prune` | Remove stale auto-managed skills that no longer match the current project's NuGet packages or app-model signals |
8484
| `dotnet skills install <skill...>` | Install one or more skills |
8585
| `dotnet skills install bundle <bundle...>` | Install one or more focused bundles such as `quality`, `frontend-quality`, or `orleans` |
@@ -110,9 +110,9 @@ The [public catalog](https://skills.managed-code.com/) is the canonical browse s
110110

111111
`dotnet skills bundle list` shows the ready-made focused bundles. Bundle installs are bulk shortcuts for related skill sets, so `dotnet skills install bundle quality`, `dotnet skills install bundle frontend-quality`, or `dotnet skills install bundle orleans` install every skill mapped to that focused bundle in one pass. MCAF is one opt-in governance skill and installs directly with `dotnet skills install mcaf`.
112112

113-
`dotnet skills install --auto` inspects local `*.csproj` files, detects NuGet packages plus strong SDK and project-property signals, and installs the matching skills for that project automatically. Add `dotnet skills install --auto --prune` when you also want to remove stale auto-managed skills that no longer match the current project. Protected diagnostic skills and `graphify-dotnet` are not pruned.
113+
`dotnet skills install --auto` inspects local `*.csproj`, `package.json`, and browser UI files, detects NuGet packages plus strong .NET and frontend framework signals, and installs the matching skills for that project automatically. Add `dotnet skills install --auto --prune` when you also want to remove stale auto-managed skills that no longer match the current project. Protected diagnostic skills and `graphify-dotnet` are not pruned.
114114

115-
`dotnet skills recommend` is a scan-only command: it inspects local project files, proposes a skill list, and prints the install command you can run if you agree with the recommendations. It does not install anything automatically.
115+
`dotnet skills recommend` is a scan-only command: it inspects local .NET projects plus Astro, React, Blazor, and other browser UI signals, proposes a skill list, and prints the install command you can run if you agree with the recommendations. It does not install anything automatically.
116116

117117
The bare `dotnet skills` usage view and `help` path also perform the automatic self-update check, so an outdated tool still tells you to upgrade before it renders the command table.
118118

cli/ManagedCode.DotnetSkills/ConsoleUi.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,7 @@ void Cmd(string command, string desc)
581581
Section("Catalog");
582582
Cmd($"{ToolIdentity.SkillsDisplayCommand} list", "Inventory with scope comparison");
583583
Cmd($"{ToolIdentity.SkillsDisplayCommand} bundle list", "Focused bundles by collection and workflow");
584-
Cmd($"{ToolIdentity.SkillsDisplayCommand} recommend", "Scan .csproj and propose skills");
584+
Cmd($"{ToolIdentity.SkillsDisplayCommand} recommend", "Scan .NET and browser UI signals");
585585
Cmd($"{ToolIdentity.SkillsDisplayCommand} catalog tokens --catalog-root .", "Export per-skill token counts as JSON");
586586

587587
Section("Install");
@@ -792,8 +792,9 @@ private static Panel BuildRecommendationPanel(ProjectScanResult scanResult, Skil
792792
grid.AddColumn(new GridColumn().NoWrap());
793793
grid.AddColumn();
794794
grid.AddRow(new Markup("[dim]project[/]"), new Markup($"[dim]{Escape(scanResult.ProjectRoot.FullName)}[/]"));
795-
grid.AddRow(new Markup("[dim]scanned[/]"), new Markup($"{scanResult.ProjectFiles.Count} projects"));
796-
grid.AddRow(new Markup("[dim]frameworks[/]"), new Markup(scanResult.TargetFrameworks.Count == 0 ? "[dim]unknown[/]" : Escape(string.Join(", ", scanResult.TargetFrameworks))));
795+
grid.AddRow(new Markup("[dim]scanned[/]"), new Markup($"{scanResult.ProjectFiles.Count} .NET project(s), {scanResult.FrontendManifestCount} package.json"));
796+
grid.AddRow(new Markup("[dim].NET[/]"), new Markup(scanResult.TargetFrameworks.Count == 0 ? "[dim]none[/]" : Escape(string.Join(", ", scanResult.TargetFrameworks))));
797+
grid.AddRow(new Markup("[dim]frontend[/]"), new Markup(scanResult.FrontendFrameworks.Count == 0 ? "[dim]none[/]" : Escape(string.Join(", ", scanResult.FrontendFrameworks))));
797798
grid.AddRow(new Markup("[dim]catalog[/]"), new Markup($"{Escape(catalog.SourceLabel)} [dim]({Escape(catalog.CatalogVersion)})[/]"));
798799
grid.AddRow(new Markup("[dim]target[/]"), new Markup($"[dim]{Escape(layout.PrimaryRoot.FullName)}[/]"));
799800

@@ -955,7 +956,7 @@ private static Panel BuildQuickCommandPanel(
955956
}
956957

957958
lines.Add($"[green]dotnet skills install --auto[/] [dim]project-driven sync[/]");
958-
lines.Add($"[green]dotnet skills recommend[/] [dim]scan .csproj signals[/]");
959+
lines.Add($"[green]dotnet skills recommend[/] [dim]scan .NET and browser UI signals[/]");
959960

960961
var alternateScope = scopeInventory.FirstOrDefault(row => row.Scope != layout.Scope);
961962
if (alternateScope is not null)

cli/ManagedCode.DotnetSkills/InteractiveConsoleApp.Workspace.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,9 @@ private void BuildProjectPage(ConsoleWindowSystem ws, ScrollablePanelControl pan
371371
var low = scan.Recommendations.Count(r => r.Confidence == RecommendationConfidence.Low);
372372

373373
AddIdentityStrip(panel, "project scan", AccentDeepSkyBlue,
374-
("scanned", $"{scan.ProjectFiles.Count} project file(s)"),
375-
("frameworks", scan.TargetFrameworks.Count == 0 ? "[grey50]unknown[/]" : Escape(string.Join(", ", scan.TargetFrameworks))),
374+
("scanned", $"{scan.ProjectFiles.Count} .NET / {scan.FrontendManifestCount} frontend manifest(s)"),
375+
("frameworks", scan.TargetFrameworks.Count == 0 ? "[grey50]none[/]" : Escape(string.Join(", ", scan.TargetFrameworks))),
376+
("frontend", scan.FrontendFrameworks.Count == 0 ? "[grey50]none[/]" : Escape(string.Join(", ", scan.FrontendFrameworks))),
376377
("recommendations", scan.Recommendations.Count.ToString()));
377378

378379
// Confidence trio — 3 horizontal BarGraphs (high green, med yellow, low grey) so the
@@ -796,7 +797,7 @@ private void BuildAboutPage(ScrollablePanelControl panel)
796797
"[grey]Skills / Installed[/] [grey50]browse, install, update, remove catalog skills[/]",
797798
"[grey]Collections / Bundles / Packages[/] [grey50]install grouped surfaces[/]",
798799
"[grey]Agents[/] [grey50]install orchestration agents into native agent directories[/]",
799-
"[grey]Project[/] [grey50]scan .csproj signals and install recommended skills[/]",
800+
"[grey]Project[/] [grey50]scan .NET and browser UI signals and install recommended skills[/]",
800801
"[grey]Analysis[/] [grey50]collection sizes, heaviest skills, package signals[/]");
801802

802803
AddInfoBlock(panel, "notes",

cli/ManagedCode.DotnetSkills/InteractiveConsoleApp.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2859,14 +2859,16 @@ private void RenderProjectSyncPanel(
28592859
{
28602860
var summary = BuildRichPropertyGrid(
28612861
("project", $"[dim]{Escape(CompactPath(plan.ScanResult.ProjectRoot.FullName))}[/]"),
2862-
("projects", plan.ScanResult.ProjectFiles.Count.ToString()),
2862+
(".NET projects", plan.ScanResult.ProjectFiles.Count.ToString()),
2863+
("frontend manifests", plan.ScanResult.FrontendManifestCount.ToString()),
28632864
("matched", plan.DesiredSkills.Count.ToString()),
28642865
("new", newSkills.Count == 0 ? "[grey]0[/]" : $"[green]{newSkills.Count}[/]"),
28652866
("target", $"[dim]{Escape(CompactPath(layout.PrimaryRoot.FullName))}[/]"),
2866-
("frameworks", Escape(string.Join(", ", plan.ScanResult.TargetFrameworks))));
2867+
(".NET frameworks", plan.ScanResult.TargetFrameworks.Count == 0 ? "[grey]none[/]" : Escape(string.Join(", ", plan.ScanResult.TargetFrameworks))),
2868+
("frontend", plan.ScanResult.FrontendFrameworks.Count == 0 ? "[grey]none[/]" : Escape(string.Join(", ", plan.ScanResult.FrontendFrameworks))));
28672869

28682870
var flow = BuildRichStack(
2869-
new Spectre.Console.Markup("[deepskyblue1]Signals[/] [dim]come from .csproj packages, SDKs, and project properties[/]"),
2871+
new Spectre.Console.Markup("[deepskyblue1]Signals[/] [dim]come from .csproj, package.json, and browser UI source files[/]"),
28702872
new Spectre.Console.Markup("[deepskyblue1]New skills[/] [dim]will be previewed before any write happens[/]"),
28712873
new Spectre.Console.Markup("[deepskyblue1]State[/] [dim]is saved only after a confirmed project-driven install[/]"));
28722874

@@ -2985,7 +2987,7 @@ private void RenderHelpPanel()
29852987
("Skills", $"{ToolIdentity.SkillsDisplayCommand} install aspire", "Install or inspect one skill by alias"),
29862988
("About", $"{ToolIdentity.DisplayCommand} help", "Show the site-aligned surface map and command reference"),
29872989
("Tokens", $"{ToolIdentity.SkillsDisplayCommand} catalog tokens --catalog-root .", "Export per-skill token counts"),
2988-
("Project", $"{ToolIdentity.SkillsDisplayCommand} install --auto", "Install from .csproj signals"),
2990+
("Project", $"{ToolIdentity.SkillsDisplayCommand} install --auto", "Install from .NET and browser UI signals"),
29892991
("Installed", $"{ToolIdentity.SkillsDisplayCommand} list --installed-only", "Inspect the current target before review, remove, or clear"),
29902992
("Install", $"{ToolIdentity.SkillsDisplayCommand} install bundle quality", "Install a focused bundle"),
29912993
("Remove", $"{ToolIdentity.SkillsDisplayCommand} remove aspire", "Remove one installed skill"),

0 commit comments

Comments
 (0)