You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 20d7351
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: .claude/skills/feature-review/SKILL.md
+23-7Lines changed: 23 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -23,7 +23,7 @@ existing patterns and not introduce new abstractions unless the same problem exi
23
23
24
24
Find every file that belongs to the feature. Don't stop at the obvious View/ViewModel — most bugs and
25
25
inconsistencies hide in the integration points (settings, profiles, group settings, export, command line,
26
-
documentation). [references/integration-map.md](references/integration-map.md) lists where a tool lives and
26
+
run command, "open in other tool" navigation, documentation). [references/integration-map.md](references/integration-map.md) lists where a tool lives and
27
27
how to find all touch points (`git grep -l "<ApplicationName>" -- Source Website` is a good start).
28
28
29
29
### 2. Understand how it works
@@ -38,6 +38,8 @@ Read the code in this order: model (business logic) → view model (state, comma
38
38
view hide/visible, app close
39
39
- Integrations: which settings it reads, which profile/group fields it uses, history lists, export formats,
40
40
admin rights requirement, external dependencies (PowerShell, WebView2, external processes, APIs)
41
+
- Entry points: how the tool is opened with a target or profile (run command `Ctrl+Shift+P`, `NavigationManager.Open`
42
+
from other tools, profile panel, command line) and which other tools it sends data to
41
43
42
44
This section matters on its own: it lets the user verify that the reviewer understood the feature, and
43
45
it is the basis for spotting what is missing. If something is unclear after reading the code, say so
@@ -62,10 +64,12 @@ Go through these areas. Skip an area if it doesn't apply, but say so in one line
62
64
1.**Bugs and logic errors** — wrong results, unhandled exceptions, race conditions (async commands that can
63
65
overlap, refresh vs. modify), cancellation that doesn't stop work, state flags that can get stuck
64
66
(set without `try/finally`), stale data after an action, edge cases (empty input, IPv6, very large
65
-
ranges, invalid/duplicate entries, no network adapter, no admin rights), wrong disposal / event handlers
66
-
that are never unsubscribed (static events!).
67
+
ranges, invalid/duplicate/overlapping entries, no network adapter, no admin rights), wrong disposal / event handlers
68
+
that are never unsubscribed (static events!), status messages overwritten by a later event (e.g. a completion
69
+
event after cancel or after an input error), exceptions in fire-and-forget `async Task` methods (`_ = Start()`)
70
+
that leave flags set.
67
71
2.**Consistency within the feature** — the same action behaving differently depending on where it is
68
-
triggered (button vs. context menu vs. keyboard shortcut vs. profile), single vs. multi selection,
72
+
triggered (button vs. context menu vs. keyboard shortcut vs. profile vs. run command / other tool), single vs. multi selection,
69
73
texts/terms that differ inside the feature.
70
74
3.**Consistency across the application** — compare with the features from step 3 and the conventions:
71
75
layout and spacing, icons, button placement, header/status texts, context menu items and order,
@@ -75,12 +79,16 @@ Go through these areas. Skip an area if it doesn't apply, but say so in one line
75
79
allocations in hot paths, repeated PowerShell/process calls) *and* in the UI (UI thread blocked, too many
76
80
`Dispatcher.Invoke` calls per result, large collections updated item by item, `CanExecute` doing
77
81
expensive work, missing virtualization in large grids, timers that keep running when the view is hidden).
78
-
The UI has to stay smooth while a scan runs.
82
+
The UI has to stay smooth while a scan runs. Estimate the worst-case duration with the default settings for a
83
+
typical input (e.g. an empty /24): rounds per item (items ÷ concurrency) × timeout, for every probe — the slowest
84
+
probe decides when a result and the progress appear. Also check synchronous work on the UI thread after the action
85
+
(export, sorting, large `Clear`/`Add` loops).
79
86
5.**Missing essentials** — functions a user would expect for this kind of tool, especially ones that
80
87
similar tools in the app already have (export, copy, history, cancel, profile support, search/filter,
81
88
multi-select actions, refresh, keyboard shortcuts). Separate small gaps (fix directly) from larger
82
89
features (write an issue draft, see below).
83
-
6.**Robustness and security** — input passed to PowerShell/command lines/processes without escaping,
90
+
6.**Robustness and security** — input passed to PowerShell/command lines/processes without escaping (also values
91
+
received from the network, e.g. hostnames in custom commands),
84
92
credentials in logs or plain text, unvalidated input, behaviour without admin rights, behaviour when
85
93
an external dependency (PuTTY, WebView2, API) is missing or fails.
86
94
7.**Localization and texts** — hard-coded user-visible strings, strings used for multiple meanings,
@@ -144,7 +152,15 @@ the motivation, a proposed behaviour (UI + logic), and which existing feature it
144
152
145
153
### 7. After the report
146
154
147
-
Don't change code during the review. Ask the user which findings to fix. When fixing:
155
+
Don't change code during the review. Ask the user which findings to fix.
156
+
157
+
When the user wants the work handed over (to another agent or for later), write the result to
158
+
`.claude/reviews/<feature>.md` (kebab-case, e.g. `ip-scanner.md`; the folder is not committed). Write it as an
159
+
implementation plan, not as a report: verified findings with `path:line`, the concrete fix, the work packages / PR
160
+
order, decisions taken and still open, and what must be tested on Windows. Read existing files in `.claude/reviews/`
161
+
and `.claude/plans/` for the area first — they record earlier decisions.
162
+
163
+
When fixing:
148
164
149
165
- Follow the conventions and keep the change minimal; extract shared helpers only when the same code
Copy file name to clipboardExpand all lines: .claude/skills/feature-review/references/integration-map.md
+8-5Lines changed: 8 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -16,7 +16,8 @@ sort the hits into the categories below. Some names differ between places (e.g.
16
16
| Area | Location | What to check there |
17
17
|---|---|---|
18
18
| Registration |`Source/NETworkManager.Models/ApplicationName.cs`, `ApplicationManager.cs` (name, icon, default visibility) | Icon matches the one used elsewhere for the tool |
19
-
| Main window |`Source/NETworkManager/MainWindow.xaml.cs` — view creation (`case ApplicationName.X`), `OnViewHide`/`OnViewVisible`, `AddTab(...)` for "open in other tool" | View lifecycle: what keeps running when hidden |
19
+
| Main window |`Source/NETworkManager/MainWindow.xaml.cs` — view creation (`case ApplicationName.X`), `OnViewHide`/`OnViewVisible`, `NavigationManager_ApplicationRequested` (passes requests to the view) | View lifecycle: what keeps running when hidden |
20
+
| Navigation ("open in other tool") |`Source/NETworkManager/NavigationManager.cs` (`Open(request)`, `OpenSettings()`), `ApplicationRequest.cs` (`Target`, `Profile`, `Start` + derived requests like `PortScannerRequest`, `WakeOnLANRequest`), `IApplicationRequestHandler` implemented by `<Tool>HostView.xaml.cs` (`Open(request)` → `AddTab(...)`) | Tool accepts target **and** profile, honours `Start = false` (fill in only), context menu items of other tools use `NavigationManager.Open`|
20
21
| Business logic |`Source/NETworkManager.Models/<Tool>/` or `Source/NETworkManager.Models/Network/<Tool>*.cs` (+ `*Options`, `*Info`, `*Args`) | Bugs, performance, cancellation, events |
21
22
| View model |`Source/NETworkManager/ViewModels/<Tool>ViewModel.cs`, `<Tool>HostViewModel.cs` (tabs + profiles), `<Tool>SettingsViewModel.cs`, dialog view models | Commands, `CanExecute`, state flags, threading |
@@ -26,8 +27,8 @@ sort the hits into the categories below. Some names differ between places (e.g.
26
27
| Profiles |`Source/NETworkManager.Profiles/ProfileInfo.cs` (`<Tool>_*` fields), `ProfileName.cs`, `ProfileViewManager.cs`, `Application/<Tool>.cs` (build session info from profile + group), `GroupInfo.cs` / `GroupViewName.cs` (group-level settings) | Profile field ↔ group inheritance ↔ settings fallback |
27
28
| Profile UI |`Source/NETworkManager/ViewModels/ProfileViewModel.cs`, `Views/ProfileChildWindow.xaml` (tool tab), `Views/GroupChildWindow.xaml`, `ProfileDialogManager.cs`| Same fields, labels and validation in profile, group and settings |
28
29
| Export |`Source/NETworkManager.Models/Export/ExportManager.<Tool>*.cs`, `ExportChildWindow`| Same columns/formats as similar tools |
29
-
| Run command |`Source/NETworkManager/RunCommandManager.cs`| Arguments/placeholder accepted|
30
-
| Documentation |`Source/NETworkManager.Documentation/DocumentationManager.cs` (help links), `Website/docs/application/<tool>.md`, `Website/docs/settings/*.md`, `Website/docs/commandline-arguments.md`| Docs match behaviour, defaults and shortcuts |
30
+
| Run command |`Source/NETworkManager/RunCommandManager.cs`(command/aliases in `CreateCommands`, suggested apps per target kind in `TargetApplications`, target/argument validators in `ValidateTarget`, request in `CreateRequest`), parser in `Source/NETworkManager.Models/RunCommand/`, dialog `RunCommandViewModel` / `RunCommandChildWindow`, docs `Website/docs/run-command.md`| Same validator as the tool's input field and profile dialog; new options of the tool (e.g. a new input) are reachable via argument/type or deliberately not; command table in the docs matches|
31
+
| Documentation |`Source/NETworkManager.Documentation/DocumentationManager.cs` (help links), `Website/docs/application/<tool>.md`, `Website/docs/settings/*.md`, `Website/docs/commandline-arguments.md`, `Website/docs/run-command.md`| Docs match behaviour, defaults and shortcuts |
31
32
| Strings |`Source/NETworkManager.Localization/Resources/Strings.resx` (+ `Strings.Designer.cs`) | Only `Strings.resx` (English) is edited; other languages come from Transifex |
32
33
| Styles |`Source/NETworkManager/Resources/Styles/*.xaml` (buttons, text blocks, tooltips, rectangles) | Shared styles used instead of local ones |
Copy file name to clipboardExpand all lines: AGENTS.md
+27-3Lines changed: 27 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -425,8 +425,12 @@ git diff
425
425
3. Add the tool to `ApplicationName` and `ApplicationManager` (`Source/NETworkManager.Models/`), and show/hide it
426
426
in `MainWindow.xaml.cs` (`OnApplicationViewVisible` / `OnApplicationViewHide`)
427
427
4. Add it to the application list for existing users in `SettingsManager` (upgrade step)
428
-
5. Add documentation in `Website/docs/application/` and map it in `DocumentationManager`
429
-
6. Add localization strings and a changelog entry
428
+
5. If the tool accepts a target or profile: implement `IApplicationRequestHandler` in its (host) view and add a run
429
+
command in `RunCommandManager` (command, aliases, validator = the one of the input field; suggestions in
430
+
`TargetApplications`), see [Navigation and Run Command](#navigation-and-run-command)
431
+
6. Add documentation in `Website/docs/application/` (and the command table in `Website/docs/run-command.md`) and map it
432
+
in `DocumentationManager`
433
+
7. Add localization strings and a changelog entry
430
434
431
435
### Adding a New Setting
432
436
@@ -486,6 +490,23 @@ git diff
486
490
-**Groups**: Hierarchical organization
487
491
-**Import/Export**: Profile sharing capabilities
488
492
493
+
### Navigation and Run Command
494
+
495
+
-**Open a tool from code**: `NavigationManager.Open(new ApplicationRequest(ApplicationName.X) { Target = ... })` or a
496
+
derived request with extra options (`ApplicationRequest.cs`: `PortScannerRequest`, `DNSLookupRequest`, `RDAPRequest`,
497
+
`WakeOnLANRequest`, `SubnetCalculatorRequest`, `LookupRequest`). Used for "open in other tool" context menus
498
+
(e.g. IP Scanner, Traceroute, Network Interface) and the run command. `Profile` runs a profile, `Start = false` only fills in the input.
499
+
-**MainWindow** switches to the tool and calls `IApplicationRequestHandler.Open(request)` on its view (host views call
500
+
`AddTab(...)`). Don't reference other tools' views or view models directly.
501
+
-**Run command** (`Ctrl+Shift+P`, title bar box, optional global hotkey): parser in
502
+
`Source/NETworkManager.Models/RunCommand/`, commands, validation and requests in `Source/NETworkManager/RunCommandManager.cs`,
503
+
dialog in `RunCommandViewModel` / `RunCommandChildWindow`, docs in `Website/docs/run-command.md`. The run command must
504
+
validate a target with the same validator as the tool's input field and profile dialog.
505
+
-**Large lists**: `ObservableRangeCollection<T>.ReplaceAll(items)` (`Source/NETworkManager.Controls/`) replaces all items
506
+
with a single `Reset` notification. Use it for lists that are reloaded completely (e.g. Firewall rules, run command
507
+
suggestions); not for results that are appended while a scan runs (those are buffered and flushed by a timer, see
508
+
`IPScannerViewModel`).
509
+
489
510
### Embedded Tools Integration
490
511
491
512
-**Remote Desktop**: Native RDP using `AxMSTSCLib`, `AxMsRdpClient10NotSafeForScripting` and `WindowsFormsHost`
@@ -508,7 +529,10 @@ git diff
508
529
11.**Check CI Status**: Both AppVeyor (main build) and GitHub Actions (CodeQL, website) must pass
509
530
12.**Dependency Updates**: Dependabot automatically creates PRs for dependency updates
510
531
13.**Conventions and reviews**: Read `.claude/skills/feature-review/references/conventions.md` before changing UI or ViewModel code; use the `feature-review` skill to review a whole tool
511
-
14.**Windows only**: The solution can't be built on Linux/macOS (WPF, CsWinRT) — say so when changes couldn't be compiled, and list what needs to be tested on Windows
532
+
14.**Plans and reviews**: Local (not committed) plans and review results are in `.claude/plans/` and `.claude/reviews/`
533
+
(e.g. `.claude/reviews/ip-scanner.md`). Read the file for the area you work on first — it lists verified findings,
534
+
decisions and open items
535
+
15.**Windows only**: The solution can't be built on Linux/macOS (WPF, CsWinRT) — say so when changes couldn't be compiled, and list what needs to be tested on Windows
0 commit comments