make-wpf-viewmodel — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited make-wpf-viewmodel (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
If `$0` is empty, use the AskUserQuestion tool to ask: "Enter the ViewModel name (e.g., Dashboard, Settings)". Do NOT proceed until a valid name is provided. Use the response as the ViewModelName for all subsequent steps.
Generate a $0ViewModel class with optional View, DI registration, and DataTemplate mapping. Follows the wpf-dev-pack composition style: ViewModel First Composition + Stateful ViewModel when using CommunityToolkit.Mvvm (Mappings.xaml + implicit DataTemplate resolves the View from the ViewModel type), or View First Composition + Stateful ViewModel when using Prism 9 (RegisterForNavigation + IRegionManager). ViewModelLocator, code-behind DataContext = new VM(), and inline XAML DataContext are prohibited (see prohibitions.md and docs/TERMINOLOGY.md).
{Namespace} with the project's root namespace detected from csproj or existing code.{ViewModelNamespace} with the ViewModel project's CLR namespace for XAML xmlns declaration.# ViewModel + View + DI + DataTemplate mapping (full)
/wpf-dev-pack:make-wpf-viewmodel Dashboard --with-view
# ViewModel + DI only (no View, no mapping)
/wpf-dev-pack:make-wpf-viewmodel Settings
# ViewModel + View without DataTemplate mapping
/wpf-dev-pack:make-wpf-viewmodel Report --with-view --no-mapping$0 is the ViewModel name (without ViewModel suffix — auto-appended)Dashboard → DashboardViewModel.cs + DashboardView.xaml--with-view flag: Generate View XAML + code-behind--no-mapping flag: Skip DataTemplate mapping registrationSearch for solution file and identify projects by naming convention:
| Project Suffix | Purpose | Files Placed |
|---|---|---|
.ViewModels | ViewModel project | $0ViewModel.cs |
.WpfApp | WPF Application | Views/$0View.xaml, DI registration |
.WpfServices | WPF Services | (referenced for DI) |
Fallback: If no .ViewModels project exists, place ViewModel in ViewModels/ folder of main WPF project.
Create $0ViewModel.cs:
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
namespace {Namespace}.ViewModels;
public sealed partial class $0ViewModel : ObservableObject
{
[ObservableProperty] private string _title = "$0";
[RelayCommand]
private void Loaded()
{
// TODO: Initialize data
// TODO: 데이터 초기화
}
}Create Views/$0View.xaml:
<UserControl x:Class="{Namespace}.Views.$0View"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="{ViewModelNamespace}"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance vm:$0ViewModel}"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<TextBlock Text="{Binding Title}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="24" />
</Grid>
</UserControl>Create Views/$0View.xaml.cs:
namespace {Namespace}.Views;
public partial class $0View
{
public $0View()
{
InitializeComponent();
}
}Locate App.xaml.cs and add registration inside ConfigureServices:
// In ConfigureServices method
services.AddSingleton<$0ViewModel>();With --with-view, register only the ViewModel — the View is instantiated by the Mappings.xaml DataTemplate (ViewModel First), so it is NOT registered in DI (registering it would also force a $0.Views using in App.xaml.cs):
services.AddSingleton<$0ViewModel>();Locate Mappings.xaml (or ViewModelMappings.xaml) and add:
<DataTemplate DataType="{x:Type vm:$0ViewModel}">
<views:$0View />
</DataTemplate>If Mappings.xaml does not exist, create it and merge into App.xaml:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Mappings.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>Output list of generated/modified files and next steps guidance.
{ViewModelsProject}/
└── $0ViewModel.cs
{WpfAppProject}/
├── Views/
│ ├── $0View.xaml (if --with-view)
│ └── $0View.xaml.cs (if --with-view)
├── Mappings.xaml (modified or created)
└── App.xaml.cs (DI registration added)/wpf-dev-pack:make-wpf-project firstPrism 9 사용자: See PRISM.md for Prism-specific generation patterns.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.