diff --git a/Package.swift b/Package.swift index 9c75930..5905914 100644 --- a/Package.swift +++ b/Package.swift @@ -2,20 +2,20 @@ import PackageDescription let package = Package( - name: "Puter", + name: "puter", platforms: [.macOS(.v14)], products: [ - .executable(name: "Puter", targets: ["Puter"]) + .executable(name: "puter", targets: ["puter"]) ], targets: [ .executableTarget( - name: "Puter", - path: "Sources/Puter" + name: "puter", + path: "Sources/puter" ), .testTarget( - name: "PuterTests", - dependencies: ["Puter"], - path: "Tests/PuterTests" + name: "puterTests", + dependencies: ["puter"], + path: "Tests/puterTests" ) ] ) diff --git a/README.md b/README.md index 137dabf..7fb52a4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Puter +# puter A native macOS system monitor written in SwiftUI and inspired by Windows 11 Task Manager. @@ -57,7 +57,7 @@ To create a standard double-clickable app bundle: ```sh ./scripts/build-app.sh -open "dist/Puter.app" +open "dist/puter.app" ``` To create a drag-to-install disk image containing the app and an Applications shortcut: diff --git a/Resources/Info.plist b/Resources/Info.plist index 4ab782d..6c57eb0 100644 --- a/Resources/Info.plist +++ b/Resources/Info.plist @@ -5,17 +5,17 @@ CFBundleDevelopmentRegion en CFBundleDisplayName - Puter + puter CFBundleExecutable - Puter + puter CFBundleIdentifier - local.mactaskmanager.app + dev.soconnor.puter CFBundleIconName - Puter + puter CFBundleInfoDictionaryVersion 6.0 CFBundleName - Puter + puter CFBundlePackageType APPL CFBundleShortVersionString diff --git a/Sources/Puter/AppUtilitiesViews.swift b/Sources/puter/AppUtilitiesViews.swift similarity index 98% rename from Sources/Puter/AppUtilitiesViews.swift rename to Sources/puter/AppUtilitiesViews.swift index a796911..1e1d808 100644 --- a/Sources/Puter/AppUtilitiesViews.swift +++ b/Sources/puter/AppUtilitiesViews.swift @@ -83,7 +83,7 @@ struct SettingsView: View { var body: some View { @Bindable var monitor = monitor VStack(spacing: 0) { - PageHeader(title: "Settings", subtitle: "Customize Puter") + PageHeader(title: "Settings", subtitle: "Customize puter") Form { Section("General") { Picker("Default start page", selection: $defaultStartPage) { @@ -125,7 +125,7 @@ struct SettingsView: View { } Section("About") { - LabeledContent("Application", value: "Puter") + LabeledContent("Application", value: "puter") LabeledContent("Version", value: appVersion) LabeledContent("Framework", value: "Native SwiftUI") } diff --git a/Sources/Puter/Components.swift b/Sources/puter/Components.swift similarity index 100% rename from Sources/Puter/Components.swift rename to Sources/puter/Components.swift diff --git a/Sources/Puter/ContentView.swift b/Sources/puter/ContentView.swift similarity index 98% rename from Sources/Puter/ContentView.swift rename to Sources/puter/ContentView.swift index 0b465b7..d4f7fa5 100644 --- a/Sources/Puter/ContentView.swift +++ b/Sources/puter/ContentView.swift @@ -2,7 +2,7 @@ import AppKit import SwiftUI extension Notification.Name { - static let runNewTask = Notification.Name("Puter.runNewTask") + static let runNewTask = Notification.Name("puter.runNewTask") } struct ContentView: View { @@ -70,14 +70,14 @@ struct ContentView: View { TaskToolbarContent(showingNewTask: $showingNewTask) } } - .navigationTitle("Puter") + .navigationTitle("puter") .animation(.snappy(duration: 0.22), value: sidebarCompact) .onChange(of: selection) { _, _ in searchText = "" } .onReceive(NotificationCenter.default.publisher(for: .runNewTask)) { _ in showingNewTask = true } .sheet(isPresented: $showingNewTask) { NewTaskView(isPresented: $showingNewTask) } - .alert("Puter", isPresented: Binding( + .alert("puter", isPresented: Binding( get: { monitor.errorMessage != nil }, set: { if !$0 { monitor.errorMessage = nil } } )) { diff --git a/Sources/Puter/FanControlService.swift b/Sources/puter/FanControlService.swift similarity index 100% rename from Sources/Puter/FanControlService.swift rename to Sources/puter/FanControlService.swift diff --git a/Sources/Puter/HardwareView.swift b/Sources/puter/HardwareView.swift similarity index 99% rename from Sources/Puter/HardwareView.swift rename to Sources/puter/HardwareView.swift index 00a1b23..d62b52c 100644 --- a/Sources/Puter/HardwareView.swift +++ b/Sources/puter/HardwareView.swift @@ -294,7 +294,7 @@ struct HardwareView: View { metric("Control backend", FanControlService.isAvailable ? "Ready" : "Unavailable") Spacer() } - Text("Puter reads fan sensors directly through the Mac's SMC interface. Manual targets are clamped to each fan's reported safe range; Automatic returns control to macOS.") + Text("puter reads fan sensors directly through the Mac's SMC interface. Manual targets are clamped to each fan's reported safe range; Automatic returns control to macOS.") .font(.caption).foregroundStyle(.secondary) HStack { Button("Apply targets", systemImage: "speedometer") { diff --git a/Sources/Puter/Models.swift b/Sources/puter/Models.swift similarity index 100% rename from Sources/Puter/Models.swift rename to Sources/puter/Models.swift diff --git a/Sources/Puter/PerformanceView.swift b/Sources/puter/PerformanceView.swift similarity index 100% rename from Sources/Puter/PerformanceView.swift rename to Sources/puter/PerformanceView.swift diff --git a/Sources/Puter/ProcessActions.swift b/Sources/puter/ProcessActions.swift similarity index 99% rename from Sources/Puter/ProcessActions.swift rename to Sources/puter/ProcessActions.swift index f945e48..a9a4629 100644 --- a/Sources/Puter/ProcessActions.swift +++ b/Sources/puter/ProcessActions.swift @@ -126,7 +126,7 @@ enum ProcessDiagnosticReporter { let panel = NSSavePanel() panel.title = "Create diagnostic report" - panel.message = "Puter will sample \(process.displayName) for \(duration) seconds and save a text report." + panel.message = "puter will sample \(process.displayName) for \(duration) seconds and save a text report." panel.prompt = "Create Report" panel.nameFieldStringValue = safeFilename("\(process.displayName)-\(process.pid)-sample.txt") panel.allowedContentTypes = [.plainText] diff --git a/Sources/Puter/ProcessDependencyInspector.swift b/Sources/puter/ProcessDependencyInspector.swift similarity index 100% rename from Sources/Puter/ProcessDependencyInspector.swift rename to Sources/puter/ProcessDependencyInspector.swift diff --git a/Sources/Puter/ProcessViews.swift b/Sources/puter/ProcessViews.swift similarity index 100% rename from Sources/Puter/ProcessViews.swift rename to Sources/puter/ProcessViews.swift diff --git a/Sources/Puter/PuterApp.swift b/Sources/puter/PuterApp.swift similarity index 97% rename from Sources/Puter/PuterApp.swift rename to Sources/puter/PuterApp.swift index 19ebc7e..6501365 100644 --- a/Sources/Puter/PuterApp.swift +++ b/Sources/puter/PuterApp.swift @@ -6,7 +6,7 @@ struct PuterApp: App { @AppStorage("sidebarCompact") private var sidebarCompact = false var body: some Scene { - WindowGroup("Puter") { + WindowGroup("puter") { ContentView() .environment(monitor) .frame(minWidth: 820, minHeight: 560) diff --git a/Sources/Puter/SecondaryViews.swift b/Sources/puter/SecondaryViews.swift similarity index 99% rename from Sources/Puter/SecondaryViews.swift rename to Sources/puter/SecondaryViews.swift index 0d49866..b5a062c 100644 --- a/Sources/Puter/SecondaryViews.swift +++ b/Sources/puter/SecondaryViews.swift @@ -66,7 +66,7 @@ struct AppHistoryView: View { Button("Cancel", role: .cancel) {} Button("Reset", role: .destructive) { monitor.resetAppHistory() } } message: { - Text("CPU time and network totals collected by Puter will be permanently cleared.") + Text("CPU time and network totals collected by puter will be permanently cleared.") } .sheet(item: $inspectedUsage) { AppUsagePropertiesView(usage: $0) } } diff --git a/Sources/Puter/SystemMonitor.swift b/Sources/puter/SystemMonitor.swift similarity index 99% rename from Sources/Puter/SystemMonitor.swift rename to Sources/puter/SystemMonitor.swift index 9d11501..6c6f72c 100644 --- a/Sources/Puter/SystemMonitor.swift +++ b/Sources/puter/SystemMonitor.swift @@ -147,7 +147,7 @@ final class SystemMonitor { func terminate(_ process: ProcessRecord, force: Bool = false) { guard process.pid != getpid() else { - errorMessage = "Puter cannot end itself." + errorMessage = "puter cannot end itself." return } let signal = force ? SIGKILL : SIGTERM @@ -170,7 +170,7 @@ final class SystemMonitor { func terminateGroup(_ group: [ProcessRecord]) { guard !group.contains(where: { $0.pid == getpid() }) else { - errorMessage = "Puter cannot end an application group that contains itself." + errorMessage = "puter cannot end an application group that contains itself." return } let pids = Set(group.map(\.pid)) @@ -188,7 +188,7 @@ final class SystemMonitor { func sendSignal(_ signal: Int32, to process: ProcessRecord, successMessage: String? = nil) { guard process.pid != getpid() else { - errorMessage = "Puter cannot control itself." + errorMessage = "puter cannot control itself." return } if kill(process.pid, signal) != 0 { @@ -415,7 +415,7 @@ private enum AppHistoryPersistence { } static let directory = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)[0] - .appendingPathComponent("MacTaskManager", isDirectory: true) + .appendingPathComponent("puter", isDirectory: true) static let url = directory.appendingPathComponent("app-history.json") } diff --git a/Sources/Puter/SystemReportExporter.swift b/Sources/puter/SystemReportExporter.swift similarity index 100% rename from Sources/Puter/SystemReportExporter.swift rename to Sources/puter/SystemReportExporter.swift diff --git a/Tests/PuterTests/ModelTests.swift b/Tests/puterTests/ModelTests.swift similarity index 99% rename from Tests/PuterTests/ModelTests.swift rename to Tests/puterTests/ModelTests.swift index ed41816..972c339 100644 --- a/Tests/PuterTests/ModelTests.swift +++ b/Tests/puterTests/ModelTests.swift @@ -1,5 +1,5 @@ import XCTest -@testable import Puter +@testable import puter final class ModelTests: XCTestCase { func testAppleSystemServicePublisherAndDomainIdentity() { diff --git a/Puter-design.afdesign b/puter-design.afdesign similarity index 100% rename from Puter-design.afdesign rename to puter-design.afdesign diff --git a/Puter.icon/Assets/puter-white.png b/puter.icon/Assets/puter-white.png similarity index 100% rename from Puter.icon/Assets/puter-white.png rename to puter.icon/Assets/puter-white.png diff --git a/Puter.icon/icon.json b/puter.icon/icon.json similarity index 100% rename from Puter.icon/icon.json rename to puter.icon/icon.json diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 493632f..819d97b 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -2,10 +2,10 @@ set -euo pipefail PROJECT_DIR="${0:A:h:h}" -APP_DIR="$PROJECT_DIR/dist/Puter.app" -ICON_SOURCE="${PUTER_ICON_SOURCE:-$PROJECT_DIR/Puter.icon}" +APP_DIR="$PROJECT_DIR/dist/puter.app" +ICON_SOURCE="${PUTER_ICON_SOURCE:-$PROJECT_DIR/puter.icon}" STAGING_ROOT="$(mktemp -d /tmp/puter-build.XXXXXX)" -STAGED_APP="$STAGING_ROOT/Puter.app" +STAGED_APP="$STAGING_ROOT/puter.app" CONTENTS_DIR="$STAGED_APP/Contents" trap '/bin/rm -rf -- "$STAGING_ROOT"' EXIT @@ -14,9 +14,9 @@ cd "$PROJECT_DIR" swift build -c release mkdir -p "$CONTENTS_DIR/MacOS" "$CONTENTS_DIR/Resources" -cp "$PROJECT_DIR/.build/release/Puter" "$CONTENTS_DIR/MacOS/Puter" +cp "$PROJECT_DIR/.build/release/puter" "$CONTENTS_DIR/MacOS/puter" cp "$PROJECT_DIR/Resources/Info.plist" "$CONTENTS_DIR/Info.plist" -chmod +x "$CONTENTS_DIR/MacOS/Puter" +chmod +x "$CONTENTS_DIR/MacOS/puter" SMC_SOURCE="/Applications/Stats.app/Contents/Resources/smc" if [[ -x "$SMC_SOURCE" ]]; then @@ -31,14 +31,14 @@ if [[ -d "$ICON_SOURCE" ]]; then --compile "$CONTENTS_DIR/Resources" \ --platform macosx \ --minimum-deployment-target 14.0 \ - --app-icon Puter \ + --app-icon puter \ --output-partial-info-plist "$CONTENTS_DIR/Resources/IconInfo.plist" >/dev/null [[ -s "$CONTENTS_DIR/Resources/Assets.car" ]] || { print -u2 "Icon Composer did not produce an Assets.car file" exit 1 } - [[ "$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIconName' "$CONTENTS_DIR/Info.plist")" == "Puter" ]] || { + [[ "$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIconName' "$CONTENTS_DIR/Info.plist")" == "puter" ]] || { print -u2 "CFBundleIconName must reference the Icon Composer asset" exit 1 } diff --git a/scripts/build-dmg.sh b/scripts/build-dmg.sh index a07571f..f2e5703 100755 --- a/scripts/build-dmg.sh +++ b/scripts/build-dmg.sh @@ -2,8 +2,8 @@ set -euo pipefail PROJECT_DIR="${0:A:h:h}" -APP_PATH="$PROJECT_DIR/dist/Puter.app" -DMG_PATH="$PROJECT_DIR/dist/Puter-macOS.dmg" +APP_PATH="$PROJECT_DIR/dist/puter.app" +DMG_PATH="$PROJECT_DIR/dist/puter-macOS.dmg" STAGING_DIR="$(mktemp -d /tmp/puter-dmg.XXXXXX)" cleanup() { @@ -15,13 +15,13 @@ if [[ ! -d "$APP_PATH" ]]; then "$PROJECT_DIR/scripts/build-app.sh" fi -ditto --norsrc "$APP_PATH" "$STAGING_DIR/Puter.app" -xattr -cr "$STAGING_DIR/Puter.app" -codesign --verify --deep --strict "$STAGING_DIR/Puter.app" +ditto --norsrc "$APP_PATH" "$STAGING_DIR/puter.app" +xattr -cr "$STAGING_DIR/puter.app" +codesign --verify --deep --strict "$STAGING_DIR/puter.app" ln -s /Applications "$STAGING_DIR/Applications" hdiutil create \ - -volname "Puter" \ + -volname "puter" \ -srcfolder "$STAGING_DIR" \ -format UDZO \ -imagekey zlib-level=9 \