Skip to content

Commit 00dc14a

Browse files
committed
v0.9.0: ten-feature competitive pass, headless CLI, OSS hygiene, audit hardening
Adds DeepPurge.Cli (asInvoker scriptable headless companion) and a 7-panel SYSTEM TOOLS section in the GUI covering Driver Store, Startup Impact, Broken Shortcuts, Duplicate Files, Community Cleaners (winapp2), Repair Windows (sfc/DISM/chkdsk/cache rebuild), Scheduled Cleaning, plus an About/Updates panel. Ships portable mode, install-manifest snapshot+replay, GitHub Releases update check, and a 14-point "doctor" self-test. Ten new Core services: DataPaths, DriverStoreScanner, StartupImpactCalculator, WindowsRepairEngine, ShortcutRepairScanner, Winapp2Parser+Runner, DuplicateFinder, InstallSnapshotEngine, ScheduleManager, UpdateChecker, plus supporting Log + SelfTest + SafeListConverters. Production hardening pass closed real defects uncovered during audit: UpdateChecker 3-part-vs-4-part version-compare false positive; ScheduleManager quote-escape + per-job .cmd wrapper; StartupImpact namespace-safe XML walk; Winapp2 DetectOS/DetectFile bucket routing; ShortcutRepairScanner STA apartment + COM release + Recycle Bin delete; DriverStoreScanner schema-agnostic XML + text parser + OEM codepage; DuplicateFinder ArrayPool + sort-safety; InstallSnapshotEngine parallel walks + gzip + pruning + atomic write; WindowsRepairEngine narrow cache deletes + correct encoding; DataPaths error propagation; MainViewModel CTS lifetime via RenewCts helper; AutorunScanner ProcessNameSet snapshot eliminating per-entry Process handle leak and O(N*M) re-enumeration; UninstallEngine silent-mode stdout + empty-string guard + HKU + no silent recycle-to-permanent fallback; App.xaml.cs version from assembly; XAML binding safety via FirstOrEmpty/Count converters; Repair output StringBuilder coalesced flush; v0.9 panel MaybeAutoLoad guard. Ships OSS hygiene: SECURITY, CONTRIBUTING, ARCHITECTURE, ROADMAP, issue + PR templates, dependabot weekly scan, CodeQL security-and-quality workflow, .gitattributes line-ending discipline, .gitignore polish; Authenticode signing hooks (Build.ps1 -Sign with SecureString), -Test switch; winget + Scoop manifests with real SHA256 hashes; GitHub Actions build + release workflows; xUnit test project (105 tests) locking in parser / sanitiser / threshold behaviour. Build: 6 projects, 0 errors, 0 warnings. dotnet test: 105 passed. Publish: GUI 65.3 MB + CLI 65.1 MB (self-contained, compressed).
1 parent 07f03d0 commit 00dc14a

61 files changed

Lines changed: 6331 additions & 169 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitattributes

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Normalise line endings. Text in the repo is LF; tooling handles CRLF on checkout.
2+
* text=auto eol=lf
3+
4+
# Source: always LF.
5+
*.cs text eol=lf diff=csharp
6+
*.csproj text eol=lf
7+
*.sln text eol=lf
8+
*.md text eol=lf
9+
*.yml text eol=lf
10+
*.yaml text eol=lf
11+
*.json text eol=lf
12+
*.xml text eol=lf
13+
*.xaml text eol=lf
14+
15+
# Windows scripts must keep CRLF or they won't parse correctly.
16+
*.bat text eol=crlf
17+
*.cmd text eol=crlf
18+
*.ps1 text eol=crlf
19+
*.psm1 text eol=crlf
20+
*.psd1 text eol=crlf
21+
*.manifest text eol=crlf
22+
23+
# Binary assets — no line-ending conversion, no diff.
24+
*.exe binary
25+
*.dll binary
26+
*.ico binary
27+
*.png binary
28+
*.jpg binary
29+
*.jpeg binary
30+
*.gif binary
31+
*.webp binary
32+
*.pfx binary
33+
*.snk binary
34+
*.zip binary
35+
*.7z binary
36+
*.tar.gz binary
37+
38+
# GitHub linguist — mark generated / packaging from language stats.
39+
packaging/** linguist-vendored
40+
.github/** linguist-generated=false
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
name: Bug report
2+
description: Something is wrong or isn't doing what it claims.
3+
title: "[bug] "
4+
labels: ["bug", "triage"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
Thanks for reporting. A few things that make this fast to triage:
10+
1. Run `deeppurgecli doctor` from an elevated shell and paste the output.
11+
2. Tell me which panel / CLI command you were using.
12+
3. If it's a UI issue, a screenshot helps more than a description.
13+
14+
- type: input
15+
id: version
16+
attributes:
17+
label: DeepPurge version
18+
description: From the About panel, or `deeppurgecli version`.
19+
placeholder: "0.9.0"
20+
validations:
21+
required: true
22+
23+
- type: dropdown
24+
id: surface
25+
attributes:
26+
label: Surface
27+
options:
28+
- GUI
29+
- CLI
30+
- Both
31+
validations:
32+
required: true
33+
34+
- type: textarea
35+
id: what-happened
36+
attributes:
37+
label: What happened
38+
description: What did you expect, and what actually happened?
39+
validations:
40+
required: true
41+
42+
- type: textarea
43+
id: repro
44+
attributes:
45+
label: Reproduction steps
46+
placeholder: |
47+
1. Open the Drivers panel
48+
2. Click Rescan
49+
3. ...
50+
validations:
51+
required: true
52+
53+
- type: textarea
54+
id: doctor
55+
attributes:
56+
label: deeppurgecli doctor output
57+
description: Paste the full doctor output from an elevated shell.
58+
render: text
59+
60+
- type: textarea
61+
id: logs
62+
attributes:
63+
label: Relevant log lines
64+
description: From %LocalAppData%\DeepPurge\Logs\deeppurge.log (or Data\Logs\ in portable mode).
65+
render: text
66+
67+
- type: checkboxes
68+
id: confirms
69+
attributes:
70+
label: Confirm
71+
options:
72+
- label: I am running the latest 0.9.x release
73+
required: true
74+
- label: I am not reporting a security vulnerability (those go to SECURITY.md)
75+
required: true

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
blank_issues_enabled: false
2+
contact_links:
3+
- name: Security vulnerability
4+
url: https://github.com/SysAdminDoc/DeepPurge/blob/main/SECURITY.md
5+
about: Please report security issues privately — see SECURITY.md.
6+
- name: Ask a question (discussion)
7+
url: https://github.com/SysAdminDoc/DeepPurge/discussions
8+
about: For usage questions or design discussion, use Discussions rather than Issues.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
name: Feature request
2+
description: Suggest a new capability or a change to an existing one.
3+
title: "[feature] "
4+
labels: ["enhancement", "triage"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
Before filing, skim [ROADMAP.md](../../blob/main/ROADMAP.md) — the feature may already be queued,
10+
or explicitly on the "will not ship" list with a reason.
11+
12+
- type: textarea
13+
id: problem
14+
attributes:
15+
label: Problem
16+
description: What are you trying to do that DeepPurge doesn't support?
17+
validations:
18+
required: true
19+
20+
- type: textarea
21+
id: proposal
22+
attributes:
23+
label: Proposed solution
24+
description: What would a good user experience look like?
25+
validations:
26+
required: true
27+
28+
- type: textarea
29+
id: alternatives
30+
attributes:
31+
label: Alternatives considered
32+
description: Existing tools / workarounds. Helps me understand how much leverage this gives.
33+
34+
- type: textarea
35+
id: references
36+
attributes:
37+
label: Reference implementations
38+
description: BCU / BleachBit / Revo / etc. that already solve this. Links welcome.

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<!-- Short, single-concern PRs merge fastest. If this is a bug fix + new feature, split. -->
2+
3+
## What
4+
5+
<!-- One or two sentences describing the change. -->
6+
7+
## Why
8+
9+
<!-- The motivation. Linked issue number if any: closes #123 -->
10+
11+
## How
12+
13+
<!-- Brief technical notes: which files / patterns / tradeoffs. -->
14+
15+
## Merge checklist
16+
17+
- [ ] `dotnet build DeepPurge.sln -c Release` — 0 errors, 0 warnings
18+
- [ ] `dotnet test tests/DeepPurge.Tests/DeepPurge.Tests.csproj` — all tests pass
19+
- [ ] If parser / sanitiser / detector: added a test that locks in the new behaviour
20+
- [ ] CHANGELOG.md updated (under Unreleased or the next version heading)
21+
- [ ] Version bumped if user-visible (see CONTRIBUTING.md "Version bump")
22+
- [ ] No direct `%LocalAppData%\DeepPurge` references — all per-user paths go through `DataPaths`
23+
- [ ] No new `bool` arguments on destructive pipelines — extend `DeleteOptions` instead
24+
- [ ] SafetyGuard still blocks all previously-protected paths (no regressions in SafetyGuardTests)
25+
26+
<!-- Thanks! -->

.github/dependabot.yml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
version: 2
2+
updates:
3+
- package-ecosystem: "nuget"
4+
directory: "/"
5+
schedule:
6+
interval: "weekly"
7+
day: "monday"
8+
time: "05:00"
9+
open-pull-requests-limit: 5
10+
groups:
11+
test-stack:
12+
patterns:
13+
- "xunit*"
14+
- "Microsoft.NET.Test.Sdk"
15+
mvvm:
16+
patterns:
17+
- "CommunityToolkit.*"
18+
labels:
19+
- "dependencies"
20+
- "nuget"
21+
22+
- package-ecosystem: "github-actions"
23+
directory: "/"
24+
schedule:
25+
interval: "weekly"
26+
labels:
27+
- "dependencies"
28+
- "ci"

.github/workflows/build.yml

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
name: Build
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
branches: [main]
8+
workflow_dispatch:
9+
10+
jobs:
11+
build:
12+
runs-on: windows-latest
13+
timeout-minutes: 20
14+
15+
steps:
16+
- uses: actions/checkout@v4
17+
18+
- name: Setup .NET 8
19+
uses: actions/setup-dotnet@v4
20+
with:
21+
dotnet-version: '8.0.x'
22+
23+
- name: Restore
24+
run: dotnet restore DeepPurge.sln
25+
26+
- name: Build
27+
run: dotnet build DeepPurge.sln -c Release --no-restore
28+
29+
- name: Test
30+
run: dotnet test tests/DeepPurge.Tests/DeepPurge.Tests.csproj -c Release --no-build --verbosity normal
31+
32+
- name: Publish GUI
33+
run: >
34+
dotnet publish src/DeepPurge.App/DeepPurge.App.csproj
35+
-c Release -r win-x64 --self-contained true
36+
-p:PublishSingleFile=true -p:EnableCompressionInSingleFile=true
37+
-p:DebugType=none -p:DebugSymbols=false
38+
--output build --nologo
39+
40+
- name: Publish CLI
41+
run: >
42+
dotnet publish src/DeepPurge.Cli/DeepPurge.Cli.csproj
43+
-c Release -r win-x64 --self-contained true
44+
-p:PublishSingleFile=true -p:EnableCompressionInSingleFile=true
45+
-p:DebugType=none -p:DebugSymbols=false
46+
--output build --nologo
47+
48+
- name: Drop extras
49+
shell: pwsh
50+
run: |
51+
Get-ChildItem build -Exclude 'DeepPurge.exe','DeepPurgeCli.exe' |
52+
Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
53+
54+
- name: Upload artifacts
55+
uses: actions/upload-artifact@v4
56+
with:
57+
name: DeepPurge-win-x64
58+
path: build/*.exe
59+
retention-days: 14

.github/workflows/codeql.yml

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
name: CodeQL
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
branches: [main]
8+
schedule:
9+
# Weekly scan on Sunday 03:17 UTC — off-hours, avoids the Monday dependabot burst.
10+
- cron: "17 3 * * 0"
11+
12+
permissions:
13+
actions: read
14+
contents: read
15+
security-events: write
16+
17+
jobs:
18+
analyze:
19+
runs-on: windows-latest
20+
timeout-minutes: 45
21+
strategy:
22+
fail-fast: false
23+
matrix:
24+
language: ['csharp']
25+
26+
steps:
27+
- uses: actions/checkout@v4
28+
29+
- name: Setup .NET 8
30+
uses: actions/setup-dotnet@v4
31+
with:
32+
dotnet-version: '8.0.x'
33+
34+
- name: Init CodeQL
35+
uses: github/codeql-action/init@v3
36+
with:
37+
languages: ${{ matrix.language }}
38+
queries: security-and-quality
39+
40+
- name: Build
41+
run: dotnet build DeepPurge.sln -c Release
42+
43+
- name: Analyze
44+
uses: github/codeql-action/analyze@v3
45+
with:
46+
category: "/language:${{ matrix.language }}"

0 commit comments

Comments
 (0)