Installation
- Download
DevWatchdog-3.3.0.zipbelow - Unzip and move
DevWatchdog.appto/Applications - First launch: right-click → Open (ad-hoc signed; Gatekeeper requires one-time approval)
Added
- cwd-basierte Projekterkennung (G2) — hinter neuem Feature-Flag
useCwdProjectDetection(Default: aus). Liest das Arbeitsverzeichnis via
proc_pidinfo(PROC_PIDVNODEPATHINFO)und löst es über einen
Projekt-Root-Walker (.git,package.json,Cargo.toml,go.mod,
pyproject.toml,Podfile,Package.swift) zum korrekten Projektnamen auf
(leaf-wins für Monorepos). Behebt die Regressionsgrenze, dass
~/Projects/Archiv/DevWatchdog/den Marker"Archiv"statt"DevWatchdog"
liefert. Wirkt nur im libproc-Pfad.DevProcesshat neue Felder
workingDirectoryunddetectedProject; das bestehendeprojectName
bevorzugtdetectedProject, wenn gesetzt. Closes GitLab #35. - Signal-basierter Dev-Klassifier (G1) — hinter neuem Feature-Flag
useSignalClassifier(Default: aus). Vier orthogonale Heuristiken
(Executable-Pfad, cwd, Parent-Prozess, Bundle-Identifier) ersetzen die
Wortlisten-Erstklassifikation. Harter Ausschluss für Nicht-Dev-Bundles
(z. B.com.slack.,com.notion., Browser) wird von einer
Dev-Allowlist überschrieben (VSCode, Cursor, iTerm2, Terminal, Warp).
.unknown-Urteile fallen zur Wortliste zurück — existierende
defaultInclusionPatterns/defaultExcludedAppsbleiben unverändert.
Wirkt nur im libproc-Pfad. Closes #36. - Zwei neue Settings-Toggles unter „Entwickler" für die oben genannten
Flags, im gleichen „Experimentell —" Muster wie der libproc-Scanner. - 46 neue Unit-/Integrationstests (
ProcPIDInfoCwdTests,
ProjectRootResolverTests,DevProcessClassifierTests,
LibProcSignalClassifierTests). Test-Baseline 335 → 381. - libproc-basierter Prozess-Enumerator (opt-in, Feature-Flag) — neuer
LibProcProcessEnumeratornutztproc_listpids+proc_pidinfodirekt
und ersetzt den/bin/ps-Subprocess-Pfad, wennuseLibprocEnumerator
unter Einstellungen → Entwickler aktiviert ist. Defaultfalse; gleiche
DevProcess-Ausgabe wiePSParser; identische Filter-Semantik
(Inclusion-Patterns, Excluded-Apps, Playwright-Ausnahme,
/Applications/-Heuristik). Scan-Dauer wird auf beiden Backends für
Vorher/Nachher-Vergleich geloggt. Bekannte MVP-Divergenzen:
commandist nur Exec-Pfad (nicht volles argv); CPU% ist kumulativ seit
Start (Delta-Sampling deferred). Closes GitLab #34 (G5).
Fixed
- GitHub-Actions-CI grün auf Xcode 16.2 / Swift 6.0 strict concurrency — drei
non-sendable type-Fehler inSystemPressureMonitor.swiftwurden durch zwei
neue@unchecked Sendable-Wrapper beseitigt:SendableCurrentValueSubject
kapselt CombinesCurrentValueSubject(nicht formalSendablein 6.0) und
SendableDispatchSourcekapseltany DispatchSourceMemoryPressurefür den
@Sendable-Handler-Closure. Lokal unter Xcode 26 / Swift 6.2 unverändert grün;
CI-Runner zieht jetzt auf Xcode 16.4 (war 16.2) für konsistente Swift-6.0-GA-Baseline. - Popover bleibt offen, Buttons reagieren nicht (Regression seit v3.2.0,
NSStatusItem-Umbau). LSUIElement-App braucht explizites
NSApp.activate(ignoringOtherApps: true)bevor das Popover gezeigt wird —
sonst kann das Popover-Window nicht key werden, SwiftUI-Buttons (Beenden,
Einstellungen, Protokoll, Kill-CTAs) feuern nicht, und.transient-Dismissal
bleibt aus. Zusätzlich verhinderteNSHostingViewüber dem Status-Button
durch eigenes Hit-Testing das Toggle-Verhalten; Label-Host ist jetzt eine
PassthroughHostingView, die Klicks an den darunter liegendenNSButton
durchreicht. Closes GitLab #38. - ActionBar ohne Inhalt bei einem einzelnen aktiven Suspect — 16 px leeres
Padding + Divider, wenn genau ein aktiver Suspect ohne Zombies/Idle vorlag,
weil die CTA-Logik nur beicount > 1einen Button rendert. Gate prüft jetzt
viahasActionBarContentdie tatsächlichen CTA-Conditions. Closes #39. - Header-Pill abgeschnitten bei hohen CPU-Werten — Popover-Breite
380 → 400 px, Pill + Timestamp-VStack hatminWidth: 90. Closes #40. - Swap-Zeile zeigte Compression-Rate — die
↑ x/s-Rate ist ausschließlich
Compression-Rate; wird jetzt nur im "Compressed"-Modus gerendert, nicht wenn
die Zeile auf "Swap" flippt. Closes #41.
Changed
- Pause/Fortsetzen jetzt auch für gruppierte Prozesse —
ProcessGroupRowView
reichtonThrottle/onResumean expandierte Kind-Rows durch. Imbun (4)-
Menü stehen damit Pausieren und Fortsetzen zur Verfügung. Closes #42. - Panic-Button visuell sekundär — im Header nur noch Bolt-Icon; ab 10+
Targets erscheint der Count als kleines Badge daneben. Tooltip enthält den
aktuellen Count. Hotkey⌘⇧⌥Punverändert. Closes #43. - Empty-State kontextsensitiv — Copy unterscheidet jetzt zwischen
normal
("Alles sauber"),elevated("Vorerst sauber") undemergency("Keine
Targets mehr · System-Druck noch hoch, Scanner greift sofort zu"). Behebt den
visuellen Widerspruch zwischen pulsierendem Emergency-Banner und grünem
"Alles sauber"-Check. Closes #44. - Footer: "Log" → "Protokoll" — einheitlich deutsch. SessionLogView-Titel
entsprechend angepasst ("Session-Protokoll"). Closes #45. - CPU-Farbskala skaliert jetzt mit
ncpu— 100 % CPU auf einer 12-Kern-
Maschine ist keine Warnfarbe mehr wert; rot ab ≥ 15 % Gesamt-Kapazität,
orange ab ≥ 5 %. Gilt für Einzel- und Gruppenzeilen. Closes #46. - CI-Infrastruktur modernisiert —
.github/workflows/build.ymlpinnt jetzt
Xcode 16.4 (letzte Stable-16-Serie mit Swift-6.0-GA-Korrekturen) und unterstützt
manuellesworkflow_dispatch. Neuer Release-Workflow (release.yml) triggert
aufv*-Tags, baut Release-Konfiguration, packt.appviadittoals ZIP
und erstellt GitHub Release mit CHANGELOG-Auszug +--generate-notes.
.gitlab-ci.ymlspiegelt Build+Release. Beide Workflows mit minimalen Token-
Scopes (contents: readfür Build,contents: writefür Release) und
env-var-Indirection für user-supplied Tag-Inputs (Injection-Schutz).
Security
- Release-Workflow-Härtung —
${{ inputs.tag }}(workflow_dispatch) wird
jetzt überenv:in Shell-Variablen gemappt, nie direkt inrun:-Blöcke
inline-interpoliert. Gleiches Pattern für alle${{ steps.*.outputs.* }}-
Referenzen. Zusätzliche Tag-Format-Validierung (^v[0-9]+\.[0-9]+\.[0-9]+$)
verhindert freie-Text-Injection.build.ymlbekommt explizites
permissions: contents: read(minimal-privilege).
Full Changelog: v3.2.0...v3.3.0