Skip to content
Merged

Dev #21

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
3180147
feat(clean): utilitarios de filesystem com guarda de caminhos protegidos
richardfariax Jul 22, 2026
14847f4
feat(clean): catalogo com 31 regras curadas de limpeza segura
richardfariax Jul 22, 2026
e09244a
feat(clean): motor de limpeza com selecao por item e contador vitalicio
richardfariax Jul 22, 2026
80287dc
feat(clean): inventario de launch agents e processos pesados
richardfariax Jul 22, 2026
4094cda
feat(clean): tarefas de manutencao com prompt admin nativo
richardfariax Jul 22, 2026
6dcff06
feat(clean): inventario de apps com deteccao de sobras
richardfariax Jul 22, 2026
d15813b
feat(clean): busca de duplicatas exatas por SHA-256
richardfariax Jul 22, 2026
9b85940
feat(clean): imagens similares via dHash perceptual
richardfariax Jul 22, 2026
d02ecd3
feat(clean): varredura de arquivos grandes e antigos
richardfariax Jul 22, 2026
7d88ff9
feat(clean): arvore de tamanhos para a lupa de espaco
richardfariax Jul 22, 2026
3532dce
feat(clean): revisao heuristica de itens de inicializacao
richardfariax Jul 22, 2026
2e225b2
feat(clean-ui): shell do CleanFlow com sidebar, temas por modulo e co…
richardfariax Jul 22, 2026
f42191b
feat(clean-ui): analise inteligente com limpeza segura em 1 clique
richardfariax Jul 22, 2026
2712aa7
feat(clean-ui): hero de limpeza e gerenciador claro com selecao por item
richardfariax Jul 22, 2026
bcab89c
feat(clean-ui): desempenho com tarefas, inicializacao e processos
richardfariax Jul 22, 2026
c747dd9
feat(clean-ui): desinstalador de apps com revisao de sobras
richardfariax Jul 22, 2026
bc87383
feat(clean-ui): meu acumulo com duplicatas e imagens similares
richardfariax Jul 22, 2026
ae976b7
feat(clean-ui): grandes e antigos com filtro de tamanho minimo
richardfariax Jul 22, 2026
9ba2e29
feat(clean-ui): lupa de espaco com bolhas proporcionais interativas
richardfariax Jul 22, 2026
479c64e
feat(clean-ui): protecao com achados, alertas e quarentena
richardfariax Jul 22, 2026
5c5fc13
feat(clean-ui): janela dedicada do CleanFlow
richardfariax Jul 22, 2026
762f2b7
feat(menu-bar): item Abrir CleanFlow integrado ao ciclo do app
richardfariax Jul 22, 2026
c300877
chore(xcodeproj): registra os 19 arquivos do modulo CleanFlow
richardfariax Jul 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 84 additions & 0 deletions ClipFlow.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,27 @@
F1000000000000000000000C /* MetricsPopoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2000000000000000000000C /* MetricsPopoverView.swift */; };
F1000000000000000000000D /* ActivityMonitorLauncher.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2000000000000000000000D /* ActivityMonitorLauncher.swift */; };
F1000000000000000000000E /* FanMetricsSampler.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2000000000000000000000E /* FanMetricsSampler.swift */; };
C10000000000000000000001 /* CleanSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20000000000000000000001 /* CleanSupport.swift */; };
C10000000000000000000002 /* JunkScanService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20000000000000000000002 /* JunkScanService.swift */; };
C10000000000000000000003 /* StartupItemsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20000000000000000000003 /* StartupItemsService.swift */; };
C10000000000000000000004 /* AppInventoryService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20000000000000000000004 /* AppInventoryService.swift */; };
C10000000000000000000005 /* DuplicateFinderService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20000000000000000000005 /* DuplicateFinderService.swift */; };
C10000000000000000000006 /* LargeOldFilesService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20000000000000000000006 /* LargeOldFilesService.swift */; };
C10000000000000000000007 /* DiskMapService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20000000000000000000007 /* DiskMapService.swift */; };
C10000000000000000000008 /* ProtectionService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20000000000000000000008 /* ProtectionService.swift */; };
C10000000000000000000009 /* CleanCenterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20000000000000000000009 /* CleanCenterView.swift */; };
C1000000000000000000000A /* SmartScanView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2000000000000000000000A /* SmartScanView.swift */; };
C1000000000000000000000B /* JunkCleanView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2000000000000000000000B /* JunkCleanView.swift */; };
C1000000000000000000000C /* SpeedupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2000000000000000000000C /* SpeedupView.swift */; };
C1000000000000000000000D /* AppsManagerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2000000000000000000000D /* AppsManagerView.swift */; };
C1000000000000000000000E /* DuplicatesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2000000000000000000000E /* DuplicatesView.swift */; };
C1000000000000000000000F /* LargeFilesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2000000000000000000000F /* LargeFilesView.swift */; };
C10000000000000000000010 /* DiskMapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20000000000000000000010 /* DiskMapView.swift */; };
C10000000000000000000011 /* ProtectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20000000000000000000011 /* ProtectionView.swift */; };
C10000000000000000000012 /* CleanCenterWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20000000000000000000012 /* CleanCenterWindowController.swift */; };
C10000000000000000000013 /* CleanupRuleCatalog.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20000000000000000000013 /* CleanupRuleCatalog.swift */; };
C10000000000000000000014 /* MaintenanceService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20000000000000000000014 /* MaintenanceService.swift */; };
C10000000000000000000015 /* SimilarImagesService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20000000000000000000015 /* SimilarImagesService.swift */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -166,6 +187,27 @@
F20000000000000000000007 /* CacheMaintenanceService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CacheMaintenanceService.swift; sourceTree = "<group>"; };
F20000000000000000000008 /* MenuBarSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuBarSettingsView.swift; sourceTree = "<group>"; };
F20000000000000000000009 /* MaintenanceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MaintenanceView.swift; sourceTree = "<group>"; };
C20000000000000000000001 /* CleanSupport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/CleanSupport.swift; sourceTree = "<group>"; };
C20000000000000000000002 /* JunkScanService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/JunkScanService.swift; sourceTree = "<group>"; };
C20000000000000000000003 /* StartupItemsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/StartupItemsService.swift; sourceTree = "<group>"; };
C20000000000000000000004 /* AppInventoryService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/AppInventoryService.swift; sourceTree = "<group>"; };
C20000000000000000000005 /* DuplicateFinderService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/DuplicateFinderService.swift; sourceTree = "<group>"; };
C20000000000000000000006 /* LargeOldFilesService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/LargeOldFilesService.swift; sourceTree = "<group>"; };
C20000000000000000000007 /* DiskMapService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/DiskMapService.swift; sourceTree = "<group>"; };
C20000000000000000000008 /* ProtectionService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/ProtectionService.swift; sourceTree = "<group>"; };
C20000000000000000000009 /* CleanCenterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/CleanCenterView.swift; sourceTree = "<group>"; };
C2000000000000000000000A /* SmartScanView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/SmartScanView.swift; sourceTree = "<group>"; };
C2000000000000000000000B /* JunkCleanView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/JunkCleanView.swift; sourceTree = "<group>"; };
C2000000000000000000000C /* SpeedupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/SpeedupView.swift; sourceTree = "<group>"; };
C2000000000000000000000D /* AppsManagerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/AppsManagerView.swift; sourceTree = "<group>"; };
C2000000000000000000000E /* DuplicatesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/DuplicatesView.swift; sourceTree = "<group>"; };
C2000000000000000000000F /* LargeFilesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/LargeFilesView.swift; sourceTree = "<group>"; };
C20000000000000000000010 /* DiskMapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/DiskMapView.swift; sourceTree = "<group>"; };
C20000000000000000000011 /* ProtectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/ProtectionView.swift; sourceTree = "<group>"; };
C20000000000000000000012 /* CleanCenterWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/CleanCenterWindowController.swift; sourceTree = "<group>"; };
C20000000000000000000013 /* CleanupRuleCatalog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/CleanupRuleCatalog.swift; sourceTree = "<group>"; };
C20000000000000000000014 /* MaintenanceService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/MaintenanceService.swift; sourceTree = "<group>"; };
C20000000000000000000015 /* SimilarImagesService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Clean/SimilarImagesService.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXGroup section */
Expand Down Expand Up @@ -294,6 +336,17 @@
F2000000000000000000000E /* FanMetricsSampler.swift */,
F20000000000000000000004 /* SystemMetricsService.swift */,
F20000000000000000000007 /* CacheMaintenanceService.swift */,
C20000000000000000000001 /* CleanSupport.swift */,
C20000000000000000000015 /* SimilarImagesService.swift */,
C20000000000000000000014 /* MaintenanceService.swift */,
C20000000000000000000013 /* CleanupRuleCatalog.swift */,
C20000000000000000000002 /* JunkScanService.swift */,
C20000000000000000000003 /* StartupItemsService.swift */,
C20000000000000000000004 /* AppInventoryService.swift */,
C20000000000000000000005 /* DuplicateFinderService.swift */,
C20000000000000000000006 /* LargeOldFilesService.swift */,
C20000000000000000000007 /* DiskMapService.swift */,
C20000000000000000000008 /* ProtectionService.swift */,
);
path = Services;
sourceTree = "<group>";
Expand Down Expand Up @@ -332,6 +385,16 @@
F20000000000000000000009 /* MaintenanceView.swift */,
F2000000000000000000000C /* MetricsPopoverView.swift */,
AAAA00000000000000000006 /* VoiceHUDController.swift */,
C20000000000000000000009 /* CleanCenterView.swift */,
C2000000000000000000000A /* SmartScanView.swift */,
C2000000000000000000000B /* JunkCleanView.swift */,
C2000000000000000000000C /* SpeedupView.swift */,
C2000000000000000000000D /* AppsManagerView.swift */,
C2000000000000000000000E /* DuplicatesView.swift */,
C2000000000000000000000F /* LargeFilesView.swift */,
C20000000000000000000010 /* DiskMapView.swift */,
C20000000000000000000011 /* ProtectionView.swift */,
C20000000000000000000012 /* CleanCenterWindowController.swift */,
);
path = Views;
sourceTree = "<group>";
Expand Down Expand Up @@ -446,6 +509,27 @@
buildActionMask = 2147483647;
files = (
A676EEDD45AFBD34937484B4 /* AppDelegate.swift in Sources */,
C10000000000000000000001 /* CleanSupport.swift in Sources */,
C10000000000000000000015 /* SimilarImagesService.swift in Sources */,
C10000000000000000000014 /* MaintenanceService.swift in Sources */,
C10000000000000000000013 /* CleanupRuleCatalog.swift in Sources */,
C10000000000000000000002 /* JunkScanService.swift in Sources */,
C10000000000000000000003 /* StartupItemsService.swift in Sources */,
C10000000000000000000004 /* AppInventoryService.swift in Sources */,
C10000000000000000000005 /* DuplicateFinderService.swift in Sources */,
C10000000000000000000006 /* LargeOldFilesService.swift in Sources */,
C10000000000000000000007 /* DiskMapService.swift in Sources */,
C10000000000000000000008 /* ProtectionService.swift in Sources */,
C10000000000000000000009 /* CleanCenterView.swift in Sources */,
C1000000000000000000000A /* SmartScanView.swift in Sources */,
C1000000000000000000000B /* JunkCleanView.swift in Sources */,
C1000000000000000000000C /* SpeedupView.swift in Sources */,
C1000000000000000000000D /* AppsManagerView.swift in Sources */,
C1000000000000000000000E /* DuplicatesView.swift in Sources */,
C1000000000000000000000F /* LargeFilesView.swift in Sources */,
C10000000000000000000010 /* DiskMapView.swift in Sources */,
C10000000000000000000011 /* ProtectionView.swift in Sources */,
C10000000000000000000012 /* CleanCenterWindowController.swift in Sources */,
C40894AEEAEF63A41EB3E8A3 /* AppSettings.swift in Sources */,
752C1FD4FCCA412B0D21BFDD /* BrandLogoView.swift in Sources */,
BBBB00000000000000000016 /* VoiceFieldView.swift in Sources */,
Expand Down
4 changes: 4 additions & 0 deletions ClipFlow/App/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
private var panelTargetApplication: NSRunningApplication?

private var settingsWindowController: NSWindowController?
private lazy var cleanCenterController = CleanCenterWindowController(settings: settings)

private var cancellables: Set<AnyCancellable> = []

Expand Down Expand Up @@ -404,6 +405,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
}
menuBarController = MenuBarController(
onOpenDashboard: openDashboard,
onOpenCleanCenter: { [weak self] in
self?.cleanCenterController.show()
},
onOpenPanel: { [weak self] in
self?.captureFrontmostExternalApplication()
self?.panelTargetApplication = self?.lastExternalApplication
Expand Down
18 changes: 18 additions & 0 deletions ClipFlow/Core/Managers/MenuBarController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,14 @@ final class MenuBarController: NSObject {
case toggleVoice = 1004
case checkUpdates = 1005
case systemMetrics = 1006
case openCleanCenter = 1007
}

private let statusItem: NSStatusItem
private let menu = NSMenu()

private let onOpenDashboard: () -> Void
private let onOpenCleanCenter: () -> Void
private let onOpenPanel: () -> Void
private let onOpenSettings: () -> Void
private let onCheckForUpdates: () -> Void
Expand All @@ -33,6 +35,7 @@ final class MenuBarController: NSObject {

init(
onOpenDashboard: @escaping () -> Void,
onOpenCleanCenter: @escaping () -> Void,
onOpenPanel: @escaping () -> Void,
onOpenSettings: @escaping () -> Void,
onCheckForUpdates: @escaping () -> Void,
Expand All @@ -46,6 +49,7 @@ final class MenuBarController: NSObject {
) {
self.statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)
self.onOpenDashboard = onOpenDashboard
self.onOpenCleanCenter = onOpenCleanCenter
self.onOpenPanel = onOpenPanel
self.onOpenSettings = onOpenSettings
self.onCheckForUpdates = onCheckForUpdates
Expand Down Expand Up @@ -103,6 +107,7 @@ final class MenuBarController: NSObject {
}

openDashboard.title = t("Abrir Central do Mac", "Open Mac Command Center")
menu.item(withTag: ItemTag.openCleanCenter.rawValue)?.title = t("Abrir CleanFlow", "Open CleanFlow")
openPanel.title = t("Abrir Clipboard", "Open Clipboard")
pause.title = t("Pausar Monitoramento", "Pause Monitoring")
voice.title = t("Comandos de Voz", "Voice Commands")
Expand Down Expand Up @@ -157,6 +162,15 @@ final class MenuBarController: NSObject {
dashboardItem.tag = ItemTag.openDashboard.rawValue
menu.addItem(dashboardItem)

let cleanCenterItem = NSMenuItem(
title: t("Abrir CleanFlow", "Open CleanFlow"),
action: #selector(openCleanCenter),
keyEquivalent: ""
)
cleanCenterItem.target = self
cleanCenterItem.tag = ItemTag.openCleanCenter.rawValue
menu.addItem(cleanCenterItem)

let metricsItem = NSMenuItem(title: "CPU — · RAM — · GPU — · —", action: nil, keyEquivalent: "")
metricsItem.tag = ItemTag.systemMetrics.rawValue
metricsItem.isEnabled = false
Expand Down Expand Up @@ -215,6 +229,10 @@ final class MenuBarController: NSObject {
onOpenDashboard()
}

@objc private func openCleanCenter() {
onOpenCleanCenter()
}

@objc private func openSettings() {
onOpenSettings()
}
Expand Down
Loading
Loading